summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--.mailmap1
-rw-r--r--Documentation/CodingGuidelines30
-rw-r--r--Documentation/RelNotes/2.0.0.txt364
-rw-r--r--Documentation/RelNotes/2.0.1.txt115
-rw-r--r--Documentation/RelNotes/2.0.2.txt32
-rw-r--r--Documentation/RelNotes/2.0.3.txt17
-rw-r--r--Documentation/RelNotes/2.0.4.txt5
-rw-r--r--Documentation/config.txt107
-rw-r--r--Documentation/git-add.txt34
-rw-r--r--Documentation/git-am.txt17
-rw-r--r--Documentation/git-archive.txt5
-rw-r--r--Documentation/git-blame.txt3
-rw-r--r--Documentation/git-cherry-pick.txt7
-rw-r--r--Documentation/git-clone.txt11
-rw-r--r--Documentation/git-commit-tree.txt5
-rw-r--r--Documentation/git-commit.txt14
-rw-r--r--Documentation/git-cvsimport.txt4
-rw-r--r--Documentation/git-filter-branch.txt4
-rw-r--r--Documentation/git-gc.txt3
-rw-r--r--Documentation/git-merge.txt2
-rw-r--r--Documentation/git-notes.txt2
-rw-r--r--Documentation/git-pack-objects.txt2
-rw-r--r--Documentation/git-push.txt10
-rw-r--r--Documentation/git-rebase.txt4
-rw-r--r--Documentation/git-remote.txt2
-rw-r--r--Documentation/git-repack.txt17
-rw-r--r--Documentation/git-request-pull.txt55
-rw-r--r--Documentation/git-reset.txt5
-rw-r--r--Documentation/git-rev-list.txt1
-rw-r--r--Documentation/git-rev-parse.txt38
-rw-r--r--Documentation/git-revert.txt6
-rw-r--r--Documentation/git-stash.txt2
-rw-r--r--Documentation/git-status.txt2
-rw-r--r--Documentation/git-submodule.txt27
-rw-r--r--Documentation/git-svn.txt23
-rw-r--r--Documentation/git-tag.txt6
-rw-r--r--Documentation/git-update-index.txt8
-rw-r--r--Documentation/git-upload-archive.txt32
-rw-r--r--Documentation/git.txt16
-rw-r--r--Documentation/gitcore-tutorial.txt2
-rw-r--r--Documentation/gitcvs-migration.txt2
-rw-r--r--Documentation/gitignore.txt3
-rw-r--r--Documentation/gitk.txt10
-rw-r--r--Documentation/gitmodules.txt4
-rw-r--r--Documentation/gitremote-helpers.txt4
-rw-r--r--Documentation/gitrepository-layout.txt4
-rw-r--r--Documentation/gitweb.txt2
-rw-r--r--Documentation/glossary-content.txt6
-rwxr-xr-xDocumentation/howto-index.sh12
-rwxr-xr-xDocumentation/install-webdoc.sh6
-rw-r--r--Documentation/merge-strategies.txt2
-rw-r--r--Documentation/rev-list-options.txt15
-rw-r--r--Documentation/technical/api-hash.txt52
-rw-r--r--Documentation/technical/api-hashmap.txt234
-rw-r--r--Documentation/technical/api-parse-options.txt4
-rw-r--r--Documentation/technical/api-strbuf.txt10
-rw-r--r--Documentation/technical/bitmap-format.txt164
-rw-r--r--Documentation/technical/http-protocol.txt6
-rw-r--r--Documentation/user-manual.txt15
-rwxr-xr-xGIT-VERSION-GEN2
-rw-r--r--Makefile64
l---------RelNotes2
-rw-r--r--advice.c2
-rw-r--r--advice.h1
-rw-r--r--alloc.c106
-rw-r--r--archive.c17
-rw-r--r--attr.c7
-rw-r--r--bisect.c5
-rw-r--r--blob.c11
-rw-r--r--block-sha1/sha1.c32
-rw-r--r--branch.c56
-rw-r--r--builtin/add.c201
-rw-r--r--builtin/apply.c30
-rw-r--r--builtin/blame.c158
-rw-r--r--builtin/branch.c2
-rw-r--r--builtin/cat-file.c15
-rw-r--r--builtin/checkout.c2
-rw-r--r--builtin/clean.c6
-rw-r--r--builtin/clone.c2
-rw-r--r--builtin/commit-tree.c16
-rw-r--r--builtin/commit.c58
-rw-r--r--builtin/config.c104
-rw-r--r--builtin/describe.c55
-rw-r--r--builtin/diff-tree.c4
-rw-r--r--builtin/fast-export.c5
-rw-r--r--builtin/fetch.c2
-rw-r--r--builtin/fmt-merge-msg.c5
-rw-r--r--builtin/for-each-ref.c2
-rw-r--r--builtin/fsck.c11
-rw-r--r--builtin/gc.c60
-rw-r--r--builtin/grep.c3
-rw-r--r--builtin/index-pack.c44
-rw-r--r--builtin/init-db.c8
-rw-r--r--builtin/log.c21
-rw-r--r--builtin/ls-remote.c4
-rw-r--r--builtin/mailinfo.c6
-rw-r--r--builtin/merge.c13
-rw-r--r--builtin/mktree.c5
-rw-r--r--builtin/mv.c6
-rw-r--r--builtin/name-rev.c2
-rw-r--r--builtin/notes.c8
-rw-r--r--builtin/pack-objects.c518
-rw-r--r--builtin/prune-packed.c2
-rw-r--r--builtin/prune.c4
-rw-r--r--builtin/push.c35
-rw-r--r--builtin/reflog.c2
-rw-r--r--builtin/remote.c45
-rw-r--r--builtin/repack.c58
-rw-r--r--builtin/replace.c4
-rw-r--r--builtin/rerere.c2
-rw-r--r--builtin/reset.c44
-rw-r--r--builtin/rev-list.c44
-rw-r--r--builtin/rev-parse.c13
-rw-r--r--builtin/revert.c2
-rw-r--r--builtin/rm.c2
-rw-r--r--builtin/show-branch.c2
-rw-r--r--builtin/tag.c81
-rw-r--r--builtin/unpack-objects.c4
-rw-r--r--builtin/update-index.c76
-rw-r--r--bulk-checkin.c8
-rw-r--r--bundle.c9
-rw-r--r--cache-tree.c30
-rw-r--r--cache.h134
-rwxr-xr-xcheck-builtins.sh4
-rw-r--r--combine-diff.c119
-rw-r--r--commit-slab.h12
-rw-r--r--commit.c204
-rw-r--r--commit.h54
-rw-r--r--compat/bswap.h127
-rw-r--r--compat/fnmatch/fnmatch.c494
-rw-r--r--compat/fnmatch/fnmatch.h84
-rw-r--r--compat/mingw.c3
-rw-r--r--compat/mmap.c4
-rwxr-xr-xcompat/vcbuild/scripts/clink.pl2
-rw-r--r--config.c82
-rw-r--r--config.mak.uname15
-rw-r--r--configure.ac30
-rw-r--r--connect.c6
-rw-r--r--contrib/completion/git-completion.bash26
-rw-r--r--contrib/completion/git-completion.zsh1
-rw-r--r--contrib/completion/git-prompt.sh21
-rwxr-xr-xcontrib/contacts/git-contacts2
-rwxr-xr-xcontrib/examples/git-checkout.sh8
-rwxr-xr-xcontrib/examples/git-clone.sh20
-rwxr-xr-xcontrib/examples/git-commit.sh10
-rwxr-xr-xcontrib/examples/git-fetch.sh6
-rwxr-xr-xcontrib/examples/git-ls-remote.sh4
-rwxr-xr-xcontrib/examples/git-merge.sh4
-rwxr-xr-xcontrib/examples/git-repack.sh2
-rwxr-xr-xcontrib/examples/git-resolve.sh2
-rwxr-xr-xcontrib/examples/git-revert.sh2
-rwxr-xr-xcontrib/examples/git-tag.sh2
-rwxr-xr-xcontrib/git-resurrect.sh1
-rw-r--r--contrib/hooks/multimail/CHANGES33
-rw-r--r--contrib/hooks/multimail/README46
-rw-r--r--contrib/hooks/multimail/README.Git4
-rwxr-xr-xcontrib/hooks/multimail/git_multimail.py218
-rwxr-xr-xcontrib/hooks/multimail/post-receive4
-rwxr-xr-xcontrib/mw-to-git/t/t9360-mw-to-git-clone.sh14
-rwxr-xr-xcontrib/mw-to-git/t/t9362-mw-to-git-utf8.sh4
-rw-r--r--contrib/remote-helpers/Makefile14
-rw-r--r--contrib/remote-helpers/README15
-rwxr-xr-xcontrib/remote-helpers/git-remote-bzr955
-rwxr-xr-xcontrib/remote-helpers/git-remote-hg1257
-rwxr-xr-xcontrib/remote-helpers/test-bzr.sh394
-rwxr-xr-xcontrib/remote-helpers/test-hg-bidi.sh242
-rwxr-xr-xcontrib/remote-helpers/test-hg-hg-git.sh541
-rwxr-xr-xcontrib/remote-helpers/test-hg.sh775
-rwxr-xr-xcontrib/subtree/git-subtree.sh1
-rwxr-xr-xcontrib/subtree/t/t7900-subtree.sh3
-rw-r--r--daemon.c30
-rw-r--r--date.c2
-rw-r--r--diff-lib.c38
-rw-r--r--diff-no-index.c17
-rw-r--r--diff.c74
-rw-r--r--diff.h3
-rw-r--r--diffcore-order.c53
-rw-r--r--diffcore-pickaxe.c138
-rw-r--r--diffcore-rename.c199
-rw-r--r--diffcore.h16
-rw-r--r--dir.c46
-rw-r--r--environment.c6
-rw-r--r--ewah/bitmap.c221
-rw-r--r--ewah/ewah_bitmap.c714
-rw-r--r--ewah/ewah_io.c204
-rw-r--r--ewah/ewah_rlw.c115
-rw-r--r--ewah/ewok.h233
-rw-r--r--ewah/ewok_rlw.h114
-rw-r--r--fast-import.c33
-rw-r--r--fetch-pack.c1
-rw-r--r--fsck.c58
-rwxr-xr-xgit-add--interactive.perl3
-rwxr-xr-xgit-am.sh56
-rwxr-xr-xgit-bisect.sh8
-rw-r--r--git-compat-util.h30
-rwxr-xr-xgit-filter-branch.sh8
-rwxr-xr-xgit-gui/git-gui.sh4
-rwxr-xr-xgit-instaweb.sh13
-rwxr-xr-xgit-p4.py2
-rwxr-xr-xgit-pull.sh28
-rwxr-xr-xgit-quiltimport.sh1
-rw-r--r--git-rebase--am.sh8
-rw-r--r--git-rebase--interactive.sh43
-rw-r--r--git-rebase--merge.sh7
-rwxr-xr-xgit-rebase.sh77
-rwxr-xr-xgit-remote-testgit.sh21
-rwxr-xr-xgit-request-pull.sh137
-rw-r--r--git-sh-setup.sh2
-rwxr-xr-xgit-stash.sh3
-rwxr-xr-xgit-submodule.sh35
-rwxr-xr-xgit-svn.perl12
-rw-r--r--git.c2
-rwxr-xr-xgitweb/gitweb.perl2
-rw-r--r--gitweb/static/gitweb.css5
-rw-r--r--grep.c9
-rw-r--r--hash.c110
-rw-r--r--hash.h50
-rw-r--r--hashmap.c228
-rw-r--r--hashmap.h71
-rw-r--r--help.c7
-rw-r--r--http-backend.c4
-rw-r--r--http-push.c7
-rw-r--r--http.c26
-rw-r--r--http.h9
-rw-r--r--imap-send.c2
-rw-r--r--khash.h338
-rw-r--r--line-log.c26
-rw-r--r--list-objects.c5
-rw-r--r--log-tree.c32
-rw-r--r--match-trees.c11
-rw-r--r--merge-recursive.c12
-rw-r--r--name-hash.c163
-rw-r--r--notes-cache.c6
-rw-r--r--notes-merge.c13
-rw-r--r--notes-utils.c9
-rw-r--r--notes-utils.h2
-rw-r--r--notes.c6
-rw-r--r--object.c59
-rw-r--r--object.h24
-rw-r--r--pack-bitmap-write.c552
-rw-r--r--pack-bitmap.c1075
-rw-r--r--pack-bitmap.h64
-rw-r--r--pack-objects.c111
-rw-r--r--pack-objects.h68
-rw-r--r--pack-revindex.c45
-rw-r--r--pack-revindex.h9
-rw-r--r--pack-write.c18
-rw-r--r--pack.h2
-rw-r--r--pager.c2
-rw-r--r--parse-options.c13
-rw-r--r--parse-options.h7
-rw-r--r--patch-ids.c5
-rw-r--r--path.c4
-rw-r--r--pathspec.c3
-rw-r--r--po/bg.po5033
-rw-r--r--po/de.po2771
-rw-r--r--po/fr.po2791
-rw-r--r--po/git.pot2527
-rw-r--r--po/sv.po2722
-rw-r--r--po/vi.po2843
-rw-r--r--po/zh_CN.po2705
-rw-r--r--pretty.c64
-rw-r--r--progress.c3
-rw-r--r--read-cache.c149
-rw-r--r--reflog-walk.c24
-rw-r--r--refs.c28
-rw-r--r--refs.h3
-rw-r--r--remote-curl.c5
-rw-r--r--remote-testsvn.c4
-rw-r--r--remote.c106
-rw-r--r--remote.h1
-rw-r--r--replace_object.c34
-rw-r--r--resolve-undo.c7
-rw-r--r--revision.c102
-rw-r--r--revision.h16
-rw-r--r--sequencer.c60
-rw-r--r--sequencer.h2
-rw-r--r--setup.c24
-rw-r--r--sh-i18n--envsubst.c16
-rw-r--r--sha1_file.c92
-rw-r--r--sha1_name.c20
-rw-r--r--sideband.c2
-rw-r--r--strbuf.c18
-rw-r--r--strbuf.h18
-rw-r--r--streaming.c4
-rw-r--r--submodule.c25
-rw-r--r--t/Makefile4
-rw-r--r--t/lib-git-daemon.sh10
-rw-r--r--t/lib-httpd.sh22
-rwxr-xr-xt/perf/p5310-pack-bitmaps.sh57
-rwxr-xr-xt/t0001-init.sh211
-rwxr-xr-xt/t0008-ignores.sh56
-rwxr-xr-xt/t0011-hashmap.sh240
-rwxr-xr-xt/t0040-parse-options.sh7
-rwxr-xr-xt/t1020-subdirectory.sh2
-rwxr-xr-xt/t1300-repo-config.sh54
-rwxr-xr-xt/t1302-repo-version.sh2
-rwxr-xr-xt/t1305-config-include.sh32
-rwxr-xr-xt/t1502-rev-parse-parseopt.sh92
-rwxr-xr-xt/t1507-rev-parse-upstream.sh2
-rwxr-xr-xt/t1510-repo-setup.sh4
-rwxr-xr-xt/t1600-index.sh76
-rwxr-xr-xt/t2104-update-index-skip-worktree.sh2
-rwxr-xr-xt/t2107-update-index-basic.sh17
-rwxr-xr-xt/t2200-add-update.sh9
-rwxr-xr-xt/t3032-merge-recursive-options.sh6
-rwxr-xr-xt/t3070-wildmatch.sh13
-rwxr-xr-xt/t3200-branch.sh22
-rwxr-xr-xt/t3301-notes.sh49
-rwxr-xr-xt/t3400-rebase.sh17
-rwxr-xr-xt/t3402-rebase-merge.sh15
-rwxr-xr-xt/t3404-rebase-interactive.sh69
-rwxr-xr-xt/t3413-rebase-hook.sh6
-rwxr-xr-xt/t3420-rebase-autostash.sh15
-rwxr-xr-xt/t3600-rm.sh3
-rwxr-xr-xt/t4013-diff-various.sh10
-rwxr-xr-xt/t4014-format-patch.sh14
-rwxr-xr-xt/t4018-diff-funcname.sh230
-rw-r--r--t/t4018/README18
-rw-r--r--t/t4018/cpp-c++-function4
-rw-r--r--t/t4018/cpp-class-constructor4
-rw-r--r--t/t4018/cpp-class-constructor-mem-init5
-rw-r--r--t/t4018/cpp-class-definition4
-rw-r--r--t/t4018/cpp-class-definition-derived5
-rw-r--r--t/t4018/cpp-class-destructor4
-rw-r--r--t/t4018/cpp-function-returning-global-type4
-rw-r--r--t/t4018/cpp-function-returning-nested5
-rw-r--r--t/t4018/cpp-function-returning-pointer4
-rw-r--r--t/t4018/cpp-function-returning-reference4
-rw-r--r--t/t4018/cpp-gnu-style-function5
-rw-r--r--t/t4018/cpp-namespace-definition4
-rw-r--r--t/t4018/cpp-operator-definition4
-rw-r--r--t/t4018/cpp-skip-access-specifiers8
-rw-r--r--t/t4018/cpp-skip-comment-block9
-rw-r--r--t/t4018/cpp-skip-labels8
-rw-r--r--t/t4018/cpp-struct-definition9
-rw-r--r--t/t4018/cpp-struct-single-line7
-rw-r--r--t/t4018/cpp-template-function-definition4
-rw-r--r--t/t4018/cpp-union-definition4
-rw-r--r--t/t4018/cpp-void-c-function4
-rw-r--r--t/t4018/custom1-pattern17
-rw-r--r--t/t4018/custom2-match-to-end-of-line8
-rw-r--r--t/t4018/custom3-alternation-in-pattern17
-rw-r--r--t/t4018/java-class-member-function8
-rw-r--r--t/t4018/perl-skip-end-of-heredoc8
-rw-r--r--t/t4018/perl-skip-forward-decl10
-rw-r--r--t/t4018/perl-skip-sub-in-pod18
-rw-r--r--t/t4018/perl-sub-definition4
-rw-r--r--t/t4018/perl-sub-definition-kr-brace4
-rwxr-xr-xt/t4039-diff-assume-unchanged.sh11
-rwxr-xr-xt/t4041-diff-submodule-option.sh7
-rwxr-xr-xt/t4056-diff-order.sh21
-rwxr-xr-xt/t4057-diff-combined-paths.sh106
-rwxr-xr-xt/t4107-apply-ignore-whitespace.sh12
-rwxr-xr-xt/t4201-shortlog.sh6
-rwxr-xr-xt/t4202-log.sh31
-rwxr-xr-xt/t4205-log-pretty-formats.sh217
-rwxr-xr-xt/t4209-log-pickaxe.sh166
-rwxr-xr-xt/t5000-tar-tree.sh43
-rwxr-xr-xt/t5001-archive-attr.sh2
-rwxr-xr-xt/t5003-archive-zip.sh6
-rwxr-xr-xt/t5004-archive-corner-cases.sh2
-rwxr-xr-xt/t5150-request-pull.sh30
-rwxr-xr-xt/t5305-include-tag.sh4
-rwxr-xr-xt/t5310-pack-bitmaps.sh173
-rwxr-xr-xt/t5400-send-pack.sh1
-rwxr-xr-xt/t5510-fetch.sh6
-rwxr-xr-xt/t5529-push-errors.sh48
-rwxr-xr-xt/t5537-fetch-shallow.sh13
-rwxr-xr-xt/t5538-push-shallow.sh59
-rwxr-xr-xt/t5542-push-http-shallow.sh100
-rwxr-xr-xt/t5560-http-backend-noserver.sh6
-rwxr-xr-xt/t5570-git-daemon.sh1
-rwxr-xr-xt/t5602-clone-remote-exec.sh13
-rwxr-xr-xt/t5701-clone-local.sh6
-rwxr-xr-xt/t5801-remote-helpers.sh48
-rwxr-xr-xt/t6006-rev-list-format.sh125
-rwxr-xr-xt/t6039-merge-ignorecase.sh53
-rwxr-xr-xt/t7001-mv.sh3
-rwxr-xr-xt/t7003-filter-branch.sh11
-rwxr-xr-xt/t7004-tag.sh43
-rwxr-xr-xt/t7006-pager.sh18
-rwxr-xr-xt/t7007-show.sh10
-rwxr-xr-xt/t7101-reset-empty-subdirs.sh (renamed from t/t7101-reset.sh)0
-rwxr-xr-xt/t7102-reset.sh28
-rwxr-xr-xt/t7104-reset-hard.sh (renamed from t/t7104-reset.sh)0
-rwxr-xr-xt/t7400-submodule-basic.sh5
-rwxr-xr-xt/t7406-submodule-update.sh1
-rwxr-xr-xt/t7500-commit.sh11
-rwxr-xr-xt/t7501-commit.sh36
-rwxr-xr-xt/t7502-commit.sh16
-rwxr-xr-xt/t7508-status.sh74
-rwxr-xr-xt/t7509-commit.sh1
-rwxr-xr-xt/t7510-signed-commit.sh94
-rwxr-xr-xt/t7600-merge.sh11
-rwxr-xr-xt/t7601-merge-pull-config.sh21
-rwxr-xr-xt/t7700-repack.sh34
-rwxr-xr-xt/t7810-grep.sh75
-rwxr-xr-xt/t8003-blame-corner-cases.sh9
-rwxr-xr-xt/t9001-send-email.sh2
-rwxr-xr-xt/t9107-git-svn-migrate.sh54
-rwxr-xr-xt/t9114-git-svn-dcommit-merge.sh4
-rwxr-xr-xt/t9116-git-svn-log.sh46
-rwxr-xr-xt/t9117-git-svn-init-clone.sh20
-rwxr-xr-xt/t9118-git-svn-funky-branch-names.sh20
-rwxr-xr-xt/t9120-git-svn-clone-with-percent-escapes.sh14
-rwxr-xr-xt/t9125-git-svn-multi-glob-branch-names.sh6
-rwxr-xr-xt/t9128-git-svn-cmd-branch.sh18
-rwxr-xr-xt/t9130-git-svn-authors-file.sh3
-rwxr-xr-xt/t9135-git-svn-moved-branch-empty-file.sh2
-rwxr-xr-xt/t9141-git-svn-multiple-branches.sh28
-rwxr-xr-xt/t9145-git-svn-master-branch.sh2
-rwxr-xr-xt/t9154-git-svn-fancy-glob.sh6
-rwxr-xr-xt/t9155-git-svn-fetch-deleted-tag.sh4
-rwxr-xr-xt/t9156-git-svn-fetch-deleted-tag-2.sh6
-rwxr-xr-xt/t9161-git-svn-mergeinfo-push.sh22
-rwxr-xr-xt/t9163-git-svn-reset-clears-caches.sh4
-rwxr-xr-xt/t9165-git-svn-fetch-merge-branch-of-branch.sh2
-rwxr-xr-xt/t9166-git-svn-fetch-merge-branch-of-branch2.sh2
-rwxr-xr-xt/t9167-git-svn-cmd-branch-subproject.sh2
-rwxr-xr-xt/t9400-git-cvsserver-server.sh1
-rw-r--r--t/test-lib-functions.sh69
-rw-r--r--t/test-lib.sh7
-rw-r--r--tag.c11
-rw-r--r--test-hashmap.c255
-rw-r--r--test-parse-options.c2
-rw-r--r--test-wildmatch.c79
-rw-r--r--transport-helper.c96
-rw-r--r--transport.c8
-rw-r--r--tree-diff.c27
-rw-r--r--tree-walk.c2
-rw-r--r--tree-walk.h2
-rw-r--r--tree.c11
-rw-r--r--unpack-trees.c5
-rw-r--r--upload-pack.c19
-rw-r--r--userdiff.c12
-rw-r--r--utf8.c6
-rw-r--r--versioncmp.c93
-rw-r--r--walker.c1
-rw-r--r--wrapper.c38
-rw-r--r--ws.c7
-rw-r--r--wt-status.c33
-rw-r--r--wt-status.h1
444 files changed, 23365 insertions, 19090 deletions
diff --git a/.gitignore b/.gitignore
index b5f9defed3..dc600f9b36 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/.mailmap b/.mailmap
index 11057cbcdf..d0734d181b 100644
--- a/.mailmap
+++ b/.mailmap
@@ -202,6 +202,7 @@ Seth Falcon <seth@userprimary.net> <sfalcon@fhcrc.org>
Shawn O. Pearce <spearce@spearce.org>
Simon Hausmann <hausmann@kde.org> <simon@lst.de>
Simon Hausmann <hausmann@kde.org> <shausman@trolltech.com>
+Stefan Beller <stefanbeller@gmail.com> <stefanbeller@googlemail.com>
Stefan Naewe <stefan.naewe@gmail.com> <stefan.naewe@atlas-elektronik.com>
Stefan Naewe <stefan.naewe@gmail.com> <stefan.naewe@googlemail.com>
Stefan Sperling <stsp@elego.de> <stsp@stsp.name>
diff --git a/Documentation/CodingGuidelines b/Documentation/CodingGuidelines
index b99fa87f68..f4137c68ff 100644
--- a/Documentation/CodingGuidelines
+++ b/Documentation/CodingGuidelines
@@ -126,6 +126,17 @@ For C programs:
"char * string". This makes it easier to understand code
like "char *string, c;".
+ - Use whitespace around operators and keywords, but not inside
+ parentheses and not around functions. So:
+
+ while (condition)
+ func(bar + 1);
+
+ and not:
+
+ while( condition )
+ func (bar+1);
+
- We avoid using braces unnecessarily. I.e.
if (bla) {
@@ -153,6 +164,16 @@ For C programs:
* multi-line comment.
*/
+ Note however that a comment that explains a translatable string to
+ translators uses a convention of starting with a magic token
+ "TRANSLATORS: " immediately after the opening delimiter, even when
+ it spans multiple lines. We do not add an asterisk at the beginning
+ of each line, either. E.g.
+
+ /* TRANSLATORS: here is a comment that explains the string
+ to be translated, that follows immediately after it */
+ _("Here is a translatable string explained by the above.");
+
- Double negation is often harder to understand than no negation
at all.
@@ -243,6 +264,15 @@ For Python scripts:
documentation for version 2.6 does not mention this prefix, it has
been supported since version 2.6.0.
+Error Messages
+
+ - Do not end error messages with a full stop.
+
+ - Do not capitalize ("unable to open %s", not "Unable to open %s")
+
+ - Say what the error is first ("cannot open %s", not "%s: cannot open")
+
+
Writing Documentation:
Most (if not all) of the documentation pages are written in the
diff --git a/Documentation/RelNotes/2.0.0.txt b/Documentation/RelNotes/2.0.0.txt
new file mode 100644
index 0000000000..2617372a0c
--- /dev/null
+++ b/Documentation/RelNotes/2.0.0.txt
@@ -0,0 +1,364 @@
+Git v2.0 Release Notes
+======================
+
+Backward compatibility notes
+----------------------------
+
+When "git push [$there]" does not say what to push, we have used the
+traditional "matching" semantics so far (all your branches were sent
+to the remote as long as there already are branches of the same name
+over there). In Git 2.0, the default is now the "simple" semantics,
+which pushes:
+
+ - only the current branch to the branch with the same name, and only
+ when the current branch is set to integrate with that remote
+ branch, if you are pushing to the same remote as you fetch from; or
+
+ - only the current branch to the branch with the same name, if you
+ are pushing to a remote that is not where you usually fetch from.
+
+You can use the configuration variable "push.default" to change
+this. If you are an old-timer who wants to keep using the
+"matching" semantics, you can set the variable to "matching", for
+example. Read the documentation for other possibilities.
+
+When "git add -u" and "git add -A" are run inside a subdirectory
+without specifying which paths to add on the command line, they
+operate on the entire tree for consistency with "git commit -a" and
+other commands (these commands used to operate only on the current
+subdirectory). Say "git add -u ." or "git add -A ." if you want to
+limit the operation to the current directory.
+
+"git add <path>" is the same as "git add -A <path>" now, so that
+"git add dir/" will notice paths you removed from the directory and
+record the removal. In older versions of Git, "git add <path>" used
+to ignore removals. You can say "git add --ignore-removal <path>" to
+add only added or modified paths in <path>, if you really want to.
+
+The "-q" option to "git diff-files", which does *NOT* mean "quiet",
+has been removed (it told Git to ignore deletion, which you can do
+with "git diff-files --diff-filter=d").
+
+"git request-pull" lost a few "heuristics" that often led to mistakes.
+
+The default prefix for "git svn" has changed in Git 2.0. For a long
+time, "git svn" created its remote-tracking branches directly under
+refs/remotes, but it now places them under refs/remotes/origin/ unless
+it is told otherwise with its "--prefix" option.
+
+
+Updates since v1.9 series
+-------------------------
+
+UI, Workflows & Features
+
+ * The "multi-mail" post-receive hook (in contrib/) has been updated
+ to a more recent version from upstream.
+
+ * The "remote-hg/bzr" remote-helper interfaces (used to be in
+ contrib/) are no more. They are now maintained separately as
+ third-party plug-ins in their own repositories.
+
+ * "git gc --aggressive" learned "--depth" option and
+ "gc.aggressiveDepth" configuration variable to allow use of a less
+ insane depth than the built-in default value of 250.
+
+ * "git log" learned the "--show-linear-break" option to show where a
+ single strand-of-pearls is broken in its output.
+
+ * The "rev-parse --parseopt" mechanism used by scripted Porcelains to
+ parse command-line options and to give help text learned to take
+ the argv-help (the placeholder string for an option parameter,
+ e.g. "key-id" in "--gpg-sign=<key-id>").
+
+ * The pattern to find where the function begins in C/C++ used in
+ "diff" and "grep -p" has been updated to improve viewing C++
+ sources.
+
+ * "git rebase" learned to interpret a lone "-" as "@{-1}", the
+ branch that we were previously on.
+
+ * "git commit --cleanup=<mode>" learned a new mode, scissors.
+
+ * "git tag --list" output can be sorted using "version sort" with
+ "--sort=version:refname".
+
+ * Discard the accumulated "heuristics" to guess from which branch the
+ result wants to be pulled from and make sure that what the end user
+ specified is not second-guessed by "git request-pull", to avoid
+ mistakes. When you pushed out your 'master' branch to your public
+ repository as 'for-linus', use the new "master:for-linus" syntax to
+ denote the branch to be pulled.
+
+ * "git grep" learned to behave in a way similar to native grep when
+ "-h" (no header) and "-c" (count) options are given.
+
+ * "git push" via transport-helper interface has been updated to
+ allow forced ref updates in a way similar to the natively
+ supported transports.
+
+ * The "simple" mode is the default for "git push".
+
+ * "git add -u" and "git add -A", when run without any pathspec, is a
+ tree-wide operation even when run inside a subdirectory of a
+ working tree.
+
+ * "git add <path>" is the same as "git add -A <path>" now.
+
+ * "core.statinfo" configuration variable, which is a
+ never-advertised synonym to "core.checkstat", has been removed.
+
+ * The "-q" option to "git diff-files", which does *NOT* mean
+ "quiet", has been removed (it told Git to ignore deletion, which
+ you can do with "git diff-files --diff-filter=d").
+
+ * Server operators can loosen the "tips of refs only" restriction for
+ the remote archive service with the uploadarchive.allowUnreachable
+ configuration option.
+
+ * The progress indicators from various time-consuming commands have
+ been marked for i18n/l10n.
+
+ * "git notes -C <blob>" diagnoses as an error an attempt to use an
+ object that is not a blob.
+
+ * "git config" learned to read from the standard input when "-" is
+ given as the value to its "--file" parameter (attempting an
+ operation to update the configuration in the standard input is
+ rejected, of course).
+
+ * Trailing whitespaces in .gitignore files, unless they are quoted
+ for fnmatch(3), e.g. "path\ ", are warned and ignored. Strictly
+ speaking, this is a backward-incompatible change, but very unlikely
+ to bite any sane user and adjusting should be obvious and easy.
+
+ * Many commands that create commits, e.g. "pull" and "rebase",
+ learned to take the "--gpg-sign" option on the command line.
+
+ * "git commit" can be told to always GPG sign the resulting commit
+ by setting the "commit.gpgsign" configuration variable to "true"
+ (the command-line option "--no-gpg-sign" should override it).
+
+ * "git pull" can be told to only accept fast-forward by setting the
+ new "pull.ff" configuration variable.
+
+ * "git reset" learned the "-N" option, which does not reset the index
+ fully for paths the index knows about but the tree-ish the command
+ resets to does not (these paths are kept as intend-to-add entries).
+
+
+Performance, Internal Implementation, etc.
+
+ * The compilation options to port to AIX and to MSVC have been
+ updated.
+
+ * We started using wildmatch() in place of fnmatch(3) a few releases
+ ago; complete the process and stop using fnmatch(3).
+
+ * Uses of curl's "multi" interface and "easy" interface do not mix
+ well when we attempt to reuse outgoing connections. Teach the RPC
+ over HTTP code, used in the smart HTTP transport, not to use the
+ "easy" interface.
+
+ * The bitmap-index feature from JGit has been ported, which should
+ significantly improve performance when serving objects from a
+ repository that uses it.
+
+ * The way "git log --cc" shows a combined diff against multiple
+ parents has been optimized.
+
+ * The prefixcmp() and suffixcmp() functions are gone. Use
+ starts_with() and ends_with(), and also consider if skip_prefix()
+ suits your needs better when using the former.
+
+
+Also contains various documentation updates and code clean-ups. Many
+of them came from flurry of activities as GSoC candidate microproject
+exercises.
+
+
+Fixes since v1.9 series
+-----------------------
+
+Unless otherwise noted, all the fixes since v1.9 in the maintenance
+track are contained in this release (see the maintenance releases'
+notes for details).
+
+ * "git p4" was broken in 1.9 release to deal with changes in binary
+ files.
+ (merge 749b668 cl/p4-use-diff-tree later to maint).
+
+ * The shell prompt script (in contrib/), when using the PROMPT_COMMAND
+ interface, used an unsafe construct when showing the branch name in
+ $PS1.
+ (merge 1e4119c8 rh/prompt-pcmode-avoid-eval-on-refname later to maint).
+
+ * "git rebase" used a POSIX shell construct FreeBSD's /bin/sh does not
+ work well with.
+ (merge 8cd6596 km/avoid-non-function-return-in-rebase later to maint).
+
+ * zsh prompt (in contrib/) leaked unnecessary error messages.
+
+ * Bash completion (in contrib/) did not complete the refs and remotes
+ correctly given "git pu<TAB>" when "pu" is aliased to "push".
+
+ * Some more Unicode code points, defined in Unicode 6.3 as having zero
+ width, have been taught to our display column counting logic.
+ (merge d813ab9 tb/unicode-6.3-zero-width later to maint).
+
+ * Some tests used shell constructs that did not work well on FreeBSD
+ (merge ff7a1c6 km/avoid-bs-in-shell-glob later to maint).
+ (merge 00764ca km/avoid-cp-a later to maint).
+
+ * "git update-ref --stdin" did not fail a request to create a ref
+ when the ref already existed.
+ (merge b9d56b5 mh/update-ref-batch-create-fix later to maint).
+
+ * "git diff --no-index -Mq a b" fell into an infinite loop.
+ (merge ad1c3fb jc/fix-diff-no-index-diff-opt-parse later to maint).
+
+ * "git fetch --prune", when the right-hand side of multiple fetch
+ refspecs overlap (e.g. storing "refs/heads/*" to
+ "refs/remotes/origin/*", while storing "refs/frotz/*" to
+ "refs/remotes/origin/fr/*"), aggressively thought that lack of
+ "refs/heads/fr/otz" on the origin site meant we should remove
+ "refs/remotes/origin/fr/otz" from us, without checking their
+ "refs/frotz/otz" first.
+
+ Note that such a configuration is inherently unsafe (think what
+ should happen when "refs/heads/fr/otz" does appear on the origin
+ site), but that is not a reason not to be extra careful.
+ (merge e6f6371 cn/fetch-prune-overlapping-destination later to maint).
+
+ * "git status --porcelain --branch" showed its output with labels
+ "ahead/behind/gone" translated to the user's locale.
+ (merge 7a76c28 mm/status-porcelain-format-i18n-fix later to maint).
+
+ * A stray environment variable $prefix could have leaked into and
+ affected the behaviour of the "subtree" script (in contrib/).
+
+ * When it is not necessary to edit a commit log message (e.g. "git
+ commit -m" is given a message without specifying "-e"), we used to
+ disable the spawning of the editor by overriding GIT_EDITOR, but
+ this means all the uses of the editor, other than to edit the
+ commit log message, are also affected.
+ (merge b549be0 bp/commit-p-editor later to maint).
+
+ * "git mv" that moves a submodule forgot to adjust the array that
+ uses to keep track of which submodules were to be moved to update
+ its configuration.
+ (merge fb8a4e8 jk/mv-submodules-fix later to maint).
+
+ * Length limit for the pathname used when removing a path in a deep
+ subdirectory has been removed to avoid buffer overflows.
+ (merge 2f29e0c mh/remove-subtree-long-pathname-fix later to maint).
+
+ * The test helper lib-terminal always run an actual test_expect_*
+ when included, which screwed up with the use of skil-all that may
+ have to be done later.
+ (merge 7e27173 jk/lib-terminal-lazy later to maint).
+
+ * "git index-pack" used a wrong variable to name the keep-file in an
+ error message when the file cannot be written or closed.
+ (merge de983a0 nd/index-pack-error-message later to maint).
+
+ * "rebase -i" produced a broken insn sheet when the title of a commit
+ happened to contain '\n' (or ended with '\c') due to a careless use
+ of 'echo'.
+ (merge cb1aefd us/printf-not-echo later to maint).
+
+ * There were a few instances of 'git-foo' remaining in the
+ documentation that should have been spelled 'git foo'.
+ (merge 3c3e6f5 rr/doc-merge-strategies later to maint).
+
+ * Serving objects from a shallow repository needs to write a
+ new file to hold the temporary shallow boundaries, but it was not
+ cleaned when we exit due to die() or a signal.
+ (merge 7839632 jk/shallow-update-fix later to maint).
+
+ * When "git stash pop" stops after failing to apply the stash
+ (e.g. due to conflicting changes), the stash is not dropped. State
+ that explicitly in the output to let the users know.
+ (merge 2d4c993 jc/stash-pop-not-popped later to maint).
+
+ * The labels in "git status" output that describe the nature of
+ conflicts (e.g. "both deleted") were limited to 20 bytes, which was
+ too short for some l10n (e.g. fr).
+ (merge c7cb333 jn/wt-status later to maint).
+
+ * "git clean -d pathspec" did not use the given pathspec correctly
+ and ended up cleaning too much.
+ (merge 1f2e108 jk/clean-d-pathspec later to maint).
+
+ * "git difftool" misbehaved when the repository is bound to the
+ working tree with the ".git file" mechanism, where a textual file
+ ".git" tells us where it is.
+ (merge fcfec8b da/difftool-git-files later to maint).
+
+ * "git push" did not pay attention to "branch.*.pushremote" if it is
+ defined earlier than "remote.pushdefault"; the order of these two
+ variables in the configuration file should not matter, but it did
+ by mistake.
+ (merge 98b406f jk/remote-pushremote-config-reading later to maint).
+
+ * Code paths that parse timestamps in commit objects have been
+ tightened.
+ (merge f80d1f9 jk/commit-dates-parsing-fix later to maint).
+
+ * "git diff --external-diff" incorrectly fed the submodule directory
+ in the working tree to the external diff driver when it knew that it
+ is the same as one of the versions being compared.
+ (merge aba4727 tr/diff-submodule-no-reuse-worktree later to maint).
+
+ * "git reset" needs to refresh the index when working in a working
+ tree (it can also be used to match the index to the HEAD in an
+ otherwise bare repository), but it failed to set up the working
+ tree properly, causing GIT_WORK_TREE to be ignored.
+ (merge b7756d4 nd/reset-setup-worktree later to maint).
+
+ * "git check-attr" when working on a repository with a working tree
+ did not work well when the working tree was specified via the
+ "--work-tree" (and obviously with "--git-dir") option.
+ (merge cdbf623 jc/check-attr-honor-working-tree later to maint).
+
+ * "merge-recursive" was broken in 1.7.7 era and stopped working in
+ an empty (temporary) working tree, when there are renames
+ involved. This has been corrected.
+ (merge 6e2068a bk/refresh-missing-ok-in-merge-recursive later to maint.)
+
+ * "git rev-parse" was loose in rejecting command-line arguments
+ that do not make sense, e.g. "--default" without the required
+ value for that option.
+ (merge a43219f ds/rev-parse-required-args later to maint.)
+
+ * "include.path" variable (or any variable that expects a path that
+ can use ~username expansion) in the configuration file is not a
+ boolean, but the code failed to check it.
+ (merge 67beb60 jk/config-path-include-fix later to maint.)
+
+ * Commands that take pathspecs on the command line misbehaved when
+ the pathspec is given as an absolute pathname (which is a
+ practice not particularly encouraged) that points at a symbolic
+ link in the working tree.
+ (merge 6127ff6 mw/symlinks later to maint.)
+
+ * "git diff --quiet -- pathspec1 pathspec2" sometimes did not return
+ the correct status value.
+ (merge f34b205 nd/diff-quiet-stat-dirty later to maint.)
+
+ * Attempting to deepen a shallow repository by fetching over smart
+ HTTP transport failed in the protocol exchange, when the no-done
+ extension was used. The fetching side waited for the list of
+ shallow boundary commits after the sending side stopped talking to
+ it.
+ (merge 0232852 nd/http-fetch-shallow-fix later to maint.)
+
+ * Allow "git cmd path/", when the 'path' is where a submodule is
+ bound to the top-level working tree, to match 'path', despite the
+ extra and unnecessary trailing slash (such a slash is often
+ given by command-line completion).
+ (merge 2e70c01 nd/submodule-pathspec-ending-with-slash later to maint.)
+
+ * Documentation and in-code comments had many instances of mistaken
+ use of "nor", which have been corrected.
+ (merge 235e8d5 jl/nor-or-nand-and later to maint).
diff --git a/Documentation/RelNotes/2.0.1.txt b/Documentation/RelNotes/2.0.1.txt
new file mode 100644
index 0000000000..ce5579db3e
--- /dev/null
+++ b/Documentation/RelNotes/2.0.1.txt
@@ -0,0 +1,115 @@
+Git v2.0.1 Release Notes
+========================
+
+ * We used to unconditionally disable the pager in the pager process
+ we spawn to feed out output, but that prevented people who want to
+ run "less" within "less" from doing so.
+
+ * Tools that read diagnostic output in our standard error stream do
+ not want to see terminal control sequence (e.g. erase-to-eol).
+ Detect them by checking if the standard error stream is connected
+ to a tty.
+ * Reworded the error message given upon a failure to open an existing
+ loose object file due to e.g. permission issues; it was reported as
+ the object being corrupt, but that is not quite true.
+
+ * "git log -2master" is a common typo that shows two commits starting
+ from whichever random branch that is not 'master' that happens to
+ be checked out currently.
+
+ * The "%<(10,trunc)%s" pretty format specifier in the log family of
+ commands is used to truncate the string to a given length (e.g. 10
+ in the example) with padding to column-align the output, but did
+ not take into account that number of bytes and number of display
+ columns are different.
+
+ * The "mailmap.file" configuration option did not support the tilde
+ expansion (i.e. ~user/path and ~/path).
+
+ * The completion scripts (in contrib/) did not know about quite a few
+ options that are common between "git merge" and "git pull", and a
+ couple of options unique to "git merge".
+
+ * "--ignore-space-change" option of "git apply" ignored the spaces
+ at the beginning of line too aggressively, which is inconsistent
+ with the option of the same name "diff" and "git diff" have.
+
+ * "git blame" miscounted number of columns needed to show localized
+ timestamps, resulting in jaggy left-side-edge of the source code
+ lines in its output.
+
+ * "git blame" assigned the blame to the copy in the working-tree if
+ the repository is set to core.autocrlf=input and the file used CRLF
+ line endings.
+
+ * "git commit --allow-empty-message -C $commit" did not work when the
+ commit did not have any log message.
+
+ * "git diff --find-copies-harder" sometimes pretended as if the mode
+ bits have changed for paths that are marked with assume-unchanged
+ bit.
+
+ * "git format-patch" did not enforce the rule that the "--follow"
+ option from the log/diff family of commands must be used with
+ exactly one pathspec.
+
+ * "git gc --auto" was recently changed to run in the background to
+ give control back early to the end-user sitting in front of the
+ terminal, but it forgot that housekeeping involving reflogs should
+ be done without other processes competing for accesses to the refs.
+
+ * "git grep -O" to show the lines that hit in the pager did not work
+ well with case insensitive search. We now spawn "less" with its
+ "-I" option when it is used as the pager (which is the default).
+
+ * We used to disable threaded "git index-pack" on platforms without
+ thread-safe pread(); use a different workaround for such
+ platforms to allow threaded "git index-pack".
+
+ * The error reporting from "git index-pack" has been improved to
+ distinguish missing objects from type errors.
+
+ * "git mailinfo" used to read beyond the end of header string while
+ parsing an incoming e-mail message to extract the patch.
+
+ * On a case insensitive filesystem, merge-recursive incorrectly
+ deleted the file that is to be renamed to a name that is the same
+ except for case differences.
+
+ * "git pack-objects" unnecessarily copied the previous contents when
+ extending the hashtable, even though it will populate the table
+ from scratch anyway.
+
+ * "git rerere forget" did not work well when merge.conflictstyle
+ was set to a non-default value.
+
+ * "git remote rm" and "git remote prune" can involve removing many
+ refs at once, which is not a very efficient thing to do when very
+ many refs exist in the packed-refs file.
+
+ * "git log --exclude=<glob> --all | git shortlog" worked as expected,
+ but "git shortlog --exclude=<glob> --all", which is supposed to be
+ identical to the above pipeline, was not accepted at the command
+ line argument parser level.
+
+ * The autostash mode of "git rebase -i" did not restore the dirty
+ working tree state if the user aborted the interactive rebase by
+ emptying the insn sheet.
+
+ * "git show -s" (i.e. show log message only) used to incorrectly emit
+ an extra blank line after a merge commit.
+
+ * "git status", even though it is a read-only operation, tries to
+ update the index with refreshed lstat(2) info to optimize future
+ accesses to the working tree opportunistically, but this could
+ race with a "read-write" operation that modify the index while it
+ is running. Detect such a race and avoid overwriting the index.
+
+ * "git status" (and "git commit") behaved as if changes in a modified
+ submodule are not there if submodule.*.ignore configuration is set,
+ which was misleading. The configuration is only to unclutter diff
+ output during the course of development, and should not to hide
+ changes in the "status" output to cause the users forget to commit
+ them.
+
+ * The mode to run tests with HTTP server tests disabled was broken.
diff --git a/Documentation/RelNotes/2.0.2.txt b/Documentation/RelNotes/2.0.2.txt
new file mode 100644
index 0000000000..8e8321b2ef
--- /dev/null
+++ b/Documentation/RelNotes/2.0.2.txt
@@ -0,0 +1,32 @@
+Git v2.0.2 Release Notes
+========================
+
+ * Documentation for "git submodule sync" forgot to say that the subcommand
+ can take the "--recursive" option.
+
+ * Mishandling of patterns in .gitignore that has trailing SPs quoted
+ with backslashes (e.g. ones that end with "\ ") have been
+ corrected.
+
+ * Recent updates to "git repack" started to duplicate objects that
+ are in packfiles marked with .keep flag into the new packfile by
+ mistake.
+
+ * "git clone -b brefs/tags/bar" would have mistakenly thought we were
+ following a single tag, even though it was a name of the branch,
+ because it incorrectly used strstr().
+
+ * "%G" (nothing after G) is an invalid pretty format specifier, but
+ the parser did not notice it as garbage.
+
+ * Code to avoid adding the same alternate object store twice was
+ subtly broken for a long time, but nobody seems to have noticed.
+
+ * A handful of code paths had to read the commit object more than
+ once when showing header fields that are usually not parsed. The
+ internal data structure to keep track of the contents of the commit
+ object has been updated to reduce the need for this double-reading,
+ and to allow the caller find the length of the object.
+
+ * During "git rebase --merge", a conflicted patch could not be
+ skipped with "--skip" if the next one also conflicted.
diff --git a/Documentation/RelNotes/2.0.3.txt b/Documentation/RelNotes/2.0.3.txt
new file mode 100644
index 0000000000..4047b46bbe
--- /dev/null
+++ b/Documentation/RelNotes/2.0.3.txt
@@ -0,0 +1,17 @@
+Git v2.0.3 Release Notes
+========================
+
+ * An ancient rewrite passed a wrong pointer to a curl library
+ function in a rarely used code path.
+
+ * "filter-branch" left an empty single-parent commit that results when
+ all parents of a merge commit gets mapped to the same commit, even
+ under "--prune-empty".
+
+ * "log --show-signature" incorrectly decided the color to paint a
+ mergetag that was and was not correctly validated.
+
+ * "log --show-signature" did not pay attention to "--graph" option.
+
+Also a lot of fixes to the tests and some updates to the docs are
+included.
diff --git a/Documentation/RelNotes/2.0.4.txt b/Documentation/RelNotes/2.0.4.txt
new file mode 100644
index 0000000000..7e340921a2
--- /dev/null
+++ b/Documentation/RelNotes/2.0.4.txt
@@ -0,0 +1,5 @@
+Git v2.0.4 Release Notes
+========================
+
+ * An earlier update to v2.0.2 broken output from "git diff-tree",
+ which is fixed in this release.
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 7076aa9282..0c32597639 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -131,8 +131,13 @@ Variables
Note that this list is non-comprehensive and not necessarily complete.
For command-specific variables, you will find a more detailed description
-in the appropriate manual page. You will find a description of non-core
-porcelain configuration variables in the respective porcelain documentation.
+in the appropriate manual page.
+
+Other git-related tools may and do use their own variables. When
+inventing new variables for use in your own tool, make sure their
+names do not conflict with those that are used by Git itself and
+other popular tools, and describe them in your documentation.
+
advice.*::
These variables control various optional help messages designed to
@@ -142,19 +147,13 @@ advice.*::
--
pushUpdateRejected::
Set this variable to 'false' if you want to disable
- 'pushNonFFCurrent', 'pushNonFFDefault',
+ 'pushNonFFCurrent',
'pushNonFFMatching', 'pushAlreadyExists',
'pushFetchFirst', and 'pushNeedsForce'
simultaneously.
pushNonFFCurrent::
Advice shown when linkgit:git-push[1] fails due to a
non-fast-forward update to the current branch.
- pushNonFFDefault::
- Advice to set 'push.default' to 'upstream' or 'current'
- when you ran linkgit:git-push[1] and pushed 'matching
- refs' by default (i.e. you did not provide an explicit
- refspec, and no 'push.default' configuration was set)
- and it resulted in a non-fast-forward error.
pushNonFFMatching::
Advice shown when you ran linkgit:git-push[1] and pushed
'matching refs' explicitly (i.e. you used ':', or
@@ -1003,6 +1002,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
@@ -1160,6 +1167,11 @@ filter.<driver>.smudge::
object to a worktree file upon checkout. See
linkgit:gitattributes[5] for details.
+gc.aggressiveDepth::
+ The depth parameter used in the delta compression
+ algorithm used by 'git gc --aggressive'. This defaults
+ to 250.
+
gc.aggressiveWindow::
The window size parameter used in the delta compression
algorithm used by 'git gc --aggressive'. This defaults
@@ -1178,6 +1190,10 @@ gc.autopacklimit::
--auto` consolidates them into one larger pack. The
default value is 50. Setting this to 0 disables it.
+gc.autodetach::
+ Make `git gc --auto` return immediately andrun in background
+ if the system supports it. Default is true.
+
gc.packrefs::
Running `git pack-refs` in a repository renders it
unclonable by Git versions prior to 1.5.1.2 over dumb
@@ -1335,6 +1351,10 @@ gui.diffcontext::
Specifies how many context lines should be used in calls to diff
made by the linkgit:git-gui[1]. The default is "5".
+gui.displayuntracked::
+ Determines if linkgit::git-gui[1] shows untracked files
+ in the file list. The default is "true".
+
gui.encoding::
Specifies the default encoding to use for displaying of
file contents in linkgit:git-gui[1] and linkgit:gitk[1].
@@ -1612,6 +1632,10 @@ imap::
The configuration variables in the 'imap' section are described
in linkgit:git-imap-send[1].
+index.version::
+ Specify the version with which new index files should be
+ initialized. This does not affect existing repositories.
+
init.templatedir::
Specify the directory from which templates will be copied.
(See the "TEMPLATE DIRECTORY" section of linkgit:git-init[1].)
@@ -1644,7 +1668,7 @@ interactive.singlekey::
linkgit:git-add[1], linkgit:git-checkout[1], linkgit:git-commit[1],
linkgit:git-reset[1], and linkgit:git-stash[1]. Note that this
setting is silently ignored if portable keystroke input
- is not available.
+ is not available; requires the Perl module Term::ReadKey.
log.abbrevCommit::
If true, makes linkgit:git-log[1], linkgit:git-show[1], and
@@ -1873,6 +1897,31 @@ pack.packSizeLimit::
Common unit suffixes of 'k', 'm', or 'g' are
supported.
+pack.useBitmaps::
+ When true, git will use pack bitmaps (if available) when packing
+ to stdout (e.g., during the server side of a fetch). Defaults to
+ true. You should not generally need to turn this off unless
+ you are debugging pack bitmaps.
+
+pack.writebitmaps::
+ When true, git will write a bitmap index when packing all
+ objects to disk (e.g., when `git repack -a` is run). This
+ index can speed up the "counting objects" phase of subsequent
+ packs created for clones and fetches, at the cost of some disk
+ space and extra time spent on the initial repack. Defaults to
+ false.
+
+pack.writeBitmapHashCache::
+ When true, git will include a "hash cache" section in the bitmap
+ index (if one is written). This cache can be used to feed git's
+ delta heuristics, potentially leading to better deltas between
+ bitmapped and non-bitmapped objects (e.g., when serving a fetch
+ between an older, bitmapped pack and objects that have been
+ pushed since the last gc). The downside is that it consumes 4
+ bytes per object of disk space, and that JGit's bitmap
+ implementation does not understand it, causing it to complain if
+ Git and JGit are used on the same repository. Defaults to false.
+
pager.<cmd>::
If the value is boolean, turns on or off pagination of the
output of a particular Git subcommand when writing to a tty.
@@ -1892,6 +1941,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
@@ -1944,7 +2003,7 @@ When pushing to a remote that is different from the remote you normally
pull from, work as `current`. This is the safest option and is suited
for beginners.
+
-This mode will become the default in Git 2.0.
+This mode has become the default in Git 2.0.
* `matching` - push all branches having the same name on both ends.
This makes the repository you are pushing to remember the set of
@@ -1963,8 +2022,8 @@ suitable for pushing into a shared central repository, as other
people may add new branches there, or update the tip of existing
branches outside your control.
+
-This is currently the default, but Git 2.0 will change the default
-to `simple`.
+This used to be the default, but not since Git 2.0 (`simple` is the
+new default).
--
@@ -2122,6 +2181,13 @@ repack.usedeltabaseoffset::
"false" and repack. Access from old Git versions over the
native protocol are unaffected by this option.
+repack.packKeptObjects::
+ If set to true, makes `git repack` act as if
+ `--pack-kept-objects` was passed. See linkgit:git-repack[1] for
+ details. Defaults to `false` normally, but `true` if a bitmap
+ index is being written (either via `--write-bitmap-index` or
+ `pack.writeBitmaps`).
+
rerere.autoupdate::
When set to true, `git-rerere` updates the index with the
resulting contents after it cleanly resolves conflicts using
@@ -2238,7 +2304,9 @@ status.submodulesummary::
--summary-limit option of linkgit:git-submodule[1]). Please note
that the summary output command will be suppressed for all
submodules when `diff.ignoreSubmodules` is set to 'all' or only
- for those submodules where `submodule.<name>.ignore=all`. To
+ for those submodules where `submodule.<name>.ignore=all`. The only
+ exception to that rule is that status and commit will show staged
+ submodule changes. To
also view the summary for ignored submodules you can either use
the --ignore-submodules=dirty command line option or the 'git
submodule summary' command, which shows a similar output but does
@@ -2269,7 +2337,9 @@ submodule.<name>.fetchRecurseSubmodules::
submodule.<name>.ignore::
Defines under what circumstances "git status" and the diff family show
a submodule as modified. When set to "all", it will never be considered
- modified, "dirty" will ignore all changes to the submodules work tree and
+ modified (but it will nonetheless show up in the output of status and
+ commit when it has been staged), "dirty" will ignore all changes
+ to the submodules work tree and
takes only differences between the HEAD of the submodule and the commit
recorded in the superproject into account. "untracked" will additionally
let submodules with modified tracked files in their work tree show up.
@@ -2302,6 +2372,13 @@ transfer.unpackLimit::
not set, the value of this variable is used instead.
The default value is 100.
+uploadarchive.allowUnreachable::
+ If true, allow clients to use `git archive --remote` to request
+ any tree, whether reachable from the ref tips or not. See the
+ discussion in the `SECURITY` section of
+ linkgit:git-upload-archive[1] for more details. Defaults to
+ `false`.
+
uploadpack.hiderefs::
String(s) `upload-pack` uses to decide which refs to omit
from its initial advertisement. Use more than one
diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt
index f3ab3748bc..9631526110 100644
--- a/Documentation/git-add.txt
+++ b/Documentation/git-add.txt
@@ -53,8 +53,14 @@ OPTIONS
Files to add content from. Fileglobs (e.g. `*.c`) can
be given to add all matching files. Also a
leading directory name (e.g. `dir` to add `dir/file1`
- and `dir/file2`) can be given to add all files in the
- directory, recursively.
+ and `dir/file2`) can be given to update the index to
+ match the current state of the directory as a whole (e.g.
+ specifying `dir` will record not just a file `dir/file1`
+ modified in the working tree, a file `dir/file2` added to
+ the working tree, but also a file `dir/file3` removed from
+ the working tree. Note that older versions of Git used
+ to ignore removed files; use `--no-all` option if you want
+ to add modified or new files but ignore removed ones.
-n::
--dry-run::
@@ -104,10 +110,10 @@ apply to the index. See EDITING PATCHES below.
<pathspec>. This removes as well as modifies index entries to
match the working tree, but adds no new files.
+
-If no <pathspec> is given, the current version of Git defaults to
-"."; in other words, update all tracked files in the current directory
-and its subdirectories. This default will change in a future version
-of Git, hence the form without <pathspec> should not be used.
+If no <pathspec> is given when `-u` option is used, all
+tracked files in the entire working tree are updated (old versions
+of Git used to limit the update to the current directory and its
+subdirectories).
-A::
--all::
@@ -117,10 +123,10 @@ of Git, hence the form without <pathspec> should not be used.
entry. This adds, modifies, and removes index entries to
match the working tree.
+
-If no <pathspec> is given, the current version of Git defaults to
-"."; in other words, update all files in the current directory
-and its subdirectories. This default will change in a future version
-of Git, hence the form without <pathspec> should not be used.
+If no <pathspec> is given when `-A` option is used, all
+files in the entire working tree are updated (old versions
+of Git used to limit the update to the current directory and its
+subdirectories).
--no-all::
--ignore-removal::
@@ -129,11 +135,9 @@ of Git, hence the form without <pathspec> should not be used.
files that have been removed from the working tree. This
option is a no-op when no <pathspec> is used.
+
-This option is primarily to help the current users of Git, whose
-"git add <pathspec>..." ignores removed files. In future versions
-of Git, "git add <pathspec>..." will be a synonym to "git add -A
-<pathspec>..." and "git add --ignore-removal <pathspec>..." will behave like
-today's "git add <pathspec>...", ignoring removed files.
+This option is primarily to help users who are used to older
+versions of Git, whose "git add <pathspec>..." was a synonym
+for "git add --no-all <pathspec>...", i.e. ignored removed files.
-N::
--intent-to-add::
diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt
index 54d8461d61..9adce372ec 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>]] [--patch-format=<format>]
[(<mbox> | <Maildir>)...]
'git am' (--continue | --skip | --abort)
@@ -97,6 +97,12 @@ default. You can use `--no-utf8` to override this.
program that applies
the patch.
+--patch-format::
+ By default the command will try to detect the patch format
+ automatically. This option allows the user to bypass the automatic
+ detection and specify the patch format that the patch(es) should be
+ interpreted as. Valid formats are mbox, stgit, stgit-series and hg.
+
-i::
--interactive::
Run interactively.
@@ -119,6 +125,10 @@ default. You can use `--no-utf8` to override this.
Skip the current patch. This is only meaningful when
restarting an aborted patch.
+-S[<keyid>]::
+--gpg-sign[=<keyid>]::
+ GPG-sign commits.
+
--continue::
-r::
--resolved::
@@ -189,6 +199,11 @@ commits, like running 'git am' on the wrong branch or an error in the
commits that is more easily fixed by changing the mailbox (e.g.
errors in the "From:" lines).
+HOOKS
+-----
+This command can run `applypatch-msg`, `pre-applypatch`,
+and `post-applypatch` hooks. See linkgit:githooks[5] for more
+information.
SEE ALSO
--------
diff --git a/Documentation/git-archive.txt b/Documentation/git-archive.txt
index b97aaab4ed..cfa1e4ebe4 100644
--- a/Documentation/git-archive.txt
+++ b/Documentation/git-archive.txt
@@ -65,7 +65,10 @@ OPTIONS
--remote=<repo>::
Instead of making a tar archive from the local repository,
- retrieve a tar archive from a remote repository.
+ retrieve a tar archive from a remote repository. Note that the
+ remote repository may place restrictions on which sha1
+ expressions may be allowed in `<tree-ish>`. See
+ linkgit:git-upload-archive[1] for details.
--exec=<git-upload-archive>::
Used with --remote to specify the path to the
diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt
index 8e70a61840..9f23a861ce 100644
--- a/Documentation/git-blame.txt
+++ b/Documentation/git-blame.txt
@@ -35,7 +35,8 @@ Apart from supporting file annotation, Git also supports searching the
development history for when a code snippet occurred in a change. This makes it
possible to track when a code snippet was added to a file, moved or copied
between files, and eventually deleted or replaced. It works by searching for
-a text string in the diff. A small example:
+a text string in the diff. A small example of the pickaxe interface
+that searches for `blame_usage`:
-----------------------------------------------------------------------------
$ git log --pretty=oneline -S'blame_usage'
diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt
index c205d2363e..1c03c792b0 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[<key-id>]] <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[<key-id>]::
+--gpg-sign[=<key-id>]::
+ 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 bf3dac0cef..0363d0039b 100644
--- a/Documentation/git-clone.txt
+++ b/Documentation/git-clone.txt
@@ -55,15 +55,12 @@ repository is specified as a URL, then this flag is ignored (and we
never use the local optimizations). Specifying `--no-local` will
override the default when `/path/to/repo` is given, using the regular
Git transport instead.
-+
-To force copying instead of hardlinking (which may be desirable if you
-are trying to make a back-up of your repository), but still avoid the
-usual "Git aware" transport mechanism, `--no-hardlinks` can be used.
--no-hardlinks::
- Optimize the cloning process from a repository on a
- local filesystem by copying files under `.git/objects`
- directory.
+ Force the cloning process from a repository on a local
+ filesystem to copy the files under the `.git/objects`
+ directory instead of using hardlinks. This may be desirable
+ if you are trying to make a back-up of your repository.
--shared::
-s::
diff --git a/Documentation/git-commit-tree.txt b/Documentation/git-commit-tree.txt
index cafdc9642d..a469eab066 100644
--- a/Documentation/git-commit-tree.txt
+++ b/Documentation/git-commit-tree.txt
@@ -55,8 +55,13 @@ OPTIONS
from the standard input.
-S[<keyid>]::
+--gpg-sign[=<keyid>]::
GPG-sign commit.
+--no-gpg-sign::
+ Countermand `commit.gpgsign` configuration variable that is
+ set to force each and every commit to be signed.
+
Commit Information
------------------
diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index 1a7616c73a..0bbc8f55f9 100644
--- a/Documentation/git-commit.txt
+++ b/Documentation/git-commit.txt
@@ -13,7 +13,7 @@ SYNOPSIS
[-F <file> | -m <msg>] [--reset-author] [--allow-empty]
[--allow-empty-message] [--no-verify] [-e] [--author=<author>]
[--date=<date>] [--cleanup=<mode>] [--[no-]status]
- [-i | -o] [-S[<keyid>]] [--] [<file>...]
+ [-i | -o] [-S[<key-id>]] [--] [<file>...]
DESCRIPTION
-----------
@@ -176,7 +176,7 @@ OPTIONS
--cleanup=<mode>::
This option determines how the supplied commit message should be
cleaned up before committing. The '<mode>' can be `strip`,
- `whitespace`, `verbatim`, or `default`.
+ `whitespace`, `verbatim`, `scissors` or `default`.
+
--
strip::
@@ -186,6 +186,12 @@ whitespace::
Same as `strip` except #commentary is not removed.
verbatim::
Do not change the message at all.
+scissors::
+ Same as `whitespace`, except that everything from (and
+ including) the line
+ "`# ------------------------ >8 ------------------------`"
+ is truncated if the message is to be edited. "`#`" can be
+ customized with core.commentChar.
default::
Same as `strip` if the message is to be edited.
Otherwise `whitespace`.
@@ -302,6 +308,10 @@ configuration variable documented in linkgit:git-config[1].
--gpg-sign[=<keyid>]::
GPG-sign commit.
+--no-gpg-sign::
+ Countermand `commit.gpgsign` configuration variable that is
+ set to force each and every commit to be signed.
+
\--::
Do not interpret any more arguments as options.
diff --git a/Documentation/git-cvsimport.txt b/Documentation/git-cvsimport.txt
index 2df9953968..260f39fd40 100644
--- a/Documentation/git-cvsimport.txt
+++ b/Documentation/git-cvsimport.txt
@@ -21,8 +21,8 @@ DESCRIPTION
*WARNING:* `git cvsimport` uses cvsps version 2, which is considered
deprecated; it does not work with cvsps version 3 and later. If you are
performing a one-shot import of a CVS repository consider using
-link:http://cvs2svn.tigris.org/cvs2git.html[cvs2git] or
-link:https://github.com/BartMassey/parsecvs[parsecvs].
+http://cvs2svn.tigris.org/cvs2git.html[cvs2git] or
+https://github.com/BartMassey/parsecvs[parsecvs].
Imports a CVS repository into Git. It will either create a new
repository, or incrementally import into an existing one.
diff --git a/Documentation/git-filter-branch.txt b/Documentation/git-filter-branch.txt
index 2eba627170..09535f2a08 100644
--- a/Documentation/git-filter-branch.txt
+++ b/Documentation/git-filter-branch.txt
@@ -436,7 +436,7 @@ git-filter-branch allows you to make complex shell-scripted rewrites
of your Git history, but you probably don't need this flexibility if
you're simply _removing unwanted data_ like large files or passwords.
For those operations you may want to consider
-link:http://rtyley.github.io/bfg-repo-cleaner/[The BFG Repo-Cleaner],
+http://rtyley.github.io/bfg-repo-cleaner/[The BFG Repo-Cleaner],
a JVM-based alternative to git-filter-branch, typically at least
10-50x faster for those use-cases, and with quite different
characteristics:
@@ -455,7 +455,7 @@ characteristics:
_is_ possible to write filters that include their own parallellism,
in the scripts executed against each commit.
-* The link:http://rtyley.github.io/bfg-repo-cleaner/#examples[command options]
+* The http://rtyley.github.io/bfg-repo-cleaner/#examples[command options]
are much more restrictive than git-filter branch, and dedicated just
to the tasks of removing unwanted data- e.g:
`--strip-blobs-bigger-than 1M`.
diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt
index e158a3b31f..273c4663c8 100644
--- a/Documentation/git-gc.txt
+++ b/Documentation/git-gc.txt
@@ -124,6 +124,9 @@ the value, the more time is spent optimizing the delta compression. See
the documentation for the --window' option in linkgit:git-repack[1] for
more details. This defaults to 250.
+Similarly, the optional configuration variable 'gc.aggressiveDepth'
+controls --depth option in linkgit:git-repack[1]. This defaults to 250.
+
The optional configuration variable 'gc.pruneExpire' controls how old
the unreferenced loose objects have to be before they are pruned. The
default is "2 weeks ago".
diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt
index 439545926e..a3c1fa332a 100644
--- a/Documentation/git-merge.txt
+++ b/Documentation/git-merge.txt
@@ -10,7 +10,7 @@ SYNOPSIS
--------
[verse]
'git merge' [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
- [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
+ [-s <strategy>] [-X <strategy-option>] [-S[<key-id>]]
[--[no-]rerere-autoupdate] [-m <msg>] [<commit>...]
'git merge' <msg> HEAD <commit>...
'git merge' --abort
diff --git a/Documentation/git-notes.txt b/Documentation/git-notes.txt
index 84bb0fecb0..310f0a5e8c 100644
--- a/Documentation/git-notes.txt
+++ b/Documentation/git-notes.txt
@@ -14,7 +14,7 @@ SYNOPSIS
'git notes' append [-F <file> | -m <msg> | (-c | -C) <object>] [<object>]
'git notes' edit [<object>]
'git notes' show [<object>]
-'git notes' merge [-v | -q] [-s <strategy> ] <notes_ref>
+'git notes' merge [-v | -q] [-s <strategy> ] <notes-ref>
'git notes' merge --commit [-v | -q]
'git notes' merge --abort [-v | -q]
'git notes' remove [--ignore-missing] [--stdin] [<object>...]
diff --git a/Documentation/git-pack-objects.txt b/Documentation/git-pack-objects.txt
index cdab9ed503..d2d8f4792a 100644
--- a/Documentation/git-pack-objects.txt
+++ b/Documentation/git-pack-objects.txt
@@ -64,6 +64,8 @@ base-name::
the same way as 'git rev-list' with the `--objects` flag
uses its `commit` arguments to build the list of objects it
outputs. The objects on the resulting list are packed.
+ Besides revisions, `--not` or `--shallow <SHA-1>` lines are
+ also accepted.
--unpacked::
This implies `--revs`. When processing the list of
diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt
index d0b9e2f235..21cd455508 100644
--- a/Documentation/git-push.txt
+++ b/Documentation/git-push.txt
@@ -83,8 +83,8 @@ the local side, the remote side is updated if a branch of the same name
already exists on the remote side.
--all::
- Instead of naming each ref to push, specifies that all
- refs under `refs/heads/` be pushed.
+ Push all branches (i.e. refs under `refs/heads/`); cannot be
+ used with other <refspec>.
--prune::
Remove remote branches that don't have a local counterpart. For example
@@ -442,8 +442,10 @@ Examples
configured for the current branch).
`git push origin`::
- Without additional configuration, works like
- `git push origin :`.
+ Without additional configuration, pushes the current branch to
+ the configured upstream (`remote.origin.merge` configuration
+ variable) if it has the same name as the current branch, and
+ errors out without pushing otherwise.
+
The default behavior of this command when no <refspec> is given can be
configured by setting the `push` option of the remote, or the `push.default`
diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt
index 2889be6bdc..2a93c645bd 100644
--- a/Documentation/git-rebase.txt
+++ b/Documentation/git-rebase.txt
@@ -281,6 +281,10 @@ which makes little sense.
specified, `-s recursive`. Note the reversal of 'ours' and
'theirs' as noted above for the `-m` option.
+-S[<keyid>]::
+--gpg-sign[=<keyid>]::
+ GPG-sign commits.
+
-q::
--quiet::
Be quiet. Implies --no-stat.
diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt
index 2507c8bd91..cb103c8b6f 100644
--- a/Documentation/git-remote.txt
+++ b/Documentation/git-remote.txt
@@ -3,7 +3,7 @@ git-remote(1)
NAME
----
-git-remote - manage set of tracked repositories
+git-remote - Manage set of tracked repositories
SYNOPSIS
diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt
index 509cf73e50..4786a780b5 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.txt
@@ -9,7 +9,7 @@ git-repack - Pack unpacked objects in a repository
SYNOPSIS
--------
[verse]
-'git repack' [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [--window=<n>] [--depth=<n>]
+'git repack' [-a] [-A] [-d] [-f] [-F] [-l] [-n] [-q] [-b] [--window=<n>] [--depth=<n>]
DESCRIPTION
-----------
@@ -110,6 +110,21 @@ other objects in that pack they already have locally.
The default is unlimited, unless the config variable
`pack.packSizeLimit` is set.
+-b::
+--write-bitmap-index::
+ Write a reachability bitmap index as part of the repack. This
+ only makes sense when used with `-a` or `-A`, as the bitmaps
+ must be able to refer to all reachable objects. This option
+ overrides the setting of `pack.writebitmaps`.
+
+--pack-kept-objects::
+ Include objects in `.keep` files when repacking. Note that we
+ still do not delete `.keep` packs after `pack-objects` finishes.
+ This means that we may duplicate objects, but this makes the
+ option safe to use when there are concurrent pushes or fetches.
+ This option is generally only useful if you are writing bitmaps
+ with `-b` or `pack.writebitmaps`, as it ensures that the
+ bitmapped packfile has the necessary objects.
Configuration
-------------
diff --git a/Documentation/git-request-pull.txt b/Documentation/git-request-pull.txt
index b99681ce85..283577b0b6 100644
--- a/Documentation/git-request-pull.txt
+++ b/Documentation/git-request-pull.txt
@@ -13,22 +13,65 @@ SYNOPSIS
DESCRIPTION
-----------
-Summarizes the changes between two commits to the standard output, and includes
-the given URL in the generated summary.
+Generate a request asking your upstream project to pull changes into
+their tree. The request, printed to the standard output, summarizes
+the changes and indicates from where they can be pulled.
+
+The upstream project is expected to have the commit named by
+`<start>` and the output asks it to integrate the changes you made
+since that commit, up to the commit named by `<end>`, by visiting
+the repository named by `<url>`.
+
OPTIONS
-------
-p::
- Show patch text
+ Include patch text in the output.
<start>::
- Commit to start at.
+ Commit to start at. This names a commit that is already in
+ the upstream history.
<url>::
- URL to include in the summary.
+ The repository URL to be pulled from.
<end>::
- Commit to end at; defaults to HEAD.
+ Commit to end at (defaults to HEAD). This names the commit
+ at the tip of the history you are asking to be pulled.
++
+When the repository named by `<url>` has the commit at a tip of a
+ref that is different from the ref you have locally, you can use the
+`<local>:<remote>` syntax, to have its local name, a colon `:`, and
+its remote name.
+
+
+EXAMPLE
+-------
+
+Imagine that you built your work on your `master` branch on top of
+the `v1.0` release, and want it to be integrated to the project.
+First you push that change to your public repository for others to
+see:
+
+ git push https://git.ko.xz/project master
+
+Then, you run this command:
+
+ git request-pull v1.0 https://git.ko.xz/project master
+
+which will produce a request to the upstream, summarizing the
+changes between the `v1.0` release and your `master`, to pull it
+from your public repository.
+
+If you pushed your change to a branch whose name is different from
+the one you have locally, e.g.
+
+ git push https://git.ko.xz/project master:for-linus
+
+then you can ask that to be pulled with
+
+ git request-pull v1.0 https://git.ko.xz/project master:for-linus
+
GIT
---
diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.txt
index 24bf4d55f9..25432d9257 100644
--- a/Documentation/git-reset.txt
+++ b/Documentation/git-reset.txt
@@ -10,7 +10,7 @@ SYNOPSIS
[verse]
'git reset' [-q] [<tree-ish>] [--] <paths>...
'git reset' (--patch | -p) [<tree-ish>] [--] [<paths>...]
-'git reset' [--soft | --mixed | --hard | --merge | --keep] [-q] [<commit>]
+'git reset' [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]
DESCRIPTION
-----------
@@ -60,6 +60,9 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
Resets the index but not the working tree (i.e., the changed files
are preserved but not marked for commit) and reports what has not
been updated. This is the default action.
++
+If `-N` is specified, removed paths are marked as intent-to-add (see
+linkgit:git-add[1]).
--hard::
Resets the index and working tree. Any changes to tracked files in the
diff --git a/Documentation/git-rev-list.txt b/Documentation/git-rev-list.txt
index 045b37b82e..7a1585def0 100644
--- a/Documentation/git-rev-list.txt
+++ b/Documentation/git-rev-list.txt
@@ -55,6 +55,7 @@ SYNOPSIS
[ \--reverse ]
[ \--walk-reflogs ]
[ \--no-walk ] [ \--do-walk ]
+ [ \--use-bitmap-index ]
<commit>... [ \-- <paths>... ]
DESCRIPTION
diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt
index 55ea1a037d..54143a0693 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -284,20 +284,20 @@ Input Format
'git rev-parse --parseopt' input format is fully text based. It has two parts,
separated by a line that contains only `--`. The lines before the separator
-(should be more than one) are used for the usage.
+(should be one or more) are used for the usage.
The lines after the separator describe the options.
Each line of options has this format:
------------
-<opt_spec><flags>* SP+ help LF
+<opt-spec><flags>*<arg-hint>? SP+ help LF
------------
-`<opt_spec>`::
+`<opt-spec>`::
its format is the short option character, then the long option name
separated by a comma. Both parts are not required, though at least one
is necessary. `h,help`, `dry-run` and `f` are all three correct
- `<opt_spec>`.
+ `<opt-spec>`.
`<flags>`::
`<flags>` are of `*`, `=`, `?` or `!`.
@@ -313,6 +313,12 @@ Each line of options has this format:
* Use `!` to not make the corresponding negated long option available.
+`<arg-hint>`::
+ `<arg-hint>`, if specified, is used as a name of the argument in the
+ help output, for options that take arguments. `<arg-hint>` is
+ terminated by the first whitespace. It is customary to use a
+ dash to separate words in a multi-word argument hint.
+
The remainder of the line, after stripping the spaces, is used
as the help associated to the option.
@@ -333,6 +339,8 @@ h,help show the help
foo some nifty option --foo
bar= some cool option --bar with an argument
+baz=arg another cool option --baz with a named argument
+qux?path qux may take a path argument but has meaning by itself
An option group Header
C? option C with an optional argument"
@@ -340,6 +348,28 @@ C? option C with an optional argument"
eval "$(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)"
------------
+
+Usage text
+~~~~~~~~~~
+
+When `"$@"` is `-h` or `--help` in the above example, the following
+usage text would be shown:
+
+------------
+usage: some-command [options] <args>...
+
+ some-command does foo and bar!
+
+ -h, --help show the help
+ --foo some nifty option --foo
+ --bar ... some cool option --bar with an argument
+ --baz <arg> another cool option --baz with a named argument
+ --qux[=<path>] qux may take a path argument but has meaning by itself
+
+An option group Header
+ -C[...] option C with an optional argument
+------------
+
SQ-QUOTE
--------
diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt
index 2de67a5496..cceb5f2f7f 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[<key-id>]] <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[<key-id>]::
+--gpg-sign[=<key-id>]::
+ GPG-sign commits.
+
-s::
--signoff::
Add Signed-off-by line at the end of the commit message.
diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt
index db7e803038..375213fe46 100644
--- a/Documentation/git-stash.txt
+++ b/Documentation/git-stash.txt
@@ -44,7 +44,7 @@ is also possible).
OPTIONS
-------
-save [-p|--patch] [--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]::
+save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]::
Save your local modifications to a new 'stash', and run `git reset
--hard` to revert them. The <message> part is optional and gives
diff --git a/Documentation/git-status.txt b/Documentation/git-status.txt
index a4acaa038c..def635f578 100644
--- a/Documentation/git-status.txt
+++ b/Documentation/git-status.txt
@@ -97,7 +97,7 @@ configuration variable documented in linkgit:git-config[1].
OUTPUT
------
The output from this command is designed to be used as a commit
-template comment, and all the output lines are prefixed with '#'.
+template comment.
The default, long format, is designed to be human readable,
verbose and descriptive. Its contents and format are subject to change
at any time.
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index bfef8a0c62..8e6af65da0 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -15,12 +15,12 @@ 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] [--reference <repository>]
+ [--depth <depth>] [--recursive] [--] [<path>...]
'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>]
[commit] [--] [<path>...]
'git submodule' [--quiet] foreach [--recursive] <command>
-'git submodule' [--quiet] sync [--] [<path>...]
+'git submodule' [--quiet] sync [--recursive] [--] [<path>...]
DESCRIPTION
@@ -229,7 +229,7 @@ OPTIONS
-b::
--branch::
Branch of repository to add as submodule.
- The name of the branch is recorded as `submodule.<path>.branch` in
+ The name of the branch is recorded as `submodule.<name>.branch` in
`.gitmodules` for `update --remote`.
-f::
@@ -281,12 +281,31 @@ In order to ensure a current tracking branch state, `update --remote`
fetches the submodule's remote repository before calculating the
SHA-1. If you don't want to fetch, you should use `submodule update
--remote --no-fetch`.
++
+Use this option to integrate changes from the upstream subproject with
+your submodule's current HEAD. Alternatively, you can run `git pull`
+from the submodule, which is equivalent except for the remote branch
+name: `update --remote` uses the default upstream repository and
+`submodule.<name>.branch`, while `git pull` uses the submodule's
+`branch.<name>.merge`. Prefer `submodule.<name>.branch` if you want
+to distribute the default upstream branch with the superproject and
+`branch.<name>.merge` if you want a more native feel while working in
+the submodule itself.
-N::
--no-fetch::
This option is only valid for the update command.
Don't fetch new objects from the remote site.
+--checkout::
+ This option is only valid for the update command.
+ Checkout the commit recorded in the superproject on a detached HEAD
+ in the submodule. This is the default behavior, the main use of
+ this option is to override `submodule.$name.update` when set to
+ `merge`, `rebase` or `none`.
+ If the key `submodule.$name.update` is either not explicitly set or
+ set to `checkout`, this option is implicit.
+
--merge::
This option is only valid for the update command.
Merge the commit recorded in the superproject into the current branch
diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
index 30c5ee2564..fce585388c 100644
--- a/Documentation/git-svn.txt
+++ b/Documentation/git-svn.txt
@@ -86,13 +86,14 @@ COMMANDS
(refs/remotes/$remote/*). Setting a prefix is also useful
if you wish to track multiple projects that share a common
repository.
+ By default, the prefix is set to 'origin/'.
+
-NOTE: In Git v2.0, the default prefix will CHANGE from "" (no prefix)
-to "origin/". This is done to put SVN-tracking refs at
-"refs/remotes/origin/*" instead of "refs/remotes/*", and make them
-more compatible with how Git's own remote-tracking refs are organized
-(i.e. refs/remotes/$remote/*). You can enjoy the same benefits today,
-by using the --prefix option.
+NOTE: Before Git v2.0, the default prefix was "" (no prefix). This
+meant that SVN-tracking refs were put at "refs/remotes/*", which is
+incompatible with how Git's own remote-tracking refs are organized.
+If you still want the old default, you can get it by passing
+`--prefix ""` on the command line (`--prefix=""` may not work if
+your Perl's Getopt::Long is < v2.37).
--ignore-paths=<regex>;;
When passed to 'init' or 'clone' this regular expression will
@@ -994,16 +995,6 @@ without giving any repository layout options. If the full history with
branches and tags is required, the options '--trunk' / '--branches' /
'--tags' must be used.
-When using the options for describing the repository layout (--trunk,
---tags, --branches, --stdlayout), please also specify the --prefix
-option (e.g. '--prefix=origin/') to cause your SVN-tracking refs to be
-placed at refs/remotes/origin/* rather than the default refs/remotes/*.
-The former is more compatible with the layout of Git's "regular"
-remote-tracking refs (refs/remotes/$remote/*), and may potentially
-prevent similarly named SVN branches and Git remotes from clobbering
-each other. In Git v2.0 the default prefix used (i.e. when no --prefix
-is given) will change from "" (no prefix) to "origin/".
-
When using multiple --branches or --tags, 'git svn' does not automatically
handle name collisions (for example, if two branches from different paths have
the same name, or if a branch and a tag have the same name). In these cases,
diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index 8c82b87c80..303de8eee5 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -95,6 +95,12 @@ OPTIONS
using fnmatch(3)). Multiple patterns may be given; if any of
them matches, the tag is shown.
+--sort=<type>::
+ Sort in a specific order. Supported type is "refname"
+ (lexicographic order), "version:refname" or "v:refname" (tag
+ names are treated as versions). Prepend "-" to reverse sort
+ order.
+
--column[=<options>]::
--no-column::
Display tag listing in columns. See configuration variable
diff --git a/Documentation/git-update-index.txt b/Documentation/git-update-index.txt
index e0a87029cd..d6de4a008c 100644
--- a/Documentation/git-update-index.txt
+++ b/Documentation/git-update-index.txt
@@ -12,7 +12,7 @@ SYNOPSIS
'git update-index'
[--add] [--remove | --force-remove] [--replace]
[--refresh] [-q] [--unmerged] [--ignore-missing]
- [(--cacheinfo <mode> <object> <file>)...]
+ [(--cacheinfo <mode>,<object>,<file>)...]
[--chmod=(+|-)x]
[--[no-]assume-unchanged]
[--[no-]skip-worktree]
@@ -68,8 +68,12 @@ OPTIONS
--ignore-missing::
Ignores missing files during a --refresh
+--cacheinfo <mode>,<object>,<path>::
--cacheinfo <mode> <object> <path>::
- Directly insert the specified info into the index.
+ Directly insert the specified info into the index. For
+ backward compatibility, you can also give these three
+ arguments as three separate parameters, but new users are
+ encouraged to use a single-parameter form.
--index-info::
Read index information from stdin.
diff --git a/Documentation/git-upload-archive.txt b/Documentation/git-upload-archive.txt
index d09bbb52b1..cbef61ba88 100644
--- a/Documentation/git-upload-archive.txt
+++ b/Documentation/git-upload-archive.txt
@@ -20,6 +20,38 @@ This command is usually not invoked directly by the end user. The UI
for the protocol is on the 'git archive' side, and the program pair
is meant to be used to get an archive from a remote repository.
+SECURITY
+--------
+
+In order to protect the privacy of objects that have been removed from
+history but may not yet have been pruned, `git-upload-archive` avoids
+serving archives for commits and trees that are not reachable from the
+repository's refs. However, because calculating object reachability is
+computationally expensive, `git-upload-archive` implements a stricter
+but easier-to-check set of rules:
+
+ 1. Clients may request a commit or tree that is pointed to directly by
+ a ref. E.g., `git archive --remote=origin v1.0`.
+
+ 2. Clients may request a sub-tree within a commit or tree using the
+ `ref:path` syntax. E.g., `git archive --remote=origin v1.0:Documentation`.
+
+ 3. Clients may _not_ use other sha1 expressions, even if the end
+ result is reachable. E.g., neither a relative commit like `master^`
+ nor a literal sha1 like `abcd1234` is allowed, even if the result
+ is reachable from the refs.
+
+Note that rule 3 disallows many cases that do not have any privacy
+implications. These rules are subject to change in future versions of
+git, and the server accessed by `git archive --remote` may or may not
+follow these exact rules.
+
+If the config option `uploadArchive.allowUnreachable` is true, these
+rules are ignored, and clients may use arbitrary sha1 expressions.
+This is useful if you do not care about the privacy of unreachable
+objects, or if your object database is already publicly available for
+access via non-smart-http.
+
OPTIONS
-------
<directory>::
diff --git a/Documentation/git.txt b/Documentation/git.txt
index d092ce5684..aa5b268e00 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -43,6 +43,15 @@ unreleased) version of Git, that is available from 'master'
branch of the `git.git` repository.
Documentation for older releases are available here:
+* link:v2.0.4/git.html[documentation for release 2.0.4]
+
+* release notes for
+ link:RelNotes/2.0.4.txt[2.0.4],
+ link:RelNotes/2.0.3.txt[2.0.3],
+ link:RelNotes/2.0.2.txt[2.0.2],
+ link:RelNotes/2.0.1.txt[2.0.1],
+ link:RelNotes/2.0.0.txt[2.0.0].
+
* link:v1.9.5/git.html[documentation for release 1.9.5]
* release notes for
@@ -726,6 +735,11 @@ Git so take care if using Cogito etc.
index file. If not specified, the default of `$GIT_DIR/index`
is used.
+'GIT_INDEX_VERSION'::
+ This environment variable allows the specification of an index
+ version for new repositories. It won't affect existing index
+ files. By default index file version [23] is used.
+
'GIT_OBJECT_DIRECTORY'::
If the object storage directory is specified via this
environment variable then the sha1 directories are created
@@ -1034,7 +1048,7 @@ Authors
-------
Git was started by Linus Torvalds, and is currently maintained by Junio
C Hamano. Numerous contributions have come from the Git mailing list
-<git@vger.kernel.org>. http://www.ohloh.net/p/git/contributors/summary
+<git@vger.kernel.org>. http://www.openhub.net/p/git/contributors/summary
gives you a more complete list of contributors.
If you have a clone of git.git itself, the
diff --git a/Documentation/gitcore-tutorial.txt b/Documentation/gitcore-tutorial.txt
index 058a352980..d2d7c213dd 100644
--- a/Documentation/gitcore-tutorial.txt
+++ b/Documentation/gitcore-tutorial.txt
@@ -1443,7 +1443,7 @@ Although Git is a truly distributed system, it is often
convenient to organize your project with an informal hierarchy
of developers. Linux kernel development is run this way. There
is a nice illustration (page 17, "Merges to Mainline") in
-link:http://www.xenotime.net/linux/mentor/linux-mentoring-2006.pdf[Randy Dunlap's presentation].
+http://www.xenotime.net/linux/mentor/linux-mentoring-2006.pdf[Randy Dunlap's presentation].
It should be stressed that this hierarchy is purely *informal*.
There is nothing fundamental in Git that enforces the "chain of
diff --git a/Documentation/gitcvs-migration.txt b/Documentation/gitcvs-migration.txt
index 5ea94cbceb..5f4e89005c 100644
--- a/Documentation/gitcvs-migration.txt
+++ b/Documentation/gitcvs-migration.txt
@@ -117,7 +117,7 @@ Importing a CVS archive
-----------------------
First, install version 2.1 or higher of cvsps from
-link:http://www.cobite.com/cvsps/[http://www.cobite.com/cvsps/] and make
+http://www.cobite.com/cvsps/[http://www.cobite.com/cvsps/] and make
sure it is in your path. Then cd to a checked out CVS working directory
of the project you are interested in and run linkgit:git-cvsimport[1]:
diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt
index b08d34d84e..8734c1566c 100644
--- a/Documentation/gitignore.txt
+++ b/Documentation/gitignore.txt
@@ -77,6 +77,9 @@ PATTERN FORMAT
Put a backslash ("`\`") in front of the first hash for patterns
that begin with a hash.
+ - Trailing spaces are ignored unless they are quoted with backlash
+ ("`\`").
+
- An optional prefix "`!`" which negates the pattern; any
matching file excluded by a previous pattern will become
included again. It is not possible to re-include a file if a parent
diff --git a/Documentation/gitk.txt b/Documentation/gitk.txt
index 1e9e38ae40..7e03fcc62d 100644
--- a/Documentation/gitk.txt
+++ b/Documentation/gitk.txt
@@ -166,8 +166,14 @@ gitk --max-count=100 --all \-- Makefile::
Files
-----
-Gitk creates the .gitk file in your $HOME directory to store preferences
-such as display options, font, and colors.
+User configuration and preferences are stored at:
+
+* '$XDG_CONFIG_HOME/git/gitk' if it exists, otherwise
+* '$HOME/.gitk' if it exists
+
+If neither of the above exist then '$XDG_CONFIG_HOME/git/gitk' is created and
+used by default. If '$XDG_CONFIG_HOME' is not set it defaults to
+'$HOME/.config' in all cases.
History
-------
diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt
index 347a9f76ee..f6c0dfd029 100644
--- a/Documentation/gitmodules.txt
+++ b/Documentation/gitmodules.txt
@@ -67,7 +67,9 @@ submodule.<name>.fetchRecurseSubmodules::
submodule.<name>.ignore::
Defines under what circumstances "git status" and the diff family show
a submodule as modified. When set to "all", it will never be considered
- modified, "dirty" will ignore all changes to the submodules work tree and
+ modified (but will nonetheless show up in the output of status and
+ commit when it has been staged), "dirty" will ignore all changes
+ to the submodules work tree and
takes only differences between the HEAD of the submodule and the commit
recorded in the superproject into account. "untracked" will additionally
let submodules with modified tracked files in their work tree show up.
diff --git a/Documentation/gitremote-helpers.txt b/Documentation/gitremote-helpers.txt
index c2908db763..64f7ad26b4 100644
--- a/Documentation/gitremote-helpers.txt
+++ b/Documentation/gitremote-helpers.txt
@@ -437,6 +437,10 @@ set by Git if the remote helper has the 'option' capability.
'option check-connectivity' \{'true'|'false'\}::
Request the helper to check connectivity of a clone.
+'option force' \{'true'|'false'\}::
+ Request the helper to perform a force update. Defaults to
+ 'false'.
+
'option cloning \{'true'|'false'\}::
Notify the helper this is a clone request (i.e. the current
repository is guaranteed empty).
diff --git a/Documentation/gitrepository-layout.txt b/Documentation/gitrepository-layout.txt
index aa03882ddb..17d2ea6c1e 100644
--- a/Documentation/gitrepository-layout.txt
+++ b/Documentation/gitrepository-layout.txt
@@ -176,6 +176,10 @@ info/grafts::
per line describes a commit and its fake parents by
listing their 40-byte hexadecimal object names separated
by a space and terminated by a newline.
++
+Note that the grafts mechanism is outdated and can lead to problems
+transferring objects between repositories; see linkgit:git-replace[1]
+for a more flexible and robust system to do the same thing.
info/exclude::
This file, by convention among Porcelains, stores the
diff --git a/Documentation/gitweb.txt b/Documentation/gitweb.txt
index cca14b8cc3..cd9c8951b2 100644
--- a/Documentation/gitweb.txt
+++ b/Documentation/gitweb.txt
@@ -84,7 +84,7 @@ separator (rules for Perl's "`split(" ", $line)`").
* Fields use modified URI encoding, defined in RFC 3986, section 2.1
(Percent-Encoding), or rather "Query string encoding" (see
-link:http://en.wikipedia.org/wiki/Query_string#URL_encoding[]), the difference
+http://en.wikipedia.org/wiki/Query_string#URL_encoding[]), the difference
being that SP (" ") can be encoded as "{plus}" (and therefore "{plus}" has to be
also percent-encoded).
+
diff --git a/Documentation/glossary-content.txt b/Documentation/glossary-content.txt
index 378306f581..4e0b971824 100644
--- a/Documentation/glossary-content.txt
+++ b/Documentation/glossary-content.txt
@@ -1,7 +1,7 @@
[[def_alternate_object_database]]alternate object database::
Via the alternates mechanism, a <<def_repository,repository>>
can inherit part of its <<def_object_database,object database>>
- from another object database, which is called "alternate".
+ from another object database, which is called an "alternate".
[[def_bare_repository]]bare repository::
A bare repository is normally an appropriately
@@ -176,6 +176,10 @@ current branch integrates with) obviously do not work, as there is no
you can make Git pretend the set of <<def_parent,parents>> a <<def_commit,commit>> has
is different from what was recorded when the commit was
created. Configured via the `.git/info/grafts` file.
++
+Note that the grafts mechanism is outdated and can lead to problems
+transferring objects between repositories; see linkgit:git-replace[1]
+for a more flexible and robust system to do the same thing.
[[def_hash]]hash::
In Git's context, synonym for <<def_object_name,object name>>.
diff --git a/Documentation/howto-index.sh b/Documentation/howto-index.sh
index a2340864b5..167b363668 100755
--- a/Documentation/howto-index.sh
+++ b/Documentation/howto-index.sh
@@ -11,8 +11,8 @@ EOF
for txt
do
- title=`expr "$txt" : '.*/\(.*\)\.txt$'`
- from=`sed -ne '
+ title=$(expr "$txt" : '.*/\(.*\)\.txt$')
+ from=$(sed -ne '
/^$/q
/^From:[ ]/{
s///
@@ -21,9 +21,9 @@ do
s/^/by /
p
}
- ' "$txt"`
+ ' "$txt")
- abstract=`sed -ne '
+ abstract=$(sed -ne '
/^Abstract:[ ]/{
s/^[^ ]*//
x
@@ -39,11 +39,11 @@ do
x
p
q
- }' "$txt"`
+ }' "$txt")
if grep 'Content-type: text/asciidoc' >/dev/null $txt
then
- file=`expr "$txt" : '\(.*\)\.txt$'`.html
+ file=$(expr "$txt" : '\(.*\)\.txt$').html
else
file="$txt"
fi
diff --git a/Documentation/install-webdoc.sh b/Documentation/install-webdoc.sh
index 76d69a907b..ed8b4ff3e5 100755
--- a/Documentation/install-webdoc.sh
+++ b/Documentation/install-webdoc.sh
@@ -18,17 +18,17 @@ do
else
echo >&2 "# install $h $T/$h"
rm -f "$T/$h"
- mkdir -p `dirname "$T/$h"`
+ mkdir -p $(dirname "$T/$h")
cp "$h" "$T/$h"
fi
done
-strip_leading=`echo "$T/" | sed -e 's|.|.|g'`
+strip_leading=$(echo "$T/" | sed -e 's|.|.|g')
for th in \
"$T"/*.html "$T"/*.txt \
"$T"/howto/*.txt "$T"/howto/*.html \
"$T"/technical/*.txt "$T"/technical/*.html
do
- h=`expr "$th" : "$strip_leading"'\(.*\)'`
+ h=$(expr "$th" : "$strip_leading"'\(.*\)')
case "$h" in
RelNotes-*.txt | index.html) continue ;;
esac
diff --git a/Documentation/merge-strategies.txt b/Documentation/merge-strategies.txt
index feabc1ccf4..7bbd19b300 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/rev-list-options.txt b/Documentation/rev-list-options.txt
index 47c8dcca9d..deb8cca917 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -257,6 +257,14 @@ See also linkgit:git-reflog[1].
Output excluded boundary commits. Boundary commits are
prefixed with `-`.
+ifdef::git-rev-list[]
+--use-bitmap-index::
+
+ Try to speed up the traversal using the pack bitmap index (if
+ one is available). Note that when traversing with `--objects`,
+ trees and blobs will not have their associated path printed.
+endif::git-rev-list[]
+
--
History Simplification
@@ -750,6 +758,13 @@ This enables parent rewriting, see 'History Simplification' below.
This implies the `--topo-order` option by default, but the
`--date-order` option may also be specified.
+--show-linear-break[=<barrier>]::
+ When --graph is not used, all history branches are flattened
+ which can make it hard to see that the two consecutive commits
+ do not belong to a linear branch. This option puts a barrier
+ in between them in that case. If `<barrier>` is specified, it
+ is the string that will be shown instead of the default one.
+
ifdef::git-rev-list[]
--count::
Print a number stating how many commits would have been
diff --git a/Documentation/technical/api-hash.txt b/Documentation/technical/api-hash.txt
deleted file mode 100644
index e5061e0677..0000000000
--- a/Documentation/technical/api-hash.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-hash API
-========
-
-The hash API is a collection of simple hash table functions. Users are expected
-to implement their own hashing.
-
-Data Structures
----------------
-
-`struct hash_table`::
-
- The hash table structure. The `array` member points to the hash table
- entries. The `size` member counts the total number of valid and invalid
- entries in the table. The `nr` member keeps track of the number of
- valid entries.
-
-`struct hash_table_entry`::
-
- An opaque structure representing an entry in the hash table. The `hash`
- member is the entry's hash key and the `ptr` member is the entry's
- value.
-
-Functions
----------
-
-`init_hash`::
-
- Initialize the hash table.
-
-`free_hash`::
-
- Release memory associated with the hash table.
-
-`insert_hash`::
-
- Insert a pointer into the hash table. If an entry with that hash
- already exists, a pointer to the existing entry's value is returned.
- Otherwise NULL is returned. This allows callers to implement
- chaining, etc.
-
-`lookup_hash`::
-
- Lookup an entry in the hash table. If an entry with that hash exists
- the entry's value is returned. Otherwise NULL is returned.
-
-`for_each_hash`::
-
- Call a function for each entry in the hash table. The function is
- expected to take the entry's value as its only argument and return an
- int. If the function returns a negative int the loop is aborted
- immediately. Otherwise, the return value is accumulated and the sum
- returned upon completion of the loop.
diff --git a/Documentation/technical/api-hashmap.txt b/Documentation/technical/api-hashmap.txt
new file mode 100644
index 0000000000..b977ae8bbb
--- /dev/null
+++ b/Documentation/technical/api-hashmap.txt
@@ -0,0 +1,234 @@
+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.
+------------
+struct hashmap map;
+
+struct long2double {
+ struct hashmap_entry ent; /* must be the first member! */
+ long key;
+ double value;
+};
+
+static int long2double_cmp(const struct long2double *e1, const struct long2double *e2, const void *unused)
+{
+ return !(e1->key == e2->key);
+}
+
+void long2double_init(void)
+{
+ hashmap_init(&map, (hashmap_cmp_fn) long2double_cmp, 0);
+}
+
+void long2double_free(void)
+{
+ hashmap_free(&map, 1);
+}
+
+static struct long2double *find_entry(long key)
+{
+ struct long2double k;
+ hashmap_entry_init(&k, memhash(&key, sizeof(long)));
+ k.key = key;
+ return hashmap_get(&map, &k, NULL);
+}
+
+double get_value(long key)
+{
+ struct long2double *e = find_entry(key);
+ return e ? e->value : 0;
+}
+
+void set_value(long key, double value)
+{
+ struct long2double *e = find_entry(key);
+ if (!e) {
+ e = malloc(sizeof(struct long2double));
+ hashmap_entry_init(e, memhash(&key, sizeof(long)));
+ e->key = key;
+ hashmap_add(&map, e);
+ }
+ e->value = value;
+}
+------------
+
+Using variable-sized keys
+-------------------------
+
+The `hashmap_entry_get` and `hashmap_entry_remove` functions expect an ordinary
+`hashmap_entry` structure as key to find the correct entry. If the key data is
+variable-sized (e.g. a FLEX_ARRAY string) or quite large, it is undesirable
+to create a full-fledged entry structure on the heap and copy all the key data
+into the structure.
+
+In this case, the `keydata` parameter can be used to pass
+variable-sized key data directly to the comparison function, and the `key`
+parameter can be a stripped-down, fixed size entry structure allocated on the
+stack.
+
+See test-hashmap.c for an example using arbitrary-length strings as keys.
diff --git a/Documentation/technical/api-parse-options.txt b/Documentation/technical/api-parse-options.txt
index be50cf4de3..1f2db31312 100644
--- a/Documentation/technical/api-parse-options.txt
+++ b/Documentation/technical/api-parse-options.txt
@@ -160,10 +160,6 @@ There are some macros to easily define options:
`int_var` is set to `integer` with `--option`, and
reset to zero with `--no-option`.
-`OPT_SET_PTR(short, long, &ptr_var, description, ptr)`::
- Introduce a boolean option.
- If used, set `ptr_var` to `ptr`.
-
`OPT_STRING(short, long, &str_var, arg_str, description)`::
Introduce an option with string argument.
The string argument is put into `str_var`.
diff --git a/Documentation/technical/api-strbuf.txt b/Documentation/technical/api-strbuf.txt
index 3350d97dda..1d00e4d596 100644
--- a/Documentation/technical/api-strbuf.txt
+++ b/Documentation/technical/api-strbuf.txt
@@ -7,10 +7,10 @@ use the mem* functions than a str* one (memchr vs. strchr e.g.).
Though, one has to be careful about the fact that str* functions often
stop on NULs and that strbufs may have embedded NULs.
-An strbuf is NUL terminated for convenience, but no function in the
+A strbuf is NUL terminated for convenience, but no function in the
strbuf API actually relies on the string being free of NULs.
-strbufs has some invariants that are very important to keep in mind:
+strbufs have some invariants that are very important to keep in mind:
. The `buf` member is never NULL, so it can be used in any usual C
string operations safely. strbuf's _have_ to be initialized either by
@@ -56,8 +56,8 @@ Data structures
* `struct strbuf`
This is the string buffer structure. The `len` member can be used to
-determine the current length of the string, and `buf` member provides access to
-the string itself.
+determine the current length of the string, and `buf` member provides
+access to the string itself.
Functions
---------
@@ -184,7 +184,7 @@ strbuf_addstr(sb, "immediate string");
`strbuf_addbuf`::
- Copy the contents of an other buffer at the end of the current one.
+ Copy the contents of another buffer at the end of the current one.
`strbuf_adddup`::
diff --git a/Documentation/technical/bitmap-format.txt b/Documentation/technical/bitmap-format.txt
new file mode 100644
index 0000000000..f8c18a0f7a
--- /dev/null
+++ b/Documentation/technical/bitmap-format.txt
@@ -0,0 +1,164 @@
+GIT bitmap v1 format
+====================
+
+ - A header appears at the beginning:
+
+ 4-byte signature: {'B', 'I', 'T', 'M'}
+
+ 2-byte version number (network byte order)
+ The current implementation only supports version 1
+ of the bitmap index (the same one as JGit).
+
+ 2-byte flags (network byte order)
+
+ The following flags are supported:
+
+ - BITMAP_OPT_FULL_DAG (0x1) REQUIRED
+ This flag must always be present. It implies that the bitmap
+ index has been generated for a packfile with full closure
+ (i.e. where every single object in the packfile can find
+ its parent links inside the same packfile). This is a
+ requirement for the bitmap index format, also present in JGit,
+ that greatly reduces the complexity of the implementation.
+
+ - BITMAP_OPT_HASH_CACHE (0x4)
+ If present, the end of the bitmap file contains
+ `N` 32-bit name-hash values, one per object in the
+ pack. The format and meaning of the name-hash is
+ described below.
+
+ 4-byte entry count (network byte order)
+
+ The total count of entries (bitmapped commits) in this bitmap index.
+
+ 20-byte checksum
+
+ The SHA1 checksum of the pack this bitmap index belongs to.
+
+ - 4 EWAH bitmaps that act as type indexes
+
+ Type indexes are serialized after the hash cache in the shape
+ of four EWAH bitmaps stored consecutively (see Appendix A for
+ the serialization format of an EWAH bitmap).
+
+ There is a bitmap for each Git object type, stored in the following
+ order:
+
+ - Commits
+ - Trees
+ - Blobs
+ - Tags
+
+ In each bitmap, the `n`th bit is set to true if the `n`th object
+ in the packfile is of that type.
+
+ The obvious consequence is that the OR of all 4 bitmaps will result
+ in a full set (all bits set), and the AND of all 4 bitmaps will
+ result in an empty bitmap (no bits set).
+
+ - N entries with compressed bitmaps, one for each indexed commit
+
+ Where `N` is the total amount of entries in this bitmap index.
+ Each entry contains the following:
+
+ - 4-byte object position (network byte order)
+ The position **in the index for the packfile** where the
+ bitmap for this commit is found.
+
+ - 1-byte XOR-offset
+ The xor offset used to compress this bitmap. For an entry
+ in position `x`, a XOR offset of `y` means that the actual
+ bitmap representing this commit is composed by XORing the
+ bitmap for this entry with the bitmap in entry `x-y` (i.e.
+ the bitmap `y` entries before this one).
+
+ Note that this compression can be recursive. In order to
+ XOR this entry with a previous one, the previous entry needs
+ to be decompressed first, and so on.
+
+ The hard-limit for this offset is 160 (an entry can only be
+ xor'ed against one of the 160 entries preceding it). This
+ number is always positive, and hence entries are always xor'ed
+ with **previous** bitmaps, not bitmaps that will come afterwards
+ in the index.
+
+ - 1-byte flags for this bitmap
+ At the moment the only available flag is `0x1`, which hints
+ that this bitmap can be re-used when rebuilding bitmap indexes
+ for the repository.
+
+ - The compressed bitmap itself, see Appendix A.
+
+== Appendix A: Serialization format for an EWAH bitmap
+
+Ewah bitmaps are serialized in the same protocol as the JAVAEWAH
+library, making them backwards compatible with the JGit
+implementation:
+
+ - 4-byte number of bits of the resulting UNCOMPRESSED bitmap
+
+ - 4-byte number of words of the COMPRESSED bitmap, when stored
+
+ - N x 8-byte words, as specified by the previous field
+
+ This is the actual content of the compressed bitmap.
+
+ - 4-byte position of the current RLW for the compressed
+ bitmap
+
+All words are stored in network byte order for their corresponding
+sizes.
+
+The compressed bitmap is stored in a form of run-length encoding, as
+follows. It consists of a concatenation of an arbitrary number of
+chunks. Each chunk consists of one or more 64-bit words
+
+ H L_1 L_2 L_3 .... L_M
+
+H is called RLW (run length word). It consists of (from lower to higher
+order bits):
+
+ - 1 bit: the repeated bit B
+
+ - 32 bits: repetition count K (unsigned)
+
+ - 31 bits: literal word count M (unsigned)
+
+The bitstream represented by the above chunk is then:
+
+ - K repetitions of B
+
+ - The bits stored in `L_1` through `L_M`. Within a word, bits at
+ lower order come earlier in the stream than those at higher
+ order.
+
+The next word after `L_M` (if any) must again be a RLW, for the next
+chunk. For efficient appending to the bitstream, the EWAH stores a
+pointer to the last RLW in the stream.
+
+
+== Appendix B: Optional Bitmap Sections
+
+These sections may or may not be present in the `.bitmap` file; their
+presence is indicated by the header flags section described above.
+
+Name-hash cache
+---------------
+
+If the BITMAP_OPT_HASH_CACHE flag is set, the end of the bitmap contains
+a cache of 32-bit values, one per object in the pack. The value at
+position `i` is the hash of the pathname at which the `i`th object
+(counting in index order) in the pack can be found. This can be fed
+into the delta heuristics to compare objects with similar pathnames.
+
+The hash algorithm used is:
+
+ hash = 0;
+ while ((c = *name++))
+ if (!isspace(c))
+ hash = (hash >> 2) + (c << 24);
+
+Note that this hashing scheme is tied to the BITMAP_OPT_HASH_CACHE flag.
+If implementations want to choose a different hashing scheme, they are
+free to do so, but MUST allocate a new header flag (because comparing
+hashes made under two different schemes would be pointless).
diff --git a/Documentation/technical/http-protocol.txt b/Documentation/technical/http-protocol.txt
index 544373b16f..58c7e872d7 100644
--- a/Documentation/technical/http-protocol.txt
+++ b/Documentation/technical/http-protocol.txt
@@ -60,7 +60,7 @@ Because Git repositories are accessed by standard path components
server administrators MAY use directory based permissions within
their HTTP server to control repository access.
-Clients SHOULD support Basic authentication as described by RFC 2616.
+Clients SHOULD support Basic authentication as described by RFC 2617.
Servers SHOULD support Basic authentication by relying upon the
HTTP server placed in front of the Git server software.
@@ -500,7 +500,7 @@ TODO: Document this further.
References
----------
-link:http://www.ietf.org/rfc/rfc1738.txt[RFC 1738: Uniform Resource Locators (URL)]
-link:http://www.ietf.org/rfc/rfc2616.txt[RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1]
+http://www.ietf.org/rfc/rfc1738.txt[RFC 1738: Uniform Resource Locators (URL)]
+http://www.ietf.org/rfc/rfc2616.txt[RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1]
link:technical/pack-protocol.html
link:technical/protocol-capabilities.html
diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt
index 022e74e616..46aa6bc1a6 100644
--- a/Documentation/user-manual.txt
+++ b/Documentation/user-manual.txt
@@ -416,12 +416,11 @@ REVISIONS" section of linkgit:gitrevisions[7].
Updating a repository with git fetch
------------------------------------
-Eventually the developer cloned from will do additional work in her
-repository, creating new commits and advancing the branches to point
-at the new commits.
+After you clone a repository and commit a few changes of your own, you
+may wish to check the original repository for updates.
-The command `git fetch`, with no arguments, will update all of the
-remote-tracking branches to the latest version found in her
+The `git-fetch` command, with no arguments, will update all of the
+remote-tracking branches to the latest version found in the original
repository. It will not touch any of your own branches--not even the
"master" branch that was created for you on clone.
@@ -1811,8 +1810,8 @@ manner.
You can then import these into your mail client and send them by
hand. However, if you have a lot to send at once, you may prefer to
use the linkgit:git-send-email[1] script to automate the process.
-Consult the mailing list for your project first to determine how they
-prefer such patches be handled.
+Consult the mailing list for your project first to determine
+their requirements for submitting patches.
[[importing-patches]]
Importing patches to a project
@@ -2255,7 +2254,7 @@ $ git checkout test && git merge speed-up-spinlocks
It is unlikely that you would have any conflicts here ... but you might if you
spent a while on this step and had also pulled new versions from upstream.
-Some time later when enough time has passed and testing done, you can pull the
+Sometime later when enough time has passed and testing done, you can pull the
same branch into the `release` tree ready to go upstream. This is where you
see the value of keeping each patch (or patch series) in its own branch. It
means that the patches can be moved into the `release` tree in any order.
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index b32d9314f7..3e9d508273 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
-DEF_VER=v1.9.5
+DEF_VER=v2.0.4
LF='
'
diff --git a/Makefile b/Makefile
index 33aa15b0e3..e0caec3f67 100644
--- a/Makefile
+++ b/Makefile
@@ -59,9 +59,9 @@ all::
# FreeBSD can use either, but MinGW and some others need to use
# libcharset.h's locale_charset() instead.
#
-# Define CHARSET_LIB to you need to link with library other than -liconv to
+# Define CHARSET_LIB to the library you need to link with in order to
# use locale_charset() function. On some platforms this needs to set to
-# -lcharset
+# -lcharset, on others to -liconv .
#
# Define LIBC_CONTAINS_LIBINTL if your gettext implementation doesn't
# need -lintl when linking.
@@ -101,14 +101,6 @@ all::
#
# Define NO_MKSTEMPS if you don't have mkstemps in the C library.
#
-# Define NO_FNMATCH if you don't have fnmatch in the C library.
-#
-# Define NO_FNMATCH_CASEFOLD if your fnmatch function doesn't have the
-# FNM_CASEFOLD GNU extension.
-#
-# Define NO_WILDMATCH if you do not want to use Git's wildmatch
-# implementation as fnmatch
-#
# Define NO_GECOS_IN_PWENT if you don't have pw_gecos in struct passwd
# in the C library.
#
@@ -191,9 +183,6 @@ all::
# Define NO_STRUCT_ITIMERVAL if you don't have struct itimerval
# This also implies NO_SETITIMER
#
-# Define NO_THREAD_SAFE_PREAD if your pread() implementation is not
-# thread-safe. (e.g. compat/pread.c or cygwin)
-#
# Define NO_FAST_WORKING_DIRECTORY if accessing objects in pack files is
# generally faster on your platform than accessing the working directory.
#
@@ -343,6 +332,10 @@ all::
# (defaults to "man") if you want to have a different default when
# "git help" is called without a parameter specifying the format.
#
+# Define TEST_GIT_INDEX_VERSION to 2, 3 or 4 to run the test suite
+# with a different indexfile format version. If it isn't set the index
+# file format used is index-v[23].
+#
# Define GMTIME_UNRELIABLE_ERRORS if your gmtime() function does not
# return NULL when it receives a bogus time_t.
@@ -558,6 +551,7 @@ TEST_PROGRAMS_NEED_X += test-date
TEST_PROGRAMS_NEED_X += test-delta
TEST_PROGRAMS_NEED_X += test-dump-cache-tree
TEST_PROGRAMS_NEED_X += test-genrandom
+TEST_PROGRAMS_NEED_X += test-hashmap
TEST_PROGRAMS_NEED_X += test-index-version
TEST_PROGRAMS_NEED_X += test-line-buffer
TEST_PROGRAMS_NEED_X += test-match-trees
@@ -666,6 +660,8 @@ LIB_H += diff.h
LIB_H += diffcore.h
LIB_H += dir.h
LIB_H += exec_cmd.h
+LIB_H += ewah/ewok.h
+LIB_H += ewah/ewok_rlw.h
LIB_H += fetch-pack.h
LIB_H += fmt-merge-msg.h
LIB_H += fsck.h
@@ -674,7 +670,7 @@ LIB_H += git-compat-util.h
LIB_H += gpg-interface.h
LIB_H += graph.h
LIB_H += grep.h
-LIB_H += hash.h
+LIB_H += hashmap.h
LIB_H += help.h
LIB_H += http.h
LIB_H += kwset.h
@@ -693,8 +689,10 @@ LIB_H += notes-merge.h
LIB_H += notes-utils.h
LIB_H += notes.h
LIB_H += object.h
+LIB_H += pack-objects.h
LIB_H += pack-revindex.h
LIB_H += pack.h
+LIB_H += pack-bitmap.h
LIB_H += parse-options.h
LIB_H += patch-ids.h
LIB_H += pathspec.h
@@ -798,6 +796,10 @@ LIB_OBJS += dir.o
LIB_OBJS += editor.o
LIB_OBJS += entry.o
LIB_OBJS += environment.o
+LIB_OBJS += ewah/bitmap.o
+LIB_OBJS += ewah/ewah_bitmap.o
+LIB_OBJS += ewah/ewah_io.o
+LIB_OBJS += ewah/ewah_rlw.o
LIB_OBJS += exec_cmd.o
LIB_OBJS += fetch-pack.o
LIB_OBJS += fsck.o
@@ -805,7 +807,7 @@ LIB_OBJS += gettext.o
LIB_OBJS += gpg-interface.o
LIB_OBJS += graph.o
LIB_OBJS += grep.o
-LIB_OBJS += hash.o
+LIB_OBJS += hashmap.o
LIB_OBJS += help.o
LIB_OBJS += hex.o
LIB_OBJS += ident.o
@@ -829,7 +831,10 @@ LIB_OBJS += notes-cache.o
LIB_OBJS += notes-merge.o
LIB_OBJS += notes-utils.o
LIB_OBJS += object.o
+LIB_OBJS += pack-bitmap.o
+LIB_OBJS += pack-bitmap-write.o
LIB_OBJS += pack-check.o
+LIB_OBJS += pack-objects.o
LIB_OBJS += pack-revindex.o
LIB_OBJS += pack-write.o
LIB_OBJS += pager.o
@@ -887,6 +892,7 @@ LIB_OBJS += userdiff.o
LIB_OBJS += utf8.o
LIB_OBJS += varint.o
LIB_OBJS += version.o
+LIB_OBJS += versioncmp.o
LIB_OBJS += walker.o
LIB_OBJS += wildmatch.o
LIB_OBJS += wrapper.o
@@ -1274,20 +1280,6 @@ endif
ifdef NO_STRTOULL
COMPAT_CFLAGS += -DNO_STRTOULL
endif
-ifdef NO_FNMATCH
- COMPAT_CFLAGS += -Icompat/fnmatch
- COMPAT_CFLAGS += -DNO_FNMATCH
- COMPAT_OBJS += compat/fnmatch/fnmatch.o
-else
-ifdef NO_FNMATCH_CASEFOLD
- COMPAT_CFLAGS += -Icompat/fnmatch
- COMPAT_CFLAGS += -DNO_FNMATCH_CASEFOLD
- COMPAT_OBJS += compat/fnmatch/fnmatch.o
-endif
-endif
-ifndef NO_WILDMATCH
- COMPAT_CFLAGS += -DUSE_WILDMATCH
-endif
ifdef NO_SETENV
COMPAT_CFLAGS += -DNO_SETENV
COMPAT_OBJS += compat/setenv.o
@@ -1344,10 +1336,6 @@ endif
ifdef NO_PREAD
COMPAT_CFLAGS += -DNO_PREAD
COMPAT_OBJS += compat/pread.o
- NO_THREAD_SAFE_PREAD = YesPlease
-endif
-ifdef NO_THREAD_SAFE_PREAD
- BASIC_CFLAGS += -DNO_THREAD_SAFE_PREAD
endif
ifdef NO_FAST_WORKING_DIRECTORY
BASIC_CFLAGS += -DNO_FAST_WORKING_DIRECTORY
@@ -2107,7 +2095,7 @@ pdf:
XGETTEXT_FLAGS = \
--force-po \
- --add-comments \
+ --add-comments=TRANSLATORS: \
--msgid-bugs-address="Git Mailing List <git@vger.kernel.org>" \
--from-code=UTF-8
XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \
@@ -2230,6 +2218,9 @@ endif
ifdef GIT_PERF_MAKE_OPTS
@echo GIT_PERF_MAKE_OPTS=\''$(subst ','\'',$(subst ','\'',$(GIT_PERF_MAKE_OPTS)))'\' >>$@
endif
+ifdef TEST_GIT_INDEX_VERSION
+ @echo TEST_GIT_INDEX_VERSION=\''$(subst ','\'',$(subst ','\'',$(TEST_GIT_INDEX_VERSION)))'\' >>$@
+endif
### Detect Python interpreter path changes
ifndef NO_PYTHON
@@ -2487,8 +2478,9 @@ profile-clean:
$(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
clean: profile-clean coverage-clean
- $(RM) *.o *.res block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o xdiff/*.o vcs-svn/*.o \
- builtin/*.o $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
+ $(RM) *.o *.res block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o
+ $(RM) xdiff/*.o vcs-svn/*.o ewah/*.o builtin/*.o
+ $(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
$(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
$(RM) $(TEST_PROGRAMS) $(NO_INSTALL)
$(RM) -r bin-wrappers $(dep_dirs)
diff --git a/RelNotes b/RelNotes
index 1b089b9c19..76462ab9e8 120000
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/1.9.5.txt \ No newline at end of file
+Documentation/RelNotes/2.0.4.txt \ No newline at end of file
diff --git a/advice.c b/advice.c
index 3eca9f5ffd..486f823c78 100644
--- a/advice.c
+++ b/advice.c
@@ -2,7 +2,6 @@
int advice_push_update_rejected = 1;
int advice_push_non_ff_current = 1;
-int advice_push_non_ff_default = 1;
int advice_push_non_ff_matching = 1;
int advice_push_already_exists = 1;
int advice_push_fetch_first = 1;
@@ -23,7 +22,6 @@ static struct {
} advice_config[] = {
{ "pushupdaterejected", &advice_push_update_rejected },
{ "pushnonffcurrent", &advice_push_non_ff_current },
- { "pushnonffdefault", &advice_push_non_ff_default },
{ "pushnonffmatching", &advice_push_non_ff_matching },
{ "pushalreadyexists", &advice_push_already_exists },
{ "pushfetchfirst", &advice_push_fetch_first },
diff --git a/advice.h b/advice.h
index 08fbc8ee3c..5ecc6c154e 100644
--- a/advice.h
+++ b/advice.h
@@ -5,7 +5,6 @@
extern int advice_push_update_rejected;
extern int advice_push_non_ff_current;
-extern int advice_push_non_ff_default;
extern int advice_push_non_ff_matching;
extern int advice_push_already_exists;
extern int advice_push_fetch_first;
diff --git a/alloc.c b/alloc.c
index f3ee745695..12afadfacd 100644
--- a/alloc.c
+++ b/alloc.c
@@ -18,25 +18,6 @@
#define BLOCKING 1024
-#define DEFINE_ALLOCATOR(name, type) \
-static unsigned int name##_allocs; \
-void *alloc_##name##_node(void) \
-{ \
- static int nr; \
- static type *block; \
- void *ret; \
- \
- if (!nr) { \
- nr = BLOCKING; \
- block = xmalloc(BLOCKING * sizeof(type)); \
- } \
- nr--; \
- name##_allocs++; \
- ret = block++; \
- memset(ret, 0, sizeof(type)); \
- return ret; \
-}
-
union any_object {
struct object object;
struct blob blob;
@@ -45,11 +26,75 @@ union any_object {
struct tag tag;
};
-DEFINE_ALLOCATOR(blob, struct blob)
-DEFINE_ALLOCATOR(tree, struct tree)
-DEFINE_ALLOCATOR(commit, struct commit)
-DEFINE_ALLOCATOR(tag, struct tag)
-DEFINE_ALLOCATOR(object, union any_object)
+struct alloc_state {
+ int count; /* total number of nodes allocated */
+ int nr; /* number of nodes left in current allocation */
+ void *p; /* first free node in current allocation */
+};
+
+static inline void *alloc_node(struct alloc_state *s, size_t node_size)
+{
+ void *ret;
+
+ if (!s->nr) {
+ s->nr = BLOCKING;
+ s->p = xmalloc(BLOCKING * node_size);
+ }
+ s->nr--;
+ s->count++;
+ ret = s->p;
+ s->p = (char *)s->p + node_size;
+ memset(ret, 0, node_size);
+ return ret;
+}
+
+static struct alloc_state blob_state;
+void *alloc_blob_node(void)
+{
+ struct blob *b = alloc_node(&blob_state, sizeof(struct blob));
+ b->object.type = OBJ_BLOB;
+ return b;
+}
+
+static struct alloc_state tree_state;
+void *alloc_tree_node(void)
+{
+ struct tree *t = alloc_node(&tree_state, sizeof(struct tree));
+ t->object.type = OBJ_TREE;
+ return t;
+}
+
+static struct alloc_state tag_state;
+void *alloc_tag_node(void)
+{
+ struct tag *t = alloc_node(&tag_state, sizeof(struct tag));
+ t->object.type = OBJ_TAG;
+ return t;
+}
+
+static struct alloc_state object_state;
+void *alloc_object_node(void)
+{
+ struct object *obj = alloc_node(&object_state, sizeof(union any_object));
+ obj->type = OBJ_NONE;
+ return obj;
+}
+
+static struct alloc_state commit_state;
+
+unsigned int alloc_commit_index(void)
+{
+ static unsigned int count;
+ return count++;
+}
+
+void *alloc_commit_node(void)
+{
+ struct commit *c = alloc_node(&commit_state, sizeof(struct commit));
+ c->object.type = OBJ_COMMIT;
+ c->index = alloc_commit_index();
+ return c;
+}
static void report(const char *name, unsigned int count, size_t size)
{
@@ -57,13 +102,14 @@ static void report(const char *name, unsigned int count, size_t size)
name, count, (uintmax_t) size);
}
-#define REPORT(name) \
- report(#name, name##_allocs, name##_allocs * sizeof(struct name) >> 10)
+#define REPORT(name, type) \
+ report(#name, name##_state.count, name##_state.count * sizeof(type) >> 10)
void alloc_report(void)
{
- REPORT(blob);
- REPORT(tree);
- REPORT(commit);
- REPORT(tag);
+ REPORT(blob, struct blob);
+ REPORT(tree, struct tree);
+ REPORT(commit, struct commit);
+ REPORT(tag, struct tag);
+ REPORT(object, union any_object);
}
diff --git a/archive.c b/archive.c
index 346f3b2f1a..3fc0fb2928 100644
--- a/archive.c
+++ b/archive.c
@@ -17,6 +17,7 @@ static char const * const archive_usage[] = {
static const struct archiver **archivers;
static int nr_archivers;
static int alloc_archivers;
+static int remote_allow_unreachable;
void register_archiver(struct archiver *ar)
{
@@ -257,10 +258,10 @@ static void parse_treeish_arg(const char **argv,
unsigned char sha1[20];
/* Remotes are only allowed to fetch actual refs */
- if (remote) {
+ if (remote && !remote_allow_unreachable) {
char *ref = NULL;
- const char *colon = strchr(name, ':');
- int refnamelen = colon ? colon - name : strlen(name);
+ const char *colon = strchrnul(name, ':');
+ int refnamelen = colon - name;
if (!dwim_ref(name, refnamelen, sha1, &ref))
die("no such ref: %.*s", refnamelen, name);
@@ -401,6 +402,14 @@ static int parse_archive_args(int argc, const char **argv,
return argc;
}
+static int git_default_archive_config(const char *var, const char *value,
+ void *cb)
+{
+ if (!strcmp(var, "uploadarchive.allowunreachable"))
+ remote_allow_unreachable = git_config_bool(var, value);
+ return git_default_config(var, value, cb);
+}
+
int write_archive(int argc, const char **argv, const char *prefix,
int setup_prefix, const char *name_hint, int remote)
{
@@ -411,7 +420,7 @@ int write_archive(int argc, const char **argv, const char *prefix,
if (setup_prefix && prefix == NULL)
prefix = setup_git_directory_gently(&nongit);
- git_config(git_default_config, NULL);
+ git_config(git_default_archive_config, NULL);
init_tar_archiver();
init_zip_archiver();
diff --git a/attr.c b/attr.c
index 8d13d70e80..734222dc45 100644
--- a/attr.c
+++ b/attr.c
@@ -338,12 +338,7 @@ static void handle_attr_line(struct attr_stack *res,
a = parse_attr_line(line, src, lineno, macro_ok);
if (!a)
return;
- if (res->alloc <= res->num_matches) {
- res->alloc = alloc_nr(res->num_matches);
- res->attrs = xrealloc(res->attrs,
- sizeof(struct match_attr *) *
- res->alloc);
- }
+ ALLOC_GROW(res->attrs, res->num_matches + 1, res->alloc);
res->attrs[res->num_matches++] = a;
}
diff --git a/bisect.c b/bisect.c
index 37200b41f1..d6e851d783 100644
--- a/bisect.c
+++ b/bisect.c
@@ -21,8 +21,7 @@ static const char *argv_checkout[] = {"checkout", "-q", NULL, "--", NULL};
static const char *argv_show_branch[] = {"show-branch", NULL, NULL};
static const char *argv_update_ref[] = {"update-ref", "--no-deref", "BISECT_HEAD", NULL, NULL};
-/* bits #0-15 in revision.h */
-
+/* Remember to update object flag allocation in object.h */
#define COUNTED (1u<<16)
/*
@@ -685,7 +684,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 +694,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/blob.c b/blob.c
index ae320bd8fa..1fcb8e44b0 100644
--- a/blob.c
+++ b/blob.c
@@ -7,15 +7,8 @@ struct blob *lookup_blob(const unsigned char *sha1)
{
struct object *obj = lookup_object(sha1);
if (!obj)
- return create_object(sha1, OBJ_BLOB, alloc_blob_node());
- if (!obj->type)
- obj->type = OBJ_BLOB;
- if (obj->type != OBJ_BLOB) {
- error("Object %s is a %s, not a blob",
- sha1_to_hex(sha1), typename(obj->type));
- return NULL;
- }
- return (struct blob *) obj;
+ return create_object(sha1, alloc_blob_node());
+ return object_as_type(obj, OBJ_BLOB, 0);
}
int parse_blob_buffer(struct blob *item, void *buffer, unsigned long size)
diff --git a/block-sha1/sha1.c b/block-sha1/sha1.c
index e1a1eb6097..22b125cf8c 100644
--- a/block-sha1/sha1.c
+++ b/block-sha1/sha1.c
@@ -62,38 +62,6 @@
#define setW(x, val) (W(x) = (val))
#endif
-/*
- * Performance might be improved if the CPU architecture is OK with
- * unaligned 32-bit loads and a fast ntohl() is available.
- * Otherwise fall back to byte loads and shifts which is portable,
- * and is faster on architectures with memory alignment issues.
- */
-
-#if defined(__i386__) || defined(__x86_64__) || \
- defined(_M_IX86) || defined(_M_X64) || \
- defined(__ppc__) || defined(__ppc64__) || \
- defined(__powerpc__) || defined(__powerpc64__) || \
- defined(__s390__) || defined(__s390x__)
-
-#define get_be32(p) ntohl(*(unsigned int *)(p))
-#define put_be32(p, v) do { *(unsigned int *)(p) = htonl(v); } while (0)
-
-#else
-
-#define get_be32(p) ( \
- (*((unsigned char *)(p) + 0) << 24) | \
- (*((unsigned char *)(p) + 1) << 16) | \
- (*((unsigned char *)(p) + 2) << 8) | \
- (*((unsigned char *)(p) + 3) << 0) )
-#define put_be32(p, v) do { \
- unsigned int __v = (v); \
- *((unsigned char *)(p) + 0) = __v >> 24; \
- *((unsigned char *)(p) + 1) = __v >> 16; \
- *((unsigned char *)(p) + 2) = __v >> 8; \
- *((unsigned char *)(p) + 3) = __v >> 0; } while (0)
-
-#endif
-
/* This "rolls" over the 512-bit array */
#define W(x) (array[(x)&15])
diff --git a/branch.c b/branch.c
index 723a36bc54..660097bc29 100644
--- a/branch.c
+++ b/branch.c
@@ -1,3 +1,4 @@
+#include "git-compat-util.h"
#include "cache.h"
#include "branch.h"
#include "refs.h"
@@ -49,12 +50,11 @@ static int should_setup_rebase(const char *origin)
void install_branch_config(int flag, const char *local, const char *origin, const char *remote)
{
- const char *shortname = remote + 11;
- int remote_is_branch = starts_with(remote, "refs/heads/");
+ const char *shortname = skip_prefix(remote, "refs/heads/");
struct strbuf key = STRBUF_INIT;
int rebasing = should_setup_rebase(origin);
- if (remote_is_branch
+ if (shortname
&& !strcmp(local, shortname)
&& !origin) {
warning(_("Not setting branch %s as its own upstream."),
@@ -77,29 +77,29 @@ void install_branch_config(int flag, const char *local, const char *origin, cons
strbuf_release(&key);
if (flag & BRANCH_CONFIG_VERBOSE) {
- if (remote_is_branch && origin)
- printf_ln(rebasing ?
- _("Branch %s set up to track remote branch %s from %s by rebasing.") :
- _("Branch %s set up to track remote branch %s from %s."),
- local, shortname, origin);
- else if (remote_is_branch && !origin)
- printf_ln(rebasing ?
- _("Branch %s set up to track local branch %s by rebasing.") :
- _("Branch %s set up to track local branch %s."),
- local, shortname);
- else if (!remote_is_branch && origin)
- printf_ln(rebasing ?
- _("Branch %s set up to track remote ref %s by rebasing.") :
- _("Branch %s set up to track remote ref %s."),
- local, remote);
- else if (!remote_is_branch && !origin)
- printf_ln(rebasing ?
- _("Branch %s set up to track local ref %s by rebasing.") :
- _("Branch %s set up to track local ref %s."),
- local, remote);
- else
- die("BUG: impossible combination of %d and %p",
- remote_is_branch, origin);
+ if (shortname) {
+ if (origin)
+ printf_ln(rebasing ?
+ _("Branch %s set up to track remote branch %s from %s by rebasing.") :
+ _("Branch %s set up to track remote branch %s from %s."),
+ local, shortname, origin);
+ else
+ printf_ln(rebasing ?
+ _("Branch %s set up to track local branch %s by rebasing.") :
+ _("Branch %s set up to track local branch %s."),
+ local, shortname);
+ } else {
+ if (origin)
+ printf_ln(rebasing ?
+ _("Branch %s set up to track remote ref %s by rebasing.") :
+ _("Branch %s set up to track remote ref %s."),
+ local, remote);
+ else
+ printf_ln(rebasing ?
+ _("Branch %s set up to track local ref %s by rebasing.") :
+ _("Branch %s set up to track local ref %s."),
+ local, remote);
+ }
}
}
@@ -114,10 +114,6 @@ static int setup_tracking(const char *new_ref, const char *orig_ref,
struct tracking tracking;
int config_flags = quiet ? 0 : BRANCH_CONFIG_VERBOSE;
- if (strlen(new_ref) > 1024 - 7 - 7 - 1)
- return error(_("Tracking not set up: name too long: %s"),
- new_ref);
-
memset(&tracking, 0, sizeof(tracking));
tracking.spec.dst = (char *)orig_ref;
if (for_each_remote(find_tracked_branch, &tracking))
diff --git a/builtin/add.c b/builtin/add.c
index 672adc01ff..459208a326 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -15,6 +15,7 @@
#include "diffcore.h"
#include "revision.h"
#include "bulk-checkin.h"
+#include "argv-array.h"
static const char * const builtin_add_usage[] = {
N_("git add [options] [--] <pathspec>..."),
@@ -26,55 +27,8 @@ static int take_worktree_changes;
struct update_callback_data {
int flags;
int add_errors;
- const char *implicit_dot;
- size_t implicit_dot_len;
-
- /* only needed for 2.0 transition preparation */
- int warn_add_would_remove;
};
-static const char *option_with_implicit_dot;
-static const char *short_option_with_implicit_dot;
-
-static void warn_pathless_add(void)
-{
- static int shown;
- assert(option_with_implicit_dot && short_option_with_implicit_dot);
-
- if (shown)
- return;
- shown = 1;
-
- /*
- * To be consistent with "git add -p" and most Git
- * commands, we should default to being tree-wide, but
- * this is not the original behavior and can't be
- * changed until users trained themselves not to type
- * "git add -u" or "git add -A". For now, we warn and
- * keep the old behavior. Later, the behavior can be changed
- * to tree-wide, keeping the warning for a while, and
- * eventually we can drop the warning.
- */
- warning(_("The behavior of 'git add %s (or %s)' with no path argument from a\n"
- "subdirectory of the tree will change in Git 2.0 and should not be used anymore.\n"
- "To add content for the whole tree, run:\n"
- "\n"
- " git add %s :/\n"
- " (or git add %s :/)\n"
- "\n"
- "To restrict the command to the current directory, run:\n"
- "\n"
- " git add %s .\n"
- " (or git add %s .)\n"
- "\n"
- "With the current Git version, the command is restricted to "
- "the current directory.\n"
- ""),
- option_with_implicit_dot, short_option_with_implicit_dot,
- option_with_implicit_dot, short_option_with_implicit_dot,
- option_with_implicit_dot, short_option_with_implicit_dot);
-}
-
static int fix_unmerged_status(struct diff_filepair *p,
struct update_callback_data *data)
{
@@ -96,49 +50,15 @@ static int fix_unmerged_status(struct diff_filepair *p,
return DIFF_STATUS_MODIFIED;
}
-static const char *add_would_remove_warning = N_(
- "You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
-"whose behaviour will change in Git 2.0 with respect to paths you removed.\n"
-"Paths like '%s' that are\n"
-"removed from your working tree are ignored with this version of Git.\n"
-"\n"
-"* 'git add --ignore-removal <pathspec>', which is the current default,\n"
-" ignores paths you removed from your working tree.\n"
-"\n"
-"* 'git add --all <pathspec>' will let you also record the removals.\n"
-"\n"
-"Run 'git status' to check the paths you removed from your working tree.\n");
-
-static void warn_add_would_remove(const char *path)
-{
- warning(_(add_would_remove_warning), path);
-}
-
static void update_callback(struct diff_queue_struct *q,
struct diff_options *opt, void *cbdata)
{
int i;
struct update_callback_data *data = cbdata;
- const char *implicit_dot = data->implicit_dot;
- size_t implicit_dot_len = data->implicit_dot_len;
for (i = 0; i < q->nr; i++) {
struct diff_filepair *p = q->queue[i];
const char *path = p->one->path;
- /*
- * Check if "git add -A" or "git add -u" was run from a
- * subdirectory with a modified file outside that directory,
- * and warn if so.
- *
- * "git add -u" will behave like "git add -u :/" instead of
- * "git add -u ." in the future. This warning prepares for
- * that change.
- */
- if (implicit_dot &&
- strncmp_icase(path, implicit_dot, implicit_dot_len)) {
- warn_pathless_add();
- continue;
- }
switch (fix_unmerged_status(p, data)) {
default:
die(_("unexpected diff status %c"), p->status);
@@ -151,10 +71,6 @@ static void update_callback(struct diff_queue_struct *q,
}
break;
case DIFF_STATUS_DELETED:
- if (data->warn_add_would_remove) {
- warn_add_would_remove(path);
- data->warn_add_would_remove = 0;
- }
if (data->flags & ADD_CACHE_IGNORE_REMOVAL)
break;
if (!(data->flags & ADD_CACHE_PRETEND))
@@ -166,37 +82,28 @@ static void update_callback(struct diff_queue_struct *q,
}
}
-static void update_files_in_cache(const char *prefix,
- const struct pathspec *pathspec,
- struct update_callback_data *data)
+int add_files_to_cache(const char *prefix,
+ const struct pathspec *pathspec, int flags)
{
+ struct update_callback_data data;
struct rev_info rev;
+ memset(&data, 0, sizeof(data));
+ data.flags = flags;
+
init_revisions(&rev, prefix);
setup_revisions(0, NULL, &rev, NULL);
if (pathspec)
copy_pathspec(&rev.prune_data, pathspec);
rev.diffopt.output_format = DIFF_FORMAT_CALLBACK;
rev.diffopt.format_callback = update_callback;
- rev.diffopt.format_callback_data = data;
+ rev.diffopt.format_callback_data = &data;
rev.max_count = 0; /* do not compare unmerged paths with stage #2 */
run_diff_files(&rev, DIFF_RACY_IS_MODIFIED);
-}
-
-int add_files_to_cache(const char *prefix,
- const struct pathspec *pathspec, int flags)
-{
- struct update_callback_data data;
-
- memset(&data, 0, sizeof(data));
- data.flags = flags;
- update_files_in_cache(prefix, pathspec, &data);
return !!data.add_errors;
}
-#define WARN_IMPLICIT_DOT (1u << 0)
-static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec,
- int prefix, unsigned flag)
+static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec, int prefix)
{
char *seen;
int i;
@@ -210,16 +117,6 @@ static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec,
struct dir_entry *entry = *src++;
if (dir_path_match(entry, pathspec, prefix, seen))
*dst++ = entry;
- else if (flag & WARN_IMPLICIT_DOT)
- /*
- * "git add -A" was run from a subdirectory with a
- * new file outside that directory.
- *
- * "git add -A" will behave like "git add -A :/"
- * instead of "git add -A ." in the future.
- * Warn about the coming behavior change.
- */
- warn_pathless_add();
}
dir->nr = dst - dir->entries;
add_pathspec_matches_against_index(pathspec, seen);
@@ -245,23 +142,21 @@ static void refresh(int verbose, const struct pathspec *pathspec)
int run_add_interactive(const char *revision, const char *patch_mode,
const struct pathspec *pathspec)
{
- int status, ac, i;
- const char **args;
+ int status, i;
+ struct argv_array argv = ARGV_ARRAY_INIT;
- args = xcalloc(sizeof(const char *), (pathspec->nr + 6));
- ac = 0;
- args[ac++] = "add--interactive";
+ argv_array_push(&argv, "add--interactive");
if (patch_mode)
- args[ac++] = patch_mode;
+ argv_array_push(&argv, patch_mode);
if (revision)
- args[ac++] = revision;
- args[ac++] = "--";
+ argv_array_push(&argv, revision);
+ argv_array_push(&argv, "--");
for (i = 0; i < pathspec->nr; i++)
/* pass original pathspec, to be re-parsed */
- args[ac++] = pathspec->items[i].original;
+ argv_array_push(&argv, pathspec->items[i].original);
- status = run_command_v_opt(args, RUN_GIT_CMD);
- free(args);
+ status = run_command_v_opt(argv.argv, RUN_GIT_CMD);
+ argv_array_clear(&argv);
return status;
}
@@ -338,7 +233,7 @@ N_("The following paths are ignored by one of your .gitignore files:\n");
static int verbose, show_only, ignored_too, refresh_only;
static int ignore_add_errors, intent_to_add, ignore_missing;
-#define ADDREMOVE_DEFAULT 0 /* Change to 1 in Git 2.0 */
+#define ADDREMOVE_DEFAULT 1
static int addremove = ADDREMOVE_DEFAULT;
static int addremove_explicit = -1; /* unspecified */
@@ -411,8 +306,6 @@ int cmd_add(int argc, const char **argv, const char *prefix)
int add_new_files;
int require_pathspec;
char *seen = NULL;
- int implicit_dot = 0;
- struct update_callback_data update_data;
git_config(add_config, NULL);
@@ -436,36 +329,17 @@ int cmd_add(int argc, const char **argv, const char *prefix)
if (addremove && take_worktree_changes)
die(_("-A and -u are mutually incompatible"));
- /*
- * Warn when "git add pathspec..." was given without "-u" or "-A"
- * and pathspec... covers a removed path.
- */
- memset(&update_data, 0, sizeof(update_data));
- if (!take_worktree_changes && addremove_explicit < 0)
- update_data.warn_add_would_remove = 1;
-
if (!take_worktree_changes && addremove_explicit < 0 && argc)
- /*
- * Turn "git add pathspec..." to "git add -A pathspec..."
- * in Git 2.0 but not yet
- */
- ; /* addremove = 1; */
+ /* Turn "git add pathspec..." to "git add -A pathspec..." */
+ addremove = 1;
if (!show_only && ignore_missing)
die(_("Option --ignore-missing can only be used together with --dry-run"));
- if (addremove) {
- option_with_implicit_dot = "--all";
- short_option_with_implicit_dot = "-A";
- }
- if (take_worktree_changes) {
- option_with_implicit_dot = "--update";
- short_option_with_implicit_dot = "-u";
- }
- if (option_with_implicit_dot && !argc) {
- static const char *here[2] = { ".", NULL };
+
+ if ((0 < addremove_explicit || take_worktree_changes) && !argc) {
+ static const char *whole[2] = { ":/", NULL };
argc = 1;
- argv = here;
- implicit_dot = 1;
+ argv = whole;
}
add_new_files = !take_worktree_changes && !refresh_only;
@@ -478,8 +352,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
(intent_to_add ? ADD_CACHE_INTENT : 0) |
(ignore_add_errors ? ADD_CACHE_IGNORE_ERRORS : 0) |
(!(addremove || take_worktree_changes)
- ? ADD_CACHE_IGNORE_REMOVAL : 0)) |
- (implicit_dot ? ADD_CACHE_IMPLICIT_DOT : 0);
+ ? ADD_CACHE_IGNORE_REMOVAL : 0));
if (require_pathspec && argc == 0) {
fprintf(stderr, _("Nothing specified, nothing added.\n"));
@@ -513,18 +386,15 @@ int cmd_add(int argc, const char **argv, const char *prefix)
memset(&empty_pathspec, 0, sizeof(empty_pathspec));
/* This picks up the paths that are not tracked */
- baselen = fill_directory(&dir, implicit_dot ? &empty_pathspec : &pathspec);
+ baselen = fill_directory(&dir, &pathspec);
if (pathspec.nr)
- seen = prune_directory(&dir, &pathspec, baselen,
- implicit_dot ? WARN_IMPLICIT_DOT : 0);
+ seen = prune_directory(&dir, &pathspec, baselen);
}
if (refresh_only) {
refresh(verbose, &pathspec);
goto finish;
}
- if (implicit_dot && prefix)
- refresh_cache(REFRESH_QUIET);
if (pathspec.nr) {
int i;
@@ -564,21 +434,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
plug_bulk_checkin();
- if ((flags & ADD_CACHE_IMPLICIT_DOT) && prefix) {
- /*
- * Check for modified files throughout the worktree so
- * update_callback has a chance to warn about changes
- * outside the cwd.
- */
- update_data.implicit_dot = prefix;
- update_data.implicit_dot_len = strlen(prefix);
- free_pathspec(&pathspec);
- memset(&pathspec, 0, sizeof(pathspec));
- }
- update_data.flags = flags & ~ADD_CACHE_IMPLICIT_DOT;
- update_files_in_cache(prefix, &pathspec, &update_data);
+ exit_status |= add_files_to_cache(prefix, &pathspec, flags);
- exit_status |= !!update_data.add_errors;
if (add_new_files)
exit_status |= add_files(&dir, flags);
diff --git a/builtin/apply.c b/builtin/apply.c
index 6013e1913c..622ee1674a 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -300,11 +300,13 @@ static int fuzzy_matchlines(const char *s1, size_t n1,
while ((*last2 == '\r') || (*last2 == '\n'))
last2--;
- /* skip leading whitespace */
- while (isspace(*s1) && (s1 <= last1))
- s1++;
- while (isspace(*s2) && (s2 <= last2))
- s2++;
+ /* skip leading whitespaces, if both begin with whitespace */
+ if (s1 <= last1 && s2 <= last2 && isspace(*s1) && isspace(*s2)) {
+ while (isspace(*s1) && (s1 <= last1))
+ s1++;
+ while (isspace(*s2) && (s2 <= last2))
+ s2++;
+ }
/* early return if both lines are empty */
if ((s1 > last1) && (s2 > last2))
return 1;
@@ -1943,13 +1945,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 +1961,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 &&
@@ -2867,9 +2869,7 @@ static int apply_binary_fragment(struct image *img, struct patch *patch)
case BINARY_LITERAL_DEFLATED:
clear_image(img);
img->len = fragment->size;
- img->buf = xmalloc(img->len+1);
- memcpy(img->buf, fragment->patch, img->len);
- img->buf[img->len] = '\0';
+ img->buf = xmemdupz(fragment->patch, img->len);
return 0;
}
return -1;
@@ -4152,7 +4152,7 @@ static int use_patch(struct patch *p)
/* See if it matches any of exclude/include rule */
for (i = 0; i < limit_by_name.nr; i++) {
struct string_list_item *it = &limit_by_name.items[i];
- if (!fnmatch(it->string, pathname, 0))
+ if (!wildmatch(it->string, pathname, 0, NULL))
return (it->util != NULL);
}
diff --git a/builtin/blame.c b/builtin/blame.c
index e44a6bb30a..eefd6bc2e1 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -74,7 +74,7 @@ static unsigned blame_copy_score;
#define BLAME_DEFAULT_MOVE_SCORE 20
#define BLAME_DEFAULT_COPY_SCORE 40
-/* bits #0..7 in revision.h, #8..11 used for merge_bases() in commit.c */
+/* Remember to update object flag allocation in object.h */
#define METAINFO_SHOWN (1u<<12)
#define MORE_THAN_ONE_PATH (1u<<13)
@@ -197,7 +197,6 @@ static void drop_origin_blob(struct origin *o)
* scoreboard structure, sorted by the target line number.
*/
struct blame_entry {
- struct blame_entry *prev;
struct blame_entry *next;
/* the first line of this group in the final image;
@@ -256,15 +255,6 @@ struct scoreboard {
int *lineno;
};
-static inline int same_suspect(struct origin *a, struct origin *b)
-{
- if (a == b)
- return 1;
- if (a->commit != b->commit)
- return 0;
- return !strcmp(a->path, b->path);
-}
-
static void sanity_check_refcnt(struct scoreboard *);
/*
@@ -277,13 +267,11 @@ static void coalesce(struct scoreboard *sb)
struct blame_entry *ent, *next;
for (ent = sb->ent; ent && (next = ent->next); ent = next) {
- if (same_suspect(ent->suspect, next->suspect) &&
+ if (ent->suspect == next->suspect &&
ent->guilty == next->guilty &&
ent->s_lno + ent->num_lines == next->s_lno) {
ent->num_lines += next->num_lines;
ent->next = next->next;
- if (ent->next)
- ent->next->prev = ent;
origin_decref(next->suspect);
free(next);
ent->score = 0;
@@ -534,7 +522,7 @@ static void add_blame_entry(struct scoreboard *sb, struct blame_entry *e)
prev = ent;
/* prev, if not NULL, is the last one that is below e */
- e->prev = prev;
+
if (prev) {
e->next = prev->next;
prev->next = e;
@@ -543,8 +531,6 @@ static void add_blame_entry(struct scoreboard *sb, struct blame_entry *e)
e->next = sb->ent;
sb->ent = e;
}
- if (e->next)
- e->next->prev = e;
}
/*
@@ -555,14 +541,12 @@ static void add_blame_entry(struct scoreboard *sb, struct blame_entry *e)
*/
static void dup_entry(struct blame_entry *dst, struct blame_entry *src)
{
- struct blame_entry *p, *n;
+ struct blame_entry *n;
- p = dst->prev;
n = dst->next;
origin_incref(src->suspect);
origin_decref(dst->suspect);
memcpy(dst, src, sizeof(*src));
- dst->prev = p;
dst->next = n;
dst->score = 0;
}
@@ -742,7 +726,7 @@ static int find_last_in_target(struct scoreboard *sb, struct origin *target)
int last_in_target = -1;
for (e = sb->ent; e; e = e->next) {
- if (e->guilty || !same_suspect(e->suspect, target))
+ if (e->guilty || e->suspect != target)
continue;
if (last_in_target < e->s_lno + e->num_lines)
last_in_target = e->s_lno + e->num_lines;
@@ -762,7 +746,7 @@ static void blame_chunk(struct scoreboard *sb,
struct blame_entry *e;
for (e = sb->ent; e; e = e->next) {
- if (e->guilty || !same_suspect(e->suspect, target))
+ if (e->guilty || e->suspect != target)
continue;
if (same <= e->s_lno)
continue;
@@ -939,7 +923,6 @@ static void find_copy_in_blob(struct scoreboard *sb,
mmfile_t *file_p)
{
const char *cp;
- int cnt;
mmfile_t file_o;
struct handle_split_cb_data d;
@@ -950,13 +933,7 @@ static void find_copy_in_blob(struct scoreboard *sb,
*/
cp = nth_line(sb, ent->lno);
file_o.ptr = (char *) cp;
- cnt = ent->num_lines;
-
- while (cnt && cp < sb->final_buf + sb->final_buf_size) {
- if (*cp++ == '\n')
- cnt--;
- }
- file_o.size = cp - file_o.ptr;
+ file_o.size = nth_line(sb, ent->lno + ent->num_lines) - cp;
/*
* file_o is a part of final image we are annotating.
@@ -992,7 +969,7 @@ static int find_move_in_parent(struct scoreboard *sb,
while (made_progress) {
made_progress = 0;
for (e = sb->ent; e; e = e->next) {
- if (e->guilty || !same_suspect(e->suspect, target) ||
+ if (e->guilty || e->suspect != target ||
ent_score(sb, e) < blame_move_score)
continue;
find_copy_in_blob(sb, e, parent, split, &file_p);
@@ -1027,14 +1004,14 @@ static struct blame_list *setup_blame_list(struct scoreboard *sb,
for (e = sb->ent, num_ents = 0; e; e = e->next)
if (!e->scanned && !e->guilty &&
- same_suspect(e->suspect, target) &&
+ e->suspect == target &&
min_score < ent_score(sb, e))
num_ents++;
if (num_ents) {
blame_list = xcalloc(num_ents, sizeof(struct blame_list));
for (e = sb->ent, i = 0; e; e = e->next)
if (!e->scanned && !e->guilty &&
- same_suspect(e->suspect, target) &&
+ e->suspect == target &&
min_score < ent_score(sb, e))
blame_list[i++].ent = e;
}
@@ -1178,7 +1155,7 @@ static void pass_whole_blame(struct scoreboard *sb,
origin->file.ptr = NULL;
}
for (e = sb->ent; e; e = e->next) {
- if (!same_suspect(e->suspect, origin))
+ if (e->suspect != origin)
continue;
origin_incref(porigin);
origin_decref(e->suspect);
@@ -1428,7 +1405,7 @@ static void get_commit_info(struct commit *commit,
{
int len;
const char *subject, *encoding;
- char *message;
+ const char *message;
commit_info_init(ret);
@@ -1439,7 +1416,7 @@ static void get_commit_info(struct commit *commit,
&ret->author_time, &ret->author_tz);
if (!detailed) {
- logmsg_free(message, commit);
+ unuse_commit_buffer(commit, message);
return;
}
@@ -1453,7 +1430,7 @@ static void get_commit_info(struct commit *commit,
else
strbuf_addf(&ret->summary, "(%s)", sha1_to_hex(commit->object.sha1));
- logmsg_free(message, commit);
+ unuse_commit_buffer(commit, message);
}
/*
@@ -1567,7 +1544,7 @@ static void assign_blame(struct scoreboard *sb, int opt)
/* Take responsibility for the remaining entries */
for (ent = sb->ent; ent; ent = ent->next)
- if (same_suspect(ent->suspect, suspect))
+ if (ent->suspect == suspect)
found_guilty_entry(ent);
origin_decref(suspect);
@@ -1579,22 +1556,29 @@ static void assign_blame(struct scoreboard *sb, int opt)
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;
+ static struct strbuf time_buf = STRBUF_INIT;
+ strbuf_reset(&time_buf);
if (show_raw_time) {
- snprintf(time_buf, sizeof(time_buf), "%lu %s", time, tz_str);
+ strbuf_addf(&time_buf, "%lu %s", time, tz_str);
}
else {
+ const char *time_str;
+ size_t time_width;
+ int tz;
tz = atoi(tz_str);
time_str = show_date(time, tz, blame_date_mode);
- time_len = strlen(time_str);
- memcpy(time_buf, time_str, time_len);
- memset(time_buf + time_len, ' ', blame_date_width - time_len);
+ strbuf_addstr(&time_buf, time_str);
+ /*
+ * Add space paddings to time_buf to display a fixed width
+ * string, and use time_width for display width calibration.
+ */
+ for (time_width = utf8_strwidth(time_str);
+ time_width < blame_date_width;
+ time_width++)
+ strbuf_addch(&time_buf, ' ');
}
- return time_buf;
+ return time_buf.buf;
}
#define OUTPUT_ANNOTATE_COMPAT 001
@@ -1772,25 +1756,41 @@ static int prepare_lines(struct scoreboard *sb)
{
const char *buf = sb->final_buf;
unsigned long len = sb->final_buf_size;
- int num = 0, incomplete = 0, bol = 1;
+ const char *end = buf + len;
+ const char *p;
+ int *lineno;
+ int num = 0, incomplete = 0;
- if (len && buf[len-1] != '\n')
- incomplete++; /* incomplete line at the end */
- while (len--) {
- if (bol) {
- sb->lineno = xrealloc(sb->lineno,
- sizeof(int *) * (num + 1));
- sb->lineno[num] = buf - sb->final_buf;
- bol = 0;
- }
- if (*buf++ == '\n') {
+ for (p = buf;;) {
+ p = memchr(p, '\n', end - p);
+ if (p) {
+ p++;
num++;
- bol = 1;
+ continue;
}
+ break;
}
- sb->lineno = xrealloc(sb->lineno,
- sizeof(int *) * (num + incomplete + 1));
- sb->lineno[num + incomplete] = buf - sb->final_buf;
+
+ if (len && end[-1] != '\n')
+ incomplete++; /* incomplete line at the end */
+
+ sb->lineno = xmalloc(sizeof(*sb->lineno) * (num + incomplete + 1));
+ lineno = sb->lineno;
+
+ *lineno++ = 0;
+ for (p = buf;;) {
+ p = memchr(p, '\n', end - p);
+ if (p) {
+ p++;
+ *lineno++ = p - buf;
+ continue;
+ }
+ break;
+ }
+
+ if (incomplete)
+ *lineno++ = len;
+
sb->num_lines = num + incomplete;
return sb->num_lines;
}
@@ -2006,6 +2006,18 @@ static void append_merge_parents(struct commit_list **tail)
}
/*
+ * This isn't as simple as passing sb->buf and sb->len, because we
+ * want to transfer ownership of the buffer to the commit (so we
+ * must use detach).
+ */
+static void set_commit_buffer_from_strbuf(struct commit *c, struct strbuf *sb)
+{
+ size_t len;
+ void *buf = strbuf_detach(sb, &len);
+ set_commit_buffer(c, buf, len);
+}
+
+/*
* Prepare a dummy commit that represents the work tree (or staged) item.
* Note that annotating work tree item never works in the reverse.
*/
@@ -2026,10 +2038,9 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
struct strbuf msg = STRBUF_INIT;
time(&now);
- commit = xcalloc(1, sizeof(*commit));
+ commit = alloc_commit_node();
commit->object.parsed = 1;
commit->date = now;
- commit->object.type = OBJ_COMMIT;
parent_tail = &commit->parents;
if (!resolve_ref_unsafe("HEAD", head_sha1, 1, NULL))
@@ -2053,7 +2064,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
ident, ident, path,
(!contents_from ? path :
(!strcmp(contents_from, "-") ? "standard input" : contents_from)));
- commit->buffer = strbuf_detach(&msg, NULL);
+ set_commit_buffer_from_strbuf(commit, &msg);
if (!contents_from || strcmp("-", contents_from)) {
struct stat st;
@@ -2095,7 +2106,6 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
if (strbuf_read(&buf, 0, 0) < 0)
die_errno("failed to read from stdin");
}
- convert_to_git(path, buf.buf, buf.len, &buf, 0);
origin->file.ptr = buf.buf;
origin->file.size = buf.len;
pretend_sha1_file(buf.buf, buf.len, OBJ_BLOB, origin->blob_sha1);
@@ -2338,7 +2348,14 @@ parse_done:
blame_date_width = sizeof("2006-10-19");
break;
case DATE_RELATIVE:
- /* "normal" is used as the fallback for "relative" */
+ /* TRANSLATORS: This string is used to tell us the maximum
+ display width for a relative timestamp in "git blame"
+ output. For C locale, "4 years, 11 months ago", which
+ takes 22 places, is the longest among various forms of
+ relative timestamps, but your language may need more or
+ fewer display columns. */
+ blame_date_width = utf8_strwidth(_("4 years, 11 months ago")) + 1; /* add the null */
+ break;
case DATE_LOCAL:
case DATE_NORMAL:
blame_date_width = sizeof("Thu Oct 19 16:00:04 2006 -0700");
@@ -2440,11 +2457,8 @@ parse_done:
die("revision walk setup failed");
if (is_null_sha1(sb.final->object.sha1)) {
- char *buf;
o = sb.final->util;
- buf = xmalloc(o->file.size + 1);
- memcpy(buf, o->file.ptr, o->file.size + 1);
- sb.final_buf = buf;
+ sb.final_buf = xmemdupz(o->file.ptr, o->file.size);
sb.final_buf_size = o->file.size;
}
else {
@@ -2502,8 +2516,6 @@ parse_done:
ent->suspect = o;
ent->s_lno = bottom;
ent->next = next;
- if (next)
- next->prev = ent;
origin_incref(o);
}
origin_decref(o);
diff --git a/builtin/branch.c b/builtin/branch.c
index b4d771673e..652b1d2d14 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -315,7 +315,7 @@ static int match_patterns(const char **pattern, const char *refname)
if (!*pattern)
return 1; /* no pattern always matches */
while (*pattern) {
- if (!fnmatch(*pattern, refname, 0))
+ if (!wildmatch(*pattern, refname, 0, NULL))
return 1;
pattern++;
}
diff --git a/builtin/cat-file.c b/builtin/cat-file.c
index d5a93e0e91..707330499f 100644
--- a/builtin/cat-file.c
+++ b/builtin/cat-file.c
@@ -269,6 +269,8 @@ static int batch_objects(struct batch_options *opt)
{
struct strbuf buf = STRBUF_INIT;
struct expand_data data;
+ int save_warning;
+ int retval = 0;
if (!opt->format)
opt->format = "%(objectname) %(objecttype) %(objectsize)";
@@ -297,11 +299,10 @@ static int batch_objects(struct batch_options *opt)
* warn) ends up dwarfing the actual cost of the object lookups
* themselves. We can work around it by just turning off the warning.
*/
+ save_warning = warn_on_object_refname_ambiguity;
warn_on_object_refname_ambiguity = 0;
while (strbuf_getline(&buf, stdin, '\n') != EOF) {
- int error;
-
if (data.split_on_whitespace) {
/*
* Split at first whitespace, tying off the beginning
@@ -316,12 +317,14 @@ static int batch_objects(struct batch_options *opt)
data.rest = p;
}
- error = batch_one_object(buf.buf, opt, &data);
- if (error)
- return error;
+ retval = batch_one_object(buf.buf, opt, &data);
+ if (retval)
+ break;
}
- return 0;
+ strbuf_release(&buf);
+ warn_on_object_refname_ambiguity = save_warning;
+ return retval;
}
static const char * const cat_file_usage[] = {
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 63151e08a4..07cf555309 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -1095,7 +1095,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
OPT_BOOL(0, "detach", &opts.force_detach, N_("detach the HEAD at named commit")),
OPT_SET_INT('t', "track", &opts.track, N_("set upstream info for new branch"),
BRANCH_TRACK_EXPLICIT),
- OPT_STRING(0, "orphan", &opts.new_orphan_branch, N_("new branch"), N_("new unparented branch")),
+ OPT_STRING(0, "orphan", &opts.new_orphan_branch, N_("new-branch"), N_("new unparented branch")),
OPT_SET_INT('2', "ours", &opts.writeout_stage, N_("checkout our version for unmerged files"),
2),
OPT_SET_INT('3', "theirs", &opts.writeout_stage, N_("checkout their version for unmerged files"),
diff --git a/builtin/clean.c b/builtin/clean.c
index 8926ca851c..1032563e5f 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);
}
@@ -620,8 +621,7 @@ static int *list_and_choose(struct menu_opts *opts, struct menu_stuff *stuff)
nr += chosen[i];
}
- result = xmalloc(sizeof(int) * (nr + 1));
- memset(result, 0, sizeof(int) * (nr + 1));
+ result = xcalloc(nr + 1, sizeof(int));
for (i = 0; i < stuff->nr && j < nr; i++) {
if (chosen[i])
result[j++] = i;
diff --git a/builtin/clone.c b/builtin/clone.c
index 9b3c04d914..545105a86f 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -695,7 +695,7 @@ static void write_refspec_config(const char* src_ref_prefix,
if (option_mirror || !option_bare) {
if (option_single_branch && !option_mirror) {
if (option_branch) {
- if (strstr(our_head_points_at->name, "refs/tags/"))
+ if (starts_with(our_head_points_at->name, "refs/tags/"))
strbuf_addf(&value, "+%s:%s", our_head_points_at->name,
our_head_points_at->name);
else
diff --git a/builtin/commit-tree.c b/builtin/commit-tree.c
index f641ff2a89..8a66c74e0f 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);
@@ -113,8 +123,8 @@ int cmd_commit_tree(int argc, const char **argv, const char *prefix)
die_errno("git commit-tree: failed to read");
}
- if (commit_tree(&buffer, tree_sha1, parents, commit_sha1,
- NULL, sign_commit)) {
+ if (commit_tree(buffer.buf, buffer.len, tree_sha1, parents,
+ commit_sha1, NULL, sign_commit)) {
strbuf_release(&buffer);
return 1;
}
diff --git a/builtin/commit.c b/builtin/commit.c
index 7d711eafa6..39cf8976e3 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -113,6 +113,7 @@ static char *sign_commit;
static enum {
CLEANUP_SPACE,
CLEANUP_NONE,
+ CLEANUP_SCISSORS,
CLEANUP_ALL
} cleanup_mode;
static const char *cleanup_arg;
@@ -307,7 +308,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 +320,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 +601,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,10 +648,10 @@ 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"));
- strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
+ if (buffer)
+ strbuf_add(&sb, buffer + 2, strlen(buffer + 2));
hook_arg1 = "commit";
hook_arg2 = use_message;
} else if (fixup_message) {
@@ -753,8 +752,12 @@ 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)
+ if (whence != FROM_COMMIT) {
+ if (cleanup_mode == CLEANUP_SCISSORS)
+ wt_status_add_cut_line(s->fp);
status_printf_ln(s, GIT_COLOR_NORMAL,
whence == FROM_MERGE
? _("\n"
@@ -770,6 +773,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
git_path(whence == FROM_MERGE
? "MERGE_HEAD"
: "CHERRY_PICK_HEAD"));
+ }
fprintf(s->fp, "\n");
if (cleanup_mode == CLEANUP_ALL)
@@ -777,6 +781,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
_("Please enter the commit message for your changes."
" Lines starting\nwith '%c' will be ignored, and an empty"
" message aborts the commit.\n"), comment_line_char);
+ else if (cleanup_mode == CLEANUP_SCISSORS && whence == FROM_COMMIT)
+ wt_status_add_cut_line(s->fp);
else /* CLEANUP_SPACE, that is. */
status_printf(s, GIT_COLOR_NORMAL,
_("Please enter the commit message for your changes."
@@ -826,8 +832,22 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
if (get_sha1(parent, sha1))
commitable = !!active_nr;
- else
- commitable = index_differs_from(parent, 0);
+ else {
+ /*
+ * Unless the user did explicitly request a submodule
+ * ignore mode by passing a command line option we do
+ * not ignore any changed submodule SHA-1s when
+ * comparing index and parent, no matter what is
+ * configured. Otherwise we won't commit any
+ * submodules which were manually staged, which would
+ * be really confusing.
+ */
+ int diff_flags = DIFF_OPT_OVERRIDE_SUBMODULE_CONFIG;
+ if (ignore_submodule_arg &&
+ !strcmp(ignore_submodule_arg, "all"))
+ diff_flags |= DIFF_OPT_IGNORE_SUBMODULES;
+ commitable = index_differs_from(parent, diff_flags);
+ }
}
strbuf_release(&committer_ident);
@@ -1130,6 +1150,8 @@ static int parse_and_validate_options(int argc, const char *argv[],
cleanup_mode = CLEANUP_SPACE;
else if (!strcmp(cleanup_arg, "strip"))
cleanup_mode = CLEANUP_ALL;
+ else if (!strcmp(cleanup_arg, "scissors"))
+ cleanup_mode = use_editor ? CLEANUP_SCISSORS : CLEANUP_SPACE;
else
die(_("Invalid cleanup mode %s"), cleanup_arg);
@@ -1404,6 +1426,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)
@@ -1488,7 +1514,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
OPT_BOOL('e', "edit", &edit_flag, N_("force edit of commit")),
OPT_STRING(0, "cleanup", &cleanup_arg, N_("default"), N_("how to strip spaces and #comments from message")),
OPT_BOOL(0, "status", &include_status, N_("include status in commit message template")),
- { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key id"),
+ { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
/* end commit message options */
@@ -1531,7 +1557,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;
@@ -1579,6 +1604,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)";
@@ -1621,8 +1647,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
die(_("could not read commit message: %s"), strerror(saved_errno));
}
- /* Truncate the message just before the diff, if any. */
- if (verbose)
+ if (verbose || /* Truncate the message just before the diff, if any. */
+ cleanup_mode == CLEANUP_SCISSORS)
wt_status_truncate_message_at_cut_line(&sb);
if (cleanup_mode != CLEANUP_NONE)
@@ -1646,8 +1672,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
append_merge_tag_headers(parents, &tail);
}
- if (commit_tree_extended(&sb, active_cache_tree->sha1, parents, sha1,
- author_ident.buf, sign_commit, extra)) {
+ if (commit_tree_extended(sb.buf, sb.len, active_cache_tree->sha1,
+ parents, sha1, author_ident.buf, sign_commit, extra)) {
rollback_index_files();
die(_("failed to write commit object"));
}
diff --git a/builtin/config.c b/builtin/config.c
index 92ebf23f0a..5677c942b6 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -21,8 +21,7 @@ static char key_delim = ' ';
static char term = '\n';
static int use_global_config, use_system_config, use_local_config;
-static const char *given_config_file;
-static const char *given_config_blob;
+static struct git_config_source given_config_source;
static int actions, types;
static const char *get_color_slot, *get_colorbool_slot;
static int end_null;
@@ -55,8 +54,8 @@ static struct option builtin_config_options[] = {
OPT_BOOL(0, "global", &use_global_config, N_("use global config file")),
OPT_BOOL(0, "system", &use_system_config, N_("use system config file")),
OPT_BOOL(0, "local", &use_local_config, N_("use repository config file")),
- OPT_STRING('f', "file", &given_config_file, N_("file"), N_("use given config file")),
- OPT_STRING(0, "blob", &given_config_blob, N_("blob-id"), N_("read config from given blob object")),
+ OPT_STRING('f', "file", &given_config_source.file, N_("file"), N_("use given config file")),
+ OPT_STRING(0, "blob", &given_config_source.blob, N_("blob-id"), N_("read config from given blob object")),
OPT_GROUP(N_("Action")),
OPT_BIT(0, "get", &actions, N_("get value: name [value-regex]"), ACTION_GET),
OPT_BIT(0, "get-all", &actions, N_("get all values: key [value-regex]"), ACTION_GET_ALL),
@@ -224,8 +223,7 @@ static int get_value(const char *key_, const char *regex_)
}
git_config_with_options(collect_config, &values,
- given_config_file, given_config_blob,
- respect_includes);
+ &given_config_source, respect_includes);
ret = !values.nr;
@@ -309,8 +307,7 @@ static void get_color(const char *def_color)
get_color_found = 0;
parsed_color[0] = '\0';
git_config_with_options(git_get_color_config, NULL,
- given_config_file, given_config_blob,
- respect_includes);
+ &given_config_source, respect_includes);
if (!get_color_found && def_color)
color_parse(def_color, "command line", parsed_color);
@@ -339,8 +336,7 @@ static int get_colorbool(int print)
get_diff_color_found = -1;
get_color_ui_found = -1;
git_config_with_options(git_get_colorbool_config, NULL,
- given_config_file, given_config_blob,
- respect_includes);
+ &given_config_source, respect_includes);
if (get_colorbool_found < 0) {
if (!strcmp(get_colorbool_slot, "color.diff"))
@@ -362,9 +358,12 @@ static int get_colorbool(int print)
return get_colorbool_found ? 0 : 1;
}
-static void check_blob_write(void)
+static void check_write(void)
{
- if (given_config_blob)
+ if (given_config_source.use_stdin)
+ die("writing to stdin is not supported");
+
+ if (given_config_source.blob)
die("writing config blobs is not supported");
}
@@ -435,7 +434,7 @@ static int get_urlmatch(const char *var, const char *url)
}
git_config_with_options(urlmatch_config_entry, &config,
- given_config_file, NULL, respect_includes);
+ &given_config_source, respect_includes);
for_each_string_list_item(item, &values) {
struct urlmatch_current_candidate_value *matched = item->util;
@@ -464,18 +463,24 @@ int cmd_config(int argc, const char **argv, const char *prefix)
int nongit = !startup_info->have_repository;
char *value;
- given_config_file = getenv(CONFIG_ENVIRONMENT);
+ given_config_source.file = getenv(CONFIG_ENVIRONMENT);
argc = parse_options(argc, argv, prefix, builtin_config_options,
builtin_config_usage,
PARSE_OPT_STOP_AT_NON_OPTION);
if (use_global_config + use_system_config + use_local_config +
- !!given_config_file + !!given_config_blob > 1) {
+ !!given_config_source.file + !!given_config_source.blob > 1) {
error("only one config file at a time.");
usage_with_options(builtin_config_usage, builtin_config_options);
}
+ if (given_config_source.file &&
+ !strcmp(given_config_source.file, "-")) {
+ given_config_source.file = NULL;
+ given_config_source.use_stdin = 1;
+ }
+
if (use_global_config) {
char *user_config = NULL;
char *xdg_config = NULL;
@@ -493,24 +498,24 @@ int cmd_config(int argc, const char **argv, const char *prefix)
if (access_or_warn(user_config, R_OK, 0) &&
xdg_config && !access_or_warn(xdg_config, R_OK, 0))
- given_config_file = xdg_config;
+ given_config_source.file = xdg_config;
else
- given_config_file = user_config;
+ given_config_source.file = user_config;
}
else if (use_system_config)
- given_config_file = git_etc_gitconfig();
+ given_config_source.file = git_etc_gitconfig();
else if (use_local_config)
- given_config_file = git_pathdup("config");
- else if (given_config_file) {
- if (!is_absolute_path(given_config_file) && prefix)
- given_config_file =
+ given_config_source.file = git_pathdup("config");
+ else if (given_config_source.file) {
+ if (!is_absolute_path(given_config_source.file) && prefix)
+ given_config_source.file =
xstrdup(prefix_filename(prefix,
strlen(prefix),
- given_config_file));
+ given_config_source.file));
}
if (respect_includes == -1)
- respect_includes = !given_config_file;
+ respect_includes = !given_config_source.file;
if (end_null) {
term = '\0';
@@ -549,57 +554,58 @@ int cmd_config(int argc, const char **argv, const char *prefix)
if (actions == ACTION_LIST) {
check_argc(argc, 0, 0);
if (git_config_with_options(show_all_config, NULL,
- given_config_file,
- given_config_blob,
+ &given_config_source,
respect_includes) < 0) {
- if (given_config_file)
+ if (given_config_source.file)
die_errno("unable to read config file '%s'",
- given_config_file);
+ given_config_source.file);
else
die("error processing config file(s)");
}
}
else if (actions == ACTION_EDIT) {
check_argc(argc, 0, 0);
- if (!given_config_file && nongit)
+ if (!given_config_source.file && nongit)
die("not in a git directory");
- if (given_config_blob)
+ if (given_config_source.use_stdin)
+ die("editing stdin is not supported");
+ if (given_config_source.blob)
die("editing blobs is not supported");
git_config(git_default_config, NULL);
- launch_editor(given_config_file ?
- given_config_file : git_path("config"),
+ launch_editor(given_config_source.file ?
+ given_config_source.file : git_path("config"),
NULL, NULL);
}
else if (actions == ACTION_SET) {
int ret;
- check_blob_write();
+ check_write();
check_argc(argc, 2, 2);
value = normalize_value(argv[0], argv[1]);
- ret = git_config_set_in_file(given_config_file, argv[0], value);
+ ret = git_config_set_in_file(given_config_source.file, argv[0], value);
if (ret == CONFIG_NOTHING_SET)
error("cannot overwrite multiple values with a single value\n"
" Use a regexp, --add or --replace-all to change %s.", argv[0]);
return ret;
}
else if (actions == ACTION_SET_ALL) {
- check_blob_write();
+ check_write();
check_argc(argc, 2, 3);
value = normalize_value(argv[0], argv[1]);
- return git_config_set_multivar_in_file(given_config_file,
+ return git_config_set_multivar_in_file(given_config_source.file,
argv[0], value, argv[2], 0);
}
else if (actions == ACTION_ADD) {
- check_blob_write();
+ check_write();
check_argc(argc, 2, 2);
value = normalize_value(argv[0], argv[1]);
- return git_config_set_multivar_in_file(given_config_file,
+ return git_config_set_multivar_in_file(given_config_source.file,
argv[0], value, "^$", 0);
}
else if (actions == ACTION_REPLACE_ALL) {
- check_blob_write();
+ check_write();
check_argc(argc, 2, 3);
value = normalize_value(argv[0], argv[1]);
- return git_config_set_multivar_in_file(given_config_file,
+ return git_config_set_multivar_in_file(given_config_source.file,
argv[0], value, argv[2], 1);
}
else if (actions == ACTION_GET) {
@@ -623,26 +629,26 @@ int cmd_config(int argc, const char **argv, const char *prefix)
return get_urlmatch(argv[0], argv[1]);
}
else if (actions == ACTION_UNSET) {
- check_blob_write();
+ check_write();
check_argc(argc, 1, 2);
if (argc == 2)
- return git_config_set_multivar_in_file(given_config_file,
+ return git_config_set_multivar_in_file(given_config_source.file,
argv[0], NULL, argv[1], 0);
else
- return git_config_set_in_file(given_config_file,
+ return git_config_set_in_file(given_config_source.file,
argv[0], NULL);
}
else if (actions == ACTION_UNSET_ALL) {
- check_blob_write();
+ check_write();
check_argc(argc, 1, 2);
- return git_config_set_multivar_in_file(given_config_file,
+ return git_config_set_multivar_in_file(given_config_source.file,
argv[0], NULL, argv[1], 1);
}
else if (actions == ACTION_RENAME_SECTION) {
int ret;
- check_blob_write();
+ check_write();
check_argc(argc, 2, 2);
- ret = git_config_rename_section_in_file(given_config_file,
+ ret = git_config_rename_section_in_file(given_config_source.file,
argv[0], argv[1]);
if (ret < 0)
return ret;
@@ -651,9 +657,9 @@ int cmd_config(int argc, const char **argv, const char *prefix)
}
else if (actions == ACTION_REMOVE_SECTION) {
int ret;
- check_blob_write();
+ check_write();
check_argc(argc, 1, 1);
- ret = git_config_rename_section_in_file(given_config_file,
+ ret = git_config_rename_section_in_file(given_config_source.file,
argv[0], NULL);
if (ret < 0)
return ret;
diff --git a/builtin/describe.c b/builtin/describe.c
index 7db43dae1b..24d740c8b1 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;
@@ -150,7 +138,7 @@ static int get_name(const char *path, const unsigned char *sha1, int flag, void
return 0;
/* Accept only tags that match the pattern, if given */
- if (pattern && (!is_tag || fnmatch(pattern, path + 10, 0)))
+ if (pattern && (!is_tag || wildmatch(pattern, path + 10, 0, NULL)))
return 0;
/* Is it annotated? */
@@ -292,7 +280,14 @@ static void describe(const char *arg, int last_one)
fprintf(stderr, _("searching to describe %s\n"), arg);
if (!have_util) {
- for_each_hash(&names, set_util, NULL);
+ struct hashmap_iter iter;
+ struct commit *c;
+ struct commit_name *n = hashmap_iter_first(&names, &iter);
+ for (; n; n = hashmap_iter_next(&iter)) {
+ c = lookup_commit_reference_gently(n->peeled, 1);
+ if (c)
+ c->util = n;
+ }
have_util = 1;
}
@@ -463,9 +458,9 @@ int cmd_describe(int argc, const char **argv, const char *prefix)
return cmd_name_rev(args.argc, args.argv, prefix);
}
- init_hash(&names);
+ hashmap_init(&names, (hashmap_cmp_fn) commit_name_cmp, 0);
for_each_rawref(get_name, NULL);
- if (!names.nr && !always)
+ if (!names.size && !always)
die(_("No names found, cannot describe anything."));
if (argc == 0) {
diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c
index be6417d166..dddd0f9188 100644
--- a/builtin/diff-tree.c
+++ b/builtin/diff-tree.c
@@ -72,9 +72,7 @@ static int diff_tree_stdin(char *line)
line[len-1] = 0;
if (get_sha1_hex(line, sha1))
return -1;
- obj = lookup_unknown_object(sha1);
- if (!obj || !obj->parsed)
- obj = parse_object(sha1);
+ obj = parse_object(sha1);
if (!obj)
return -1;
if (obj->type == OBJ_COMMIT)
diff --git a/builtin/fast-export.c b/builtin/fast-export.c
index b8d8a3aaf9..05d161f19f 100644
--- a/builtin/fast-export.c
+++ b/builtin/fast-export.c
@@ -279,6 +279,7 @@ static const char *find_encoding(const char *begin, const char *end)
static void handle_commit(struct commit *commit, struct rev_info *rev)
{
int saved_output_format = rev->diffopt.output_format;
+ const char *commit_buffer;
const char *author, *author_end, *committer, *committer_end;
const char *encoding, *message;
char *reencoded = NULL;
@@ -288,7 +289,8 @@ static void handle_commit(struct commit *commit, struct rev_info *rev)
rev->diffopt.output_format = DIFF_FORMAT_CALLBACK;
parse_commit_or_die(commit);
- author = strstr(commit->buffer, "\nauthor ");
+ commit_buffer = get_commit_buffer(commit, NULL);
+ author = strstr(commit_buffer, "\nauthor ");
if (!author)
die ("Could not find author in commit %s",
sha1_to_hex(commit->object.sha1));
@@ -335,6 +337,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev)
? strlen(message) : 0),
reencoded ? reencoded : message ? message : "");
free(reencoded);
+ unuse_commit_buffer(commit, commit_buffer);
for (i = 0, p = commit->parents; p; p = p->next) {
int mark = get_object_mark(&p->item->object);
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 025bc3e38d..55f457c04f 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/fmt-merge-msg.c b/builtin/fmt-merge-msg.c
index 3906eda877..ef8b254ef2 100644
--- a/builtin/fmt-merge-msg.c
+++ b/builtin/fmt-merge-msg.c
@@ -230,12 +230,14 @@ static void add_branch_desc(struct strbuf *out, const char *name)
static void record_person(int which, struct string_list *people,
struct commit *commit)
{
+ const char *buffer;
char *name_buf, *name, *name_end;
struct string_list_item *elem;
const char *field;
field = (which == 'a') ? "\nauthor " : "\ncommitter ";
- name = strstr(commit->buffer, field);
+ buffer = get_commit_buffer(commit, NULL);
+ name = strstr(buffer, field);
if (!name)
return;
name += strlen(field);
@@ -247,6 +249,7 @@ static void record_person(int which, struct string_list *people,
if (name_end < name)
return;
name_buf = xmemdupz(name, name_end - name + 1);
+ unuse_commit_buffer(commit, buffer);
elem = string_list_lookup(people, name_buf);
if (!elem) {
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 51798b48b5..3e1d5c3334 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -864,7 +864,7 @@ static int grab_single_ref(const char *refname, const unsigned char *sha1, int f
refname[plen] == '/' ||
p[plen-1] == '/'))
break;
- if (!fnmatch(p, refname, FNM_PATHNAME))
+ if (!wildmatch(p, refname, WM_PATHNAME, NULL))
break;
}
if (!*pattern)
diff --git a/builtin/fsck.c b/builtin/fsck.c
index 1affdd5e92..8aadca160e 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -144,7 +144,7 @@ static int traverse_reachable(void)
unsigned int nr = 0;
int result = 0;
if (show_progress)
- progress = start_progress_delay("Checking connectivity", 0, 0, 2);
+ progress = start_progress_delay(_("Checking connectivity"), 0, 0, 2);
while (pending.nr) {
struct object_array_entry *entry;
struct object *obj;
@@ -310,8 +310,7 @@ static int fsck_obj(struct object *obj)
if (obj->type == OBJ_COMMIT) {
struct commit *commit = (struct commit *) obj;
- free(commit->buffer);
- commit->buffer = NULL;
+ free_commit_buffer(commit);
if (!commit->parents && show_root)
printf("root %s\n", sha1_to_hex(commit->object.sha1));
@@ -541,7 +540,7 @@ static void fsck_object_dir(const char *path)
fprintf(stderr, "Checking object directory\n");
if (show_progress)
- progress = start_progress("Checking object directories", 256);
+ progress = start_progress(_("Checking object directories"), 256);
for (i = 0; i < 256; i++) {
static char dir[4096];
sprintf(dir, "%s/%02x", path, i);
@@ -630,7 +629,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
struct alternate_object_database *alt;
errors_found = 0;
- read_replace_refs = 0;
+ check_replace_refs = 0;
argc = parse_options(argc, argv, prefix, fsck_opts, fsck_usage, 0);
@@ -670,7 +669,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
total += p->num_objects;
}
- progress = start_progress("Checking objects", total);
+ progress = start_progress(_("Checking objects"), total);
}
for (p = packed_git; p; p = p->next) {
/* verify gives error messages itself */
diff --git a/builtin/gc.c b/builtin/gc.c
index 7fa717a3b6..8d219d8c42 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -26,9 +26,12 @@ static const char * const builtin_gc_usage[] = {
};
static int pack_refs = 1;
+static int prune_reflogs = 1;
+static int aggressive_depth = 250;
static int aggressive_window = 250;
static int gc_auto_threshold = 6700;
static int gc_auto_pack_limit = 50;
+static int detach_auto = 1;
static const char *prune_expire = "2.weeks.ago";
static struct argv_array pack_refs_cmd = ARGV_ARRAY_INIT;
@@ -65,6 +68,10 @@ static int gc_config(const char *var, const char *value, void *cb)
aggressive_window = git_config_int(var, value);
return 0;
}
+ if (!strcmp(var, "gc.aggressivedepth")) {
+ aggressive_depth = git_config_int(var, value);
+ return 0;
+ }
if (!strcmp(var, "gc.auto")) {
gc_auto_threshold = git_config_int(var, value);
return 0;
@@ -73,6 +80,10 @@ static int gc_config(const char *var, const char *value, void *cb)
gc_auto_pack_limit = git_config_int(var, value);
return 0;
}
+ if (!strcmp(var, "gc.autodetach")) {
+ detach_auto = git_config_bool(var, value);
+ return 0;
+ }
if (!strcmp(var, "gc.pruneexpire")) {
if (value && strcmp(value, "now")) {
unsigned long now = approxidate("now");
@@ -188,13 +199,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 +216,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 =
@@ -247,6 +259,19 @@ static const char *lock_repo_for_gc(int force, pid_t* ret_pid)
return NULL;
}
+static int gc_before_repack(void)
+{
+ if (pack_refs && run_command_v_opt(pack_refs_cmd.argv, RUN_GIT_CMD))
+ return error(FAILED_RUN, pack_refs_cmd.argv[0]);
+
+ if (prune_reflogs && run_command_v_opt(reflog.argv, RUN_GIT_CMD))
+ return error(FAILED_RUN, reflog.argv[0]);
+
+ pack_refs = 0;
+ prune_reflogs = 0;
+ return 0;
+}
+
int cmd_gc(int argc, const char **argv, const char *prefix)
{
int aggressive = 0;
@@ -288,7 +313,8 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
if (aggressive) {
argv_array_push(&repack, "-f");
- argv_array_push(&repack, "--depth=250");
+ if (aggressive_depth > 0)
+ argv_array_pushf(&repack, "--depth=%d", aggressive_depth);
if (aggressive_window > 0)
argv_array_pushf(&repack, "--window=%d", aggressive_window);
}
@@ -301,11 +327,22 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
*/
if (!need_to_gc())
return 0;
- if (!quiet)
- fprintf(stderr,
- _("Auto packing the repository for optimum performance. You may also\n"
- "run \"git gc\" manually. See "
- "\"git help gc\" for more information.\n"));
+ if (!quiet) {
+ if (detach_auto)
+ fprintf(stderr, _("Auto packing the repository in background for optimum performance.\n"));
+ else
+ fprintf(stderr, _("Auto packing the repository for optimum performance.\n"));
+ fprintf(stderr, _("See \"git help gc\" for manual housekeeping.\n"));
+ }
+ if (detach_auto) {
+ if (gc_before_repack())
+ return -1;
+ /*
+ * failure to daemonize is ok, we'll continue
+ * in foreground
+ */
+ daemonize();
+ }
} else
add_repack_all_option();
@@ -317,11 +354,8 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
name, (uintmax_t)pid);
}
- if (pack_refs && run_command_v_opt(pack_refs_cmd.argv, RUN_GIT_CMD))
- return error(FAILED_RUN, pack_refs_cmd.argv[0]);
-
- if (run_command_v_opt(reflog.argv, RUN_GIT_CMD))
- return error(FAILED_RUN, reflog.argv[0]);
+ if (gc_before_repack())
+ return -1;
if (run_command_v_opt(repack.argv, RUN_GIT_CMD))
return error(FAILED_RUN, repack.argv[0]);
diff --git a/builtin/grep.c b/builtin/grep.c
index 69ac2d8797..b8d440d0e0 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -874,6 +874,9 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
if (len > 4 && is_dir_sep(pager[len - 5]))
pager += len - 4;
+ if (opt.ignore_case && !strcmp("less", pager))
+ string_list_append(&path_list, "-I");
+
if (!strcmp("less", pager) || !strcmp("vi", pager)) {
struct strbuf buf = STRBUF_INIT;
strbuf_addf(&buf, "+/%s%s",
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index fa74972886..9ca0203922 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -40,17 +40,13 @@ struct base_data {
int ofs_first, ofs_last;
};
-#if !defined(NO_PTHREADS) && defined(NO_THREAD_SAFE_PREAD)
-/* pread() emulation is not thread-safe. Disable threading. */
-#define NO_PTHREADS
-#endif
-
struct thread_local {
#ifndef NO_PTHREADS
pthread_t thread;
#endif
struct base_data *base_cache;
size_t base_cache_used;
+ int pack_fd;
};
/*
@@ -91,7 +87,8 @@ static off_t consumed_bytes;
static unsigned deepest_delta;
static git_SHA_CTX input_ctx;
static uint32_t input_crc32;
-static int input_fd, output_fd, pack_fd;
+static int input_fd, output_fd;
+static const char *curr_pack;
#ifndef NO_PTHREADS
@@ -134,6 +131,7 @@ static inline void unlock_mutex(pthread_mutex_t *mutex)
*/
static void init_thread(void)
{
+ int i;
init_recursive_mutex(&read_mutex);
pthread_mutex_init(&counter_mutex, NULL);
pthread_mutex_init(&work_mutex, NULL);
@@ -141,11 +139,18 @@ static void init_thread(void)
pthread_mutex_init(&deepest_delta_mutex, NULL);
pthread_key_create(&key, NULL);
thread_data = xcalloc(nr_threads, sizeof(*thread_data));
+ for (i = 0; i < nr_threads; i++) {
+ thread_data[i].pack_fd = open(curr_pack, O_RDONLY);
+ if (thread_data[i].pack_fd == -1)
+ die_errno(_("unable to open %s"), curr_pack);
+ }
+
threads_active = 1;
}
static void cleanup_thread(void)
{
+ int i;
if (!threads_active)
return;
threads_active = 0;
@@ -154,6 +159,8 @@ static void cleanup_thread(void)
pthread_mutex_destroy(&work_mutex);
if (show_stat)
pthread_mutex_destroy(&deepest_delta_mutex);
+ for (i = 0; i < nr_threads; i++)
+ close(thread_data[i].pack_fd);
pthread_key_delete(key);
free(thread_data);
}
@@ -200,8 +207,13 @@ static unsigned check_object(struct object *obj)
if (!(obj->flags & FLAG_CHECKED)) {
unsigned long size;
int type = sha1_object_info(obj->sha1, &size);
- if (type != obj->type || type <= 0)
- die(_("object of unexpected type"));
+ if (type <= 0)
+ die(_("did not receive expected object %s"),
+ sha1_to_hex(obj->sha1));
+ if (type != obj->type)
+ die(_("object %s: expected type %s, found %s"),
+ sha1_to_hex(obj->sha1),
+ typename(obj->type), typename(type));
obj->flags |= FLAG_CHECKED;
return 1;
}
@@ -288,13 +300,13 @@ static const char *open_pack_file(const char *pack_name)
output_fd = open(pack_name, O_CREAT|O_EXCL|O_RDWR, 0600);
if (output_fd < 0)
die_errno(_("unable to create '%s'"), pack_name);
- pack_fd = output_fd;
+ nothread_data.pack_fd = output_fd;
} else {
input_fd = open(pack_name, O_RDONLY);
if (input_fd < 0)
die_errno(_("cannot open packfile '%s'"), pack_name);
output_fd = -1;
- pack_fd = input_fd;
+ nothread_data.pack_fd = input_fd;
}
git_SHA1_Init(&input_ctx);
return pack_name;
@@ -350,8 +362,7 @@ static void set_thread_data(struct thread_local *data)
static struct base_data *alloc_base_data(void)
{
- struct base_data *base = xmalloc(sizeof(struct base_data));
- memset(base, 0, sizeof(*base));
+ struct base_data *base = xcalloc(1, sizeof(struct base_data));
base->ref_last = -1;
base->ofs_last = -1;
return base;
@@ -542,7 +553,7 @@ static void *unpack_data(struct object_entry *obj,
do {
ssize_t n = (len < 64*1024) ? len : 64*1024;
- n = pread(pack_fd, inbuf, n, from);
+ n = xpread(get_thread_data()->pack_fd, inbuf, n, from);
if (n < 0)
die_errno(_("cannot pread pack file"));
if (!n)
@@ -774,7 +785,8 @@ static void sha1_object(const void *data, struct object_entry *obj_entry,
}
if (obj->type == OBJ_COMMIT) {
struct commit *commit = (struct commit *) obj;
- commit->buffer = NULL;
+ if (detach_commit_buffer(commit, NULL) != data)
+ die("BUG: parse_object_buffer transmogrified our buffer");
}
obj->flags |= FLAG_CHECKED;
}
@@ -1490,7 +1502,7 @@ static void show_pack_info(int stat_only)
int cmd_index_pack(int argc, const char **argv, const char *prefix)
{
int i, fix_thin_pack = 0, verify = 0, stat_only = 0;
- const char *curr_pack, *curr_index;
+ const char *curr_index;
const char *index_name = NULL, *pack_name = NULL;
const char *keep_name = NULL, *keep_msg = NULL;
char *index_name_buf = NULL, *keep_name_buf = NULL;
@@ -1502,7 +1514,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix)
if (argc == 2 && !strcmp(argv[1], "-h"))
usage(index_pack_usage);
- read_replace_refs = 0;
+ check_replace_refs = 0;
reset_pack_idx_option(&opts);
git_config(git_index_pack_config, &opts);
diff --git a/builtin/init-db.c b/builtin/init-db.c
index c7c76bbf21..56f85e239a 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -412,11 +412,9 @@ int init_db(const char *template_dir, unsigned int flags)
if (!(flags & INIT_DB_QUIET)) {
int len = strlen(git_dir);
- /*
- * 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.
- */
+ /* 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. */
printf(_("%s%s Git repository in %s%s\n"),
reinit ? _("Reinitialized existing") : _("Initialized empty"),
shared_repository ? _(" shared") : "",
diff --git a/builtin/log.c b/builtin/log.c
index 39e8836352..4f678136d1 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -158,13 +158,9 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
if (rev->show_notes)
init_display_notes(&rev->notes_opt);
- if (rev->diffopt.pickaxe || rev->diffopt.filter)
+ if (rev->diffopt.pickaxe || rev->diffopt.filter ||
+ DIFF_OPT_TST(&rev->diffopt, FOLLOW_RENAMES))
rev->always_show_header = 0;
- if (DIFF_OPT_TST(&rev->diffopt, FOLLOW_RENAMES)) {
- rev->always_show_header = 0;
- if (rev->diffopt.pathspec.nr != 1)
- usage("git logs can only follow renames on one pathname at a time");
- }
if (source)
rev->show_source = 1;
@@ -349,8 +345,7 @@ static int cmd_log_walk(struct rev_info *rev)
rev->max_count++;
if (!rev->reflog_info) {
/* we allow cycles in reflog ancestry */
- free(commit->buffer);
- commit->buffer = NULL;
+ free_commit_buffer(commit);
}
free_commit_list(commit->parents);
commit->parents = NULL;
@@ -919,9 +914,12 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
log_write_email_headers(rev, head, &pp.subject, &pp.after_subject,
&need_8bit_cte);
- for (i = 0; !need_8bit_cte && i < nr; i++)
- if (has_non_ascii(list[i]->buffer))
+ for (i = 0; !need_8bit_cte && i < nr; i++) {
+ const char *buf = get_commit_buffer(list[i], NULL);
+ if (has_non_ascii(buf))
need_8bit_cte = 1;
+ unuse_commit_buffer(list[i], buf);
+ }
if (!branch_name)
branch_name = find_branch_name(rev);
@@ -1508,8 +1506,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
reopen_stdout(rev.numbered_files ? NULL : commit, NULL, &rev, quiet))
die(_("Failed to create output files"));
shown = log_tree_commit(&rev, commit);
- free(commit->buffer);
- commit->buffer = NULL;
+ free_commit_buffer(commit);
/* We put one extra blank line between formatted
* patches and this flag is used by log-tree code
diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c
index 39e5144b9e..b2a4b92992 100644
--- a/builtin/ls-remote.c
+++ b/builtin/ls-remote.c
@@ -22,7 +22,7 @@ static int tail_match(const char **pattern, const char *path)
if (snprintf(pathbuf, sizeof(pathbuf), "/%s", path) > sizeof(pathbuf))
return error("insanely long ref %.*s...", 20, path);
while ((p = *(pattern++)) != NULL) {
- if (!fnmatch(p, pathbuf, 0))
+ if (!wildmatch(p, pathbuf, 0, NULL))
return 1;
}
return 0;
@@ -92,7 +92,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
if (argv[i]) {
int j;
- pattern = xcalloc(sizeof(const char *), argc - i + 1);
+ pattern = xcalloc(argc - i + 1, sizeof(const char *));
for (j = i; j < argc; j++) {
int len = strlen(argv[j]);
char *p = xmalloc(len + 3);
diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c
index 2c3cd8eab7..cf11c8d607 100644
--- a/builtin/mailinfo.c
+++ b/builtin/mailinfo.c
@@ -334,7 +334,7 @@ static int check_header(const struct strbuf *line,
}
if (starts_with(line->buf, "[PATCH]") && isspace(line->buf[7])) {
for (i = 0; header[i]; i++) {
- if (!memcmp("Subject", header[i], 7)) {
+ if (!strcmp("Subject", header[i])) {
handle_header(&hdr_data[i], line);
ret = 1;
goto check_header_out;
@@ -929,13 +929,13 @@ static void handle_info(void)
else
continue;
- if (!memcmp(header[i], "Subject", 7)) {
+ if (!strcmp(header[i], "Subject")) {
if (!keep_subject) {
cleanup_subject(hdr);
cleanup_space(hdr);
}
output_header_lines(fout, "Subject", hdr);
- } else if (!memcmp(header[i], "From", 4)) {
+ } else if (!strcmp(header[i], "From")) {
cleanup_space(hdr);
handle_from(hdr);
fprintf(fout, "Author: %s\n", name.buf);
diff --git a/builtin/merge.c b/builtin/merge.c
index b11a528ce5..8763b2efa2 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -220,7 +220,7 @@ static struct option builtin_merge_options[] = {
OPT_BOOL(0, "abort", &abort_current_merge,
N_("abort the current in-progress merge")),
OPT_SET_INT(0, "progress", &show_progress, N_("force progress reporting"), 1),
- { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key id"),
+ { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key-id"),
N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
OPT_BOOL(0, "overwrite-ignore", &overwrite_ignore, N_("update ignored files (default)")),
OPT_END()
@@ -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);
@@ -849,8 +852,8 @@ static int merge_trivial(struct commit *head, struct commit_list *remoteheads)
parent->next->item = remoteheads->item;
parent->next->next = NULL;
prepare_to_commit(remoteheads);
- if (commit_tree(&merge_msg, result_tree, parent, result_commit, NULL,
- sign_commit))
+ if (commit_tree(merge_msg.buf, merge_msg.len, result_tree, parent,
+ result_commit, NULL, sign_commit))
die(_("failed to write commit object"));
finish(head, remoteheads, result_commit, "In-index merge");
drop_save();
@@ -874,8 +877,8 @@ static int finish_automerge(struct commit *head,
commit_list_insert(head, &parents);
strbuf_addch(&merge_msg, '\n');
prepare_to_commit(remoteheads);
- if (commit_tree(&merge_msg, result_tree, parents, result_commit,
- NULL, sign_commit))
+ if (commit_tree(merge_msg.buf, merge_msg.len, result_tree, parents,
+ result_commit, NULL, sign_commit))
die(_("failed to write commit object"));
strbuf_addf(&buf, "Merge made by the '%s' strategy.", wt_strategy);
finish(head, remoteheads, result_commit, buf.buf);
diff --git a/builtin/mktree.c b/builtin/mktree.c
index f92ba404ab..a964d6be52 100644
--- a/builtin/mktree.c
+++ b/builtin/mktree.c
@@ -23,10 +23,7 @@ static void append_to_tree(unsigned mode, unsigned char *sha1, char *path)
if (strchr(path, '/'))
die("path %s contains slash", path);
- if (alloc <= used) {
- alloc = alloc_nr(used);
- entries = xrealloc(entries, sizeof(*entries) * alloc);
- }
+ ALLOC_GROW(entries, used + 1, alloc);
ent = entries[used++] = xmalloc(sizeof(**entries) + len + 1);
ent->mode = mode;
ent->len = len;
diff --git a/builtin/mv.c b/builtin/mv.c
index 45e57f307b..180ef99127 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -162,7 +162,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
if (strncmp(path, src_w_slash, len_w_slash))
break;
}
- free((char *)src_w_slash);
+ if (src_w_slash != src)
+ free((char *)src_w_slash);
if (last - first < 1)
bad = _("source directory is empty");
@@ -202,7 +203,8 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
}
} else if (cache_name_pos(src, length) < 0)
bad = _("not under version control");
- else if (lstat(dst, &st) == 0) {
+ else if (lstat(dst, &st) == 0 &&
+ (!ignore_case || strcasecmp(src, dst))) {
bad = _("destination exists");
if (force) {
/*
diff --git a/builtin/name-rev.c b/builtin/name-rev.c
index 0b21d7e5b2..c824d4ec5f 100644
--- a/builtin/name-rev.c
+++ b/builtin/name-rev.c
@@ -87,7 +87,7 @@ static int subpath_matches(const char *path, const char *filter)
const char *subpath = path;
while (subpath) {
- if (!fnmatch(filter, subpath, 0))
+ if (!wildmatch(filter, subpath, 0, NULL))
return subpath - path;
subpath = strchr(subpath, '/');
if (subpath)
diff --git a/builtin/notes.c b/builtin/notes.c
index 2b24d059b5..39c8573cde 100644
--- a/builtin/notes.c
+++ b/builtin/notes.c
@@ -269,7 +269,11 @@ static int parse_reuse_arg(const struct option *opt, const char *arg, int unset)
die(_("Failed to resolve '%s' as a valid ref."), arg);
if (!(buf = read_sha1_file(object, &type, &len)) || !len) {
free(buf);
- die(_("Failed to read object '%s'."), arg);;
+ die(_("Failed to read object '%s'."), arg);
+ }
+ if (type != OBJ_BLOB) {
+ free(buf);
+ die(_("Cannot read note data from non-blob object '%s'."), arg);
}
strbuf_add(&(msg->buf), buf, len);
free(buf);
@@ -935,7 +939,7 @@ int cmd_notes(int argc, const char **argv, const char *prefix)
int result;
const char *override_notes_ref = NULL;
struct option options[] = {
- OPT_STRING(0, "ref", &override_notes_ref, N_("notes_ref"),
+ OPT_STRING(0, "ref", &override_notes_ref, N_("notes-ref"),
N_("use notes from <notes_ref>")),
OPT_END()
};
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index ef1f20ea94..de36c60ca1 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -14,10 +14,12 @@
#include "diff.h"
#include "revision.h"
#include "list-objects.h"
+#include "pack-objects.h"
#include "progress.h"
#include "refs.h"
#include "streaming.h"
#include "thread-utils.h"
+#include "pack-bitmap.h"
static const char *pack_usage[] = {
N_("git pack-objects --stdout [options...] [< ref-list | < object-list]"),
@@ -25,42 +27,15 @@ static const char *pack_usage[] = {
NULL
};
-struct object_entry {
- struct pack_idx_entry idx;
- unsigned long size; /* uncompressed size */
- struct packed_git *in_pack; /* already in pack */
- off_t in_pack_offset;
- struct object_entry *delta; /* delta base object */
- struct object_entry *delta_child; /* deltified objects who bases me */
- struct object_entry *delta_sibling; /* other deltified objects who
- * uses the same base as me
- */
- void *delta_data; /* cached delta (uncompressed) */
- unsigned long delta_size; /* delta data size (uncompressed) */
- unsigned long z_delta_size; /* delta data size (compressed) */
- enum object_type type;
- enum object_type in_pack_type; /* could be delta */
- uint32_t hash; /* name hint hash */
- unsigned char in_pack_header_size;
- unsigned preferred_base:1; /*
- * we do not pack this, but is available
- * to be used as the base object to delta
- * objects against.
- */
- unsigned no_try_delta:1;
- unsigned tagged:1; /* near the very tip of refs */
- unsigned filled:1; /* assigned write-order */
-};
-
/*
- * Objects we are going to pack are collected in objects array (dynamically
- * expanded). nr_objects & nr_alloc controls this array. They are stored
- * in the order we see -- typically rev-list --objects order that gives us
- * nice "minimum seek" order.
+ * Objects we are going to pack are collected in the `to_pack` structure.
+ * It contains an array (dynamically expanded) of the object data, and a map
+ * that can resolve SHA1s to their position in the array.
*/
-static struct object_entry *objects;
+static struct packing_data to_pack;
+
static struct pack_idx_entry **written_list;
-static uint32_t nr_objects, nr_alloc, nr_result, nr_written;
+static uint32_t nr_result, nr_written;
static int non_empty;
static int reuse_delta = 1, reuse_object = 1;
@@ -83,6 +58,14 @@ static struct progress *progress_state;
static int pack_compression_level = Z_DEFAULT_COMPRESSION;
static int pack_compression_seen;
+static struct packed_git *reuse_packfile;
+static uint32_t reuse_packfile_objects;
+static off_t reuse_packfile_offset;
+
+static int use_bitmap_index = 1;
+static int write_bitmap_index;
+static uint16_t write_bitmap_options;
+
static unsigned long delta_cache_size = 0;
static unsigned long max_delta_cache_size = 256 * 1024 * 1024;
static unsigned long cache_max_small_delta_size = 1000;
@@ -90,20 +73,28 @@ static unsigned long cache_max_small_delta_size = 1000;
static unsigned long window_memory_limit = 0;
/*
- * The object names in objects array are hashed with this hashtable,
- * to help looking up the entry by object name.
- * This hashtable is built after all the objects are seen.
- */
-static int *object_ix;
-static int object_ix_hashsz;
-static struct object_entry *locate_object_entry(const unsigned char *sha1);
-
-/*
* stats
*/
static uint32_t written, written_delta;
static uint32_t reused, reused_delta;
+/*
+ * Indexed commits
+ */
+static struct commit **indexed_commits;
+static unsigned int indexed_commits_nr;
+static unsigned int indexed_commits_alloc;
+
+static void index_commit_for_bitmap(struct commit *commit)
+{
+ if (indexed_commits_nr >= indexed_commits_alloc) {
+ indexed_commits_alloc = (indexed_commits_alloc + 32) * 2;
+ indexed_commits = xrealloc(indexed_commits,
+ indexed_commits_alloc * sizeof(struct commit *));
+ }
+
+ indexed_commits[indexed_commits_nr++] = commit;
+}
static void *get_delta(struct object_entry *entry)
{
@@ -553,12 +544,12 @@ static int mark_tagged(const char *path, const unsigned char *sha1, int flag,
void *cb_data)
{
unsigned char peeled[20];
- struct object_entry *entry = locate_object_entry(sha1);
+ struct object_entry *entry = packlist_find(&to_pack, sha1, NULL);
if (entry)
entry->tagged = 1;
if (!peel_ref(path, peeled)) {
- entry = locate_object_entry(peeled);
+ entry = packlist_find(&to_pack, peeled, NULL);
if (entry)
entry->tagged = 1;
}
@@ -633,9 +624,10 @@ static struct object_entry **compute_write_order(void)
{
unsigned int i, wo_end, last_untagged;
- struct object_entry **wo = xmalloc(nr_objects * sizeof(*wo));
+ struct object_entry **wo = xmalloc(to_pack.nr_objects * sizeof(*wo));
+ struct object_entry *objects = to_pack.objects;
- for (i = 0; i < nr_objects; i++) {
+ for (i = 0; i < to_pack.nr_objects; i++) {
objects[i].tagged = 0;
objects[i].filled = 0;
objects[i].delta_child = NULL;
@@ -647,7 +639,7 @@ static struct object_entry **compute_write_order(void)
* Make sure delta_sibling is sorted in the original
* recency order.
*/
- for (i = nr_objects; i > 0;) {
+ for (i = to_pack.nr_objects; i > 0;) {
struct object_entry *e = &objects[--i];
if (!e->delta)
continue;
@@ -665,7 +657,7 @@ static struct object_entry **compute_write_order(void)
* Give the objects in the original recency order until
* we see a tagged tip.
*/
- for (i = wo_end = 0; i < nr_objects; i++) {
+ for (i = wo_end = 0; i < to_pack.nr_objects; i++) {
if (objects[i].tagged)
break;
add_to_write_order(wo, &wo_end, &objects[i]);
@@ -675,7 +667,7 @@ static struct object_entry **compute_write_order(void)
/*
* Then fill all the tagged tips.
*/
- for (; i < nr_objects; i++) {
+ for (; i < to_pack.nr_objects; i++) {
if (objects[i].tagged)
add_to_write_order(wo, &wo_end, &objects[i]);
}
@@ -683,7 +675,7 @@ static struct object_entry **compute_write_order(void)
/*
* And then all remaining commits and tags.
*/
- for (i = last_untagged; i < nr_objects; i++) {
+ for (i = last_untagged; i < to_pack.nr_objects; i++) {
if (objects[i].type != OBJ_COMMIT &&
objects[i].type != OBJ_TAG)
continue;
@@ -693,7 +685,7 @@ static struct object_entry **compute_write_order(void)
/*
* And then all the trees.
*/
- for (i = last_untagged; i < nr_objects; i++) {
+ for (i = last_untagged; i < to_pack.nr_objects; i++) {
if (objects[i].type != OBJ_TREE)
continue;
add_to_write_order(wo, &wo_end, &objects[i]);
@@ -702,17 +694,70 @@ static struct object_entry **compute_write_order(void)
/*
* Finally all the rest in really tight order
*/
- for (i = last_untagged; i < nr_objects; i++) {
+ for (i = last_untagged; i < to_pack.nr_objects; i++) {
if (!objects[i].filled)
add_family_to_write_order(wo, &wo_end, &objects[i]);
}
- if (wo_end != nr_objects)
- die("ordered %u objects, expected %"PRIu32, wo_end, nr_objects);
+ if (wo_end != to_pack.nr_objects)
+ die("ordered %u objects, expected %"PRIu32, wo_end, to_pack.nr_objects);
return wo;
}
+static off_t write_reused_pack(struct sha1file *f)
+{
+ unsigned char buffer[8192];
+ off_t to_write, total;
+ int fd;
+
+ if (!is_pack_valid(reuse_packfile))
+ die("packfile is invalid: %s", reuse_packfile->pack_name);
+
+ fd = git_open_noatime(reuse_packfile->pack_name);
+ if (fd < 0)
+ die_errno("unable to open packfile for reuse: %s",
+ reuse_packfile->pack_name);
+
+ if (lseek(fd, sizeof(struct pack_header), SEEK_SET) == -1)
+ die_errno("unable to seek in reused packfile");
+
+ if (reuse_packfile_offset < 0)
+ reuse_packfile_offset = reuse_packfile->pack_size - 20;
+
+ total = to_write = reuse_packfile_offset - sizeof(struct pack_header);
+
+ while (to_write) {
+ int read_pack = xread(fd, buffer, sizeof(buffer));
+
+ if (read_pack <= 0)
+ die_errno("unable to read from reused packfile");
+
+ if (read_pack > to_write)
+ read_pack = to_write;
+
+ sha1write(f, buffer, read_pack);
+ to_write -= read_pack;
+
+ /*
+ * We don't know the actual number of objects written,
+ * only how many bytes written, how many bytes total, and
+ * how many objects total. So we can fake it by pretending all
+ * objects we are writing are the same size. This gives us a
+ * smooth progress meter, and at the end it matches the true
+ * answer.
+ */
+ written = reuse_packfile_objects *
+ (((double)(total - to_write)) / total);
+ display_progress(progress_state, written);
+ }
+
+ close(fd);
+ written = reuse_packfile_objects;
+ display_progress(progress_state, written);
+ return reuse_packfile_offset - sizeof(struct pack_header);
+}
+
static void write_pack_file(void)
{
uint32_t i = 0, j;
@@ -723,8 +768,8 @@ static void write_pack_file(void)
struct object_entry **write_order;
if (progress > pack_to_stdout)
- progress_state = start_progress("Writing objects", nr_result);
- written_list = xmalloc(nr_objects * sizeof(*written_list));
+ progress_state = start_progress(_("Writing objects"), nr_result);
+ written_list = xmalloc(to_pack.nr_objects * sizeof(*written_list));
write_order = compute_write_order();
do {
@@ -737,8 +782,17 @@ static void write_pack_file(void)
f = create_tmp_packfile(&pack_tmp_name);
offset = write_pack_header(f, nr_remaining);
+
+ if (reuse_packfile) {
+ off_t packfile_size;
+ assert(pack_to_stdout);
+
+ packfile_size = write_reused_pack(f);
+ offset += packfile_size;
+ }
+
nr_written = 0;
- for (; i < nr_objects; i++) {
+ for (; i < to_pack.nr_objects; i++) {
struct object_entry *e = write_order[i];
if (write_one(f, e, &offset) == WRITE_ONE_BREAK)
break;
@@ -762,7 +816,7 @@ static void write_pack_file(void)
if (!pack_to_stdout) {
struct stat st;
- char tmpname[PATH_MAX];
+ struct strbuf tmpname = STRBUF_INIT;
/*
* Packs are runtime accessed in their mtime
@@ -782,16 +836,35 @@ static void write_pack_file(void)
utb.modtime = --last_mtime;
if (utime(pack_tmp_name, &utb) < 0)
warning("failed utime() on %s: %s",
- tmpname, strerror(errno));
+ pack_tmp_name, strerror(errno));
}
- /* Enough space for "-<sha-1>.pack"? */
- if (sizeof(tmpname) <= strlen(base_name) + 50)
- die("pack base name '%s' too long", base_name);
- snprintf(tmpname, sizeof(tmpname), "%s-", base_name);
- finish_tmp_packfile(tmpname, pack_tmp_name,
+ strbuf_addf(&tmpname, "%s-", base_name);
+
+ if (write_bitmap_index) {
+ bitmap_writer_set_checksum(sha1);
+ bitmap_writer_build_type_index(written_list, nr_written);
+ }
+
+ finish_tmp_packfile(&tmpname, pack_tmp_name,
written_list, nr_written,
&pack_idx_opts, sha1);
+
+ if (write_bitmap_index) {
+ strbuf_addf(&tmpname, "%s.bitmap", sha1_to_hex(sha1));
+
+ stop_progress(&progress_state);
+
+ bitmap_writer_show_progress(progress);
+ bitmap_writer_reuse_bitmaps(&to_pack);
+ bitmap_writer_select_commits(indexed_commits, indexed_commits_nr, -1);
+ bitmap_writer_build(&to_pack);
+ bitmap_writer_finish(written_list, nr_written,
+ tmpname.buf, write_bitmap_options);
+ write_bitmap_index = 0;
+ }
+
+ strbuf_release(&tmpname);
free(pack_tmp_name);
puts(sha1_to_hex(sha1));
}
@@ -801,7 +874,7 @@ static void write_pack_file(void)
written_list[j]->offset = (off_t)-1;
}
nr_remaining -= nr_written;
- } while (nr_remaining && i < nr_objects);
+ } while (nr_remaining && i < to_pack.nr_objects);
free(written_list);
free(write_order);
@@ -811,73 +884,6 @@ static void write_pack_file(void)
written, nr_result);
}
-static int locate_object_entry_hash(const unsigned char *sha1)
-{
- int i;
- unsigned int ui;
- memcpy(&ui, sha1, sizeof(unsigned int));
- i = ui % object_ix_hashsz;
- while (0 < object_ix[i]) {
- if (!hashcmp(sha1, objects[object_ix[i] - 1].idx.sha1))
- return i;
- if (++i == object_ix_hashsz)
- i = 0;
- }
- return -1 - i;
-}
-
-static struct object_entry *locate_object_entry(const unsigned char *sha1)
-{
- int i;
-
- if (!object_ix_hashsz)
- return NULL;
-
- i = locate_object_entry_hash(sha1);
- if (0 <= i)
- return &objects[object_ix[i]-1];
- return NULL;
-}
-
-static void rehash_objects(void)
-{
- uint32_t i;
- struct object_entry *oe;
-
- object_ix_hashsz = nr_objects * 3;
- if (object_ix_hashsz < 1024)
- object_ix_hashsz = 1024;
- object_ix = xrealloc(object_ix, sizeof(int) * object_ix_hashsz);
- memset(object_ix, 0, sizeof(int) * object_ix_hashsz);
- for (i = 0, oe = objects; i < nr_objects; i++, oe++) {
- int ix = locate_object_entry_hash(oe->idx.sha1);
- if (0 <= ix)
- continue;
- ix = -1 - ix;
- object_ix[ix] = i + 1;
- }
-}
-
-static uint32_t name_hash(const char *name)
-{
- uint32_t c, hash = 0;
-
- if (!name)
- return 0;
-
- /*
- * This effectively just creates a sortable number from the
- * last sixteen non-whitespace characters. Last characters
- * count "most", so things that end in ".c" sort together.
- */
- while ((c = *name++) != 0) {
- if (isspace(c))
- continue;
- hash = (hash >> 2) + (c << 24);
- }
- return hash;
-}
-
static void setup_delta_attr_check(struct git_attr_check *check)
{
static struct git_attr *attr_delta;
@@ -900,42 +906,69 @@ static int no_try_delta(const char *path)
return 0;
}
-static int add_object_entry(const unsigned char *sha1, enum object_type type,
- const char *name, int exclude)
+/*
+ * When adding an object, check whether we have already added it
+ * to our packing list. If so, we can skip. However, if we are
+ * being asked to excludei t, but the previous mention was to include
+ * it, make sure to adjust its flags and tweak our numbers accordingly.
+ *
+ * As an optimization, we pass out the index position where we would have
+ * found the item, since that saves us from having to look it up again a
+ * few lines later when we want to add the new entry.
+ */
+static int have_duplicate_entry(const unsigned char *sha1,
+ int exclude,
+ uint32_t *index_pos)
{
struct object_entry *entry;
- struct packed_git *p, *found_pack = NULL;
- off_t found_offset = 0;
- int ix;
- uint32_t hash = name_hash(name);
-
- ix = nr_objects ? locate_object_entry_hash(sha1) : -1;
- if (ix >= 0) {
- if (exclude) {
- entry = objects + object_ix[ix] - 1;
- if (!entry->preferred_base)
- nr_result--;
- entry->preferred_base = 1;
- }
+
+ entry = packlist_find(&to_pack, sha1, index_pos);
+ if (!entry)
return 0;
+
+ if (exclude) {
+ if (!entry->preferred_base)
+ nr_result--;
+ entry->preferred_base = 1;
}
+ return 1;
+}
+
+/*
+ * Check whether we want the object in the pack (e.g., we do not want
+ * objects found in non-local stores if the "--local" option was used).
+ *
+ * As a side effect of this check, we will find the packed version of this
+ * object, if any. We therefore pass out the pack information to avoid having
+ * to look it up again later.
+ */
+static int want_object_in_pack(const unsigned char *sha1,
+ int exclude,
+ struct packed_git **found_pack,
+ off_t *found_offset)
+{
+ struct packed_git *p;
+
if (!exclude && local && has_loose_object_nonlocal(sha1))
return 0;
+ *found_pack = NULL;
+ *found_offset = 0;
+
for (p = packed_git; p; p = p->next) {
off_t offset = find_pack_entry_one(sha1, p);
if (offset) {
- if (!found_pack) {
+ if (!*found_pack) {
if (!is_pack_valid(p)) {
warning("packfile %s cannot be accessed", p->pack_name);
continue;
}
- found_offset = offset;
- found_pack = p;
+ *found_offset = offset;
+ *found_pack = p;
}
if (exclude)
- break;
+ return 1;
if (incremental)
return 0;
if (local && !p->pack_local)
@@ -945,14 +978,21 @@ static int add_object_entry(const unsigned char *sha1, enum object_type type,
}
}
- if (nr_objects >= nr_alloc) {
- nr_alloc = (nr_alloc + 1024) * 3 / 2;
- objects = xrealloc(objects, nr_alloc * sizeof(*entry));
- }
+ return 1;
+}
- entry = objects + nr_objects++;
- memset(entry, 0, sizeof(*entry));
- hashcpy(entry->idx.sha1, sha1);
+static void create_object_entry(const unsigned char *sha1,
+ enum object_type type,
+ uint32_t hash,
+ int exclude,
+ int no_try_delta,
+ uint32_t index_pos,
+ struct packed_git *found_pack,
+ off_t found_offset)
+{
+ struct object_entry *entry;
+
+ entry = packlist_alloc(&to_pack, sha1, index_pos);
entry->hash = hash;
if (type)
entry->type = type;
@@ -965,16 +1005,53 @@ static int add_object_entry(const unsigned char *sha1, enum object_type type,
entry->in_pack_offset = found_offset;
}
- if (object_ix_hashsz * 3 <= nr_objects * 4)
- rehash_objects();
- else
- object_ix[-1 - ix] = nr_objects;
+ entry->no_try_delta = no_try_delta;
+}
+
+static const char no_closure_warning[] = N_(
+"disabling bitmap writing, as some objects are not being packed"
+);
- display_progress(progress_state, nr_objects);
+static int add_object_entry(const unsigned char *sha1, enum object_type type,
+ const char *name, int exclude)
+{
+ struct packed_git *found_pack;
+ off_t found_offset;
+ uint32_t index_pos;
+
+ if (have_duplicate_entry(sha1, exclude, &index_pos))
+ return 0;
+
+ if (!want_object_in_pack(sha1, exclude, &found_pack, &found_offset)) {
+ /* The pack is missing an object, so it will not have closure */
+ if (write_bitmap_index) {
+ warning(_(no_closure_warning));
+ write_bitmap_index = 0;
+ }
+ return 0;
+ }
- if (name && no_try_delta(name))
- entry->no_try_delta = 1;
+ create_object_entry(sha1, type, pack_name_hash(name),
+ exclude, name && no_try_delta(name),
+ index_pos, found_pack, found_offset);
+ display_progress(progress_state, nr_result);
+ return 1;
+}
+
+static int add_object_entry_from_bitmap(const unsigned char *sha1,
+ enum object_type type,
+ int flags, uint32_t name_hash,
+ struct packed_git *pack, off_t offset)
+{
+ uint32_t index_pos;
+
+ if (have_duplicate_entry(sha1, 0, &index_pos))
+ return 0;
+
+ create_object_entry(sha1, type, name_hash, 0, 0, index_pos, pack, offset);
+
+ display_progress(progress_state, nr_result);
return 1;
}
@@ -1156,12 +1233,9 @@ static int check_pbase_path(unsigned hash)
if (0 <= pos)
return 1;
pos = -pos - 1;
- if (done_pbase_paths_alloc <= done_pbase_paths_num) {
- done_pbase_paths_alloc = alloc_nr(done_pbase_paths_alloc);
- done_pbase_paths = xrealloc(done_pbase_paths,
- done_pbase_paths_alloc *
- sizeof(unsigned));
- }
+ ALLOC_GROW(done_pbase_paths,
+ done_pbase_paths_num + 1,
+ done_pbase_paths_alloc);
done_pbase_paths_num++;
if (pos < done_pbase_paths_num)
memmove(done_pbase_paths + pos + 1,
@@ -1175,7 +1249,7 @@ static void add_preferred_base_object(const char *name)
{
struct pbase_tree *it;
int cmplen;
- unsigned hash = name_hash(name);
+ unsigned hash = pack_name_hash(name);
if (!num_preferred_base || check_pbase_path(hash))
return;
@@ -1327,7 +1401,7 @@ static void check_object(struct object_entry *entry)
break;
}
- if (base_ref && (base_entry = locate_object_entry(base_ref))) {
+ if (base_ref && (base_entry = packlist_find(&to_pack, base_ref, NULL))) {
/*
* If base_ref was set above that means we wish to
* reuse delta data, and we even found that base
@@ -1401,12 +1475,12 @@ static void get_object_details(void)
uint32_t i;
struct object_entry **sorted_by_offset;
- sorted_by_offset = xcalloc(nr_objects, sizeof(struct object_entry *));
- for (i = 0; i < nr_objects; i++)
- sorted_by_offset[i] = objects + i;
- qsort(sorted_by_offset, nr_objects, sizeof(*sorted_by_offset), pack_offset_sort);
+ sorted_by_offset = xcalloc(to_pack.nr_objects, sizeof(struct object_entry *));
+ for (i = 0; i < to_pack.nr_objects; i++)
+ sorted_by_offset[i] = to_pack.objects + i;
+ qsort(sorted_by_offset, to_pack.nr_objects, sizeof(*sorted_by_offset), pack_offset_sort);
- for (i = 0; i < nr_objects; i++) {
+ for (i = 0; i < to_pack.nr_objects; i++) {
struct object_entry *entry = sorted_by_offset[i];
check_object(entry);
if (big_file_threshold < entry->size)
@@ -2032,7 +2106,7 @@ static int add_ref_tag(const char *path, const unsigned char *sha1, int flag, vo
if (starts_with(path, "refs/tags/") && /* is a tag? */
!peel_ref(path, peeled) && /* peelable? */
- locate_object_entry(peeled)) /* object packed? */
+ packlist_find(&to_pack, peeled, NULL)) /* object packed? */
add_object_entry(sha1, OBJ_TAG, NULL, 0);
return 0;
}
@@ -2055,14 +2129,14 @@ static void prepare_pack(int window, int depth)
if (!pack_to_stdout)
do_check_packed_object_crc = 1;
- if (!nr_objects || !window || !depth)
+ if (!to_pack.nr_objects || !window || !depth)
return;
- delta_list = xmalloc(nr_objects * sizeof(*delta_list));
+ delta_list = xmalloc(to_pack.nr_objects * sizeof(*delta_list));
nr_deltas = n = 0;
- for (i = 0; i < nr_objects; i++) {
- struct object_entry *entry = objects + i;
+ for (i = 0; i < to_pack.nr_objects; i++) {
+ struct object_entry *entry = to_pack.objects + i;
if (entry->delta)
/* This happens if we decided to reuse existing
@@ -2097,7 +2171,7 @@ static void prepare_pack(int window, int depth)
if (nr_deltas && n > 1) {
unsigned nr_done = 0;
if (progress)
- progress_state = start_progress("Compressing objects",
+ progress_state = start_progress(_("Compressing objects"),
nr_deltas);
qsort(delta_list, n, sizeof(*delta_list), type_size_sort);
ll_find_deltas(delta_list, n, window+1, depth, &nr_done);
@@ -2140,6 +2214,20 @@ static int git_pack_config(const char *k, const char *v, void *cb)
cache_max_small_delta_size = git_config_int(k, v);
return 0;
}
+ if (!strcmp(k, "pack.writebitmaps")) {
+ write_bitmap_index = git_config_bool(k, v);
+ return 0;
+ }
+ if (!strcmp(k, "pack.writebitmaphashcache")) {
+ if (git_config_bool(k, v))
+ write_bitmap_options |= BITMAP_OPT_HASH_CACHE;
+ else
+ write_bitmap_options &= ~BITMAP_OPT_HASH_CACHE;
+ }
+ if (!strcmp(k, "pack.usebitmaps")) {
+ use_bitmap_index = git_config_bool(k, v);
+ return 0;
+ }
if (!strcmp(k, "pack.threads")) {
delta_search_threads = git_config_int(k, v);
if (delta_search_threads < 0)
@@ -2198,6 +2286,9 @@ static void show_commit(struct commit *commit, void *data)
{
add_object_entry(commit->object.sha1, OBJ_COMMIT, NULL, 0);
commit->object.flags |= OBJECT_ADDED;
+
+ if (write_bitmap_index)
+ index_commit_for_bitmap(commit);
}
static void show_object(struct object *obj,
@@ -2340,7 +2431,7 @@ static void loosen_unused_packed_objects(struct rev_info *revs)
for (i = 0; i < p->num_objects; i++) {
sha1 = nth_packed_object_sha1(p, i);
- if (!locate_object_entry(sha1) &&
+ if (!packlist_find(&to_pack, sha1, NULL) &&
!has_sha1_pack_kept_or_nonlocal(sha1))
if (force_object_loose(sha1, p->mtime))
die("unable to force loose object");
@@ -2348,6 +2439,35 @@ static void loosen_unused_packed_objects(struct rev_info *revs)
}
}
+/*
+ * This tracks any options which a reader of the pack might
+ * not understand, and which would therefore prevent blind reuse
+ * of what we have on disk.
+ */
+static int pack_options_allow_reuse(void)
+{
+ return allow_ofs_delta;
+}
+
+static int get_object_list_from_bitmap(struct rev_info *revs)
+{
+ if (prepare_bitmap_walk(revs) < 0)
+ return -1;
+
+ if (pack_options_allow_reuse() &&
+ !reuse_partial_packfile_from_bitmap(
+ &reuse_packfile,
+ &reuse_packfile_objects,
+ &reuse_packfile_offset)) {
+ assert(reuse_packfile_objects);
+ nr_result += reuse_packfile_objects;
+ display_progress(progress_state, nr_result);
+ }
+
+ traverse_bitmap_commit_list(&add_object_entry_from_bitmap);
+ return 0;
+}
+
static void get_object_list(int ac, const char **av)
{
struct rev_info revs;
@@ -2358,6 +2478,9 @@ static void get_object_list(int ac, const char **av)
save_commit_buffer = 0;
setup_revisions(ac, av, &revs, NULL);
+ /* make sure shallows are read */
+ is_repository_shallow();
+
while (fgets(line, sizeof(line), stdin) != NULL) {
int len = strlen(line);
if (len && line[len - 1] == '\n')
@@ -2367,6 +2490,14 @@ static void get_object_list(int ac, const char **av)
if (*line == '-') {
if (!strcmp(line, "--not")) {
flags ^= UNINTERESTING;
+ write_bitmap_index = 0;
+ continue;
+ }
+ if (starts_with(line, "--shallow ")) {
+ unsigned char sha1[20];
+ if (get_sha1_hex(line + 10, sha1))
+ die("not an SHA-1 '%s'", line + 10);
+ register_shallow(sha1);
continue;
}
die("not a rev '%s'", line);
@@ -2375,6 +2506,9 @@ static void get_object_list(int ac, const char **av)
die("bad revision '%s'", line);
}
+ if (use_bitmap_index && !get_object_list_from_bitmap(&revs))
+ return;
+
if (prepare_revision_walk(&revs))
die("revision walk setup failed");
mark_edges_uninteresting(&revs, show_edge);
@@ -2504,10 +2638,14 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
N_("pack compression level")),
OPT_SET_INT(0, "keep-true-parents", &grafts_replace_parents,
N_("do not hide commits by grafts"), 0),
+ OPT_BOOL(0, "use-bitmap-index", &use_bitmap_index,
+ N_("use a bitmap index if available to speed up counting objects")),
+ OPT_BOOL(0, "write-bitmap-index", &write_bitmap_index,
+ N_("write a bitmap index together with the pack index")),
OPT_END(),
};
- read_replace_refs = 0;
+ check_replace_refs = 0;
reset_pack_idx_option(&pack_idx_opts);
git_config(git_pack_config, NULL);
@@ -2570,13 +2708,19 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
if (keep_unreachable && unpack_unreachable)
die("--keep-unreachable and --unpack-unreachable are incompatible.");
+ if (!use_internal_rev_list || !pack_to_stdout || is_repository_shallow())
+ use_bitmap_index = 0;
+
+ if (pack_to_stdout || !rev_list_all)
+ write_bitmap_index = 0;
+
if (progress && all_progress_implied)
progress = 2;
prepare_packed_git();
if (progress)
- progress_state = start_progress("Counting objects", 0);
+ progress_state = start_progress(_("Counting objects"), 0);
if (!use_internal_rev_list)
read_object_list_from_stdin();
else {
diff --git a/builtin/prune-packed.c b/builtin/prune-packed.c
index fcf5fb6129..6879468c46 100644
--- a/builtin/prune-packed.c
+++ b/builtin/prune-packed.c
@@ -46,7 +46,7 @@ void prune_packed_objects(int opts)
strbuf_addstr(&pathname, dir);
if (opts & PRUNE_PACKED_VERBOSE)
- progress = start_progress_delay("Removing duplicate objects",
+ progress = start_progress_delay(_("Removing duplicate objects"),
256, 95, 2);
if (pathname.len && pathname.buf[pathname.len - 1] != '/')
diff --git a/builtin/prune.c b/builtin/prune.c
index de43b26cfe..144a3bdb33 100644
--- a/builtin/prune.c
+++ b/builtin/prune.c
@@ -150,7 +150,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
expire = ULONG_MAX;
save_commit_buffer = 0;
- read_replace_refs = 0;
+ check_replace_refs = 0;
init_revisions(&revs, prefix);
argc = parse_options(argc, argv, prefix, options, prune_usage, 0);
@@ -169,7 +169,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
if (show_progress == -1)
show_progress = isatty(2);
if (show_progress)
- progress = start_progress_delay("Checking connectivity", 0, 0, 2);
+ progress = start_progress_delay(_("Checking connectivity"), 0, 0, 2);
mark_reachable_objects(&revs, 1, progress);
stop_progress(&progress);
diff --git a/builtin/push.c b/builtin/push.c
index 0e50ddbb01..f8dfea41e1 100644
--- a/builtin/push.c
+++ b/builtin/push.c
@@ -26,7 +26,6 @@ static struct push_cas_option cas;
static const char **refspec;
static int refspec_nr;
static int refspec_alloc;
-static int default_matching_used;
static void add_refspec(const char *ref)
{
@@ -59,7 +58,7 @@ static const char *map_refspec(const char *ref,
}
if (push_default == PUSH_DEFAULT_UPSTREAM &&
- !prefixcmp(matched->name, "refs/heads/")) {
+ starts_with(matched->name, "refs/heads/")) {
struct branch *branch = branch_get(matched->name + 11);
if (branch->merge_nr == 1 && branch->merge[0]->src) {
struct strbuf buf = STRBUF_INIT;
@@ -204,9 +203,9 @@ static void setup_push_current(struct remote *remote, struct branch *branch)
}
static char warn_unspecified_push_default_msg[] =
-N_("push.default is unset; its implicit value is changing in\n"
+N_("push.default is unset; its implicit value has changed in\n"
"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
- "and maintain the current behavior after the default changes, use:\n"
+ "and maintain the traditional behavior, use:\n"
"\n"
" git config --global push.default matching\n"
"\n"
@@ -217,7 +216,7 @@ N_("push.default is unset; its implicit value is changing in\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"
+ "Since Git 2.0, Git defaults to the more conservative 'simple'\n"
"behavior, which only pushes the current branch to the corresponding\n"
"remote branch that 'git pull' uses to update the current branch.\n"
"\n"
@@ -247,14 +246,14 @@ static void setup_default_push_refspecs(struct remote *remote)
switch (push_default) {
default:
- case PUSH_DEFAULT_UNSPECIFIED:
- default_matching_used = 1;
- warn_unspecified_push_default_configuration();
- /* fallthru */
case PUSH_DEFAULT_MATCHING:
add_refspec(":");
break;
+ case PUSH_DEFAULT_UNSPECIFIED:
+ warn_unspecified_push_default_configuration();
+ /* fallthru */
+
case PUSH_DEFAULT_SIMPLE:
if (triangular)
setup_push_current(remote, branch);
@@ -283,12 +282,6 @@ static const char message_advice_pull_before_push[] =
"'git pull ...') before pushing again.\n"
"See the 'Note about fast-forwards' in 'git push --help' for details.");
-static const char message_advice_use_upstream[] =
- N_("Updates were rejected because a pushed branch tip is behind its remote\n"
- "counterpart. If you did not intend to push that branch, you may want to\n"
- "specify branches to push or set the 'push.default' configuration variable\n"
- "to 'simple', 'current' or 'upstream' to push only the current branch.");
-
static const char message_advice_checkout_pull_push[] =
N_("Updates were rejected because a pushed branch tip is behind its remote\n"
"counterpart. Check out this branch and integrate the remote changes\n"
@@ -317,13 +310,6 @@ static void advise_pull_before_push(void)
advise(_(message_advice_pull_before_push));
}
-static void advise_use_upstream(void)
-{
- if (!advice_push_non_ff_default || !advice_push_update_rejected)
- return;
- advise(_(message_advice_use_upstream));
-}
-
static void advise_checkout_pull_push(void)
{
if (!advice_push_non_ff_matching || !advice_push_update_rejected)
@@ -385,10 +371,7 @@ static int push_with_options(struct transport *transport, int flags)
if (reject_reasons & REJECT_NON_FF_HEAD) {
advise_pull_before_push();
} else if (reject_reasons & REJECT_NON_FF_OTHER) {
- if (default_matching_used)
- advise_use_upstream();
- else
- advise_checkout_pull_push();
+ advise_checkout_pull_push();
} else if (reject_reasons & REJECT_ALREADY_EXISTS) {
advise_ref_already_exists();
} else if (reject_reasons & REJECT_FETCH_FIRST) {
diff --git a/builtin/reflog.c b/builtin/reflog.c
index 852cff60b7..c12a9784e6 100644
--- a/builtin/reflog.c
+++ b/builtin/reflog.c
@@ -561,7 +561,7 @@ static void set_reflog_expiry_param(struct cmd_reflog_expire_cb *cb, int slot, c
return; /* both given explicitly -- nothing to tweak */
for (ent = reflog_expire_cfg; ent; ent = ent->next) {
- if (!fnmatch(ent->pattern, ref, 0)) {
+ if (!wildmatch(ent->pattern, ref, 0, NULL)) {
if (!(slot & EXPIRE_TOTAL))
cb->expire_total = ent->expire_total;
if (!(slot & EXPIRE_UNREACH))
diff --git a/builtin/remote.c b/builtin/remote.c
index b3ab4cf8f6..c9102e8fe9 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -282,7 +282,7 @@ static int config_read_branches(const char *key, const char *value, void *cb)
item = string_list_insert(&branch_list, name);
if (!item->util)
- item->util = xcalloc(sizeof(struct branch_info), 1);
+ item->util = xcalloc(1, sizeof(struct branch_info));
info = item->util;
if (type == REMOTE) {
if (info->remote_name)
@@ -398,7 +398,7 @@ static int get_push_ref_states(const struct ref *remote_refs,
item = string_list_append(&states->push,
abbrev_branch(ref->peer_ref->name));
- item->util = xcalloc(sizeof(struct push_info), 1);
+ item->util = xcalloc(1, sizeof(struct push_info));
info = item->util;
info->forced = ref->force;
info->dest = xstrdup(abbrev_branch(ref->name));
@@ -433,7 +433,7 @@ static int get_push_ref_states_noquery(struct ref_states *states)
states->push.strdup_strings = 1;
if (!remote->push_refspec_nr) {
item = string_list_append(&states->push, _("(matching)"));
- info = item->util = xcalloc(sizeof(struct push_info), 1);
+ info = item->util = xcalloc(1, sizeof(struct push_info));
info->status = PUSH_STATUS_NOTQUERIED;
info->dest = xstrdup(item->string);
}
@@ -446,7 +446,7 @@ static int get_push_ref_states_noquery(struct ref_states *states)
else
item = string_list_append(&states->push, _("(delete)"));
- info = item->util = xcalloc(sizeof(struct push_info), 1);
+ info = item->util = xcalloc(1, sizeof(struct push_info));
info->forced = spec->force;
info->status = PUSH_STATUS_NOTQUERIED;
info->dest = xstrdup(spec->dst ? spec->dst : item->string);
@@ -749,15 +749,23 @@ static int mv(int argc, const char **argv)
static int remove_branches(struct string_list *branches)
{
+ const char **branch_names;
int i, result = 0;
+
+ branch_names = xmalloc(branches->nr * sizeof(*branch_names));
+ for (i = 0; i < branches->nr; i++)
+ branch_names[i] = branches->items[i].string;
+ result |= repack_without_refs(branch_names, branches->nr);
+ free(branch_names);
+
for (i = 0; i < branches->nr; i++) {
struct string_list_item *item = branches->items + i;
const char *refname = item->string;
- unsigned char *sha1 = item->util;
- if (delete_ref(refname, sha1, 0))
+ if (delete_ref(refname, NULL, 0))
result |= error(_("Could not remove branch %s"), refname);
}
+
return result;
}
@@ -789,10 +797,6 @@ static int rm(int argc, const char **argv)
known_remotes.to_delete = remote;
for_each_remote(add_known_remote, &known_remotes);
- strbuf_addf(&buf, "remote.%s", remote->name);
- if (git_config_rename_section(buf.buf, NULL) < 1)
- return error(_("Could not remove config section '%s'"), buf.buf);
-
read_branches();
for (i = 0; i < branch_list.nr; i++) {
struct string_list_item *item = branch_list.items + i;
@@ -837,6 +841,12 @@ static int rm(int argc, const char **argv)
}
string_list_clear(&skipped, 0);
+ if (!result) {
+ strbuf_addf(&buf, "remote.%s", remote->name);
+ if (git_config_rename_section(buf.buf, NULL) < 1)
+ return error(_("Could not remove config section '%s'"), buf.buf);
+ }
+
return result;
}
@@ -1303,6 +1313,8 @@ static int prune_remote(const char *remote, int dry_run)
{
int result = 0, i;
struct ref_states states;
+ struct string_list delete_refs_list = STRING_LIST_INIT_NODUP;
+ const char **delete_refs;
const char *dangling_msg = dry_run
? _(" %s will become dangling!")
: _(" %s has become dangling!");
@@ -1316,11 +1328,20 @@ static int prune_remote(const char *remote, int dry_run)
states.remote->url_nr
? states.remote->url[0]
: _("(no URL)"));
+
+ delete_refs = xmalloc(states.stale.nr * sizeof(*delete_refs));
+ for (i = 0; i < states.stale.nr; i++)
+ delete_refs[i] = states.stale.items[i].util;
+ if (!dry_run)
+ result |= repack_without_refs(delete_refs, states.stale.nr);
+ free(delete_refs);
}
for (i = 0; i < states.stale.nr; i++) {
const char *refname = states.stale.items[i].util;
+ string_list_insert(&delete_refs_list, refname);
+
if (!dry_run)
result |= delete_ref(refname, NULL, 0);
@@ -1330,9 +1351,11 @@ static int prune_remote(const char *remote, int dry_run)
else
printf_ln(_(" * [pruned] %s"),
abbrev_ref(refname, "refs/remotes/"));
- warn_dangling_symref(stdout, dangling_msg, refname);
}
+ warn_dangling_symrefs(stdout, dangling_msg, &delete_refs_list);
+ string_list_clear(&delete_refs_list, 0);
+
free_remote_ref_states(&states);
return result;
}
diff --git a/builtin/repack.c b/builtin/repack.c
index bb2314c9cb..36c1cf9c25 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -9,6 +9,8 @@
#include "argv-array.h"
static int delta_base_offset = 1;
+static int pack_kept_objects = -1;
+static int write_bitmaps = -1;
static char *packdir, *packtmp;
static const char *const git_repack_usage[] = {
@@ -22,6 +24,14 @@ static int repack_config(const char *var, const char *value, void *cb)
delta_base_offset = git_config_bool(var, value);
return 0;
}
+ if (!strcmp(var, "repack.packkeptobjects")) {
+ pack_kept_objects = git_config_bool(var, value);
+ return 0;
+ }
+ if (!strcmp(var, "pack.writebitmaps")) {
+ write_bitmaps = git_config_bool(var, value);
+ return 0;
+ }
return git_default_config(var, value, cb);
}
@@ -94,7 +104,7 @@ static void get_non_kept_pack_filenames(struct string_list *fname_list)
static void remove_redundant_pack(const char *dir_name, const char *base_name)
{
- const char *exts[] = {".pack", ".idx", ".keep"};
+ const char *exts[] = {".pack", ".idx", ".keep", ".bitmap"};
int i;
struct strbuf buf = STRBUF_INIT;
size_t plen;
@@ -115,7 +125,14 @@ static void remove_redundant_pack(const char *dir_name, const char *base_name)
int cmd_repack(int argc, const char **argv, const char *prefix)
{
- const char *exts[2] = {".pack", ".idx"};
+ struct {
+ const char *name;
+ unsigned optional:1;
+ } exts[] = {
+ {".pack"},
+ {".idx"},
+ {".bitmap", 1},
+ };
struct child_process cmd;
struct string_list_item *item;
struct argv_array cmd_args = ARGV_ARRAY_INIT;
@@ -155,6 +172,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
OPT__QUIET(&quiet, N_("be quiet")),
OPT_BOOL('l', "local", &local,
N_("pass --local to git-pack-objects")),
+ OPT_BOOL('b', "write-bitmap-index", &write_bitmaps,
+ N_("write bitmap index")),
OPT_STRING(0, "unpack-unreachable", &unpack_unreachable, N_("approxidate"),
N_("with -A, do not loosen objects older than this")),
OPT_STRING(0, "window", &window, N_("n"),
@@ -165,6 +184,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
N_("limits the maximum delta depth")),
OPT_STRING(0, "max-pack-size", &max_pack_size, N_("bytes"),
N_("maximum size of each packfile")),
+ OPT_BOOL(0, "pack-kept-objects", &pack_kept_objects,
+ N_("repack objects in packs marked with .keep")),
OPT_END()
};
@@ -173,6 +194,9 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, builtin_repack_options,
git_repack_usage, 0);
+ if (pack_kept_objects < 0)
+ pack_kept_objects = write_bitmaps > 0;
+
packdir = mkpathdup("%s/pack", get_object_directory());
packtmp = mkpathdup("%s/.tmp-%d-pack", packdir, (int)getpid());
@@ -180,7 +204,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
argv_array_push(&cmd_args, "pack-objects");
argv_array_push(&cmd_args, "--keep-true-parents");
- argv_array_push(&cmd_args, "--honor-pack-keep");
+ if (!pack_kept_objects)
+ argv_array_push(&cmd_args, "--honor-pack-keep");
argv_array_push(&cmd_args, "--non-empty");
argv_array_push(&cmd_args, "--all");
argv_array_push(&cmd_args, "--reflog");
@@ -196,6 +221,9 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
argv_array_pushf(&cmd_args, "--no-reuse-delta");
if (no_reuse_object)
argv_array_pushf(&cmd_args, "--no-reuse-object");
+ if (write_bitmaps >= 0)
+ argv_array_pushf(&cmd_args, "--%swrite-bitmap-index",
+ write_bitmaps ? "" : "no-");
if (pack_everything & ALL_INTO_ONE) {
get_non_kept_pack_filenames(&existing_packs);
@@ -256,17 +284,17 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
*/
failed = 0;
for_each_string_list_item(item, &names) {
- for (ext = 0; ext < 2; ext++) {
+ for (ext = 0; ext < ARRAY_SIZE(exts); ext++) {
char *fname, *fname_old;
fname = mkpathdup("%s/pack-%s%s", packdir,
- item->string, exts[ext]);
+ item->string, exts[ext].name);
if (!file_exists(fname)) {
free(fname);
continue;
}
fname_old = mkpath("%s/old-%s%s", packdir,
- item->string, exts[ext]);
+ item->string, exts[ext].name);
if (file_exists(fname_old))
if (unlink(fname_old))
failed = 1;
@@ -313,19 +341,23 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
/* Now the ones with the same name are out of the way... */
for_each_string_list_item(item, &names) {
- for (ext = 0; ext < 2; ext++) {
+ for (ext = 0; ext < ARRAY_SIZE(exts); ext++) {
char *fname, *fname_old;
struct stat statbuffer;
+ int exists = 0;
fname = mkpathdup("%s/pack-%s%s",
- packdir, item->string, exts[ext]);
+ packdir, item->string, exts[ext].name);
fname_old = mkpathdup("%s-%s%s",
- packtmp, item->string, exts[ext]);
+ packtmp, item->string, exts[ext].name);
if (!stat(fname_old, &statbuffer)) {
statbuffer.st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH);
chmod(fname_old, statbuffer.st_mode);
+ exists = 1;
+ }
+ if (exists || !exts[ext].optional) {
+ if (rename(fname_old, fname))
+ die_errno(_("renaming '%s' failed"), fname_old);
}
- if (rename(fname_old, fname))
- die_errno(_("renaming '%s' failed"), fname_old);
free(fname);
free(fname_old);
}
@@ -333,12 +365,12 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
/* Remove the "old-" files */
for_each_string_list_item(item, &names) {
- for (ext = 0; ext < 2; ext++) {
+ for (ext = 0; ext < ARRAY_SIZE(exts); ext++) {
char *fname;
fname = mkpath("%s/old-%s%s",
packdir,
item->string,
- exts[ext]);
+ exts[ext].name);
if (remove_path(fname))
warning(_("removing '%s' failed"), fname);
}
diff --git a/builtin/replace.c b/builtin/replace.c
index 2336325ce3..b62420a01a 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -36,7 +36,7 @@ static int show_reference(const char *refname, const unsigned char *sha1,
{
struct show_data *data = cb_data;
- if (!fnmatch(data->pattern, refname, 0)) {
+ if (!wildmatch(data->pattern, refname, 0, NULL)) {
if (data->format == REPLACE_FORMAT_SHORT)
printf("%s\n", refname);
else if (data->format == REPLACE_FORMAT_MEDIUM)
@@ -178,7 +178,7 @@ int cmd_replace(int argc, const char **argv, const char *prefix)
OPT_END()
};
- read_replace_refs = 0;
+ check_replace_refs = 0;
argc = parse_options(argc, argv, prefix, options, git_replace_usage, 0);
diff --git a/builtin/rerere.c b/builtin/rerere.c
index 4e51addb3e..98eb8c5404 100644
--- a/builtin/rerere.c
+++ b/builtin/rerere.c
@@ -60,6 +60,8 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)
argc = parse_options(argc, argv, prefix, options, rerere_usage, 0);
+ git_config(git_xmerge_config, NULL);
+
if (autoupdate == 1)
flags = RERERE_AUTOUPDATE;
if (autoupdate == 0)
diff --git a/builtin/reset.c b/builtin/reset.c
index a991344358..6bd6245821 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -93,7 +93,7 @@ static int reset_index(const unsigned char *sha1, int reset_type, int quiet)
static void print_new_head_line(struct commit *commit)
{
const char *hex, *body;
- char *msg;
+ const char *msg;
hex = find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV);
printf(_("HEAD is now at %s"), hex);
@@ -109,32 +109,41 @@ static void print_new_head_line(struct commit *commit)
}
else
printf("\n");
- logmsg_free(msg, commit);
+ unuse_commit_buffer(commit, msg);
}
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;
if (get_git_work_tree())
refresh_index(&the_index, flags, NULL, NULL,
diff --git a/builtin/rev-list.c b/builtin/rev-list.c
index 0745e2d053..ff84a825ff 100644
--- a/builtin/rev-list.c
+++ b/builtin/rev-list.c
@@ -3,6 +3,8 @@
#include "diff.h"
#include "revision.h"
#include "list-objects.h"
+#include "pack.h"
+#include "pack-bitmap.h"
#include "builtin.h"
#include "log-tree.h"
#include "graph.h"
@@ -104,7 +106,7 @@ static void show_commit(struct commit *commit, void *data)
else
putchar('\n');
- if (revs->verbose_header && commit->buffer) {
+ if (revs->verbose_header && get_cached_commit_buffer(commit, NULL)) {
struct strbuf buf = STRBUF_INIT;
struct pretty_print_context ctx = {0};
ctx.abbrev = revs->abbrev;
@@ -171,8 +173,7 @@ static void finish_commit(struct commit *commit, void *data)
free_commit_list(commit->parents);
commit->parents = NULL;
}
- free(commit->buffer);
- commit->buffer = NULL;
+ free_commit_buffer(commit);
}
static void finish_object(struct object *obj,
@@ -257,6 +258,18 @@ static int show_bisect_vars(struct rev_list_info *info, int reaches, int all)
return 0;
}
+static int show_object_fast(
+ const unsigned char *sha1,
+ enum object_type type,
+ int exclude,
+ uint32_t name_hash,
+ struct packed_git *found_pack,
+ off_t found_offset)
+{
+ fprintf(stdout, "%s\n", sha1_to_hex(sha1));
+ return 1;
+}
+
int cmd_rev_list(int argc, const char **argv, const char *prefix)
{
struct rev_info revs;
@@ -265,6 +278,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
int bisect_list = 0;
int bisect_show_vars = 0;
int bisect_find_all = 0;
+ int use_bitmap_index = 0;
git_config(git_default_config, NULL);
init_revisions(&revs, prefix);
@@ -306,6 +320,14 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
bisect_show_vars = 1;
continue;
}
+ if (!strcmp(arg, "--use-bitmap-index")) {
+ use_bitmap_index = 1;
+ continue;
+ }
+ if (!strcmp(arg, "--test-bitmap")) {
+ test_bitmap_walk(&revs);
+ return 0;
+ }
usage(rev_list_usage);
}
@@ -333,6 +355,22 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
if (bisect_list)
revs.limited = 1;
+ if (use_bitmap_index) {
+ if (revs.count && !revs.left_right && !revs.cherry_mark) {
+ uint32_t commit_count;
+ if (!prepare_bitmap_walk(&revs)) {
+ count_bitmap_commit_list(&commit_count, NULL, NULL, NULL);
+ printf("%d\n", commit_count);
+ return 0;
+ }
+ } else if (revs.tag_objects && revs.tree_objects && revs.blob_objects) {
+ if (!prepare_bitmap_walk(&revs)) {
+ traverse_bitmap_commit_list(&show_object_fast);
+ return 0;
+ }
+ }
+ }
+
if (prepare_revision_walk(&revs))
die("revision walk setup failed");
if (revs.tree_objects)
diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c
index 45901df371..1a6122d3ae 100644
--- a/builtin/rev-parse.c
+++ b/builtin/rev-parse.c
@@ -395,9 +395,10 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix)
usage[unb++] = strbuf_detach(&sb, NULL);
}
- /* parse: (<short>|<short>,<long>|<long>)[=?]? SP+ <help> */
+ /* parse: (<short>|<short>,<long>|<long>)[*=?!]*<arghint>? SP+ <help> */
while (strbuf_getline(&sb, stdin, '\n') != EOF) {
const char *s;
+ const char *end;
struct option *o;
if (!sb.len)
@@ -419,6 +420,16 @@ static int cmd_parseopt(int argc, const char **argv, const char *prefix)
o->value = &parsed;
o->flags = PARSE_OPT_NOARG;
o->callback = &parseopt_dump;
+
+ /* Possible argument name hint */
+ end = s;
+ while (s > sb.buf && strchr("*=?!", s[-1]) == NULL)
+ --s;
+ if (s != sb.buf && s != end)
+ o->argh = xmemdupz(s, end - s);
+ if (s == sb.buf)
+ s = end;
+
while (s > sb.buf && strchr("*=?!", s[-1])) {
switch (*--s) {
case '=':
diff --git a/builtin/revert.c b/builtin/revert.c
index 87659c9fdb..f9ed5bd5d0 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 05642184c5..960634dd0c 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -311,7 +311,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)
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/show-branch.c b/builtin/show-branch.c
index d9217ce1e1..d87317290c 100644
--- a/builtin/show-branch.c
+++ b/builtin/show-branch.c
@@ -450,7 +450,7 @@ static int append_matching_ref(const char *refname, const unsigned char *sha1, i
slash--;
if (!*tail)
return 0;
- if (fnmatch(match_ref_pattern, tail, 0))
+ if (wildmatch(match_ref_pattern, tail, 0, NULL))
return 0;
if (starts_with(refname, "refs/heads/"))
return append_head_ref(refname, sha1, flag, cb_data);
diff --git a/builtin/tag.c b/builtin/tag.c
index 74d3780b77..6c7c6bde9d 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -27,9 +27,16 @@ static const char * const git_tag_usage[] = {
NULL
};
+#define STRCMP_SORT 0 /* must be zero */
+#define VERCMP_SORT 1
+#define SORT_MASK 0x7fff
+#define REVERSE_SORT 0x8000
+
struct tag_filter {
const char **patterns;
int lines;
+ int sort;
+ struct string_list tags;
struct commit_list *with_commit;
};
@@ -42,7 +49,7 @@ static int match_pattern(const char **patterns, const char *ref)
if (!*patterns)
return 1;
for (; *patterns; patterns++)
- if (!fnmatch(*patterns, ref, 0))
+ if (!wildmatch(*patterns, ref, 0, NULL))
return 1;
return 0;
}
@@ -166,7 +173,10 @@ static int show_reference(const char *refname, const unsigned char *sha1,
return 0;
if (!filter->lines) {
- printf("%s\n", refname);
+ if (filter->sort)
+ string_list_append(&filter->tags, refname);
+ else
+ printf("%s\n", refname);
return 0;
}
printf("%-15s ", refname);
@@ -177,17 +187,39 @@ static int show_reference(const char *refname, const unsigned char *sha1,
return 0;
}
+static int sort_by_version(const void *a_, const void *b_)
+{
+ const struct string_list_item *a = a_;
+ const struct string_list_item *b = b_;
+ return versioncmp(a->string, b->string);
+}
+
static int list_tags(const char **patterns, int lines,
- struct commit_list *with_commit)
+ struct commit_list *with_commit, int sort)
{
struct tag_filter filter;
filter.patterns = patterns;
filter.lines = lines;
+ filter.sort = sort;
filter.with_commit = with_commit;
+ memset(&filter.tags, 0, sizeof(filter.tags));
+ filter.tags.strdup_strings = 1;
for_each_tag_ref(show_reference, (void *) &filter);
-
+ if (sort) {
+ int i;
+ if ((sort & SORT_MASK) == VERCMP_SORT)
+ qsort(filter.tags.items, filter.tags.nr,
+ sizeof(struct string_list_item), sort_by_version);
+ if (sort & REVERSE_SORT)
+ for (i = filter.tags.nr - 1; i >= 0; i--)
+ printf("%s\n", filter.tags.items[i].string);
+ else
+ for (i = 0; i < filter.tags.nr; i++)
+ printf("%s\n", filter.tags.items[i].string);
+ string_list_clear(&filter.tags, 0);
+ }
return 0;
}
@@ -427,6 +459,29 @@ static int parse_opt_points_at(const struct option *opt __attribute__((unused)),
return 0;
}
+static int parse_opt_sort(const struct option *opt, const char *arg, int unset)
+{
+ int *sort = opt->value;
+ int flags = 0;
+
+ if (*arg == '-') {
+ flags |= REVERSE_SORT;
+ arg++;
+ }
+ if (starts_with(arg, "version:")) {
+ *sort = VERCMP_SORT;
+ arg += 8;
+ } else if (starts_with(arg, "v:")) {
+ *sort = VERCMP_SORT;
+ arg += 2;
+ } else
+ *sort = STRCMP_SORT;
+ if (strcmp(arg, "refname"))
+ die(_("unsupported sort specification %s"), arg);
+ *sort |= flags;
+ return 0;
+}
+
int cmd_tag(int argc, const char **argv, const char *prefix)
{
struct strbuf buf = STRBUF_INIT;
@@ -437,7 +492,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
struct create_tag_options opt;
char *cleanup_arg = NULL;
int annotate = 0, force = 0, lines = -1;
- int cmdmode = 0;
+ int cmdmode = 0, sort = 0;
const char *msgfile = NULL, *keyid = NULL;
struct msg_arg msg = { 0, STRBUF_INIT };
struct commit_list *with_commit = NULL;
@@ -458,10 +513,14 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
OPT_BOOL('s', "sign", &opt.sign, N_("annotated and GPG-signed tag")),
OPT_STRING(0, "cleanup", &cleanup_arg, N_("mode"),
N_("how to strip spaces and #comments from message")),
- OPT_STRING('u', "local-user", &keyid, N_("key id"),
+ OPT_STRING('u', "local-user", &keyid, N_("key-id"),
N_("use another key to sign the tag")),
OPT__FORCE(&force, N_("replace the tag if exists")),
OPT_COLUMN(0, "column", &colopts, N_("show tag list in columns")),
+ {
+ OPTION_CALLBACK, 0, "sort", &sort, N_("type"), N_("sort tags"),
+ PARSE_OPT_NONEG, parse_opt_sort
+ },
OPT_GROUP(N_("Tag listing options")),
{
@@ -471,6 +530,12 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
parse_opt_with_commit, (intptr_t)"HEAD",
},
{
+ OPTION_CALLBACK, 0, "with", &with_commit, N_("commit"),
+ N_("print only tags that contain the commit"),
+ PARSE_OPT_HIDDEN | PARSE_OPT_LASTARG_DEFAULT,
+ parse_opt_with_commit, (intptr_t)"HEAD",
+ },
+ {
OPTION_CALLBACK, 0, "points-at", NULL, N_("object"),
N_("print only tags of the object"), 0, parse_opt_points_at
},
@@ -509,7 +574,9 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
copts.padding = 2;
run_column_filter(colopts, &copts);
}
- ret = list_tags(argv, lines == -1 ? 0 : lines, with_commit);
+ if (lines != -1 && sort)
+ die(_("--sort and -n are incompatible"));
+ ret = list_tags(argv, lines == -1 ? 0 : lines, with_commit, sort);
if (column_active(colopts))
stop_column_filter();
return ret;
diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c
index 62ff673f68..99cde45879 100644
--- a/builtin/unpack-objects.c
+++ b/builtin/unpack-objects.c
@@ -480,7 +480,7 @@ static void unpack_all(void)
use(sizeof(struct pack_header));
if (!quiet)
- progress = start_progress("Unpacking objects", nr_objects);
+ progress = start_progress(_("Unpacking objects"), nr_objects);
obj_list = xcalloc(nr_objects, sizeof(*obj_list));
for (i = 0; i < nr_objects; i++) {
unpack_one(i);
@@ -497,7 +497,7 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix)
int i;
unsigned char sha1[20];
- read_replace_refs = 0;
+ check_replace_refs = 0;
git_config(git_default_config, NULL);
diff --git a/builtin/update-index.c b/builtin/update-index.c
index aaa6f78f16..ebea285e1b 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -275,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)
@@ -564,6 +560,7 @@ 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, NULL))
continue;
@@ -580,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;
}
@@ -630,14 +629,45 @@ static int resolve_undo_clear_callback(const struct option *opt,
return 0;
}
+static int parse_new_style_cacheinfo(const char *arg,
+ unsigned int *mode,
+ unsigned char sha1[],
+ const char **path)
+{
+ unsigned long ul;
+ char *endp;
+
+ if (!arg)
+ return -1;
+
+ errno = 0;
+ ul = strtoul(arg, &endp, 8);
+ if (errno || endp == arg || *endp != ',' || (unsigned int) ul != ul)
+ return -1; /* not a new-style cacheinfo */
+ *mode = ul;
+ endp++;
+ if (get_sha1_hex(endp, sha1) || endp[40] != ',')
+ return -1;
+ *path = endp + 41;
+ return 0;
+}
+
static int cacheinfo_callback(struct parse_opt_ctx_t *ctx,
const struct option *opt, int unset)
{
unsigned char sha1[20];
unsigned int mode;
+ const char *path;
+ if (!parse_new_style_cacheinfo(ctx->argv[1], &mode, sha1, &path)) {
+ if (add_cacheinfo(mode, sha1, path, 0))
+ die("git update-index: --cacheinfo cannot add %s", path);
+ ctx->argv++;
+ ctx->argc--;
+ return 0;
+ }
if (ctx->argc <= 3)
- return error("option 'cacheinfo' expects three arguments");
+ return error("option 'cacheinfo' expects <mode>,<sha1>,<path>");
if (strtoul_ui(*++ctx->argv, 8, &mode) ||
get_sha1_hex(*++ctx->argv, sha1) ||
add_cacheinfo(mode, sha1, *++ctx->argv, 0))
@@ -741,9 +771,9 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
PARSE_OPT_NOARG | PARSE_OPT_NONEG,
really_refresh_callback},
{OPTION_LOWLEVEL_CALLBACK, 0, "cacheinfo", NULL,
- N_("<mode> <object> <path>"),
+ N_("<mode>,<object>,<path>"),
N_("add the specified entry to the index"),
- PARSE_OPT_NOARG | /* disallow --cacheinfo=<mode> form */
+ PARSE_OPT_NOARG | /* disallow --cacheinfo=<mode> form */
PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP,
(parse_opt_cb *) cacheinfo_callback},
{OPTION_CALLBACK, 0, "chmod", &set_executable_bit, N_("(+/-)x"),
@@ -837,11 +867,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;
@@ -880,11 +909,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/bulk-checkin.c b/bulk-checkin.c
index 118c62528b..98e651c284 100644
--- a/bulk-checkin.c
+++ b/bulk-checkin.c
@@ -4,6 +4,7 @@
#include "bulk-checkin.h"
#include "csum-file.h"
#include "pack.h"
+#include "strbuf.h"
static int pack_compression_level = Z_DEFAULT_COMPRESSION;
@@ -23,7 +24,7 @@ static struct bulk_checkin_state {
static void finish_bulk_checkin(struct bulk_checkin_state *state)
{
unsigned char sha1[20];
- char packname[PATH_MAX];
+ struct strbuf packname = STRBUF_INIT;
int i;
if (!state->f)
@@ -43,8 +44,8 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state)
close(fd);
}
- sprintf(packname, "%s/pack/pack-", get_object_directory());
- finish_tmp_packfile(packname, state->pack_tmp_name,
+ strbuf_addf(&packname, "%s/pack/pack-", get_object_directory());
+ finish_tmp_packfile(&packname, state->pack_tmp_name,
state->written, state->nr_written,
&state->pack_idx_opts, sha1);
for (i = 0; i < state->nr_written; i++)
@@ -54,6 +55,7 @@ clear_exit:
free(state->written);
memset(state, 0, sizeof(*state));
+ strbuf_release(&packname);
/* Make objects we just wrote available to ourselves */
reprepare_packed_git();
}
diff --git a/bundle.c b/bundle.c
index e99065ce42..1222952075 100644
--- a/bundle.c
+++ b/bundle.c
@@ -14,12 +14,8 @@ static const char bundle_signature[] = "# v2 git bundle\n";
static void add_to_ref_list(const unsigned char *sha1, const char *name,
struct ref_list *list)
{
- if (list->nr + 1 >= list->alloc) {
- list->alloc = alloc_nr(list->nr + 1);
- list->list = xrealloc(list->list,
- list->alloc * sizeof(list->list[0]));
- }
- memcpy(list->list[list->nr].sha1, sha1, 20);
+ ALLOC_GROW(list->list, list->nr + 1, list->alloc);
+ hashcpy(list->list[list->nr].sha1, sha1);
list->list[list->nr].name = xstrdup(name);
list->nr++;
}
@@ -124,6 +120,7 @@ static int list_refs(struct ref_list *r, int argc, const char **argv)
return 0;
}
+/* Remember to update object flag allocation in object.h */
#define PREREQ_MARK (1u<<16)
int verify_bundle(struct bundle_header *header, int verbose)
diff --git a/cache-tree.c b/cache-tree.c
index 0bbec43216..7fa524a113 100644
--- a/cache-tree.c
+++ b/cache-tree.c
@@ -75,11 +75,7 @@ static struct cache_tree_sub *find_subtree(struct cache_tree *it,
return NULL;
pos = -pos-1;
- if (it->subtree_alloc <= it->subtree_nr) {
- it->subtree_alloc = alloc_nr(it->subtree_alloc);
- it->down = xrealloc(it->down, it->subtree_alloc *
- sizeof(*it->down));
- }
+ ALLOC_GROW(it->down, it->subtree_nr + 1, it->subtree_alloc);
it->subtree_nr++;
down = xmalloc(sizeof(*down) + pathlen + 1);
@@ -121,11 +117,11 @@ void cache_tree_invalidate_path(struct cache_tree *it, const char *path)
if (!it)
return;
- slash = strchr(path, '/');
+ slash = strchrnul(path, '/');
+ namelen = slash - path;
it->entry_count = -1;
- if (!slash) {
+ if (!*slash) {
int pos;
- namelen = strlen(path);
pos = subtree_pos(it, path, namelen);
if (0 <= pos) {
cache_tree_free(&it->down[pos]->cache_tree);
@@ -143,7 +139,6 @@ void cache_tree_invalidate_path(struct cache_tree *it, const char *path)
}
return;
}
- namelen = slash - path;
down = find_subtree(it, path, namelen, 0);
if (down)
cache_tree_invalidate_path(down->cache_tree, slash + 1);
@@ -554,22 +549,19 @@ static struct cache_tree *cache_tree_find(struct cache_tree *it, const char *pat
const char *slash;
struct cache_tree_sub *sub;
- slash = strchr(path, '/');
- if (!slash)
- slash = path + strlen(path);
- /* between path and slash is the name of the
- * subtree to look for.
+ slash = strchrnul(path, '/');
+ /*
+ * Between path and slash is the name of the subtree
+ * to look for.
*/
sub = find_subtree(it, path, slash - path, 0);
if (!sub)
return NULL;
it = sub->cache_tree;
- if (slash)
- while (*slash && *slash == '/')
- slash++;
- if (!slash || !*slash)
- return it; /* prefix ended with slashes */
+
path = slash;
+ while (*path == '/')
+ path++;
}
return it;
}
diff --git a/cache.h b/cache.h
index 017c487609..f23fdbee96 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,9 @@ 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;
+ unsigned char sha1[20];
};
extern struct index_state the_index;
@@ -316,7 +317,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)
@@ -434,6 +434,7 @@ extern int set_git_dir_init(const char *git_dir, const char *real_git_dir, int);
extern int init_db(const char *template_dir, unsigned int flags);
extern void sanitize_stdfds(void);
+extern int daemonize(void);
#define alloc_nr(x) (((x)+16)*3/2)
@@ -467,7 +468,6 @@ extern int unmerged_index(const struct index_state *);
extern int verify_path(const char *path);
extern struct cache_entry *index_dir_exists(struct index_state *istate, const char *name, int namelen);
extern struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int igncase);
-extern struct cache_entry *index_name_exists(struct index_state *istate, const char *name, int namelen, int igncase);
extern int index_name_pos(const struct index_state *, const char *name, int namelen);
#define ADD_CACHE_OK_TO_ADD 1 /* Ok to add */
#define ADD_CACHE_OK_TO_REPLACE 2 /* Ok to replace file/directory */
@@ -484,11 +484,11 @@ extern int remove_file_from_index(struct index_state *, const char *path);
#define ADD_CACHE_IGNORE_ERRORS 4
#define ADD_CACHE_IGNORE_REMOVAL 8
#define ADD_CACHE_INTENT 16
-#define ADD_CACHE_IMPLICIT_DOT 32 /* internal to "git add -u/-A" */
extern int add_to_index(struct index_state *, const char *path, struct stat *, int flags);
extern int add_file_to_index(struct index_state *, const char *path, int flags);
extern struct cache_entry *make_cache_entry(unsigned int mode, const unsigned char *sha1, const char *path, int stage, 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 *);
@@ -582,7 +582,17 @@ extern size_t packed_git_limit;
extern size_t delta_base_cache_limit;
extern unsigned long big_file_threshold;
extern unsigned long pack_size_limit_cfg;
-extern int read_replace_refs;
+
+/*
+ * Do replace refs need to be checked this run? This variable is
+ * initialized to true unless --no-replace-object is used or
+ * $GIT_NO_REPLACE_OBJECTS is set, but is set to false by some
+ * commands that do not want replace references to be active. As an
+ * optimization it is also set to false if replace references have
+ * been sought but there were none.
+ */
+extern int check_replace_refs;
+
extern int fsync_object_files;
extern int core_preload_index;
extern int core_apply_sparse_checkout;
@@ -663,9 +673,28 @@ extern char *git_path(const char *fmt, ...) __attribute__((format (printf, 1, 2)
extern char *git_path_submodule(const char *path, const char *fmt, ...)
__attribute__((format (printf, 2, 3)));
-extern char *sha1_file_name(const unsigned char *sha1);
+/*
+ * Return the name of the file in the local object database that would
+ * be used to store a loose object with the specified sha1. The
+ * return value is a pointer to a statically allocated buffer that is
+ * overwritten each time the function is called.
+ */
+extern const char *sha1_file_name(const unsigned char *sha1);
+
+/*
+ * Return the name of the (local) packfile with the specified sha1 in
+ * its name. The return value is a pointer to memory that is
+ * overwritten each time this function is called.
+ */
extern char *sha1_pack_name(const unsigned char *sha1);
+
+/*
+ * Return the name of the (local) pack index file with the specified
+ * sha1 in its name. The return value is a pointer to memory that is
+ * overwritten each time this function is called.
+ */
extern char *sha1_pack_index_name(const unsigned char *sha1);
+
extern const char *find_unique_abbrev(const unsigned char *sha1, int);
extern const unsigned char null_sha1[20];
@@ -793,13 +822,26 @@ static inline void *read_sha1_file(const unsigned char *sha1, enum object_type *
{
return read_sha1_file_extended(sha1, type, size, LOOKUP_REPLACE_OBJECT);
}
+
+/*
+ * This internal function is only declared here for the benefit of
+ * lookup_replace_object(). Please do not call it directly.
+ */
extern const unsigned char *do_lookup_replace_object(const unsigned char *sha1);
+
+/*
+ * If object sha1 should be replaced, return the replacement object's
+ * name (replaced recursively, if necessary). The return value is
+ * either sha1 or a pointer to a permanently-allocated value. When
+ * object replacement is suppressed, always return sha1.
+ */
static inline const unsigned char *lookup_replace_object(const unsigned char *sha1)
{
- if (!read_replace_refs)
+ if (!check_replace_refs)
return sha1;
return do_lookup_replace_object(sha1);
}
+
static inline const unsigned char *lookup_replace_object_extended(const unsigned char *sha1, unsigned flag)
{
if (!(flag & LOOKUP_REPLACE_OBJECT))
@@ -813,6 +855,7 @@ extern int hash_sha1_file(const void *buf, unsigned long len, const char *type,
extern int write_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *return_sha1);
extern int pretend_sha1_file(void *, unsigned long, enum object_type, unsigned char *);
extern int force_object_loose(const unsigned char *sha1, time_t mtime);
+extern int git_open_noatime(const char *name);
extern void *map_sha1_file(const unsigned char *sha1, unsigned long *size);
extern int unpack_sha1_header(git_zstream *stream, unsigned char *map, unsigned long mapsize, void *buffer, unsigned long bufsiz);
extern int parse_sha1_header(const char *hdr, unsigned long *sizep);
@@ -825,7 +868,19 @@ extern int check_sha1_signature(const unsigned char *sha1, void *buf, unsigned l
extern int move_temp_to_file(const char *tmpfile, const char *filename);
extern int has_sha1_pack(const unsigned char *sha1);
+
+/*
+ * Return true iff we have an object named sha1, whether local or in
+ * an alternate object database, and whether packed or loose. This
+ * function does not respect replace references.
+ */
extern int has_sha1_file(const unsigned char *sha1);
+
+/*
+ * Return true iff an alternate object database has a loose object
+ * with the specified name. This function does not respect replace
+ * references.
+ */
extern int has_loose_object_nonlocal(const unsigned char *sha1);
extern int has_pack_index(const unsigned char *sha1);
@@ -1089,17 +1144,46 @@ extern struct packed_git *find_sha1_pack(const unsigned char *sha1,
struct packed_git *packs);
extern void pack_report(void);
+
+/*
+ * mmap the index file for the specified packfile (if it is not
+ * already mmapped). Return 0 on success.
+ */
extern int open_pack_index(struct packed_git *);
+
+/*
+ * munmap the index file for the specified packfile (if it is
+ * currently mmapped).
+ */
extern void close_pack_index(struct packed_git *);
+
extern unsigned char *use_pack(struct packed_git *, struct pack_window **, off_t, unsigned long *);
extern void close_pack_windows(struct packed_git *);
extern void unuse_pack(struct pack_window **);
extern void free_pack_by_name(const char *);
extern void clear_delta_base_cache(void);
extern struct packed_git *add_packed_git(const char *, int, int);
-extern const unsigned char *nth_packed_object_sha1(struct packed_git *, uint32_t);
-extern off_t nth_packed_object_offset(const struct packed_git *, uint32_t);
-extern off_t find_pack_entry_one(const unsigned char *, struct packed_git *);
+
+/*
+ * Return the SHA-1 of the nth object within the specified packfile.
+ * Open the index if it is not already open. The return value points
+ * at the SHA-1 within the mmapped index. Return NULL if there is an
+ * error.
+ */
+extern const unsigned char *nth_packed_object_sha1(struct packed_git *, uint32_t n);
+
+/*
+ * Return the offset of the nth object within the specified packfile.
+ * The index must already be opened.
+ */
+extern off_t nth_packed_object_offset(const struct packed_git *, uint32_t n);
+
+/*
+ * If the object named sha1 is present in the specified packfile,
+ * return its offset within the packfile; otherwise, return 0.
+ */
+extern off_t find_pack_entry_one(const unsigned char *sha1, struct packed_git *);
+
extern int is_pack_valid(struct packed_git *);
extern void *unpack_entry(struct packed_git *, off_t, enum object_type *, unsigned long *);
extern unsigned long unpack_object_header_buffer(const unsigned char *buf, unsigned long len, enum object_type *type, unsigned long *sizep);
@@ -1152,6 +1236,12 @@ extern int update_server_info(int);
#define CONFIG_INVALID_PATTERN 6
#define CONFIG_GENERIC_ERROR 7
+struct git_config_source {
+ unsigned int use_stdin:1;
+ const char *file;
+ const char *blob;
+};
+
typedef int (*config_fn_t)(const char *, const char *, void *);
extern int git_default_config(const char *, const char *, void *);
extern int git_config_from_file(config_fn_t fn, const char *, void *);
@@ -1161,8 +1251,7 @@ extern void git_config_push_parameter(const char *text);
extern int git_config_from_parameters(config_fn_t fn, void *data);
extern int git_config(config_fn_t fn, void *);
extern int git_config_with_options(config_fn_t fn, void *,
- const char *filename,
- const char *blob_ref,
+ struct git_config_source *config_source,
int respect_includes);
extern int git_config_early(config_fn_t fn, void *, const char *repo_config);
extern int git_parse_ulong(const char *, unsigned long *);
@@ -1237,6 +1326,8 @@ extern void fsync_or_die(int fd, const char *);
extern ssize_t read_in_full(int fd, void *buf, size_t count);
extern ssize_t write_in_full(int fd, const void *buf, size_t count);
+extern ssize_t pread_in_full(int fd, void *buf, size_t count, off_t offset);
+
static inline ssize_t write_str_in_full(int fd, const char *str)
{
return write_in_full(fd, str, strlen(str));
@@ -1266,6 +1357,7 @@ extern void *alloc_commit_node(void);
extern void *alloc_tag_node(void);
extern void *alloc_object_node(void);
extern void alloc_report(void);
+extern unsigned int alloc_commit_index(void);
/* trace.c */
__attribute__((format (printf, 1, 2)))
@@ -1373,4 +1465,6 @@ int stat_validity_check(struct stat_validity *sv, const char *path);
*/
void stat_validity_update(struct stat_validity *sv, int fd);
+int versioncmp(const char *s1, const char *s2);
+
#endif /* CACHE_H */
diff --git a/check-builtins.sh b/check-builtins.sh
index d6fe6cf174..07cff69d8e 100755
--- a/check-builtins.sh
+++ b/check-builtins.sh
@@ -14,8 +14,8 @@ sort |
bad=0
while read builtin
do
- base=`expr "$builtin" : 'git-\(.*\)'`
- x=`sed -ne 's/.*{ "'$base'", \(cmd_[^, ]*\).*/'$base' \1/p' git.c`
+ base=$(expr "$builtin" : 'git-\(.*\)')
+ x=$(sed -ne 's/.*{ "'$base'", \(cmd_[^, ]*\).*/'$base' \1/p' git.c)
if test -z "$x"
then
echo "$base is builtin but not listed in git.c command list"
diff --git a/combine-diff.c b/combine-diff.c
index 3b92c44880..fd6d63c703 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -15,11 +15,10 @@
static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr, int n, int num_parent)
{
struct diff_queue_struct *q = &diff_queued_diff;
- struct combine_diff_path *p;
- int i;
+ struct combine_diff_path *p, **tail = &curr;
+ int i, cmp;
if (!n) {
- struct combine_diff_path *list = NULL, **tail = &list;
for (i = 0; i < q->nr; i++) {
int len;
const char *path;
@@ -31,7 +30,6 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
p->path = (char *) &(p->parent[num_parent]);
memcpy(p->path, path, len);
p->path[len] = 0;
- p->len = len;
p->next = NULL;
memset(p->parent, 0,
sizeof(p->parent[0]) * num_parent);
@@ -44,31 +42,37 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
*tail = p;
tail = &p->next;
}
- return list;
+ return curr;
}
- for (p = curr; p; p = p->next) {
- int found = 0;
- if (!p->len)
+ /*
+ * paths in curr (linked list) and q->queue[] (array) are
+ * both sorted in the tree order.
+ */
+ i = 0;
+ while ((p = *tail) != NULL) {
+ cmp = ((i >= q->nr)
+ ? -1 : strcmp(p->path, q->queue[i]->two->path));
+
+ if (cmp < 0) {
+ /* p->path not in q->queue[]; drop it */
+ *tail = p->next;
+ free(p);
continue;
- for (i = 0; i < q->nr; i++) {
- const char *path;
- int len;
+ }
- if (diff_unmodified_pair(q->queue[i]))
- continue;
- path = q->queue[i]->two->path;
- len = strlen(path);
- if (len == p->len && !memcmp(path, p->path, len)) {
- found = 1;
- hashcpy(p->parent[n].sha1, q->queue[i]->one->sha1);
- p->parent[n].mode = q->queue[i]->one->mode;
- p->parent[n].status = q->queue[i]->status;
- break;
- }
+ if (cmp > 0) {
+ /* q->queue[i] not in p->path; skip it */
+ i++;
+ continue;
}
- if (!found)
- p->len = 0;
+
+ hashcpy(p->parent[n].sha1, q->queue[i]->one->sha1);
+ p->parent[n].mode = q->queue[i]->one->mode;
+ p->parent[n].status = q->queue[i]->status;
+
+ tail = &p->next;
+ i++;
}
return curr;
}
@@ -1219,8 +1223,6 @@ void show_combined_diff(struct combine_diff_path *p,
{
struct diff_options *opt = &rev->diffopt;
- if (!p->len)
- return;
if (opt->output_format & (DIFF_FORMAT_RAW |
DIFF_FORMAT_NAME |
DIFF_FORMAT_NAME_STATUS))
@@ -1284,17 +1286,21 @@ static void handle_combined_callback(struct diff_options *opt,
q.queue = xcalloc(num_paths, sizeof(struct diff_filepair *));
q.alloc = num_paths;
q.nr = num_paths;
- for (i = 0, p = paths; p; p = p->next) {
- if (!p->len)
- continue;
+ for (i = 0, p = paths; p; p = p->next)
q.queue[i++] = combined_pair(p, num_parent);
- }
opt->format_callback(&q, opt, opt->format_callback_data);
for (i = 0; i < num_paths; i++)
free_combined_pair(q.queue[i]);
free(q.queue);
}
+static const char *path_path(void *obj)
+{
+ struct combine_diff_path *path = (struct combine_diff_path *)obj;
+
+ return path->path;
+}
+
void diff_tree_combined(const unsigned char *sha1,
const struct sha1_array *parents,
int dense,
@@ -1310,6 +1316,8 @@ void diff_tree_combined(const unsigned char *sha1,
diffopts.output_format = DIFF_FORMAT_NO_OUTPUT;
DIFF_OPT_SET(&diffopts, RECURSIVE);
DIFF_OPT_CLR(&diffopts, ALLOW_EXTERNAL);
+ /* tell diff_tree to emit paths in sorted (=tree) order */
+ diffopts.orderfile = NULL;
show_log_first = !!rev->loginfo && !rev->no_commit_id;
needsep = 0;
@@ -1331,26 +1339,51 @@ void diff_tree_combined(const unsigned char *sha1,
if (show_log_first && i == 0) {
show_log(rev);
- if (rev->verbose_header && opt->output_format)
+ if (rev->verbose_header && opt->output_format &&
+ opt->output_format != DIFF_FORMAT_NO_OUTPUT)
printf("%s%c", diff_line_prefix(opt),
opt->line_termination);
}
+
+ /* if showing diff, show it in requested order */
+ if (diffopts.output_format != DIFF_FORMAT_NO_OUTPUT &&
+ opt->orderfile) {
+ diffcore_order(opt->orderfile);
+ }
+
diff_flush(&diffopts);
}
- /* find out surviving paths */
- for (num_paths = 0, p = paths; p; p = p->next) {
- if (p->len)
- num_paths++;
+ /* find out number of surviving paths */
+ for (num_paths = 0, p = paths; p; p = p->next)
+ num_paths++;
+
+ /* order paths according to diffcore_order */
+ if (opt->orderfile && num_paths) {
+ struct obj_order *o;
+
+ o = xmalloc(sizeof(*o) * num_paths);
+ for (i = 0, p = paths; p; p = p->next, i++)
+ o[i].obj = p;
+ order_objects(opt->orderfile, path_path, o, num_paths);
+ for (i = 0; i < num_paths - 1; i++) {
+ p = o[i].obj;
+ p->next = o[i+1].obj;
+ }
+
+ p = o[num_paths-1].obj;
+ p->next = NULL;
+ paths = o[0].obj;
+ free(o);
}
+
+
if (num_paths) {
if (opt->output_format & (DIFF_FORMAT_RAW |
DIFF_FORMAT_NAME |
DIFF_FORMAT_NAME_STATUS)) {
- for (p = paths; p; p = p->next) {
- if (p->len)
- show_raw_diff(p, num_parent, rev);
- }
+ for (p = paths; p; p = p->next)
+ show_raw_diff(p, num_parent, rev);
needsep = 1;
}
else if (opt->output_format &
@@ -1363,11 +1396,9 @@ void diff_tree_combined(const unsigned char *sha1,
if (needsep)
printf("%s%c", diff_line_prefix(opt),
opt->line_termination);
- for (p = paths; p; p = p->next) {
- if (p->len)
- show_patch_diff(p, num_parent, dense,
- 0, rev);
- }
+ for (p = paths; p; p = p->next)
+ show_patch_diff(p, num_parent, dense,
+ 0, rev);
}
}
diff --git a/commit-slab.h b/commit-slab.h
index cc114b53b0..375c9c751a 100644
--- a/commit-slab.h
+++ b/commit-slab.h
@@ -117,4 +117,16 @@ static int stat_ ##slabname## realloc
* catch because GCC silently parses it by default.
*/
+/*
+ * Statically initialize a commit slab named "var". Note that this
+ * evaluates "stride" multiple times! Example:
+ *
+ * struct indegree indegrees = COMMIT_SLAB_INIT(1, indegrees);
+ *
+ */
+#define COMMIT_SLAB_INIT(stride, var) { \
+ COMMIT_SLAB_SIZE / sizeof(**((var).slab)) / (stride), \
+ (stride), 0, NULL \
+}
+
#endif /* COMMIT_SLAB_H */
diff --git a/commit.c b/commit.c
index 6bf4fe00d4..65179f96ee 100644
--- a/commit.c
+++ b/commit.c
@@ -10,26 +10,13 @@
#include "mergesort.h"
#include "commit-slab.h"
#include "prio-queue.h"
+#include "sha1-lookup.h"
static struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **);
int save_commit_buffer = 1;
const char *commit_type = "commit";
-static int commit_count;
-
-static struct commit *check_commit(struct object *obj,
- const unsigned char *sha1,
- int quiet)
-{
- if (obj->type != OBJ_COMMIT) {
- if (!quiet)
- error("Object %s is a %s, not a commit",
- sha1_to_hex(sha1), typename(obj->type));
- return NULL;
- }
- return (struct commit *) obj;
-}
struct commit *lookup_commit_reference_gently(const unsigned char *sha1,
int quiet)
@@ -38,7 +25,7 @@ struct commit *lookup_commit_reference_gently(const unsigned char *sha1,
if (!obj)
return NULL;
- return check_commit(obj, sha1, quiet);
+ return object_as_type(obj, OBJ_COMMIT, quiet);
}
struct commit *lookup_commit_reference(const unsigned char *sha1)
@@ -61,14 +48,9 @@ struct commit *lookup_commit_or_die(const unsigned char *sha1, const char *ref_n
struct commit *lookup_commit(const unsigned char *sha1)
{
struct object *obj = lookup_object(sha1);
- if (!obj) {
- struct commit *c = alloc_commit_node();
- c->index = commit_count++;
- return create_object(sha1, OBJ_COMMIT, c);
- }
- if (!obj->type)
- obj->type = OBJ_COMMIT;
- return check_commit(obj, sha1, 0);
+ if (!obj)
+ return create_object(sha1, alloc_commit_node());
+ return object_as_type(obj, OBJ_COMMIT, 0);
}
struct commit *lookup_commit_reference_by_name(const char *name)
@@ -114,23 +96,16 @@ static unsigned long parse_commit_date(const char *buf, const char *tail)
static struct commit_graft **commit_graft;
static int commit_graft_alloc, commit_graft_nr;
+static const unsigned char *commit_graft_sha1_access(size_t index, void *table)
+{
+ struct commit_graft **commit_graft_table = table;
+ return commit_graft_table[index]->sha1;
+}
+
static int commit_graft_pos(const unsigned char *sha1)
{
- int lo, hi;
- lo = 0;
- hi = commit_graft_nr;
- while (lo < hi) {
- int mi = (lo + hi) / 2;
- struct commit_graft *graft = commit_graft[mi];
- int cmp = hashcmp(sha1, graft->sha1);
- if (!cmp)
- return mi;
- if (cmp < 0)
- hi = mi;
- else
- lo = mi + 1;
- }
- return -lo - 1;
+ return sha1_pos(sha1, commit_graft, commit_graft_nr,
+ commit_graft_sha1_access);
}
int register_commit_graft(struct commit_graft *graft, int ignore_dups)
@@ -147,12 +122,8 @@ int register_commit_graft(struct commit_graft *graft, int ignore_dups)
return 1;
}
pos = -pos - 1;
- if (commit_graft_alloc <= ++commit_graft_nr) {
- commit_graft_alloc = alloc_nr(commit_graft_alloc);
- commit_graft = xrealloc(commit_graft,
- sizeof(*commit_graft) *
- commit_graft_alloc);
- }
+ ALLOC_GROW(commit_graft, commit_graft_nr + 1, commit_graft_alloc);
+ commit_graft_nr++;
if (pos < commit_graft_nr)
memmove(commit_graft + pos + 1,
commit_graft + pos,
@@ -257,6 +228,76 @@ int unregister_shallow(const unsigned char *sha1)
return 0;
}
+struct commit_buffer {
+ void *buffer;
+ unsigned long size;
+};
+define_commit_slab(buffer_slab, struct commit_buffer);
+static struct buffer_slab buffer_slab = COMMIT_SLAB_INIT(1, buffer_slab);
+
+void set_commit_buffer(struct commit *commit, void *buffer, unsigned long size)
+{
+ struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
+ v->buffer = buffer;
+ v->size = size;
+}
+
+const void *get_cached_commit_buffer(const struct commit *commit, unsigned long *sizep)
+{
+ struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
+ if (sizep)
+ *sizep = v->size;
+ return v->buffer;
+}
+
+const void *get_commit_buffer(const struct commit *commit, unsigned long *sizep)
+{
+ const void *ret = get_cached_commit_buffer(commit, sizep);
+ if (!ret) {
+ enum object_type type;
+ unsigned long size;
+ ret = read_sha1_file(commit->object.sha1, &type, &size);
+ if (!ret)
+ die("cannot read commit object %s",
+ sha1_to_hex(commit->object.sha1));
+ if (type != OBJ_COMMIT)
+ die("expected commit for %s, got %s",
+ sha1_to_hex(commit->object.sha1), typename(type));
+ if (sizep)
+ *sizep = size;
+ }
+ return ret;
+}
+
+void unuse_commit_buffer(const struct commit *commit, const void *buffer)
+{
+ struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
+ if (v->buffer != buffer)
+ free((void *)buffer);
+}
+
+void free_commit_buffer(struct commit *commit)
+{
+ struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
+ free(v->buffer);
+ v->buffer = NULL;
+ v->size = 0;
+}
+
+const void *detach_commit_buffer(struct commit *commit, unsigned long *sizep)
+{
+ struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
+ void *ret;
+
+ ret = v->buffer;
+ if (sizep)
+ *sizep = v->size;
+
+ v->buffer = NULL;
+ v->size = 0;
+ return ret;
+}
+
int parse_commit_buffer(struct commit *item, const void *buffer, unsigned long size)
{
const char *tail = buffer;
@@ -334,7 +375,7 @@ int parse_commit(struct commit *item)
}
ret = parse_commit_buffer(item, buffer, size);
if (save_commit_buffer && !ret) {
- item->buffer = buffer;
+ set_commit_buffer(item, buffer, size);
return 0;
}
free(buffer);
@@ -548,32 +589,22 @@ define_commit_slab(author_date_slab, unsigned long);
static void record_author_date(struct author_date_slab *author_date,
struct commit *commit)
{
- const char *buf, *line_end;
- char *buffer = NULL;
+ const char *buf, *line_end, *ident_line;
+ const char *buffer = get_commit_buffer(commit, NULL);
struct ident_split ident;
char *date_end;
unsigned long date;
- if (!commit->buffer) {
- unsigned long size;
- enum object_type type;
- buffer = read_sha1_file(commit->object.sha1, &type, &size);
- if (!buffer)
- return;
- }
-
- for (buf = commit->buffer ? commit->buffer : buffer;
- buf;
- buf = line_end + 1) {
+ for (buf = buffer; buf; buf = line_end + 1) {
line_end = strchrnul(buf, '\n');
- if (!starts_with(buf, "author ")) {
+ ident_line = skip_prefix(buf, "author ");
+ if (!ident_line) {
if (!line_end[0] || line_end[1] == '\n')
return; /* end of header */
continue;
}
if (split_ident_line(&ident,
- buf + strlen("author "),
- line_end - (buf + strlen("author "))) ||
+ ident_line, line_end - ident_line) ||
!ident.date_begin || !ident.date_end)
goto fail_exit; /* malformed "author" line */
break;
@@ -585,7 +616,7 @@ static void record_author_date(struct author_date_slab *author_date,
*(author_date_slab_at(author_date, commit)) = date;
fail_exit:
- free(buffer);
+ unuse_commit_buffer(commit, buffer);
}
static int compare_commits_by_author_date(const void *a_, const void *b_,
@@ -731,7 +762,7 @@ void sort_in_topological_order(struct commit_list **list, enum rev_sort_order so
/* merge-base stuff */
-/* bits #0..15 in revision.h */
+/* Remember to update object flag allocation in object.h */
#define PARENT1 (1u<<16)
#define PARENT2 (1u<<17)
#define STALE (1u<<18)
@@ -1041,7 +1072,7 @@ struct commit_list *reduce_heads(struct commit_list *heads)
p->item->object.flags |= STALE;
num_head++;
}
- array = xcalloc(sizeof(*array), num_head);
+ array = xcalloc(num_head, sizeof(*array));
for (p = heads, i = 0; p; p = p->next) {
if (p->item->object.flags & STALE) {
array[i++] = p->item;
@@ -1090,17 +1121,14 @@ static int do_sign_commit(struct strbuf *buf, const char *keyid)
return 0;
}
-int parse_signed_commit(const unsigned char *sha1,
+int parse_signed_commit(const struct commit *commit,
struct strbuf *payload, struct strbuf *signature)
{
+
unsigned long size;
- enum object_type type;
- char *buffer = read_sha1_file(sha1, &type, &size);
+ const char *buffer = get_commit_buffer(commit, &size);
int in_signature, saw_signature = -1;
- char *line, *tail;
-
- if (!buffer || type != OBJ_COMMIT)
- goto cleanup;
+ const char *line, *tail;
line = buffer;
tail = buffer + size;
@@ -1108,7 +1136,7 @@ int parse_signed_commit(const unsigned char *sha1,
saw_signature = 0;
while (line < tail) {
const char *sig = NULL;
- char *next = memchr(line, '\n', tail - line);
+ const char *next = memchr(line, '\n', tail - line);
next = next ? next + 1 : tail;
if (in_signature && line[0] == ' ')
@@ -1129,8 +1157,7 @@ int parse_signed_commit(const unsigned char *sha1,
}
line = next;
}
- cleanup:
- free(buffer);
+ unuse_commit_buffer(commit, buffer);
return saw_signature;
}
@@ -1193,10 +1220,8 @@ static void parse_gpg_output(struct signature_check *sigc)
for (i = 0; i < ARRAY_SIZE(sigcheck_gpg_status); i++) {
const char *found, *next;
- if (starts_with(buf, sigcheck_gpg_status[i].check + 1)) {
- /* At the very beginning of the buffer */
- found = buf + strlen(sigcheck_gpg_status[i].check + 1);
- } else {
+ found = skip_prefix(buf, sigcheck_gpg_status[i].check + 1);
+ if (!found) {
found = strstr(buf, sigcheck_gpg_status[i].check);
if (!found)
continue;
@@ -1223,8 +1248,7 @@ void check_commit_signature(const struct commit* commit, struct signature_check
sigc->result = 'N';
- if (parse_signed_commit(commit->object.sha1,
- &payload, &signature) <= 0)
+ if (parse_signed_commit(commit, &payload, &signature) <= 0)
goto out;
status = verify_signed_buffer(payload.buf, payload.len,
signature.buf, signature.len,
@@ -1269,11 +1293,9 @@ struct commit_extra_header *read_commit_extra_headers(struct commit *commit,
{
struct commit_extra_header *extra = NULL;
unsigned long size;
- enum object_type type;
- char *buffer = read_sha1_file(commit->object.sha1, &type, &size);
- if (buffer && type == OBJ_COMMIT)
- extra = read_commit_extra_header_lines(buffer, size, exclude);
- free(buffer);
+ const char *buffer = get_commit_buffer(commit, &size);
+ extra = read_commit_extra_header_lines(buffer, size, exclude);
+ unuse_commit_buffer(commit, buffer);
return extra;
}
@@ -1356,7 +1378,8 @@ void free_commit_extra_headers(struct commit_extra_header *extra)
}
}
-int commit_tree(const struct strbuf *msg, const unsigned char *tree,
+int commit_tree(const char *msg, size_t msg_len,
+ const unsigned char *tree,
struct commit_list *parents, unsigned char *ret,
const char *author, const char *sign_commit)
{
@@ -1364,7 +1387,7 @@ int commit_tree(const struct strbuf *msg, const unsigned char *tree,
int result;
append_merge_tag_headers(parents, &tail);
- result = commit_tree_extended(msg, tree, parents, ret,
+ result = commit_tree_extended(msg, msg_len, tree, parents, ret,
author, sign_commit, extra);
free_commit_extra_headers(extra);
return result;
@@ -1485,7 +1508,8 @@ static const char commit_utf8_warn[] =
"You may want to amend it after fixing the message, or set the config\n"
"variable i18n.commitencoding to the encoding your project uses.\n";
-int commit_tree_extended(const struct strbuf *msg, const unsigned char *tree,
+int commit_tree_extended(const char *msg, size_t msg_len,
+ const unsigned char *tree,
struct commit_list *parents, unsigned char *ret,
const char *author, const char *sign_commit,
struct commit_extra_header *extra)
@@ -1496,7 +1520,7 @@ int commit_tree_extended(const struct strbuf *msg, const unsigned char *tree,
assert_sha1_type(tree, OBJ_TREE);
- if (memchr(msg->buf, '\0', msg->len))
+ if (memchr(msg, '\0', msg_len))
return error("a NUL byte in commit log message not allowed.");
/* Not having i18n.commitencoding is the same as having utf-8 */
@@ -1535,7 +1559,7 @@ int commit_tree_extended(const struct strbuf *msg, const unsigned char *tree,
strbuf_addch(&buffer, '\n');
/* And add the comment */
- strbuf_addbuf(&buffer, msg);
+ strbuf_add(&buffer, msg, msg_len);
/* And check the encoding */
if (encoding_is_utf8 && !verify_utf8(&buffer))
diff --git a/commit.h b/commit.h
index a9f177ba48..2e1492a6e4 100644
--- a/commit.h
+++ b/commit.h
@@ -20,7 +20,6 @@ struct commit {
unsigned long date;
struct commit_list *parents;
struct tree *tree;
- char *buffer;
};
extern int save_commit_buffer;
@@ -51,6 +50,44 @@ int parse_commit_buffer(struct commit *item, const void *buffer, unsigned long s
int parse_commit(struct commit *item);
void parse_commit_or_die(struct commit *item);
+/*
+ * Associate an object buffer with the commit. The ownership of the
+ * memory is handed over to the commit, and must be free()-able.
+ */
+void set_commit_buffer(struct commit *, void *buffer, unsigned long size);
+
+/*
+ * Get any cached object buffer associated with the commit. Returns NULL
+ * if none. The resulting memory should not be freed.
+ */
+const void *get_cached_commit_buffer(const struct commit *, unsigned long *size);
+
+/*
+ * Get the commit's object contents, either from cache or by reading the object
+ * from disk. The resulting memory should not be modified, and must be given
+ * to unuse_commit_buffer when the caller is done.
+ */
+const void *get_commit_buffer(const struct commit *, unsigned long *size);
+
+/*
+ * Tell the commit subsytem that we are done with a particular commit buffer.
+ * The commit and buffer should be the input and return value, respectively,
+ * from an earlier call to get_commit_buffer. The buffer may or may not be
+ * freed by this call; callers should not access the memory afterwards.
+ */
+void unuse_commit_buffer(const struct commit *, const void *buffer);
+
+/*
+ * Free any cached object buffer associated with the commit.
+ */
+void free_commit_buffer(struct commit *);
+
+/*
+ * Disassociate any cached object buffer from the commit, but do not free it.
+ * The buffer (or NULL, if none) is returned.
+ */
+const void *detach_commit_buffer(struct commit *, unsigned long *sizep);
+
/* Find beginning and length of commit subject. */
int find_commit_subject(const char *commit_buffer, const char **subject);
@@ -115,10 +152,9 @@ struct userformat_want {
extern int has_non_ascii(const char *text);
struct rev_info; /* in revision.h, it circularly uses enum cmit_fmt */
-extern char *logmsg_reencode(const struct commit *commit,
- char **commit_encoding,
- const char *output_encoding);
-extern void logmsg_free(char *msg, const struct commit *commit);
+extern const char *logmsg_reencode(const struct commit *commit,
+ char **commit_encoding,
+ const char *output_encoding);
extern void get_commit_format(const char *arg, struct rev_info *);
extern const char *format_subject(struct strbuf *sb, const char *msg,
const char *line_separator);
@@ -261,11 +297,13 @@ struct commit_extra_header {
extern void append_merge_tag_headers(struct commit_list *parents,
struct commit_extra_header ***tail);
-extern int commit_tree(const struct strbuf *msg, const unsigned char *tree,
+extern int commit_tree(const char *msg, size_t msg_len,
+ const unsigned char *tree,
struct commit_list *parents, unsigned char *ret,
const char *author, const char *sign_commit);
-extern int commit_tree_extended(const struct strbuf *msg, const unsigned char *tree,
+extern int commit_tree_extended(const char *msg, size_t msg_len,
+ const unsigned char *tree,
struct commit_list *parents, unsigned char *ret,
const char *author, const char *sign_commit,
struct commit_extra_header *);
@@ -287,7 +325,7 @@ struct merge_remote_desc {
*/
struct commit *get_merge_parent(const char *name);
-extern int parse_signed_commit(const unsigned char *sha1,
+extern int parse_signed_commit(const struct commit *commit,
struct strbuf *message, struct strbuf *signature);
extern void print_commit_list(struct commit_list *list,
const char *format_cur,
diff --git a/compat/bswap.h b/compat/bswap.h
index 5061214f73..f6fd9a6a6c 100644
--- a/compat/bswap.h
+++ b/compat/bswap.h
@@ -17,7 +17,20 @@ static inline uint32_t default_swab32(uint32_t val)
((val & 0x000000ff) << 24));
}
+static inline uint64_t default_bswap64(uint64_t val)
+{
+ return (((val & (uint64_t)0x00000000000000ffULL) << 56) |
+ ((val & (uint64_t)0x000000000000ff00ULL) << 40) |
+ ((val & (uint64_t)0x0000000000ff0000ULL) << 24) |
+ ((val & (uint64_t)0x00000000ff000000ULL) << 8) |
+ ((val & (uint64_t)0x000000ff00000000ULL) >> 8) |
+ ((val & (uint64_t)0x0000ff0000000000ULL) >> 24) |
+ ((val & (uint64_t)0x00ff000000000000ULL) >> 40) |
+ ((val & (uint64_t)0xff00000000000000ULL) >> 56));
+}
+
#undef bswap32
+#undef bswap64
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
@@ -32,15 +45,42 @@ static inline uint32_t git_bswap32(uint32_t x)
return result;
}
+#define bswap64 git_bswap64
+#if defined(__x86_64__)
+static inline uint64_t git_bswap64(uint64_t x)
+{
+ uint64_t result;
+ if (__builtin_constant_p(x))
+ result = default_bswap64(x);
+ else
+ __asm__("bswap %q0" : "=r" (result) : "0" (x));
+ return result;
+}
+#else
+static inline uint64_t git_bswap64(uint64_t x)
+{
+ union { uint64_t i64; uint32_t i32[2]; } tmp, result;
+ if (__builtin_constant_p(x))
+ result.i64 = default_bswap64(x);
+ else {
+ tmp.i64 = x;
+ result.i32[0] = git_bswap32(tmp.i32[1]);
+ result.i32[1] = git_bswap32(tmp.i32[0]);
+ }
+ return result.i64;
+}
+#endif
+
#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
#include <stdlib.h>
#define bswap32(x) _byteswap_ulong(x)
+#define bswap64(x) _byteswap_uint64(x)
#endif
-#ifdef bswap32
+#if defined(bswap32)
#undef ntohl
#undef htonl
@@ -48,3 +88,88 @@ static inline uint32_t git_bswap32(uint32_t x)
#define htonl(x) bswap32(x)
#endif
+
+#if defined(bswap64)
+
+#undef ntohll
+#undef htonll
+#define ntohll(x) bswap64(x)
+#define htonll(x) bswap64(x)
+
+#else
+
+#undef ntohll
+#undef htonll
+
+#if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && defined(__BIG_ENDIAN)
+
+# define GIT_BYTE_ORDER __BYTE_ORDER
+# define GIT_LITTLE_ENDIAN __LITTLE_ENDIAN
+# define GIT_BIG_ENDIAN __BIG_ENDIAN
+
+#elif defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN)
+
+# define GIT_BYTE_ORDER BYTE_ORDER
+# define GIT_LITTLE_ENDIAN LITTLE_ENDIAN
+# define GIT_BIG_ENDIAN BIG_ENDIAN
+
+#else
+
+# define GIT_BIG_ENDIAN 4321
+# define GIT_LITTLE_ENDIAN 1234
+
+# if defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
+# define GIT_BYTE_ORDER GIT_BIG_ENDIAN
+# elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
+# define GIT_BYTE_ORDER GIT_LITTLE_ENDIAN
+# else
+# error "Cannot determine endianness"
+# endif
+
+#endif
+
+#if GIT_BYTE_ORDER == GIT_BIG_ENDIAN
+# define ntohll(n) (n)
+# define htonll(n) (n)
+#else
+# define ntohll(n) default_bswap64(n)
+# define htonll(n) default_bswap64(n)
+#endif
+
+#endif
+
+/*
+ * Performance might be improved if the CPU architecture is OK with
+ * unaligned 32-bit loads and a fast ntohl() is available.
+ * Otherwise fall back to byte loads and shifts which is portable,
+ * and is faster on architectures with memory alignment issues.
+ */
+
+#if defined(__i386__) || defined(__x86_64__) || \
+ defined(_M_IX86) || defined(_M_X64) || \
+ defined(__ppc__) || defined(__ppc64__) || \
+ defined(__powerpc__) || defined(__powerpc64__) || \
+ defined(__s390__) || defined(__s390x__)
+
+#define get_be16(p) ntohs(*(unsigned short *)(p))
+#define get_be32(p) ntohl(*(unsigned int *)(p))
+#define put_be32(p, v) do { *(unsigned int *)(p) = htonl(v); } while (0)
+
+#else
+
+#define get_be16(p) ( \
+ (*((unsigned char *)(p) + 0) << 8) | \
+ (*((unsigned char *)(p) + 1) << 0) )
+#define get_be32(p) ( \
+ (*((unsigned char *)(p) + 0) << 24) | \
+ (*((unsigned char *)(p) + 1) << 16) | \
+ (*((unsigned char *)(p) + 2) << 8) | \
+ (*((unsigned char *)(p) + 3) << 0) )
+#define put_be32(p, v) do { \
+ unsigned int __v = (v); \
+ *((unsigned char *)(p) + 0) = __v >> 24; \
+ *((unsigned char *)(p) + 1) = __v >> 16; \
+ *((unsigned char *)(p) + 2) = __v >> 8; \
+ *((unsigned char *)(p) + 3) = __v >> 0; } while (0)
+
+#endif
diff --git a/compat/fnmatch/fnmatch.c b/compat/fnmatch/fnmatch.c
deleted file mode 100644
index 378c467401..0000000000
--- a/compat/fnmatch/fnmatch.c
+++ /dev/null
@@ -1,494 +0,0 @@
-/* Copyright (C) 1991, 92, 93, 96, 97, 98, 99 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#if HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-/* Enable GNU extensions in fnmatch.h. */
-#ifndef _GNU_SOURCE
-# define _GNU_SOURCE 1
-#endif
-
-#include <stddef.h>
-#include <errno.h>
-#include <fnmatch.h>
-#include <ctype.h>
-
-#if HAVE_STRING_H || defined _LIBC
-# include <string.h>
-#else
-# include <strings.h>
-#endif
-
-#if defined STDC_HEADERS || defined _LIBC
-# include <stdlib.h>
-#endif
-
-/* For platforms which support the ISO C amendment 1 functionality we
- support user defined character classes. */
-#if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
-/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */
-# include <wchar.h>
-# include <wctype.h>
-#endif
-
-/* Comment out all this code if we are using the GNU C Library, and are not
- actually compiling the library itself. This code is part of the GNU C
- Library, but also included in many other GNU distributions. Compiling
- and linking in this code is a waste when using the GNU C library
- (especially if it is a shared library). Rather than having every GNU
- program understand `configure --with-gnu-libc' and omit the object files,
- it is simpler to just do this in the source for each such file. */
-
-#if defined NO_FNMATCH || defined NO_FNMATCH_CASEFOLD || \
- defined _LIBC || !defined __GNU_LIBRARY__
-
-
-# if defined STDC_HEADERS || !defined isascii
-# define ISASCII(c) 1
-# else
-# define ISASCII(c) isascii(c)
-# endif
-
-# ifdef isblank
-# define ISBLANK(c) (ISASCII (c) && isblank (c))
-# else
-# define ISBLANK(c) ((c) == ' ' || (c) == '\t')
-# endif
-# ifdef isgraph
-# define ISGRAPH(c) (ISASCII (c) && isgraph (c))
-# else
-# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
-# endif
-
-# define ISPRINT(c) (ISASCII (c) && isprint (c))
-# define ISDIGIT(c) (ISASCII (c) && isdigit (c))
-# define ISALNUM(c) (ISASCII (c) && isalnum (c))
-# define ISALPHA(c) (ISASCII (c) && isalpha (c))
-# define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
-# define ISLOWER(c) (ISASCII (c) && islower (c))
-# define ISPUNCT(c) (ISASCII (c) && ispunct (c))
-# define ISSPACE(c) (ISASCII (c) && isspace (c))
-# define ISUPPER(c) (ISASCII (c) && isupper (c))
-# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
-
-# define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
-
-# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
-/* The GNU C library provides support for user-defined character classes
- and the functions from ISO C amendment 1. */
-# ifdef CHARCLASS_NAME_MAX
-# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
-# else
-/* This shouldn't happen but some implementation might still have this
- problem. Use a reasonable default value. */
-# define CHAR_CLASS_MAX_LENGTH 256
-# endif
-
-# ifdef _LIBC
-# define IS_CHAR_CLASS(string) __wctype (string)
-# else
-# define IS_CHAR_CLASS(string) wctype (string)
-# endif
-# else
-# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */
-
-# define IS_CHAR_CLASS(string) \
- (STREQ (string, "alpha") || STREQ (string, "upper") \
- || STREQ (string, "lower") || STREQ (string, "digit") \
- || STREQ (string, "alnum") || STREQ (string, "xdigit") \
- || STREQ (string, "space") || STREQ (string, "print") \
- || STREQ (string, "punct") || STREQ (string, "graph") \
- || STREQ (string, "cntrl") || STREQ (string, "blank"))
-# endif
-
-/* Avoid depending on library functions or files
- whose names are inconsistent. */
-
-# if !defined _LIBC && !defined getenv
-extern char *getenv (const char *name);
-# endif
-
-# ifndef errno
-extern int errno;
-# endif
-
-# ifndef NULL
-# define NULL 0
-# endif
-
-/* This function doesn't exist on most systems. */
-
-# if !defined HAVE___STRCHRNUL && !defined _LIBC
-static char *
-__strchrnul (const char *s, int c)
-
-
-{
- char *result = strchr (s, c);
- if (result == NULL)
- result = strchr (s, '\0');
- return result;
-}
-# endif
-
-# ifndef internal_function
-/* Inside GNU libc we mark some function in a special way. In other
- environments simply ignore the marking. */
-# define internal_function
-# endif
-
-/* Match STRING against the filename pattern PATTERN, returning zero if
- it matches, nonzero if not. */
-static int internal_fnmatch __P ((const char *pattern, const char *string,
- int no_leading_period, int flags))
- internal_function;
-static int
-internal_function
-internal_fnmatch (const char *pattern, const char *string, int no_leading_period, int flags)
-
-
-
-
-{
- register const char *p = pattern, *n = string;
- register unsigned char c;
-
-/* Note that this evaluates C many times. */
-# ifdef _LIBC
-# define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
-# else
-# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
-# endif
-
- while ((c = *p++) != '\0')
- {
- c = FOLD (c);
-
- switch (c)
- {
- case '?':
- if (*n == '\0')
- return FNM_NOMATCH;
- else if (*n == '/' && (flags & FNM_FILE_NAME))
- return FNM_NOMATCH;
- else if (*n == '.' && no_leading_period
- && (n == string
- || (n[-1] == '/' && (flags & FNM_FILE_NAME))))
- return FNM_NOMATCH;
- break;
-
- case '\\':
- if (!(flags & FNM_NOESCAPE))
- {
- c = *p++;
- if (c == '\0')
- /* Trailing \ loses. */
- return FNM_NOMATCH;
- c = FOLD (c);
- }
- if (FOLD ((unsigned char) *n) != c)
- return FNM_NOMATCH;
- break;
-
- case '*':
- if (*n == '.' && no_leading_period
- && (n == string
- || (n[-1] == '/' && (flags & FNM_FILE_NAME))))
- return FNM_NOMATCH;
-
- for (c = *p++; c == '?' || c == '*'; c = *p++)
- {
- if (*n == '/' && (flags & FNM_FILE_NAME))
- /* A slash does not match a wildcard under FNM_FILE_NAME. */
- return FNM_NOMATCH;
- else if (c == '?')
- {
- /* A ? needs to match one character. */
- if (*n == '\0')
- /* There isn't another character; no match. */
- return FNM_NOMATCH;
- else
- /* One character of the string is consumed in matching
- this ? wildcard, so *??? won't match if there are
- less than three characters. */
- ++n;
- }
- }
-
- if (c == '\0')
- /* The wildcard(s) is/are the last element of the pattern.
- If the name is a file name and contains another slash
- this does mean it cannot match. */
- return ((flags & FNM_FILE_NAME) && strchr (n, '/') != NULL
- ? FNM_NOMATCH : 0);
- else
- {
- const char *endp;
-
- endp = __strchrnul (n, (flags & FNM_FILE_NAME) ? '/' : '\0');
-
- if (c == '[')
- {
- int flags2 = ((flags & FNM_FILE_NAME)
- ? flags : (flags & ~FNM_PERIOD));
-
- for (--p; n < endp; ++n)
- if (internal_fnmatch (p, n,
- (no_leading_period
- && (n == string
- || (n[-1] == '/'
- && (flags
- & FNM_FILE_NAME)))),
- flags2)
- == 0)
- return 0;
- }
- else if (c == '/' && (flags & FNM_FILE_NAME))
- {
- while (*n != '\0' && *n != '/')
- ++n;
- if (*n == '/'
- && (internal_fnmatch (p, n + 1, flags & FNM_PERIOD,
- flags) == 0))
- return 0;
- }
- else
- {
- int flags2 = ((flags & FNM_FILE_NAME)
- ? flags : (flags & ~FNM_PERIOD));
-
- if (c == '\\' && !(flags & FNM_NOESCAPE))
- c = *p;
- c = FOLD (c);
- for (--p; n < endp; ++n)
- if (FOLD ((unsigned char) *n) == c
- && (internal_fnmatch (p, n,
- (no_leading_period
- && (n == string
- || (n[-1] == '/'
- && (flags
- & FNM_FILE_NAME)))),
- flags2) == 0))
- return 0;
- }
- }
-
- /* If we come here no match is possible with the wildcard. */
- return FNM_NOMATCH;
-
- case '[':
- {
- /* Nonzero if the sense of the character class is inverted. */
- static int posixly_correct;
- register int not;
- char cold;
-
- if (posixly_correct == 0)
- posixly_correct = getenv ("POSIXLY_CORRECT") != NULL ? 1 : -1;
-
- if (*n == '\0')
- return FNM_NOMATCH;
-
- if (*n == '.' && no_leading_period && (n == string
- || (n[-1] == '/'
- && (flags
- & FNM_FILE_NAME))))
- return FNM_NOMATCH;
-
- if (*n == '/' && (flags & FNM_FILE_NAME))
- /* `/' cannot be matched. */
- return FNM_NOMATCH;
-
- not = (*p == '!' || (posixly_correct < 0 && *p == '^'));
- if (not)
- ++p;
-
- c = *p++;
- for (;;)
- {
- unsigned char fn = FOLD ((unsigned char) *n);
-
- if (!(flags & FNM_NOESCAPE) && c == '\\')
- {
- if (*p == '\0')
- return FNM_NOMATCH;
- c = FOLD ((unsigned char) *p);
- ++p;
-
- if (c == fn)
- goto matched;
- }
- else if (c == '[' && *p == ':')
- {
- /* Leave room for the null. */
- char str[CHAR_CLASS_MAX_LENGTH + 1];
- size_t c1 = 0;
-# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
- wctype_t wt;
-# endif
- const char *startp = p;
-
- for (;;)
- {
- if (c1 > CHAR_CLASS_MAX_LENGTH)
- /* The name is too long and therefore the pattern
- is ill-formed. */
- return FNM_NOMATCH;
-
- c = *++p;
- if (c == ':' && p[1] == ']')
- {
- p += 2;
- break;
- }
- if (c < 'a' || c >= 'z')
- {
- /* This cannot possibly be a character class name.
- Match it as a normal range. */
- p = startp;
- c = '[';
- goto normal_bracket;
- }
- str[c1++] = c;
- }
- str[c1] = '\0';
-
-# if defined _LIBC || (defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H)
- wt = IS_CHAR_CLASS (str);
- if (wt == 0)
- /* Invalid character class name. */
- return FNM_NOMATCH;
-
- if (__iswctype (__btowc ((unsigned char) *n), wt))
- goto matched;
-# else
- if ((STREQ (str, "alnum") && ISALNUM ((unsigned char) *n))
- || (STREQ (str, "alpha") && ISALPHA ((unsigned char) *n))
- || (STREQ (str, "blank") && ISBLANK ((unsigned char) *n))
- || (STREQ (str, "cntrl") && ISCNTRL ((unsigned char) *n))
- || (STREQ (str, "digit") && ISDIGIT ((unsigned char) *n))
- || (STREQ (str, "graph") && ISGRAPH ((unsigned char) *n))
- || (STREQ (str, "lower") && ISLOWER ((unsigned char) *n))
- || (STREQ (str, "print") && ISPRINT ((unsigned char) *n))
- || (STREQ (str, "punct") && ISPUNCT ((unsigned char) *n))
- || (STREQ (str, "space") && ISSPACE ((unsigned char) *n))
- || (STREQ (str, "upper") && ISUPPER ((unsigned char) *n))
- || (STREQ (str, "xdigit") && ISXDIGIT ((unsigned char) *n)))
- goto matched;
-# endif
- }
- else if (c == '\0')
- /* [ (unterminated) loses. */
- return FNM_NOMATCH;
- else
- {
- normal_bracket:
- if (FOLD (c) == fn)
- goto matched;
-
- cold = c;
- c = *p++;
-
- if (c == '-' && *p != ']')
- {
- /* It is a range. */
- unsigned char cend = *p++;
- if (!(flags & FNM_NOESCAPE) && cend == '\\')
- cend = *p++;
- if (cend == '\0')
- return FNM_NOMATCH;
-
- if (cold <= fn && fn <= FOLD (cend))
- goto matched;
-
- c = *p++;
- }
- }
-
- if (c == ']')
- break;
- }
-
- if (!not)
- return FNM_NOMATCH;
- break;
-
- matched:
- /* Skip the rest of the [...] that already matched. */
- while (c != ']')
- {
- if (c == '\0')
- /* [... (unterminated) loses. */
- return FNM_NOMATCH;
-
- c = *p++;
- if (!(flags & FNM_NOESCAPE) && c == '\\')
- {
- if (*p == '\0')
- return FNM_NOMATCH;
- /* XXX 1003.2d11 is unclear if this is right. */
- ++p;
- }
- else if (c == '[' && *p == ':')
- {
- do
- if (*++p == '\0')
- return FNM_NOMATCH;
- while (*p != ':' || p[1] == ']');
- p += 2;
- c = *p;
- }
- }
- if (not)
- return FNM_NOMATCH;
- }
- break;
-
- default:
- if (c != FOLD ((unsigned char) *n))
- return FNM_NOMATCH;
- }
-
- ++n;
- }
-
- if (*n == '\0')
- return 0;
-
- if ((flags & FNM_LEADING_DIR) && *n == '/')
- /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */
- return 0;
-
- return FNM_NOMATCH;
-
-# undef FOLD
-}
-
-
-int
-fnmatch (const char *pattern, const char *string, int flags)
-
-
-
-{
- return internal_fnmatch (pattern, string, flags & FNM_PERIOD, flags);
-}
-
-#endif /* _LIBC or not __GNU_LIBRARY__. */
diff --git a/compat/fnmatch/fnmatch.h b/compat/fnmatch/fnmatch.h
deleted file mode 100644
index cc3ec37940..0000000000
--- a/compat/fnmatch/fnmatch.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/* Copyright (C) 1991, 92, 93, 96, 97, 98, 99 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If not,
- write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
-
-#ifndef _FNMATCH_H
-#define _FNMATCH_H 1
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if defined __cplusplus || (defined __STDC__ && __STDC__) || defined WINDOWS32
-# if !defined __GLIBC__ || !defined __P
-# undef __P
-# define __P(protos) protos
-# endif
-#else /* Not C++ or ANSI C. */
-# undef __P
-# define __P(protos) ()
-/* We can get away without defining `const' here only because in this file
- it is used only inside the prototype for `fnmatch', which is elided in
- non-ANSI C where `const' is problematical. */
-#endif /* C++ or ANSI C. */
-
-#ifndef const
-# if (defined __STDC__ && __STDC__) || defined __cplusplus
-# define __const const
-# else
-# define __const
-# endif
-#endif
-
-/* We #undef these before defining them because some losing systems
- (HP-UX A.08.07 for example) define these in <unistd.h>. */
-#undef FNM_PATHNAME
-#undef FNM_NOESCAPE
-#undef FNM_PERIOD
-
-/* Bits set in the FLAGS argument to `fnmatch'. */
-#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */
-#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */
-#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */
-
-#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE
-# define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */
-# define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */
-# define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */
-#endif
-
-/* Value returned by `fnmatch' if STRING does not match PATTERN. */
-#define FNM_NOMATCH 1
-
-/* This value is returned if the implementation does not support
- `fnmatch'. Since this is not the case here it will never be
- returned but the conformance test suites still require the symbol
- to be defined. */
-#ifdef _XOPEN_SOURCE
-# define FNM_NOSYS (-1)
-#endif
-
-/* Match NAME against the filename pattern PATTERN,
- returning zero if it matches, FNM_NOMATCH if not. */
-extern int fnmatch __P ((__const char *__pattern, __const char *__name,
- int __flags));
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* fnmatch.h */
diff --git a/compat/mingw.c b/compat/mingw.c
index e9892f8ee4..363a957a1d 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -1226,8 +1226,7 @@ static int WSAAPI getaddrinfo_stub(const char *node, const char *service,
else
ai->ai_canonname = NULL;
- sin = xmalloc(ai->ai_addrlen);
- memset(sin, 0, ai->ai_addrlen);
+ sin = xcalloc(1, ai->ai_addrlen);
sin->sin_family = AF_INET;
/* Note: getaddrinfo is supposed to allow service to be a string,
* which should be looked up using getservbyname. This is
diff --git a/compat/mmap.c b/compat/mmap.c
index c9d46d1742..7f662fef7b 100644
--- a/compat/mmap.c
+++ b/compat/mmap.c
@@ -14,7 +14,7 @@ void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t of
}
while (n < length) {
- ssize_t count = pread(fd, (char *)start + n, length - n, offset + n);
+ ssize_t count = xpread(fd, (char *)start + n, length - n, offset + n);
if (count == 0) {
memset((char *)start+n, 0, length-n);
@@ -22,8 +22,6 @@ void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t of
}
if (count < 0) {
- if (errno == EAGAIN || errno == EINTR)
- continue;
free(start);
errno = EACCES;
return MAP_FAILED;
diff --git a/compat/vcbuild/scripts/clink.pl b/compat/vcbuild/scripts/clink.pl
index 4374771df2..a87d0da512 100755
--- a/compat/vcbuild/scripts/clink.pl
+++ b/compat/vcbuild/scripts/clink.pl
@@ -33,6 +33,8 @@ while (@ARGV) {
push(@args, "libeay32.lib");
} elsif ("$arg" eq "-lssl") {
push(@args, "ssleay32.lib");
+ } elsif ("$arg" eq "-lcurl") {
+ push(@args, "libcurl.lib");
} elsif ("$arg" =~ /^-L/ && "$arg" ne "-LTCG") {
$arg =~ s/^-L/-LIBPATH:/;
push(@args, $arg);
diff --git a/config.c b/config.c
index 8984ad20c7..61a9c296f4 100644
--- a/config.c
+++ b/config.c
@@ -21,6 +21,7 @@ struct config_source {
} buf;
} u;
const char *name;
+ const char *path;
int die_on_error;
int linenr;
int eof;
@@ -101,12 +102,12 @@ static int handle_path_include(const char *path, struct config_include_data *inc
if (!is_absolute_path(path)) {
char *slash;
- if (!cf || !cf->name)
+ if (!cf || !cf->path)
return error("relative config includes must come from files");
- slash = find_last_dir_sep(cf->name);
+ slash = find_last_dir_sep(cf->path);
if (slash)
- strbuf_add(&buf, cf->name, slash - cf->name + 1);
+ strbuf_add(&buf, cf->path, slash - cf->path + 1);
strbuf_addstr(&buf, path);
path = buf.buf;
}
@@ -556,6 +557,7 @@ int git_parse_ulong(const char *value, unsigned long *ret)
return 1;
}
+NORETURN
static void die_bad_number(const char *name, const char *value)
{
const char *reason = errno == ERANGE ?
@@ -667,20 +669,7 @@ static int git_default_core_config(const char *var, const char *value)
trust_ctime = git_config_bool(var, value);
return 0;
}
- if (!strcmp(var, "core.statinfo") ||
- !strcmp(var, "core.checkstat")) {
- /*
- * NEEDSWORK: statinfo was a typo in v1.8.2 that has
- * never been advertised. we will remove it at Git
- * 2.0 boundary.
- */
- if (!strcmp(var, "core.statinfo")) {
- static int warned;
- if (!warned++) {
- warning("'core.statinfo' will be removed in Git 2.0; "
- "use 'core.checkstat' instead.");
- }
- }
+ if (!strcmp(var, "core.checkstat")) {
if (!strcasecmp(value, "default"))
check_stat = 1;
else if (!strcasecmp(value, "minimal"))
@@ -973,7 +962,7 @@ static int git_default_push_config(const char *var, const char *value)
static int git_default_mailmap_config(const char *var, const char *value)
{
if (!strcmp(var, "mailmap.file"))
- return git_config_string(&git_mailmap_file, var, value);
+ return git_config_pathname(&git_mailmap_file, var, value);
if (!strcmp(var, "mailmap.blob"))
return git_config_string(&git_mailmap_blob, var, value);
@@ -1044,24 +1033,35 @@ static int do_config_from(struct config_source *top, config_fn_t fn, void *data)
return ret;
}
-int git_config_from_file(config_fn_t fn, const char *filename, void *data)
+static int do_config_from_file(config_fn_t fn,
+ const char *name, const char *path, FILE *f, void *data)
{
- int ret;
- FILE *f = fopen(filename, "r");
+ struct config_source top;
- ret = -1;
- if (f) {
- struct config_source top;
+ top.u.file = f;
+ top.name = name;
+ top.path = path;
+ top.die_on_error = 1;
+ top.do_fgetc = config_file_fgetc;
+ top.do_ungetc = config_file_ungetc;
+ top.do_ftell = config_file_ftell;
- top.u.file = f;
- top.name = filename;
- top.die_on_error = 1;
- top.do_fgetc = config_file_fgetc;
- top.do_ungetc = config_file_ungetc;
- top.do_ftell = config_file_ftell;
+ return do_config_from(&top, fn, data);
+}
+
+static int git_config_from_stdin(config_fn_t fn, void *data)
+{
+ return do_config_from_file(fn, "<stdin>", NULL, stdin, data);
+}
- ret = do_config_from(&top, fn, data);
+int git_config_from_file(config_fn_t fn, const char *filename, void *data)
+{
+ int ret = -1;
+ FILE *f;
+ f = fopen(filename, "r");
+ if (f) {
+ ret = do_config_from_file(fn, filename, filename, f, data);
fclose(f);
}
return ret;
@@ -1076,6 +1076,7 @@ int git_config_from_buf(config_fn_t fn, const char *name, const char *buf,
top.u.buf.len = len;
top.u.buf.pos = 0;
top.name = name;
+ top.path = NULL;
top.die_on_error = 0;
top.do_fgetc = config_buf_fgetc;
top.do_ungetc = config_buf_ungetc;
@@ -1184,8 +1185,7 @@ int git_config_early(config_fn_t fn, void *data, const char *repo_config)
}
int git_config_with_options(config_fn_t fn, void *data,
- const char *filename,
- const char *blob_ref,
+ struct git_config_source *config_source,
int respect_includes)
{
char *repo_config = NULL;
@@ -1203,10 +1203,12 @@ int git_config_with_options(config_fn_t fn, void *data,
* If we have a specific filename, use it. Otherwise, follow the
* regular lookup sequence.
*/
- if (filename)
- return git_config_from_file(fn, filename, data);
- else if (blob_ref)
- return git_config_from_blob_ref(fn, blob_ref, data);
+ if (config_source && config_source->use_stdin)
+ return git_config_from_stdin(fn, data);
+ else if (config_source && config_source->file)
+ return git_config_from_file(fn, config_source->file, data);
+ else if (config_source && config_source->blob)
+ return git_config_from_blob_ref(fn, config_source->blob, data);
repo_config = git_pathdup("config");
ret = git_config_early(fn, data, repo_config);
@@ -1217,7 +1219,7 @@ int git_config_with_options(config_fn_t fn, void *data,
int git_config(config_fn_t fn, void *data)
{
- return git_config_with_options(fn, data, NULL, NULL, 1);
+ return git_config_with_options(fn, data, NULL, 1);
}
/*
@@ -1546,7 +1548,7 @@ int git_config_set_multivar_in_file(const char *config_filename,
* The lock serves a purpose in addition to locking: the new
* contents of .git/config will be written into it.
*/
- lock = xcalloc(sizeof(struct lock_file), 1);
+ lock = xcalloc(1, sizeof(struct lock_file));
fd = hold_lock_file_for_update(lock, config_filename, 0);
if (fd < 0) {
error("could not lock config file %s: %s", config_filename, strerror(errno));
@@ -1801,7 +1803,7 @@ int git_config_rename_section_in_file(const char *config_filename,
if (!config_filename)
config_filename = filename_buf = git_pathdup("config");
- lock = xcalloc(sizeof(struct lock_file), 1);
+ lock = xcalloc(1, sizeof(struct lock_file));
out_fd = hold_lock_file_for_update(lock, config_filename, 0);
if (out_fd < 0) {
ret = error("could not lock config file %s", config_filename);
diff --git a/config.mak.uname b/config.mak.uname
index f3cdcbcddf..aba56dcfad 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -109,7 +109,6 @@ ifeq ($(uname_S),SunOS)
NO_MKDTEMP = YesPlease
NO_MKSTEMPS = YesPlease
NO_REGEX = YesPlease
- NO_FNMATCH_CASEFOLD = YesPlease
NO_MSGFMT_EXTENDED_OPTIONS = YesPlease
HAVE_DEV_TTY = YesPlease
ifeq ($(uname_R),5.6)
@@ -159,7 +158,6 @@ ifeq ($(uname_O),Cygwin)
NO_SYMLINK_HEAD = YesPlease
NO_IPV6 = YesPlease
OLD_ICONV = UnfortunatelyYes
- NO_THREAD_SAFE_PREAD = YesPlease
# There are conflicting reports about this.
# On some boxes NO_MMAP is needed, and not so elsewhere.
# Try commenting this out if you suspect MMAP is more efficient
@@ -261,7 +259,6 @@ ifeq ($(uname_S),IRIX)
# issue, comment out the NO_MMAP statement.
NO_MMAP = YesPlease
NO_REGEX = YesPlease
- NO_FNMATCH_CASEFOLD = YesPlease
SNPRINTF_RETURNS_BOGUS = YesPlease
SHELL_PATH = /usr/gnu/bin/bash
NEEDS_LIBGEN = YesPlease
@@ -281,7 +278,6 @@ ifeq ($(uname_S),IRIX64)
# issue, comment out the NO_MMAP statement.
NO_MMAP = YesPlease
NO_REGEX = YesPlease
- NO_FNMATCH_CASEFOLD = YesPlease
SNPRINTF_RETURNS_BOGUS = YesPlease
SHELL_PATH = /usr/gnu/bin/bash
NEEDS_LIBGEN = YesPlease
@@ -298,7 +294,6 @@ ifeq ($(uname_S),HP-UX)
NO_UNSETENV = YesPlease
NO_HSTRERROR = YesPlease
NO_SYS_SELECT_H = YesPlease
- NO_FNMATCH_CASEFOLD = YesPlease
SNPRINTF_RETURNS_BOGUS = YesPlease
NO_NSEC = YesPlease
ifeq ($(uname_R),B.11.00)
@@ -329,7 +324,6 @@ ifeq ($(uname_S),Windows)
NO_UNSETENV = YesPlease
NO_STRCASESTR = YesPlease
NO_STRLCPY = YesPlease
- NO_FNMATCH = YesPlease
NO_MEMMEM = YesPlease
# NEEDS_LIBICONV = YesPlease
NO_ICONV = YesPlease
@@ -338,7 +332,6 @@ ifeq ($(uname_S),Windows)
NO_MKSTEMPS = YesPlease
SNPRINTF_RETURNS_BOGUS = YesPlease
NO_SVN_TESTS = YesPlease
- NO_PERL_MAKEMAKER = YesPlease
RUNTIME_PREFIX = YesPlease
NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
NO_NSEC = YesPlease
@@ -347,7 +340,6 @@ ifeq ($(uname_S),Windows)
UNRELIABLE_FSTAT = UnfortunatelyYes
OBJECT_CREATION_USES_RENAMES = UnfortunatelyNeedsTo
NO_REGEX = YesPlease
- NO_CURL = YesPlease
NO_GETTEXT = YesPlease
NO_PYTHON = YesPlease
BLK_SHA1 = YesPlease
@@ -367,7 +359,7 @@ ifeq ($(uname_S),Windows)
compat/win32/dirent.o
COMPAT_CFLAGS = -D__USE_MINGW_ACCESS -DNOGDI -DHAVE_STRING_H -DHAVE_ALLOCA_H -Icompat -Icompat/regex -Icompat/win32 -DSTRIP_EXTENSION=\".exe\"
BASIC_LDFLAGS = -IGNORE:4217 -IGNORE:4049 -NOLOGO -SUBSYSTEM:CONSOLE -NODEFAULTLIB:MSVCRT.lib
- EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib
+ EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib invalidcontinue.obj
PTHREAD_LIBS =
lib =
BASIC_CFLAGS += -DPROTECT_NTFS_DEFAULT=1
@@ -392,13 +384,11 @@ ifeq ($(uname_S),Interix)
NO_INET_NTOP = YesPlease
NO_INET_PTON = YesPlease
NO_SOCKADDR_STORAGE = YesPlease
- NO_FNMATCH_CASEFOLD = YesPlease
endif
ifeq ($(uname_R),5.2)
NO_INET_NTOP = YesPlease
NO_INET_PTON = YesPlease
NO_SOCKADDR_STORAGE = YesPlease
- NO_FNMATCH_CASEFOLD = YesPlease
endif
endif
ifeq ($(uname_S),Minix)
@@ -443,7 +433,6 @@ ifeq ($(uname_S),NONSTOP_KERNEL)
NO_D_TYPE_IN_DIRENT = YesPlease
NO_HSTRERROR = YesPlease
NO_STRCASESTR = YesPlease
- NO_FNMATCH_CASEFOLD = YesPlease
NO_MEMMEM = YesPlease
NO_STRLCPY = YesPlease
NO_SETENV = YesPlease
@@ -487,7 +476,6 @@ ifneq (,$(findstring MINGW,$(uname_S)))
NO_UNSETENV = YesPlease
NO_STRCASESTR = YesPlease
NO_STRLCPY = YesPlease
- NO_FNMATCH = YesPlease
NO_MEMMEM = YesPlease
NEEDS_LIBICONV = YesPlease
NO_STRTOUMAX = YesPlease
@@ -542,7 +530,6 @@ ifeq ($(uname_S),QNX)
EXPAT_NEEDS_XMLPARSE_H = YesPlease
HAVE_STRINGS_H = YesPlease
NEEDS_SOCKET = YesPlease
- NO_FNMATCH_CASEFOLD = YesPlease
NO_GETPAGESIZE = YesPlease
NO_ICONV = YesPlease
NO_MEMMEM = YesPlease
diff --git a/configure.ac b/configure.ac
index 2f433939dc..b7112542b4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -890,7 +890,7 @@ GIT_CONF_SUBST([HAVE_STRINGS_H])
# and libcharset does
CHARSET_LIB=
AC_CHECK_LIB([iconv], [locale_charset],
- [],
+ [CHARSET_LIB=-liconv],
[AC_CHECK_LIB([charset], [locale_charset],
[CHARSET_LIB=-lcharset])])
GIT_CONF_SUBST([CHARSET_LIB])
@@ -901,34 +901,6 @@ GIT_CHECK_FUNC(strcasestr,
[NO_STRCASESTR=YesPlease])
GIT_CONF_SUBST([NO_STRCASESTR])
#
-# Define NO_FNMATCH if you don't have fnmatch
-GIT_CHECK_FUNC(fnmatch,
-[NO_FNMATCH=],
-[NO_FNMATCH=YesPlease])
-GIT_CONF_SUBST([NO_FNMATCH])
-#
-# Define NO_FNMATCH_CASEFOLD if your fnmatch function doesn't have the
-# FNM_CASEFOLD GNU extension.
-AC_CACHE_CHECK([whether the fnmatch function supports the FNMATCH_CASEFOLD GNU extension],
- [ac_cv_c_excellent_fnmatch], [
-AC_EGREP_CPP(yippeeyeswehaveit,
- AC_LANG_PROGRAM([
-#include <fnmatch.h>
-],
-[#ifdef FNM_CASEFOLD
-yippeeyeswehaveit
-#endif
-]),
- [ac_cv_c_excellent_fnmatch=yes],
- [ac_cv_c_excellent_fnmatch=no])
-])
-if test $ac_cv_c_excellent_fnmatch = yes; then
- NO_FNMATCH_CASEFOLD=
-else
- NO_FNMATCH_CASEFOLD=YesPlease
-fi
-GIT_CONF_SUBST([NO_FNMATCH_CASEFOLD])
-#
# Define NO_MEMMEM if you don't have memmem.
GIT_CHECK_FUNC(memmem,
[NO_MEMMEM=],
diff --git a/connect.c b/connect.c
index 4150412e2c..ebc3a5be7d 100644
--- a/connect.c
+++ b/connect.c
@@ -64,9 +64,7 @@ static void parse_one_symref_info(struct string_list *symref, const char *val, i
if (!len)
return; /* just "symref" */
/* e.g. "symref=HEAD:refs/heads/master" */
- sym = xmalloc(len + 1);
- memcpy(sym, val, len);
- sym[len] = '\0';
+ sym = xmemdupz(val, len);
target = strchr(sym, ':');
if (!target)
/* just "symref=something" */
@@ -727,7 +725,7 @@ struct child_process *git_connect(int fd[2], const char *url,
*arg++ = port;
}
*arg++ = ssh_host;
- } else {
+ } else {
/* remove repo-local variables from the environment */
conn->env = local_repo_env;
conn->use_shell = 1;
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 9525343fcd..019026efcb 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -1221,14 +1221,20 @@ _git_difftool ()
__git_complete_revlist_file
}
+__git_fetch_recurse_submodules="yes on-demand no"
+
__git_fetch_options="
--quiet --verbose --append --upload-pack --force --keep --depth=
- --tags --no-tags --all --prune --dry-run
+ --tags --no-tags --all --prune --dry-run --recurse-submodules=
"
_git_fetch ()
{
case "$cur" in
+ --recurse-submodules=*)
+ __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
+ return
+ ;;
--*)
__gitcomp "$__git_fetch_options"
return
@@ -1466,9 +1472,12 @@ _git_log ()
__git_complete_revlist
}
+# Common merge options shared by git-merge(1) and git-pull(1).
__git_merge_options="
--no-commit --no-stat --log --no-log --squash --strategy
--commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
+ --verify-signatures --no-verify-signatures --gpg-sign
+ --quiet --verbose --progress --no-progress
"
_git_merge ()
@@ -1477,7 +1486,8 @@ _git_merge ()
case "$cur" in
--*)
- __gitcomp "$__git_merge_options"
+ __gitcomp "$__git_merge_options
+ --rerere-autoupdate --no-rerere-autoupdate --abort"
return
esac
__gitcomp_nl "$(__git_refs)"
@@ -1583,6 +1593,10 @@ _git_pull ()
__git_complete_strategy && return
case "$cur" in
+ --recurse-submodules=*)
+ __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
+ return
+ ;;
--*)
__gitcomp "
--rebase --no-rebase
@@ -1595,6 +1609,8 @@ _git_pull ()
__git_complete_remote_or_refspec
}
+__git_push_recurse_submodules="check on-demand"
+
_git_push ()
{
case "$prev" in
@@ -1607,10 +1623,15 @@ _git_push ()
__gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
return
;;
+ --recurse-submodules=*)
+ __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
+ return
+ ;;
--*)
__gitcomp "
--all --mirror --tags --dry-run --force --verbose
--receive-pack= --repo= --set-upstream
+ --recurse-submodules=
"
return
;;
@@ -2547,6 +2568,7 @@ __git_main ()
local expansion=$(__git_aliased_command "$command")
if [ -n "$expansion" ]; then
+ words[1]=$expansion
completion_func="_git_${expansion//-/_}"
declare -f $completion_func >/dev/null && $completion_func
fi
diff --git a/contrib/completion/git-completion.zsh b/contrib/completion/git-completion.zsh
index 6b77968572..9f6f0fa558 100644
--- a/contrib/completion/git-completion.zsh
+++ b/contrib/completion/git-completion.zsh
@@ -104,6 +104,7 @@ __git_zsh_bash_func ()
local expansion=$(__git_aliased_command "$command")
if [ -n "$expansion" ]; then
+ words[1]=$expansion
completion_func="_git_${expansion//-/_}"
declare -f $completion_func >/dev/null && $completion_func
fi
diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh
index e7ae736e4b..9d684b10a6 100644
--- a/contrib/completion/git-prompt.sh
+++ b/contrib/completion/git-prompt.sh
@@ -268,6 +268,13 @@ __git_ps1_colorize_gitstring ()
r="$c_clear$r"
}
+__git_eread ()
+{
+ f="$1"
+ shift
+ test -r "$f" && read "$@" <"$f"
+}
+
# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
# when called from PS1 using command substitution
# in this mode it prints text to add to bash PS1 prompt (includes branch name)
@@ -367,9 +374,9 @@ __git_ps1 ()
local step=""
local total=""
if [ -d "$g/rebase-merge" ]; then
- read b 2>/dev/null <"$g/rebase-merge/head-name"
- read step 2>/dev/null <"$g/rebase-merge/msgnum"
- read total 2>/dev/null <"$g/rebase-merge/end"
+ __git_eread "$g/rebase-merge/head-name" b
+ __git_eread "$g/rebase-merge/msgnum" step
+ __git_eread "$g/rebase-merge/end" total
if [ -f "$g/rebase-merge/interactive" ]; then
r="|REBASE-i"
else
@@ -377,10 +384,10 @@ __git_ps1 ()
fi
else
if [ -d "$g/rebase-apply" ]; then
- read step 2>/dev/null <"$g/rebase-apply/next"
- read total 2>/dev/null <"$g/rebase-apply/last"
+ __git_eread "$g/rebase-apply/next" step
+ __git_eread "$g/rebase-apply/last" total
if [ -f "$g/rebase-apply/rebasing" ]; then
- read b 2>/dev/null <"$g/rebase-apply/head-name"
+ __git_eread "$g/rebase-apply/head-name" b
r="|REBASE"
elif [ -f "$g/rebase-apply/applying" ]; then
r="|AM"
@@ -404,7 +411,7 @@ __git_ps1 ()
b="$(git symbolic-ref HEAD 2>/dev/null)"
else
local head=""
- if ! read head 2>/dev/null <"$g/HEAD"; then
+ if ! __git_eread "$g/HEAD" head; then
if [ $pcmode = yes ]; then
PS1="$ps1pc_start$ps1pc_end"
fi
diff --git a/contrib/contacts/git-contacts b/contrib/contacts/git-contacts
index 428cc1a9a1..dbe2abf277 100755
--- a/contrib/contacts/git-contacts
+++ b/contrib/contacts/git-contacts
@@ -96,8 +96,6 @@ sub scan_patches {
next unless $id;
if (m{^--- (?:a/(.+)|/dev/null)$}) {
$source = $1;
- } elsif (/^--- /) {
- die "Cannot parse hunk source: $_\n";
} elsif (/^@@ -(\d+)(?:,(\d+))?/ && $source) {
my $len = defined($2) ? $2 : 1;
push @{$sources->{$source}{$id}}, [$1, $len] if $len;
diff --git a/contrib/examples/git-checkout.sh b/contrib/examples/git-checkout.sh
index d2c1f98b86..683cae7c3f 100755
--- a/contrib/examples/git-checkout.sh
+++ b/contrib/examples/git-checkout.sh
@@ -222,7 +222,7 @@ else
# Match the index to the working tree, and do a three-way.
git diff-files --name-only | git update-index --remove --stdin &&
- work=`git write-tree` &&
+ work=$(git write-tree) &&
git read-tree $v --reset -u $new || exit
eval GITHEAD_$new='${new_name:-${branch:-$new}}' &&
@@ -233,7 +233,7 @@ else
# Do not register the cleanly merged paths in the index yet.
# this is not a real merge before committing, but just carrying
# the working tree changes along.
- unmerged=`git ls-files -u`
+ unmerged=$(git ls-files -u)
git read-tree $v --reset $new
case "$unmerged" in
'') ;;
@@ -269,7 +269,7 @@ if [ "$?" -eq 0 ]; then
fi
if test -n "$branch"
then
- old_branch_name=`expr "z$oldbranch" : 'zrefs/heads/\(.*\)'`
+ old_branch_name=$(expr "z$oldbranch" : 'zrefs/heads/\(.*\)')
GIT_DIR="$GIT_DIR" git symbolic-ref -m "checkout: moving from ${old_branch_name:-$old} to $branch" HEAD "refs/heads/$branch"
if test -n "$quiet"
then
@@ -282,7 +282,7 @@ if [ "$?" -eq 0 ]; then
fi
elif test -n "$detached"
then
- old_branch_name=`expr "z$oldbranch" : 'zrefs/heads/\(.*\)'`
+ old_branch_name=$(expr "z$oldbranch" : 'zrefs/heads/\(.*\)')
git update-ref --no-deref -m "checkout: moving from ${old_branch_name:-$old} to $arg" HEAD "$detached" ||
die "Cannot detach HEAD"
if test -n "$detach_warn"
diff --git a/contrib/examples/git-clone.sh b/contrib/examples/git-clone.sh
index 547228e13c..b4c9376a2c 100755
--- a/contrib/examples/git-clone.sh
+++ b/contrib/examples/git-clone.sh
@@ -40,7 +40,7 @@ eval "$(echo "$OPTIONS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)
get_repo_base() {
(
- cd "`/bin/pwd`" &&
+ cd "$(/bin/pwd)" &&
cd "$1" || cd "$1.git" &&
{
cd .git
@@ -50,7 +50,7 @@ get_repo_base() {
}
if [ -n "$GIT_SSL_NO_VERIFY" -o \
- "`git config --bool http.sslVerify`" = false ]; then
+ "$(git config --bool http.sslVerify)" = false ]; then
curl_extra_args="-k"
fi
@@ -70,7 +70,7 @@ clone_dumb_http () {
clone_tmp="$GIT_DIR/clone-tmp" &&
mkdir -p "$clone_tmp" || exit 1
if [ -n "$GIT_CURL_FTP_NO_EPSV" -o \
- "`git config --bool http.noEPSV`" = true ]; then
+ "$(git config --bool http.noEPSV)" = true ]; then
curl_extra_args="${curl_extra_args} --disable-epsv"
fi
http_fetch "$1/info/refs" "$clone_tmp/refs" ||
@@ -79,7 +79,7 @@ Perhaps git-update-server-info needs to be run there?"
test "z$quiet" = z && v=-v || v=
while read sha1 refname
do
- name=`expr "z$refname" : 'zrefs/\(.*\)'` &&
+ name=$(expr "z$refname" : 'zrefs/\(.*\)') &&
case "$name" in
*^*) continue;;
esac
@@ -88,7 +88,7 @@ Perhaps git-update-server-info needs to be run there?"
*) continue ;;
esac
if test -n "$use_separate_remote" &&
- branch_name=`expr "z$name" : 'zheads/\(.*\)'`
+ branch_name=$(expr "z$name" : 'zheads/\(.*\)')
then
tname="remotes/$origin/$branch_name"
else
@@ -100,7 +100,7 @@ Perhaps git-update-server-info needs to be run there?"
http_fetch "$1/HEAD" "$GIT_DIR/REMOTE_HEAD" ||
rm -f "$GIT_DIR/REMOTE_HEAD"
if test -f "$GIT_DIR/REMOTE_HEAD"; then
- head_sha1=`cat "$GIT_DIR/REMOTE_HEAD"`
+ head_sha1=$(cat "$GIT_DIR/REMOTE_HEAD")
case "$head_sha1" in
'ref: refs/'*)
;;
@@ -444,15 +444,15 @@ then
# a non-bare repository is always in separate-remote layout
remote_top="refs/remotes/$origin"
head_sha1=
- test ! -r "$GIT_DIR/REMOTE_HEAD" || head_sha1=`cat "$GIT_DIR/REMOTE_HEAD"`
+ test ! -r "$GIT_DIR/REMOTE_HEAD" || head_sha1=$(cat "$GIT_DIR/REMOTE_HEAD")
case "$head_sha1" in
'ref: refs/'*)
# Uh-oh, the remote told us (http transport done against
# new style repository with a symref HEAD).
# Ideally we should skip the guesswork but for now
# opt for minimum change.
- head_sha1=`expr "z$head_sha1" : 'zref: refs/heads/\(.*\)'`
- head_sha1=`cat "$GIT_DIR/$remote_top/$head_sha1"`
+ head_sha1=$(expr "z$head_sha1" : 'zref: refs/heads/\(.*\)')
+ head_sha1=$(cat "$GIT_DIR/$remote_top/$head_sha1")
;;
esac
@@ -467,7 +467,7 @@ then
while read name
do
test t = $done && continue
- branch_tip=`cat "$GIT_DIR/$remote_top/$name"`
+ branch_tip=$(cat "$GIT_DIR/$remote_top/$name")
if test "$head_sha1" = "$branch_tip"
then
echo "$name"
diff --git a/contrib/examples/git-commit.sh b/contrib/examples/git-commit.sh
index 4aab1a6d21..5cafe2eb77 100755
--- a/contrib/examples/git-commit.sh
+++ b/contrib/examples/git-commit.sh
@@ -91,7 +91,7 @@ signoff=
force_author=
only_include_assumed=
untracked_files=
-templatefile="`git config commit.template`"
+templatefile="$(git config commit.template)"
while test $# != 0
do
case "$1" in
@@ -350,7 +350,7 @@ t,)
TMP_INDEX="$GIT_DIR/tmp-index$$"
W=
test -z "$initial_commit" && W=--with-tree=HEAD
- commit_only=`git ls-files --error-unmatch $W -- "$@"` || exit
+ commit_only=$(git ls-files --error-unmatch $W -- "$@") || exit
# Build a temporary index and update the real index
# the same way.
@@ -475,8 +475,8 @@ then
fi
if test '' != "$force_author"
then
- GIT_AUTHOR_NAME=`expr "z$force_author" : 'z\(.*[^ ]\) *<.*'` &&
- GIT_AUTHOR_EMAIL=`expr "z$force_author" : '.*\(<.*\)'` &&
+ GIT_AUTHOR_NAME=$(expr "z$force_author" : 'z\(.*[^ ]\) *<.*') &&
+ GIT_AUTHOR_EMAIL=$(expr "z$force_author" : '.*\(<.*\)') &&
test '' != "$GIT_AUTHOR_NAME" &&
test '' != "$GIT_AUTHOR_EMAIL" ||
die "malformed --author parameter"
@@ -489,7 +489,7 @@ then
rloga='commit'
if [ -f "$GIT_DIR/MERGE_HEAD" ]; then
rloga='commit (merge)'
- PARENTS="-p HEAD "`sed -e 's/^/-p /' "$GIT_DIR/MERGE_HEAD"`
+ PARENTS="-p HEAD "$(sed -e 's/^/-p /' "$GIT_DIR/MERGE_HEAD")
elif test -n "$amend"; then
rloga='commit (amend)'
PARENTS=$(git cat-file commit HEAD |
diff --git a/contrib/examples/git-fetch.sh b/contrib/examples/git-fetch.sh
index a314273bd5..554070909c 100755
--- a/contrib/examples/git-fetch.sh
+++ b/contrib/examples/git-fetch.sh
@@ -67,7 +67,7 @@ do
keep='-k -k'
;;
--depth=*)
- shallow_depth="--depth=`expr "z$1" : 'z-[^=]*=\(.*\)'`"
+ shallow_depth="--depth=$(expr "z$1" : 'z-[^=]*=\(.*\)')"
;;
--depth)
shift
@@ -262,12 +262,12 @@ fetch_per_ref () {
http://* | https://* | ftp://*)
test -n "$shallow_depth" &&
die "shallow clone with http not supported"
- proto=`expr "$remote" : '\([^:]*\):'`
+ proto=$(expr "$remote" : '\([^:]*\):')
if [ -n "$GIT_SSL_NO_VERIFY" ]; then
curl_extra_args="-k"
fi
if [ -n "$GIT_CURL_FTP_NO_EPSV" -o \
- "`git config --bool http.noEPSV`" = true ]; then
+ "$(git config --bool http.noEPSV)" = true ]; then
noepsv_opt="--disable-epsv"
fi
diff --git a/contrib/examples/git-ls-remote.sh b/contrib/examples/git-ls-remote.sh
index fec70bbf88..2aa89a7df8 100755
--- a/contrib/examples/git-ls-remote.sh
+++ b/contrib/examples/git-ls-remote.sh
@@ -55,11 +55,11 @@ tmpdir=$tmp-d
case "$peek_repo" in
http://* | https://* | ftp://* )
if [ -n "$GIT_SSL_NO_VERIFY" -o \
- "`git config --bool http.sslVerify`" = false ]; then
+ "$(git config --bool http.sslVerify)" = false ]; then
curl_extra_args="-k"
fi
if [ -n "$GIT_CURL_FTP_NO_EPSV" -o \
- "`git config --bool http.noEPSV`" = true ]; then
+ "$(git config --bool http.noEPSV)" = true ]; then
curl_extra_args="${curl_extra_args} --disable-epsv"
fi
curl -nsf $curl_extra_args --header "Pragma: no-cache" "$peek_repo/info/refs" ||
diff --git a/contrib/examples/git-merge.sh b/contrib/examples/git-merge.sh
index a5e42a9f01..7e40f40c78 100755
--- a/contrib/examples/git-merge.sh
+++ b/contrib/examples/git-merge.sh
@@ -341,7 +341,7 @@ case "$use_strategies" in
'')
case "$#" in
1)
- var="`git config --get pull.twohead`"
+ var="$(git config --get pull.twohead)"
if test -n "$var"
then
use_strategies="$var"
@@ -349,7 +349,7 @@ case "$use_strategies" in
use_strategies="$default_twohead_strategies"
fi ;;
*)
- var="`git config --get pull.octopus`"
+ var="$(git config --get pull.octopus)"
if test -n "$var"
then
use_strategies="$var"
diff --git a/contrib/examples/git-repack.sh b/contrib/examples/git-repack.sh
index 757933174e..f312405a25 100755
--- a/contrib/examples/git-repack.sh
+++ b/contrib/examples/git-repack.sh
@@ -49,7 +49,7 @@ do
shift
done
-case "`git config --bool repack.usedeltabaseoffset || echo true`" in
+case "$(git config --bool repack.usedeltabaseoffset || echo true)" in
true)
extra="$extra --delta-base-offset" ;;
esac
diff --git a/contrib/examples/git-resolve.sh b/contrib/examples/git-resolve.sh
index 8f98142f77..48d0fc971f 100755
--- a/contrib/examples/git-resolve.sh
+++ b/contrib/examples/git-resolve.sh
@@ -75,7 +75,7 @@ case "$common" in
GIT_INDEX_FILE=$G git read-tree -m $c $head $merge \
2>/dev/null || continue
# Count the paths that are unmerged.
- cnt=`GIT_INDEX_FILE=$G git ls-files --unmerged | wc -l`
+ cnt=$(GIT_INDEX_FILE=$G git ls-files --unmerged | wc -l)
if test $best_cnt -le 0 -o $cnt -le $best_cnt
then
best=$c
diff --git a/contrib/examples/git-revert.sh b/contrib/examples/git-revert.sh
index 6bf155cbdb..7e2aad5491 100755
--- a/contrib/examples/git-revert.sh
+++ b/contrib/examples/git-revert.sh
@@ -137,7 +137,7 @@ cherry-pick)
q
}'
- logmsg=`git show -s --pretty=raw --encoding="$encoding" "$commit"`
+ logmsg=$(git show -s --pretty=raw --encoding="$encoding" "$commit")
set_author_env=`echo "$logmsg" |
LANG=C LC_ALL=C sed -ne "$pick_author_script"`
eval "$set_author_env"
diff --git a/contrib/examples/git-tag.sh b/contrib/examples/git-tag.sh
index 2c15bc955b..1bd8f3c58d 100755
--- a/contrib/examples/git-tag.sh
+++ b/contrib/examples/git-tag.sh
@@ -156,7 +156,7 @@ prev=0000000000000000000000000000000000000000
if git show-ref --verify --quiet -- "refs/tags/$name"
then
test -n "$force" || die "tag '$name' already exists"
- prev=`git rev-parse "refs/tags/$name"`
+ prev=$(git rev-parse "refs/tags/$name")
fi
shift
git check-ref-format "tags/$name" ||
diff --git a/contrib/git-resurrect.sh b/contrib/git-resurrect.sh
index a4ed4c3c62..d7e97bbc76 100755
--- a/contrib/git-resurrect.sh
+++ b/contrib/git-resurrect.sh
@@ -10,6 +10,7 @@ is rather slow but allows you to resurrect other people's topic
branches."
OPTIONS_KEEPDASHDASH=
+OPTIONS_STUCKLONG=
OPTIONS_SPEC="\
git resurrect $USAGE
--
diff --git a/contrib/hooks/multimail/CHANGES b/contrib/hooks/multimail/CHANGES
new file mode 100644
index 0000000000..3603d56c26
--- /dev/null
+++ b/contrib/hooks/multimail/CHANGES
@@ -0,0 +1,33 @@
+Release 1.0.0
+=============
+
+* Fix encoding of non-ASCII email addresses in email headers.
+
+* Fix backwards-compatibility bugs for older Python 2.x versions.
+
+* Fix a backwards-compatibility bug for Git 1.7.1.
+
+* Add an option commitDiffOpts to customize logs for revisions.
+
+* Pass "-oi" to sendmail by default to prevent premature termination
+ on a line containing only ".".
+
+* Stagger email "Date:" values in an attempt to help mail clients
+ thread the emails in the right order.
+
+* If a mailing list setting is missing, just skip sending the
+ corresponding email (with a warning) instead of failing.
+
+* Add a X-Git-Host header that can be used for email filtering.
+
+* Allow the sender's fully-qualified domain name to be configured.
+
+* Minor documentation improvements.
+
+* Add this CHANGES file.
+
+
+Release 0.9.0
+=============
+
+* Initial release.
diff --git a/contrib/hooks/multimail/README b/contrib/hooks/multimail/README
index 9904396710..477d65fed3 100644
--- a/contrib/hooks/multimail/README
+++ b/contrib/hooks/multimail/README
@@ -91,9 +91,10 @@ Requirements
been tested; if you do so, please report your results.)
* To send emails using the default configuration, a standard sendmail
- program must be located at '/usr/sbin/sendmail' and configured
- correctly to send emails. If this is not the case, see the
- multimailhook.mailer configuration variable below for how to
+ program must be located at '/usr/sbin/sendmail' or
+ '/usr/lib/sendmail' and must be configured correctly to send emails.
+ If this is not the case, set multimailhook.sendmailCommand, or see
+ the multimailhook.mailer configuration variable below for how to
configure git-multimail to send emails via an SMTP server.
@@ -169,7 +170,7 @@ multimailhook.repoName
for gitolite repositories, or otherwise to derive this value from
the repository path name.
-multimailhook.mailinglist
+multimailhook.mailingList
The list of email addresses to which notification emails should be
sent, as RFC 2822 email addresses separated by commas. This
@@ -184,26 +185,29 @@ multimailhook.refchangeList
reference changes should be sent, as RFC 2822 email addresses
separated by commas. This configuration option can be
multivalued. The default is the value in
- multimailhook.mailinglist. Set this value to the empty string to
- prevent reference change emails from being sent.
+ multimailhook.mailingList. Set this value to the empty string to
+ prevent reference change emails from being sent even if
+ multimailhook.mailingList is set.
multimailhook.announceList
The list of email addresses to which emails about new annotated
tags should be sent, as RFC 2822 email addresses separated by
commas. This configuration option can be multivalued. The
- default is the value in multimailhook.refchangelist or
- multimailhook.mailinglist. Set this value to the empty string to
- prevent annotated tag announcement emails from being sent.
+ default is the value in multimailhook.refchangeList or
+ multimailhook.mailingList. Set this value to the empty string to
+ prevent annotated tag announcement emails from being sent even if
+ one of the other values is set.
multimailhook.commitList
The list of email addresses to which emails about individual new
commits should be sent, as RFC 2822 email addresses separated by
commas. This configuration option can be multivalued. The
- default is the value in multimailhook.mailinglist. Set this value
+ default is the value in multimailhook.mailingList. Set this value
to the empty string to prevent notification emails about
- individual commits from being sent.
+ individual commits from being sent even if
+ multimailhook.mailingList is set.
multimailhook.announceShortlog
@@ -237,10 +241,11 @@ multimailhook.mailer
quoting is allowed in the value of this setting, but remember that
Git requires double-quotes to be escaped; e.g.,
- git config multimailhook.sendmailcommand '/usr/sbin/sendmail -t -F \"Git Repo\"'
+ git config multimailhook.sendmailcommand '/usr/sbin/sendmail -oi -t -F \"Git Repo\"'
- Default is '/usr/sbin/sendmail -t' or '/usr/lib/sendmail
- -t' (depending on which file is present and executable).
+ Default is '/usr/sbin/sendmail -oi -t' or
+ '/usr/lib/sendmail -oi -t' (depending on which file is
+ present and executable).
multimailhook.envelopeSender
@@ -344,6 +349,14 @@ multimailhook.logOpts
[multimailhook]
logopts = --pretty=format:\"%h %aN <%aE>%n%s%n%n%b%n\"
+multimailhook.commitLogOpts
+
+ Options passed to "git log" to generate additional info for
+ revision change emails. For example, adding --ignore-all-spaces
+ will suppress whitespace changes. The default options are "-C
+ --stat -p --cc". Shell quoting is allowed; see
+ multimailhook.logOpts for details.
+
multimailhook.emailDomain
Domain name appended to the username of the person doing the push
@@ -381,8 +394,8 @@ Email filtering aids
All emails include extra headers to enable fine tuned filtering and
give information for debugging. All emails include the headers
-"X-Git-Repo", "X-Git-Refname", and "X-Git-Reftype". ReferenceChange
-emails also include headers "X-Git-Oldrev" and "X-Git-Newrev";
+"X-Git-Host", "X-Git-Repo", "X-Git-Refname", and "X-Git-Reftype".
+ReferenceChange emails also include headers "X-Git-Oldrev" and "X-Git-Newrev";
Revision emails also include header "X-Git-Rev".
@@ -463,6 +476,7 @@ The git-multimail project itself is currently hosted on GitHub:
We use the GitHub issue tracker to keep track of bugs and feature
requests, and GitHub pull requests to exchange patches (though, if you
prefer, you can send patches via the Git mailing list with cc to me).
+Please sign off your patches as per the Git project practice.
Please note that although a copy of git-multimail will probably be
distributed in the "contrib" section of the main Git project,
diff --git a/contrib/hooks/multimail/README.Git b/contrib/hooks/multimail/README.Git
index 9c2e66a69a..129b771410 100644
--- a/contrib/hooks/multimail/README.Git
+++ b/contrib/hooks/multimail/README.Git
@@ -6,10 +6,10 @@ website:
https://github.com/mhagger/git-multimail
The version in this directory was obtained from the upstream project
-on 2013-07-14 and consists of the "git-multimail" subdirectory from
+on 2014-04-07 and consists of the "git-multimail" subdirectory from
revision
- 1a5cb09c698a74d15a715a86b09ead5f56bf4b06
+ 1b32653bafc4f902535b9fc1cd9cae911325b870
Please see the README file in this directory for information about how
to report bugs or contribute to git-multimail.
diff --git a/contrib/hooks/multimail/git_multimail.py b/contrib/hooks/multimail/git_multimail.py
index 81c6a51706..8b58ed6444 100755
--- a/contrib/hooks/multimail/git_multimail.py
+++ b/contrib/hooks/multimail/git_multimail.py
@@ -1,6 +1,6 @@
#! /usr/bin/env python2
-# Copyright (c) 2012,2013 Michael Haggerty
+# Copyright (c) 2012-2014 Michael Haggerty and others
# Derived from contrib/hooks/post-receive-email, which is
# Copyright (c) 2007 Andy Parkins
# and also includes contributions by other authors.
@@ -49,21 +49,25 @@ import sys
import os
import re
import bisect
+import socket
import subprocess
import shlex
import optparse
import smtplib
+import time
try:
from email.utils import make_msgid
from email.utils import getaddresses
from email.utils import formataddr
+ from email.utils import formatdate
from email.header import Header
except ImportError:
# Prior to Python 2.5, the email module used different names:
from email.Utils import make_msgid
from email.Utils import getaddresses
from email.Utils import formataddr
+ from email.Utils import formatdate
from email.Header import Header
@@ -73,6 +77,7 @@ ZEROS = '0' * 40
LOGBEGIN = '- Log -----------------------------------------------------------------\n'
LOGEND = '-----------------------------------------------------------------------\n'
+ADDR_HEADERS = set(['from', 'to', 'cc', 'bcc', 'reply-to', 'sender'])
# It is assumed in many places that the encoding is uniformly UTF-8,
# so changing these constants is unsupported. But define them here
@@ -95,6 +100,7 @@ REF_DELETED_SUBJECT_TEMPLATE = (
)
REFCHANGE_HEADER_TEMPLATE = """\
+Date: %(send_date)s
To: %(recipients)s
Subject: %(subject)s
MIME-Version: 1.0
@@ -103,6 +109,7 @@ Content-Transfer-Encoding: 8bit
Message-ID: %(msgid)s
From: %(fromaddr)s
Reply-To: %(reply_to)s
+X-Git-Host: %(fqdn)s
X-Git-Repo: %(repo_shortname)s
X-Git-Refname: %(refname)s
X-Git-Reftype: %(refname_type)s
@@ -221,6 +228,7 @@ how to provide full information about this reference change.
REVISION_HEADER_TEMPLATE = """\
+Date: %(send_date)s
To: %(recipients)s
Subject: %(emailprefix)s%(num)02d/%(tot)02d: %(oneline)s
MIME-Version: 1.0
@@ -230,6 +238,7 @@ From: %(fromaddr)s
Reply-To: %(reply_to)s
In-Reply-To: %(reply_to_msgid)s
References: %(reply_to_msgid)s
+X-Git-Host: %(fqdn)s
X-Git-Repo: %(repo_shortname)s
X-Git-Refname: %(refname)s
X-Git-Reftype: %(refname_type)s
@@ -263,13 +272,43 @@ class ConfigurationException(Exception):
pass
+# The "git" program (this could be changed to include a full path):
+GIT_EXECUTABLE = 'git'
+
+
+# How "git" should be invoked (including global arguments), as a list
+# of words. This variable is usually initialized automatically by
+# read_git_output() via choose_git_command(), but if a value is set
+# here then it will be used unconditionally.
+GIT_CMD = None
+
+
+def choose_git_command():
+ """Decide how to invoke git, and record the choice in GIT_CMD."""
+
+ global GIT_CMD
+
+ if GIT_CMD is None:
+ try:
+ # Check to see whether the "-c" option is accepted (it was
+ # only added in Git 1.7.2). We don't actually use the
+ # output of "git --version", though if we needed more
+ # specific version information this would be the place to
+ # do it.
+ cmd = [GIT_EXECUTABLE, '-c', 'foo.bar=baz', '--version']
+ read_output(cmd)
+ GIT_CMD = [GIT_EXECUTABLE, '-c', 'i18n.logoutputencoding=%s' % (ENCODING,)]
+ except CommandError:
+ GIT_CMD = [GIT_EXECUTABLE]
+
+
def read_git_output(args, input=None, keepends=False, **kw):
"""Read the output of a Git command."""
- return read_output(
- ['git', '-c', 'i18n.logoutputencoding=%s' % (ENCODING,)] + args,
- input=input, keepends=keepends, **kw
- )
+ if GIT_CMD is None:
+ choose_git_command()
+
+ return read_output(GIT_CMD + args, input=input, keepends=keepends, **kw)
def read_output(cmd, input=None, keepends=False, **kw):
@@ -297,6 +336,31 @@ def read_git_lines(args, keepends=False, **kw):
return read_git_output(args, keepends=True, **kw).splitlines(keepends)
+def header_encode(text, header_name=None):
+ """Encode and line-wrap the value of an email header field."""
+
+ try:
+ if isinstance(text, str):
+ text = text.decode(ENCODING, 'replace')
+ return Header(text, header_name=header_name).encode()
+ except UnicodeEncodeError:
+ return Header(text, header_name=header_name, charset=CHARSET,
+ errors='replace').encode()
+
+
+def addr_header_encode(text, header_name=None):
+ """Encode and line-wrap the value of an email header field containing
+ email addresses."""
+
+ return Header(
+ ', '.join(
+ formataddr((header_encode(name), emailaddr))
+ for name, emailaddr in getaddresses([text])
+ ),
+ header_name=header_name
+ ).encode()
+
+
class Config(object):
def __init__(self, section, git_config=None):
"""Represent a section of the git configuration.
@@ -578,11 +642,11 @@ class Change(object):
% (e.args[0], line,)
)
else:
- try:
- h = Header(value, header_name=name)
- except UnicodeDecodeError:
- h = Header(value, header_name=name, charset=CHARSET, errors='replace')
- for splitline in ('%s: %s\n' % (name, h.encode(),)).splitlines(True):
+ if name.lower() in ADDR_HEADERS:
+ value = addr_header_encode(value, name)
+ else:
+ value = header_encode(value, name)
+ for splitline in ('%s: %s\n' % (name, value)).splitlines(True):
yield splitline
def generate_email_header(self):
@@ -616,15 +680,19 @@ class Change(object):
raise NotImplementedError()
- def generate_email(self, push, body_filter=None):
+ def generate_email(self, push, body_filter=None, extra_header_values={}):
"""Generate an email describing this change.
Iterate over the lines (including the header lines) of an
email describing this change. If body_filter is not None,
then use it to filter the lines that are intended for the
- email body."""
+ email body.
+
+ The extra_header_values field is received as a dict and not as
+ **kwargs, to allow passing other keyword arguments in the
+ future (e.g. passing extra values to generate_email_intro()"""
- for line in self.generate_email_header():
+ for line in self.generate_email_header(**extra_header_values):
yield line
yield '\n'
for line in self.generate_email_intro():
@@ -680,8 +748,10 @@ class Revision(Change):
return values
- def generate_email_header(self):
- for line in self.expand_header_lines(REVISION_HEADER_TEMPLATE):
+ def generate_email_header(self, **extra_values):
+ for line in self.expand_header_lines(
+ REVISION_HEADER_TEMPLATE, **extra_values
+ ):
yield line
def generate_email_intro(self):
@@ -692,11 +762,7 @@ class Revision(Change):
"""Show this revision."""
return read_git_lines(
- [
- 'log', '-C',
- '--stat', '-p', '--cc',
- '-1', self.rev.sha1,
- ],
+ ['log'] + self.environment.commitlogopts + ['-1', self.rev.sha1],
keepends=True,
)
@@ -800,6 +866,7 @@ class ReferenceChange(Change):
self.msgid = make_msgid()
self.diffopts = environment.diffopts
self.logopts = environment.logopts
+ self.commitlogopts = environment.commitlogopts
self.showlog = environment.refchange_showlog
def _compute_values(self):
@@ -835,9 +902,12 @@ class ReferenceChange(Change):
}[self.change_type]
return self.expand(template)
- def generate_email_header(self):
+ def generate_email_header(self, **extra_values):
+ if 'subject' not in extra_values:
+ extra_values['subject'] = self.get_subject()
+
for line in self.expand_header_lines(
- REFCHANGE_HEADER_TEMPLATE, subject=self.get_subject(),
+ REFCHANGE_HEADER_TEMPLATE, **extra_values
):
yield line
@@ -1273,7 +1343,7 @@ class Mailer(object):
class SendMailer(Mailer):
- """Send emails using 'sendmail -t'."""
+ """Send emails using 'sendmail -oi -t'."""
SENDMAIL_CANDIDATES = [
'/usr/sbin/sendmail',
@@ -1302,7 +1372,7 @@ class SendMailer(Mailer):
if command:
self.command = command[:]
else:
- self.command = [self.find_sendmail(), '-t']
+ self.command = [self.find_sendmail(), '-oi', '-t']
if envelopesender:
self.command.extend(['-f', envelopesender])
@@ -1495,6 +1565,12 @@ class Environment(object):
'git log' when generating the detailed log for a set of
commits (see refchange_showlog)
+ commitlogopts (list of strings)
+
+ The options that should be passed to 'git log' for each
+ commit mail. The value should be a list of strings
+ representing words to be passed to the command.
+
"""
REPO_NAME_RE = re.compile(r'^(?P<name>.+?)(?:\.git)$')
@@ -1506,6 +1582,7 @@ class Environment(object):
self.diffopts = ['--stat', '--summary', '--find-copies-harder']
self.logopts = []
self.refchange_showlog = False
+ self.commitlogopts = ['-C', '--stat', '-p', '--cc']
self.COMPUTED_KEYS = [
'administrator',
@@ -1672,6 +1749,10 @@ class ConfigOptionsEnvironmentMixin(ConfigEnvironmentMixin):
if logopts is not None:
self.logopts = shlex.split(logopts)
+ commitlogopts = config.get('commitlogopts')
+ if commitlogopts is not None:
+ self.commitlogopts = shlex.split(commitlogopts)
+
reply_to = config.get('replyTo')
self.__reply_to_refchange = config.get('replyToRefchange', default=reply_to)
if (
@@ -1829,6 +1910,47 @@ class ConfigMaxlinesEnvironmentMixin(
)
+class FQDNEnvironmentMixin(Environment):
+ """A mixin that sets the host's FQDN to its constructor argument."""
+
+ def __init__(self, fqdn, **kw):
+ super(FQDNEnvironmentMixin, self).__init__(**kw)
+ self.COMPUTED_KEYS += ['fqdn']
+ self.__fqdn = fqdn
+
+ def get_fqdn(self):
+ """Return the fully-qualified domain name for this host.
+
+ Return None if it is unavailable or unwanted."""
+
+ return self.__fqdn
+
+
+class ConfigFQDNEnvironmentMixin(
+ ConfigEnvironmentMixin,
+ FQDNEnvironmentMixin,
+ ):
+ """Read the FQDN from the config."""
+
+ def __init__(self, config, **kw):
+ fqdn = config.get('fqdn')
+ super(ConfigFQDNEnvironmentMixin, self).__init__(
+ config=config,
+ fqdn=fqdn,
+ **kw
+ )
+
+
+class ComputeFQDNEnvironmentMixin(FQDNEnvironmentMixin):
+ """Get the FQDN by calling socket.getfqdn()."""
+
+ def __init__(self, **kw):
+ super(ComputeFQDNEnvironmentMixin, self).__init__(
+ fqdn=socket.getfqdn(),
+ **kw
+ )
+
+
class PusherDomainEnvironmentMixin(ConfigEnvironmentMixin):
"""Deduce pusher_email from pusher by appending an emaildomain."""
@@ -1861,6 +1983,10 @@ class StaticRecipientsEnvironmentMixin(Environment):
# actual *contents* of the change being reported, we only
# choose based on the *type* of the change. Therefore we can
# compute them once and for all:
+ if not (refchange_recipients
+ or announce_recipients
+ or revision_recipients):
+ raise ConfigurationException('No email recipients configured!')
self.__refchange_recipients = refchange_recipients
self.__announce_recipients = announce_recipients
self.__revision_recipients = revision_recipients
@@ -1911,17 +2037,8 @@ class ConfigRecipientsEnvironmentMixin(
retval = config.get_recipients(name)
if retval is not None:
return retval
- if len(names) == 1:
- hint = 'Please set "%s.%s"' % (config.section, name)
else:
- hint = (
- 'Please set one of the following:\n "%s"'
- % ('"\n "'.join('%s.%s' % (config.section, name) for name in names))
- )
-
- raise ConfigurationException(
- 'The list of recipients for %s is not configured.\n%s' % (names[0], hint)
- )
+ return ''
class ProjectdescEnvironmentMixin(Environment):
@@ -1956,6 +2073,7 @@ class GenericEnvironmentMixin(Environment):
class GenericEnvironment(
ProjectdescEnvironmentMixin,
ConfigMaxlinesEnvironmentMixin,
+ ComputeFQDNEnvironmentMixin,
ConfigFilterLinesEnvironmentMixin,
ConfigRecipientsEnvironmentMixin,
PusherDomainEnvironmentMixin,
@@ -1980,9 +2098,27 @@ class GitoliteEnvironmentMixin(Environment):
return self.osenv.get('GL_USER', 'unknown user')
+class IncrementalDateTime(object):
+ """Simple wrapper to give incremental date/times.
+
+ Each call will result in a date/time a second later than the
+ previous call. This can be used to falsify email headers, to
+ increase the likelihood that email clients sort the emails
+ correctly."""
+
+ def __init__(self):
+ self.time = time.time()
+
+ def next(self):
+ formatted = formatdate(self.time, True)
+ self.time += 1
+ return formatted
+
+
class GitoliteEnvironment(
ProjectdescEnvironmentMixin,
ConfigMaxlinesEnvironmentMixin,
+ ComputeFQDNEnvironmentMixin,
ConfigFilterLinesEnvironmentMixin,
ConfigRecipientsEnvironmentMixin,
PusherDomainEnvironmentMixin,
@@ -2187,6 +2323,7 @@ class Push(object):
# guarantee that one (and only one) email is generated for
# each new commit.
unhandled_sha1s = set(self.get_new_commits())
+ send_date = IncrementalDateTime()
for change in self.changes:
# Check if we've got anyone to send to
if not change.recipients:
@@ -2197,7 +2334,11 @@ class Push(object):
)
else:
sys.stderr.write('Sending notification emails to: %s\n' % (change.recipients,))
- mailer.send(change.generate_email(self, body_filter), change.recipients)
+ extra_values = {'send_date' : send_date.next()}
+ mailer.send(
+ change.generate_email(self, body_filter, extra_values),
+ change.recipients,
+ )
sha1s = []
for sha1 in reversed(list(self.get_new_commits(change))):
@@ -2217,7 +2358,11 @@ class Push(object):
for (num, sha1) in enumerate(sha1s):
rev = Revision(change, GitObject(sha1), num=num+1, tot=len(sha1s))
if rev.recipients:
- mailer.send(rev.generate_email(self, body_filter), rev.recipients)
+ extra_values = {'send_date' : send_date.next()}
+ mailer.send(
+ rev.generate_email(self, body_filter, extra_values),
+ rev.recipients,
+ )
# Consistency check:
if unhandled_sha1s:
@@ -2288,6 +2433,7 @@ def choose_environment(config, osenv=None, env=None, recipients=None):
environment_mixins = [
ProjectdescEnvironmentMixin,
ConfigMaxlinesEnvironmentMixin,
+ ComputeFQDNEnvironmentMixin,
ConfigFilterLinesEnvironmentMixin,
PusherDomainEnvironmentMixin,
ConfigOptionsEnvironmentMixin,
diff --git a/contrib/hooks/multimail/post-receive b/contrib/hooks/multimail/post-receive
index 93ebb437d1..4d46828ba5 100755
--- a/contrib/hooks/multimail/post-receive
+++ b/contrib/hooks/multimail/post-receive
@@ -66,10 +66,10 @@ mailer = git_multimail.choose_mailer(config, environment)
# Alternatively, you may hardcode the mailer using code like one of
# the following:
-# Use "/usr/sbin/sendmail -t" to send emails. The envelopesender
+# Use "/usr/sbin/sendmail -oi -t" to send emails. The envelopesender
# argument is optional:
#mailer = git_multimail.SendMailer(
-# command=['/usr/sbin/sendmail', '-t'],
+# command=['/usr/sbin/sendmail', '-oi', '-t'],
# envelopesender='git-repo@example.com',
# )
diff --git a/contrib/mw-to-git/t/t9360-mw-to-git-clone.sh b/contrib/mw-to-git/t/t9360-mw-to-git-clone.sh
index 811a90c9ae..22f069db48 100755
--- a/contrib/mw-to-git/t/t9360-mw-to-git-clone.sh
+++ b/contrib/mw-to-git/t/t9360-mw-to-git-clone.sh
@@ -191,10 +191,10 @@ test_expect_success 'Git clone works with the shallow option' '
test_path_is_file mw_dir_11/Main_Page.mw &&
(
cd mw_dir_11 &&
- test `git log --oneline Nyan.mw | wc -l` -eq 1 &&
- test `git log --oneline Foo.mw | wc -l` -eq 1 &&
- test `git log --oneline Bar.mw | wc -l` -eq 1 &&
- test `git log --oneline Main_Page.mw | wc -l ` -eq 1
+ test $(git log --oneline Nyan.mw | wc -l) -eq 1 &&
+ test $(git log --oneline Foo.mw | wc -l) -eq 1 &&
+ test $(git log --oneline Bar.mw | wc -l) -eq 1 &&
+ test $(git log --oneline Main_Page.mw | wc -l ) -eq 1
) &&
wiki_check_content mw_dir_11/Nyan.mw Nyan &&
wiki_check_content mw_dir_11/Foo.mw Foo &&
@@ -218,9 +218,9 @@ test_expect_success 'Git clone works with the shallow option with a delete page'
test_path_is_file mw_dir_12/Main_Page.mw &&
(
cd mw_dir_12 &&
- test `git log --oneline Nyan.mw | wc -l` -eq 1 &&
- test `git log --oneline Bar.mw | wc -l` -eq 1 &&
- test `git log --oneline Main_Page.mw | wc -l ` -eq 1
+ test $(git log --oneline Nyan.mw | wc -l) -eq 1 &&
+ test $(git log --oneline Bar.mw | wc -l) -eq 1 &&
+ test $(git log --oneline Main_Page.mw | wc -l ) -eq 1
) &&
wiki_check_content mw_dir_12/Nyan.mw Nyan &&
wiki_check_content mw_dir_12/Bar.mw Bar &&
diff --git a/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh b/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh
index 37021e200a..6b0dbdac4d 100755
--- a/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh
+++ b/contrib/mw-to-git/t/t9362-mw-to-git-utf8.sh
@@ -70,8 +70,8 @@ test_expect_success 'The shallow option works with accents' '
test_path_is_file mw_dir_4/Main_Page.mw &&
(
cd mw_dir_4 &&
- test `git log --oneline Néoà.mw | wc -l` -eq 1 &&
- test `git log --oneline Main_Page.mw | wc -l ` -eq 1
+ test $(git log --oneline Néoà.mw | wc -l) -eq 1 &&
+ test $(git log --oneline Main_Page.mw | wc -l ) -eq 1
) &&
wiki_check_content mw_dir_4/Néoà.mw Néoà &&
wiki_check_content mw_dir_4/Main_Page.mw Main_Page
diff --git a/contrib/remote-helpers/Makefile b/contrib/remote-helpers/Makefile
deleted file mode 100644
index 239161de33..0000000000
--- a/contrib/remote-helpers/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-TESTS := $(wildcard test*.sh)
-
-export T := $(addprefix $(CURDIR)/,$(TESTS))
-export MAKE := $(MAKE) -e
-export PATH := $(CURDIR):$(PATH)
-export TEST_LINT := test-lint-executable test-lint-shell-syntax
-
-test:
- $(MAKE) -C ../../t $@
-
-$(TESTS):
- $(MAKE) -C ../../t $(CURDIR)/$@
-
-.PHONY: $(TESTS)
diff --git a/contrib/remote-helpers/README b/contrib/remote-helpers/README
new file mode 100644
index 0000000000..ac72332517
--- /dev/null
+++ b/contrib/remote-helpers/README
@@ -0,0 +1,15 @@
+The remote-helper bridges to access data stored in Mercurial and
+Bazaar are maintained outside the git.git tree in the repositories
+of their primary author:
+
+ https://github.com/felipec/git-remote-hg (for Mercurial)
+ https://github.com/felipec/git-remote-bzr (for Bazaar)
+
+You can pick a directory on your $PATH and download them from these
+repositories, e.g.:
+
+ $ wget -O $HOME/bin/git-remote-hg \
+ https://raw.github.com/felipec/git-remote-hg/master/git-remote-hg
+ $ wget -O $HOME/bin/git-remote-bzr \
+ https://raw.github.com/felipec/git-remote-bzr/master/git-remote-bzr
+ $ chmod +x $HOME/bin/git-remote-hg $HOME/bin/git-remote-bzr
diff --git a/contrib/remote-helpers/git-remote-bzr b/contrib/remote-helpers/git-remote-bzr
index 332aba784b..712a1377e2 100755
--- a/contrib/remote-helpers/git-remote-bzr
+++ b/contrib/remote-helpers/git-remote-bzr
@@ -1,952 +1,13 @@
#!/usr/bin/env python
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-
-#
-# Just copy to your ~/bin, or anywhere in your $PATH.
-# Then you can clone with:
-# % git clone bzr::/path/to/bzr/repo/or/url
-#
-# For example:
-# % git clone bzr::$HOME/myrepo
-# or
-# % git clone bzr::lp:myrepo
-#
-# If you want to specify which branches you want to track (per repo):
-# % git config remote.origin.bzr-branches 'trunk, devel, test'
-#
-# Where 'origin' is the name of the repository you want to specify the
-# branches.
-#
-
-import sys
-
-import bzrlib
-if hasattr(bzrlib, "initialize"):
- bzrlib.initialize()
-
-import bzrlib.plugin
-bzrlib.plugin.load_plugins()
-
-import bzrlib.generate_ids
-import bzrlib.transport
-import bzrlib.errors
-import bzrlib.ui
-import bzrlib.urlutils
-import bzrlib.branch
import sys
-import os
-import json
-import re
-import StringIO
-import atexit, shutil, hashlib, urlparse, subprocess
-
-NAME_RE = re.compile('^([^<>]+)')
-AUTHOR_RE = re.compile('^([^<>]+?)? ?[<>]([^<>]*)(?:$|>)')
-EMAIL_RE = re.compile(r'([^ \t<>]+@[^ \t<>]+)')
-RAW_AUTHOR_RE = re.compile('^(\w+) (.+)? <(.*)> (\d+) ([+-]\d+)')
-
-def die(msg, *args):
- sys.stderr.write('ERROR: %s\n' % (msg % args))
- sys.exit(1)
-
-def warn(msg, *args):
- sys.stderr.write('WARNING: %s\n' % (msg % args))
-
-def gittz(tz):
- return '%+03d%02d' % (tz / 3600, tz % 3600 / 60)
-
-def get_config(config):
- cmd = ['git', 'config', '--get', config]
- process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
- output, _ = process.communicate()
- return output
-
-class Marks:
-
- def __init__(self, path):
- self.path = path
- self.tips = {}
- self.marks = {}
- self.rev_marks = {}
- self.last_mark = 0
- self.load()
-
- def load(self):
- if not os.path.exists(self.path):
- return
-
- tmp = json.load(open(self.path))
- self.tips = tmp['tips']
- self.marks = tmp['marks']
- self.last_mark = tmp['last-mark']
-
- for rev, mark in self.marks.iteritems():
- self.rev_marks[mark] = rev
-
- def dict(self):
- return { 'tips': self.tips, 'marks': self.marks, 'last-mark' : self.last_mark }
-
- def store(self):
- json.dump(self.dict(), open(self.path, 'w'))
-
- def __str__(self):
- return str(self.dict())
-
- def from_rev(self, rev):
- return self.marks[rev]
-
- def to_rev(self, mark):
- return str(self.rev_marks[mark])
-
- def next_mark(self):
- self.last_mark += 1
- return self.last_mark
-
- def get_mark(self, rev):
- self.last_mark += 1
- self.marks[rev] = self.last_mark
- return self.last_mark
-
- def is_marked(self, rev):
- return rev in self.marks
-
- def new_mark(self, rev, mark):
- self.marks[rev] = mark
- self.rev_marks[mark] = rev
- self.last_mark = mark
-
- def get_tip(self, branch):
- try:
- return str(self.tips[branch])
- except KeyError:
- return None
-
- def set_tip(self, branch, tip):
- self.tips[branch] = tip
-
-class Parser:
-
- def __init__(self, repo):
- self.repo = repo
- self.line = self.get_line()
-
- def get_line(self):
- return sys.stdin.readline().strip()
-
- def __getitem__(self, i):
- return self.line.split()[i]
-
- def check(self, word):
- return self.line.startswith(word)
-
- def each_block(self, separator):
- while self.line != separator:
- yield self.line
- self.line = self.get_line()
-
- def __iter__(self):
- return self.each_block('')
-
- def next(self):
- self.line = self.get_line()
- if self.line == 'done':
- self.line = None
-
- def get_mark(self):
- i = self.line.index(':') + 1
- return int(self.line[i:])
-
- def get_data(self):
- if not self.check('data'):
- return None
- i = self.line.index(' ') + 1
- size = int(self.line[i:])
- return sys.stdin.read(size)
-
- def get_author(self):
- m = RAW_AUTHOR_RE.match(self.line)
- if not m:
- return None
- _, name, email, date, tz = m.groups()
- name = name.decode('utf-8')
- committer = '%s <%s>' % (name, email)
- tz = int(tz)
- tz = ((tz / 100) * 3600) + ((tz % 100) * 60)
- return (committer, int(date), tz)
-
-def rev_to_mark(rev):
- return marks.from_rev(rev)
-
-def mark_to_rev(mark):
- return marks.to_rev(mark)
-
-def fixup_user(user):
- name = mail = None
- user = user.replace('"', '')
- m = AUTHOR_RE.match(user)
- if m:
- name = m.group(1)
- mail = m.group(2).strip()
- else:
- m = EMAIL_RE.match(user)
- if m:
- mail = m.group(1)
- else:
- m = NAME_RE.match(user)
- if m:
- name = m.group(1).strip()
-
- if not name:
- name = 'unknown'
- if not mail:
- mail = 'Unknown'
-
- return '%s <%s>' % (name, mail)
-
-def get_filechanges(cur, prev):
- modified = {}
- removed = {}
-
- changes = cur.changes_from(prev)
-
- def u(s):
- return s.encode('utf-8')
-
- for path, fid, kind in changes.added:
- modified[u(path)] = fid
- for path, fid, kind in changes.removed:
- removed[u(path)] = None
- for path, fid, kind, mod, _ in changes.modified:
- modified[u(path)] = fid
- for oldpath, newpath, fid, kind, mod, _ in changes.renamed:
- removed[u(oldpath)] = None
- if kind == 'directory':
- lst = cur.list_files(from_dir=newpath, recursive=True)
- for path, file_class, kind, fid, entry in lst:
- if kind != 'directory':
- modified[u(newpath + '/' + path)] = fid
- else:
- modified[u(newpath)] = fid
-
- return modified, removed
-
-def export_files(tree, files):
- final = []
- for path, fid in files.iteritems():
- kind = tree.kind(fid)
-
- h = tree.get_file_sha1(fid)
-
- if kind == 'symlink':
- d = tree.get_symlink_target(fid)
- mode = '120000'
- elif kind == 'file':
-
- if tree.is_executable(fid):
- mode = '100755'
- else:
- mode = '100644'
-
- # is the blob already exported?
- if h in filenodes:
- mark = filenodes[h]
- final.append((mode, mark, path))
- continue
-
- d = tree.get_file_text(fid)
- elif kind == 'directory':
- continue
- else:
- die("Unhandled kind '%s' for path '%s'" % (kind, path))
-
- mark = marks.next_mark()
- filenodes[h] = mark
-
- print "blob"
- print "mark :%u" % mark
- print "data %d" % len(d)
- print d
-
- final.append((mode, mark, path))
-
- return final
-
-def export_branch(repo, name):
- ref = '%s/heads/%s' % (prefix, name)
- tip = marks.get_tip(name)
-
- branch = get_remote_branch(name)
- repo = branch.repository
-
- branch.lock_read()
- revs = branch.iter_merge_sorted_revisions(None, tip, 'exclude', 'forward')
- try:
- tip_revno = branch.revision_id_to_revno(tip)
- last_revno, _ = branch.last_revision_info()
- total = last_revno - tip_revno
- except bzrlib.errors.NoSuchRevision:
- tip_revno = 0
- total = 0
-
- for revid, _, seq, _ in revs:
-
- if marks.is_marked(revid):
- continue
-
- rev = repo.get_revision(revid)
- revno = seq[0]
-
- parents = rev.parent_ids
- time = rev.timestamp
- tz = rev.timezone
- committer = rev.committer.encode('utf-8')
- committer = "%s %u %s" % (fixup_user(committer), time, gittz(tz))
- authors = rev.get_apparent_authors()
- if authors:
- author = authors[0].encode('utf-8')
- author = "%s %u %s" % (fixup_user(author), time, gittz(tz))
- else:
- author = committer
- msg = rev.message.encode('utf-8')
-
- msg += '\n'
-
- if len(parents) == 0:
- parent = bzrlib.revision.NULL_REVISION
- else:
- parent = parents[0]
-
- cur_tree = repo.revision_tree(revid)
- prev = repo.revision_tree(parent)
- modified, removed = get_filechanges(cur_tree, prev)
-
- modified_final = export_files(cur_tree, modified)
-
- if len(parents) == 0:
- print 'reset %s' % ref
-
- print "commit %s" % ref
- print "mark :%d" % (marks.get_mark(revid))
- print "author %s" % (author)
- print "committer %s" % (committer)
- print "data %d" % (len(msg))
- print msg
-
- for i, p in enumerate(parents):
- try:
- m = rev_to_mark(p)
- except KeyError:
- # ghost?
- continue
- if i == 0:
- print "from :%s" % m
- else:
- print "merge :%s" % m
-
- for f in removed:
- print "D %s" % (f,)
- for f in modified_final:
- print "M %s :%u %s" % f
- print
-
- if len(seq) > 1:
- # let's skip branch revisions from the progress report
- continue
-
- progress = (revno - tip_revno)
- if (progress % 100 == 0):
- if total:
- print "progress revision %d '%s' (%d/%d)" % (revno, name, progress, total)
- else:
- print "progress revision %d '%s' (%d)" % (revno, name, progress)
-
- branch.unlock()
-
- revid = branch.last_revision()
-
- # make sure the ref is updated
- print "reset %s" % ref
- print "from :%u" % rev_to_mark(revid)
- print
-
- marks.set_tip(name, revid)
-
-def export_tag(repo, name):
- ref = '%s/tags/%s' % (prefix, name)
- print "reset %s" % ref
- print "from :%u" % rev_to_mark(tags[name])
- print
-
-def do_import(parser):
- repo = parser.repo
- path = os.path.join(dirname, 'marks-git')
-
- print "feature done"
- if os.path.exists(path):
- print "feature import-marks=%s" % path
- print "feature export-marks=%s" % path
- print "feature force"
- sys.stdout.flush()
-
- while parser.check('import'):
- ref = parser[1]
- if ref.startswith('refs/heads/'):
- name = ref[len('refs/heads/'):]
- export_branch(repo, name)
- if ref.startswith('refs/tags/'):
- name = ref[len('refs/tags/'):]
- export_tag(repo, name)
- parser.next()
-
- print 'done'
-
- sys.stdout.flush()
-
-def parse_blob(parser):
- parser.next()
- mark = parser.get_mark()
- parser.next()
- data = parser.get_data()
- blob_marks[mark] = data
- parser.next()
-
-class CustomTree():
-
- def __init__(self, branch, revid, parents, files):
- self.updates = {}
- self.branch = branch
-
- def copy_tree(revid):
- files = files_cache[revid] = {}
- branch.lock_read()
- tree = branch.repository.revision_tree(revid)
- try:
- for path, entry in tree.iter_entries_by_dir():
- files[path] = [entry.file_id, None]
- finally:
- branch.unlock()
- return files
-
- if len(parents) == 0:
- self.base_id = bzrlib.revision.NULL_REVISION
- self.base_files = {}
- else:
- self.base_id = parents[0]
- self.base_files = files_cache.get(self.base_id, None)
- if not self.base_files:
- self.base_files = copy_tree(self.base_id)
-
- self.files = files_cache[revid] = self.base_files.copy()
- self.rev_files = {}
-
- for path, data in self.files.iteritems():
- fid, mark = data
- self.rev_files[fid] = [path, mark]
-
- for path, f in files.iteritems():
- fid, mark = self.files.get(path, [None, None])
- if not fid:
- fid = bzrlib.generate_ids.gen_file_id(path)
- f['path'] = path
- self.rev_files[fid] = [path, mark]
- self.updates[fid] = f
-
- def last_revision(self):
- return self.base_id
-
- def iter_changes(self):
- changes = []
-
- def get_parent(dirname, basename):
- parent_fid, mark = self.base_files.get(dirname, [None, None])
- if parent_fid:
- return parent_fid
- parent_fid, mark = self.files.get(dirname, [None, None])
- if parent_fid:
- return parent_fid
- if basename == '':
- return None
- fid = bzrlib.generate_ids.gen_file_id(path)
- add_entry(fid, dirname, 'directory')
- return fid
-
- def add_entry(fid, path, kind, mode=None):
- dirname, basename = os.path.split(path)
- parent_fid = get_parent(dirname, basename)
-
- executable = False
- if mode == '100755':
- executable = True
- elif mode == '120000':
- kind = 'symlink'
-
- change = (fid,
- (None, path),
- True,
- (False, True),
- (None, parent_fid),
- (None, basename),
- (None, kind),
- (None, executable))
- self.files[path] = [change[0], None]
- changes.append(change)
-
- def update_entry(fid, path, kind, mode=None):
- dirname, basename = os.path.split(path)
- parent_fid = get_parent(dirname, basename)
-
- executable = False
- if mode == '100755':
- executable = True
- elif mode == '120000':
- kind = 'symlink'
-
- change = (fid,
- (path, path),
- True,
- (True, True),
- (None, parent_fid),
- (None, basename),
- (None, kind),
- (None, executable))
- self.files[path] = [change[0], None]
- changes.append(change)
-
- def remove_entry(fid, path, kind):
- dirname, basename = os.path.split(path)
- parent_fid = get_parent(dirname, basename)
- change = (fid,
- (path, None),
- True,
- (True, False),
- (parent_fid, None),
- (None, None),
- (None, None),
- (None, None))
- del self.files[path]
- changes.append(change)
-
- for fid, f in self.updates.iteritems():
- path = f['path']
-
- if 'deleted' in f:
- remove_entry(fid, path, 'file')
- continue
-
- if path in self.base_files:
- update_entry(fid, path, 'file', f['mode'])
- else:
- add_entry(fid, path, 'file', f['mode'])
-
- self.files[path][1] = f['mark']
- self.rev_files[fid][1] = f['mark']
-
- return changes
-
- def get_content(self, file_id):
- path, mark = self.rev_files[file_id]
- if mark:
- return blob_marks[mark]
-
- # last resort
- tree = self.branch.repository.revision_tree(self.base_id)
- return tree.get_file_text(file_id)
-
- def get_file_with_stat(self, file_id, path=None):
- content = self.get_content(file_id)
- return (StringIO.StringIO(content), None)
-
- def get_symlink_target(self, file_id):
- return self.get_content(file_id)
-
- def id2path(self, file_id):
- path, mark = self.rev_files[file_id]
- return path
-
-def c_style_unescape(string):
- if string[0] == string[-1] == '"':
- return string.decode('string-escape')[1:-1]
- return string
-
-def parse_commit(parser):
- parents = []
-
- ref = parser[1]
- parser.next()
-
- if ref.startswith('refs/heads/'):
- name = ref[len('refs/heads/'):]
- branch = get_remote_branch(name)
- else:
- die('unknown ref')
-
- commit_mark = parser.get_mark()
- parser.next()
- author = parser.get_author()
- parser.next()
- committer = parser.get_author()
- parser.next()
- data = parser.get_data()
- parser.next()
- if parser.check('from'):
- parents.append(parser.get_mark())
- parser.next()
- while parser.check('merge'):
- parents.append(parser.get_mark())
- parser.next()
-
- # fast-export adds an extra newline
- if data[-1] == '\n':
- data = data[:-1]
-
- files = {}
-
- for line in parser:
- if parser.check('M'):
- t, m, mark_ref, path = line.split(' ', 3)
- mark = int(mark_ref[1:])
- f = { 'mode' : m, 'mark' : mark }
- elif parser.check('D'):
- t, path = line.split(' ', 1)
- f = { 'deleted' : True }
- else:
- die('Unknown file command: %s' % line)
- path = c_style_unescape(path).decode('utf-8')
- files[path] = f
-
- committer, date, tz = committer
- parents = [mark_to_rev(p) for p in parents]
- revid = bzrlib.generate_ids.gen_revision_id(committer, date)
- props = {}
- props['branch-nick'] = branch.nick
-
- mtree = CustomTree(branch, revid, parents, files)
- changes = mtree.iter_changes()
-
- branch.lock_write()
- try:
- builder = branch.get_commit_builder(parents, None, date, tz, committer, props, revid)
- try:
- list(builder.record_iter_changes(mtree, mtree.last_revision(), changes))
- builder.finish_inventory()
- builder.commit(data.decode('utf-8', 'replace'))
- except Exception, e:
- builder.abort()
- raise
- finally:
- branch.unlock()
-
- parsed_refs[ref] = revid
- marks.new_mark(revid, commit_mark)
-
-def parse_reset(parser):
- ref = parser[1]
- parser.next()
-
- # ugh
- if parser.check('commit'):
- parse_commit(parser)
- return
- if not parser.check('from'):
- return
- from_mark = parser.get_mark()
- parser.next()
-
- parsed_refs[ref] = mark_to_rev(from_mark)
-
-def do_export(parser):
- parser.next()
-
- for line in parser.each_block('done'):
- if parser.check('blob'):
- parse_blob(parser)
- elif parser.check('commit'):
- parse_commit(parser)
- elif parser.check('reset'):
- parse_reset(parser)
- elif parser.check('tag'):
- pass
- elif parser.check('feature'):
- pass
- else:
- die('unhandled export command: %s' % line)
-
- for ref, revid in parsed_refs.iteritems():
- if ref.startswith('refs/heads/'):
- name = ref[len('refs/heads/'):]
- branch = get_remote_branch(name)
- branch.generate_revision_history(revid, marks.get_tip(name))
-
- if name in peers:
- peer = bzrlib.branch.Branch.open(peers[name],
- possible_transports=transports)
- try:
- peer.bzrdir.push_branch(branch, revision_id=revid)
- except bzrlib.errors.DivergedBranches:
- print "error %s non-fast forward" % ref
- continue
-
- try:
- wt = branch.bzrdir.open_workingtree()
- wt.update()
- except bzrlib.errors.NoWorkingTree:
- pass
- elif ref.startswith('refs/tags/'):
- # TODO: implement tag push
- print "error %s pushing tags not supported" % ref
- continue
- else:
- # transport-helper/fast-export bugs
- continue
-
- print "ok %s" % ref
-
- print
-
-def do_capabilities(parser):
- print "import"
- print "export"
- print "refspec refs/heads/*:%s/heads/*" % prefix
- print "refspec refs/tags/*:%s/tags/*" % prefix
-
- path = os.path.join(dirname, 'marks-git')
-
- if os.path.exists(path):
- print "*import-marks %s" % path
- print "*export-marks %s" % path
-
- print
-
-def ref_is_valid(name):
- return not True in [c in name for c in '~^: \\']
-
-def do_list(parser):
- master_branch = None
-
- for name in branches:
- if not master_branch:
- master_branch = name
- print "? refs/heads/%s" % name
-
- branch = get_remote_branch(master_branch)
- branch.lock_read()
- for tag, revid in branch.tags.get_tag_dict().items():
- try:
- branch.revision_id_to_dotted_revno(revid)
- except bzrlib.errors.NoSuchRevision:
- continue
- if not ref_is_valid(tag):
- continue
- print "? refs/tags/%s" % tag
- tags[tag] = revid
- branch.unlock()
-
- print "@refs/heads/%s HEAD" % master_branch
- print
-
-def clone(path, remote_branch):
- try:
- bdir = bzrlib.bzrdir.BzrDir.create(path, possible_transports=transports)
- except bzrlib.errors.AlreadyControlDirError:
- bdir = bzrlib.bzrdir.BzrDir.open(path, possible_transports=transports)
- repo = bdir.find_repository()
- repo.fetch(remote_branch.repository)
- return remote_branch.sprout(bdir, repository=repo)
-
-def get_remote_branch(name):
- remote_branch = bzrlib.branch.Branch.open(branches[name],
- possible_transports=transports)
- if isinstance(remote_branch.user_transport, bzrlib.transport.local.LocalTransport):
- return remote_branch
-
- branch_path = os.path.join(dirname, 'clone', name)
-
- try:
- branch = bzrlib.branch.Branch.open(branch_path,
- possible_transports=transports)
- except bzrlib.errors.NotBranchError:
- # clone
- branch = clone(branch_path, remote_branch)
- else:
- # pull
- try:
- branch.pull(remote_branch, overwrite=True)
- except bzrlib.errors.DivergedBranches:
- # use remote branch for now
- return remote_branch
-
- return branch
-
-def find_branches(repo):
- transport = repo.bzrdir.root_transport
-
- for fn in transport.iter_files_recursive():
- if not fn.endswith('.bzr/branch-format'):
- continue
-
- name = subdir = fn[:-len('/.bzr/branch-format')]
- name = name if name != '' else 'master'
- name = name.replace('/', '+')
-
- try:
- cur = transport.clone(subdir)
- branch = bzrlib.branch.Branch.open_from_transport(cur)
- except bzrlib.errors.NotBranchError:
- continue
- else:
- yield name, branch.base
-
-def get_repo(url, alias):
- normal_url = bzrlib.urlutils.normalize_url(url)
- origin = bzrlib.bzrdir.BzrDir.open(url, possible_transports=transports)
- is_local = isinstance(origin.transport, bzrlib.transport.local.LocalTransport)
-
- shared_path = os.path.join(gitdir, 'bzr')
- try:
- shared_dir = bzrlib.bzrdir.BzrDir.open(shared_path,
- possible_transports=transports)
- except bzrlib.errors.NotBranchError:
- shared_dir = bzrlib.bzrdir.BzrDir.create(shared_path,
- possible_transports=transports)
- try:
- shared_repo = shared_dir.open_repository()
- except bzrlib.errors.NoRepositoryPresent:
- shared_repo = shared_dir.create_repository(shared=True)
-
- if not is_local:
- clone_path = os.path.join(dirname, 'clone')
- if not os.path.exists(clone_path):
- os.mkdir(clone_path)
- else:
- # check and remove old organization
- try:
- bdir = bzrlib.bzrdir.BzrDir.open(clone_path,
- possible_transports=transports)
- bdir.destroy_repository()
- except bzrlib.errors.NotBranchError:
- pass
- except bzrlib.errors.NoRepositoryPresent:
- pass
-
- wanted = get_config('remote.%s.bzr-branches' % alias).rstrip().split(', ')
- # stupid python
- wanted = [e for e in wanted if e]
- if not wanted:
- wanted = get_config('remote-bzr.branches').rstrip().split(', ')
- # stupid python
- wanted = [e for e in wanted if e]
-
- if not wanted:
- try:
- repo = origin.open_repository()
- if not repo.user_transport.listable():
- # this repository is not usable for us
- raise bzrlib.errors.NoRepositoryPresent(repo.bzrdir)
- except bzrlib.errors.NoRepositoryPresent:
- wanted = ['master']
-
- if wanted:
- def list_wanted(url, wanted):
- for name in wanted:
- subdir = name if name != 'master' else ''
- yield name, bzrlib.urlutils.join(url, subdir)
-
- branch_list = list_wanted(url, wanted)
- else:
- branch_list = find_branches(repo)
-
- for name, url in branch_list:
- if not is_local:
- peers[name] = url
- branches[name] = url
-
- return origin
-
-def fix_path(alias, orig_url):
- url = urlparse.urlparse(orig_url, 'file')
- if url.scheme != 'file' or os.path.isabs(url.path):
- return
- abs_url = urlparse.urljoin("%s/" % os.getcwd(), orig_url)
- cmd = ['git', 'config', 'remote.%s.url' % alias, "bzr::%s" % abs_url]
- subprocess.call(cmd)
-
-def main(args):
- global marks, prefix, gitdir, dirname
- global tags, filenodes
- global blob_marks
- global parsed_refs
- global files_cache
- global is_tmp
- global branches, peers
- global transports
-
- marks = None
- is_tmp = False
- gitdir = os.environ.get('GIT_DIR', None)
-
- if len(args) < 3:
- die('Not enough arguments.')
-
- if not gitdir:
- die('GIT_DIR not set')
-
- alias = args[1]
- url = args[2]
-
- tags = {}
- filenodes = {}
- blob_marks = {}
- parsed_refs = {}
- files_cache = {}
- branches = {}
- peers = {}
- transports = []
-
- if alias[5:] == url:
- is_tmp = True
- alias = hashlib.sha1(alias).hexdigest()
-
- prefix = 'refs/bzr/%s' % alias
- dirname = os.path.join(gitdir, 'bzr', alias)
-
- if not is_tmp:
- fix_path(alias, url)
-
- if not os.path.exists(dirname):
- os.makedirs(dirname)
-
- if hasattr(bzrlib.ui.ui_factory, 'be_quiet'):
- bzrlib.ui.ui_factory.be_quiet(True)
-
- repo = get_repo(url, alias)
-
- marks_path = os.path.join(dirname, 'marks-int')
- marks = Marks(marks_path)
-
- parser = Parser(repo)
- for line in parser:
- if parser.check('capabilities'):
- do_capabilities(parser)
- elif parser.check('list'):
- do_list(parser)
- elif parser.check('import'):
- do_import(parser)
- elif parser.check('export'):
- do_export(parser)
- else:
- die('unhandled command: %s' % line)
- sys.stdout.flush()
-def bye():
- if not marks:
- return
- if not is_tmp:
- marks.store()
- else:
- shutil.rmtree(dirname)
+sys.stderr.write('WARNING: git-remote-bzr is now maintained independently.\n')
+sys.stderr.write('WARNING: For more information visit https://github.com/felipec/git-remote-bzr\n')
-atexit.register(bye)
-sys.exit(main(sys.argv))
+sys.stderr.write('''WARNING:
+WARNING: You can pick a directory on your $PATH and download it, e.g.:
+WARNING: $ wget -O $HOME/bin/git-remote-bzr \\
+WARNING: https://raw.github.com/felipec/git-remote-bzr/master/git-remote-bzr
+WARNING: $ chmod +x $HOME/bin/git-remote-bzr
+''')
diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg
index eb89ef6779..4255ad6312 100755
--- a/contrib/remote-helpers/git-remote-hg
+++ b/contrib/remote-helpers/git-remote-hg
@@ -1,1254 +1,13 @@
#!/usr/bin/env python
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-# Inspired by Rocco Rutte's hg-fast-export
-
-# Just copy to your ~/bin, or anywhere in your $PATH.
-# Then you can clone with:
-# git clone hg::/path/to/mercurial/repo/
-#
-# For remote repositories a local clone is stored in
-# "$GIT_DIR/hg/origin/clone/.hg/".
-
-from mercurial import hg, ui, bookmarks, context, encoding, node, error, extensions, discovery, util
-
-import re
import sys
-import os
-import json
-import shutil
-import subprocess
-import urllib
-import atexit
-import urlparse, hashlib
-import time as ptime
-
-#
-# If you want to see Mercurial revisions as Git commit notes:
-# git config core.notesRef refs/notes/hg
-#
-# If you are not in hg-git-compat mode and want to disable the tracking of
-# named branches:
-# git config --global remote-hg.track-branches false
-#
-# If you want the equivalent of hg's clone/pull--insecure option:
-# git config --global remote-hg.insecure true
-#
-# If you want to switch to hg-git compatibility mode:
-# git config --global remote-hg.hg-git-compat true
-#
-# git:
-# Sensible defaults for git.
-# hg bookmarks are exported as git branches, hg branches are prefixed
-# with 'branches/', HEAD is a special case.
-#
-# hg:
-# Emulate hg-git.
-# Only hg bookmarks are exported as git branches.
-# Commits are modified to preserve hg information and allow bidirectionality.
-#
-
-NAME_RE = re.compile('^([^<>]+)')
-AUTHOR_RE = re.compile('^([^<>]+?)? ?[<>]([^<>]*)(?:$|>)')
-EMAIL_RE = re.compile(r'([^ \t<>]+@[^ \t<>]+)')
-AUTHOR_HG_RE = re.compile('^(.*?) ?<(.*?)(?:>(.+)?)?$')
-RAW_AUTHOR_RE = re.compile('^(\w+) (?:(.+)? )?<(.*)> (\d+) ([+-]\d+)')
-
-VERSION = 2
-
-def die(msg, *args):
- sys.stderr.write('ERROR: %s\n' % (msg % args))
- sys.exit(1)
-
-def warn(msg, *args):
- sys.stderr.write('WARNING: %s\n' % (msg % args))
-
-def gitmode(flags):
- return 'l' in flags and '120000' or 'x' in flags and '100755' or '100644'
-
-def gittz(tz):
- return '%+03d%02d' % (-tz / 3600, -tz % 3600 / 60)
-
-def hgmode(mode):
- m = { '100755': 'x', '120000': 'l' }
- return m.get(mode, '')
-
-def hghex(n):
- return node.hex(n)
-
-def hgbin(n):
- return node.bin(n)
-
-def hgref(ref):
- return ref.replace('___', ' ')
-
-def gitref(ref):
- return ref.replace(' ', '___')
-
-def check_version(*check):
- if not hg_version:
- return True
- return hg_version >= check
-
-def get_config(config):
- cmd = ['git', 'config', '--get', config]
- process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
- output, _ = process.communicate()
- return output
-
-def get_config_bool(config, default=False):
- value = get_config(config).rstrip('\n')
- if value == "true":
- return True
- elif value == "false":
- return False
- else:
- return default
-
-class Marks:
-
- def __init__(self, path, repo):
- self.path = path
- self.repo = repo
- self.clear()
- self.load()
-
- if self.version < VERSION:
- if self.version == 1:
- self.upgrade_one()
-
- # upgraded?
- if self.version < VERSION:
- self.clear()
- self.version = VERSION
-
- def clear(self):
- self.tips = {}
- self.marks = {}
- self.rev_marks = {}
- self.last_mark = 0
- self.version = 0
- self.last_note = 0
-
- def load(self):
- if not os.path.exists(self.path):
- return
-
- tmp = json.load(open(self.path))
-
- self.tips = tmp['tips']
- self.marks = tmp['marks']
- self.last_mark = tmp['last-mark']
- self.version = tmp.get('version', 1)
- self.last_note = tmp.get('last-note', 0)
-
- for rev, mark in self.marks.iteritems():
- self.rev_marks[mark] = rev
-
- def upgrade_one(self):
- def get_id(rev):
- return hghex(self.repo.changelog.node(int(rev)))
- self.tips = dict((name, get_id(rev)) for name, rev in self.tips.iteritems())
- self.marks = dict((get_id(rev), mark) for rev, mark in self.marks.iteritems())
- self.rev_marks = dict((mark, get_id(rev)) for mark, rev in self.rev_marks.iteritems())
- self.version = 2
-
- def dict(self):
- return { 'tips': self.tips, 'marks': self.marks, 'last-mark' : self.last_mark, 'version' : self.version, 'last-note' : self.last_note }
-
- def store(self):
- json.dump(self.dict(), open(self.path, 'w'))
-
- def __str__(self):
- return str(self.dict())
-
- def from_rev(self, rev):
- return self.marks[rev]
-
- def to_rev(self, mark):
- return str(self.rev_marks[mark])
-
- def next_mark(self):
- self.last_mark += 1
- return self.last_mark
-
- def get_mark(self, rev):
- self.last_mark += 1
- self.marks[rev] = self.last_mark
- return self.last_mark
-
- def new_mark(self, rev, mark):
- self.marks[rev] = mark
- self.rev_marks[mark] = rev
- self.last_mark = mark
-
- def is_marked(self, rev):
- return rev in self.marks
-
- def get_tip(self, branch):
- return str(self.tips[branch])
-
- def set_tip(self, branch, tip):
- self.tips[branch] = tip
-
-class Parser:
-
- def __init__(self, repo):
- self.repo = repo
- self.line = self.get_line()
-
- def get_line(self):
- return sys.stdin.readline().strip()
-
- def __getitem__(self, i):
- return self.line.split()[i]
-
- def check(self, word):
- return self.line.startswith(word)
-
- def each_block(self, separator):
- while self.line != separator:
- yield self.line
- self.line = self.get_line()
-
- def __iter__(self):
- return self.each_block('')
-
- def next(self):
- self.line = self.get_line()
- if self.line == 'done':
- self.line = None
-
- def get_mark(self):
- i = self.line.index(':') + 1
- return int(self.line[i:])
-
- def get_data(self):
- if not self.check('data'):
- return None
- i = self.line.index(' ') + 1
- size = int(self.line[i:])
- return sys.stdin.read(size)
-
- def get_author(self):
- ex = None
- m = RAW_AUTHOR_RE.match(self.line)
- if not m:
- return None
- _, name, email, date, tz = m.groups()
- if name and 'ext:' in name:
- m = re.match('^(.+?) ext:\((.+)\)$', name)
- if m:
- name = m.group(1)
- ex = urllib.unquote(m.group(2))
-
- if email != bad_mail:
- if name:
- user = '%s <%s>' % (name, email)
- else:
- user = '<%s>' % (email)
- else:
- user = name
-
- if ex:
- user += ex
-
- tz = int(tz)
- tz = ((tz / 100) * 3600) + ((tz % 100) * 60)
- return (user, int(date), -tz)
-
-def fix_file_path(path):
- if not os.path.isabs(path):
- return path
- return os.path.relpath(path, '/')
-
-def export_files(files):
- final = []
- for f in files:
- fid = node.hex(f.filenode())
-
- if fid in filenodes:
- mark = filenodes[fid]
- else:
- mark = marks.next_mark()
- filenodes[fid] = mark
- d = f.data()
-
- print "blob"
- print "mark :%u" % mark
- print "data %d" % len(d)
- print d
-
- path = fix_file_path(f.path())
- final.append((gitmode(f.flags()), mark, path))
-
- return final
-
-def get_filechanges(repo, ctx, parent):
- modified = set()
- added = set()
- removed = set()
-
- # load earliest manifest first for caching reasons
- prev = parent.manifest().copy()
- cur = ctx.manifest()
-
- for fn in cur:
- if fn in prev:
- if (cur.flags(fn) != prev.flags(fn) or cur[fn] != prev[fn]):
- modified.add(fn)
- del prev[fn]
- else:
- added.add(fn)
- removed |= set(prev.keys())
-
- return added | modified, removed
-
-def fixup_user_git(user):
- name = mail = None
- user = user.replace('"', '')
- m = AUTHOR_RE.match(user)
- if m:
- name = m.group(1)
- mail = m.group(2).strip()
- else:
- m = EMAIL_RE.match(user)
- if m:
- mail = m.group(1)
- else:
- m = NAME_RE.match(user)
- if m:
- name = m.group(1).strip()
- return (name, mail)
-
-def fixup_user_hg(user):
- def sanitize(name):
- # stole this from hg-git
- return re.sub('[<>\n]', '?', name.lstrip('< ').rstrip('> '))
-
- m = AUTHOR_HG_RE.match(user)
- if m:
- name = sanitize(m.group(1))
- mail = sanitize(m.group(2))
- ex = m.group(3)
- if ex:
- name += ' ext:(' + urllib.quote(ex) + ')'
- else:
- name = sanitize(user)
- if '@' in user:
- mail = name
- else:
- mail = None
-
- return (name, mail)
-
-def fixup_user(user):
- if mode == 'git':
- name, mail = fixup_user_git(user)
- else:
- name, mail = fixup_user_hg(user)
-
- if not name:
- name = bad_name
- if not mail:
- mail = bad_mail
-
- return '%s <%s>' % (name, mail)
-
-def updatebookmarks(repo, peer):
- remotemarks = peer.listkeys('bookmarks')
- localmarks = repo._bookmarks
-
- if not remotemarks:
- return
-
- for k, v in remotemarks.iteritems():
- localmarks[k] = hgbin(v)
-
- if hasattr(localmarks, 'write'):
- localmarks.write()
- else:
- bookmarks.write(repo)
-
-def get_repo(url, alias):
- global peer
-
- myui = ui.ui()
- myui.setconfig('ui', 'interactive', 'off')
- myui.fout = sys.stderr
-
- if get_config_bool('remote-hg.insecure'):
- myui.setconfig('web', 'cacerts', '')
-
- extensions.loadall(myui)
-
- if hg.islocal(url) and not os.environ.get('GIT_REMOTE_HG_TEST_REMOTE'):
- repo = hg.repository(myui, url)
- if not os.path.exists(dirname):
- os.makedirs(dirname)
- else:
- shared_path = os.path.join(gitdir, 'hg')
-
- # check and upgrade old organization
- hg_path = os.path.join(shared_path, '.hg')
- if os.path.exists(shared_path) and not os.path.exists(hg_path):
- repos = os.listdir(shared_path)
- for x in repos:
- local_hg = os.path.join(shared_path, x, 'clone', '.hg')
- if not os.path.exists(local_hg):
- continue
- if not os.path.exists(hg_path):
- shutil.move(local_hg, hg_path)
- shutil.rmtree(os.path.join(shared_path, x, 'clone'))
-
- # setup shared repo (if not there)
- try:
- hg.peer(myui, {}, shared_path, create=True)
- except error.RepoError:
- pass
-
- if not os.path.exists(dirname):
- os.makedirs(dirname)
-
- local_path = os.path.join(dirname, 'clone')
- if not os.path.exists(local_path):
- hg.share(myui, shared_path, local_path, update=False)
- else:
- # make sure the shared path is always up-to-date
- util.writefile(os.path.join(local_path, '.hg', 'sharedpath'), hg_path)
-
- repo = hg.repository(myui, local_path)
- try:
- peer = hg.peer(myui, {}, url)
- except:
- die('Repository error')
- repo.pull(peer, heads=None, force=True)
-
- updatebookmarks(repo, peer)
-
- return repo
-
-def rev_to_mark(rev):
- return marks.from_rev(rev.hex())
-
-def mark_to_rev(mark):
- return marks.to_rev(mark)
-
-def export_ref(repo, name, kind, head):
- ename = '%s/%s' % (kind, name)
- try:
- tip = marks.get_tip(ename)
- tip = repo[tip].rev()
- except:
- tip = 0
-
- revs = xrange(tip, head.rev() + 1)
- total = len(revs)
-
- for rev in revs:
-
- c = repo[rev]
- node = c.node()
-
- if marks.is_marked(c.hex()):
- continue
-
- (manifest, user, (time, tz), files, desc, extra) = repo.changelog.read(node)
- rev_branch = extra['branch']
-
- author = "%s %d %s" % (fixup_user(user), time, gittz(tz))
- if 'committer' in extra:
- user, time, tz = extra['committer'].rsplit(' ', 2)
- committer = "%s %s %s" % (user, time, gittz(int(tz)))
- else:
- committer = author
-
- parents = [repo[p] for p in repo.changelog.parentrevs(rev) if p >= 0]
-
- if len(parents) == 0:
- modified = c.manifest().keys()
- removed = []
- else:
- modified, removed = get_filechanges(repo, c, parents[0])
-
- desc += '\n'
-
- if mode == 'hg':
- extra_msg = ''
-
- if rev_branch != 'default':
- extra_msg += 'branch : %s\n' % rev_branch
-
- renames = []
- for f in c.files():
- if f not in c.manifest():
- continue
- rename = c.filectx(f).renamed()
- if rename:
- renames.append((rename[0], f))
-
- for e in renames:
- extra_msg += "rename : %s => %s\n" % e
-
- for key, value in extra.iteritems():
- if key in ('author', 'committer', 'encoding', 'message', 'branch', 'hg-git'):
- continue
- else:
- extra_msg += "extra : %s : %s\n" % (key, urllib.quote(value))
-
- if extra_msg:
- desc += '\n--HG--\n' + extra_msg
-
- if len(parents) == 0 and rev:
- print 'reset %s/%s' % (prefix, ename)
-
- modified_final = export_files(c.filectx(f) for f in modified)
-
- print "commit %s/%s" % (prefix, ename)
- print "mark :%d" % (marks.get_mark(c.hex()))
- print "author %s" % (author)
- print "committer %s" % (committer)
- print "data %d" % (len(desc))
- print desc
-
- if len(parents) > 0:
- print "from :%s" % (rev_to_mark(parents[0]))
- if len(parents) > 1:
- print "merge :%s" % (rev_to_mark(parents[1]))
-
- for f in removed:
- print "D %s" % (fix_file_path(f))
- for f in modified_final:
- print "M %s :%u %s" % f
- print
-
- progress = (rev - tip)
- if (progress % 100 == 0):
- print "progress revision %d '%s' (%d/%d)" % (rev, name, progress, total)
-
- # make sure the ref is updated
- print "reset %s/%s" % (prefix, ename)
- print "from :%u" % rev_to_mark(head)
- print
-
- pending_revs = set(revs) - notes
- if pending_revs:
- note_mark = marks.next_mark()
- ref = "refs/notes/hg"
-
- print "commit %s" % ref
- print "mark :%d" % (note_mark)
- print "committer remote-hg <> %d %s" % (ptime.time(), gittz(ptime.timezone))
- desc = "Notes for %s\n" % (name)
- print "data %d" % (len(desc))
- print desc
- if marks.last_note:
- print "from :%u" % marks.last_note
-
- for rev in pending_revs:
- notes.add(rev)
- c = repo[rev]
- print "N inline :%u" % rev_to_mark(c)
- msg = c.hex()
- print "data %d" % (len(msg))
- print msg
- print
-
- marks.last_note = note_mark
-
- marks.set_tip(ename, head.hex())
-
-def export_tag(repo, tag):
- export_ref(repo, tag, 'tags', repo[hgref(tag)])
-
-def export_bookmark(repo, bmark):
- head = bmarks[hgref(bmark)]
- export_ref(repo, bmark, 'bookmarks', head)
-
-def export_branch(repo, branch):
- tip = get_branch_tip(repo, branch)
- head = repo[tip]
- export_ref(repo, branch, 'branches', head)
-
-def export_head(repo):
- export_ref(repo, g_head[0], 'bookmarks', g_head[1])
-
-def do_capabilities(parser):
- print "import"
- print "export"
- print "refspec refs/heads/branches/*:%s/branches/*" % prefix
- print "refspec refs/heads/*:%s/bookmarks/*" % prefix
- print "refspec refs/tags/*:%s/tags/*" % prefix
-
- path = os.path.join(dirname, 'marks-git')
-
- if os.path.exists(path):
- print "*import-marks %s" % path
- print "*export-marks %s" % path
- print "option"
-
- print
-
-def branch_tip(branch):
- return branches[branch][-1]
-
-def get_branch_tip(repo, branch):
- heads = branches.get(hgref(branch), None)
- if not heads:
- return None
-
- # verify there's only one head
- if (len(heads) > 1):
- warn("Branch '%s' has more than one head, consider merging" % branch)
- return branch_tip(hgref(branch))
-
- return heads[0]
-
-def list_head(repo, cur):
- global g_head, fake_bmark
-
- if 'default' not in branches:
- # empty repo
- return
-
- node = repo[branch_tip('default')]
- head = 'master' if not 'master' in bmarks else 'default'
- fake_bmark = head
- bmarks[head] = node
-
- head = gitref(head)
- print "@refs/heads/%s HEAD" % head
- g_head = (head, node)
-
-def do_list(parser):
- repo = parser.repo
- for bmark, node in bookmarks.listbookmarks(repo).iteritems():
- bmarks[bmark] = repo[node]
-
- cur = repo.dirstate.branch()
- orig = peer if peer else repo
-
- for branch, heads in orig.branchmap().iteritems():
- # only open heads
- heads = [h for h in heads if 'close' not in repo.changelog.read(h)[5]]
- if heads:
- branches[branch] = heads
-
- list_head(repo, cur)
-
- if track_branches:
- for branch in branches:
- print "? refs/heads/branches/%s" % gitref(branch)
-
- for bmark in bmarks:
- print "? refs/heads/%s" % gitref(bmark)
-
- for tag, node in repo.tagslist():
- if tag == 'tip':
- continue
- print "? refs/tags/%s" % gitref(tag)
-
- print
-
-def do_import(parser):
- repo = parser.repo
-
- path = os.path.join(dirname, 'marks-git')
-
- print "feature done"
- if os.path.exists(path):
- print "feature import-marks=%s" % path
- print "feature export-marks=%s" % path
- print "feature force"
- sys.stdout.flush()
-
- tmp = encoding.encoding
- encoding.encoding = 'utf-8'
-
- # lets get all the import lines
- while parser.check('import'):
- ref = parser[1]
-
- if (ref == 'HEAD'):
- export_head(repo)
- elif ref.startswith('refs/heads/branches/'):
- branch = ref[len('refs/heads/branches/'):]
- export_branch(repo, branch)
- elif ref.startswith('refs/heads/'):
- bmark = ref[len('refs/heads/'):]
- export_bookmark(repo, bmark)
- elif ref.startswith('refs/tags/'):
- tag = ref[len('refs/tags/'):]
- export_tag(repo, tag)
-
- parser.next()
-
- encoding.encoding = tmp
-
- print 'done'
-
-def parse_blob(parser):
- parser.next()
- mark = parser.get_mark()
- parser.next()
- data = parser.get_data()
- blob_marks[mark] = data
- parser.next()
-
-def get_merge_files(repo, p1, p2, files):
- for e in repo[p1].files():
- if e not in files:
- if e not in repo[p1].manifest():
- continue
- f = { 'ctx' : repo[p1][e] }
- files[e] = f
-
-def c_style_unescape(string):
- if string[0] == string[-1] == '"':
- return string.decode('string-escape')[1:-1]
- return string
-
-def parse_commit(parser):
- from_mark = merge_mark = None
-
- ref = parser[1]
- parser.next()
-
- commit_mark = parser.get_mark()
- parser.next()
- author = parser.get_author()
- parser.next()
- committer = parser.get_author()
- parser.next()
- data = parser.get_data()
- parser.next()
- if parser.check('from'):
- from_mark = parser.get_mark()
- parser.next()
- if parser.check('merge'):
- merge_mark = parser.get_mark()
- parser.next()
- if parser.check('merge'):
- die('octopus merges are not supported yet')
-
- # fast-export adds an extra newline
- if data[-1] == '\n':
- data = data[:-1]
-
- files = {}
-
- for line in parser:
- if parser.check('M'):
- t, m, mark_ref, path = line.split(' ', 3)
- mark = int(mark_ref[1:])
- f = { 'mode' : hgmode(m), 'data' : blob_marks[mark] }
- elif parser.check('D'):
- t, path = line.split(' ', 1)
- f = { 'deleted' : True }
- else:
- die('Unknown file command: %s' % line)
- path = c_style_unescape(path)
- files[path] = f
-
- # only export the commits if we are on an internal proxy repo
- if dry_run and not peer:
- parsed_refs[ref] = None
- return
-
- def getfilectx(repo, memctx, f):
- of = files[f]
- if 'deleted' in of:
- raise IOError
- if 'ctx' in of:
- return of['ctx']
- is_exec = of['mode'] == 'x'
- is_link = of['mode'] == 'l'
- rename = of.get('rename', None)
- return context.memfilectx(f, of['data'],
- is_link, is_exec, rename)
-
- repo = parser.repo
-
- user, date, tz = author
- extra = {}
-
- if committer != author:
- extra['committer'] = "%s %u %u" % committer
-
- if from_mark:
- p1 = mark_to_rev(from_mark)
- else:
- p1 = '0' * 40
-
- if merge_mark:
- p2 = mark_to_rev(merge_mark)
- else:
- p2 = '0' * 40
-
- #
- # If files changed from any of the parents, hg wants to know, but in git if
- # nothing changed from the first parent, nothing changed.
- #
- if merge_mark:
- get_merge_files(repo, p1, p2, files)
-
- # Check if the ref is supposed to be a named branch
- if ref.startswith('refs/heads/branches/'):
- branch = ref[len('refs/heads/branches/'):]
- extra['branch'] = hgref(branch)
-
- if mode == 'hg':
- i = data.find('\n--HG--\n')
- if i >= 0:
- tmp = data[i + len('\n--HG--\n'):].strip()
- for k, v in [e.split(' : ', 1) for e in tmp.split('\n')]:
- if k == 'rename':
- old, new = v.split(' => ', 1)
- files[new]['rename'] = old
- elif k == 'branch':
- extra[k] = v
- elif k == 'extra':
- ek, ev = v.split(' : ', 1)
- extra[ek] = urllib.unquote(ev)
- data = data[:i]
-
- ctx = context.memctx(repo, (p1, p2), data,
- files.keys(), getfilectx,
- user, (date, tz), extra)
-
- tmp = encoding.encoding
- encoding.encoding = 'utf-8'
-
- node = hghex(repo.commitctx(ctx))
-
- encoding.encoding = tmp
-
- parsed_refs[ref] = node
- marks.new_mark(node, commit_mark)
-
-def parse_reset(parser):
- ref = parser[1]
- parser.next()
- # ugh
- if parser.check('commit'):
- parse_commit(parser)
- return
- if not parser.check('from'):
- return
- from_mark = parser.get_mark()
- parser.next()
-
- try:
- rev = mark_to_rev(from_mark)
- except KeyError:
- rev = None
- parsed_refs[ref] = rev
-
-def parse_tag(parser):
- name = parser[1]
- parser.next()
- from_mark = parser.get_mark()
- parser.next()
- tagger = parser.get_author()
- parser.next()
- data = parser.get_data()
- parser.next()
-
- parsed_tags[name] = (tagger, data)
-
-def write_tag(repo, tag, node, msg, author):
- branch = repo[node].branch()
- tip = branch_tip(branch)
- tip = repo[tip]
-
- def getfilectx(repo, memctx, f):
- try:
- fctx = tip.filectx(f)
- data = fctx.data()
- except error.ManifestLookupError:
- data = ""
- content = data + "%s %s\n" % (node, tag)
- return context.memfilectx(f, content, False, False, None)
-
- p1 = tip.hex()
- p2 = '0' * 40
- if author:
- user, date, tz = author
- date_tz = (date, tz)
- else:
- cmd = ['git', 'var', 'GIT_COMMITTER_IDENT']
- process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
- output, _ = process.communicate()
- m = re.match('^.* <.*>', output)
- if m:
- user = m.group(0)
- else:
- user = repo.ui.username()
- date_tz = None
-
- ctx = context.memctx(repo, (p1, p2), msg,
- ['.hgtags'], getfilectx,
- user, date_tz, {'branch' : branch})
-
- tmp = encoding.encoding
- encoding.encoding = 'utf-8'
-
- tagnode = repo.commitctx(ctx)
-
- encoding.encoding = tmp
-
- return (tagnode, branch)
-
-def checkheads_bmark(repo, ref, ctx):
- bmark = ref[len('refs/heads/'):]
- if not bmark in bmarks:
- # new bmark
- return True
-
- ctx_old = bmarks[bmark]
- ctx_new = ctx
- if not repo.changelog.descendant(ctx_old.rev(), ctx_new.rev()):
- if force_push:
- print "ok %s forced update" % ref
- else:
- print "error %s non-fast forward" % ref
- return False
-
- return True
-
-def checkheads(repo, remote, p_revs):
-
- remotemap = remote.branchmap()
- if not remotemap:
- # empty repo
- return True
-
- new = {}
- ret = True
-
- for node, ref in p_revs.iteritems():
- ctx = repo[node]
- branch = ctx.branch()
- if not branch in remotemap:
- # new branch
- continue
- if not ref.startswith('refs/heads/branches'):
- if ref.startswith('refs/heads/'):
- if not checkheads_bmark(repo, ref, ctx):
- ret = False
-
- # only check branches
- continue
- new.setdefault(branch, []).append(ctx.rev())
-
- for branch, heads in new.iteritems():
- old = [repo.changelog.rev(x) for x in remotemap[branch]]
- for rev in heads:
- if check_version(2, 3):
- ancestors = repo.changelog.ancestors([rev], stoprev=min(old))
- else:
- ancestors = repo.changelog.ancestors(rev)
- found = False
-
- for x in old:
- if x in ancestors:
- found = True
- break
-
- if found:
- continue
-
- node = repo.changelog.node(rev)
- ref = p_revs[node]
- if force_push:
- print "ok %s forced update" % ref
- else:
- print "error %s non-fast forward" % ref
- ret = False
-
- return ret
-
-def push_unsafe(repo, remote, parsed_refs, p_revs):
-
- force = force_push
-
- fci = discovery.findcommonincoming
- commoninc = fci(repo, remote, force=force)
- common, _, remoteheads = commoninc
-
- if not checkheads(repo, remote, p_revs):
- return None
-
- cg = repo.getbundle('push', heads=list(p_revs), common=common)
-
- unbundle = remote.capable('unbundle')
- if unbundle:
- if force:
- remoteheads = ['force']
- return remote.unbundle(cg, remoteheads, 'push')
- else:
- return remote.addchangegroup(cg, 'push', repo.url())
-
-def push(repo, remote, parsed_refs, p_revs):
- if hasattr(remote, 'canpush') and not remote.canpush():
- print "error cannot push"
-
- if not p_revs:
- # nothing to push
- return
-
- lock = None
- unbundle = remote.capable('unbundle')
- if not unbundle:
- lock = remote.lock()
- try:
- ret = push_unsafe(repo, remote, parsed_refs, p_revs)
- finally:
- if lock is not None:
- lock.release()
-
- return ret
-
-def check_tip(ref, kind, name, heads):
- try:
- ename = '%s/%s' % (kind, name)
- tip = marks.get_tip(ename)
- except KeyError:
- return True
- else:
- return tip in heads
-
-def do_export(parser):
- p_bmarks = []
- p_revs = {}
-
- parser.next()
-
- for line in parser.each_block('done'):
- if parser.check('blob'):
- parse_blob(parser)
- elif parser.check('commit'):
- parse_commit(parser)
- elif parser.check('reset'):
- parse_reset(parser)
- elif parser.check('tag'):
- parse_tag(parser)
- elif parser.check('feature'):
- pass
- else:
- die('unhandled export command: %s' % line)
-
- need_fetch = False
-
- for ref, node in parsed_refs.iteritems():
- bnode = hgbin(node) if node else None
- if ref.startswith('refs/heads/branches'):
- branch = ref[len('refs/heads/branches/'):]
- if branch in branches and bnode in branches[branch]:
- # up to date
- continue
-
- if peer:
- remotemap = peer.branchmap()
- if remotemap and branch in remotemap:
- heads = [hghex(e) for e in remotemap[branch]]
- if not check_tip(ref, 'branches', branch, heads):
- print "error %s fetch first" % ref
- need_fetch = True
- continue
-
- p_revs[bnode] = ref
- print "ok %s" % ref
- elif ref.startswith('refs/heads/'):
- bmark = ref[len('refs/heads/'):]
- new = node
- old = bmarks[bmark].hex() if bmark in bmarks else ''
-
- if old == new:
- continue
-
- print "ok %s" % ref
- if bmark != fake_bmark and \
- not (bmark == 'master' and bmark not in parser.repo._bookmarks):
- p_bmarks.append((ref, bmark, old, new))
-
- if peer:
- remote_old = peer.listkeys('bookmarks').get(bmark)
- if remote_old:
- if not check_tip(ref, 'bookmarks', bmark, remote_old):
- print "error %s fetch first" % ref
- need_fetch = True
- continue
-
- p_revs[bnode] = ref
- elif ref.startswith('refs/tags/'):
- if dry_run:
- print "ok %s" % ref
- continue
- tag = ref[len('refs/tags/'):]
- tag = hgref(tag)
- author, msg = parsed_tags.get(tag, (None, None))
- if mode == 'git':
- if not msg:
- msg = 'Added tag %s for changeset %s' % (tag, node[:12])
- tagnode, branch = write_tag(parser.repo, tag, node, msg, author)
- p_revs[tagnode] = 'refs/heads/branches/' + gitref(branch)
- else:
- fp = parser.repo.opener('localtags', 'a')
- fp.write('%s %s\n' % (node, tag))
- fp.close()
- p_revs[bnode] = ref
- print "ok %s" % ref
- else:
- # transport-helper/fast-export bugs
- continue
-
- if need_fetch:
- print
- return
-
- if dry_run:
- if peer and not force_push:
- checkheads(parser.repo, peer, p_revs)
- print
- return
-
- if peer:
- if not push(parser.repo, peer, parsed_refs, p_revs):
- # do not update bookmarks
- print
- return
-
- # update remote bookmarks
- remote_bmarks = peer.listkeys('bookmarks')
- for ref, bmark, old, new in p_bmarks:
- if force_push:
- old = remote_bmarks.get(bmark, '')
- if not peer.pushkey('bookmarks', bmark, old, new):
- print "error %s" % ref
- else:
- # update local bookmarks
- for ref, bmark, old, new in p_bmarks:
- if not bookmarks.pushbookmark(parser.repo, bmark, old, new):
- print "error %s" % ref
-
- print
-
-def do_option(parser):
- global dry_run, force_push
- _, key, value = parser.line.split(' ')
- if key == 'dry-run':
- dry_run = (value == 'true')
- print 'ok'
- elif key == 'force':
- force_push = (value == 'true')
- print 'ok'
- else:
- print 'unsupported'
-
-def fix_path(alias, repo, orig_url):
- url = urlparse.urlparse(orig_url, 'file')
- if url.scheme != 'file' or os.path.isabs(os.path.expanduser(url.path)):
- return
- abs_url = urlparse.urljoin("%s/" % os.getcwd(), orig_url)
- cmd = ['git', 'config', 'remote.%s.url' % alias, "hg::%s" % abs_url]
- subprocess.call(cmd)
-
-def main(args):
- global prefix, gitdir, dirname, branches, bmarks
- global marks, blob_marks, parsed_refs
- global peer, mode, bad_mail, bad_name
- global track_branches, force_push, is_tmp
- global parsed_tags
- global filenodes
- global fake_bmark, hg_version
- global dry_run
- global notes, alias
-
- marks = None
- is_tmp = False
- gitdir = os.environ.get('GIT_DIR', None)
-
- if len(args) < 3:
- die('Not enough arguments.')
-
- if not gitdir:
- die('GIT_DIR not set')
-
- alias = args[1]
- url = args[2]
- peer = None
-
- hg_git_compat = get_config_bool('remote-hg.hg-git-compat')
- track_branches = get_config_bool('remote-hg.track-branches', True)
- force_push = False
-
- if hg_git_compat:
- mode = 'hg'
- bad_mail = 'none@none'
- bad_name = ''
- else:
- mode = 'git'
- bad_mail = 'unknown'
- bad_name = 'Unknown'
-
- if alias[4:] == url:
- is_tmp = True
- alias = hashlib.sha1(alias).hexdigest()
-
- dirname = os.path.join(gitdir, 'hg', alias)
- branches = {}
- bmarks = {}
- blob_marks = {}
- parsed_refs = {}
- parsed_tags = {}
- filenodes = {}
- fake_bmark = None
- try:
- hg_version = tuple(int(e) for e in util.version().split('.'))
- except:
- hg_version = None
- dry_run = False
- notes = set()
-
- repo = get_repo(url, alias)
- prefix = 'refs/hg/%s' % alias
-
- if not is_tmp:
- fix_path(alias, peer or repo, url)
-
- marks_path = os.path.join(dirname, 'marks-hg')
- marks = Marks(marks_path, repo)
-
- if sys.platform == 'win32':
- import msvcrt
- msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
-
- parser = Parser(repo)
- for line in parser:
- if parser.check('capabilities'):
- do_capabilities(parser)
- elif parser.check('list'):
- do_list(parser)
- elif parser.check('import'):
- do_import(parser)
- elif parser.check('export'):
- do_export(parser)
- elif parser.check('option'):
- do_option(parser)
- else:
- die('unhandled command: %s' % line)
- sys.stdout.flush()
-def bye():
- if not marks:
- return
- if not is_tmp:
- marks.store()
- else:
- shutil.rmtree(dirname)
+sys.stderr.write('WARNING: git-remote-hg is now maintained independently.\n')
+sys.stderr.write('WARNING: For more information visit https://github.com/felipec/git-remote-hg\n')
-atexit.register(bye)
-sys.exit(main(sys.argv))
+sys.stderr.write('''WARNING:
+WARNING: You can pick a directory on your $PATH and download it, e.g.:
+WARNING: $ wget -O $HOME/bin/git-remote-hg \\
+WARNING: https://raw.github.com/felipec/git-remote-hg/master/git-remote-hg
+WARNING: $ chmod +x $HOME/bin/git-remote-hg
+''')
diff --git a/contrib/remote-helpers/test-bzr.sh b/contrib/remote-helpers/test-bzr.sh
deleted file mode 100755
index 1e53ff9a58..0000000000
--- a/contrib/remote-helpers/test-bzr.sh
+++ /dev/null
@@ -1,394 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-
-test_description='Test remote-bzr'
-
-test -n "$TEST_DIRECTORY" || TEST_DIRECTORY=${0%/*}/../../t
-. "$TEST_DIRECTORY"/test-lib.sh
-
-if ! test_have_prereq PYTHON
-then
- skip_all='skipping remote-bzr tests; python not available'
- test_done
-fi
-
-if ! python -c 'import bzrlib'
-then
- skip_all='skipping remote-bzr tests; bzr not available'
- test_done
-fi
-
-check () {
- echo $3 >expected &&
- git --git-dir=$1/.git log --format='%s' -1 $2 >actual
- test_cmp expected actual
-}
-
-bzr whoami "A U Thor <author@example.com>"
-
-test_expect_success 'cloning' '
- (
- bzr init bzrrepo &&
- cd bzrrepo &&
- echo one >content &&
- bzr add content &&
- bzr commit -m one
- ) &&
-
- git clone "bzr::bzrrepo" gitrepo &&
- check gitrepo HEAD one
-'
-
-test_expect_success 'pulling' '
- (
- cd bzrrepo &&
- echo two >content &&
- bzr commit -m two
- ) &&
-
- (cd gitrepo && git pull) &&
-
- check gitrepo HEAD two
-'
-
-test_expect_success 'pushing' '
- (
- cd gitrepo &&
- echo three >content &&
- git commit -a -m three &&
- git push
- ) &&
-
- echo three >expected &&
- cat bzrrepo/content >actual &&
- test_cmp expected actual
-'
-
-test_expect_success 'roundtrip' '
- (
- cd gitrepo &&
- git pull &&
- git log --format="%s" -1 origin/master >actual
- ) &&
- echo three >expected &&
- test_cmp expected actual &&
-
- (cd gitrepo && git push && git pull) &&
-
- (
- cd bzrrepo &&
- echo four >content &&
- bzr commit -m four
- ) &&
-
- (cd gitrepo && git pull && git push) &&
-
- check gitrepo HEAD four &&
-
- (
- cd gitrepo &&
- echo five >content &&
- git commit -a -m five &&
- git push && git pull
- ) &&
-
- (cd bzrrepo && bzr revert) &&
-
- echo five >expected &&
- cat bzrrepo/content >actual &&
- test_cmp expected actual
-'
-
-cat >expected <<\EOF
-100644 blob 54f9d6da5c91d556e6b54340b1327573073030af content
-100755 blob 68769579c3eaadbe555379b9c3538e6628bae1eb executable
-120000 blob 6b584e8ece562ebffc15d38808cd6b98fc3d97ea link
-EOF
-
-test_expect_success 'special modes' '
- (
- cd bzrrepo &&
- echo exec >executable
- chmod +x executable &&
- bzr add executable
- bzr commit -m exec &&
- ln -s content link
- bzr add link
- bzr commit -m link &&
- mkdir dir &&
- bzr add dir &&
- bzr commit -m dir
- ) &&
-
- (
- cd gitrepo &&
- git pull
- git ls-tree HEAD >../actual
- ) &&
-
- test_cmp expected actual &&
-
- (
- cd gitrepo &&
- git cat-file -p HEAD:link >../actual
- ) &&
-
- printf content >expected &&
- test_cmp expected actual
-'
-
-cat >expected <<\EOF
-100644 blob 54f9d6da5c91d556e6b54340b1327573073030af content
-100755 blob 68769579c3eaadbe555379b9c3538e6628bae1eb executable
-120000 blob 6b584e8ece562ebffc15d38808cd6b98fc3d97ea link
-040000 tree 35c0caa46693cef62247ac89a680f0c5ce32b37b movedir-new
-EOF
-
-test_expect_success 'moving directory' '
- (
- cd bzrrepo &&
- mkdir movedir &&
- echo one >movedir/one &&
- echo two >movedir/two &&
- bzr add movedir &&
- bzr commit -m movedir &&
- bzr mv movedir movedir-new &&
- bzr commit -m movedir-new
- ) &&
-
- (
- cd gitrepo &&
- git pull &&
- git ls-tree HEAD >../actual
- ) &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'different authors' '
- (
- cd bzrrepo &&
- echo john >>content &&
- bzr commit -m john \
- --author "Jane Rey <jrey@example.com>" \
- --author "John Doe <jdoe@example.com>"
- ) &&
-
- (
- cd gitrepo &&
- git pull &&
- git show --format="%an <%ae>, %cn <%ce>" --quiet >../actual
- ) &&
-
- echo "Jane Rey <jrey@example.com>, A U Thor <author@example.com>" >expected &&
- test_cmp expected actual
-'
-
-# cleanup previous stuff
-rm -rf bzrrepo gitrepo
-
-test_expect_success 'fetch utf-8 filenames' '
- test_when_finished "rm -rf bzrrepo gitrepo && LC_ALL=C" &&
-
- LC_ALL=en_US.UTF-8
- export LC_ALL
-
- (
- bzr init bzrrepo &&
- cd bzrrepo &&
-
- echo test >>"ærø" &&
- bzr add "ærø" &&
- echo test >>"ø~?" &&
- bzr add "ø~?" &&
- bzr commit -m add-utf-8 &&
- echo test >>"ærø" &&
- bzr commit -m test-utf-8 &&
- bzr rm "ø~?" &&
- bzr mv "ærø" "ø~?" &&
- bzr commit -m bzr-mv-utf-8
- ) &&
-
- (
- git clone "bzr::bzrrepo" gitrepo &&
- cd gitrepo &&
- git -c core.quotepath=false ls-files >../actual
- ) &&
- echo "ø~?" >expected &&
- test_cmp expected actual
-'
-
-test_expect_success 'push utf-8 filenames' '
- test_when_finished "rm -rf bzrrepo gitrepo && LC_ALL=C" &&
-
- mkdir -p tmp && cd tmp &&
-
- LC_ALL=en_US.UTF-8
- export LC_ALL
-
- (
- bzr init bzrrepo &&
- cd bzrrepo &&
-
- echo one >>content &&
- bzr add content &&
- bzr commit -m one
- ) &&
-
- (
- git clone "bzr::bzrrepo" gitrepo &&
- cd gitrepo &&
-
- echo test >>"ærø" &&
- git add "ærø" &&
- git commit -m utf-8 &&
-
- git push
- ) &&
-
- (cd bzrrepo && bzr ls >../actual) &&
- printf "content\nærø\n" >expected &&
- test_cmp expected actual
-'
-
-test_expect_success 'pushing a merge' '
- test_when_finished "rm -rf bzrrepo gitrepo" &&
-
- (
- bzr init bzrrepo &&
- cd bzrrepo &&
- echo one >content &&
- bzr add content &&
- bzr commit -m one
- ) &&
-
- git clone "bzr::bzrrepo" gitrepo &&
-
- (
- cd bzrrepo &&
- echo two >content &&
- bzr commit -m two
- ) &&
-
- (
- cd gitrepo &&
- echo three >content &&
- git commit -a -m three &&
- git fetch &&
- git merge origin/master || true &&
- echo three >content &&
- git commit -a --no-edit &&
- git push
- ) &&
-
- echo three >expected &&
- cat bzrrepo/content >actual &&
- test_cmp expected actual
-'
-
-cat >expected <<\EOF
-origin/HEAD
-origin/branch
-origin/trunk
-EOF
-
-test_expect_success 'proper bzr repo' '
- test_when_finished "rm -rf bzrrepo gitrepo" &&
-
- bzr init-repo bzrrepo &&
-
- (
- bzr init bzrrepo/trunk &&
- cd bzrrepo/trunk &&
- echo one >>content &&
- bzr add content &&
- bzr commit -m one
- ) &&
-
- (
- bzr branch bzrrepo/trunk bzrrepo/branch &&
- cd bzrrepo/branch &&
- echo two >>content &&
- bzr commit -m one
- ) &&
-
- (
- git clone "bzr::bzrrepo" gitrepo &&
- cd gitrepo &&
- git for-each-ref --format "%(refname:short)" refs/remotes/origin >../actual
- ) &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'strip' '
- test_when_finished "rm -rf bzrrepo gitrepo" &&
-
- (
- bzr init bzrrepo &&
- cd bzrrepo &&
-
- echo one >>content &&
- bzr add content &&
- bzr commit -m one &&
-
- echo two >>content &&
- bzr commit -m two
- ) &&
-
- git clone "bzr::bzrrepo" gitrepo &&
-
- (
- cd bzrrepo &&
- bzr uncommit --force &&
-
- echo three >>content &&
- bzr commit -m three &&
-
- echo four >>content &&
- bzr commit -m four &&
- bzr log --line | sed -e "s/^[0-9][0-9]*: //" >../expected
- ) &&
-
- (
- cd gitrepo &&
- git fetch &&
- git log --format="%an %ad %s" --date=short origin/master >../actual
- ) &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'export utf-8 authors' '
- test_when_finished "rm -rf bzrrepo gitrepo && LC_ALL=C && unset GIT_COMMITTER_NAME" &&
-
- LC_ALL=en_US.UTF-8
- export LC_ALL
-
- GIT_COMMITTER_NAME="Grégoire"
- export GIT_COMMITTER_NAME
-
- bzr init bzrrepo &&
-
- (
- git init gitrepo &&
- cd gitrepo &&
- echo greg >>content &&
- git add content &&
- git commit -m one &&
- git remote add bzr "bzr::../bzrrepo" &&
- git push bzr master
- ) &&
-
- (
- cd bzrrepo &&
- bzr log | grep "^committer: " >../actual
- ) &&
-
- echo "committer: Grégoire <committer@example.com>" >expected &&
- test_cmp expected actual
-'
-
-test_done
diff --git a/contrib/remote-helpers/test-hg-bidi.sh b/contrib/remote-helpers/test-hg-bidi.sh
deleted file mode 100755
index e24c51daad..0000000000
--- a/contrib/remote-helpers/test-hg-bidi.sh
+++ /dev/null
@@ -1,242 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-# Base commands from hg-git tests:
-# https://bitbucket.org/durin42/hg-git/src
-#
-
-test_description='Test bidirectionality of remote-hg'
-
-. ./test-lib.sh
-
-if ! test_have_prereq PYTHON
-then
- skip_all='skipping remote-hg tests; python not available'
- test_done
-fi
-
-if ! python -c 'import mercurial'
-then
- skip_all='skipping remote-hg tests; mercurial not available'
- test_done
-fi
-
-# clone to a git repo
-git_clone () {
- git clone -q "hg::$1" $2
-}
-
-# clone to an hg repo
-hg_clone () {
- (
- hg init $2 &&
- cd $1 &&
- git push -q "hg::../$2" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*'
- ) &&
-
- (cd $2 && hg -q update)
-}
-
-# push an hg repo
-hg_push () {
- (
- cd $2
- git checkout -q -b tmp &&
- git fetch -q "hg::../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' &&
- git checkout -q @{-1} &&
- git branch -q -D tmp 2>/dev/null || true
- )
-}
-
-hg_log () {
- hg -R $1 log --graph --debug
-}
-
-setup () {
- (
- echo "[ui]"
- echo "username = A U Thor <author@example.com>"
- echo "[defaults]"
- echo "backout = -d \"0 0\""
- echo "commit = -d \"0 0\""
- echo "debugrawcommit = -d \"0 0\""
- echo "tag = -d \"0 0\""
- echo "[extensions]"
- echo "graphlog ="
- ) >>"$HOME"/.hgrc &&
- git config --global remote-hg.hg-git-compat true
- git config --global remote-hg.track-branches true
-
- HGEDITOR=/usr/bin/true
- GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230"
- GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
- export HGEDITOR GIT_AUTHOR_DATE GIT_COMMITTER_DATE
-}
-
-setup
-
-test_expect_success 'encoding' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
-
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add älphà" &&
-
- GIT_AUTHOR_NAME="tést èncödîng" &&
- export GIT_AUTHOR_NAME &&
- echo beta >beta &&
- git add beta &&
- git commit -m "add beta" &&
-
- echo gamma >gamma &&
- git add gamma &&
- git commit -m "add gämmâ" &&
-
- : TODO git config i18n.commitencoding latin-1 &&
- echo delta >delta &&
- git add delta &&
- git commit -m "add déltà"
- ) &&
-
- hg_clone gitrepo hgrepo &&
- git_clone hgrepo gitrepo2 &&
- hg_clone gitrepo2 hgrepo2 &&
-
- HGENCODING=utf-8 hg_log hgrepo >expected &&
- HGENCODING=utf-8 hg_log hgrepo2 >actual &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'file removal' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- echo beta >beta &&
- git add beta &&
- git commit -m "add beta"
- mkdir foo &&
- echo blah >foo/bar &&
- git add foo &&
- git commit -m "add foo" &&
- git rm alpha &&
- git commit -m "remove alpha" &&
- git rm foo/bar &&
- git commit -m "remove foo/bar"
- ) &&
-
- hg_clone gitrepo hgrepo &&
- git_clone hgrepo gitrepo2 &&
- hg_clone gitrepo2 hgrepo2 &&
-
- hg_log hgrepo >expected &&
- hg_log hgrepo2 >actual &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'git tags' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
- git config receive.denyCurrentBranch ignore &&
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- git tag alpha &&
-
- echo beta >beta &&
- git add beta &&
- git commit -m "add beta" &&
- git tag -a -m "added tag beta" beta
- ) &&
-
- hg_clone gitrepo hgrepo &&
- git_clone hgrepo gitrepo2 &&
- hg_clone gitrepo2 hgrepo2 &&
-
- hg_log hgrepo >expected &&
- hg_log hgrepo2 >actual &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'hg branch' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
-
- echo alpha >alpha &&
- git add alpha &&
- git commit -q -m "add alpha" &&
- git checkout -q -b not-master
- ) &&
-
- (
- hg_clone gitrepo hgrepo &&
-
- cd hgrepo &&
- hg -q co default &&
- hg mv alpha beta &&
- hg -q commit -m "rename alpha to beta" &&
- hg branch gamma | grep -v "permanent and global" &&
- hg -q commit -m "started branch gamma"
- ) &&
-
- hg_push hgrepo gitrepo &&
- hg_clone gitrepo hgrepo2 &&
-
- : Back to the common revision &&
- (cd hgrepo && hg checkout default) &&
-
- hg_log hgrepo >expected &&
- hg_log hgrepo2 >actual &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'hg tags' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
-
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- git checkout -q -b not-master
- ) &&
-
- (
- hg_clone gitrepo hgrepo &&
-
- cd hgrepo &&
- hg co default &&
- hg tag alpha
- ) &&
-
- hg_push hgrepo gitrepo &&
- hg_clone gitrepo hgrepo2 &&
-
- hg_log hgrepo >expected &&
- hg_log hgrepo2 >actual &&
-
- test_cmp expected actual
-'
-
-test_done
diff --git a/contrib/remote-helpers/test-hg-hg-git.sh b/contrib/remote-helpers/test-hg-hg-git.sh
deleted file mode 100755
index 6dcd95d10f..0000000000
--- a/contrib/remote-helpers/test-hg-hg-git.sh
+++ /dev/null
@@ -1,541 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-# Base commands from hg-git tests:
-# https://bitbucket.org/durin42/hg-git/src
-#
-
-test_description='Test remote-hg output compared to hg-git'
-
-. ./test-lib.sh
-
-if ! test_have_prereq PYTHON
-then
- skip_all='skipping remote-hg tests; python not available'
- test_done
-fi
-
-if ! python -c 'import mercurial'
-then
- skip_all='skipping remote-hg tests; mercurial not available'
- test_done
-fi
-
-if ! python -c 'import hggit'
-then
- skip_all='skipping remote-hg tests; hg-git not available'
- test_done
-fi
-
-# clone to a git repo with git
-git_clone_git () {
- git clone -q "hg::$1" $2 &&
- (cd $2 && git checkout master && git branch -D default)
-}
-
-# clone to an hg repo with git
-hg_clone_git () {
- (
- hg init $2 &&
- hg -R $2 bookmark -i master &&
- cd $1 &&
- git push -q "hg::../$2" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*'
- ) &&
-
- (cd $2 && hg -q update)
-}
-
-# clone to a git repo with hg
-git_clone_hg () {
- (
- git init -q $2 &&
- cd $1 &&
- hg bookmark -i -f -r tip master &&
- hg -q push -r master ../$2 || true
- )
-}
-
-# clone to an hg repo with hg
-hg_clone_hg () {
- hg -q clone $1 $2
-}
-
-# push an hg repo with git
-hg_push_git () {
- (
- cd $2
- git checkout -q -b tmp &&
- git fetch -q "hg::../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' &&
- git branch -D default &&
- git checkout -q @{-1} &&
- git branch -q -D tmp 2>/dev/null || true
- )
-}
-
-# push an hg git repo with hg
-hg_push_hg () {
- (
- cd $1 &&
- hg -q push ../$2 || true
- )
-}
-
-hg_log () {
- hg -R $1 log --graph --debug >log &&
- grep -v 'tag: *default/' log
-}
-
-git_log () {
- git --git-dir=$1/.git fast-export --branches
-}
-
-setup () {
- (
- echo "[ui]"
- echo "username = A U Thor <author@example.com>"
- echo "[defaults]"
- echo "backout = -d \"0 0\""
- echo "commit = -d \"0 0\""
- echo "debugrawcommit = -d \"0 0\""
- echo "tag = -d \"0 0\""
- echo "[extensions]"
- echo "hgext.bookmarks ="
- echo "hggit ="
- echo "graphlog ="
- ) >>"$HOME"/.hgrc &&
- git config --global receive.denycurrentbranch warn
- git config --global remote-hg.hg-git-compat true
- git config --global remote-hg.track-branches false
-
- HGEDITOR=true
- HGMERGE=true
-
- GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230"
- GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
- export HGEDITOR HGMERGE GIT_AUTHOR_DATE GIT_COMMITTER_DATE
-}
-
-setup
-
-test_expect_success 'executable bit' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
- echo alpha >alpha &&
- chmod 0644 alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- chmod 0755 alpha &&
- git add alpha &&
- git commit -m "set executable bit" &&
- chmod 0644 alpha &&
- git add alpha &&
- git commit -m "clear executable bit"
- ) &&
-
- for x in hg git
- do
- (
- hg_clone_$x gitrepo hgrepo-$x &&
- cd hgrepo-$x &&
- hg_log . &&
- hg manifest -r 1 -v &&
- hg manifest -v
- ) >"output-$x" &&
-
- git_clone_$x hgrepo-$x gitrepo2-$x &&
- git_log gitrepo2-$x >"log-$x"
- done &&
-
- test_cmp output-hg output-git &&
- test_cmp log-hg log-git
-'
-
-test_expect_success 'symlink' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- ln -s alpha beta &&
- git add beta &&
- git commit -m "add beta"
- ) &&
-
- for x in hg git
- do
- (
- hg_clone_$x gitrepo hgrepo-$x &&
- cd hgrepo-$x &&
- hg_log . &&
- hg manifest -v
- ) >"output-$x" &&
-
- git_clone_$x hgrepo-$x gitrepo2-$x &&
- git_log gitrepo2-$x >"log-$x"
- done &&
-
- test_cmp output-hg output-git &&
- test_cmp log-hg log-git
-'
-
-test_expect_success 'merge conflict 1' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- hg init hgrepo1 &&
- cd hgrepo1 &&
- echo A >afile &&
- hg add afile &&
- hg ci -m "origin" &&
-
- echo B >afile &&
- hg ci -m "A->B" &&
-
- hg up -r0 &&
- echo C >afile &&
- hg ci -m "A->C" &&
-
- hg merge -r1 &&
- echo C >afile &&
- hg resolve -m afile &&
- hg ci -m "merge to C"
- ) &&
-
- for x in hg git
- do
- git_clone_$x hgrepo1 gitrepo-$x &&
- hg_clone_$x gitrepo-$x hgrepo2-$x &&
- hg_log hgrepo2-$x >"hg-log-$x" &&
- git_log gitrepo-$x >"git-log-$x"
- done &&
-
- test_cmp hg-log-hg hg-log-git &&
- test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'merge conflict 2' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- hg init hgrepo1 &&
- cd hgrepo1 &&
- echo A >afile &&
- hg add afile &&
- hg ci -m "origin" &&
-
- echo B >afile &&
- hg ci -m "A->B" &&
-
- hg up -r0 &&
- echo C >afile &&
- hg ci -m "A->C" &&
-
- hg merge -r1 || true &&
- echo B >afile &&
- hg resolve -m afile &&
- hg ci -m "merge to B"
- ) &&
-
- for x in hg git
- do
- git_clone_$x hgrepo1 gitrepo-$x &&
- hg_clone_$x gitrepo-$x hgrepo2-$x &&
- hg_log hgrepo2-$x >"hg-log-$x" &&
- git_log gitrepo-$x >"git-log-$x"
- done &&
-
- test_cmp hg-log-hg hg-log-git &&
- test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'converged merge' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- hg init hgrepo1 &&
- cd hgrepo1 &&
- echo A >afile &&
- hg add afile &&
- hg ci -m "origin" &&
-
- echo B >afile &&
- hg ci -m "A->B" &&
-
- echo C >afile &&
- hg ci -m "B->C" &&
-
- hg up -r0 &&
- echo C >afile &&
- hg ci -m "A->C" &&
-
- hg merge -r2 || true &&
- hg ci -m "merge"
- ) &&
-
- for x in hg git
- do
- git_clone_$x hgrepo1 gitrepo-$x &&
- hg_clone_$x gitrepo-$x hgrepo2-$x &&
- hg_log hgrepo2-$x >"hg-log-$x" &&
- git_log gitrepo-$x >"git-log-$x"
- done &&
-
- test_cmp hg-log-hg hg-log-git &&
- test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'encoding' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
-
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add älphà" &&
-
- GIT_AUTHOR_NAME="tést èncödîng" &&
- export GIT_AUTHOR_NAME &&
- echo beta >beta &&
- git add beta &&
- git commit -m "add beta" &&
-
- echo gamma >gamma &&
- git add gamma &&
- git commit -m "add gämmâ" &&
-
- : TODO git config i18n.commitencoding latin-1 &&
- echo delta >delta &&
- git add delta &&
- git commit -m "add déltà"
- ) &&
-
- for x in hg git
- do
- hg_clone_$x gitrepo hgrepo-$x &&
- git_clone_$x hgrepo-$x gitrepo2-$x &&
-
- HGENCODING=utf-8 hg_log hgrepo-$x >"hg-log-$x" &&
- git_log gitrepo2-$x >"git-log-$x"
- done &&
-
- test_cmp hg-log-hg hg-log-git &&
- test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'file removal' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- echo beta >beta &&
- git add beta &&
- git commit -m "add beta"
- mkdir foo &&
- echo blah >foo/bar &&
- git add foo &&
- git commit -m "add foo" &&
- git rm alpha &&
- git commit -m "remove alpha" &&
- git rm foo/bar &&
- git commit -m "remove foo/bar"
- ) &&
-
- for x in hg git
- do
- (
- hg_clone_$x gitrepo hgrepo-$x &&
- cd hgrepo-$x &&
- hg_log . &&
- hg manifest -r 3 &&
- hg manifest
- ) >"output-$x" &&
-
- git_clone_$x hgrepo-$x gitrepo2-$x &&
- git_log gitrepo2-$x >"log-$x"
- done &&
-
- test_cmp output-hg output-git &&
- test_cmp log-hg log-git
-'
-
-test_expect_success 'git tags' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- (
- git init -q gitrepo &&
- cd gitrepo &&
- git config receive.denyCurrentBranch ignore &&
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- git tag alpha &&
-
- echo beta >beta &&
- git add beta &&
- git commit -m "add beta" &&
- git tag -a -m "added tag beta" beta
- ) &&
-
- for x in hg git
- do
- hg_clone_$x gitrepo hgrepo-$x &&
- hg_log hgrepo-$x >"log-$x"
- done &&
-
- test_cmp log-hg log-git
-'
-
-test_expect_success 'hg author' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- for x in hg git
- do
- (
- git init -q gitrepo-$x &&
- cd gitrepo-$x &&
-
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- git checkout -q -b not-master
- ) &&
-
- (
- hg_clone_$x gitrepo-$x hgrepo-$x &&
- cd hgrepo-$x &&
-
- hg co master &&
- echo beta >beta &&
- hg add beta &&
- hg commit -u "test" -m "add beta" &&
-
- echo gamma >>beta &&
- hg commit -u "test <test@example.com> (comment)" -m "modify beta" &&
-
- echo gamma >gamma &&
- hg add gamma &&
- hg commit -u "<test@example.com>" -m "add gamma" &&
-
- echo delta >delta &&
- hg add delta &&
- hg commit -u "name<test@example.com>" -m "add delta" &&
-
- echo epsilon >epsilon &&
- hg add epsilon &&
- hg commit -u "name <test@example.com" -m "add epsilon" &&
-
- echo zeta >zeta &&
- hg add zeta &&
- hg commit -u " test " -m "add zeta" &&
-
- echo eta >eta &&
- hg add eta &&
- hg commit -u "test < test@example.com >" -m "add eta" &&
-
- echo theta >theta &&
- hg add theta &&
- hg commit -u "test >test@example.com>" -m "add theta" &&
-
- echo iota >iota &&
- hg add iota &&
- hg commit -u "test <test <at> example <dot> com>" -m "add iota"
- ) &&
-
- hg_push_$x hgrepo-$x gitrepo-$x &&
- hg_clone_$x gitrepo-$x hgrepo2-$x &&
-
- hg_log hgrepo2-$x >"hg-log-$x" &&
- git_log gitrepo-$x >"git-log-$x"
- done &&
-
- test_cmp hg-log-hg hg-log-git &&
- test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'hg branch' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- for x in hg git
- do
- (
- git init -q gitrepo-$x &&
- cd gitrepo-$x &&
-
- echo alpha >alpha &&
- git add alpha &&
- git commit -q -m "add alpha" &&
- git checkout -q -b not-master
- ) &&
-
- (
- hg_clone_$x gitrepo-$x hgrepo-$x &&
-
- cd hgrepo-$x &&
- hg -q co master &&
- hg mv alpha beta &&
- hg -q commit -m "rename alpha to beta" &&
- hg branch gamma | grep -v "permanent and global" &&
- hg -q commit -m "started branch gamma"
- ) &&
-
- hg_push_$x hgrepo-$x gitrepo-$x &&
- hg_clone_$x gitrepo-$x hgrepo2-$x &&
-
- hg_log hgrepo2-$x >"hg-log-$x" &&
- git_log gitrepo-$x >"git-log-$x"
- done &&
-
- test_cmp hg-log-hg hg-log-git &&
- test_cmp git-log-hg git-log-git
-'
-
-test_expect_success 'hg tags' '
- test_when_finished "rm -rf gitrepo* hgrepo*" &&
-
- for x in hg git
- do
- (
- git init -q gitrepo-$x &&
- cd gitrepo-$x &&
-
- echo alpha >alpha &&
- git add alpha &&
- git commit -m "add alpha" &&
- git checkout -q -b not-master
- ) &&
-
- (
- hg_clone_$x gitrepo-$x hgrepo-$x &&
-
- cd hgrepo-$x &&
- hg co master &&
- hg tag alpha
- ) &&
-
- hg_push_$x hgrepo-$x gitrepo-$x &&
- hg_clone_$x gitrepo-$x hgrepo2-$x &&
-
- (
- git --git-dir=gitrepo-$x/.git tag -l &&
- hg_log hgrepo2-$x &&
- cat hgrepo2-$x/.hgtags
- ) >"output-$x"
- done &&
-
- test_cmp output-hg output-git
-'
-
-test_done
diff --git a/contrib/remote-helpers/test-hg.sh b/contrib/remote-helpers/test-hg.sh
deleted file mode 100755
index 5d128a5da9..0000000000
--- a/contrib/remote-helpers/test-hg.sh
+++ /dev/null
@@ -1,775 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2012 Felipe Contreras
-#
-# Base commands from hg-git tests:
-# https://bitbucket.org/durin42/hg-git/src
-#
-
-test_description='Test remote-hg'
-
-test -n "$TEST_DIRECTORY" || TEST_DIRECTORY=${0%/*}/../../t
-. "$TEST_DIRECTORY"/test-lib.sh
-
-if ! test_have_prereq PYTHON
-then
- skip_all='skipping remote-hg tests; python not available'
- test_done
-fi
-
-if ! python -c 'import mercurial'
-then
- skip_all='skipping remote-hg tests; mercurial not available'
- test_done
-fi
-
-check () {
- echo $3 >expected &&
- git --git-dir=$1/.git log --format='%s' -1 $2 >actual
- test_cmp expected actual
-}
-
-check_branch () {
- if test -n "$3"
- then
- echo $3 >expected &&
- hg -R $1 log -r $2 --template '{desc}\n' >actual &&
- test_cmp expected actual
- else
- hg -R $1 branches >out &&
- ! grep $2 out
- fi
-}
-
-check_bookmark () {
- if test -n "$3"
- then
- echo $3 >expected &&
- hg -R $1 log -r "bookmark('$2')" --template '{desc}\n' >actual &&
- test_cmp expected actual
- else
- hg -R $1 bookmarks >out &&
- ! grep $2 out
- fi
-}
-
-check_push () {
- expected_ret=$1 ret=0 ref_ret=0
-
- shift
- git push origin "$@" 2>error
- ret=$?
- cat error
-
- while IFS=':' read branch kind
- do
- case "$kind" in
- 'new')
- grep "^ \* \[new branch\] *${branch} -> ${branch}$" error || ref_ret=1
- ;;
- 'non-fast-forward')
- grep "^ ! \[rejected\] *${branch} -> ${branch} (non-fast-forward)$" error || ref_ret=1
- ;;
- 'fetch-first')
- grep "^ ! \[rejected\] *${branch} -> ${branch} (fetch first)$" error || ref_ret=1
- ;;
- 'forced-update')
- grep "^ + [a-f0-9]*\.\.\.[a-f0-9]* *${branch} -> ${branch} (forced update)$" error || ref_ret=1
- ;;
- '')
- grep "^ [a-f0-9]*\.\.[a-f0-9]* *${branch} -> ${branch}$" error || ref_ret=1
- ;;
- esac
- test $ref_ret -ne 0 && echo "match for '$branch' failed" && break
- done
-
- if test $expected_ret -ne $ret || test $ref_ret -ne 0
- then
- return 1
- fi
-
- return 0
-}
-
-setup () {
- (
- echo "[ui]"
- echo "username = H G Wells <wells@example.com>"
- echo "[extensions]"
- echo "mq ="
- ) >>"$HOME"/.hgrc &&
-
- GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230" &&
- GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" &&
- export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
-}
-
-setup
-
-test_expect_success 'cloning' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- hg init hgrepo &&
- cd hgrepo &&
- echo zero >content &&
- hg add content &&
- hg commit -m zero
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
- check gitrepo HEAD zero
-'
-
-test_expect_success 'cloning with branches' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- cd hgrepo &&
- hg branch next &&
- echo next >content &&
- hg commit -m next
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
- check gitrepo origin/branches/next next
-'
-
-test_expect_success 'cloning with bookmarks' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- cd hgrepo &&
- hg checkout default &&
- hg bookmark feature-a &&
- echo feature-a >content &&
- hg commit -m feature-a
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
- check gitrepo origin/feature-a feature-a
-'
-
-test_expect_success 'update bookmark' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- cd hgrepo &&
- hg bookmark devel
- ) &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- git checkout --quiet devel &&
- echo devel >content &&
- git commit -a -m devel &&
- git push --quiet
- ) &&
-
- check_bookmark hgrepo devel devel
-'
-
-test_expect_success 'new bookmark' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- git checkout --quiet -b feature-b &&
- echo feature-b >content &&
- git commit -a -m feature-b &&
- git push --quiet origin feature-b
- ) &&
-
- check_bookmark hgrepo feature-b feature-b
-'
-
-# cleanup previous stuff
-rm -rf hgrepo
-
-author_test () {
- echo $1 >>content &&
- hg commit -u "$2" -m "add $1" &&
- echo "$3" >>../expected
-}
-
-test_expect_success 'authors' '
- test_when_finished "rm -rf hgrepo gitrepo" &&
-
- (
- hg init hgrepo &&
- cd hgrepo &&
-
- touch content &&
- hg add content &&
-
- >../expected &&
- author_test alpha "" "H G Wells <wells@example.com>" &&
- author_test beta "beta" "beta <unknown>" &&
- author_test gamma "gamma <test@example.com> (comment)" "gamma <test@example.com>" &&
- author_test delta "<delta@example.com>" "Unknown <delta@example.com>" &&
- author_test epsilon "epsilon<test@example.com>" "epsilon <test@example.com>" &&
- author_test zeta "zeta <test@example.com" "zeta <test@example.com>" &&
- author_test eta " eta " "eta <unknown>" &&
- author_test theta "theta < test@example.com >" "theta <test@example.com>" &&
- author_test iota "iota >test@example.com>" "iota <test@example.com>" &&
- author_test kappa "kappa < test <at> example <dot> com>" "kappa <unknown>" &&
- author_test lambda "lambda@example.com" "Unknown <lambda@example.com>" &&
- author_test mu "mu.mu@example.com" "Unknown <mu.mu@example.com>"
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
- git --git-dir=gitrepo/.git log --reverse --format="%an <%ae>" >actual &&
-
- test_cmp expected actual
-'
-
-test_expect_success 'strip' '
- test_when_finished "rm -rf hgrepo gitrepo" &&
-
- (
- hg init hgrepo &&
- cd hgrepo &&
-
- echo one >>content &&
- hg add content &&
- hg commit -m one &&
-
- echo two >>content &&
- hg commit -m two
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
-
- (
- cd hgrepo &&
- hg strip 1 &&
-
- echo three >>content &&
- hg commit -m three &&
-
- echo four >>content &&
- hg commit -m four
- ) &&
-
- (
- cd gitrepo &&
- git fetch &&
- git log --format="%s" origin/master >../actual
- ) &&
-
- hg -R hgrepo log --template "{desc}\n" >expected &&
- test_cmp actual expected
-'
-
-test_expect_success 'remote push with master bookmark' '
- test_when_finished "rm -rf hgrepo gitrepo*" &&
-
- (
- hg init hgrepo &&
- cd hgrepo &&
- echo zero >content &&
- hg add content &&
- hg commit -m zero &&
- hg bookmark master &&
- echo one >content &&
- hg commit -m one
- ) &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- echo two >content &&
- git commit -a -m two &&
- git push
- ) &&
-
- check_branch hgrepo default two
-'
-
-cat >expected <<\EOF
-changeset: 0:6e2126489d3d
-tag: tip
-user: A U Thor <author@example.com>
-date: Mon Jan 01 00:00:00 2007 +0230
-summary: one
-
-EOF
-
-test_expect_success 'remote push from master branch' '
- test_when_finished "rm -rf hgrepo gitrepo*" &&
-
- hg init hgrepo &&
-
- (
- git init gitrepo &&
- cd gitrepo &&
- git remote add origin "hg::../hgrepo" &&
- echo one >content &&
- git add content &&
- git commit -a -m one &&
- git push origin master
- ) &&
-
- hg -R hgrepo log >actual &&
- cat actual &&
- test_cmp expected actual &&
-
- check_branch hgrepo default one
-'
-
-GIT_REMOTE_HG_TEST_REMOTE=1
-export GIT_REMOTE_HG_TEST_REMOTE
-
-test_expect_success 'remote cloning' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- hg init hgrepo &&
- cd hgrepo &&
- echo zero >content &&
- hg add content &&
- hg commit -m zero
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
- check gitrepo HEAD zero
-'
-
-test_expect_success 'moving remote clone' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- mv gitrepo gitrepo2 &&
- cd gitrepo2 &&
- git fetch
- )
-'
-
-test_expect_success 'remote update bookmark' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- cd hgrepo &&
- hg bookmark devel
- ) &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- git checkout --quiet devel &&
- echo devel >content &&
- git commit -a -m devel &&
- git push --quiet
- ) &&
-
- check_bookmark hgrepo devel devel
-'
-
-test_expect_success 'remote new bookmark' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- git checkout --quiet -b feature-b &&
- echo feature-b >content &&
- git commit -a -m feature-b &&
- git push --quiet origin feature-b
- ) &&
-
- check_bookmark hgrepo feature-b feature-b
-'
-
-test_expect_success 'remote push diverged' '
- test_when_finished "rm -rf gitrepo*" &&
-
- git clone "hg::hgrepo" gitrepo &&
-
- (
- cd hgrepo &&
- hg checkout default &&
- echo bump >content &&
- hg commit -m bump
- ) &&
-
- (
- cd gitrepo &&
- echo diverge >content &&
- git commit -a -m diverged &&
- check_push 1 <<-\EOF
- master:non-fast-forward
- EOF
- ) &&
-
- check_branch hgrepo default bump
-'
-
-test_expect_success 'remote update bookmark diverge' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- cd hgrepo &&
- hg checkout tip^ &&
- hg bookmark diverge
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
-
- (
- cd hgrepo &&
- echo "bump bookmark" >content &&
- hg commit -m "bump bookmark"
- ) &&
-
- (
- cd gitrepo &&
- git checkout --quiet diverge &&
- echo diverge >content &&
- git commit -a -m diverge &&
- check_push 1 <<-\EOF
- diverge:fetch-first
- EOF
- ) &&
-
- check_bookmark hgrepo diverge "bump bookmark"
-'
-
-test_expect_success 'remote new bookmark multiple branch head' '
- test_when_finished "rm -rf gitrepo*" &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- git checkout --quiet -b feature-c HEAD^ &&
- echo feature-c >content &&
- git commit -a -m feature-c &&
- git push --quiet origin feature-c
- ) &&
-
- check_bookmark hgrepo feature-c feature-c
-'
-
-# cleanup previous stuff
-rm -rf hgrepo
-
-test_expect_success 'fetch special filenames' '
- test_when_finished "rm -rf hgrepo gitrepo && LC_ALL=C" &&
-
- LC_ALL=en_US.UTF-8
- export LC_ALL
-
- (
- hg init hgrepo &&
- cd hgrepo &&
-
- echo test >> "æ rø" &&
- hg add "æ rø" &&
- echo test >> "ø~?" &&
- hg add "ø~?" &&
- hg commit -m add-utf-8 &&
- echo test >> "æ rø" &&
- hg commit -m test-utf-8 &&
- hg rm "ø~?" &&
- hg mv "æ rø" "ø~?" &&
- hg commit -m hg-mv-utf-8
- ) &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- git -c core.quotepath=false ls-files > ../actual
- ) &&
- echo "ø~?" > expected &&
- test_cmp expected actual
-'
-
-test_expect_success 'push special filenames' '
- test_when_finished "rm -rf hgrepo gitrepo && LC_ALL=C" &&
-
- mkdir -p tmp && cd tmp &&
-
- LC_ALL=en_US.UTF-8
- export LC_ALL
-
- (
- hg init hgrepo &&
- cd hgrepo &&
-
- echo one >> content &&
- hg add content &&
- hg commit -m one
- ) &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
-
- echo test >> "æ rø" &&
- git add "æ rø" &&
- git commit -m utf-8 &&
-
- git push
- ) &&
-
- (cd hgrepo &&
- hg update &&
- hg manifest > ../actual
- ) &&
-
- printf "content\næ rø\n" > expected &&
- test_cmp expected actual
-'
-
-setup_big_push () {
- (
- hg init hgrepo &&
- cd hgrepo &&
- echo zero >content &&
- hg add content &&
- hg commit -m zero &&
- hg bookmark bad_bmark1 &&
- echo one >content &&
- hg commit -m one &&
- hg bookmark bad_bmark2 &&
- hg bookmark good_bmark &&
- hg bookmark -i good_bmark &&
- hg -q branch good_branch &&
- echo "good branch" >content &&
- hg commit -m "good branch" &&
- hg -q branch bad_branch &&
- echo "bad branch" >content &&
- hg commit -m "bad branch"
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
-
- (
- cd gitrepo &&
- echo two >content &&
- git commit -q -a -m two &&
-
- git checkout -q good_bmark &&
- echo three >content &&
- git commit -q -a -m three &&
-
- git checkout -q bad_bmark1 &&
- git reset --hard HEAD^ &&
- echo four >content &&
- git commit -q -a -m four &&
-
- git checkout -q bad_bmark2 &&
- git reset --hard HEAD^ &&
- echo five >content &&
- git commit -q -a -m five &&
-
- git checkout -q -b new_bmark master &&
- echo six >content &&
- git commit -q -a -m six &&
-
- git checkout -q branches/good_branch &&
- echo seven >content &&
- git commit -q -a -m seven &&
- echo eight >content &&
- git commit -q -a -m eight &&
-
- git checkout -q branches/bad_branch &&
- git reset --hard HEAD^ &&
- echo nine >content &&
- git commit -q -a -m nine &&
-
- git checkout -q -b branches/new_branch master &&
- echo ten >content &&
- git commit -q -a -m ten
- )
-}
-
-test_expect_success 'remote big push' '
- test_when_finished "rm -rf hgrepo gitrepo*" &&
-
- setup_big_push
-
- (
- cd gitrepo &&
-
- check_push 1 --all <<-\EOF
- master
- good_bmark
- branches/good_branch
- new_bmark:new
- branches/new_branch:new
- bad_bmark1:non-fast-forward
- bad_bmark2:non-fast-forward
- branches/bad_branch:non-fast-forward
- EOF
- ) &&
-
- check_branch hgrepo default one &&
- check_branch hgrepo good_branch "good branch" &&
- check_branch hgrepo bad_branch "bad branch" &&
- check_branch hgrepo new_branch '' &&
- check_bookmark hgrepo good_bmark one &&
- check_bookmark hgrepo bad_bmark1 one &&
- check_bookmark hgrepo bad_bmark2 one &&
- check_bookmark hgrepo new_bmark ''
-'
-
-test_expect_success 'remote big push fetch first' '
- test_when_finished "rm -rf hgrepo gitrepo*" &&
-
- (
- hg init hgrepo &&
- cd hgrepo &&
- echo zero >content &&
- hg add content &&
- hg commit -m zero &&
- hg bookmark bad_bmark &&
- hg bookmark good_bmark &&
- hg bookmark -i good_bmark &&
- hg -q branch good_branch &&
- echo "good branch" >content &&
- hg commit -m "good branch" &&
- hg -q branch bad_branch &&
- echo "bad branch" >content &&
- hg commit -m "bad branch"
- ) &&
-
- git clone "hg::hgrepo" gitrepo &&
-
- (
- cd hgrepo &&
- hg bookmark -f bad_bmark &&
- echo update_bmark >content &&
- hg commit -m "update bmark"
- ) &&
-
- (
- cd gitrepo &&
- echo two >content &&
- git commit -q -a -m two &&
-
- git checkout -q good_bmark &&
- echo three >content &&
- git commit -q -a -m three &&
-
- git checkout -q bad_bmark &&
- echo four >content &&
- git commit -q -a -m four &&
-
- git checkout -q branches/bad_branch &&
- echo five >content &&
- git commit -q -a -m five &&
-
- check_push 1 --all <<-\EOF &&
- master
- good_bmark
- bad_bmark:fetch-first
- branches/bad_branch:festch-first
- EOF
-
- git fetch &&
-
- check_push 1 --all <<-\EOF
- master
- good_bmark
- bad_bmark:non-fast-forward
- branches/bad_branch:non-fast-forward
- EOF
- )
-'
-
-test_expect_failure 'remote big push force' '
- test_when_finished "rm -rf hgrepo gitrepo*" &&
-
- setup_big_push
-
- (
- cd gitrepo &&
-
- check_push 0 --force --all <<-\EOF
- master
- good_bmark
- branches/good_branch
- new_bmark:new
- branches/new_branch:new
- bad_bmark1:forced-update
- bad_bmark2:forced-update
- branches/bad_branch:forced-update
- EOF
- ) &&
-
- check_branch hgrepo default six &&
- check_branch hgrepo good_branch eight &&
- check_branch hgrepo bad_branch nine &&
- check_branch hgrepo new_branch ten &&
- check_bookmark hgrepo good_bmark three &&
- check_bookmark hgrepo bad_bmark1 four &&
- check_bookmark hgrepo bad_bmark2 five &&
- check_bookmark hgrepo new_bmark six
-'
-
-test_expect_failure 'remote big push dry-run' '
- test_when_finished "rm -rf hgrepo gitrepo*" &&
-
- setup_big_push
-
- (
- cd gitrepo &&
-
- check_push 1 --dry-run --all <<-\EOF &&
- master
- good_bmark
- branches/good_branch
- new_bmark:new
- branches/new_branch:new
- bad_bmark1:non-fast-forward
- bad_bmark2:non-fast-forward
- branches/bad_branch:non-fast-forward
- EOF
-
- check_push 0 --dry-run master good_bmark new_bmark branches/good_branch branches/new_branch <<-\EOF
- master
- good_bmark
- branches/good_branch
- new_bmark:new
- branches/new_branch:new
- EOF
- ) &&
-
- check_branch hgrepo default one &&
- check_branch hgrepo good_branch "good branch" &&
- check_branch hgrepo bad_branch "bad branch" &&
- check_branch hgrepo new_branch '' &&
- check_bookmark hgrepo good_bmark one &&
- check_bookmark hgrepo bad_bmark1 one &&
- check_bookmark hgrepo bad_bmark2 one &&
- check_bookmark hgrepo new_bmark ''
-'
-
-test_expect_success 'remote double failed push' '
- test_when_finished "rm -rf hgrepo gitrepo*" &&
-
- (
- hg init hgrepo &&
- cd hgrepo &&
- echo zero >content &&
- hg add content &&
- hg commit -m zero &&
- echo one >content &&
- hg commit -m one
- ) &&
-
- (
- git clone "hg::hgrepo" gitrepo &&
- cd gitrepo &&
- git reset --hard HEAD^ &&
- echo two >content &&
- git commit -a -m two &&
- test_expect_code 1 git push &&
- test_expect_code 1 git push
- )
-'
-
-test_done
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index dc59a91031..db925ca769 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -46,6 +46,7 @@ ignore_joins=
annotate=
squash=
message=
+prefix=
debug()
{
diff --git a/contrib/subtree/t/t7900-subtree.sh b/contrib/subtree/t/t7900-subtree.sh
index 66ce4b07c2..8dc6840353 100755
--- a/contrib/subtree/t/t7900-subtree.sh
+++ b/contrib/subtree/t/t7900-subtree.sh
@@ -8,7 +8,8 @@ This test verifies the basic operation of the merge, pull, add
and split subcommands of git subtree.
'
-export TEST_DIRECTORY=$(pwd)/../../../t
+TEST_DIRECTORY=$(pwd)/../../../t
+export TEST_DIRECTORY
. ../../../t/test-lib.sh
diff --git a/daemon.c b/daemon.c
index 503e03906c..eba1255684 100644
--- a/daemon.c
+++ b/daemon.c
@@ -1056,11 +1056,6 @@ static void drop_privileges(struct credentials *cred)
/* nothing */
}
-static void daemonize(void)
-{
- die("--detach not supported on this platform");
-}
-
static struct credentials *prepare_credentials(const char *user_name,
const char *group_name)
{
@@ -1102,24 +1097,6 @@ static struct credentials *prepare_credentials(const char *user_name,
return &c;
}
-
-static void daemonize(void)
-{
- switch (fork()) {
- case 0:
- break;
- case -1:
- die_errno("fork failed");
- default:
- exit(0);
- }
- if (setsid() == -1)
- die_errno("setsid failed");
- close(0);
- close(1);
- close(2);
- sanitize_stdfds();
-}
#endif
static void store_pid(const char *path)
@@ -1333,9 +1310,10 @@ int main(int argc, char **argv)
if (inetd_mode || serve_mode)
return execute();
- if (detach)
- daemonize();
- else
+ if (detach) {
+ if (daemonize())
+ die("--detach not supported on this platform");
+ } else
sanitize_stdfds();
if (pid_file)
diff --git a/date.c b/date.c
index e1a2cee568..782de95d90 100644
--- a/date.c
+++ b/date.c
@@ -144,8 +144,8 @@ void show_date_relative(unsigned long time, int tz,
if (months) {
struct strbuf sb = STRBUF_INIT;
strbuf_addf(&sb, Q_("%lu year", "%lu years", years), years);
- /* TRANSLATORS: "%s" is "<n> years" */
strbuf_addf(timebuf,
+ /* TRANSLATORS: "%s" is "<n> years" */
Q_("%s, %lu month ago", "%s, %lu months ago", months),
sb.buf, months);
strbuf_release(&sb);
diff --git a/diff-lib.c b/diff-lib.c
index 2eddc66bbd..875aff8643 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -91,16 +91,12 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
unsigned ce_option = ((option & DIFF_RACY_IS_MODIFIED)
? CE_MATCH_RACY_IS_DIRTY : 0);
- if (option & DIFF_SILENT_ON_REMOVED)
- handle_deprecated_show_diff_q(&revs->diffopt);
-
diff_set_mnemonic_prefix(&revs->diffopt, "i/", "w/");
if (diff_unmerged_stage < 0)
diff_unmerged_stage = 2;
entries = active_nr;
for (i = 0; i < entries; i++) {
- struct stat st;
unsigned int oldmode, newmode;
struct cache_entry *ce = active_cache[i];
int changed;
@@ -118,6 +114,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
unsigned int wt_mode = 0;
int num_compare_stages = 0;
size_t path_len;
+ struct stat st;
path_len = ce_namelen(ce);
@@ -125,7 +122,6 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
dpath->path = (char *) &(dpath->parent[5]);
dpath->next = NULL;
- dpath->len = path_len;
memcpy(dpath->path, ce->name, path_len);
dpath->path[path_len] = '\0';
hashclr(dpath->sha1);
@@ -199,26 +195,35 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
continue;
/* If CE_VALID is set, don't look at workdir for file removal */
- changed = (ce->ce_flags & CE_VALID) ? 0 : check_removed(ce, &st);
- if (changed) {
- if (changed < 0) {
- perror(ce->name);
+ if (ce->ce_flags & CE_VALID) {
+ changed = 0;
+ newmode = ce->ce_mode;
+ } else {
+ struct stat st;
+
+ changed = check_removed(ce, &st);
+ if (changed) {
+ if (changed < 0) {
+ perror(ce->name);
+ continue;
+ }
+ diff_addremove(&revs->diffopt, '-', ce->ce_mode,
+ ce->sha1, !is_null_sha1(ce->sha1),
+ ce->name, 0);
continue;
}
- diff_addremove(&revs->diffopt, '-', ce->ce_mode,
- ce->sha1, !is_null_sha1(ce->sha1),
- ce->name, 0);
- continue;
+
+ changed = match_stat_with_submodule(&revs->diffopt, ce, &st,
+ ce_option, &dirty_submodule);
+ newmode = ce_mode_from_stat(ce, st.st_mode);
}
- changed = match_stat_with_submodule(&revs->diffopt, ce, &st,
- ce_option, &dirty_submodule);
+
if (!changed && !dirty_submodule) {
ce_mark_uptodate(ce);
if (!DIFF_OPT_TST(&revs->diffopt, FIND_COPIES_HARDER))
continue;
}
oldmode = ce->ce_mode;
- newmode = ce_mode_from_stat(ce, st.st_mode);
diff_change(&revs->diffopt, oldmode, newmode,
ce->sha1, (changed ? null_sha1 : ce->sha1),
!is_null_sha1(ce->sha1), (changed ? 0 : !is_null_sha1(ce->sha1)),
@@ -327,7 +332,6 @@ static int show_modified(struct rev_info *revs,
p = xmalloc(combine_diff_path_size(2, pathlen));
p->path = (char *) &p->parent[2];
p->next = NULL;
- p->len = pathlen;
memcpy(p->path, new->name, pathlen);
p->path[pathlen] = 0;
p->mode = mode;
diff --git a/diff-no-index.c b/diff-no-index.c
index 798477f7e5..265709ba8c 100644
--- a/diff-no-index.c
+++ b/diff-no-index.c
@@ -15,8 +15,9 @@
#include "log-tree.h"
#include "builtin.h"
#include "string-list.h"
+#include "dir.h"
-static int read_directory(const char *path, struct string_list *list)
+static int read_directory_contents(const char *path, struct string_list *list)
{
DIR *dir;
struct dirent *e;
@@ -25,7 +26,7 @@ static int read_directory(const char *path, struct string_list *list)
return error("Could not open directory %s", path);
while ((e = readdir(dir)))
- if (strcmp(".", e->d_name) && strcmp("..", e->d_name))
+ if (!is_dot_or_dotdot(e->d_name))
string_list_insert(list, e->d_name);
closedir(dir);
@@ -107,9 +108,9 @@ static int queue_diff(struct diff_options *o,
int i1, i2, ret = 0;
size_t len1 = 0, len2 = 0;
- if (name1 && read_directory(name1, &p1))
+ if (name1 && read_directory_contents(name1, &p1))
return -1;
- if (name2 && read_directory(name2, &p2)) {
+ if (name2 && read_directory_contents(name2, &p2)) {
string_list_clear(&p1, 0);
return -1;
}
@@ -186,7 +187,6 @@ void diff_no_index(struct rev_info *revs,
const char *prefix)
{
int i, prefixlen;
- unsigned deprecated_show_diff_q_option_used = 0;
const char *paths[2];
diff_setup(&revs->diffopt);
@@ -194,10 +194,6 @@ void diff_no_index(struct rev_info *revs,
int j;
if (!strcmp(argv[i], "--no-index"))
i++;
- else if (!strcmp(argv[i], "-q")) {
- deprecated_show_diff_q_option_used = 1;
- i++;
- }
else if (!strcmp(argv[i], "--"))
i++;
else {
@@ -230,9 +226,6 @@ void diff_no_index(struct rev_info *revs,
revs->max_count = -2;
diff_setup_done(&revs->diffopt);
- if (deprecated_show_diff_q_option_used)
- handle_deprecated_show_diff_q(&revs->diffopt);
-
setup_diff_pager(&revs->diffopt);
DIFF_OPT_SET(&revs->diffopt, EXIT_WITH_STATUS);
diff --git a/diff.c b/diff.c
index 635dee244d..3f1f08f9fd 100644
--- a/diff.c
+++ b/diff.c
@@ -16,6 +16,7 @@
#include "submodule.h"
#include "ll-merge.h"
#include "string-list.h"
+#include "argv-array.h"
#ifdef NO_FAST_WORKING_DIRECTORY
#define FAST_WORKING_DIRECTORY 0
@@ -1360,12 +1361,8 @@ static struct diffstat_file *diffstat_add(struct diffstat_t *diffstat,
const char *name_b)
{
struct diffstat_file *x;
- x = xcalloc(sizeof (*x), 1);
- if (diffstat->nr == diffstat->alloc) {
- diffstat->alloc = alloc_nr(diffstat->alloc);
- diffstat->files = xrealloc(diffstat->files,
- diffstat->alloc * sizeof(x));
- }
+ x = xcalloc(1, sizeof(*x));
+ ALLOC_GROW(diffstat->files, diffstat->nr + 1, diffstat->alloc);
diffstat->files[diffstat->nr++] = x;
if (name_b) {
x->from_name = xstrdup(name_a);
@@ -1465,20 +1462,12 @@ int print_stat_summary(FILE *fp, int files, int insertions, int deletions)
* but nothing about added/removed lines? Is this a bug in Git?").
*/
if (insertions || deletions == 0) {
- /*
- * TRANSLATORS: "+" in (+) is a line addition marker;
- * do not translate it.
- */
strbuf_addf(&sb,
(insertions == 1) ? ", %d insertion(+)" : ", %d insertions(+)",
insertions);
}
if (deletions || insertions == 0) {
- /*
- * TRANSLATORS: "-" in (-) is a line removal marker;
- * do not translate it.
- */
strbuf_addf(&sb,
(deletions == 1) ? ", %d deletion(-)" : ", %d deletions(-)",
deletions);
@@ -2906,9 +2895,8 @@ static void run_external_diff(const char *pgm,
int complete_rewrite,
struct diff_options *o)
{
- const char *spawn_arg[10];
+ struct argv_array argv = ARGV_ARRAY_INIT;
int retval;
- const char **arg = &spawn_arg[0];
struct diff_queue_struct *q = &diff_queued_diff;
const char *env[3] = { NULL };
char env_counter[50];
@@ -2919,23 +2907,22 @@ static void run_external_diff(const char *pgm,
const char *othername = (other ? other : name);
temp_one = prepare_temp_file(name, one);
temp_two = prepare_temp_file(othername, two);
- *arg++ = pgm;
- *arg++ = name;
- *arg++ = temp_one->name;
- *arg++ = temp_one->hex;
- *arg++ = temp_one->mode;
- *arg++ = temp_two->name;
- *arg++ = temp_two->hex;
- *arg++ = temp_two->mode;
+ argv_array_push(&argv, pgm);
+ argv_array_push(&argv, name);
+ argv_array_push(&argv, temp_one->name);
+ argv_array_push(&argv, temp_one->hex);
+ argv_array_push(&argv, temp_one->mode);
+ argv_array_push(&argv, temp_two->name);
+ argv_array_push(&argv, temp_two->hex);
+ argv_array_push(&argv, temp_two->mode);
if (other) {
- *arg++ = other;
- *arg++ = xfrm_msg;
+ argv_array_push(&argv, other);
+ argv_array_push(&argv, xfrm_msg);
}
} else {
- *arg++ = pgm;
- *arg++ = name;
+ argv_array_push(&argv, pgm);
+ argv_array_push(&argv, name);
}
- *arg = NULL;
fflush(NULL);
env[0] = env_counter;
@@ -2944,8 +2931,9 @@ static void run_external_diff(const char *pgm,
env[1] = env_total;
snprintf(env_total, sizeof(env_total), "GIT_DIFF_PATH_TOTAL=%d", q->nr);
- retval = run_command_v_opt_cd_env(spawn_arg, RUN_USING_SHELL, NULL, env);
+ retval = run_command_v_opt_cd_env(argv.argv, RUN_USING_SHELL, NULL, env);
remove_tempfile();
+ argv_array_clear(&argv);
if (retval) {
fprintf(stderr, "external diff died, stopping at %s.\n", name);
exit(1);
@@ -3337,6 +3325,9 @@ void diff_setup_done(struct diff_options *options)
}
options->diff_path_counter = 0;
+
+ if (DIFF_OPT_TST(options, FOLLOW_RENAMES) && options->pathspec.nr != 1)
+ die(_("--follow requires exactly one pathspec"));
}
static int opt_arg(const char *arg, int arg_short, const char *arg_long, int *val)
@@ -3366,14 +3357,11 @@ static int opt_arg(const char *arg, int arg_short, const char *arg_long, int *va
if (c != '-')
return 0;
arg++;
- eq = strchr(arg, '=');
- if (eq)
- len = eq - arg;
- else
- len = strlen(arg);
+ eq = strchrnul(arg, '=');
+ len = eq - arg;
if (!len || strncmp(arg, arg_long, len))
return 0;
- if (eq) {
+ if (*eq) {
int n;
char *end;
if (!isdigit(*++eq))
@@ -3600,14 +3588,6 @@ static int parse_diff_filter_opt(const char *optarg, struct diff_options *opt)
return 0;
}
-/* Used only by "diff-files" and "diff --no-index" */
-void handle_deprecated_show_diff_q(struct diff_options *opt)
-{
- warning("'diff -q' and 'diff-files -q' are deprecated.");
- warning("Use 'diff --diff-filter=d' instead to ignore deleted filepairs.");
- parse_diff_filter_opt("d", opt);
-}
-
static void enable_patch_output(int *fmt) {
*fmt &= ~DIFF_FORMAT_NO_OUTPUT;
*fmt |= DIFF_FORMAT_PATCH;
@@ -3966,11 +3946,7 @@ struct diff_queue_struct diff_queued_diff;
void diff_q(struct diff_queue_struct *queue, struct diff_filepair *dp)
{
- if (queue->alloc <= queue->nr) {
- queue->alloc = alloc_nr(queue->alloc);
- queue->queue = xrealloc(queue->queue,
- sizeof(dp) * queue->alloc);
- }
+ ALLOC_GROW(queue->queue, queue->nr + 1, queue->alloc);
queue->queue[queue->nr++] = dp;
}
diff --git a/diff.h b/diff.h
index ce123fa06f..a24a767db7 100644
--- a/diff.h
+++ b/diff.h
@@ -198,7 +198,6 @@ extern int diff_root_tree_sha1(const unsigned char *new, const char *base,
struct combine_diff_path {
struct combine_diff_path *next;
- int len;
char *path;
unsigned int mode;
unsigned char sha1[20];
@@ -346,8 +345,6 @@ extern int parse_rename_score(const char **cp_p);
extern long parse_algorithm_value(const char *value);
-extern void handle_deprecated_show_diff_q(struct diff_options *);
-
extern int print_stat_summary(FILE *fp, int files,
int insertions, int deletions);
extern void setup_diff_pager(struct diff_options *);
diff --git a/diffcore-order.c b/diffcore-order.c
index fe7f1f4647..97dd3d0095 100644
--- a/diffcore-order.c
+++ b/diffcore-order.c
@@ -57,12 +57,6 @@ static void prepare_order(const char *orderfile)
}
}
-struct pair_order {
- struct diff_filepair *pair;
- int orig_order;
- int order;
-};
-
static int match_order(const char *path)
{
int i;
@@ -73,7 +67,7 @@ static int match_order(const char *path)
strbuf_addstr(&p, path);
while (p.buf[0]) {
char *cp;
- if (!fnmatch(order[i], p.buf, 0))
+ if (!wildmatch(order[i], p.buf, 0, NULL))
return i;
cp = strrchr(p.buf, '/');
if (!cp)
@@ -84,35 +78,54 @@ static int match_order(const char *path)
return order_cnt;
}
-static int compare_pair_order(const void *a_, const void *b_)
+static int compare_objs_order(const void *a_, const void *b_)
{
- struct pair_order const *a, *b;
- a = (struct pair_order const *)a_;
- b = (struct pair_order const *)b_;
+ struct obj_order const *a, *b;
+ a = (struct obj_order const *)a_;
+ b = (struct obj_order const *)b_;
if (a->order != b->order)
return a->order - b->order;
return a->orig_order - b->orig_order;
}
+void order_objects(const char *orderfile, obj_path_fn_t obj_path,
+ struct obj_order *objs, int nr)
+{
+ int i;
+
+ if (!nr)
+ return;
+
+ prepare_order(orderfile);
+ for (i = 0; i < nr; i++) {
+ objs[i].orig_order = i;
+ objs[i].order = match_order(obj_path(objs[i].obj));
+ }
+ qsort(objs, nr, sizeof(*objs), compare_objs_order);
+}
+
+static const char *pair_pathtwo(void *obj)
+{
+ struct diff_filepair *pair = (struct diff_filepair *)obj;
+
+ return pair->two->path;
+}
+
void diffcore_order(const char *orderfile)
{
struct diff_queue_struct *q = &diff_queued_diff;
- struct pair_order *o;
+ struct obj_order *o;
int i;
if (!q->nr)
return;
o = xmalloc(sizeof(*o) * q->nr);
- prepare_order(orderfile);
- for (i = 0; i < q->nr; i++) {
- o[i].pair = q->queue[i];
- o[i].orig_order = i;
- o[i].order = match_order(o[i].pair->two->path);
- }
- qsort(o, q->nr, sizeof(*o), compare_pair_order);
for (i = 0; i < q->nr; i++)
- q->queue[i] = o[i].pair;
+ o[i].obj = q->queue[i];
+ order_objects(orderfile, pair_pathtwo, o, q->nr);
+ for (i = 0; i < q->nr; i++)
+ q->queue[i] = o[i].obj;
free(o);
return;
}
diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c
index 401eb72c61..185f86b284 100644
--- a/diffcore-pickaxe.c
+++ b/diffcore-pickaxe.c
@@ -12,47 +12,6 @@ typedef int (*pickaxe_fn)(mmfile_t *one, mmfile_t *two,
struct diff_options *o,
regex_t *regexp, kwset_t kws);
-static int pickaxe_match(struct diff_filepair *p, struct diff_options *o,
- regex_t *regexp, kwset_t kws, pickaxe_fn fn);
-
-static void pickaxe(struct diff_queue_struct *q, struct diff_options *o,
- regex_t *regexp, kwset_t kws, pickaxe_fn fn)
-{
- int i;
- struct diff_queue_struct outq;
-
- DIFF_QUEUE_CLEAR(&outq);
-
- if (o->pickaxe_opts & DIFF_PICKAXE_ALL) {
- /* Showing the whole changeset if needle exists */
- for (i = 0; i < q->nr; i++) {
- struct diff_filepair *p = q->queue[i];
- if (pickaxe_match(p, o, regexp, kws, fn))
- return; /* do not munge the queue */
- }
-
- /*
- * Otherwise we will clear the whole queue by copying
- * the empty outq at the end of this function, but
- * first clear the current entries in the queue.
- */
- for (i = 0; i < q->nr; i++)
- diff_free_filepair(q->queue[i]);
- } else {
- /* Showing only the filepairs that has the needle */
- for (i = 0; i < q->nr; i++) {
- struct diff_filepair *p = q->queue[i];
- if (pickaxe_match(p, o, regexp, kws, fn))
- diff_q(&outq, p);
- else
- diff_free_filepair(p);
- }
- }
-
- free(q->queue);
- *q = outq;
-}
-
struct diffgrep_cb {
regex_t *regexp;
int hit;
@@ -108,29 +67,6 @@ static int diff_grep(mmfile_t *one, mmfile_t *two,
return ecbdata.hit;
}
-static void diffcore_pickaxe_grep(struct diff_options *o)
-{
- int err;
- regex_t regex;
- int cflags = REG_EXTENDED | REG_NEWLINE;
-
- if (DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE))
- cflags |= REG_ICASE;
-
- err = regcomp(&regex, o->pickaxe, cflags);
- if (err) {
- char errbuf[1024];
- regerror(err, &regex, errbuf, 1024);
- regfree(&regex);
- die("invalid regex: %s", errbuf);
- }
-
- pickaxe(&diff_queued_diff, o, &regex, NULL, diff_grep);
-
- regfree(&regex);
- return;
-}
-
static unsigned int contains(mmfile_t *mf, regex_t *regexp, kwset_t kws)
{
unsigned int cnt;
@@ -158,13 +94,10 @@ static unsigned int contains(mmfile_t *mf, regex_t *regexp, kwset_t kws)
while (sz) {
struct kwsmatch kwsm;
size_t offset = kwsexec(kws, data, sz, &kwsm);
- const char *found;
if (offset == -1)
break;
- else
- found = data + offset;
- sz -= found - data + kwsm.size[0];
- data = found + kwsm.size[0];
+ sz -= offset + kwsm.size[0];
+ data += offset + kwsm.size[0];
cnt++;
}
}
@@ -227,17 +160,57 @@ static int pickaxe_match(struct diff_filepair *p, struct diff_options *o,
return ret;
}
-static void diffcore_pickaxe_count(struct diff_options *o)
+static void pickaxe(struct diff_queue_struct *q, struct diff_options *o,
+ regex_t *regexp, kwset_t kws, pickaxe_fn fn)
+{
+ int i;
+ struct diff_queue_struct outq;
+
+ DIFF_QUEUE_CLEAR(&outq);
+
+ if (o->pickaxe_opts & DIFF_PICKAXE_ALL) {
+ /* Showing the whole changeset if needle exists */
+ for (i = 0; i < q->nr; i++) {
+ struct diff_filepair *p = q->queue[i];
+ if (pickaxe_match(p, o, regexp, kws, fn))
+ return; /* do not munge the queue */
+ }
+
+ /*
+ * Otherwise we will clear the whole queue by copying
+ * the empty outq at the end of this function, but
+ * first clear the current entries in the queue.
+ */
+ for (i = 0; i < q->nr; i++)
+ diff_free_filepair(q->queue[i]);
+ } else {
+ /* Showing only the filepairs that has the needle */
+ for (i = 0; i < q->nr; i++) {
+ struct diff_filepair *p = q->queue[i];
+ if (pickaxe_match(p, o, regexp, kws, fn))
+ diff_q(&outq, p);
+ else
+ diff_free_filepair(p);
+ }
+ }
+
+ free(q->queue);
+ *q = outq;
+}
+
+void diffcore_pickaxe(struct diff_options *o)
{
const char *needle = o->pickaxe;
int opts = o->pickaxe_opts;
- unsigned long len = strlen(needle);
regex_t regex, *regexp = NULL;
kwset_t kws = NULL;
- if (opts & DIFF_PICKAXE_REGEX) {
+ if (opts & (DIFF_PICKAXE_REGEX | DIFF_PICKAXE_KIND_G)) {
int err;
- err = regcomp(&regex, needle, REG_EXTENDED | REG_NEWLINE);
+ int cflags = REG_EXTENDED | REG_NEWLINE;
+ if (DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE))
+ cflags |= REG_ICASE;
+ err = regcomp(&regex, needle, cflags);
if (err) {
/* The POSIX.2 people are surely sick */
char errbuf[1024];
@@ -249,24 +222,17 @@ static void diffcore_pickaxe_count(struct diff_options *o)
} else {
kws = kwsalloc(DIFF_OPT_TST(o, PICKAXE_IGNORE_CASE)
? tolower_trans_tbl : NULL);
- kwsincr(kws, needle, len);
+ kwsincr(kws, needle, strlen(needle));
kwsprep(kws);
}
- pickaxe(&diff_queued_diff, o, regexp, kws, has_changes);
+ /* Might want to warn when both S and G are on; I don't care... */
+ pickaxe(&diff_queued_diff, o, regexp, kws,
+ (opts & DIFF_PICKAXE_KIND_G) ? diff_grep : has_changes);
- if (opts & DIFF_PICKAXE_REGEX)
- regfree(&regex);
+ if (regexp)
+ regfree(regexp);
else
kwsfree(kws);
return;
}
-
-void diffcore_pickaxe(struct diff_options *o)
-{
- /* Might want to warn when both S and G are on; I don't care... */
- if (o->pickaxe_opts & DIFF_PICKAXE_KIND_G)
- diffcore_pickaxe_grep(o);
- else
- diffcore_pickaxe_count(o);
-}
diff --git a/diffcore-rename.c b/diffcore-rename.c
index 6c7a72fbe7..749a35d2c2 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 */
@@ -38,11 +38,7 @@ static struct diff_rename_dst *locate_rename_dst(struct diff_filespec *two,
if (!insert_ok)
return NULL;
/* insert to make it at "first" */
- if (rename_dst_alloc <= rename_dst_nr) {
- rename_dst_alloc = alloc_nr(rename_dst_alloc);
- rename_dst = xrealloc(rename_dst,
- rename_dst_alloc * sizeof(*rename_dst));
- }
+ ALLOC_GROW(rename_dst, rename_dst_nr + 1, rename_dst_alloc);
rename_dst_nr++;
if (first < rename_dst_nr)
memmove(rename_dst + first + 1, rename_dst + first,
@@ -82,11 +78,7 @@ static struct diff_rename_src *register_rename_src(struct diff_filepair *p)
}
/* insert to make it at "first" */
- if (rename_src_alloc <= rename_src_nr) {
- rename_src_alloc = alloc_nr(rename_src_alloc);
- rename_src = xrealloc(rename_src,
- rename_src_alloc * sizeof(*rename_src));
- }
+ ALLOC_GROW(rename_src, rename_src_nr + 1, rename_src_alloc);
rename_src_nr++;
if (first < rename_src_nr)
memmove(rename_src + first + 1, rename_src + first,
@@ -243,137 +235,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 +322,22 @@ static void insert_file_table(struct hash_table *table, int src_dst, int index,
*/
static int find_exact_renames(struct diff_options *options)
{
- int i;
- struct hash_table file_table;
+ int i, renames = 0;
+ struct hashmap file_table;
- init_hash(&file_table);
- preallocate_hash(&file_table, rename_src_nr + rename_dst_nr);
+ /* Add all sources to the hash table */
+ hashmap_init(&file_table, NULL, rename_src_nr);
for (i = 0; i < rename_src_nr; i++)
- insert_file_table(&file_table, -1, i, rename_src[i].p->one);
+ insert_file_table(&file_table, i, rename_src[i].p->one);
+ /* Walk the destinations and find best source match */
for (i = 0; i < rename_dst_nr; i++)
- insert_file_table(&file_table, 1, i, rename_dst[i].two);
-
- /* Find the renames */
- i = for_each_hash(&file_table, find_same_files, options);
+ renames += find_identical_files(&file_table, i, options);
- /* .. and free the hash data structure */
- free_hash(&file_table);
+ /* Free the hash data structure and entries */
+ hashmap_free(&file_table, 1);
- return i;
+ return renames;
}
#define NUM_CANDIDATE_PER_DST 4
@@ -579,7 +514,7 @@ void diffcore_rename(struct diff_options *options)
if (options->show_rename_progress) {
progress = start_progress_delay(
- "Performing inexact rename detection",
+ _("Performing inexact rename detection"),
rename_dst_nr * rename_src_nr, 50, 1);
}
diff --git a/diffcore.h b/diffcore.h
index 1315cfd4ef..c876dac71a 100644
--- a/diffcore.h
+++ b/diffcore.h
@@ -46,7 +46,7 @@ struct diff_filespec {
unsigned is_stdin : 1;
unsigned has_more_entries : 1; /* only appear in combined diff */
/* data should be considered "binary"; -1 means "don't know yet" */
- int is_binary : 2;
+ signed int is_binary : 2;
struct userdiff_driver *driver;
};
@@ -111,6 +111,20 @@ extern void diffcore_merge_broken(void);
extern void diffcore_pickaxe(struct diff_options *);
extern void diffcore_order(const char *orderfile);
+/* low-level interface to diffcore_order */
+struct obj_order {
+ void *obj; /* setup by caller */
+
+ /* setup/used by order_objects() */
+ int orig_order;
+ int order;
+};
+
+typedef const char *(*obj_path_fn_t)(void *obj);
+
+void order_objects(const char *orderfile, obj_path_fn_t obj_path,
+ struct obj_order *objs, int nr);
+
#define DIFF_DEBUG 0
#if DIFF_DEBUG
void diff_debug_filespec(struct diff_filespec *, int, const char *);
diff --git a/dir.c b/dir.c
index 98bb50fbab..797805d6a1 100644
--- a/dir.c
+++ b/dir.c
@@ -49,16 +49,18 @@ int strncmp_icase(const char *a, const char *b, size_t count)
int fnmatch_icase(const char *pattern, const char *string, int flags)
{
- return fnmatch(pattern, string, flags | (ignore_case ? FNM_CASEFOLD : 0));
+ return wildmatch(pattern, string,
+ flags | (ignore_case ? WM_CASEFOLD : 0),
+ NULL);
}
-inline int git_fnmatch(const struct pathspec_item *item,
- const char *pattern, const char *string,
- int prefix)
+int git_fnmatch(const struct pathspec_item *item,
+ const char *pattern, const char *string,
+ int prefix)
{
if (prefix > 0) {
if (ps_strncmp(item, pattern, string, prefix))
- return FNM_NOMATCH;
+ return WM_NOMATCH;
pattern += prefix;
string += prefix;
}
@@ -76,8 +78,9 @@ inline int git_fnmatch(const struct pathspec_item *item,
NULL);
else
/* wildmatch has not learned no FNM_PATHNAME mode yet */
- return fnmatch(pattern, string,
- item->magic & PATHSPEC_ICASE ? FNM_CASEFOLD : 0);
+ return wildmatch(pattern, string,
+ item->magic & PATHSPEC_ICASE ? WM_CASEFOLD : 0,
+ NULL);
}
static int fnmatch_icase_mem(const char *pattern, int patternlen,
@@ -503,6 +506,29 @@ void clear_exclude_list(struct exclude_list *el)
el->filebuf = NULL;
}
+static void trim_trailing_spaces(char *buf)
+{
+ char *p, *last_space = NULL;
+
+ for (p = buf; *p; p++)
+ switch (*p) {
+ case ' ':
+ if (!last_space)
+ last_space = p;
+ break;
+ case '\\':
+ p++;
+ if (!*p)
+ return;
+ /* fallthrough */
+ default:
+ last_space = NULL;
+ }
+
+ if (last_space)
+ *last_space = '\0';
+}
+
int add_excludes_from_file_to_list(const char *fname,
const char *base,
int baselen,
@@ -554,6 +580,7 @@ int add_excludes_from_file_to_list(const char *fname,
if (buf[i] == '\n') {
if (entry != buf + i && entry[0] != '#') {
buf[i - (i && buf[i-1] == '\r')] = 0;
+ trim_trailing_spaces(entry);
add_exclude(entry, base, baselen, el, lineno);
}
lineno++;
@@ -1341,10 +1368,7 @@ static struct path_simplify *create_simplify(const char **pathspec)
for (nr = 0 ; ; nr++) {
const char *match;
- if (nr >= alloc) {
- alloc = alloc_nr(alloc);
- simplify = xrealloc(simplify, alloc * sizeof(*simplify));
- }
+ ALLOC_GROW(simplify, nr + 1, alloc);
match = *pathspec++;
if (!match)
break;
diff --git a/environment.c b/environment.c
index 39a8c6c343..9daa0ba4a3 100644
--- a/environment.c
+++ b/environment.c
@@ -45,7 +45,7 @@ const char *editor_program;
const char *askpass_program;
const char *excludes_file;
enum auto_crlf auto_crlf = AUTO_CRLF_FALSE;
-int read_replace_refs = 1; /* NEEDSWORK: rename to use_replace_refs */
+int check_replace_refs = 1;
enum eol core_eol = EOL_UNSET;
enum safe_crlf safe_crlf = SAFE_CRLF_WARN;
unsigned whitespace_rule_cfg = WS_DEFAULT_RULE;
@@ -157,7 +157,7 @@ static void setup_git_env(void)
if (!git_graft_file)
git_graft_file = git_pathdup("info/grafts");
if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT))
- read_replace_refs = 0;
+ check_replace_refs = 0;
namespace = expand_namespace(getenv(GIT_NAMESPACE_ENVIRONMENT));
namespace_len = strlen(namespace);
shallow_file = getenv(GIT_SHALLOW_FILE_ENVIRONMENT);
@@ -247,7 +247,7 @@ int odb_mkstemp(char *template, size_t limit, const char *pattern)
return xmkstemp_mode(template, mode);
}
-int odb_pack_keep(char *name, size_t namesz, unsigned char *sha1)
+int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1)
{
int fd;
diff --git a/ewah/bitmap.c b/ewah/bitmap.c
new file mode 100644
index 0000000000..710e58c1bf
--- /dev/null
+++ b/ewah/bitmap.c
@@ -0,0 +1,221 @@
+/**
+ * Copyright 2013, GitHub, Inc
+ * Copyright 2009-2013, Daniel Lemire, Cliff Moon,
+ * David McIntosh, Robert Becho, Google Inc. and Veronika Zenz
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#include "git-compat-util.h"
+#include "ewok.h"
+
+#define MASK(x) ((eword_t)1 << (x % BITS_IN_WORD))
+#define BLOCK(x) (x / BITS_IN_WORD)
+
+struct bitmap *bitmap_new(void)
+{
+ struct bitmap *bitmap = ewah_malloc(sizeof(struct bitmap));
+ bitmap->words = ewah_calloc(32, sizeof(eword_t));
+ bitmap->word_alloc = 32;
+ return bitmap;
+}
+
+void bitmap_set(struct bitmap *self, size_t pos)
+{
+ size_t block = BLOCK(pos);
+
+ if (block >= self->word_alloc) {
+ size_t old_size = self->word_alloc;
+ self->word_alloc = block * 2;
+ self->words = ewah_realloc(self->words,
+ self->word_alloc * sizeof(eword_t));
+
+ memset(self->words + old_size, 0x0,
+ (self->word_alloc - old_size) * sizeof(eword_t));
+ }
+
+ self->words[block] |= MASK(pos);
+}
+
+void bitmap_clear(struct bitmap *self, size_t pos)
+{
+ size_t block = BLOCK(pos);
+
+ if (block < self->word_alloc)
+ self->words[block] &= ~MASK(pos);
+}
+
+int bitmap_get(struct bitmap *self, size_t pos)
+{
+ size_t block = BLOCK(pos);
+ return block < self->word_alloc &&
+ (self->words[block] & MASK(pos)) != 0;
+}
+
+struct ewah_bitmap *bitmap_to_ewah(struct bitmap *bitmap)
+{
+ struct ewah_bitmap *ewah = ewah_new();
+ size_t i, running_empty_words = 0;
+ eword_t last_word = 0;
+
+ for (i = 0; i < bitmap->word_alloc; ++i) {
+ if (bitmap->words[i] == 0) {
+ running_empty_words++;
+ continue;
+ }
+
+ if (last_word != 0)
+ ewah_add(ewah, last_word);
+
+ if (running_empty_words > 0) {
+ ewah_add_empty_words(ewah, 0, running_empty_words);
+ running_empty_words = 0;
+ }
+
+ last_word = bitmap->words[i];
+ }
+
+ ewah_add(ewah, last_word);
+ return ewah;
+}
+
+struct bitmap *ewah_to_bitmap(struct ewah_bitmap *ewah)
+{
+ struct bitmap *bitmap = bitmap_new();
+ struct ewah_iterator it;
+ eword_t blowup;
+ size_t i = 0;
+
+ ewah_iterator_init(&it, ewah);
+
+ while (ewah_iterator_next(&blowup, &it)) {
+ if (i >= bitmap->word_alloc) {
+ bitmap->word_alloc *= 1.5;
+ bitmap->words = ewah_realloc(
+ bitmap->words, bitmap->word_alloc * sizeof(eword_t));
+ }
+
+ bitmap->words[i++] = blowup;
+ }
+
+ bitmap->word_alloc = i;
+ return bitmap;
+}
+
+void bitmap_and_not(struct bitmap *self, struct bitmap *other)
+{
+ const size_t count = (self->word_alloc < other->word_alloc) ?
+ self->word_alloc : other->word_alloc;
+
+ size_t i;
+
+ for (i = 0; i < count; ++i)
+ self->words[i] &= ~other->words[i];
+}
+
+void bitmap_or_ewah(struct bitmap *self, struct ewah_bitmap *other)
+{
+ size_t original_size = self->word_alloc;
+ size_t other_final = (other->bit_size / BITS_IN_WORD) + 1;
+ size_t i = 0;
+ struct ewah_iterator it;
+ eword_t word;
+
+ if (self->word_alloc < other_final) {
+ self->word_alloc = other_final;
+ self->words = ewah_realloc(self->words,
+ self->word_alloc * sizeof(eword_t));
+ memset(self->words + original_size, 0x0,
+ (self->word_alloc - original_size) * sizeof(eword_t));
+ }
+
+ ewah_iterator_init(&it, other);
+
+ while (ewah_iterator_next(&word, &it))
+ self->words[i++] |= word;
+}
+
+void bitmap_each_bit(struct bitmap *self, ewah_callback callback, void *data)
+{
+ size_t pos = 0, i;
+
+ for (i = 0; i < self->word_alloc; ++i) {
+ eword_t word = self->words[i];
+ uint32_t offset;
+
+ if (word == (eword_t)~0) {
+ for (offset = 0; offset < BITS_IN_WORD; ++offset)
+ callback(pos++, data);
+ } else {
+ for (offset = 0; offset < BITS_IN_WORD; ++offset) {
+ if ((word >> offset) == 0)
+ break;
+
+ offset += ewah_bit_ctz64(word >> offset);
+ callback(pos + offset, data);
+ }
+ pos += BITS_IN_WORD;
+ }
+ }
+}
+
+size_t bitmap_popcount(struct bitmap *self)
+{
+ size_t i, count = 0;
+
+ for (i = 0; i < self->word_alloc; ++i)
+ count += ewah_bit_popcount64(self->words[i]);
+
+ return count;
+}
+
+int bitmap_equals(struct bitmap *self, struct bitmap *other)
+{
+ struct bitmap *big, *small;
+ size_t i;
+
+ if (self->word_alloc < other->word_alloc) {
+ small = self;
+ big = other;
+ } else {
+ small = other;
+ big = self;
+ }
+
+ for (i = 0; i < small->word_alloc; ++i) {
+ if (small->words[i] != big->words[i])
+ return 0;
+ }
+
+ for (; i < big->word_alloc; ++i) {
+ if (big->words[i] != 0)
+ return 0;
+ }
+
+ return 1;
+}
+
+void bitmap_reset(struct bitmap *bitmap)
+{
+ memset(bitmap->words, 0x0, bitmap->word_alloc * sizeof(eword_t));
+}
+
+void bitmap_free(struct bitmap *bitmap)
+{
+ if (bitmap == NULL)
+ return;
+
+ free(bitmap->words);
+ free(bitmap);
+}
diff --git a/ewah/ewah_bitmap.c b/ewah/ewah_bitmap.c
new file mode 100644
index 0000000000..fccb42b52c
--- /dev/null
+++ b/ewah/ewah_bitmap.c
@@ -0,0 +1,714 @@
+/**
+ * Copyright 2013, GitHub, Inc
+ * Copyright 2009-2013, Daniel Lemire, Cliff Moon,
+ * David McIntosh, Robert Becho, Google Inc. and Veronika Zenz
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#include "git-compat-util.h"
+#include "ewok.h"
+#include "ewok_rlw.h"
+
+static inline size_t min_size(size_t a, size_t b)
+{
+ return a < b ? a : b;
+}
+
+static inline size_t max_size(size_t a, size_t b)
+{
+ return a > b ? a : b;
+}
+
+static inline void buffer_grow(struct ewah_bitmap *self, size_t new_size)
+{
+ size_t rlw_offset = (uint8_t *)self->rlw - (uint8_t *)self->buffer;
+
+ if (self->alloc_size >= new_size)
+ return;
+
+ self->alloc_size = new_size;
+ self->buffer = ewah_realloc(self->buffer,
+ self->alloc_size * sizeof(eword_t));
+ self->rlw = self->buffer + (rlw_offset / sizeof(eword_t));
+}
+
+static inline void buffer_push(struct ewah_bitmap *self, eword_t value)
+{
+ if (self->buffer_size + 1 >= self->alloc_size)
+ buffer_grow(self, self->buffer_size * 3 / 2);
+
+ self->buffer[self->buffer_size++] = value;
+}
+
+static void buffer_push_rlw(struct ewah_bitmap *self, eword_t value)
+{
+ buffer_push(self, value);
+ self->rlw = self->buffer + self->buffer_size - 1;
+}
+
+static size_t add_empty_words(struct ewah_bitmap *self, int v, size_t number)
+{
+ size_t added = 0;
+ eword_t runlen, can_add;
+
+ if (rlw_get_run_bit(self->rlw) != v && rlw_size(self->rlw) == 0) {
+ rlw_set_run_bit(self->rlw, v);
+ } else if (rlw_get_literal_words(self->rlw) != 0 ||
+ rlw_get_run_bit(self->rlw) != v) {
+ buffer_push_rlw(self, 0);
+ if (v) rlw_set_run_bit(self->rlw, v);
+ added++;
+ }
+
+ runlen = rlw_get_running_len(self->rlw);
+ can_add = min_size(number, RLW_LARGEST_RUNNING_COUNT - runlen);
+
+ rlw_set_running_len(self->rlw, runlen + can_add);
+ number -= can_add;
+
+ while (number >= RLW_LARGEST_RUNNING_COUNT) {
+ buffer_push_rlw(self, 0);
+ added++;
+ if (v) rlw_set_run_bit(self->rlw, v);
+ rlw_set_running_len(self->rlw, RLW_LARGEST_RUNNING_COUNT);
+ number -= RLW_LARGEST_RUNNING_COUNT;
+ }
+
+ if (number > 0) {
+ buffer_push_rlw(self, 0);
+ added++;
+
+ if (v) rlw_set_run_bit(self->rlw, v);
+ rlw_set_running_len(self->rlw, number);
+ }
+
+ return added;
+}
+
+size_t ewah_add_empty_words(struct ewah_bitmap *self, int v, size_t number)
+{
+ if (number == 0)
+ return 0;
+
+ self->bit_size += number * BITS_IN_WORD;
+ return add_empty_words(self, v, number);
+}
+
+static size_t add_literal(struct ewah_bitmap *self, eword_t new_data)
+{
+ eword_t current_num = rlw_get_literal_words(self->rlw);
+
+ if (current_num >= RLW_LARGEST_LITERAL_COUNT) {
+ buffer_push_rlw(self, 0);
+
+ rlw_set_literal_words(self->rlw, 1);
+ buffer_push(self, new_data);
+ return 2;
+ }
+
+ rlw_set_literal_words(self->rlw, current_num + 1);
+
+ /* sanity check */
+ assert(rlw_get_literal_words(self->rlw) == current_num + 1);
+
+ buffer_push(self, new_data);
+ return 1;
+}
+
+void ewah_add_dirty_words(
+ struct ewah_bitmap *self, const eword_t *buffer,
+ size_t number, int negate)
+{
+ size_t literals, can_add;
+
+ while (1) {
+ literals = rlw_get_literal_words(self->rlw);
+ can_add = min_size(number, RLW_LARGEST_LITERAL_COUNT - literals);
+
+ rlw_set_literal_words(self->rlw, literals + can_add);
+
+ if (self->buffer_size + can_add >= self->alloc_size)
+ buffer_grow(self, (self->buffer_size + can_add) * 3 / 2);
+
+ if (negate) {
+ size_t i;
+ for (i = 0; i < can_add; ++i)
+ self->buffer[self->buffer_size++] = ~buffer[i];
+ } else {
+ memcpy(self->buffer + self->buffer_size,
+ buffer, can_add * sizeof(eword_t));
+ self->buffer_size += can_add;
+ }
+
+ self->bit_size += can_add * BITS_IN_WORD;
+
+ if (number - can_add == 0)
+ break;
+
+ buffer_push_rlw(self, 0);
+ buffer += can_add;
+ number -= can_add;
+ }
+}
+
+static size_t add_empty_word(struct ewah_bitmap *self, int v)
+{
+ int no_literal = (rlw_get_literal_words(self->rlw) == 0);
+ eword_t run_len = rlw_get_running_len(self->rlw);
+
+ if (no_literal && run_len == 0) {
+ rlw_set_run_bit(self->rlw, v);
+ assert(rlw_get_run_bit(self->rlw) == v);
+ }
+
+ if (no_literal && rlw_get_run_bit(self->rlw) == v &&
+ run_len < RLW_LARGEST_RUNNING_COUNT) {
+ rlw_set_running_len(self->rlw, run_len + 1);
+ assert(rlw_get_running_len(self->rlw) == run_len + 1);
+ return 0;
+ } else {
+ buffer_push_rlw(self, 0);
+
+ assert(rlw_get_running_len(self->rlw) == 0);
+ assert(rlw_get_run_bit(self->rlw) == 0);
+ assert(rlw_get_literal_words(self->rlw) == 0);
+
+ rlw_set_run_bit(self->rlw, v);
+ assert(rlw_get_run_bit(self->rlw) == v);
+
+ rlw_set_running_len(self->rlw, 1);
+ assert(rlw_get_running_len(self->rlw) == 1);
+ assert(rlw_get_literal_words(self->rlw) == 0);
+ return 1;
+ }
+}
+
+size_t ewah_add(struct ewah_bitmap *self, eword_t word)
+{
+ self->bit_size += BITS_IN_WORD;
+
+ if (word == 0)
+ return add_empty_word(self, 0);
+
+ if (word == (eword_t)(~0))
+ return add_empty_word(self, 1);
+
+ return add_literal(self, word);
+}
+
+void ewah_set(struct ewah_bitmap *self, size_t i)
+{
+ const size_t dist =
+ (i + BITS_IN_WORD) / BITS_IN_WORD -
+ (self->bit_size + BITS_IN_WORD - 1) / BITS_IN_WORD;
+
+ assert(i >= self->bit_size);
+
+ self->bit_size = i + 1;
+
+ if (dist > 0) {
+ if (dist > 1)
+ add_empty_words(self, 0, dist - 1);
+
+ add_literal(self, (eword_t)1 << (i % BITS_IN_WORD));
+ return;
+ }
+
+ if (rlw_get_literal_words(self->rlw) == 0) {
+ rlw_set_running_len(self->rlw,
+ rlw_get_running_len(self->rlw) - 1);
+ add_literal(self, (eword_t)1 << (i % BITS_IN_WORD));
+ return;
+ }
+
+ self->buffer[self->buffer_size - 1] |=
+ ((eword_t)1 << (i % BITS_IN_WORD));
+
+ /* check if we just completed a stream of 1s */
+ if (self->buffer[self->buffer_size - 1] == (eword_t)(~0)) {
+ self->buffer[--self->buffer_size] = 0;
+ rlw_set_literal_words(self->rlw,
+ rlw_get_literal_words(self->rlw) - 1);
+ add_empty_word(self, 1);
+ }
+}
+
+void ewah_each_bit(struct ewah_bitmap *self, void (*callback)(size_t, void*), void *payload)
+{
+ size_t pos = 0;
+ size_t pointer = 0;
+ size_t k;
+
+ while (pointer < self->buffer_size) {
+ eword_t *word = &self->buffer[pointer];
+
+ if (rlw_get_run_bit(word)) {
+ size_t len = rlw_get_running_len(word) * BITS_IN_WORD;
+ for (k = 0; k < len; ++k, ++pos)
+ callback(pos, payload);
+ } else {
+ pos += rlw_get_running_len(word) * BITS_IN_WORD;
+ }
+
+ ++pointer;
+
+ for (k = 0; k < rlw_get_literal_words(word); ++k) {
+ int c;
+
+ /* todo: zero count optimization */
+ for (c = 0; c < BITS_IN_WORD; ++c, ++pos) {
+ if ((self->buffer[pointer] & ((eword_t)1 << c)) != 0)
+ callback(pos, payload);
+ }
+
+ ++pointer;
+ }
+ }
+}
+
+struct ewah_bitmap *ewah_new(void)
+{
+ struct ewah_bitmap *self;
+
+ self = ewah_malloc(sizeof(struct ewah_bitmap));
+ if (self == NULL)
+ return NULL;
+
+ self->buffer = ewah_malloc(32 * sizeof(eword_t));
+ self->alloc_size = 32;
+
+ ewah_clear(self);
+ return self;
+}
+
+void ewah_clear(struct ewah_bitmap *self)
+{
+ self->buffer_size = 1;
+ self->buffer[0] = 0;
+ self->bit_size = 0;
+ self->rlw = self->buffer;
+}
+
+void ewah_free(struct ewah_bitmap *self)
+{
+ if (!self)
+ return;
+
+ if (self->alloc_size)
+ free(self->buffer);
+
+ free(self);
+}
+
+static void read_new_rlw(struct ewah_iterator *it)
+{
+ const eword_t *word = NULL;
+
+ it->literals = 0;
+ it->compressed = 0;
+
+ while (1) {
+ word = &it->buffer[it->pointer];
+
+ it->rl = rlw_get_running_len(word);
+ it->lw = rlw_get_literal_words(word);
+ it->b = rlw_get_run_bit(word);
+
+ if (it->rl || it->lw)
+ return;
+
+ if (it->pointer < it->buffer_size - 1) {
+ it->pointer++;
+ } else {
+ it->pointer = it->buffer_size;
+ return;
+ }
+ }
+}
+
+int ewah_iterator_next(eword_t *next, struct ewah_iterator *it)
+{
+ if (it->pointer >= it->buffer_size)
+ return 0;
+
+ if (it->compressed < it->rl) {
+ it->compressed++;
+ *next = it->b ? (eword_t)(~0) : 0;
+ } else {
+ assert(it->literals < it->lw);
+
+ it->literals++;
+ it->pointer++;
+
+ assert(it->pointer < it->buffer_size);
+
+ *next = it->buffer[it->pointer];
+ }
+
+ if (it->compressed == it->rl && it->literals == it->lw) {
+ if (++it->pointer < it->buffer_size)
+ read_new_rlw(it);
+ }
+
+ return 1;
+}
+
+void ewah_iterator_init(struct ewah_iterator *it, struct ewah_bitmap *parent)
+{
+ it->buffer = parent->buffer;
+ it->buffer_size = parent->buffer_size;
+ it->pointer = 0;
+
+ it->lw = 0;
+ it->rl = 0;
+ it->compressed = 0;
+ it->literals = 0;
+ it->b = 0;
+
+ if (it->pointer < it->buffer_size)
+ read_new_rlw(it);
+}
+
+void ewah_not(struct ewah_bitmap *self)
+{
+ size_t pointer = 0;
+
+ while (pointer < self->buffer_size) {
+ eword_t *word = &self->buffer[pointer];
+ size_t literals, k;
+
+ rlw_xor_run_bit(word);
+ ++pointer;
+
+ literals = rlw_get_literal_words(word);
+ for (k = 0; k < literals; ++k) {
+ self->buffer[pointer] = ~self->buffer[pointer];
+ ++pointer;
+ }
+ }
+}
+
+void ewah_xor(
+ struct ewah_bitmap *ewah_i,
+ struct ewah_bitmap *ewah_j,
+ struct ewah_bitmap *out)
+{
+ struct rlw_iterator rlw_i;
+ struct rlw_iterator rlw_j;
+ size_t literals;
+
+ rlwit_init(&rlw_i, ewah_i);
+ rlwit_init(&rlw_j, ewah_j);
+
+ while (rlwit_word_size(&rlw_i) > 0 && rlwit_word_size(&rlw_j) > 0) {
+ while (rlw_i.rlw.running_len > 0 || rlw_j.rlw.running_len > 0) {
+ struct rlw_iterator *prey, *predator;
+ size_t index;
+ int negate_words;
+
+ if (rlw_i.rlw.running_len < rlw_j.rlw.running_len) {
+ prey = &rlw_i;
+ predator = &rlw_j;
+ } else {
+ prey = &rlw_j;
+ predator = &rlw_i;
+ }
+
+ negate_words = !!predator->rlw.running_bit;
+ index = rlwit_discharge(prey, out,
+ predator->rlw.running_len, negate_words);
+
+ ewah_add_empty_words(out, negate_words,
+ predator->rlw.running_len - index);
+
+ rlwit_discard_first_words(predator,
+ predator->rlw.running_len);
+ }
+
+ literals = min_size(
+ rlw_i.rlw.literal_words,
+ rlw_j.rlw.literal_words);
+
+ if (literals) {
+ size_t k;
+
+ for (k = 0; k < literals; ++k) {
+ ewah_add(out,
+ rlw_i.buffer[rlw_i.literal_word_start + k] ^
+ rlw_j.buffer[rlw_j.literal_word_start + k]
+ );
+ }
+
+ rlwit_discard_first_words(&rlw_i, literals);
+ rlwit_discard_first_words(&rlw_j, literals);
+ }
+ }
+
+ if (rlwit_word_size(&rlw_i) > 0)
+ rlwit_discharge(&rlw_i, out, ~0, 0);
+ else
+ rlwit_discharge(&rlw_j, out, ~0, 0);
+
+ out->bit_size = max_size(ewah_i->bit_size, ewah_j->bit_size);
+}
+
+void ewah_and(
+ struct ewah_bitmap *ewah_i,
+ struct ewah_bitmap *ewah_j,
+ struct ewah_bitmap *out)
+{
+ struct rlw_iterator rlw_i;
+ struct rlw_iterator rlw_j;
+ size_t literals;
+
+ rlwit_init(&rlw_i, ewah_i);
+ rlwit_init(&rlw_j, ewah_j);
+
+ while (rlwit_word_size(&rlw_i) > 0 && rlwit_word_size(&rlw_j) > 0) {
+ while (rlw_i.rlw.running_len > 0 || rlw_j.rlw.running_len > 0) {
+ struct rlw_iterator *prey, *predator;
+
+ if (rlw_i.rlw.running_len < rlw_j.rlw.running_len) {
+ prey = &rlw_i;
+ predator = &rlw_j;
+ } else {
+ prey = &rlw_j;
+ predator = &rlw_i;
+ }
+
+ if (predator->rlw.running_bit == 0) {
+ ewah_add_empty_words(out, 0,
+ predator->rlw.running_len);
+ rlwit_discard_first_words(prey,
+ predator->rlw.running_len);
+ rlwit_discard_first_words(predator,
+ predator->rlw.running_len);
+ } else {
+ size_t index = rlwit_discharge(prey, out,
+ predator->rlw.running_len, 0);
+ ewah_add_empty_words(out, 0,
+ predator->rlw.running_len - index);
+ rlwit_discard_first_words(predator,
+ predator->rlw.running_len);
+ }
+ }
+
+ literals = min_size(
+ rlw_i.rlw.literal_words,
+ rlw_j.rlw.literal_words);
+
+ if (literals) {
+ size_t k;
+
+ for (k = 0; k < literals; ++k) {
+ ewah_add(out,
+ rlw_i.buffer[rlw_i.literal_word_start + k] &
+ rlw_j.buffer[rlw_j.literal_word_start + k]
+ );
+ }
+
+ rlwit_discard_first_words(&rlw_i, literals);
+ rlwit_discard_first_words(&rlw_j, literals);
+ }
+ }
+
+ if (rlwit_word_size(&rlw_i) > 0)
+ rlwit_discharge_empty(&rlw_i, out);
+ else
+ rlwit_discharge_empty(&rlw_j, out);
+
+ out->bit_size = max_size(ewah_i->bit_size, ewah_j->bit_size);
+}
+
+void ewah_and_not(
+ struct ewah_bitmap *ewah_i,
+ struct ewah_bitmap *ewah_j,
+ struct ewah_bitmap *out)
+{
+ struct rlw_iterator rlw_i;
+ struct rlw_iterator rlw_j;
+ size_t literals;
+
+ rlwit_init(&rlw_i, ewah_i);
+ rlwit_init(&rlw_j, ewah_j);
+
+ while (rlwit_word_size(&rlw_i) > 0 && rlwit_word_size(&rlw_j) > 0) {
+ while (rlw_i.rlw.running_len > 0 || rlw_j.rlw.running_len > 0) {
+ struct rlw_iterator *prey, *predator;
+
+ if (rlw_i.rlw.running_len < rlw_j.rlw.running_len) {
+ prey = &rlw_i;
+ predator = &rlw_j;
+ } else {
+ prey = &rlw_j;
+ predator = &rlw_i;
+ }
+
+ if ((predator->rlw.running_bit && prey == &rlw_i) ||
+ (!predator->rlw.running_bit && prey != &rlw_i)) {
+ ewah_add_empty_words(out, 0,
+ predator->rlw.running_len);
+ rlwit_discard_first_words(prey,
+ predator->rlw.running_len);
+ rlwit_discard_first_words(predator,
+ predator->rlw.running_len);
+ } else {
+ size_t index;
+ int negate_words;
+
+ negate_words = (&rlw_i != prey);
+ index = rlwit_discharge(prey, out,
+ predator->rlw.running_len, negate_words);
+ ewah_add_empty_words(out, negate_words,
+ predator->rlw.running_len - index);
+ rlwit_discard_first_words(predator,
+ predator->rlw.running_len);
+ }
+ }
+
+ literals = min_size(
+ rlw_i.rlw.literal_words,
+ rlw_j.rlw.literal_words);
+
+ if (literals) {
+ size_t k;
+
+ for (k = 0; k < literals; ++k) {
+ ewah_add(out,
+ rlw_i.buffer[rlw_i.literal_word_start + k] &
+ ~(rlw_j.buffer[rlw_j.literal_word_start + k])
+ );
+ }
+
+ rlwit_discard_first_words(&rlw_i, literals);
+ rlwit_discard_first_words(&rlw_j, literals);
+ }
+ }
+
+ if (rlwit_word_size(&rlw_i) > 0)
+ rlwit_discharge(&rlw_i, out, ~0, 0);
+ else
+ rlwit_discharge_empty(&rlw_j, out);
+
+ out->bit_size = max_size(ewah_i->bit_size, ewah_j->bit_size);
+}
+
+void ewah_or(
+ struct ewah_bitmap *ewah_i,
+ struct ewah_bitmap *ewah_j,
+ struct ewah_bitmap *out)
+{
+ struct rlw_iterator rlw_i;
+ struct rlw_iterator rlw_j;
+ size_t literals;
+
+ rlwit_init(&rlw_i, ewah_i);
+ rlwit_init(&rlw_j, ewah_j);
+
+ while (rlwit_word_size(&rlw_i) > 0 && rlwit_word_size(&rlw_j) > 0) {
+ while (rlw_i.rlw.running_len > 0 || rlw_j.rlw.running_len > 0) {
+ struct rlw_iterator *prey, *predator;
+
+ if (rlw_i.rlw.running_len < rlw_j.rlw.running_len) {
+ prey = &rlw_i;
+ predator = &rlw_j;
+ } else {
+ prey = &rlw_j;
+ predator = &rlw_i;
+ }
+
+ if (predator->rlw.running_bit) {
+ ewah_add_empty_words(out, 0,
+ predator->rlw.running_len);
+ rlwit_discard_first_words(prey,
+ predator->rlw.running_len);
+ rlwit_discard_first_words(predator,
+ predator->rlw.running_len);
+ } else {
+ size_t index = rlwit_discharge(prey, out,
+ predator->rlw.running_len, 0);
+ ewah_add_empty_words(out, 0,
+ predator->rlw.running_len - index);
+ rlwit_discard_first_words(predator,
+ predator->rlw.running_len);
+ }
+ }
+
+ literals = min_size(
+ rlw_i.rlw.literal_words,
+ rlw_j.rlw.literal_words);
+
+ if (literals) {
+ size_t k;
+
+ for (k = 0; k < literals; ++k) {
+ ewah_add(out,
+ rlw_i.buffer[rlw_i.literal_word_start + k] |
+ rlw_j.buffer[rlw_j.literal_word_start + k]
+ );
+ }
+
+ rlwit_discard_first_words(&rlw_i, literals);
+ rlwit_discard_first_words(&rlw_j, literals);
+ }
+ }
+
+ if (rlwit_word_size(&rlw_i) > 0)
+ rlwit_discharge(&rlw_i, out, ~0, 0);
+ else
+ rlwit_discharge(&rlw_j, out, ~0, 0);
+
+ out->bit_size = max_size(ewah_i->bit_size, ewah_j->bit_size);
+}
+
+
+#define BITMAP_POOL_MAX 16
+static struct ewah_bitmap *bitmap_pool[BITMAP_POOL_MAX];
+static size_t bitmap_pool_size;
+
+struct ewah_bitmap *ewah_pool_new(void)
+{
+ if (bitmap_pool_size)
+ return bitmap_pool[--bitmap_pool_size];
+
+ return ewah_new();
+}
+
+void ewah_pool_free(struct ewah_bitmap *self)
+{
+ if (self == NULL)
+ return;
+
+ if (bitmap_pool_size == BITMAP_POOL_MAX ||
+ self->alloc_size == 0) {
+ ewah_free(self);
+ return;
+ }
+
+ ewah_clear(self);
+ bitmap_pool[bitmap_pool_size++] = self;
+}
+
+uint32_t ewah_checksum(struct ewah_bitmap *self)
+{
+ const uint8_t *p = (uint8_t *)self->buffer;
+ uint32_t crc = (uint32_t)self->bit_size;
+ size_t size = self->buffer_size * sizeof(eword_t);
+
+ while (size--)
+ crc = (crc << 5) - crc + (uint32_t)*p++;
+
+ return crc;
+}
diff --git a/ewah/ewah_io.c b/ewah/ewah_io.c
new file mode 100644
index 0000000000..f7f700ef51
--- /dev/null
+++ b/ewah/ewah_io.c
@@ -0,0 +1,204 @@
+/**
+ * Copyright 2013, GitHub, Inc
+ * Copyright 2009-2013, Daniel Lemire, Cliff Moon,
+ * David McIntosh, Robert Becho, Google Inc. and Veronika Zenz
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#include "git-compat-util.h"
+#include "ewok.h"
+
+int ewah_serialize_native(struct ewah_bitmap *self, int fd)
+{
+ uint32_t write32;
+ size_t to_write = self->buffer_size * 8;
+
+ /* 32 bit -- bit size for the map */
+ write32 = (uint32_t)self->bit_size;
+ if (write(fd, &write32, 4) != 4)
+ return -1;
+
+ /** 32 bit -- number of compressed 64-bit words */
+ write32 = (uint32_t)self->buffer_size;
+ if (write(fd, &write32, 4) != 4)
+ return -1;
+
+ if (write(fd, self->buffer, to_write) != to_write)
+ return -1;
+
+ /** 32 bit -- position for the RLW */
+ write32 = self->rlw - self->buffer;
+ if (write(fd, &write32, 4) != 4)
+ return -1;
+
+ return (3 * 4) + to_write;
+}
+
+int ewah_serialize_to(struct ewah_bitmap *self,
+ int (*write_fun)(void *, const void *, size_t),
+ void *data)
+{
+ size_t i;
+ eword_t dump[2048];
+ const size_t words_per_dump = sizeof(dump) / sizeof(eword_t);
+ uint32_t bitsize, word_count, rlw_pos;
+
+ const eword_t *buffer;
+ size_t words_left;
+
+ /* 32 bit -- bit size for the map */
+ bitsize = htonl((uint32_t)self->bit_size);
+ if (write_fun(data, &bitsize, 4) != 4)
+ return -1;
+
+ /** 32 bit -- number of compressed 64-bit words */
+ word_count = htonl((uint32_t)self->buffer_size);
+ if (write_fun(data, &word_count, 4) != 4)
+ return -1;
+
+ /** 64 bit x N -- compressed words */
+ buffer = self->buffer;
+ words_left = self->buffer_size;
+
+ while (words_left >= words_per_dump) {
+ for (i = 0; i < words_per_dump; ++i, ++buffer)
+ dump[i] = htonll(*buffer);
+
+ if (write_fun(data, dump, sizeof(dump)) != sizeof(dump))
+ return -1;
+
+ words_left -= words_per_dump;
+ }
+
+ if (words_left) {
+ for (i = 0; i < words_left; ++i, ++buffer)
+ dump[i] = htonll(*buffer);
+
+ if (write_fun(data, dump, words_left * 8) != words_left * 8)
+ return -1;
+ }
+
+ /** 32 bit -- position for the RLW */
+ rlw_pos = (uint8_t*)self->rlw - (uint8_t *)self->buffer;
+ rlw_pos = htonl(rlw_pos / sizeof(eword_t));
+
+ if (write_fun(data, &rlw_pos, 4) != 4)
+ return -1;
+
+ return (3 * 4) + (self->buffer_size * 8);
+}
+
+static int write_helper(void *fd, const void *buf, size_t len)
+{
+ return write((intptr_t)fd, buf, len);
+}
+
+int ewah_serialize(struct ewah_bitmap *self, int fd)
+{
+ return ewah_serialize_to(self, write_helper, (void *)(intptr_t)fd);
+}
+
+int ewah_read_mmap(struct ewah_bitmap *self, void *map, size_t len)
+{
+ uint8_t *ptr = map;
+ size_t i;
+
+ self->bit_size = get_be32(ptr);
+ ptr += sizeof(uint32_t);
+
+ self->buffer_size = self->alloc_size = get_be32(ptr);
+ ptr += sizeof(uint32_t);
+
+ self->buffer = ewah_realloc(self->buffer,
+ self->alloc_size * sizeof(eword_t));
+
+ if (!self->buffer)
+ return -1;
+
+ /*
+ * Copy the raw data for the bitmap as a whole chunk;
+ * if we're in a little-endian platform, we'll perform
+ * the endianness conversion in a separate pass to ensure
+ * we're loading 8-byte aligned words.
+ */
+ memcpy(self->buffer, ptr, self->buffer_size * sizeof(uint64_t));
+ ptr += self->buffer_size * sizeof(uint64_t);
+
+ for (i = 0; i < self->buffer_size; ++i)
+ self->buffer[i] = ntohll(self->buffer[i]);
+
+ self->rlw = self->buffer + get_be32(ptr);
+
+ return (3 * 4) + (self->buffer_size * 8);
+}
+
+int ewah_deserialize(struct ewah_bitmap *self, int fd)
+{
+ size_t i;
+ eword_t dump[2048];
+ const size_t words_per_dump = sizeof(dump) / sizeof(eword_t);
+ uint32_t bitsize, word_count, rlw_pos;
+
+ eword_t *buffer = NULL;
+ size_t words_left;
+
+ ewah_clear(self);
+
+ /* 32 bit -- bit size for the map */
+ if (read(fd, &bitsize, 4) != 4)
+ return -1;
+
+ self->bit_size = (size_t)ntohl(bitsize);
+
+ /** 32 bit -- number of compressed 64-bit words */
+ if (read(fd, &word_count, 4) != 4)
+ return -1;
+
+ self->buffer_size = self->alloc_size = (size_t)ntohl(word_count);
+ self->buffer = ewah_realloc(self->buffer,
+ self->alloc_size * sizeof(eword_t));
+
+ if (!self->buffer)
+ return -1;
+
+ /** 64 bit x N -- compressed words */
+ buffer = self->buffer;
+ words_left = self->buffer_size;
+
+ while (words_left >= words_per_dump) {
+ if (read(fd, dump, sizeof(dump)) != sizeof(dump))
+ return -1;
+
+ for (i = 0; i < words_per_dump; ++i, ++buffer)
+ *buffer = ntohll(dump[i]);
+
+ words_left -= words_per_dump;
+ }
+
+ if (words_left) {
+ if (read(fd, dump, words_left * 8) != words_left * 8)
+ return -1;
+
+ for (i = 0; i < words_left; ++i, ++buffer)
+ *buffer = ntohll(dump[i]);
+ }
+
+ /** 32 bit -- position for the RLW */
+ if (read(fd, &rlw_pos, 4) != 4)
+ return -1;
+
+ self->rlw = self->buffer + ntohl(rlw_pos);
+ return 0;
+}
diff --git a/ewah/ewah_rlw.c b/ewah/ewah_rlw.c
new file mode 100644
index 0000000000..c723f1aefd
--- /dev/null
+++ b/ewah/ewah_rlw.c
@@ -0,0 +1,115 @@
+/**
+ * Copyright 2013, GitHub, Inc
+ * Copyright 2009-2013, Daniel Lemire, Cliff Moon,
+ * David McIntosh, Robert Becho, Google Inc. and Veronika Zenz
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#include "git-compat-util.h"
+#include "ewok.h"
+#include "ewok_rlw.h"
+
+static inline int next_word(struct rlw_iterator *it)
+{
+ if (it->pointer >= it->size)
+ return 0;
+
+ it->rlw.word = &it->buffer[it->pointer];
+ it->pointer += rlw_get_literal_words(it->rlw.word) + 1;
+
+ it->rlw.literal_words = rlw_get_literal_words(it->rlw.word);
+ it->rlw.running_len = rlw_get_running_len(it->rlw.word);
+ it->rlw.running_bit = rlw_get_run_bit(it->rlw.word);
+ it->rlw.literal_word_offset = 0;
+
+ return 1;
+}
+
+void rlwit_init(struct rlw_iterator *it, struct ewah_bitmap *from_ewah)
+{
+ it->buffer = from_ewah->buffer;
+ it->size = from_ewah->buffer_size;
+ it->pointer = 0;
+
+ next_word(it);
+
+ it->literal_word_start = rlwit_literal_words(it) +
+ it->rlw.literal_word_offset;
+}
+
+void rlwit_discard_first_words(struct rlw_iterator *it, size_t x)
+{
+ while (x > 0) {
+ size_t discard;
+
+ if (it->rlw.running_len > x) {
+ it->rlw.running_len -= x;
+ return;
+ }
+
+ x -= it->rlw.running_len;
+ it->rlw.running_len = 0;
+
+ discard = (x > it->rlw.literal_words) ? it->rlw.literal_words : x;
+
+ it->literal_word_start += discard;
+ it->rlw.literal_words -= discard;
+ x -= discard;
+
+ if (x > 0 || rlwit_word_size(it) == 0) {
+ if (!next_word(it))
+ break;
+
+ it->literal_word_start =
+ rlwit_literal_words(it) + it->rlw.literal_word_offset;
+ }
+ }
+}
+
+size_t rlwit_discharge(
+ struct rlw_iterator *it, struct ewah_bitmap *out, size_t max, int negate)
+{
+ size_t index = 0;
+
+ while (index < max && rlwit_word_size(it) > 0) {
+ size_t pd, pl = it->rlw.running_len;
+
+ if (index + pl > max)
+ pl = max - index;
+
+ ewah_add_empty_words(out, it->rlw.running_bit ^ negate, pl);
+ index += pl;
+
+ pd = it->rlw.literal_words;
+ if (pd + index > max)
+ pd = max - index;
+
+ ewah_add_dirty_words(out,
+ it->buffer + it->literal_word_start, pd, negate);
+
+ rlwit_discard_first_words(it, pd + pl);
+ index += pd;
+ }
+
+ return index;
+}
+
+void rlwit_discharge_empty(struct rlw_iterator *it, struct ewah_bitmap *out)
+{
+ while (rlwit_word_size(it) > 0) {
+ ewah_add_empty_words(out, 0, rlwit_word_size(it));
+ rlwit_discard_first_words(it, rlwit_word_size(it));
+ }
+}
diff --git a/ewah/ewok.h b/ewah/ewok.h
new file mode 100644
index 0000000000..43adeb5c68
--- /dev/null
+++ b/ewah/ewok.h
@@ -0,0 +1,233 @@
+/**
+ * Copyright 2013, GitHub, Inc
+ * Copyright 2009-2013, Daniel Lemire, Cliff Moon,
+ * David McIntosh, Robert Becho, Google Inc. and Veronika Zenz
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#ifndef __EWOK_BITMAP_H__
+#define __EWOK_BITMAP_H__
+
+#ifndef ewah_malloc
+# define ewah_malloc xmalloc
+#endif
+#ifndef ewah_realloc
+# define ewah_realloc xrealloc
+#endif
+#ifndef ewah_calloc
+# define ewah_calloc xcalloc
+#endif
+
+typedef uint64_t eword_t;
+#define BITS_IN_WORD (sizeof(eword_t) * 8)
+
+/**
+ * Do not use __builtin_popcountll. The GCC implementation
+ * is notoriously slow on all platforms.
+ *
+ * See: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36041
+ */
+static inline uint32_t ewah_bit_popcount64(uint64_t x)
+{
+ x = (x & 0x5555555555555555ULL) + ((x >> 1) & 0x5555555555555555ULL);
+ x = (x & 0x3333333333333333ULL) + ((x >> 2) & 0x3333333333333333ULL);
+ x = (x & 0x0F0F0F0F0F0F0F0FULL) + ((x >> 4) & 0x0F0F0F0F0F0F0F0FULL);
+ return (x * 0x0101010101010101ULL) >> 56;
+}
+
+#ifdef __GNUC__
+#define ewah_bit_ctz64(x) __builtin_ctzll(x)
+#else
+static inline int ewah_bit_ctz64(uint64_t x)
+{
+ int n = 0;
+ if ((x & 0xffffffff) == 0) { x >>= 32; n += 32; }
+ if ((x & 0xffff) == 0) { x >>= 16; n += 16; }
+ if ((x & 0xff) == 0) { x >>= 8; n += 8; }
+ if ((x & 0xf) == 0) { x >>= 4; n += 4; }
+ if ((x & 0x3) == 0) { x >>= 2; n += 2; }
+ if ((x & 0x1) == 0) { x >>= 1; n += 1; }
+ return n + !x;
+}
+#endif
+
+struct ewah_bitmap {
+ eword_t *buffer;
+ size_t buffer_size;
+ size_t alloc_size;
+ size_t bit_size;
+ eword_t *rlw;
+};
+
+typedef void (*ewah_callback)(size_t pos, void *);
+
+struct ewah_bitmap *ewah_pool_new(void);
+void ewah_pool_free(struct ewah_bitmap *self);
+
+/**
+ * Allocate a new EWAH Compressed bitmap
+ */
+struct ewah_bitmap *ewah_new(void);
+
+/**
+ * Clear all the bits in the bitmap. Does not free or resize
+ * memory.
+ */
+void ewah_clear(struct ewah_bitmap *self);
+
+/**
+ * Free all the memory of the bitmap
+ */
+void ewah_free(struct ewah_bitmap *self);
+
+int ewah_serialize_to(struct ewah_bitmap *self,
+ int (*write_fun)(void *out, const void *buf, size_t len),
+ void *out);
+int ewah_serialize(struct ewah_bitmap *self, int fd);
+int ewah_serialize_native(struct ewah_bitmap *self, int fd);
+
+int ewah_deserialize(struct ewah_bitmap *self, int fd);
+int ewah_read_mmap(struct ewah_bitmap *self, void *map, size_t len);
+int ewah_read_mmap_native(struct ewah_bitmap *self, void *map, size_t len);
+
+uint32_t ewah_checksum(struct ewah_bitmap *self);
+
+/**
+ * Logical not (bitwise negation) in-place on the bitmap
+ *
+ * This operation is linear time based on the size of the bitmap.
+ */
+void ewah_not(struct ewah_bitmap *self);
+
+/**
+ * Call the given callback with the position of every single bit
+ * that has been set on the bitmap.
+ *
+ * This is an efficient operation that does not fully decompress
+ * the bitmap.
+ */
+void ewah_each_bit(struct ewah_bitmap *self, ewah_callback callback, void *payload);
+
+/**
+ * Set a given bit on the bitmap.
+ *
+ * The bit at position `pos` will be set to true. Because of the
+ * way that the bitmap is compressed, a set bit cannot be unset
+ * later on.
+ *
+ * Furthermore, since the bitmap uses streaming compression, bits
+ * can only set incrementally.
+ *
+ * E.g.
+ * ewah_set(bitmap, 1); // ok
+ * ewah_set(bitmap, 76); // ok
+ * ewah_set(bitmap, 77); // ok
+ * ewah_set(bitmap, 8712800127); // ok
+ * ewah_set(bitmap, 25); // failed, assert raised
+ */
+void ewah_set(struct ewah_bitmap *self, size_t i);
+
+struct ewah_iterator {
+ const eword_t *buffer;
+ size_t buffer_size;
+
+ size_t pointer;
+ eword_t compressed, literals;
+ eword_t rl, lw;
+ int b;
+};
+
+/**
+ * Initialize a new iterator to run through the bitmap in uncompressed form.
+ *
+ * The iterator can be stack allocated. The underlying bitmap must not be freed
+ * before the iteration is over.
+ *
+ * E.g.
+ *
+ * struct ewah_bitmap *bitmap = ewah_new();
+ * struct ewah_iterator it;
+ *
+ * ewah_iterator_init(&it, bitmap);
+ */
+void ewah_iterator_init(struct ewah_iterator *it, struct ewah_bitmap *parent);
+
+/**
+ * Yield every single word in the bitmap in uncompressed form. This is:
+ * yield single words (32-64 bits) where each bit represents an actual
+ * bit from the bitmap.
+ *
+ * Return: true if a word was yield, false if there are no words left
+ */
+int ewah_iterator_next(eword_t *next, struct ewah_iterator *it);
+
+void ewah_or(
+ struct ewah_bitmap *ewah_i,
+ struct ewah_bitmap *ewah_j,
+ struct ewah_bitmap *out);
+
+void ewah_and_not(
+ struct ewah_bitmap *ewah_i,
+ struct ewah_bitmap *ewah_j,
+ struct ewah_bitmap *out);
+
+void ewah_xor(
+ struct ewah_bitmap *ewah_i,
+ struct ewah_bitmap *ewah_j,
+ struct ewah_bitmap *out);
+
+void ewah_and(
+ struct ewah_bitmap *ewah_i,
+ struct ewah_bitmap *ewah_j,
+ struct ewah_bitmap *out);
+
+/**
+ * Direct word access
+ */
+size_t ewah_add_empty_words(struct ewah_bitmap *self, int v, size_t number);
+void ewah_add_dirty_words(
+ struct ewah_bitmap *self, const eword_t *buffer, size_t number, int negate);
+size_t ewah_add(struct ewah_bitmap *self, eword_t word);
+
+
+/**
+ * Uncompressed, old-school bitmap that can be efficiently compressed
+ * into an `ewah_bitmap`.
+ */
+struct bitmap {
+ eword_t *words;
+ size_t word_alloc;
+};
+
+struct bitmap *bitmap_new(void);
+void bitmap_set(struct bitmap *self, size_t pos);
+void bitmap_clear(struct bitmap *self, size_t pos);
+int bitmap_get(struct bitmap *self, size_t pos);
+void bitmap_reset(struct bitmap *self);
+void bitmap_free(struct bitmap *self);
+int bitmap_equals(struct bitmap *self, struct bitmap *other);
+int bitmap_is_subset(struct bitmap *self, struct bitmap *super);
+
+struct ewah_bitmap * bitmap_to_ewah(struct bitmap *bitmap);
+struct bitmap *ewah_to_bitmap(struct ewah_bitmap *ewah);
+
+void bitmap_and_not(struct bitmap *self, struct bitmap *other);
+void bitmap_or_ewah(struct bitmap *self, struct ewah_bitmap *other);
+void bitmap_or(struct bitmap *self, const struct bitmap *other);
+
+void bitmap_each_bit(struct bitmap *self, ewah_callback callback, void *data);
+size_t bitmap_popcount(struct bitmap *self);
+
+#endif
diff --git a/ewah/ewok_rlw.h b/ewah/ewok_rlw.h
new file mode 100644
index 0000000000..63efdf9698
--- /dev/null
+++ b/ewah/ewok_rlw.h
@@ -0,0 +1,114 @@
+/**
+ * Copyright 2013, GitHub, Inc
+ * Copyright 2009-2013, Daniel Lemire, Cliff Moon,
+ * David McIntosh, Robert Becho, Google Inc. and Veronika Zenz
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#ifndef __EWOK_RLW_H__
+#define __EWOK_RLW_H__
+
+#define RLW_RUNNING_BITS (sizeof(eword_t) * 4)
+#define RLW_LITERAL_BITS (sizeof(eword_t) * 8 - 1 - RLW_RUNNING_BITS)
+
+#define RLW_LARGEST_RUNNING_COUNT (((eword_t)1 << RLW_RUNNING_BITS) - 1)
+#define RLW_LARGEST_LITERAL_COUNT (((eword_t)1 << RLW_LITERAL_BITS) - 1)
+
+#define RLW_LARGEST_RUNNING_COUNT_SHIFT (RLW_LARGEST_RUNNING_COUNT << 1)
+
+#define RLW_RUNNING_LEN_PLUS_BIT (((eword_t)1 << (RLW_RUNNING_BITS + 1)) - 1)
+
+static int rlw_get_run_bit(const eword_t *word)
+{
+ return *word & (eword_t)1;
+}
+
+static inline void rlw_set_run_bit(eword_t *word, int b)
+{
+ if (b) {
+ *word |= (eword_t)1;
+ } else {
+ *word &= (eword_t)(~1);
+ }
+}
+
+static inline void rlw_xor_run_bit(eword_t *word)
+{
+ if (*word & 1) {
+ *word &= (eword_t)(~1);
+ } else {
+ *word |= (eword_t)1;
+ }
+}
+
+static inline void rlw_set_running_len(eword_t *word, eword_t l)
+{
+ *word |= RLW_LARGEST_RUNNING_COUNT_SHIFT;
+ *word &= (l << 1) | (~RLW_LARGEST_RUNNING_COUNT_SHIFT);
+}
+
+static inline eword_t rlw_get_running_len(const eword_t *word)
+{
+ return (*word >> 1) & RLW_LARGEST_RUNNING_COUNT;
+}
+
+static inline eword_t rlw_get_literal_words(const eword_t *word)
+{
+ return *word >> (1 + RLW_RUNNING_BITS);
+}
+
+static inline void rlw_set_literal_words(eword_t *word, eword_t l)
+{
+ *word |= ~RLW_RUNNING_LEN_PLUS_BIT;
+ *word &= (l << (RLW_RUNNING_BITS + 1)) | RLW_RUNNING_LEN_PLUS_BIT;
+}
+
+static inline eword_t rlw_size(const eword_t *self)
+{
+ return rlw_get_running_len(self) + rlw_get_literal_words(self);
+}
+
+struct rlw_iterator {
+ const eword_t *buffer;
+ size_t size;
+ size_t pointer;
+ size_t literal_word_start;
+
+ struct {
+ const eword_t *word;
+ int literal_words;
+ int running_len;
+ int literal_word_offset;
+ int running_bit;
+ } rlw;
+};
+
+void rlwit_init(struct rlw_iterator *it, struct ewah_bitmap *bitmap);
+void rlwit_discard_first_words(struct rlw_iterator *it, size_t x);
+size_t rlwit_discharge(
+ struct rlw_iterator *it, struct ewah_bitmap *out, size_t max, int negate);
+void rlwit_discharge_empty(struct rlw_iterator *it, struct ewah_bitmap *out);
+
+static inline size_t rlwit_word_size(struct rlw_iterator *it)
+{
+ return it->rlw.running_len + it->rlw.literal_words;
+}
+
+static inline size_t rlwit_literal_words(struct rlw_iterator *it)
+{
+ return it->pointer - it->rlw.literal_words;
+}
+
+#endif
diff --git a/fast-import.c b/fast-import.c
index 4fd18a3574..fb4738d373 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -1485,14 +1485,11 @@ static int tree_content_set(
unsigned int i, n;
struct tree_entry *e;
- slash1 = strchr(p, '/');
- if (slash1)
- n = slash1 - p;
- else
- n = strlen(p);
+ slash1 = strchrnul(p, '/');
+ n = slash1 - p;
if (!n)
die("Empty path component found in input");
- if (!slash1 && !S_ISDIR(mode) && subtree)
+ if (!*slash1 && !S_ISDIR(mode) && subtree)
die("Non-directories cannot have subtrees");
if (!root->tree)
@@ -1501,7 +1498,7 @@ static int tree_content_set(
for (i = 0; i < t->entry_count; i++) {
e = t->entries[i];
if (e->name->str_len == n && !strncmp_icase(p, e->name->str_dat, n)) {
- if (!slash1) {
+ if (!*slash1) {
if (!S_ISDIR(mode)
&& e->versions[1].mode == mode
&& !hashcmp(e->versions[1].sha1, sha1))
@@ -1552,7 +1549,7 @@ static int tree_content_set(
e->versions[0].mode = 0;
hashclr(e->versions[0].sha1);
t->entries[t->entry_count++] = e;
- if (slash1) {
+ if (*slash1) {
e->tree = new_tree_content(8);
e->versions[1].mode = S_IFDIR;
tree_content_set(e, slash1 + 1, sha1, mode, subtree);
@@ -1576,11 +1573,8 @@ static int tree_content_remove(
unsigned int i, n;
struct tree_entry *e;
- slash1 = strchr(p, '/');
- if (slash1)
- n = slash1 - p;
- else
- n = strlen(p);
+ slash1 = strchrnul(p, '/');
+ n = slash1 - p;
if (!root->tree)
load_tree(root);
@@ -1594,7 +1588,7 @@ static int tree_content_remove(
for (i = 0; i < t->entry_count; i++) {
e = t->entries[i];
if (e->name->str_len == n && !strncmp_icase(p, e->name->str_dat, n)) {
- if (slash1 && !S_ISDIR(e->versions[1].mode))
+ if (*slash1 && !S_ISDIR(e->versions[1].mode))
/*
* If p names a file in some subdirectory, and a
* file or symlink matching the name of the
@@ -1602,7 +1596,7 @@ static int tree_content_remove(
* exist and need not be deleted.
*/
return 1;
- if (!slash1 || !S_ISDIR(e->versions[1].mode))
+ if (!*slash1 || !S_ISDIR(e->versions[1].mode))
goto del_entry;
if (!e->tree)
load_tree(e);
@@ -1644,11 +1638,8 @@ static int tree_content_get(
unsigned int i, n;
struct tree_entry *e;
- slash1 = strchr(p, '/');
- if (slash1)
- n = slash1 - p;
- else
- n = strlen(p);
+ slash1 = strchrnul(p, '/');
+ n = slash1 - p;
if (!n && !allow_root)
die("Empty path component found in input");
@@ -1664,7 +1655,7 @@ static int tree_content_get(
for (i = 0; i < t->entry_count; i++) {
e = t->entries[i];
if (e->name->str_len == n && !strncmp_icase(p, e->name->str_dat, n)) {
- if (!slash1)
+ if (!*slash1)
goto found_entry;
if (!S_ISDIR(e->versions[1].mode))
return 0;
diff --git a/fetch-pack.c b/fetch-pack.c
index 90d47da8a9..eeee2bb7e0 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -26,6 +26,7 @@ static int agent_supported;
static struct lock_file shallow_lock;
static const char *alternate_shallow_file;
+/* Remember to update object flag allocation in object.h */
#define COMPLETE (1U << 0)
#define COMMON (1U << 1)
#define COMMON_REF (1U << 2)
diff --git a/fsck.c b/fsck.c
index ee7f531e36..5e6723d410 100644
--- a/fsck.c
+++ b/fsck.c
@@ -166,19 +166,14 @@ static int fsck_tree(struct tree *item, int strict, fsck_error error_func)
sha1 = tree_entry_extract(&desc, &name, &mode);
- if (is_null_sha1(sha1))
- has_null_sha1 = 1;
- if (strchr(name, '/'))
- has_full_path = 1;
- if (!*name)
- has_empty_name = 1;
- if (!strcmp(name, "."))
- has_dot = 1;
- if (!strcmp(name, ".."))
- has_dotdot = 1;
- if (!strcasecmp(name, ".git") || is_hfs_dotgit(name) ||
- is_ntfs_dotgit(name))
- has_dotgit = 1;
+ has_null_sha1 |= is_null_sha1(sha1);
+ has_full_path |= !!strchr(name, '/');
+ has_empty_name |= !*name;
+ has_dot |= !strcmp(name, ".");
+ has_dotdot |= !strcmp(name, "..");
+ has_dotgit |= (!strcmp(name, ".git") ||
+ is_hfs_dotgit(name) ||
+ is_ntfs_dotgit(name));
has_zero_pad |= *(char *)desc.buffer == '0';
update_tree_entry(&desc);
@@ -245,7 +240,7 @@ static int fsck_tree(struct tree *item, int strict, fsck_error error_func)
return retval;
}
-static int fsck_ident(char **ident, struct object *obj, fsck_error error_func)
+static int fsck_ident(const char **ident, struct object *obj, fsck_error error_func)
{
char *end;
@@ -284,23 +279,26 @@ static int fsck_ident(char **ident, struct object *obj, fsck_error error_func)
return 0;
}
-static int fsck_commit(struct commit *commit, fsck_error error_func)
+static int fsck_commit_buffer(struct commit *commit, const char *buffer,
+ fsck_error error_func)
{
- char *buffer = commit->buffer;
+ const char *tmp;
unsigned char tree_sha1[20], sha1[20];
struct commit_graft *graft;
int parents = 0;
int err;
- if (memcmp(buffer, "tree ", 5))
+ buffer = skip_prefix(buffer, "tree ");
+ if (!buffer)
return error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'tree' line");
- if (get_sha1_hex(buffer+5, tree_sha1) || buffer[45] != '\n')
+ if (get_sha1_hex(buffer, tree_sha1) || buffer[40] != '\n')
return error_func(&commit->object, FSCK_ERROR, "invalid 'tree' line format - bad sha1");
- buffer += 46;
- while (!memcmp(buffer, "parent ", 7)) {
- if (get_sha1_hex(buffer+7, sha1) || buffer[47] != '\n')
+ buffer += 41;
+ while ((tmp = skip_prefix(buffer, "parent "))) {
+ buffer = tmp;
+ if (get_sha1_hex(buffer, sha1) || buffer[40] != '\n')
return error_func(&commit->object, FSCK_ERROR, "invalid 'parent' line format - bad sha1");
- buffer += 48;
+ buffer += 41;
parents++;
}
graft = lookup_commit_graft(commit->object.sha1);
@@ -324,15 +322,15 @@ static int fsck_commit(struct commit *commit, fsck_error error_func)
if (p || parents)
return error_func(&commit->object, FSCK_ERROR, "parent objects missing");
}
- if (memcmp(buffer, "author ", 7))
+ buffer = skip_prefix(buffer, "author ");
+ if (!buffer)
return error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'author' line");
- buffer += 7;
err = fsck_ident(&buffer, &commit->object, error_func);
if (err)
return err;
- if (memcmp(buffer, "committer ", strlen("committer ")))
+ buffer = skip_prefix(buffer, "committer ");
+ if (!buffer)
return error_func(&commit->object, FSCK_ERROR, "invalid format - expected 'committer' line");
- buffer += strlen("committer ");
err = fsck_ident(&buffer, &commit->object, error_func);
if (err)
return err;
@@ -342,6 +340,14 @@ static int fsck_commit(struct commit *commit, fsck_error error_func)
return 0;
}
+static int fsck_commit(struct commit *commit, fsck_error error_func)
+{
+ const char *buffer = get_commit_buffer(commit, NULL);
+ int ret = fsck_commit_buffer(commit, buffer, error_func);
+ unuse_commit_buffer(commit, buffer);
+ return ret;
+}
+
static int fsck_tag(struct tag *tag, fsck_error error_func)
{
struct object *tagged = tag->tagged;
diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index 32c2f9cf88..1fadd69f88 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -58,6 +58,9 @@ if ($repo->config_bool("interactive.singlekey")) {
Term::ReadKey->import;
$use_readkey = 1;
};
+ if (!$use_readkey) {
+ print STDERR "missing Term::ReadKey, disabling interactive.singlekey\n";
+ }
eval {
require Term::Cap;
my $termcap = Term::Cap->Tgetent;
diff --git a/git-am.sh b/git-am.sh
index e92e5bb121..ee61a77d71 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
@@ -123,7 +125,7 @@ cannot_fallback () {
}
fall_back_3way () {
- O_OBJECT=`cd "$GIT_OBJECT_DIRECTORY" && pwd`
+ O_OBJECT=$(cd "$GIT_OBJECT_DIRECTORY" && pwd)
rm -fr "$dotest"/patch-merge-*
mkdir "$dotest/patch-merge-tmp-dir"
@@ -273,7 +275,7 @@ split_patches () {
then
clean_abort "$(gettext "Only one StGIT patch series can be applied at once")"
fi
- series_dir=`dirname "$1"`
+ series_dir=$(dirname "$1")
series_file="$1"
shift
{
@@ -296,8 +298,8 @@ split_patches () {
this=0
for stgit in "$@"
do
- this=`expr "$this" + 1`
- msgnum=`printf "%0${prec}d" $this`
+ this=$(expr "$this" + 1)
+ msgnum=$(printf "%0${prec}d" $this)
# Perl version of StGIT parse_patch. The first nonemptyline
# not starting with Author, From or Date is the
# subject, and the body starts with the next nonempty
@@ -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 ;;
*)
@@ -637,26 +644,26 @@ fi
git_apply_opt=$(cat "$dotest/apply-opt")
if test "$(cat "$dotest/sign")" = t
then
- SIGNOFF=`git var GIT_COMMITTER_IDENT | sed -e '
+ SIGNOFF=$(git var GIT_COMMITTER_IDENT | sed -e '
s/>.*/>/
s/^/Signed-off-by: /'
- `
+ )
else
SIGNOFF=
fi
-last=`cat "$dotest/last"`
-this=`cat "$dotest/next"`
+last=$(cat "$dotest/last")
+this=$(cat "$dotest/next")
if test "$skip" = t
then
- this=`expr "$this" + 1`
+ this=$(expr "$this" + 1)
resume=
fi
while test "$this" -le "$last"
do
- msgnum=`printf "%0${prec}d" $this`
- next=`expr "$this" + 1`
+ msgnum=$(printf "%0${prec}d" $this)
+ next=$(expr "$this" + 1)
test -f "$dotest/$msgnum" || {
resume=
go_next
@@ -732,16 +739,16 @@ To restore the original branch and stop patching run \"\$cmdline --abort\"."
'')
if test '' != "$SIGNOFF"
then
- LAST_SIGNED_OFF_BY=`
+ LAST_SIGNED_OFF_BY=$(
sed -ne '/^Signed-off-by: /p' \
"$dotest/msg-clean" |
sed -ne '$p'
- `
- ADD_SIGNOFF=`
+ )
+ ADD_SIGNOFF=$(
test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" || {
test '' = "$LAST_SIGNED_OFF_BY" && echo
echo "$SIGNOFF"
- }`
+ })
else
ADD_SIGNOFF=
fi
@@ -899,7 +906,8 @@ did you forget to use 'git add'?"
GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
export GIT_COMMITTER_DATE
fi &&
- git commit-tree $tree ${parent:+-p} $parent <"$dotest/final-commit"
+ git commit-tree ${parent:+-p} $parent ${gpg_sign_opt:+"$gpg_sign_opt"} $tree \
+ <"$dotest/final-commit"
) &&
git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent ||
stop_here $this
diff --git a/git-bisect.sh b/git-bisect.sh
index 73b4c14d4f..af4d04c3be 100755
--- a/git-bisect.sh
+++ b/git-bisect.sh
@@ -365,7 +365,7 @@ bisect_reset() {
}
case "$#" in
0) branch=$(cat "$GIT_DIR/BISECT_START") ;;
- 1) git rev-parse --quiet --verify "$1^{commit}" > /dev/null || {
+ 1) git rev-parse --quiet --verify "$1^{commit}" >/dev/null || {
invalid="$1"
die "$(eval_gettext "'\$invalid' is not a valid commit")"
}
@@ -458,13 +458,13 @@ exit code \$res from '\$command' is < 0 or >= 128" >&2
fi
# We have to use a subshell because "bisect_state" can exit.
- ( bisect_state $state > "$GIT_DIR/BISECT_RUN" )
+ ( bisect_state $state >"$GIT_DIR/BISECT_RUN" )
res=$?
cat "$GIT_DIR/BISECT_RUN"
if sane_grep "first bad commit could be any of" "$GIT_DIR/BISECT_RUN" \
- > /dev/null
+ >/dev/null
then
gettextln "bisect run cannot continue any more" >&2
exit $res
@@ -477,7 +477,7 @@ exit code \$res from '\$command' is < 0 or >= 128" >&2
exit $res
fi
- if sane_grep "is the first bad commit" "$GIT_DIR/BISECT_RUN" > /dev/null
+ if sane_grep "is the first bad commit" "$GIT_DIR/BISECT_RUN" >/dev/null
then
gettextln "bisect run success"
exit 0;
diff --git a/git-compat-util.h b/git-compat-util.h
index d493a8c67a..e6a4159a25 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -116,9 +116,6 @@
#include <sys/time.h>
#include <time.h>
#include <signal.h>
-#ifndef USE_WILDMATCH
-#include <fnmatch.h>
-#endif
#include <assert.h>
#include <regex.h>
#include <utime.h>
@@ -304,16 +301,7 @@ extern char *gitbasename(char *);
#include "compat/bswap.h"
-#ifdef USE_WILDMATCH
#include "wildmatch.h"
-#define FNM_PATHNAME WM_PATHNAME
-#define FNM_CASEFOLD WM_CASEFOLD
-#define FNM_NOMATCH WM_NOMATCH
-static inline int fnmatch(const char *pattern, const char *string, int flags)
-{
- return wildmatch(pattern, string, flags, NULL);
-}
-#endif
/* General helper functions */
extern void vreportf(const char *prefix, const char *err, va_list params);
@@ -351,14 +339,15 @@ extern void set_error_routine(void (*routine)(const char *err, va_list params));
extern void set_die_is_recursing_routine(int (*routine)(void));
extern int starts_with(const char *str, const char *prefix);
-extern int prefixcmp(const char *str, const char *prefix);
extern int ends_with(const char *str, const char *suffix);
-extern int suffixcmp(const char *str, const char *suffix);
static inline const char *skip_prefix(const char *str, const char *prefix)
{
- size_t len = strlen(prefix);
- return strncmp(str, prefix, len) ? NULL : str + len;
+ do {
+ if (!*prefix)
+ return str;
+ } while (*str++ == *prefix++);
+ return NULL;
}
#if defined(NO_MMAP) || defined(USE_WIN32_MMAP)
@@ -480,9 +469,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);
@@ -536,12 +531,13 @@ extern void *xcalloc(size_t nmemb, size_t size);
extern void *xmmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
extern ssize_t xread(int fd, void *buf, size_t len);
extern ssize_t xwrite(int fd, const void *buf, size_t len);
+extern ssize_t xpread(int fd, void *buf, size_t len, off_t offset);
extern int xdup(int fd);
extern FILE *xfdopen(int fd, const char *mode);
extern int xmkstemp(char *template);
extern int xmkstemp_mode(char *template, int mode);
extern int odb_mkstemp(char *template, size_t limit, const char *pattern);
-extern int odb_pack_keep(char *name, size_t namesz, unsigned char *sha1);
+extern int odb_pack_keep(char *name, size_t namesz, const unsigned char *sha1);
static inline size_t xsize_t(off_t len)
{
diff --git a/git-filter-branch.sh b/git-filter-branch.sh
index 86d6994619..e6e99f5bb5 100755
--- a/git-filter-branch.sh
+++ b/git-filter-branch.sh
@@ -332,7 +332,13 @@ while read commit parents; do
parentstr=
for parent in $parents; do
for reparent in $(map "$parent"); do
- parentstr="$parentstr -p $reparent"
+ case "$parentstr " in
+ *" -p $reparent "*)
+ ;;
+ *)
+ parentstr="$parentstr -p $reparent"
+ ;;
+ esac
done
done
if [ "$filter_parent" ]; then
diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh
index cf2209b4f2..6a8907e7b3 100755
--- a/git-gui/git-gui.sh
+++ b/git-gui/git-gui.sh
@@ -1283,7 +1283,7 @@ load_config 0
apply_config
# v1.7.0 introduced --show-toplevel to return the canonical work-tree
-if {[package vsatisfies $_git_version 1.7.0]} {
+if {[package vsatisfies $_git_version 1.7.0-]} {
if { [is_Cygwin] } {
catch {set _gitworktree [exec cygpath --windows [git rev-parse --show-toplevel]]}
} else {
@@ -1539,7 +1539,7 @@ proc rescan_stage2 {fd after} {
close $fd
}
- if {[package vsatisfies $::_git_version 1.6.3]} {
+ if {[package vsatisfies $::_git_version 1.6.3-]} {
set ls_others [list --exclude-standard]
} else {
set ls_others [list --exclude-per-directory=.gitignore]
diff --git a/git-instaweb.sh b/git-instaweb.sh
index e93a238675..513efa662e 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)
--
@@ -344,7 +345,17 @@ PidFile "$fqgitdir/pid"
Listen $bind$port
EOF
- for mod in mime dir env log_config
+ for mod in mpm_event mpm_prefork mpm_worker
+ do
+ if test -e $module_path/mod_${mod}.so
+ then
+ echo "LoadModule ${mod}_module " \
+ "$module_path/mod_${mod}.so" >> "$conf"
+ # only one mpm module permitted
+ break
+ fi
+ done
+ for mod in mime dir env log_config authz_core
do
if test -e $module_path/mod_${mod}.so
then
diff --git a/git-p4.py b/git-p4.py
index 4ee673994b..773cafcd89 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -3086,7 +3086,7 @@ class P4Rebase(Command):
print "Rebasing the current branch onto %s" % upstream
oldHead = read_pipe("git rev-parse HEAD").strip()
system("git rebase %s" % upstream)
- system("git diff-tree --stat --summary -M %s HEAD" % oldHead)
+ system("git diff-tree --stat --summary -M %s HEAD --" % oldHead)
return True
class P4Clone(P4Sync):
diff --git a/git-pull.sh b/git-pull.sh
index 0a5aa2c821..7358fac864 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,19 @@ 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
+ ;;
+only)
+ ff_only=--ff-only
+ ;;
+esac
+
+
dry_run=
while :
do
@@ -138,6 +151,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 +327,13 @@ merge_name=$(git fmt-merge-msg $log_arg <"$GIT_DIR/FETCH_HEAD") || exit
case "$rebase" in
true)
eval="git-rebase $diffstat $strategy_args $merge_args $rebase_args $verbosity"
+ eval="$eval $gpg_sign_args"
eval="$eval --onto $merge_head ${oldremoteref:-$merge_head}"
;;
*)
eval="git-merge $diffstat $no_commit $verify_signatures $edit $squash $no_ff $ff_only"
- eval="$eval $log_arg $strategy_args $merge_args $verbosity $progress"
+ eval="$eval $log_arg $strategy_args $merge_args $verbosity $progress"
+ eval="$eval $gpg_sign_args"
eval="$eval \"\$merge_name\" HEAD $merge_head"
;;
esac
diff --git a/git-quiltimport.sh b/git-quiltimport.sh
index 8e17525dd8..167d79fea8 100755
--- a/git-quiltimport.sh
+++ b/git-quiltimport.sh
@@ -1,5 +1,6 @@
#!/bin/sh
OPTIONS_KEEPDASHDASH=
+OPTIONS_STUCKLONG=
OPTIONS_SPEC="\
git quiltimport [options]
--
diff --git a/git-rebase--am.sh b/git-rebase--am.sh
index 1cdc13944c..ca20e1e66f 100644
--- a/git-rebase--am.sh
+++ b/git-rebase--am.sh
@@ -17,7 +17,8 @@ git_rebase__am () {
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
;;
@@ -37,7 +38,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"
@@ -71,7 +72,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 9e1dd1eb5a..f267d8b6c3 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"
@@ -830,14 +840,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:
@@ -853,10 +864,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
@@ -1036,14 +1049,14 @@ fi
has_action "$todo" ||
- die_abort "Nothing to do"
+ return 2
cp "$todo" "$todo".backup
git_sequence_editor "$todo" ||
die_abort "Could not execute editor"
has_action "$todo" ||
- die_abort "Nothing to do"
+ return 2
expand_todo_ids
diff --git a/git-rebase--merge.sh b/git-rebase--merge.sh
index 838fbed6c9..66c64d7ef2 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: "
@@ -53,11 +53,12 @@ continue_merge () {
}
call_merge () {
- cmt="$(cat "$state_dir/cmt.$1")"
+ msgnum="$1"
+ echo "$msgnum" >"$state_dir/msgnum"
+ cmt="$(cat "$state_dir/cmt.$msgnum")"
echo "$cmt" > "$state_dir/current"
hd=$(git rev-parse --verify HEAD)
cmt_name=$(git symbolic-ref HEAD 2> /dev/null || echo HEAD)
- msgnum=$(cat "$state_dir/msgnum")
eval GITHEAD_$cmt='"${cmt_name##refs/heads/}~$(($end - $msgnum))"'
eval GITHEAD_$hd='$onto_name'
export GITHEAD_$cmt GITHEAD_$hd
diff --git a/git-rebase.sh b/git-rebase.sh
index 07e2bd48dc..47ca3b990b 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 () {
@@ -149,7 +155,7 @@ move_to_original_branch () {
esac
}
-finish_rebase () {
+apply_autostash () {
if test -f "$state_dir/autostash"
then
stash_sha1=$(cat "$state_dir/autostash")
@@ -165,6 +171,10 @@ You can run "git stash pop" or "git stash drop" at any time.
'
fi
fi
+}
+
+finish_rebase () {
+ apply_autostash &&
git gc --auto &&
rm -rf "$state_dir"
}
@@ -180,6 +190,11 @@ run_specific_rebase () {
if test $ret -eq 0
then
finish_rebase
+ elif test $ret -eq 2 # special exit status for rebase -i
+ then
+ apply_autostash &&
+ rm -rf "$state_dir" &&
+ die "Nothing to do"
fi
exit $ret
}
@@ -227,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
;;
@@ -259,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)
@@ -282,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
;;
@@ -309,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
@@ -440,6 +453,10 @@ then
test "$fork_point" = auto && fork_point=t
;;
*) upstream_name="$1"
+ if test "$upstream_name" = "-"
+ then
+ upstream_name="@{-1}"
+ fi
shift
;;
esac
diff --git a/git-remote-testgit.sh b/git-remote-testgit.sh
index 6d2f282d32..a9c75a2360 100755
--- a/git-remote-testgit.sh
+++ b/git-remote-testgit.sh
@@ -13,7 +13,10 @@ refspec="${GIT_REMOTE_TESTGIT_REFSPEC-$default_refspec}"
test -z "$refspec" && prefix="refs"
-export GIT_DIR="$url/.git"
+GIT_DIR="$url/.git"
+export GIT_DIR
+
+force=
mkdir -p "$dir"
@@ -39,6 +42,7 @@ do
fi
test -n "$GIT_REMOTE_TESTGIT_SIGNED_TAGS" && echo "signed-tags"
test -n "$GIT_REMOTE_TESTGIT_NO_PRIVATE_UPDATE" && echo "no-private-update"
+ echo 'option'
echo
;;
list)
@@ -93,6 +97,7 @@ do
before=$(git for-each-ref --format=' %(refname) %(objectname) ')
git fast-import \
+ ${force:+--force} \
${testgitmarks:+"--import-marks=$testgitmarks"} \
${testgitmarks:+"--export-marks=$testgitmarks"} \
--quiet
@@ -115,6 +120,20 @@ do
echo
;;
+ option\ *)
+ read cmd opt val <<-EOF
+ $line
+ EOF
+ case $opt in
+ force)
+ test $val = "true" && force="true" || force=
+ echo "ok"
+ ;;
+ *)
+ echo "unsupported"
+ ;;
+ esac
+ ;;
'')
exit
;;
diff --git a/git-request-pull.sh b/git-request-pull.sh
index fe21d5db63..d5500fde46 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
@@ -35,20 +36,7 @@ do
shift
done
-base=$1 url=$2 head=${3-HEAD} status=0 branch_name=
-
-headref=$(git symbolic-ref -q "$head")
-if git show-ref -q --verify "$headref"
-then
- branch_name=${headref#refs/heads/}
- if test "z$branch_name" = "z$headref" ||
- ! git config "branch.$branch_name.description" >/dev/null
- then
- branch_name=
- fi
-fi
-
-tag_name=$(git describe --exact "$head^0" 2>/dev/null)
+base=$1 url=$2 status=0
test -n "$base" && test -n "$url" || usage
@@ -58,55 +46,84 @@ then
die "fatal: Not a valid revision: $base"
fi
+#
+# $3 must be a symbolic ref, a unique ref, or
+# a SHA object expression. It can also be of
+# the format 'local-name:remote-name'.
+#
+local=${3%:*}
+local=${local:-HEAD}
+remote=${3#*:}
+pretty_remote=${remote#refs/}
+pretty_remote=${pretty_remote#heads/}
+head=$(git symbolic-ref -q "$local")
+head=${head:-$(git show-ref --heads --tags "$local" | cut -d' ' -f2)}
+head=${head:-$(git rev-parse --quiet --verify "$local")}
+
+# None of the above? Bad.
+test -z "$head" && die "fatal: Not a valid revision: $local"
+
+# This also verifies that the resulting head is unique:
+# "git show-ref" could have shown multiple matching refs..
headrev=$(git rev-parse --verify --quiet "$head"^0)
-if test -z "$headrev"
+test -z "$headrev" && die "fatal: Ambiguous revision: $local"
+
+# Was it a branch with a description?
+branch_name=${head#refs/heads/}
+if test "z$branch_name" = "z$headref" ||
+ ! git config "branch.$branch_name.description" >/dev/null
then
- die "fatal: Not a valid revision: $head"
+ branch_name=
fi
merge_base=$(git merge-base $baserev $headrev) ||
die "fatal: No commits in common between $base and $head"
-# $head is the token given from the command line, and $tag_name, if
-# exists, is the tag we are going to show the commit information for.
-# If that tag exists at the remote and it points at the commit, use it.
-# Otherwise, if a branch with the same name as $head exists at the remote
-# and their values match, use that instead.
+# $head is the refname from the command line.
+# If a ref with the same name as $head exists at the remote
+# and their values match, use that.
#
# Otherwise find a random ref that matches $headrev.
find_matching_ref='
- sub abbr {
- my $ref = shift;
- if ($ref =~ s|^refs/heads/|| || $ref =~ s|^refs/tags/|tags/|) {
- return $ref;
- } else {
- return $ref;
- }
- }
+ my ($head,$headrev) = (@ARGV);
+ my ($found);
- my ($tagged, $branch, $found);
while (<STDIN>) {
- my ($sha1, $ref, $deref) = /^(\S+)\s+(\S+?)(\^\{\})?$/;
- next unless ($sha1 eq $ARGV[1]);
- $found = abbr($ref);
- if ($deref && $ref eq "tags/$ARGV[2]") {
- $tagged = $found;
- last;
+ chomp;
+ my ($sha1, $ref, $deref) = /^(\S+)\s+([^^]+)(\S*)$/;
+ my ($pattern);
+ next unless ($sha1 eq $headrev);
+
+ $pattern="/$head\$";
+ if ($ref eq $head) {
+ $found = $ref;
}
- if ($ref =~ m|/\Q$ARGV[0]\E$|) {
- $exact = $found;
+ if ($ref =~ /$pattern/) {
+ $found = $ref;
+ }
+ if ($sha1 eq $head) {
+ $found = $sha1;
}
}
- if ($tagged) {
- print "$tagged\n";
- } elsif ($exact) {
- print "$exact\n";
- } elsif ($found) {
+ if ($found) {
print "$found\n";
}
'
-ref=$(git ls-remote "$url" | @@PERL@@ -e "$find_matching_ref" "$head" "$headrev" "$tag_name")
+ref=$(git ls-remote "$url" | @@PERL@@ -e "$find_matching_ref" "${remote:-HEAD}" "$headrev")
+
+if test -z "$ref"
+then
+ echo "warn: No match for commit $headrev found at $url" >&2
+ echo "warn: Are you sure you pushed '${remote:-HEAD}' there?" >&2
+ status=1
+fi
+
+# Special case: turn "for_linus" to "tags/for_linus" when it is correct
+if test "$ref" = "refs/tags/$pretty_remote"
+then
+ pretty_remote=tags/$pretty_remote
+fi
url=$(git ls-remote --get-url "$url")
@@ -116,7 +133,7 @@ git show -s --format='The following changes since commit %H:
are available in the git repository at:
' $merge_base &&
-echo " $url${ref+ $ref}" &&
+echo " $url $pretty_remote" &&
git show -s --format='
for you to fetch changes up to %H:
@@ -124,39 +141,23 @@ for you to fetch changes up to %H:
----------------------------------------------------------------' $headrev &&
-if test -n "$branch_name"
+if test $(git cat-file -t "$head") = tag
then
- echo "(from the branch description for $branch_name local branch)"
- echo
- git config "branch.$branch_name.description"
-fi &&
-
-if test -n "$tag_name"
-then
- if test -z "$ref" || test "$ref" != "tags/$tag_name"
- then
- echo >&2 "warn: You locally have $tag_name but it does not (yet)"
- echo >&2 "warn: appear to be at $url"
- echo >&2 "warn: Do you want to push it there, perhaps?"
- fi
- git cat-file tag "$tag_name" |
+ git cat-file tag "$head" |
sed -n -e '1,/^$/d' -e '/^-----BEGIN PGP /q' -e p
echo
+ echo "----------------------------------------------------------------"
fi &&
-if test -n "$branch_name" || test -n "$tag_name"
+if test -n "$branch_name"
then
+ echo "(from the branch description for $branch_name local branch)"
+ echo
+ git config "branch.$branch_name.description"
echo "----------------------------------------------------------------"
fi &&
git shortlog ^$baserev $headrev &&
git diff -M --stat --summary $patch $merge_base..$headrev || status=1
-if test -z "$ref"
-then
- echo "warn: No branch of $url is at:" >&2
- git show -s --format='warn: %h: %s' $headrev >&2
- echo "warn: Are you sure you pushed '$head' there?" >&2
- status=1
-fi
exit $status
diff --git a/git-sh-setup.sh b/git-sh-setup.sh
index fffa3c72d7..5f28b32dc7 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-stash.sh b/git-stash.sh
index 4798bcf0e5..4621d81fab 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -94,7 +94,8 @@ create_stash () {
# ease of unpacking later.
u_commit=$(
untracked_files | (
- export GIT_INDEX_FILE="$TMPindex"
+ GIT_INDEX_FILE="$TMPindex" &&
+ export GIT_INDEX_FILE &&
rm -f "$TMPindex" &&
git update-index -z --add --remove --stdin &&
u_tree=$(git write-tree) &&
diff --git a/git-submodule.sh b/git-submodule.sh
index 4a30087768..b55d83ac46 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -9,7 +9,7 @@ USAGE="[--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <re
or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...]
or: $dashless [--quiet] init [--] [<path>...]
or: $dashless [--quiet] deinit [-f|--force] [--] <path>...
- or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--rebase] [--reference <repository>] [--merge] [--recursive] [--] [<path>...]
+ or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--reference <repository>] [--recursive] [--] [<path>...]
or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
or: $dashless [--quiet] foreach [--recursive] <command>
or: $dashless [--quiet] sync [--recursive] [--] [<path>...]"
@@ -241,6 +241,12 @@ 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)
+#
# 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,
@@ -805,17 +811,10 @@ cmd_update()
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")
@@ -884,11 +883,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=checkout ;;
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 +912,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-svn.perl b/git-svn.perl
index 7349ffea5a..0a323722a6 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -1389,17 +1389,7 @@ sub cmd_multi_init {
usage(1);
}
- unless (defined $_prefix) {
- $_prefix = '';
- warn <<EOF
-WARNING: --prefix is not given, defaulting to empty prefix.
- This is probably not what you want! In order to stay compatible
- with regular remote-tracking refs, provide a prefix like
- --prefix=origin/ (remember the trailing slash), which will cause
- the SVN-tracking refs to be placed at refs/remotes/origin/*.
-NOTE: In Git v2.0, the default prefix will change from empty to 'origin/'.
-EOF
- }
+ $_prefix = 'origin/' unless defined $_prefix;
if (defined $url) {
$url = canonicalize_url($url);
init_subdir(@_);
diff --git a/git.c b/git.c
index 7cf2953eff..9efd1a3ec1 100644
--- a/git.c
+++ b/git.c
@@ -78,7 +78,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
if (envchanged)
*envchanged = 1;
} else if (!strcmp(cmd, "--no-replace-objects")) {
- read_replace_refs = 0;
+ check_replace_refs = 0;
setenv(NO_REPLACE_OBJECTS_ENVIRONMENT, "1", 1);
if (envchanged)
*envchanged = 1;
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 52108b9255..a9f57d6f90 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -7094,7 +7094,7 @@ sub git_blob {
git_print_page_path($file_name, "blob", $hash_base);
print "<div class=\"page_body\">\n";
if ($mimetype =~ m!^image/!) {
- print qq!<img type="!.esc_attr($mimetype).qq!"!;
+ print qq!<img class="blob" type="!.esc_attr($mimetype).qq!"!;
if ($file_name) {
print qq! alt="!.esc_attr($file_name).qq!" title="!.esc_attr($file_name).qq!"!;
}
diff --git a/gitweb/static/gitweb.css b/gitweb/static/gitweb.css
index 3b4d833823..3212601032 100644
--- a/gitweb/static/gitweb.css
+++ b/gitweb/static/gitweb.css
@@ -32,6 +32,11 @@ img.avatar {
vertical-align: middle;
}
+img.blob {
+ max-height: 100%;
+ max-width: 100%;
+}
+
a.list img.avatar {
border-style: none;
}
diff --git a/grep.c b/grep.c
index c668034739..4aef0a69d0 100644
--- a/grep.c
+++ b/grep.c
@@ -1562,8 +1562,11 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle
*/
if (opt->count && count) {
char buf[32];
- output_color(opt, gs->name, strlen(gs->name), opt->color_filename);
- output_sep(opt, ':');
+ if (opt->pathname) {
+ output_color(opt, gs->name, strlen(gs->name),
+ opt->color_filename);
+ output_sep(opt, ':');
+ }
snprintf(buf, sizeof(buf), "%u\n", count);
opt->output(opt, buf, strlen(buf));
return 1;
@@ -1650,7 +1653,7 @@ void grep_source_init(struct grep_source *gs, enum grep_source_type type,
break;
case GREP_SOURCE_SHA1:
gs->identifier = xmalloc(20);
- memcpy(gs->identifier, identifier, 20);
+ hashcpy(gs->identifier, identifier);
break;
case GREP_SOURCE_BUF:
gs->identifier = NULL;
diff --git a/hash.c b/hash.c
deleted file mode 100644
index 749ecfe484..0000000000
--- a/hash.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Some generic hashing helpers.
- */
-#include "cache.h"
-#include "hash.h"
-
-/*
- * Look up a hash entry in the hash table. Return the pointer to
- * the existing entry, or the empty slot if none existed. The caller
- * can then look at the (*ptr) to see whether it existed or not.
- */
-static struct hash_table_entry *lookup_hash_entry(unsigned int hash, const struct hash_table *table)
-{
- unsigned int size = table->size, nr = hash % size;
- struct hash_table_entry *array = table->array;
-
- while (array[nr].ptr) {
- if (array[nr].hash == hash)
- break;
- nr++;
- if (nr >= size)
- nr = 0;
- }
- return array + nr;
-}
-
-
-/*
- * Insert a new hash entry pointer into the table.
- *
- * If that hash entry already existed, return the pointer to
- * the existing entry (and the caller can create a list of the
- * pointers or do anything else). If it didn't exist, return
- * NULL (and the caller knows the pointer has been inserted).
- */
-static void **insert_hash_entry(unsigned int hash, void *ptr, struct hash_table *table)
-{
- struct hash_table_entry *entry = lookup_hash_entry(hash, table);
-
- if (!entry->ptr) {
- entry->ptr = ptr;
- entry->hash = hash;
- table->nr++;
- return NULL;
- }
- return &entry->ptr;
-}
-
-static void grow_hash_table(struct hash_table *table)
-{
- unsigned int i;
- unsigned int old_size = table->size, new_size;
- struct hash_table_entry *old_array = table->array, *new_array;
-
- new_size = alloc_nr(old_size);
- new_array = xcalloc(sizeof(struct hash_table_entry), new_size);
- table->size = new_size;
- table->array = new_array;
- table->nr = 0;
- for (i = 0; i < old_size; i++) {
- unsigned int hash = old_array[i].hash;
- void *ptr = old_array[i].ptr;
- if (ptr)
- insert_hash_entry(hash, ptr, table);
- }
- free(old_array);
-}
-
-void *lookup_hash(unsigned int hash, const struct hash_table *table)
-{
- if (!table->array)
- return NULL;
- return lookup_hash_entry(hash, table)->ptr;
-}
-
-void **insert_hash(unsigned int hash, void *ptr, struct hash_table *table)
-{
- unsigned int nr = table->nr;
- if (nr >= table->size/2)
- grow_hash_table(table);
- return insert_hash_entry(hash, ptr, table);
-}
-
-int for_each_hash(const struct hash_table *table, int (*fn)(void *, void *), void *data)
-{
- int sum = 0;
- unsigned int i;
- unsigned int size = table->size;
- struct hash_table_entry *array = table->array;
-
- for (i = 0; i < size; i++) {
- void *ptr = array->ptr;
- array++;
- if (ptr) {
- int val = fn(ptr, data);
- if (val < 0)
- return val;
- sum += val;
- }
- }
- return sum;
-}
-
-void free_hash(struct hash_table *table)
-{
- free(table->array);
- table->array = NULL;
- table->size = 0;
- table->nr = 0;
-}
diff --git a/hash.h b/hash.h
deleted file mode 100644
index 1d43ac0ba0..0000000000
--- a/hash.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef HASH_H
-#define HASH_H
-
-/*
- * These are some simple generic hash table helper functions.
- * Not necessarily suitable for all users, but good for things
- * where you want to just keep track of a list of things, and
- * have a good hash to use on them.
- *
- * It keeps the hash table at roughly 50-75% free, so the memory
- * cost of the hash table itself is roughly
- *
- * 3 * 2*sizeof(void *) * nr_of_objects
- *
- * bytes.
- *
- * FIXME: on 64-bit architectures, we waste memory. It would be
- * good to have just 32-bit pointers, requiring a special allocator
- * for hashed entries or something.
- */
-struct hash_table_entry {
- unsigned int hash;
- void *ptr;
-};
-
-struct hash_table {
- unsigned int size, nr;
- struct hash_table_entry *array;
-};
-
-extern void *lookup_hash(unsigned int hash, const struct hash_table *table);
-extern void **insert_hash(unsigned int hash, void *ptr, struct hash_table *table);
-extern int for_each_hash(const struct hash_table *table, int (*fn)(void *, void *), void *data);
-extern void free_hash(struct hash_table *table);
-
-static inline void init_hash(struct hash_table *table)
-{
- table->size = 0;
- table->nr = 0;
- table->array = NULL;
-}
-
-static inline void preallocate_hash(struct hash_table *table, unsigned int elts)
-{
- assert(table->size == 0 && table->nr == 0 && table->array == NULL);
- table->size = elts * 2;
- table->array = xcalloc(sizeof(struct hash_table_entry), table->size);
-}
-
-#endif
diff --git a/hashmap.c b/hashmap.c
new file mode 100644
index 0000000000..d1b8056d8d
--- /dev/null
+++ b/hashmap.c
@@ -0,0 +1,228 @@
+/*
+ * Generic implementation of hash-based key value mappings.
+ */
+#include "cache.h"
+#include "hashmap.h"
+
+#define FNV32_BASE ((unsigned int) 0x811c9dc5)
+#define FNV32_PRIME ((unsigned int) 0x01000193)
+
+unsigned int strhash(const char *str)
+{
+ unsigned int c, hash = FNV32_BASE;
+ while ((c = (unsigned char) *str++))
+ hash = (hash * FNV32_PRIME) ^ c;
+ return hash;
+}
+
+unsigned int strihash(const char *str)
+{
+ unsigned int c, hash = FNV32_BASE;
+ while ((c = (unsigned char) *str++)) {
+ if (c >= 'a' && c <= 'z')
+ c -= 'a' - 'A';
+ hash = (hash * FNV32_PRIME) ^ c;
+ }
+ return hash;
+}
+
+unsigned int memhash(const void *buf, size_t len)
+{
+ unsigned int hash = FNV32_BASE;
+ unsigned char *ucbuf = (unsigned char *) buf;
+ while (len--) {
+ unsigned int c = *ucbuf++;
+ hash = (hash * FNV32_PRIME) ^ c;
+ }
+ return hash;
+}
+
+unsigned int memihash(const void *buf, size_t len)
+{
+ unsigned int hash = FNV32_BASE;
+ unsigned char *ucbuf = (unsigned char *) buf;
+ while (len--) {
+ unsigned int c = *ucbuf++;
+ if (c >= 'a' && c <= 'z')
+ c -= 'a' - 'A';
+ hash = (hash * FNV32_PRIME) ^ c;
+ }
+ return hash;
+}
+
+#define HASHMAP_INITIAL_SIZE 64
+/* grow / shrink by 2^2 */
+#define HASHMAP_RESIZE_BITS 2
+/* load factor in percent */
+#define HASHMAP_LOAD_FACTOR 80
+
+static void alloc_table(struct hashmap *map, unsigned int size)
+{
+ map->tablesize = size;
+ map->table = xcalloc(size, sizeof(struct hashmap_entry *));
+
+ /* calculate resize thresholds for new size */
+ map->grow_at = (unsigned int) ((uint64_t) size * HASHMAP_LOAD_FACTOR / 100);
+ if (size <= HASHMAP_INITIAL_SIZE)
+ map->shrink_at = 0;
+ else
+ /*
+ * The shrink-threshold must be slightly smaller than
+ * (grow-threshold / resize-factor) to prevent erratic resizing,
+ * thus we divide by (resize-factor + 1).
+ */
+ map->shrink_at = map->grow_at / ((1 << HASHMAP_RESIZE_BITS) + 1);
+}
+
+static inline int entry_equals(const struct hashmap *map,
+ const struct hashmap_entry *e1, const struct hashmap_entry *e2,
+ const void *keydata)
+{
+ return (e1 == e2) || (e1->hash == e2->hash && !map->cmpfn(e1, e2, keydata));
+}
+
+static inline unsigned int bucket(const struct hashmap *map,
+ const struct hashmap_entry *key)
+{
+ return key->hash & (map->tablesize - 1);
+}
+
+static void rehash(struct hashmap *map, unsigned int newsize)
+{
+ unsigned int i, oldsize = map->tablesize;
+ struct hashmap_entry **oldtable = map->table;
+
+ alloc_table(map, newsize);
+ for (i = 0; i < oldsize; i++) {
+ struct hashmap_entry *e = oldtable[i];
+ while (e) {
+ struct hashmap_entry *next = e->next;
+ unsigned int b = bucket(map, e);
+ e->next = map->table[b];
+ map->table[b] = e;
+ e = next;
+ }
+ }
+ free(oldtable);
+}
+
+static inline struct hashmap_entry **find_entry_ptr(const struct hashmap *map,
+ const struct hashmap_entry *key, const void *keydata)
+{
+ struct hashmap_entry **e = &map->table[bucket(map, key)];
+ while (*e && !entry_equals(map, *e, key, keydata))
+ e = &(*e)->next;
+ return e;
+}
+
+static int always_equal(const void *unused1, const void *unused2, const void *unused3)
+{
+ return 0;
+}
+
+void hashmap_init(struct hashmap *map, hashmap_cmp_fn equals_function,
+ size_t initial_size)
+{
+ unsigned int size = HASHMAP_INITIAL_SIZE;
+ map->size = 0;
+ map->cmpfn = equals_function ? equals_function : always_equal;
+
+ /* calculate initial table size and allocate the table */
+ initial_size = (unsigned int) ((uint64_t) initial_size * 100
+ / HASHMAP_LOAD_FACTOR);
+ while (initial_size > size)
+ size <<= HASHMAP_RESIZE_BITS;
+ alloc_table(map, size);
+}
+
+void hashmap_free(struct hashmap *map, int free_entries)
+{
+ if (!map || !map->table)
+ return;
+ if (free_entries) {
+ struct hashmap_iter iter;
+ struct hashmap_entry *e;
+ hashmap_iter_init(map, &iter);
+ while ((e = hashmap_iter_next(&iter)))
+ free(e);
+ }
+ free(map->table);
+ memset(map, 0, sizeof(*map));
+}
+
+void *hashmap_get(const struct hashmap *map, const void *key, const void *keydata)
+{
+ return *find_entry_ptr(map, key, keydata);
+}
+
+void *hashmap_get_next(const struct hashmap *map, const void *entry)
+{
+ struct hashmap_entry *e = ((struct hashmap_entry *) entry)->next;
+ for (; e; e = e->next)
+ if (entry_equals(map, entry, e, NULL))
+ return e;
+ return NULL;
+}
+
+void hashmap_add(struct hashmap *map, void *entry)
+{
+ unsigned int b = bucket(map, entry);
+
+ /* add entry */
+ ((struct hashmap_entry *) entry)->next = map->table[b];
+ map->table[b] = entry;
+
+ /* fix size and rehash if appropriate */
+ map->size++;
+ if (map->size > map->grow_at)
+ rehash(map, map->tablesize << HASHMAP_RESIZE_BITS);
+}
+
+void *hashmap_remove(struct hashmap *map, const void *key, const void *keydata)
+{
+ struct hashmap_entry *old;
+ struct hashmap_entry **e = find_entry_ptr(map, key, keydata);
+ if (!*e)
+ return NULL;
+
+ /* remove existing entry */
+ old = *e;
+ *e = old->next;
+ old->next = NULL;
+
+ /* fix size and rehash if appropriate */
+ map->size--;
+ if (map->size < map->shrink_at)
+ rehash(map, map->tablesize >> HASHMAP_RESIZE_BITS);
+ return old;
+}
+
+void *hashmap_put(struct hashmap *map, void *entry)
+{
+ struct hashmap_entry *old = hashmap_remove(map, entry, NULL);
+ hashmap_add(map, entry);
+ return old;
+}
+
+void hashmap_iter_init(struct hashmap *map, struct hashmap_iter *iter)
+{
+ iter->map = map;
+ iter->tablepos = 0;
+ iter->next = NULL;
+}
+
+void *hashmap_iter_next(struct hashmap_iter *iter)
+{
+ struct hashmap_entry *current = iter->next;
+ for (;;) {
+ if (current) {
+ iter->next = current->next;
+ return current;
+ }
+
+ if (iter->tablepos >= iter->map->tablesize)
+ return NULL;
+
+ current = iter->map->table[iter->tablepos++];
+ }
+}
diff --git a/hashmap.h b/hashmap.h
new file mode 100644
index 0000000000..a816ad47b1
--- /dev/null
+++ b/hashmap.h
@@ -0,0 +1,71 @@
+#ifndef HASHMAP_H
+#define HASHMAP_H
+
+/*
+ * Generic implementation of hash-based key-value mappings.
+ * See Documentation/technical/api-hashmap.txt.
+ */
+
+/* FNV-1 functions */
+
+extern unsigned int strhash(const char *buf);
+extern unsigned int strihash(const char *buf);
+extern unsigned int memhash(const void *buf, size_t len);
+extern unsigned int memihash(const void *buf, size_t len);
+
+/* data structures */
+
+struct hashmap_entry {
+ struct hashmap_entry *next;
+ unsigned int hash;
+};
+
+typedef int (*hashmap_cmp_fn)(const void *entry, const void *entry_or_key,
+ const void *keydata);
+
+struct hashmap {
+ struct hashmap_entry **table;
+ hashmap_cmp_fn cmpfn;
+ unsigned int size, tablesize, grow_at, shrink_at;
+};
+
+struct hashmap_iter {
+ struct hashmap *map;
+ struct hashmap_entry *next;
+ unsigned int tablepos;
+};
+
+/* hashmap functions */
+
+extern void hashmap_init(struct hashmap *map, hashmap_cmp_fn equals_function,
+ size_t initial_size);
+extern void hashmap_free(struct hashmap *map, int free_entries);
+
+/* hashmap_entry functions */
+
+static inline void hashmap_entry_init(void *entry, unsigned int hash)
+{
+ struct hashmap_entry *e = entry;
+ e->hash = hash;
+ e->next = NULL;
+}
+extern void *hashmap_get(const struct hashmap *map, const void *key,
+ const void *keydata);
+extern void *hashmap_get_next(const struct hashmap *map, const void *entry);
+extern void hashmap_add(struct hashmap *map, void *entry);
+extern void *hashmap_put(struct hashmap *map, void *entry);
+extern void *hashmap_remove(struct hashmap *map, const void *key,
+ const void *keydata);
+
+/* hashmap_iter functions */
+
+extern void hashmap_iter_init(struct hashmap *map, struct hashmap_iter *iter);
+extern void *hashmap_iter_next(struct hashmap_iter *iter);
+static inline void *hashmap_iter_first(struct hashmap *map,
+ struct hashmap_iter *iter)
+{
+ hashmap_iter_init(map, iter);
+ return hashmap_iter_next(iter);
+}
+
+#endif
diff --git a/help.c b/help.c
index df7d16d7ce..b266b09320 100644
--- a/help.c
+++ b/help.c
@@ -78,8 +78,7 @@ void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes)
cmds->cnt = cj;
}
-static void pretty_print_string_list(struct cmdnames *cmds,
- unsigned int colopts)
+static void pretty_print_cmdnames(struct cmdnames *cmds, unsigned int colopts)
{
struct string_list list = STRING_LIST_INIT_NODUP;
struct column_options copts;
@@ -209,14 +208,14 @@ void list_commands(unsigned int colopts,
const char *exec_path = git_exec_path();
printf_ln(_("available git commands in '%s'"), exec_path);
putchar('\n');
- pretty_print_string_list(main_cmds, colopts);
+ pretty_print_cmdnames(main_cmds, colopts);
putchar('\n');
}
if (other_cmds->cnt) {
printf_ln(_("git commands available from elsewhere on your $PATH"));
putchar('\n');
- pretty_print_string_list(other_cmds, colopts);
+ pretty_print_cmdnames(other_cmds, colopts);
putchar('\n');
}
}
diff --git a/http-backend.c b/http-backend.c
index d2c0a625ce..f6b7a5bae1 100644
--- a/http-backend.c
+++ b/http-backend.c
@@ -607,9 +607,7 @@ int main(int argc, char **argv)
cmd = c;
n = out[0].rm_eo - out[0].rm_so;
- cmd_arg = xmalloc(n);
- memcpy(cmd_arg, dir + out[0].rm_so + 1, n-1);
- cmd_arg[n-1] = '\0';
+ cmd_arg = xmemdupz(dir + out[0].rm_so + 1, n - 1);
dir[out[0].rm_so] = 0;
break;
}
diff --git a/http-push.c b/http-push.c
index d4b40c9c60..bc94a3f6ab 100644
--- a/http-push.c
+++ b/http-push.c
@@ -64,8 +64,7 @@ enum XML_Status {
#define LOCK_TIME 600
#define LOCK_REFRESH 30
-/* bits #0-15 in revision.h */
-
+/* Remember to update object flag allocation in object.h */
#define LOCAL (1u<<16)
#define REMOTE (1u<<17)
#define FETCHING (1u<<18)
@@ -200,7 +199,7 @@ static void curl_setup_http(CURL *curl, const char *url,
curl_easy_setopt(curl, CURLOPT_READFUNCTION, fread_buffer);
#ifndef NO_CURL_IOCTL
curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, ioctl_buffer);
- curl_easy_setopt(curl, CURLOPT_IOCTLDATA, &buffer);
+ curl_easy_setopt(curl, CURLOPT_IOCTLDATA, buffer);
#endif
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_fn);
curl_easy_setopt(curl, CURLOPT_NOBODY, 0);
@@ -1733,7 +1732,7 @@ int main(int argc, char **argv)
git_extract_argv0_path(argv[0]);
- repo = xcalloc(sizeof(*repo), 1);
+ repo = xcalloc(1, sizeof(*repo));
argv++;
for (i = 1; i < argc; i++, argv++) {
diff --git a/http.c b/http.c
index 70eaa26e88..94e1afdee7 100644
--- a/http.c
+++ b/http.c
@@ -880,6 +880,20 @@ int handle_curl_result(struct slot_results *results)
}
}
+int run_one_slot(struct active_request_slot *slot,
+ struct slot_results *results)
+{
+ slot->results = results;
+ if (!start_active_slot(slot)) {
+ snprintf(curl_errorstr, sizeof(curl_errorstr),
+ "failed to start HTTP request");
+ return HTTP_START_FAILED;
+ }
+
+ run_active_slot(slot);
+ return handle_curl_result(results);
+}
+
static CURLcode curlinfo_strbuf(CURL *curl, CURLINFO info, struct strbuf *buf)
{
char *ptr;
@@ -907,7 +921,6 @@ static int http_request(const char *url,
int ret;
slot = get_active_slot();
- slot->results = &results;
curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1);
if (result == NULL) {
@@ -942,14 +955,7 @@ static int http_request(const char *url,
curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(slot->curl, CURLOPT_ENCODING, "gzip");
- if (start_active_slot(slot)) {
- run_active_slot(slot);
- ret = handle_curl_result(&results);
- } else {
- snprintf(curl_errorstr, sizeof(curl_errorstr),
- "failed to start HTTP request");
- ret = HTTP_START_FAILED;
- }
+ ret = run_one_slot(slot, &results);
if (options && options->content_type)
curlinfo_strbuf(slot->curl, CURLINFO_CONTENT_TYPE,
@@ -1384,7 +1390,7 @@ struct http_object_request *new_http_object_request(const char *base_url,
unsigned char *sha1)
{
char *hex = sha1_to_hex(sha1);
- char *filename;
+ const char *filename;
char prevfile[PATH_MAX];
int prevlocal;
char prev_buf[PREV_BUF_SIZE];
diff --git a/http.h b/http.h
index a766066dfd..e64084fe6d 100644
--- a/http.h
+++ b/http.h
@@ -89,6 +89,15 @@ extern void finish_active_slot(struct active_request_slot *slot);
extern void finish_all_active_slots(void);
extern int handle_curl_result(struct slot_results *results);
+/*
+ * This will run one slot to completion in a blocking manner, similar to how
+ * curl_easy_perform would work (but we don't want to use that, because
+ * we do not want to intermingle calls to curl_multi and curl_easy).
+ *
+ */
+int run_one_slot(struct active_request_slot *slot,
+ struct slot_results *results);
+
#ifdef USE_CURL_MULTI
extern void fill_active_slots(void);
extern void add_fill_function(void *data, int (*fill)(void *));
diff --git a/imap-send.c b/imap-send.c
index 0bc6f7fae1..45230e19cd 100644
--- a/imap-send.c
+++ b/imap-send.c
@@ -951,7 +951,7 @@ static struct imap_store *imap_open_store(struct imap_server_conf *srvc)
char *arg, *rsp;
int s = -1, preauth;
- ctx = xcalloc(sizeof(*ctx), 1);
+ ctx = xcalloc(1, sizeof(*ctx));
ctx->imap = imap = xcalloc(sizeof(*imap), 1);
imap->buf.sock.fd[0] = imap->buf.sock.fd[1] = -1;
diff --git a/khash.h b/khash.h
new file mode 100644
index 0000000000..57ff6038c5
--- /dev/null
+++ b/khash.h
@@ -0,0 +1,338 @@
+/* The MIT License
+
+ Copyright (c) 2008, 2009, 2011 by Attractive Chaos <attractor@live.co.uk>
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+*/
+
+#ifndef __AC_KHASH_H
+#define __AC_KHASH_H
+
+#define AC_VERSION_KHASH_H "0.2.8"
+
+typedef uint32_t khint32_t;
+typedef uint64_t khint64_t;
+
+typedef khint32_t khint_t;
+typedef khint_t khiter_t;
+
+#define __ac_isempty(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&2)
+#define __ac_isdel(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&1)
+#define __ac_iseither(flag, i) ((flag[i>>4]>>((i&0xfU)<<1))&3)
+#define __ac_set_isdel_false(flag, i) (flag[i>>4]&=~(1ul<<((i&0xfU)<<1)))
+#define __ac_set_isempty_false(flag, i) (flag[i>>4]&=~(2ul<<((i&0xfU)<<1)))
+#define __ac_set_isboth_false(flag, i) (flag[i>>4]&=~(3ul<<((i&0xfU)<<1)))
+#define __ac_set_isdel_true(flag, i) (flag[i>>4]|=1ul<<((i&0xfU)<<1))
+
+#define __ac_fsize(m) ((m) < 16? 1 : (m)>>4)
+
+#define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x))
+
+static inline khint_t __ac_X31_hash_string(const char *s)
+{
+ khint_t h = (khint_t)*s;
+ if (h) for (++s ; *s; ++s) h = (h << 5) - h + (khint_t)*s;
+ return h;
+}
+
+#define kh_str_hash_func(key) __ac_X31_hash_string(key)
+#define kh_str_hash_equal(a, b) (strcmp(a, b) == 0)
+
+static const double __ac_HASH_UPPER = 0.77;
+
+#define __KHASH_TYPE(name, khkey_t, khval_t) \
+ typedef struct { \
+ khint_t n_buckets, size, n_occupied, upper_bound; \
+ khint32_t *flags; \
+ khkey_t *keys; \
+ khval_t *vals; \
+ } kh_##name##_t;
+
+#define __KHASH_PROTOTYPES(name, khkey_t, khval_t) \
+ extern kh_##name##_t *kh_init_##name(void); \
+ extern void kh_destroy_##name(kh_##name##_t *h); \
+ extern void kh_clear_##name(kh_##name##_t *h); \
+ extern khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key); \
+ extern int kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets); \
+ extern khint_t kh_put_##name(kh_##name##_t *h, khkey_t key, int *ret); \
+ extern void kh_del_##name(kh_##name##_t *h, khint_t x);
+
+#define __KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
+ SCOPE kh_##name##_t *kh_init_##name(void) { \
+ return (kh_##name##_t*)xcalloc(1, sizeof(kh_##name##_t)); \
+ } \
+ SCOPE void kh_destroy_##name(kh_##name##_t *h) \
+ { \
+ if (h) { \
+ free((void *)h->keys); free(h->flags); \
+ free((void *)h->vals); \
+ free(h); \
+ } \
+ } \
+ SCOPE void kh_clear_##name(kh_##name##_t *h) \
+ { \
+ if (h && h->flags) { \
+ memset(h->flags, 0xaa, __ac_fsize(h->n_buckets) * sizeof(khint32_t)); \
+ h->size = h->n_occupied = 0; \
+ } \
+ } \
+ SCOPE khint_t kh_get_##name(const kh_##name##_t *h, khkey_t key) \
+ { \
+ if (h->n_buckets) { \
+ khint_t k, i, last, mask, step = 0; \
+ mask = h->n_buckets - 1; \
+ k = __hash_func(key); i = k & mask; \
+ last = i; \
+ while (!__ac_isempty(h->flags, i) && (__ac_isdel(h->flags, i) || !__hash_equal(h->keys[i], key))) { \
+ i = (i + (++step)) & mask; \
+ if (i == last) return h->n_buckets; \
+ } \
+ return __ac_iseither(h->flags, i)? h->n_buckets : i; \
+ } else return 0; \
+ } \
+ SCOPE int kh_resize_##name(kh_##name##_t *h, khint_t new_n_buckets) \
+ { /* This function uses 0.25*n_buckets bytes of working space instead of [sizeof(key_t+val_t)+.25]*n_buckets. */ \
+ khint32_t *new_flags = NULL; \
+ khint_t j = 1; \
+ { \
+ kroundup32(new_n_buckets); \
+ if (new_n_buckets < 4) new_n_buckets = 4; \
+ if (h->size >= (khint_t)(new_n_buckets * __ac_HASH_UPPER + 0.5)) j = 0; /* requested size is too small */ \
+ else { /* hash table size to be changed (shrink or expand); rehash */ \
+ new_flags = (khint32_t*)xmalloc(__ac_fsize(new_n_buckets) * sizeof(khint32_t)); \
+ if (!new_flags) return -1; \
+ memset(new_flags, 0xaa, __ac_fsize(new_n_buckets) * sizeof(khint32_t)); \
+ if (h->n_buckets < new_n_buckets) { /* expand */ \
+ khkey_t *new_keys = (khkey_t*)xrealloc((void *)h->keys, new_n_buckets * sizeof(khkey_t)); \
+ if (!new_keys) return -1; \
+ h->keys = new_keys; \
+ if (kh_is_map) { \
+ khval_t *new_vals = (khval_t*)xrealloc((void *)h->vals, new_n_buckets * sizeof(khval_t)); \
+ if (!new_vals) return -1; \
+ h->vals = new_vals; \
+ } \
+ } /* otherwise shrink */ \
+ } \
+ } \
+ if (j) { /* rehashing is needed */ \
+ for (j = 0; j != h->n_buckets; ++j) { \
+ if (__ac_iseither(h->flags, j) == 0) { \
+ khkey_t key = h->keys[j]; \
+ khval_t val; \
+ khint_t new_mask; \
+ new_mask = new_n_buckets - 1; \
+ if (kh_is_map) val = h->vals[j]; \
+ __ac_set_isdel_true(h->flags, j); \
+ while (1) { /* kick-out process; sort of like in Cuckoo hashing */ \
+ khint_t k, i, step = 0; \
+ k = __hash_func(key); \
+ i = k & new_mask; \
+ while (!__ac_isempty(new_flags, i)) i = (i + (++step)) & new_mask; \
+ __ac_set_isempty_false(new_flags, i); \
+ if (i < h->n_buckets && __ac_iseither(h->flags, i) == 0) { /* kick out the existing element */ \
+ { khkey_t tmp = h->keys[i]; h->keys[i] = key; key = tmp; } \
+ if (kh_is_map) { khval_t tmp = h->vals[i]; h->vals[i] = val; val = tmp; } \
+ __ac_set_isdel_true(h->flags, i); /* mark it as deleted in the old hash table */ \
+ } else { /* write the element and jump out of the loop */ \
+ h->keys[i] = key; \
+ if (kh_is_map) h->vals[i] = val; \
+ break; \
+ } \
+ } \
+ } \
+ } \
+ if (h->n_buckets > new_n_buckets) { /* shrink the hash table */ \
+ h->keys = (khkey_t*)xrealloc((void *)h->keys, new_n_buckets * sizeof(khkey_t)); \
+ if (kh_is_map) h->vals = (khval_t*)xrealloc((void *)h->vals, new_n_buckets * sizeof(khval_t)); \
+ } \
+ free(h->flags); /* free the working space */ \
+ h->flags = new_flags; \
+ h->n_buckets = new_n_buckets; \
+ h->n_occupied = h->size; \
+ h->upper_bound = (khint_t)(h->n_buckets * __ac_HASH_UPPER + 0.5); \
+ } \
+ return 0; \
+ } \
+ SCOPE khint_t kh_put_##name(kh_##name##_t *h, khkey_t key, int *ret) \
+ { \
+ khint_t x; \
+ if (h->n_occupied >= h->upper_bound) { /* update the hash table */ \
+ if (h->n_buckets > (h->size<<1)) { \
+ if (kh_resize_##name(h, h->n_buckets - 1) < 0) { /* clear "deleted" elements */ \
+ *ret = -1; return h->n_buckets; \
+ } \
+ } else if (kh_resize_##name(h, h->n_buckets + 1) < 0) { /* expand the hash table */ \
+ *ret = -1; return h->n_buckets; \
+ } \
+ } /* TODO: to implement automatically shrinking; resize() already support shrinking */ \
+ { \
+ khint_t k, i, site, last, mask = h->n_buckets - 1, step = 0; \
+ x = site = h->n_buckets; k = __hash_func(key); i = k & mask; \
+ if (__ac_isempty(h->flags, i)) x = i; /* for speed up */ \
+ else { \
+ last = i; \
+ while (!__ac_isempty(h->flags, i) && (__ac_isdel(h->flags, i) || !__hash_equal(h->keys[i], key))) { \
+ if (__ac_isdel(h->flags, i)) site = i; \
+ i = (i + (++step)) & mask; \
+ if (i == last) { x = site; break; } \
+ } \
+ if (x == h->n_buckets) { \
+ if (__ac_isempty(h->flags, i) && site != h->n_buckets) x = site; \
+ else x = i; \
+ } \
+ } \
+ } \
+ if (__ac_isempty(h->flags, x)) { /* not present at all */ \
+ h->keys[x] = key; \
+ __ac_set_isboth_false(h->flags, x); \
+ ++h->size; ++h->n_occupied; \
+ *ret = 1; \
+ } else if (__ac_isdel(h->flags, x)) { /* deleted */ \
+ h->keys[x] = key; \
+ __ac_set_isboth_false(h->flags, x); \
+ ++h->size; \
+ *ret = 2; \
+ } else *ret = 0; /* Don't touch h->keys[x] if present and not deleted */ \
+ return x; \
+ } \
+ SCOPE void kh_del_##name(kh_##name##_t *h, khint_t x) \
+ { \
+ if (x != h->n_buckets && !__ac_iseither(h->flags, x)) { \
+ __ac_set_isdel_true(h->flags, x); \
+ --h->size; \
+ } \
+ }
+
+#define KHASH_DECLARE(name, khkey_t, khval_t) \
+ __KHASH_TYPE(name, khkey_t, khval_t) \
+ __KHASH_PROTOTYPES(name, khkey_t, khval_t)
+
+#define KHASH_INIT2(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
+ __KHASH_TYPE(name, khkey_t, khval_t) \
+ __KHASH_IMPL(name, SCOPE, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal)
+
+#define KHASH_INIT(name, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal) \
+ KHASH_INIT2(name, static inline, khkey_t, khval_t, kh_is_map, __hash_func, __hash_equal)
+
+/* Other convenient macros... */
+
+/*! @function
+ @abstract Test whether a bucket contains data.
+ @param h Pointer to the hash table [khash_t(name)*]
+ @param x Iterator to the bucket [khint_t]
+ @return 1 if containing data; 0 otherwise [int]
+ */
+#define kh_exist(h, x) (!__ac_iseither((h)->flags, (x)))
+
+/*! @function
+ @abstract Get key given an iterator
+ @param h Pointer to the hash table [khash_t(name)*]
+ @param x Iterator to the bucket [khint_t]
+ @return Key [type of keys]
+ */
+#define kh_key(h, x) ((h)->keys[x])
+
+/*! @function
+ @abstract Get value given an iterator
+ @param h Pointer to the hash table [khash_t(name)*]
+ @param x Iterator to the bucket [khint_t]
+ @return Value [type of values]
+ @discussion For hash sets, calling this results in segfault.
+ */
+#define kh_val(h, x) ((h)->vals[x])
+
+/*! @function
+ @abstract Alias of kh_val()
+ */
+#define kh_value(h, x) ((h)->vals[x])
+
+/*! @function
+ @abstract Get the start iterator
+ @param h Pointer to the hash table [khash_t(name)*]
+ @return The start iterator [khint_t]
+ */
+#define kh_begin(h) (khint_t)(0)
+
+/*! @function
+ @abstract Get the end iterator
+ @param h Pointer to the hash table [khash_t(name)*]
+ @return The end iterator [khint_t]
+ */
+#define kh_end(h) ((h)->n_buckets)
+
+/*! @function
+ @abstract Get the number of elements in the hash table
+ @param h Pointer to the hash table [khash_t(name)*]
+ @return Number of elements in the hash table [khint_t]
+ */
+#define kh_size(h) ((h)->size)
+
+/*! @function
+ @abstract Get the number of buckets in the hash table
+ @param h Pointer to the hash table [khash_t(name)*]
+ @return Number of buckets in the hash table [khint_t]
+ */
+#define kh_n_buckets(h) ((h)->n_buckets)
+
+/*! @function
+ @abstract Iterate over the entries in the hash table
+ @param h Pointer to the hash table [khash_t(name)*]
+ @param kvar Variable to which key will be assigned
+ @param vvar Variable to which value will be assigned
+ @param code Block of code to execute
+ */
+#define kh_foreach(h, kvar, vvar, code) { khint_t __i; \
+ for (__i = kh_begin(h); __i != kh_end(h); ++__i) { \
+ if (!kh_exist(h,__i)) continue; \
+ (kvar) = kh_key(h,__i); \
+ (vvar) = kh_val(h,__i); \
+ code; \
+ } }
+
+/*! @function
+ @abstract Iterate over the values in the hash table
+ @param h Pointer to the hash table [khash_t(name)*]
+ @param vvar Variable to which value will be assigned
+ @param code Block of code to execute
+ */
+#define kh_foreach_value(h, vvar, code) { khint_t __i; \
+ for (__i = kh_begin(h); __i != kh_end(h); ++__i) { \
+ if (!kh_exist(h,__i)) continue; \
+ (vvar) = kh_val(h,__i); \
+ code; \
+ } }
+
+static inline khint_t __kh_oid_hash(const unsigned char *oid)
+{
+ khint_t hash;
+ memcpy(&hash, oid, sizeof(hash));
+ return hash;
+}
+
+#define __kh_oid_cmp(a, b) (hashcmp(a, b) == 0)
+
+KHASH_INIT(sha1, const unsigned char *, void *, 1, __kh_oid_hash, __kh_oid_cmp)
+typedef kh_sha1_t khash_sha1;
+
+KHASH_INIT(sha1_pos, const unsigned char *, int, 1, __kh_oid_hash, __kh_oid_cmp)
+typedef kh_sha1_pos_t khash_sha1_pos;
+
+#endif /* __AC_KHASH_H */
diff --git a/line-log.c b/line-log.c
index 717638b333..1500101058 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 206816fa9c..3595ee7a22 100644
--- a/list-objects.c
+++ b/list-objects.c
@@ -81,8 +81,11 @@ static void process_tree(struct rev_info *revs,
die("bad tree object");
if (obj->flags & (UNINTERESTING | SEEN))
return;
- if (parse_tree(tree) < 0)
+ if (parse_tree(tree) < 0) {
+ if (revs->ignore_missing_links)
+ return;
die("bad tree object %s", sha1_to_hex(obj->sha1));
+ }
obj->flags |= SEEN;
show(obj, path, name, cb_data);
me.up = path;
diff --git a/log-tree.c b/log-tree.c
index 08970bf46e..f87b7e891a 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -100,7 +100,7 @@ static int add_ref_decoration(const char *refname, const unsigned char *sha1, in
if (starts_with(refname, "refs/replace/")) {
unsigned char original_sha1[20];
- if (!read_replace_refs)
+ if (!check_replace_refs)
return 0;
if (get_sha1_hex(refname + 13, original_sha1)) {
warning("invalid replace ref %s", refname);
@@ -365,6 +365,7 @@ static void show_sig_lines(struct rev_info *opt, int status, const char *bol)
eol = strchrnul(bol, '\n');
printf("%s%.*s%s%s", color, (int)(eol - bol), bol, reset,
*eol ? "\n" : "");
+ graph_show_oneline(opt->graph);
bol = (*eol) ? (eol + 1) : eol;
}
}
@@ -376,7 +377,7 @@ static void show_signature(struct rev_info *opt, struct commit *commit)
struct strbuf gpg_output = STRBUF_INIT;
int status;
- if (parse_signed_commit(commit->object.sha1, &payload, &signature) <= 0)
+ if (parse_signed_commit(commit, &payload, &signature) <= 0)
goto out;
status = verify_signed_buffer(payload.buf, payload.len,
@@ -446,16 +447,17 @@ static void show_one_mergetag(struct rev_info *opt,
payload_size = parse_signature(extra->value, extra->len);
status = -1;
- if (extra->len > payload_size)
- if (verify_signed_buffer(extra->value, payload_size,
- extra->value + payload_size,
- extra->len - payload_size,
- &verify_message, NULL)) {
- if (verify_message.len <= gpg_message_offset)
- strbuf_addstr(&verify_message, "No signature\n");
- else
- status = 0;
- }
+ if (extra->len > payload_size) {
+ /* could have a good signature */
+ if (!verify_signed_buffer(extra->value, payload_size,
+ extra->value + payload_size,
+ extra->len - payload_size,
+ &verify_message, NULL))
+ status = 0; /* good */
+ else if (verify_message.len <= gpg_message_offset)
+ strbuf_addstr(&verify_message, "No signature\n");
+ /* otherwise we couldn't verify, which is shown as bad */
+ }
show_sig_lines(opt, status, verify_message.buf);
strbuf_release(&verify_message);
@@ -588,7 +590,7 @@ void show_log(struct rev_info *opt)
show_mergetag(opt, commit);
}
- if (!commit->buffer)
+ if (!get_cached_commit_buffer(commit, NULL))
return;
if (opt->show_notes) {
@@ -805,12 +807,16 @@ int log_tree_commit(struct rev_info *opt, struct commit *commit)
if (opt->line_level_traverse)
return line_log_print(opt, commit);
+ if (opt->track_linear && !opt->linear && !opt->reverse_output_stage)
+ printf("\n%s\n", opt->break_bar);
shown = log_tree_diff(opt, commit, &log);
if (!shown && opt->loginfo && opt->always_show_header) {
log.parent = NULL;
show_log(opt);
shown = 1;
}
+ if (opt->track_linear && !opt->linear && opt->reverse_output_stage)
+ printf("\n%s\n", opt->break_bar);
opt->loginfo = NULL;
maybe_flush_or_die(stdout, "stdout");
return shown;
diff --git a/match-trees.c b/match-trees.c
index 7873cdec58..e80b4af354 100644
--- a/match-trees.c
+++ b/match-trees.c
@@ -182,13 +182,10 @@ static int splice_tree(const unsigned char *hash1,
enum object_type type;
int status;
- subpath = strchr(prefix, '/');
- if (!subpath)
- toplen = strlen(prefix);
- else {
- toplen = subpath - prefix;
+ subpath = strchrnul(prefix, '/');
+ toplen = subpath - prefix;
+ if (*subpath)
subpath++;
- }
buf = read_sha1_file(hash1, &type, &sz);
if (!buf)
@@ -215,7 +212,7 @@ static int splice_tree(const unsigned char *hash1,
if (!rewrite_here)
die("entry %.*s not found in tree %s",
toplen, prefix, sha1_to_hex(hash1));
- if (subpath) {
+ if (*subpath) {
status = splice_tree(rewrite_here, subpath, hash2, subtree);
if (status)
return status;
diff --git a/merge-recursive.c b/merge-recursive.c
index 4177092942..d38a3b2eb5 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -40,7 +40,7 @@ static struct tree *shift_tree_object(struct tree *one, struct tree *two,
static struct commit *make_virtual_commit(struct tree *tree, const char *comment)
{
- struct commit *commit = xcalloc(1, sizeof(struct commit));
+ struct commit *commit = alloc_commit_node();
struct merge_remote_desc *desc = xmalloc(sizeof(*desc));
desc->name = comment;
@@ -190,9 +190,11 @@ static void output_commit_title(struct merge_options *o, struct commit *commit)
printf(_("(bad commit)\n"));
else {
const char *title;
- int len = find_commit_subject(commit->buffer, &title);
+ const char *msg = get_commit_buffer(commit, NULL);
+ int len = find_commit_subject(msg, &title);
if (len)
printf("%.*s\n", len, title);
+ unuse_commit_buffer(commit, msg);
}
}
}
@@ -589,6 +591,12 @@ static int remove_file(struct merge_options *o, int clean,
return -1;
}
if (update_working_directory) {
+ if (ignore_case) {
+ struct cache_entry *ce;
+ ce = cache_file_exists(path, strlen(path), ignore_case);
+ if (ce && ce_stage(ce) == 0)
+ return 0;
+ }
if (remove_path(path))
return -1;
}
diff --git a/name-hash.c b/name-hash.c
index e5b6e1ad23..97444d0201 100644
--- a/name-hash.c
+++ b/name-hash.c
@@ -8,49 +8,28 @@
#define NO_THE_INDEX_COMPATIBILITY_MACROS
#include "cache.h"
-/*
- * This removes bit 5 if bit 6 is set.
- *
- * That will make US-ASCII characters hash to their upper-case
- * equivalent. We could easily do this one whole word at a time,
- * but that's for future worries.
- */
-static inline unsigned char icase_hash(unsigned char c)
-{
- return c & ~((c & 0x40) >> 1);
-}
-
-static unsigned int hash_name(const char *name, int namelen)
-{
- unsigned int hash = 0x123;
-
- while (namelen--) {
- unsigned char c = *name++;
- c = icase_hash(c);
- hash = hash*101 + c;
- }
- return hash;
-}
-
struct dir_entry {
- struct dir_entry *next;
+ struct hashmap_entry ent;
struct dir_entry *parent;
struct cache_entry *ce;
int nr;
unsigned int namelen;
};
+static int dir_entry_cmp(const struct dir_entry *e1,
+ const struct dir_entry *e2, const char *name)
+{
+ return e1->namelen != e2->namelen || strncasecmp(e1->ce->name,
+ name ? name : e2->ce->name, e1->namelen);
+}
+
static struct dir_entry *find_dir_entry(struct index_state *istate,
const char *name, unsigned int namelen)
{
- unsigned int hash = hash_name(name, namelen);
- struct dir_entry *dir;
-
- for (dir = lookup_hash(hash, &istate->dir_hash); dir; dir = dir->next)
- if (dir->namelen == namelen &&
- !strncasecmp(dir->ce->name, name, namelen))
- return dir;
- return NULL;
+ struct dir_entry key;
+ hashmap_entry_init(&key, memihash(name, namelen));
+ key.namelen = namelen;
+ return hashmap_get(&istate->dir_hash, &key, name);
}
static struct dir_entry *hash_dir_entry(struct index_state *istate,
@@ -84,18 +63,11 @@ static struct dir_entry *hash_dir_entry(struct index_state *istate,
dir = find_dir_entry(istate, ce->name, namelen);
if (!dir) {
/* not found, create it and add to hash table */
- void **pdir;
- unsigned int hash = hash_name(ce->name, namelen);
-
dir = xcalloc(1, sizeof(struct dir_entry));
+ hashmap_entry_init(dir, memihash(ce->name, namelen));
dir->namelen = namelen;
dir->ce = ce;
-
- pdir = insert_hash(hash, dir, &istate->dir_hash);
- if (pdir) {
- dir->next = *pdir;
- *pdir = dir;
- }
+ hashmap_add(&istate->dir_hash, dir);
/* recursively add missing parent directories */
dir->parent = hash_dir_entry(istate, ce, namelen);
@@ -114,45 +86,50 @@ static void add_dir_entry(struct index_state *istate, struct cache_entry *ce)
static void remove_dir_entry(struct index_state *istate, struct cache_entry *ce)
{
/*
- * Release reference to the directory entry (and parents if 0).
- *
- * Note: we do not remove / free the entry because there's no
- * hash.[ch]::remove_hash and dir->next may point to other entries
- * that are still valid, so we must not free the memory.
+ * Release reference to the directory entry. If 0, remove and continue
+ * with parent directory.
*/
struct dir_entry *dir = hash_dir_entry(istate, ce, ce_namelen(ce));
- while (dir && dir->nr && !(--dir->nr))
- dir = dir->parent;
+ while (dir && !(--dir->nr)) {
+ struct dir_entry *parent = dir->parent;
+ hashmap_remove(&istate->dir_hash, dir, NULL);
+ free(dir);
+ dir = parent;
+ }
}
static void hash_index_entry(struct index_state *istate, struct cache_entry *ce)
{
- void **pos;
- unsigned int hash;
-
if (ce->ce_flags & CE_HASHED)
return;
ce->ce_flags |= CE_HASHED;
- ce->next = NULL;
- hash = hash_name(ce->name, ce_namelen(ce));
- pos = insert_hash(hash, ce, &istate->name_hash);
- if (pos) {
- ce->next = *pos;
- *pos = ce;
- }
+ hashmap_entry_init(ce, memihash(ce->name, ce_namelen(ce)));
+ hashmap_add(&istate->name_hash, ce);
- if (ignore_case && !(ce->ce_flags & CE_UNHASHED))
+ if (ignore_case)
add_dir_entry(istate, ce);
}
+static int cache_entry_cmp(const struct cache_entry *ce1,
+ const struct cache_entry *ce2, const void *remove)
+{
+ /*
+ * For remove_name_hash, find the exact entry (pointer equality); for
+ * index_file_exists, find all entries with matching hash code and
+ * decide whether the entry matches in same_name.
+ */
+ return remove ? !(ce1 == ce2) : 0;
+}
+
static void lazy_init_name_hash(struct index_state *istate)
{
int nr;
if (istate->name_hash_initialized)
return;
- if (istate->cache_nr)
- preallocate_hash(&istate->name_hash, istate->cache_nr);
+ hashmap_init(&istate->name_hash, (hashmap_cmp_fn) cache_entry_cmp,
+ istate->cache_nr);
+ hashmap_init(&istate->dir_hash, (hashmap_cmp_fn) dir_entry_cmp, 0);
for (nr = 0; nr < istate->cache_nr; nr++)
hash_index_entry(istate, istate->cache[nr]);
istate->name_hash_initialized = 1;
@@ -160,31 +137,19 @@ static void lazy_init_name_hash(struct index_state *istate)
void add_name_hash(struct index_state *istate, struct cache_entry *ce)
{
- /* if already hashed, add reference to directory entries */
- if (ignore_case && (ce->ce_flags & CE_STATE_MASK) == CE_STATE_MASK)
- add_dir_entry(istate, ce);
-
- ce->ce_flags &= ~CE_UNHASHED;
if (istate->name_hash_initialized)
hash_index_entry(istate, ce);
}
-/*
- * We don't actually *remove* it, we can just mark it invalid so that
- * we won't find it in lookups.
- *
- * Not only would we have to search the lists (simple enough), but
- * we'd also have to rehash other hash buckets in case this makes the
- * hash bucket empty (common). So it's much better to just mark
- * it.
- */
void remove_name_hash(struct index_state *istate, struct cache_entry *ce)
{
- /* if already hashed, release reference to directory entries */
- if (ignore_case && (ce->ce_flags & CE_STATE_MASK) == CE_HASHED)
- remove_dir_entry(istate, ce);
+ if (!istate->name_hash_initialized || !(ce->ce_flags & CE_HASHED))
+ return;
+ ce->ce_flags &= ~CE_HASHED;
+ hashmap_remove(&istate->name_hash, ce, ce);
- ce->ce_flags |= CE_UNHASHED;
+ if (ignore_case)
+ remove_dir_entry(istate, ce);
}
static int slow_same_name(const char *name1, int len1, const char *name2, int len2)
@@ -247,49 +212,27 @@ struct cache_entry *index_dir_exists(struct index_state *istate, const char *nam
struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int icase)
{
- unsigned int hash = hash_name(name, namelen);
struct cache_entry *ce;
+ struct hashmap_entry key;
lazy_init_name_hash(istate);
- ce = lookup_hash(hash, &istate->name_hash);
+ hashmap_entry_init(&key, memihash(name, namelen));
+ ce = hashmap_get(&istate->name_hash, &key, NULL);
while (ce) {
- if (!(ce->ce_flags & CE_UNHASHED)) {
- if (same_name(ce, name, namelen, icase))
- return ce;
- }
- ce = ce->next;
+ if (same_name(ce, name, namelen, icase))
+ return ce;
+ ce = hashmap_get_next(&istate->name_hash, ce);
}
return NULL;
}
-struct cache_entry *index_name_exists(struct index_state *istate, const char *name, int namelen, int icase)
-{
- if (namelen > 0 && name[namelen - 1] == '/')
- return index_dir_exists(istate, name, namelen - 1);
- return index_file_exists(istate, name, namelen, icase);
-}
-
-static int free_dir_entry(void *entry, void *unused)
-{
- struct dir_entry *dir = entry;
- while (dir) {
- struct dir_entry *next = dir->next;
- free(dir);
- dir = next;
- }
- return 0;
-}
-
void free_name_hash(struct index_state *istate)
{
if (!istate->name_hash_initialized)
return;
istate->name_hash_initialized = 0;
- if (ignore_case)
- /* free directory entries */
- for_each_hash(&istate->dir_hash, free_dir_entry, NULL);
- free_hash(&istate->name_hash);
- free_hash(&istate->dir_hash);
+ hashmap_free(&istate->name_hash, 0);
+ hashmap_free(&istate->dir_hash, 1);
}
diff --git a/notes-cache.c b/notes-cache.c
index eabe4a0d9b..25b20aa21f 100644
--- a/notes-cache.c
+++ b/notes-cache.c
@@ -48,7 +48,6 @@ int notes_cache_write(struct notes_cache *c)
{
unsigned char tree_sha1[20];
unsigned char commit_sha1[20];
- struct strbuf msg = STRBUF_INIT;
if (!c || !c->tree.initialized || !c->tree.ref || !*c->tree.ref)
return -1;
@@ -57,9 +56,8 @@ int notes_cache_write(struct notes_cache *c)
if (write_notes_tree(&c->tree, tree_sha1))
return -1;
- strbuf_attach(&msg, c->validity,
- strlen(c->validity), strlen(c->validity) + 1);
- if (commit_tree(&msg, tree_sha1, NULL, commit_sha1, NULL, NULL) < 0)
+ if (commit_tree(c->validity, strlen(c->validity), tree_sha1, NULL,
+ commit_sha1, NULL, NULL) < 0)
return -1;
if (update_ref("update notes cache", c->tree.ref, commit_sha1, NULL,
0, QUIET_ON_ERR) < 0)
diff --git a/notes-merge.c b/notes-merge.c
index 94a1a8ae46..fd5fae255d 100644
--- a/notes-merge.c
+++ b/notes-merge.c
@@ -644,7 +644,8 @@ int notes_merge(struct notes_merge_options *o,
struct commit_list *parents = NULL;
commit_list_insert(remote, &parents); /* LIFO order */
commit_list_insert(local, &parents);
- create_notes_commit(local_tree, parents, &o->commit_msg,
+ create_notes_commit(local_tree, parents,
+ o->commit_msg.buf, o->commit_msg.len,
result_sha1);
}
@@ -671,8 +672,8 @@ int notes_merge_commit(struct notes_merge_options *o,
DIR *dir;
struct dirent *e;
struct strbuf path = STRBUF_INIT;
- char *msg = strstr(partial_commit->buffer, "\n\n");
- struct strbuf sb_msg = STRBUF_INIT;
+ const char *buffer = get_commit_buffer(partial_commit, NULL);
+ const char *msg = strstr(buffer, "\n\n");
int baselen;
strbuf_addstr(&path, git_path(NOTES_MERGE_WORKTREE));
@@ -719,9 +720,9 @@ int notes_merge_commit(struct notes_merge_options *o,
strbuf_setlen(&path, baselen);
}
- strbuf_attach(&sb_msg, msg, strlen(msg), strlen(msg) + 1);
- create_notes_commit(partial_tree, partial_commit->parents, &sb_msg,
- result_sha1);
+ create_notes_commit(partial_tree, partial_commit->parents,
+ msg, strlen(msg), result_sha1);
+ unuse_commit_buffer(partial_commit, buffer);
if (o->verbosity >= 4)
printf("Finalized notes merge commit: %s\n",
sha1_to_hex(result_sha1));
diff --git a/notes-utils.c b/notes-utils.c
index 2975dcd581..f6891f7255 100644
--- a/notes-utils.c
+++ b/notes-utils.c
@@ -4,7 +4,8 @@
#include "notes-utils.h"
void create_notes_commit(struct notes_tree *t, struct commit_list *parents,
- const struct strbuf *msg, unsigned char *result_sha1)
+ const char *msg, size_t msg_len,
+ unsigned char *result_sha1)
{
unsigned char tree_sha1[20];
@@ -25,7 +26,7 @@ void create_notes_commit(struct notes_tree *t, struct commit_list *parents,
/* else: t->ref points to nothing, assume root/orphan commit */
}
- if (commit_tree(msg, tree_sha1, parents, result_sha1, NULL, NULL))
+ if (commit_tree(msg, msg_len, tree_sha1, parents, result_sha1, NULL, NULL))
die("Failed to commit notes tree to database");
}
@@ -46,7 +47,7 @@ void commit_notes(struct notes_tree *t, const char *msg)
if (buf.buf[buf.len - 1] != '\n')
strbuf_addch(&buf, '\n'); /* Make sure msg ends with newline */
- create_notes_commit(t, NULL, &buf, commit_sha1);
+ create_notes_commit(t, NULL, buf.buf, buf.len, commit_sha1);
strbuf_insert(&buf, 0, "notes: ", 7); /* commit message starts at index 7 */
update_ref(buf.buf, t->ref, commit_sha1, NULL, 0, DIE_ON_ERR);
@@ -75,7 +76,7 @@ static int notes_rewrite_config(const char *k, const char *v, void *cb)
return 0;
} else if (!c->mode_from_env && !strcmp(k, "notes.rewritemode")) {
if (!v)
- config_error_nonbool(k);
+ return config_error_nonbool(k);
c->combine = parse_combine_notes_fn(v);
if (!c->combine) {
error(_("Bad notes.rewriteMode value: '%s'"), v);
diff --git a/notes-utils.h b/notes-utils.h
index 564e30cccd..890ddb33e1 100644
--- a/notes-utils.h
+++ b/notes-utils.h
@@ -15,7 +15,7 @@
* The resulting commit SHA1 is stored in result_sha1.
*/
void create_notes_commit(struct notes_tree *t, struct commit_list *parents,
- const struct strbuf *msg, unsigned char *result_sha1);
+ const char *msg, size_t msg_len, unsigned char *result_sha1);
void commit_notes(struct notes_tree *t, const char *msg);
diff --git a/notes.c b/notes.c
index 5f07c0b7f2..5fe691dbcd 100644
--- a/notes.c
+++ b/notes.c
@@ -303,7 +303,7 @@ static int note_tree_insert(struct notes_tree *t, struct int_node *tree,
free(entry);
return 0;
}
- new_node = (struct int_node *) xcalloc(sizeof(struct int_node), 1);
+ new_node = (struct int_node *) xcalloc(1, sizeof(struct int_node));
ret = note_tree_insert(t, new_node, n + 1, l, GET_PTR_TYPE(*p),
combine_notes);
if (ret)
@@ -443,7 +443,7 @@ static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
if (len <= 20) {
type = PTR_TYPE_NOTE;
l = (struct leaf_node *)
- xcalloc(sizeof(struct leaf_node), 1);
+ xcalloc(1, sizeof(struct leaf_node));
hashcpy(l->key_sha1, object_sha1);
hashcpy(l->val_sha1, entry.sha1);
if (len < 20) {
@@ -1003,7 +1003,7 @@ void init_notes(struct notes_tree *t, const char *notes_ref,
if (!combine_notes)
combine_notes = combine_notes_concatenate;
- t->root = (struct int_node *) xcalloc(sizeof(struct int_node), 1);
+ t->root = (struct int_node *) xcalloc(1, sizeof(struct int_node));
t->first_non_note = NULL;
t->prev_non_note = NULL;
t->ref = notes_ref ? xstrdup(notes_ref) : NULL;
diff --git a/object.c b/object.c
index 584f7acb36..69fbbbf504 100644
--- a/object.c
+++ b/object.c
@@ -43,14 +43,32 @@ int type_from_string(const char *str)
die("invalid object type \"%s\"", str);
}
+/*
+ * Return a numerical hash value between 0 and n-1 for the object with
+ * the specified sha1. n must be a power of 2. Please note that the
+ * return value is *not* consistent across computer architectures.
+ */
static unsigned int hash_obj(const unsigned char *sha1, unsigned int n)
{
unsigned int hash;
+
+ /*
+ * Since the sha1 is essentially random, we just take the
+ * required number of bits directly from the first
+ * sizeof(unsigned int) bytes of sha1. First we have to copy
+ * the bytes into a properly aligned integer. If we cared
+ * about getting consistent results across architectures, we
+ * would have to call ntohl() here, too.
+ */
memcpy(&hash, sha1, sizeof(unsigned int));
- /* Assumes power-of-2 hash sizes in grow_object_hash */
return hash & (n - 1);
}
+/*
+ * Insert obj into the hash table hash, which has length size (which
+ * must be a power of 2). On collisions, simply overflow to the next
+ * empty bucket.
+ */
static void insert_obj_hash(struct object *obj, struct object **hash, unsigned int size)
{
unsigned int j = hash_obj(obj->sha1, size);
@@ -63,6 +81,10 @@ static void insert_obj_hash(struct object *obj, struct object **hash, unsigned i
hash[j] = obj;
}
+/*
+ * Look up the record for the given sha1 in the hash map stored in
+ * obj_hash. Return NULL if it was not found.
+ */
struct object *lookup_object(const unsigned char *sha1)
{
unsigned int i, first;
@@ -92,6 +114,11 @@ struct object *lookup_object(const unsigned char *sha1)
return obj;
}
+/*
+ * Increase the size of the hash map stored in obj_hash to the next
+ * power of 2 (but at least 32). Copy the existing values to the new
+ * hash map.
+ */
static void grow_object_hash(void)
{
int i;
@@ -114,13 +141,12 @@ static void grow_object_hash(void)
obj_hash_size = new_hash_size;
}
-void *create_object(const unsigned char *sha1, int type, void *o)
+void *create_object(const unsigned char *sha1, void *o)
{
struct object *obj = o;
obj->parsed = 0;
obj->used = 0;
- obj->type = type;
obj->flags = 0;
hashcpy(obj->sha1, sha1);
@@ -132,11 +158,30 @@ void *create_object(const unsigned char *sha1, int type, void *o)
return obj;
}
+void *object_as_type(struct object *obj, enum object_type type, int quiet)
+{
+ if (obj->type == type)
+ return obj;
+ else if (obj->type == OBJ_NONE) {
+ if (type == OBJ_COMMIT)
+ ((struct commit *)obj)->index = alloc_commit_index();
+ obj->type = type;
+ return obj;
+ }
+ else {
+ if (!quiet)
+ error("object %s is a %s, not a %s",
+ sha1_to_hex(obj->sha1),
+ typename(obj->type), typename(type));
+ return NULL;
+ }
+}
+
struct object *lookup_unknown_object(const unsigned char *sha1)
{
struct object *obj = lookup_object(sha1);
if (!obj)
- obj = create_object(sha1, OBJ_NONE, alloc_object_node());
+ obj = create_object(sha1, alloc_object_node());
return obj;
}
@@ -170,8 +215,8 @@ struct object *parse_object_buffer(const unsigned char *sha1, enum object_type t
if (commit) {
if (parse_commit_buffer(commit, buffer, size))
return NULL;
- if (!commit->buffer) {
- commit->buffer = buffer;
+ if (!get_cached_commit_buffer(commit, NULL)) {
+ set_commit_buffer(commit, buffer, size);
*eaten_p = 1;
}
obj = &commit->object;
@@ -187,8 +232,6 @@ struct object *parse_object_buffer(const unsigned char *sha1, enum object_type t
warning("object %s has unknown type id %d", sha1_to_hex(sha1), type);
obj = NULL;
}
- if (obj && obj->type == OBJ_NONE)
- obj->type = type;
return obj;
}
diff --git a/object.h b/object.h
index dc5df8ce1d..5e8d8ee548 100644
--- a/object.h
+++ b/object.h
@@ -26,6 +26,19 @@ struct object_array {
#define OBJECT_ARRAY_INIT { 0, 0, NULL }
#define TYPE_BITS 3
+/*
+ * object flag allocation:
+ * revision.h: 0---------10 26
+ * fetch-pack.c: 0---4
+ * walker.c: 0-2
+ * upload-pack.c: 11----------------19
+ * builtin/blame.c: 12-13
+ * bisect.c: 16
+ * bundle.c: 16
+ * http-push.c: 16-----19
+ * commit.c: 16-----19
+ * sha1_name.c: 20
+ */
#define FLAG_BITS 27
/*
@@ -42,7 +55,14 @@ struct object {
extern const char *typename(unsigned int type);
extern int type_from_string(const char *str);
+/*
+ * Return the current number of buckets in the object hashmap.
+ */
extern unsigned int get_max_object_index(void);
+
+/*
+ * Return the object from the specified bucket in the object hashmap.
+ */
extern struct object *get_indexed_object(unsigned int);
/*
@@ -59,7 +79,9 @@ extern struct object *get_indexed_object(unsigned int);
*/
struct object *lookup_object(const unsigned char *sha1);
-extern void *create_object(const unsigned char *sha1, int type, void *obj);
+extern void *create_object(const unsigned char *sha1, void *obj);
+
+void *object_as_type(struct object *obj, enum object_type type, int quiet);
/*
* Returns the object, having parsed it to find out what it is.
diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c
new file mode 100644
index 0000000000..5f1791a59c
--- /dev/null
+++ b/pack-bitmap-write.c
@@ -0,0 +1,552 @@
+#include "cache.h"
+#include "commit.h"
+#include "tag.h"
+#include "diff.h"
+#include "revision.h"
+#include "list-objects.h"
+#include "progress.h"
+#include "pack-revindex.h"
+#include "pack.h"
+#include "pack-bitmap.h"
+#include "sha1-lookup.h"
+#include "pack-objects.h"
+
+struct bitmapped_commit {
+ struct commit *commit;
+ struct ewah_bitmap *bitmap;
+ struct ewah_bitmap *write_as;
+ int flags;
+ int xor_offset;
+ uint32_t commit_pos;
+};
+
+struct bitmap_writer {
+ struct ewah_bitmap *commits;
+ struct ewah_bitmap *trees;
+ struct ewah_bitmap *blobs;
+ struct ewah_bitmap *tags;
+
+ khash_sha1 *bitmaps;
+ khash_sha1 *reused;
+ struct packing_data *to_pack;
+
+ struct bitmapped_commit *selected;
+ unsigned int selected_nr, selected_alloc;
+
+ struct progress *progress;
+ int show_progress;
+ unsigned char pack_checksum[20];
+};
+
+static struct bitmap_writer writer;
+
+void bitmap_writer_show_progress(int show)
+{
+ writer.show_progress = show;
+}
+
+/**
+ * Build the initial type index for the packfile
+ */
+void bitmap_writer_build_type_index(struct pack_idx_entry **index,
+ uint32_t index_nr)
+{
+ uint32_t i;
+
+ writer.commits = ewah_new();
+ writer.trees = ewah_new();
+ writer.blobs = ewah_new();
+ writer.tags = ewah_new();
+
+ for (i = 0; i < index_nr; ++i) {
+ struct object_entry *entry = (struct object_entry *)index[i];
+ enum object_type real_type;
+
+ entry->in_pack_pos = i;
+
+ switch (entry->type) {
+ case OBJ_COMMIT:
+ case OBJ_TREE:
+ case OBJ_BLOB:
+ case OBJ_TAG:
+ real_type = entry->type;
+ break;
+
+ default:
+ real_type = sha1_object_info(entry->idx.sha1, NULL);
+ break;
+ }
+
+ switch (real_type) {
+ case OBJ_COMMIT:
+ ewah_set(writer.commits, i);
+ break;
+
+ case OBJ_TREE:
+ ewah_set(writer.trees, i);
+ break;
+
+ case OBJ_BLOB:
+ ewah_set(writer.blobs, i);
+ break;
+
+ case OBJ_TAG:
+ ewah_set(writer.tags, i);
+ break;
+
+ default:
+ die("Missing type information for %s (%d/%d)",
+ sha1_to_hex(entry->idx.sha1), real_type, entry->type);
+ }
+ }
+}
+
+/**
+ * Compute the actual bitmaps
+ */
+static struct object **seen_objects;
+static unsigned int seen_objects_nr, seen_objects_alloc;
+
+static inline void push_bitmapped_commit(struct commit *commit, struct ewah_bitmap *reused)
+{
+ if (writer.selected_nr >= writer.selected_alloc) {
+ writer.selected_alloc = (writer.selected_alloc + 32) * 2;
+ writer.selected = xrealloc(writer.selected,
+ writer.selected_alloc * sizeof(struct bitmapped_commit));
+ }
+
+ writer.selected[writer.selected_nr].commit = commit;
+ writer.selected[writer.selected_nr].bitmap = reused;
+ writer.selected[writer.selected_nr].flags = 0;
+
+ writer.selected_nr++;
+}
+
+static inline void mark_as_seen(struct object *object)
+{
+ ALLOC_GROW(seen_objects, seen_objects_nr + 1, seen_objects_alloc);
+ seen_objects[seen_objects_nr++] = object;
+}
+
+static inline void reset_all_seen(void)
+{
+ unsigned int i;
+ for (i = 0; i < seen_objects_nr; ++i) {
+ seen_objects[i]->flags &= ~(SEEN | ADDED | SHOWN);
+ }
+ seen_objects_nr = 0;
+}
+
+static uint32_t find_object_pos(const unsigned char *sha1)
+{
+ struct object_entry *entry = packlist_find(writer.to_pack, sha1, NULL);
+
+ if (!entry) {
+ die("Failed to write bitmap index. Packfile doesn't have full closure "
+ "(object %s is missing)", sha1_to_hex(sha1));
+ }
+
+ return entry->in_pack_pos;
+}
+
+static void show_object(struct object *object, const struct name_path *path,
+ const char *last, void *data)
+{
+ struct bitmap *base = data;
+ bitmap_set(base, find_object_pos(object->sha1));
+ mark_as_seen(object);
+}
+
+static void show_commit(struct commit *commit, void *data)
+{
+ mark_as_seen((struct object *)commit);
+}
+
+static int
+add_to_include_set(struct bitmap *base, struct commit *commit)
+{
+ khiter_t hash_pos;
+ uint32_t bitmap_pos = find_object_pos(commit->object.sha1);
+
+ if (bitmap_get(base, bitmap_pos))
+ return 0;
+
+ hash_pos = kh_get_sha1(writer.bitmaps, commit->object.sha1);
+ if (hash_pos < kh_end(writer.bitmaps)) {
+ struct bitmapped_commit *bc = kh_value(writer.bitmaps, hash_pos);
+ bitmap_or_ewah(base, bc->bitmap);
+ return 0;
+ }
+
+ bitmap_set(base, bitmap_pos);
+ return 1;
+}
+
+static int
+should_include(struct commit *commit, void *_data)
+{
+ struct bitmap *base = _data;
+
+ if (!add_to_include_set(base, commit)) {
+ struct commit_list *parent = commit->parents;
+
+ mark_as_seen((struct object *)commit);
+
+ while (parent) {
+ parent->item->object.flags |= SEEN;
+ mark_as_seen((struct object *)parent->item);
+ parent = parent->next;
+ }
+
+ return 0;
+ }
+
+ return 1;
+}
+
+static void compute_xor_offsets(void)
+{
+ static const int MAX_XOR_OFFSET_SEARCH = 10;
+
+ int i, next = 0;
+
+ while (next < writer.selected_nr) {
+ struct bitmapped_commit *stored = &writer.selected[next];
+
+ int best_offset = 0;
+ struct ewah_bitmap *best_bitmap = stored->bitmap;
+ struct ewah_bitmap *test_xor;
+
+ for (i = 1; i <= MAX_XOR_OFFSET_SEARCH; ++i) {
+ int curr = next - i;
+
+ if (curr < 0)
+ break;
+
+ test_xor = ewah_pool_new();
+ ewah_xor(writer.selected[curr].bitmap, stored->bitmap, test_xor);
+
+ if (test_xor->buffer_size < best_bitmap->buffer_size) {
+ if (best_bitmap != stored->bitmap)
+ ewah_pool_free(best_bitmap);
+
+ best_bitmap = test_xor;
+ best_offset = i;
+ } else {
+ ewah_pool_free(test_xor);
+ }
+ }
+
+ stored->xor_offset = best_offset;
+ stored->write_as = best_bitmap;
+
+ next++;
+ }
+}
+
+void bitmap_writer_build(struct packing_data *to_pack)
+{
+ static const double REUSE_BITMAP_THRESHOLD = 0.2;
+
+ int i, reuse_after, need_reset;
+ struct bitmap *base = bitmap_new();
+ struct rev_info revs;
+
+ writer.bitmaps = kh_init_sha1();
+ writer.to_pack = to_pack;
+
+ if (writer.show_progress)
+ writer.progress = start_progress("Building bitmaps", writer.selected_nr);
+
+ init_revisions(&revs, NULL);
+ revs.tag_objects = 1;
+ revs.tree_objects = 1;
+ revs.blob_objects = 1;
+ revs.no_walk = 0;
+
+ revs.include_check = should_include;
+ reset_revision_walk();
+
+ reuse_after = writer.selected_nr * REUSE_BITMAP_THRESHOLD;
+ need_reset = 0;
+
+ for (i = writer.selected_nr - 1; i >= 0; --i) {
+ struct bitmapped_commit *stored;
+ struct object *object;
+
+ khiter_t hash_pos;
+ int hash_ret;
+
+ stored = &writer.selected[i];
+ object = (struct object *)stored->commit;
+
+ if (stored->bitmap == NULL) {
+ if (i < writer.selected_nr - 1 &&
+ (need_reset ||
+ !in_merge_bases(writer.selected[i + 1].commit,
+ stored->commit))) {
+ bitmap_reset(base);
+ reset_all_seen();
+ }
+
+ add_pending_object(&revs, object, "");
+ revs.include_check_data = base;
+
+ if (prepare_revision_walk(&revs))
+ die("revision walk setup failed");
+
+ traverse_commit_list(&revs, show_commit, show_object, base);
+
+ revs.pending.nr = 0;
+ revs.pending.alloc = 0;
+ revs.pending.objects = NULL;
+
+ stored->bitmap = bitmap_to_ewah(base);
+ need_reset = 0;
+ } else
+ need_reset = 1;
+
+ if (i >= reuse_after)
+ stored->flags |= BITMAP_FLAG_REUSE;
+
+ hash_pos = kh_put_sha1(writer.bitmaps, object->sha1, &hash_ret);
+ if (hash_ret == 0)
+ die("Duplicate entry when writing index: %s",
+ sha1_to_hex(object->sha1));
+
+ kh_value(writer.bitmaps, hash_pos) = stored;
+ display_progress(writer.progress, writer.selected_nr - i);
+ }
+
+ bitmap_free(base);
+ stop_progress(&writer.progress);
+
+ compute_xor_offsets();
+}
+
+/**
+ * Select the commits that will be bitmapped
+ */
+static inline unsigned int next_commit_index(unsigned int idx)
+{
+ static const unsigned int MIN_COMMITS = 100;
+ static const unsigned int MAX_COMMITS = 5000;
+
+ static const unsigned int MUST_REGION = 100;
+ static const unsigned int MIN_REGION = 20000;
+
+ unsigned int offset, next;
+
+ if (idx <= MUST_REGION)
+ return 0;
+
+ if (idx <= MIN_REGION) {
+ offset = idx - MUST_REGION;
+ return (offset < MIN_COMMITS) ? offset : MIN_COMMITS;
+ }
+
+ offset = idx - MIN_REGION;
+ next = (offset < MAX_COMMITS) ? offset : MAX_COMMITS;
+
+ return (next > MIN_COMMITS) ? next : MIN_COMMITS;
+}
+
+static int date_compare(const void *_a, const void *_b)
+{
+ struct commit *a = *(struct commit **)_a;
+ struct commit *b = *(struct commit **)_b;
+ return (long)b->date - (long)a->date;
+}
+
+void bitmap_writer_reuse_bitmaps(struct packing_data *to_pack)
+{
+ if (prepare_bitmap_git() < 0)
+ return;
+
+ writer.reused = kh_init_sha1();
+ rebuild_existing_bitmaps(to_pack, writer.reused, writer.show_progress);
+}
+
+static struct ewah_bitmap *find_reused_bitmap(const unsigned char *sha1)
+{
+ khiter_t hash_pos;
+
+ if (!writer.reused)
+ return NULL;
+
+ hash_pos = kh_get_sha1(writer.reused, sha1);
+ if (hash_pos >= kh_end(writer.reused))
+ return NULL;
+
+ return kh_value(writer.reused, hash_pos);
+}
+
+void bitmap_writer_select_commits(struct commit **indexed_commits,
+ unsigned int indexed_commits_nr,
+ int max_bitmaps)
+{
+ unsigned int i = 0, j, next;
+
+ qsort(indexed_commits, indexed_commits_nr, sizeof(indexed_commits[0]),
+ date_compare);
+
+ if (writer.show_progress)
+ writer.progress = start_progress("Selecting bitmap commits", 0);
+
+ if (indexed_commits_nr < 100) {
+ for (i = 0; i < indexed_commits_nr; ++i)
+ push_bitmapped_commit(indexed_commits[i], NULL);
+ return;
+ }
+
+ for (;;) {
+ struct ewah_bitmap *reused_bitmap = NULL;
+ struct commit *chosen = NULL;
+
+ next = next_commit_index(i);
+
+ if (i + next >= indexed_commits_nr)
+ break;
+
+ if (max_bitmaps > 0 && writer.selected_nr >= max_bitmaps) {
+ writer.selected_nr = max_bitmaps;
+ break;
+ }
+
+ if (next == 0) {
+ chosen = indexed_commits[i];
+ reused_bitmap = find_reused_bitmap(chosen->object.sha1);
+ } else {
+ chosen = indexed_commits[i + next];
+
+ for (j = 0; j <= next; ++j) {
+ struct commit *cm = indexed_commits[i + j];
+
+ reused_bitmap = find_reused_bitmap(cm->object.sha1);
+ if (reused_bitmap || (cm->object.flags & NEEDS_BITMAP) != 0) {
+ chosen = cm;
+ break;
+ }
+
+ if (cm->parents && cm->parents->next)
+ chosen = cm;
+ }
+ }
+
+ push_bitmapped_commit(chosen, reused_bitmap);
+
+ i += next + 1;
+ display_progress(writer.progress, i);
+ }
+
+ stop_progress(&writer.progress);
+}
+
+
+static int sha1write_ewah_helper(void *f, const void *buf, size_t len)
+{
+ /* sha1write will die on error */
+ sha1write(f, buf, len);
+ return len;
+}
+
+/**
+ * Write the bitmap index to disk
+ */
+static inline void dump_bitmap(struct sha1file *f, struct ewah_bitmap *bitmap)
+{
+ if (ewah_serialize_to(bitmap, sha1write_ewah_helper, f) < 0)
+ die("Failed to write bitmap index");
+}
+
+static const unsigned char *sha1_access(size_t pos, void *table)
+{
+ struct pack_idx_entry **index = table;
+ return index[pos]->sha1;
+}
+
+static void write_selected_commits_v1(struct sha1file *f,
+ struct pack_idx_entry **index,
+ uint32_t index_nr)
+{
+ int i;
+
+ for (i = 0; i < writer.selected_nr; ++i) {
+ struct bitmapped_commit *stored = &writer.selected[i];
+ struct bitmap_disk_entry on_disk;
+
+ int commit_pos =
+ sha1_pos(stored->commit->object.sha1, index, index_nr, sha1_access);
+
+ if (commit_pos < 0)
+ die("BUG: trying to write commit not in index");
+
+ on_disk.object_pos = htonl(commit_pos);
+ on_disk.xor_offset = stored->xor_offset;
+ on_disk.flags = stored->flags;
+
+ sha1write(f, &on_disk, sizeof(on_disk));
+ dump_bitmap(f, stored->write_as);
+ }
+}
+
+static void write_hash_cache(struct sha1file *f,
+ struct pack_idx_entry **index,
+ uint32_t index_nr)
+{
+ uint32_t i;
+
+ for (i = 0; i < index_nr; ++i) {
+ struct object_entry *entry = (struct object_entry *)index[i];
+ uint32_t hash_value = htonl(entry->hash);
+ sha1write(f, &hash_value, sizeof(hash_value));
+ }
+}
+
+void bitmap_writer_set_checksum(unsigned char *sha1)
+{
+ hashcpy(writer.pack_checksum, sha1);
+}
+
+void bitmap_writer_finish(struct pack_idx_entry **index,
+ uint32_t index_nr,
+ const char *filename,
+ uint16_t options)
+{
+ static char tmp_file[PATH_MAX];
+ static uint16_t default_version = 1;
+ static uint16_t flags = BITMAP_OPT_FULL_DAG;
+ struct sha1file *f;
+
+ struct bitmap_disk_header header;
+
+ int fd = odb_mkstemp(tmp_file, sizeof(tmp_file), "pack/tmp_bitmap_XXXXXX");
+
+ if (fd < 0)
+ die_errno("unable to create '%s'", tmp_file);
+ f = sha1fd(fd, tmp_file);
+
+ memcpy(header.magic, BITMAP_IDX_SIGNATURE, sizeof(BITMAP_IDX_SIGNATURE));
+ header.version = htons(default_version);
+ header.options = htons(flags | options);
+ header.entry_count = htonl(writer.selected_nr);
+ hashcpy(header.checksum, writer.pack_checksum);
+
+ sha1write(f, &header, sizeof(header));
+ dump_bitmap(f, writer.commits);
+ dump_bitmap(f, writer.trees);
+ dump_bitmap(f, writer.blobs);
+ dump_bitmap(f, writer.tags);
+ write_selected_commits_v1(f, index, index_nr);
+
+ if (options & BITMAP_OPT_HASH_CACHE)
+ write_hash_cache(f, index, index_nr);
+
+ sha1close(f, NULL, CSUM_FSYNC);
+
+ if (adjust_shared_perm(tmp_file))
+ die_errno("unable to make temporary bitmap file readable");
+
+ if (rename(tmp_file, filename))
+ die_errno("unable to rename temporary bitmap file to '%s'", filename);
+}
diff --git a/pack-bitmap.c b/pack-bitmap.c
new file mode 100644
index 0000000000..91e4101531
--- /dev/null
+++ b/pack-bitmap.c
@@ -0,0 +1,1075 @@
+#include "cache.h"
+#include "commit.h"
+#include "tag.h"
+#include "diff.h"
+#include "revision.h"
+#include "progress.h"
+#include "list-objects.h"
+#include "pack.h"
+#include "pack-bitmap.h"
+#include "pack-revindex.h"
+#include "pack-objects.h"
+
+/*
+ * An entry on the bitmap index, representing the bitmap for a given
+ * commit.
+ */
+struct stored_bitmap {
+ unsigned char sha1[20];
+ struct ewah_bitmap *root;
+ struct stored_bitmap *xor;
+ int flags;
+};
+
+/*
+ * The currently active bitmap index. By design, repositories only have
+ * a single bitmap index available (the index for the biggest packfile in
+ * the repository), since bitmap indexes need full closure.
+ *
+ * If there is more than one bitmap index available (e.g. because of alternates),
+ * the active bitmap index is the largest one.
+ */
+static struct bitmap_index {
+ /* Packfile to which this bitmap index belongs to */
+ struct packed_git *pack;
+
+ /* reverse index for the packfile */
+ struct pack_revindex *reverse_index;
+
+ /*
+ * Mark the first `reuse_objects` in the packfile as reused:
+ * they will be sent as-is without using them for repacking
+ * calculations
+ */
+ uint32_t reuse_objects;
+
+ /* mmapped buffer of the whole bitmap index */
+ unsigned char *map;
+ size_t map_size; /* size of the mmaped buffer */
+ size_t map_pos; /* current position when loading the index */
+
+ /*
+ * Type indexes.
+ *
+ * Each bitmap marks which objects in the packfile are of the given
+ * type. This provides type information when yielding the objects from
+ * the packfile during a walk, which allows for better delta bases.
+ */
+ struct ewah_bitmap *commits;
+ struct ewah_bitmap *trees;
+ struct ewah_bitmap *blobs;
+ struct ewah_bitmap *tags;
+
+ /* Map from SHA1 -> `stored_bitmap` for all the bitmapped comits */
+ khash_sha1 *bitmaps;
+
+ /* Number of bitmapped commits */
+ uint32_t entry_count;
+
+ /* Name-hash cache (or NULL if not present). */
+ uint32_t *hashes;
+
+ /*
+ * Extended index.
+ *
+ * When trying to perform bitmap operations with objects that are not
+ * packed in `pack`, these objects are added to this "fake index" and
+ * are assumed to appear at the end of the packfile for all operations
+ */
+ struct eindex {
+ struct object **objects;
+ uint32_t *hashes;
+ uint32_t count, alloc;
+ khash_sha1_pos *positions;
+ } ext_index;
+
+ /* Bitmap result of the last performed walk */
+ struct bitmap *result;
+
+ /* Version of the bitmap index */
+ unsigned int version;
+
+ unsigned loaded : 1;
+
+} bitmap_git;
+
+static struct ewah_bitmap *lookup_stored_bitmap(struct stored_bitmap *st)
+{
+ struct ewah_bitmap *parent;
+ struct ewah_bitmap *composed;
+
+ if (st->xor == NULL)
+ return st->root;
+
+ composed = ewah_pool_new();
+ parent = lookup_stored_bitmap(st->xor);
+ ewah_xor(st->root, parent, composed);
+
+ ewah_pool_free(st->root);
+ st->root = composed;
+ st->xor = NULL;
+
+ return composed;
+}
+
+/*
+ * Read a bitmap from the current read position on the mmaped
+ * index, and increase the read position accordingly
+ */
+static struct ewah_bitmap *read_bitmap_1(struct bitmap_index *index)
+{
+ struct ewah_bitmap *b = ewah_pool_new();
+
+ int bitmap_size = ewah_read_mmap(b,
+ index->map + index->map_pos,
+ index->map_size - index->map_pos);
+
+ if (bitmap_size < 0) {
+ error("Failed to load bitmap index (corrupted?)");
+ ewah_pool_free(b);
+ return NULL;
+ }
+
+ index->map_pos += bitmap_size;
+ return b;
+}
+
+static int load_bitmap_header(struct bitmap_index *index)
+{
+ struct bitmap_disk_header *header = (void *)index->map;
+
+ if (index->map_size < sizeof(*header) + 20)
+ return error("Corrupted bitmap index (missing header data)");
+
+ if (memcmp(header->magic, BITMAP_IDX_SIGNATURE, sizeof(BITMAP_IDX_SIGNATURE)) != 0)
+ return error("Corrupted bitmap index file (wrong header)");
+
+ index->version = ntohs(header->version);
+ if (index->version != 1)
+ return error("Unsupported version for bitmap index file (%d)", index->version);
+
+ /* Parse known bitmap format options */
+ {
+ uint32_t flags = ntohs(header->options);
+
+ if ((flags & BITMAP_OPT_FULL_DAG) == 0)
+ return error("Unsupported options for bitmap index file "
+ "(Git requires BITMAP_OPT_FULL_DAG)");
+
+ if (flags & BITMAP_OPT_HASH_CACHE) {
+ unsigned char *end = index->map + index->map_size - 20;
+ index->hashes = ((uint32_t *)end) - index->pack->num_objects;
+ }
+ }
+
+ index->entry_count = ntohl(header->entry_count);
+ index->map_pos += sizeof(*header);
+ return 0;
+}
+
+static struct stored_bitmap *store_bitmap(struct bitmap_index *index,
+ struct ewah_bitmap *root,
+ const unsigned char *sha1,
+ struct stored_bitmap *xor_with,
+ int flags)
+{
+ struct stored_bitmap *stored;
+ khiter_t hash_pos;
+ int ret;
+
+ stored = xmalloc(sizeof(struct stored_bitmap));
+ stored->root = root;
+ stored->xor = xor_with;
+ stored->flags = flags;
+ hashcpy(stored->sha1, sha1);
+
+ hash_pos = kh_put_sha1(index->bitmaps, stored->sha1, &ret);
+
+ /* a 0 return code means the insertion succeeded with no changes,
+ * because the SHA1 already existed on the map. this is bad, there
+ * shouldn't be duplicated commits in the index */
+ if (ret == 0) {
+ error("Duplicate entry in bitmap index: %s", sha1_to_hex(sha1));
+ return NULL;
+ }
+
+ kh_value(index->bitmaps, hash_pos) = stored;
+ return stored;
+}
+
+static int load_bitmap_entries_v1(struct bitmap_index *index)
+{
+ static const size_t MAX_XOR_OFFSET = 160;
+
+ uint32_t i;
+ struct stored_bitmap **recent_bitmaps;
+ struct bitmap_disk_entry *entry;
+
+ recent_bitmaps = xcalloc(MAX_XOR_OFFSET, sizeof(struct stored_bitmap));
+
+ for (i = 0; i < index->entry_count; ++i) {
+ int xor_offset, flags;
+ struct ewah_bitmap *bitmap = NULL;
+ struct stored_bitmap *xor_bitmap = NULL;
+ uint32_t commit_idx_pos;
+ const unsigned char *sha1;
+
+ entry = (struct bitmap_disk_entry *)(index->map + index->map_pos);
+ index->map_pos += sizeof(struct bitmap_disk_entry);
+
+ commit_idx_pos = ntohl(entry->object_pos);
+ sha1 = nth_packed_object_sha1(index->pack, commit_idx_pos);
+
+ xor_offset = (int)entry->xor_offset;
+ flags = (int)entry->flags;
+
+ bitmap = read_bitmap_1(index);
+ if (!bitmap)
+ return -1;
+
+ if (xor_offset > MAX_XOR_OFFSET || xor_offset > i)
+ return error("Corrupted bitmap pack index");
+
+ if (xor_offset > 0) {
+ xor_bitmap = recent_bitmaps[(i - xor_offset) % MAX_XOR_OFFSET];
+
+ if (xor_bitmap == NULL)
+ return error("Invalid XOR offset in bitmap pack index");
+ }
+
+ recent_bitmaps[i % MAX_XOR_OFFSET] = store_bitmap(
+ index, bitmap, sha1, xor_bitmap, flags);
+ }
+
+ return 0;
+}
+
+static int open_pack_bitmap_1(struct packed_git *packfile)
+{
+ int fd;
+ struct stat st;
+ char *idx_name;
+
+ if (open_pack_index(packfile))
+ return -1;
+
+ idx_name = pack_bitmap_filename(packfile);
+ fd = git_open_noatime(idx_name);
+ free(idx_name);
+
+ if (fd < 0)
+ return -1;
+
+ if (fstat(fd, &st)) {
+ close(fd);
+ return -1;
+ }
+
+ if (bitmap_git.pack) {
+ warning("ignoring extra bitmap file: %s", packfile->pack_name);
+ close(fd);
+ return -1;
+ }
+
+ bitmap_git.pack = packfile;
+ bitmap_git.map_size = xsize_t(st.st_size);
+ bitmap_git.map = xmmap(NULL, bitmap_git.map_size, PROT_READ, MAP_PRIVATE, fd, 0);
+ bitmap_git.map_pos = 0;
+ close(fd);
+
+ if (load_bitmap_header(&bitmap_git) < 0) {
+ munmap(bitmap_git.map, bitmap_git.map_size);
+ bitmap_git.map = NULL;
+ bitmap_git.map_size = 0;
+ return -1;
+ }
+
+ return 0;
+}
+
+static int load_pack_bitmap(void)
+{
+ assert(bitmap_git.map && !bitmap_git.loaded);
+
+ bitmap_git.bitmaps = kh_init_sha1();
+ bitmap_git.ext_index.positions = kh_init_sha1_pos();
+ bitmap_git.reverse_index = revindex_for_pack(bitmap_git.pack);
+
+ if (!(bitmap_git.commits = read_bitmap_1(&bitmap_git)) ||
+ !(bitmap_git.trees = read_bitmap_1(&bitmap_git)) ||
+ !(bitmap_git.blobs = read_bitmap_1(&bitmap_git)) ||
+ !(bitmap_git.tags = read_bitmap_1(&bitmap_git)))
+ goto failed;
+
+ if (load_bitmap_entries_v1(&bitmap_git) < 0)
+ goto failed;
+
+ bitmap_git.loaded = 1;
+ return 0;
+
+failed:
+ munmap(bitmap_git.map, bitmap_git.map_size);
+ bitmap_git.map = NULL;
+ bitmap_git.map_size = 0;
+ return -1;
+}
+
+char *pack_bitmap_filename(struct packed_git *p)
+{
+ char *idx_name;
+ int len;
+
+ len = strlen(p->pack_name) - strlen(".pack");
+ idx_name = xmalloc(len + strlen(".bitmap") + 1);
+
+ memcpy(idx_name, p->pack_name, len);
+ memcpy(idx_name + len, ".bitmap", strlen(".bitmap") + 1);
+
+ return idx_name;
+}
+
+static int open_pack_bitmap(void)
+{
+ struct packed_git *p;
+ int ret = -1;
+
+ assert(!bitmap_git.map && !bitmap_git.loaded);
+
+ prepare_packed_git();
+ for (p = packed_git; p; p = p->next) {
+ if (open_pack_bitmap_1(p) == 0)
+ ret = 0;
+ }
+
+ return ret;
+}
+
+int prepare_bitmap_git(void)
+{
+ if (bitmap_git.loaded)
+ return 0;
+
+ if (!open_pack_bitmap())
+ return load_pack_bitmap();
+
+ return -1;
+}
+
+struct include_data {
+ struct bitmap *base;
+ struct bitmap *seen;
+};
+
+static inline int bitmap_position_extended(const unsigned char *sha1)
+{
+ khash_sha1_pos *positions = bitmap_git.ext_index.positions;
+ khiter_t pos = kh_get_sha1_pos(positions, sha1);
+
+ if (pos < kh_end(positions)) {
+ int bitmap_pos = kh_value(positions, pos);
+ return bitmap_pos + bitmap_git.pack->num_objects;
+ }
+
+ return -1;
+}
+
+static inline int bitmap_position_packfile(const unsigned char *sha1)
+{
+ off_t offset = find_pack_entry_one(sha1, bitmap_git.pack);
+ if (!offset)
+ return -1;
+
+ return find_revindex_position(bitmap_git.reverse_index, offset);
+}
+
+static int bitmap_position(const unsigned char *sha1)
+{
+ int pos = bitmap_position_packfile(sha1);
+ return (pos >= 0) ? pos : bitmap_position_extended(sha1);
+}
+
+static int ext_index_add_object(struct object *object, const char *name)
+{
+ struct eindex *eindex = &bitmap_git.ext_index;
+
+ khiter_t hash_pos;
+ int hash_ret;
+ int bitmap_pos;
+
+ hash_pos = kh_put_sha1_pos(eindex->positions, object->sha1, &hash_ret);
+ if (hash_ret > 0) {
+ if (eindex->count >= eindex->alloc) {
+ eindex->alloc = (eindex->alloc + 16) * 3 / 2;
+ eindex->objects = xrealloc(eindex->objects,
+ eindex->alloc * sizeof(struct object *));
+ eindex->hashes = xrealloc(eindex->hashes,
+ eindex->alloc * sizeof(uint32_t));
+ }
+
+ bitmap_pos = eindex->count;
+ eindex->objects[eindex->count] = object;
+ eindex->hashes[eindex->count] = pack_name_hash(name);
+ kh_value(eindex->positions, hash_pos) = bitmap_pos;
+ eindex->count++;
+ } else {
+ bitmap_pos = kh_value(eindex->positions, hash_pos);
+ }
+
+ return bitmap_pos + bitmap_git.pack->num_objects;
+}
+
+static void show_object(struct object *object, const struct name_path *path,
+ const char *last, void *data)
+{
+ struct bitmap *base = data;
+ int bitmap_pos;
+
+ bitmap_pos = bitmap_position(object->sha1);
+
+ if (bitmap_pos < 0) {
+ char *name = path_name(path, last);
+ bitmap_pos = ext_index_add_object(object, name);
+ free(name);
+ }
+
+ bitmap_set(base, bitmap_pos);
+}
+
+static void show_commit(struct commit *commit, void *data)
+{
+}
+
+static int add_to_include_set(struct include_data *data,
+ const unsigned char *sha1,
+ int bitmap_pos)
+{
+ khiter_t hash_pos;
+
+ if (data->seen && bitmap_get(data->seen, bitmap_pos))
+ return 0;
+
+ if (bitmap_get(data->base, bitmap_pos))
+ return 0;
+
+ hash_pos = kh_get_sha1(bitmap_git.bitmaps, sha1);
+ if (hash_pos < kh_end(bitmap_git.bitmaps)) {
+ struct stored_bitmap *st = kh_value(bitmap_git.bitmaps, hash_pos);
+ bitmap_or_ewah(data->base, lookup_stored_bitmap(st));
+ return 0;
+ }
+
+ bitmap_set(data->base, bitmap_pos);
+ return 1;
+}
+
+static int should_include(struct commit *commit, void *_data)
+{
+ struct include_data *data = _data;
+ int bitmap_pos;
+
+ bitmap_pos = bitmap_position(commit->object.sha1);
+ if (bitmap_pos < 0)
+ bitmap_pos = ext_index_add_object((struct object *)commit, NULL);
+
+ if (!add_to_include_set(data, commit->object.sha1, bitmap_pos)) {
+ struct commit_list *parent = commit->parents;
+
+ while (parent) {
+ parent->item->object.flags |= SEEN;
+ parent = parent->next;
+ }
+
+ return 0;
+ }
+
+ return 1;
+}
+
+static struct bitmap *find_objects(struct rev_info *revs,
+ struct object_list *roots,
+ struct bitmap *seen)
+{
+ struct bitmap *base = NULL;
+ int needs_walk = 0;
+
+ struct object_list *not_mapped = NULL;
+
+ /*
+ * Go through all the roots for the walk. The ones that have bitmaps
+ * on the bitmap index will be `or`ed together to form an initial
+ * global reachability analysis.
+ *
+ * The ones without bitmaps in the index will be stored in the
+ * `not_mapped_list` for further processing.
+ */
+ while (roots) {
+ struct object *object = roots->item;
+ roots = roots->next;
+
+ if (object->type == OBJ_COMMIT) {
+ khiter_t pos = kh_get_sha1(bitmap_git.bitmaps, object->sha1);
+
+ if (pos < kh_end(bitmap_git.bitmaps)) {
+ struct stored_bitmap *st = kh_value(bitmap_git.bitmaps, pos);
+ struct ewah_bitmap *or_with = lookup_stored_bitmap(st);
+
+ if (base == NULL)
+ base = ewah_to_bitmap(or_with);
+ else
+ bitmap_or_ewah(base, or_with);
+
+ object->flags |= SEEN;
+ continue;
+ }
+ }
+
+ object_list_insert(object, &not_mapped);
+ }
+
+ /*
+ * Best case scenario: We found bitmaps for all the roots,
+ * so the resulting `or` bitmap has the full reachability analysis
+ */
+ if (not_mapped == NULL)
+ return base;
+
+ roots = not_mapped;
+
+ /*
+ * Let's iterate through all the roots that don't have bitmaps to
+ * check if we can determine them to be reachable from the existing
+ * global bitmap.
+ *
+ * If we cannot find them in the existing global bitmap, we'll need
+ * to push them to an actual walk and run it until we can confirm
+ * they are reachable
+ */
+ while (roots) {
+ struct object *object = roots->item;
+ int pos;
+
+ roots = roots->next;
+ pos = bitmap_position(object->sha1);
+
+ if (pos < 0 || base == NULL || !bitmap_get(base, pos)) {
+ object->flags &= ~UNINTERESTING;
+ add_pending_object(revs, object, "");
+ needs_walk = 1;
+ } else {
+ object->flags |= SEEN;
+ }
+ }
+
+ if (needs_walk) {
+ struct include_data incdata;
+
+ if (base == NULL)
+ base = bitmap_new();
+
+ incdata.base = base;
+ incdata.seen = seen;
+
+ revs->include_check = should_include;
+ revs->include_check_data = &incdata;
+
+ if (prepare_revision_walk(revs))
+ die("revision walk setup failed");
+
+ traverse_commit_list(revs, show_commit, show_object, base);
+ }
+
+ return base;
+}
+
+static void show_extended_objects(struct bitmap *objects,
+ show_reachable_fn show_reach)
+{
+ struct eindex *eindex = &bitmap_git.ext_index;
+ uint32_t i;
+
+ for (i = 0; i < eindex->count; ++i) {
+ struct object *obj;
+
+ if (!bitmap_get(objects, bitmap_git.pack->num_objects + i))
+ continue;
+
+ obj = eindex->objects[i];
+ show_reach(obj->sha1, obj->type, 0, eindex->hashes[i], NULL, 0);
+ }
+}
+
+static void show_objects_for_type(
+ struct bitmap *objects,
+ struct ewah_bitmap *type_filter,
+ enum object_type object_type,
+ show_reachable_fn show_reach)
+{
+ size_t pos = 0, i = 0;
+ uint32_t offset;
+
+ struct ewah_iterator it;
+ eword_t filter;
+
+ if (bitmap_git.reuse_objects == bitmap_git.pack->num_objects)
+ return;
+
+ ewah_iterator_init(&it, type_filter);
+
+ while (i < objects->word_alloc && ewah_iterator_next(&filter, &it)) {
+ eword_t word = objects->words[i] & filter;
+
+ for (offset = 0; offset < BITS_IN_WORD; ++offset) {
+ const unsigned char *sha1;
+ struct revindex_entry *entry;
+ uint32_t hash = 0;
+
+ if ((word >> offset) == 0)
+ break;
+
+ offset += ewah_bit_ctz64(word >> offset);
+
+ if (pos + offset < bitmap_git.reuse_objects)
+ continue;
+
+ entry = &bitmap_git.reverse_index->revindex[pos + offset];
+ sha1 = nth_packed_object_sha1(bitmap_git.pack, entry->nr);
+
+ if (bitmap_git.hashes)
+ hash = ntohl(bitmap_git.hashes[entry->nr]);
+
+ show_reach(sha1, object_type, 0, hash, bitmap_git.pack, entry->offset);
+ }
+
+ pos += BITS_IN_WORD;
+ i++;
+ }
+}
+
+static int in_bitmapped_pack(struct object_list *roots)
+{
+ while (roots) {
+ struct object *object = roots->item;
+ roots = roots->next;
+
+ if (find_pack_entry_one(object->sha1, bitmap_git.pack) > 0)
+ return 1;
+ }
+
+ return 0;
+}
+
+int prepare_bitmap_walk(struct rev_info *revs)
+{
+ unsigned int i;
+ unsigned int pending_nr = revs->pending.nr;
+ struct object_array_entry *pending_e = revs->pending.objects;
+
+ struct object_list *wants = NULL;
+ struct object_list *haves = NULL;
+
+ struct bitmap *wants_bitmap = NULL;
+ struct bitmap *haves_bitmap = NULL;
+
+ if (!bitmap_git.loaded) {
+ /* try to open a bitmapped pack, but don't parse it yet
+ * because we may not need to use it */
+ if (open_pack_bitmap() < 0)
+ return -1;
+ }
+
+ for (i = 0; i < pending_nr; ++i) {
+ struct object *object = pending_e[i].item;
+
+ if (object->type == OBJ_NONE)
+ parse_object_or_die(object->sha1, NULL);
+
+ while (object->type == OBJ_TAG) {
+ struct tag *tag = (struct tag *) object;
+
+ if (object->flags & UNINTERESTING)
+ object_list_insert(object, &haves);
+ else
+ object_list_insert(object, &wants);
+
+ if (!tag->tagged)
+ die("bad tag");
+ object = parse_object_or_die(tag->tagged->sha1, NULL);
+ }
+
+ if (object->flags & UNINTERESTING)
+ object_list_insert(object, &haves);
+ else
+ object_list_insert(object, &wants);
+ }
+
+ /*
+ * if we have a HAVES list, but none of those haves is contained
+ * in the packfile that has a bitmap, we don't have anything to
+ * optimize here
+ */
+ if (haves && !in_bitmapped_pack(haves))
+ return -1;
+
+ /* if we don't want anything, we're done here */
+ if (!wants)
+ return -1;
+
+ /*
+ * now we're going to use bitmaps, so load the actual bitmap entries
+ * from disk. this is the point of no return; after this the rev_list
+ * becomes invalidated and we must perform the revwalk through bitmaps
+ */
+ if (!bitmap_git.loaded && load_pack_bitmap() < 0)
+ return -1;
+
+ revs->pending.nr = 0;
+ revs->pending.alloc = 0;
+ revs->pending.objects = NULL;
+
+ if (haves) {
+ revs->ignore_missing_links = 1;
+ haves_bitmap = find_objects(revs, haves, NULL);
+ reset_revision_walk();
+ revs->ignore_missing_links = 0;
+
+ if (haves_bitmap == NULL)
+ die("BUG: failed to perform bitmap walk");
+ }
+
+ wants_bitmap = find_objects(revs, wants, haves_bitmap);
+
+ if (!wants_bitmap)
+ die("BUG: failed to perform bitmap walk");
+
+ if (haves_bitmap)
+ bitmap_and_not(wants_bitmap, haves_bitmap);
+
+ bitmap_git.result = wants_bitmap;
+
+ bitmap_free(haves_bitmap);
+ return 0;
+}
+
+int reuse_partial_packfile_from_bitmap(struct packed_git **packfile,
+ uint32_t *entries,
+ off_t *up_to)
+{
+ /*
+ * Reuse the packfile content if we need more than
+ * 90% of its objects
+ */
+ static const double REUSE_PERCENT = 0.9;
+
+ struct bitmap *result = bitmap_git.result;
+ uint32_t reuse_threshold;
+ uint32_t i, reuse_objects = 0;
+
+ assert(result);
+
+ for (i = 0; i < result->word_alloc; ++i) {
+ if (result->words[i] != (eword_t)~0) {
+ reuse_objects += ewah_bit_ctz64(~result->words[i]);
+ break;
+ }
+
+ reuse_objects += BITS_IN_WORD;
+ }
+
+#ifdef GIT_BITMAP_DEBUG
+ {
+ const unsigned char *sha1;
+ struct revindex_entry *entry;
+
+ entry = &bitmap_git.reverse_index->revindex[reuse_objects];
+ sha1 = nth_packed_object_sha1(bitmap_git.pack, entry->nr);
+
+ fprintf(stderr, "Failed to reuse at %d (%016llx)\n",
+ reuse_objects, result->words[i]);
+ fprintf(stderr, " %s\n", sha1_to_hex(sha1));
+ }
+#endif
+
+ if (!reuse_objects)
+ return -1;
+
+ if (reuse_objects >= bitmap_git.pack->num_objects) {
+ bitmap_git.reuse_objects = *entries = bitmap_git.pack->num_objects;
+ *up_to = -1; /* reuse the full pack */
+ *packfile = bitmap_git.pack;
+ return 0;
+ }
+
+ reuse_threshold = bitmap_popcount(bitmap_git.result) * REUSE_PERCENT;
+
+ if (reuse_objects < reuse_threshold)
+ return -1;
+
+ bitmap_git.reuse_objects = *entries = reuse_objects;
+ *up_to = bitmap_git.reverse_index->revindex[reuse_objects].offset;
+ *packfile = bitmap_git.pack;
+
+ return 0;
+}
+
+void traverse_bitmap_commit_list(show_reachable_fn show_reachable)
+{
+ assert(bitmap_git.result);
+
+ show_objects_for_type(bitmap_git.result, bitmap_git.commits,
+ OBJ_COMMIT, show_reachable);
+ show_objects_for_type(bitmap_git.result, bitmap_git.trees,
+ OBJ_TREE, show_reachable);
+ show_objects_for_type(bitmap_git.result, bitmap_git.blobs,
+ OBJ_BLOB, show_reachable);
+ show_objects_for_type(bitmap_git.result, bitmap_git.tags,
+ OBJ_TAG, show_reachable);
+
+ show_extended_objects(bitmap_git.result, show_reachable);
+
+ bitmap_free(bitmap_git.result);
+ bitmap_git.result = NULL;
+}
+
+static uint32_t count_object_type(struct bitmap *objects,
+ enum object_type type)
+{
+ struct eindex *eindex = &bitmap_git.ext_index;
+
+ uint32_t i = 0, count = 0;
+ struct ewah_iterator it;
+ eword_t filter;
+
+ switch (type) {
+ case OBJ_COMMIT:
+ ewah_iterator_init(&it, bitmap_git.commits);
+ break;
+
+ case OBJ_TREE:
+ ewah_iterator_init(&it, bitmap_git.trees);
+ break;
+
+ case OBJ_BLOB:
+ ewah_iterator_init(&it, bitmap_git.blobs);
+ break;
+
+ case OBJ_TAG:
+ ewah_iterator_init(&it, bitmap_git.tags);
+ break;
+
+ default:
+ return 0;
+ }
+
+ while (i < objects->word_alloc && ewah_iterator_next(&filter, &it)) {
+ eword_t word = objects->words[i++] & filter;
+ count += ewah_bit_popcount64(word);
+ }
+
+ for (i = 0; i < eindex->count; ++i) {
+ if (eindex->objects[i]->type == type &&
+ bitmap_get(objects, bitmap_git.pack->num_objects + i))
+ count++;
+ }
+
+ return count;
+}
+
+void count_bitmap_commit_list(uint32_t *commits, uint32_t *trees,
+ uint32_t *blobs, uint32_t *tags)
+{
+ assert(bitmap_git.result);
+
+ if (commits)
+ *commits = count_object_type(bitmap_git.result, OBJ_COMMIT);
+
+ if (trees)
+ *trees = count_object_type(bitmap_git.result, OBJ_TREE);
+
+ if (blobs)
+ *blobs = count_object_type(bitmap_git.result, OBJ_BLOB);
+
+ if (tags)
+ *tags = count_object_type(bitmap_git.result, OBJ_TAG);
+}
+
+struct bitmap_test_data {
+ struct bitmap *base;
+ struct progress *prg;
+ size_t seen;
+};
+
+static void test_show_object(struct object *object,
+ const struct name_path *path,
+ const char *last, void *data)
+{
+ struct bitmap_test_data *tdata = data;
+ int bitmap_pos;
+
+ bitmap_pos = bitmap_position(object->sha1);
+ if (bitmap_pos < 0)
+ die("Object not in bitmap: %s\n", sha1_to_hex(object->sha1));
+
+ bitmap_set(tdata->base, bitmap_pos);
+ display_progress(tdata->prg, ++tdata->seen);
+}
+
+static void test_show_commit(struct commit *commit, void *data)
+{
+ struct bitmap_test_data *tdata = data;
+ int bitmap_pos;
+
+ bitmap_pos = bitmap_position(commit->object.sha1);
+ if (bitmap_pos < 0)
+ die("Object not in bitmap: %s\n", sha1_to_hex(commit->object.sha1));
+
+ bitmap_set(tdata->base, bitmap_pos);
+ display_progress(tdata->prg, ++tdata->seen);
+}
+
+void test_bitmap_walk(struct rev_info *revs)
+{
+ struct object *root;
+ struct bitmap *result = NULL;
+ khiter_t pos;
+ size_t result_popcnt;
+ struct bitmap_test_data tdata;
+
+ if (prepare_bitmap_git())
+ die("failed to load bitmap indexes");
+
+ if (revs->pending.nr != 1)
+ die("you must specify exactly one commit to test");
+
+ fprintf(stderr, "Bitmap v%d test (%d entries loaded)\n",
+ bitmap_git.version, bitmap_git.entry_count);
+
+ root = revs->pending.objects[0].item;
+ pos = kh_get_sha1(bitmap_git.bitmaps, root->sha1);
+
+ if (pos < kh_end(bitmap_git.bitmaps)) {
+ struct stored_bitmap *st = kh_value(bitmap_git.bitmaps, pos);
+ struct ewah_bitmap *bm = lookup_stored_bitmap(st);
+
+ fprintf(stderr, "Found bitmap for %s. %d bits / %08x checksum\n",
+ sha1_to_hex(root->sha1), (int)bm->bit_size, ewah_checksum(bm));
+
+ result = ewah_to_bitmap(bm);
+ }
+
+ if (result == NULL)
+ die("Commit %s doesn't have an indexed bitmap", sha1_to_hex(root->sha1));
+
+ revs->tag_objects = 1;
+ revs->tree_objects = 1;
+ revs->blob_objects = 1;
+
+ result_popcnt = bitmap_popcount(result);
+
+ if (prepare_revision_walk(revs))
+ die("revision walk setup failed");
+
+ tdata.base = bitmap_new();
+ tdata.prg = start_progress("Verifying bitmap entries", result_popcnt);
+ tdata.seen = 0;
+
+ traverse_commit_list(revs, &test_show_commit, &test_show_object, &tdata);
+
+ stop_progress(&tdata.prg);
+
+ if (bitmap_equals(result, tdata.base))
+ fprintf(stderr, "OK!\n");
+ else
+ fprintf(stderr, "Mismatch!\n");
+}
+
+static int rebuild_bitmap(uint32_t *reposition,
+ struct ewah_bitmap *source,
+ struct bitmap *dest)
+{
+ uint32_t pos = 0;
+ struct ewah_iterator it;
+ eword_t word;
+
+ ewah_iterator_init(&it, source);
+
+ while (ewah_iterator_next(&word, &it)) {
+ uint32_t offset, bit_pos;
+
+ for (offset = 0; offset < BITS_IN_WORD; ++offset) {
+ if ((word >> offset) == 0)
+ break;
+
+ offset += ewah_bit_ctz64(word >> offset);
+
+ bit_pos = reposition[pos + offset];
+ if (bit_pos > 0)
+ bitmap_set(dest, bit_pos - 1);
+ else /* can't reuse, we don't have the object */
+ return -1;
+ }
+
+ pos += BITS_IN_WORD;
+ }
+ return 0;
+}
+
+int rebuild_existing_bitmaps(struct packing_data *mapping,
+ khash_sha1 *reused_bitmaps,
+ int show_progress)
+{
+ uint32_t i, num_objects;
+ uint32_t *reposition;
+ struct bitmap *rebuild;
+ struct stored_bitmap *stored;
+ struct progress *progress = NULL;
+
+ khiter_t hash_pos;
+ int hash_ret;
+
+ if (prepare_bitmap_git() < 0)
+ return -1;
+
+ num_objects = bitmap_git.pack->num_objects;
+ reposition = xcalloc(num_objects, sizeof(uint32_t));
+
+ for (i = 0; i < num_objects; ++i) {
+ const unsigned char *sha1;
+ struct revindex_entry *entry;
+ struct object_entry *oe;
+
+ entry = &bitmap_git.reverse_index->revindex[i];
+ sha1 = nth_packed_object_sha1(bitmap_git.pack, entry->nr);
+ oe = packlist_find(mapping, sha1, NULL);
+
+ if (oe)
+ reposition[i] = oe->in_pack_pos + 1;
+ }
+
+ rebuild = bitmap_new();
+ i = 0;
+
+ if (show_progress)
+ progress = start_progress("Reusing bitmaps", 0);
+
+ kh_foreach_value(bitmap_git.bitmaps, stored, {
+ if (stored->flags & BITMAP_FLAG_REUSE) {
+ if (!rebuild_bitmap(reposition,
+ lookup_stored_bitmap(stored),
+ rebuild)) {
+ hash_pos = kh_put_sha1(reused_bitmaps,
+ stored->sha1,
+ &hash_ret);
+ kh_value(reused_bitmaps, hash_pos) =
+ bitmap_to_ewah(rebuild);
+ }
+ bitmap_reset(rebuild);
+ display_progress(progress, ++i);
+ }
+ });
+
+ stop_progress(&progress);
+
+ free(reposition);
+ bitmap_free(rebuild);
+ return 0;
+}
diff --git a/pack-bitmap.h b/pack-bitmap.h
new file mode 100644
index 0000000000..8b7f4e9f0d
--- /dev/null
+++ b/pack-bitmap.h
@@ -0,0 +1,64 @@
+#ifndef PACK_BITMAP_H
+#define PACK_BITMAP_H
+
+#include "ewah/ewok.h"
+#include "khash.h"
+#include "pack-objects.h"
+
+struct bitmap_disk_entry {
+ uint32_t object_pos;
+ uint8_t xor_offset;
+ uint8_t flags;
+} __attribute__((packed));
+
+struct bitmap_disk_header {
+ char magic[4];
+ uint16_t version;
+ uint16_t options;
+ uint32_t entry_count;
+ unsigned char checksum[20];
+};
+
+static const char BITMAP_IDX_SIGNATURE[] = {'B', 'I', 'T', 'M'};
+
+#define NEEDS_BITMAP (1u<<22)
+
+enum pack_bitmap_opts {
+ BITMAP_OPT_FULL_DAG = 1,
+ BITMAP_OPT_HASH_CACHE = 4,
+};
+
+enum pack_bitmap_flags {
+ BITMAP_FLAG_REUSE = 0x1
+};
+
+typedef int (*show_reachable_fn)(
+ const unsigned char *sha1,
+ enum object_type type,
+ int flags,
+ uint32_t hash,
+ struct packed_git *found_pack,
+ off_t found_offset);
+
+int prepare_bitmap_git(void);
+void count_bitmap_commit_list(uint32_t *commits, uint32_t *trees, uint32_t *blobs, uint32_t *tags);
+void traverse_bitmap_commit_list(show_reachable_fn show_reachable);
+void test_bitmap_walk(struct rev_info *revs);
+char *pack_bitmap_filename(struct packed_git *p);
+int prepare_bitmap_walk(struct rev_info *revs);
+int reuse_partial_packfile_from_bitmap(struct packed_git **packfile, uint32_t *entries, off_t *up_to);
+int rebuild_existing_bitmaps(struct packing_data *mapping, khash_sha1 *reused_bitmaps, int show_progress);
+
+void bitmap_writer_show_progress(int show);
+void bitmap_writer_set_checksum(unsigned char *sha1);
+void bitmap_writer_build_type_index(struct pack_idx_entry **index, uint32_t index_nr);
+void bitmap_writer_reuse_bitmaps(struct packing_data *to_pack);
+void bitmap_writer_select_commits(struct commit **indexed_commits,
+ unsigned int indexed_commits_nr, int max_bitmaps);
+void bitmap_writer_build(struct packing_data *to_pack);
+void bitmap_writer_finish(struct pack_idx_entry **index,
+ uint32_t index_nr,
+ const char *filename,
+ uint16_t options);
+
+#endif
diff --git a/pack-objects.c b/pack-objects.c
new file mode 100644
index 0000000000..4f36c32045
--- /dev/null
+++ b/pack-objects.c
@@ -0,0 +1,111 @@
+#include "cache.h"
+#include "object.h"
+#include "pack.h"
+#include "pack-objects.h"
+
+static uint32_t locate_object_entry_hash(struct packing_data *pdata,
+ const unsigned char *sha1,
+ int *found)
+{
+ uint32_t i, hash, mask = (pdata->index_size - 1);
+
+ memcpy(&hash, sha1, sizeof(uint32_t));
+ i = hash & mask;
+
+ while (pdata->index[i] > 0) {
+ uint32_t pos = pdata->index[i] - 1;
+
+ if (!hashcmp(sha1, pdata->objects[pos].idx.sha1)) {
+ *found = 1;
+ return i;
+ }
+
+ i = (i + 1) & mask;
+ }
+
+ *found = 0;
+ return i;
+}
+
+static inline uint32_t closest_pow2(uint32_t v)
+{
+ v = v - 1;
+ v |= v >> 1;
+ v |= v >> 2;
+ v |= v >> 4;
+ v |= v >> 8;
+ v |= v >> 16;
+ return v + 1;
+}
+
+static void rehash_objects(struct packing_data *pdata)
+{
+ uint32_t i;
+ struct object_entry *entry;
+
+ pdata->index_size = closest_pow2(pdata->nr_objects * 3);
+ if (pdata->index_size < 1024)
+ pdata->index_size = 1024;
+
+ free(pdata->index);
+ pdata->index = xcalloc(pdata->index_size, sizeof(*pdata->index));
+
+ entry = pdata->objects;
+
+ for (i = 0; i < pdata->nr_objects; i++) {
+ int found;
+ uint32_t ix = locate_object_entry_hash(pdata, entry->idx.sha1, &found);
+
+ if (found)
+ die("BUG: Duplicate object in hash");
+
+ pdata->index[ix] = i + 1;
+ entry++;
+ }
+}
+
+struct object_entry *packlist_find(struct packing_data *pdata,
+ const unsigned char *sha1,
+ uint32_t *index_pos)
+{
+ uint32_t i;
+ int found;
+
+ if (!pdata->index_size)
+ return NULL;
+
+ i = locate_object_entry_hash(pdata, sha1, &found);
+
+ if (index_pos)
+ *index_pos = i;
+
+ if (!found)
+ return NULL;
+
+ return &pdata->objects[pdata->index[i] - 1];
+}
+
+struct object_entry *packlist_alloc(struct packing_data *pdata,
+ const unsigned char *sha1,
+ uint32_t index_pos)
+{
+ struct object_entry *new_entry;
+
+ if (pdata->nr_objects >= pdata->nr_alloc) {
+ pdata->nr_alloc = (pdata->nr_alloc + 1024) * 3 / 2;
+ pdata->objects = xrealloc(pdata->objects,
+ pdata->nr_alloc * sizeof(*new_entry));
+ }
+
+ new_entry = pdata->objects + pdata->nr_objects++;
+
+ memset(new_entry, 0, sizeof(*new_entry));
+ hashcpy(new_entry->idx.sha1, sha1);
+
+ if (pdata->index_size * 3 <= pdata->nr_objects * 4)
+ rehash_objects(pdata);
+ else
+ pdata->index[index_pos] = pdata->nr_objects;
+
+ return new_entry;
+}
diff --git a/pack-objects.h b/pack-objects.h
new file mode 100644
index 0000000000..d1b98b30ff
--- /dev/null
+++ b/pack-objects.h
@@ -0,0 +1,68 @@
+#ifndef PACK_OBJECTS_H
+#define PACK_OBJECTS_H
+
+struct object_entry {
+ struct pack_idx_entry idx;
+ unsigned long size; /* uncompressed size */
+ struct packed_git *in_pack; /* already in pack */
+ off_t in_pack_offset;
+ struct object_entry *delta; /* delta base object */
+ struct object_entry *delta_child; /* deltified objects who bases me */
+ struct object_entry *delta_sibling; /* other deltified objects who
+ * uses the same base as me
+ */
+ void *delta_data; /* cached delta (uncompressed) */
+ unsigned long delta_size; /* delta data size (uncompressed) */
+ unsigned long z_delta_size; /* delta data size (compressed) */
+ enum object_type type;
+ enum object_type in_pack_type; /* could be delta */
+ uint32_t hash; /* name hint hash */
+ unsigned int in_pack_pos;
+ unsigned char in_pack_header_size;
+ unsigned preferred_base:1; /*
+ * we do not pack this, but is available
+ * to be used as the base object to delta
+ * objects against.
+ */
+ unsigned no_try_delta:1;
+ unsigned tagged:1; /* near the very tip of refs */
+ unsigned filled:1; /* assigned write-order */
+};
+
+struct packing_data {
+ struct object_entry *objects;
+ uint32_t nr_objects, nr_alloc;
+
+ int32_t *index;
+ uint32_t index_size;
+};
+
+struct object_entry *packlist_alloc(struct packing_data *pdata,
+ const unsigned char *sha1,
+ uint32_t index_pos);
+
+struct object_entry *packlist_find(struct packing_data *pdata,
+ const unsigned char *sha1,
+ uint32_t *index_pos);
+
+static inline uint32_t pack_name_hash(const char *name)
+{
+ uint32_t c, hash = 0;
+
+ if (!name)
+ return 0;
+
+ /*
+ * This effectively just creates a sortable number from the
+ * last sixteen non-whitespace characters. Last characters
+ * count "most", so things that end in ".c" sort together.
+ */
+ while ((c = *name++) != 0) {
+ if (isspace(c))
+ continue;
+ hash = (hash >> 2) + (c << 24);
+ }
+ return hash;
+}
+
+#endif
diff --git a/pack-revindex.c b/pack-revindex.c
index b4d2b35bb3..5c8376e978 100644
--- a/pack-revindex.c
+++ b/pack-revindex.c
@@ -16,11 +16,6 @@
* get the object sha1 from the main index.
*/
-struct pack_revindex {
- struct packed_git *p;
- struct revindex_entry *revindex;
-};
-
static struct pack_revindex *pack_revindex;
static int pack_revindex_hashsz;
@@ -50,7 +45,7 @@ static void init_pack_revindex(void)
if (!num)
return;
pack_revindex_hashsz = num * 11;
- pack_revindex = xcalloc(sizeof(*pack_revindex), pack_revindex_hashsz);
+ pack_revindex = xcalloc(pack_revindex_hashsz, sizeof(*pack_revindex));
for (p = packed_git; p; p = p->next) {
num = pack_revindex_ix(p);
num = - 1 - num;
@@ -201,15 +196,14 @@ static void create_pack_revindex(struct pack_revindex *rix)
sort_revindex(rix->revindex, num_ent, p->pack_size);
}
-struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs)
+struct pack_revindex *revindex_for_pack(struct packed_git *p)
{
int num;
- unsigned lo, hi;
struct pack_revindex *rix;
- struct revindex_entry *revindex;
if (!pack_revindex_hashsz)
init_pack_revindex();
+
num = pack_revindex_ix(p);
if (num < 0)
die("internal error: pack revindex fubar");
@@ -217,30 +211,37 @@ struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs)
rix = &pack_revindex[num];
if (!rix->revindex)
create_pack_revindex(rix);
- revindex = rix->revindex;
- lo = 0;
- hi = p->num_objects + 1;
+ return rix;
+}
+
+int find_revindex_position(struct pack_revindex *pridx, off_t ofs)
+{
+ int lo = 0;
+ int hi = pridx->p->num_objects + 1;
+ struct revindex_entry *revindex = pridx->revindex;
+
do {
unsigned mi = lo + (hi - lo) / 2;
if (revindex[mi].offset == ofs) {
- return revindex + mi;
+ return mi;
} else if (ofs < revindex[mi].offset)
hi = mi;
else
lo = mi + 1;
} while (lo < hi);
+
error("bad offset for revindex");
- return NULL;
+ return -1;
}
-void discard_revindex(void)
+struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs)
{
- if (pack_revindex_hashsz) {
- int i;
- for (i = 0; i < pack_revindex_hashsz; i++)
- free(pack_revindex[i].revindex);
- free(pack_revindex);
- pack_revindex_hashsz = 0;
- }
+ struct pack_revindex *pridx = revindex_for_pack(p);
+ int pos = find_revindex_position(pridx, ofs);
+
+ if (pos < 0)
+ return NULL;
+
+ return pridx->revindex + pos;
}
diff --git a/pack-revindex.h b/pack-revindex.h
index 8d5027ad91..d737f98965 100644
--- a/pack-revindex.h
+++ b/pack-revindex.h
@@ -6,7 +6,14 @@ struct revindex_entry {
unsigned int nr;
};
+struct pack_revindex {
+ struct packed_git *p;
+ struct revindex_entry *revindex;
+};
+
+struct pack_revindex *revindex_for_pack(struct packed_git *p);
+int find_revindex_position(struct pack_revindex *pridx, off_t ofs);
+
struct revindex_entry *find_pack_revindex(struct packed_git *p, off_t ofs);
-void discard_revindex(void);
#endif
diff --git a/pack-write.c b/pack-write.c
index 605d01b25c..9ccf80419b 100644
--- a/pack-write.c
+++ b/pack-write.c
@@ -336,7 +336,7 @@ struct sha1file *create_tmp_packfile(char **pack_tmp_name)
return sha1fd(fd, *pack_tmp_name);
}
-void finish_tmp_packfile(char *name_buffer,
+void finish_tmp_packfile(struct strbuf *name_buffer,
const char *pack_tmp_name,
struct pack_idx_entry **written_list,
uint32_t nr_written,
@@ -344,7 +344,7 @@ void finish_tmp_packfile(char *name_buffer,
unsigned char sha1[])
{
const char *idx_tmp_name;
- char *end_of_name_prefix = strrchr(name_buffer, 0);
+ int basename_len = name_buffer->len;
if (adjust_shared_perm(pack_tmp_name))
die_errno("unable to make temporary pack file readable");
@@ -354,15 +354,19 @@ void finish_tmp_packfile(char *name_buffer,
if (adjust_shared_perm(idx_tmp_name))
die_errno("unable to make temporary index file readable");
- sprintf(end_of_name_prefix, "%s.pack", sha1_to_hex(sha1));
- free_pack_by_name(name_buffer);
+ strbuf_addf(name_buffer, "%s.pack", sha1_to_hex(sha1));
+ free_pack_by_name(name_buffer->buf);
- if (rename(pack_tmp_name, name_buffer))
+ if (rename(pack_tmp_name, name_buffer->buf))
die_errno("unable to rename temporary pack file");
- sprintf(end_of_name_prefix, "%s.idx", sha1_to_hex(sha1));
- if (rename(idx_tmp_name, name_buffer))
+ strbuf_setlen(name_buffer, basename_len);
+
+ strbuf_addf(name_buffer, "%s.idx", sha1_to_hex(sha1));
+ if (rename(idx_tmp_name, name_buffer->buf))
die_errno("unable to rename temporary index file");
+ strbuf_setlen(name_buffer, basename_len);
+
free((void *)idx_tmp_name);
}
diff --git a/pack.h b/pack.h
index 12d951659c..3223f5a038 100644
--- a/pack.h
+++ b/pack.h
@@ -91,6 +91,6 @@ extern int encode_in_pack_object_header(enum object_type, uintmax_t, unsigned ch
extern int read_pack_header(int fd, struct pack_header *);
extern struct sha1file *create_tmp_packfile(char **pack_tmp_name);
-extern void finish_tmp_packfile(char *name_buffer, const char *pack_tmp_name, struct pack_idx_entry **written_list, uint32_t nr_written, struct pack_idx_option *pack_idx_opts, unsigned char sha1[]);
+extern void finish_tmp_packfile(struct strbuf *name_buffer, const char *pack_tmp_name, struct pack_idx_entry **written_list, uint32_t nr_written, struct pack_idx_option *pack_idx_opts, unsigned char sha1[]);
#endif
diff --git a/pager.c b/pager.c
index 0cc75a8eee..53670a63a7 100644
--- a/pager.c
+++ b/pager.c
@@ -64,7 +64,7 @@ void setup_pager(void)
{
const char *pager = git_pager(isatty(1));
- if (!pager || pager_in_use())
+ if (!pager)
return;
/*
diff --git a/parse-options.c b/parse-options.c
index 7b8d3faa17..b536896f26 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -127,10 +127,6 @@ static int get_value(struct parse_opt_ctx_t *p,
*(int *)opt->value = opt->defval;
return 0;
- case OPTION_SET_PTR:
- *(void **)opt->value = unset ? NULL : (void *)opt->defval;
- return 0;
-
case OPTION_STRING:
if (unset)
*(const char **)opt->value = NULL;
@@ -223,13 +219,10 @@ static int parse_long_opt(struct parse_opt_ctx_t *p, const char *arg,
const struct option *options)
{
const struct option *all_opts = options;
- const char *arg_end = strchr(arg, '=');
+ const char *arg_end = strchrnul(arg, '=');
const struct option *abbrev_option = NULL, *ambiguous_option = NULL;
int abbrev_flags = 0, ambiguous_flags = 0;
- if (!arg_end)
- arg_end = arg + strlen(arg);
-
for (; options->type != OPTION_END; options++) {
const char *rest, *long_name = options->long_name;
int flags = 0, opt_flags = 0;
@@ -370,7 +363,6 @@ static void parse_options_check(const struct option *opts)
case OPTION_BIT:
case OPTION_NEGBIT:
case OPTION_SET_INT:
- case OPTION_SET_PTR:
case OPTION_NUMBER:
if ((opts->flags & PARSE_OPT_OPTARG) ||
!(opts->flags & PARSE_OPT_NOARG))
@@ -378,6 +370,9 @@ static void parse_options_check(const struct option *opts)
default:
; /* ok. (usually accepts an argument) */
}
+ if (opts->argh &&
+ strcspn(opts->argh, " _") != strlen(opts->argh))
+ err |= optbug(opts, "multi-word argh should use dash to separate words");
}
if (err)
exit(128);
diff --git a/parse-options.h b/parse-options.h
index d670cb9669..3189676695 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -12,7 +12,6 @@ enum parse_opt_type {
OPTION_NEGBIT,
OPTION_COUNTUP,
OPTION_SET_INT,
- OPTION_SET_PTR,
OPTION_CMDMODE,
/* options with arguments (usually) */
OPTION_STRING,
@@ -96,7 +95,7 @@ typedef int parse_opt_ll_cb(struct parse_opt_ctx_t *ctx,
*
* `defval`::
* default value to fill (*->value) with for PARSE_OPT_OPTARG.
- * OPTION_{BIT,SET_INT,SET_PTR} store the {mask,integer,pointer} to put in
+ * OPTION_{BIT,SET_INT} store the {mask,integer,pointer} to put in
* the value when met.
* CALLBACKS can use it like they want.
*/
@@ -128,8 +127,6 @@ struct option {
#define OPT_BOOL(s, l, v, h) OPT_SET_INT(s, l, v, h, 1)
#define OPT_HIDDEN_BOOL(s, l, v, h) { OPTION_SET_INT, (s), (l), (v), NULL, \
(h), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, NULL, 1}
-#define OPT_SET_PTR(s, l, v, h, p) { OPTION_SET_PTR, (s), (l), (v), NULL, \
- (h), PARSE_OPT_NOARG, NULL, (p) }
#define OPT_CMDMODE(s, l, v, h, i) { OPTION_CMDMODE, (s), (l), (v), NULL, \
(h), PARSE_OPT_NOARG|PARSE_OPT_NONEG, NULL, (i) }
#define OPT_INTEGER(s, l, v, h) { OPTION_INTEGER, (s), (l), (v), N_("n"), (h) }
@@ -143,7 +140,7 @@ struct option {
{ OPTION_CALLBACK, (s), (l), (v), N_("time"),(h), 0, \
parse_opt_approxidate_cb }
#define OPT_EXPIRY_DATE(s, l, v, h) \
- { OPTION_CALLBACK, (s), (l), (v), N_("expiry date"),(h), 0, \
+ { OPTION_CALLBACK, (s), (l), (v), N_("expiry-date"),(h), 0, \
parse_opt_expiry_date_cb }
#define OPT_CALLBACK(s, l, v, a, h, f) \
{ OPTION_CALLBACK, (s), (l), (v), (a), (h), 0, (f) }
diff --git a/patch-ids.c b/patch-ids.c
index bc8a28fdd7..bf81b92361 100644
--- a/patch-ids.c
+++ b/patch-ids.c
@@ -83,10 +83,7 @@ static struct patch_id *add_commit(struct commit *commit,
ent = &bucket->bucket[bucket->nr++];
hashcpy(ent->patch_id, sha1);
- if (ids->alloc <= ids->nr) {
- ids->alloc = alloc_nr(ids->nr);
- ids->table = xrealloc(ids->table, sizeof(ent) * ids->alloc);
- }
+ ALLOC_GROW(ids->table, ids->nr + 1, ids->alloc);
if (pos < ids->nr)
memmove(ids->table + pos + 1, ids->table + pos,
sizeof(ent) * (ids->nr - pos));
diff --git a/path.c b/path.c
index dfd58f4367..f10c91a927 100644
--- a/path.c
+++ b/path.c
@@ -249,9 +249,7 @@ int validate_headref(const char *path)
static struct passwd *getpw_str(const char *username, size_t len)
{
struct passwd *pw;
- char *username_z = xmalloc(len + 1);
- memcpy(username_z, username, len);
- username_z[len] = '\0';
+ char *username_z = xmemdupz(username, len);
pw = getpwnam(username_z);
free(username_z);
return pw;
diff --git a/pathspec.c b/pathspec.c
index 8043099955..0be5edbd13 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -389,8 +389,7 @@ void parse_pathspec(struct pathspec *pathspec,
if (!(flags & PATHSPEC_PREFER_CWD))
die("BUG: PATHSPEC_PREFER_CWD requires arguments");
- pathspec->items = item = xmalloc(sizeof(*item));
- memset(item, 0, sizeof(*item));
+ pathspec->items = item = xcalloc(1, sizeof(*item));
item->match = prefix;
item->original = prefix;
item->nowildcard_len = item->len = strlen(prefix);
diff --git a/po/bg.po b/po/bg.po
index fb450b2414..e862e10604 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -14,6 +14,36 @@
# rebase пребазирам
# force (push) принудително изтлаÑквам
# stash/index индекÑ
+# squash commits Ñмачкване на подаваниÑ
+# root commit начално подаване
+# fixup вкарвам подаване в предното без Ñледа
+# remote-tracking branch ÑледÑщ клон
+# git bundle архив на git
+# bisect двоично Ñ‚ÑŠÑ€Ñене
+# am прилагам поредица от кръпки
+# working directory/tree — винаги работно дърво, git Ñледи цÑлото дърво, а не директории
+# switch to branch прехвърлÑм Ñе/преминавам към клон
+# sparse entry чаÑтично изтеглена директориÑ/път
+# revision range диапазон на верÑиите
+# cover letter придружаващо пиÑмо
+# reference repository еталонно хранилище
+# grafted repository хранилище Ñ Ð¿Ñ€Ð¸Ñаждане
+# thin pack Ñъкратен пакет
+# stat (a file) получавам Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñ‡Ñ€ÐµÐ· „stat“ (за файл)
+# mixed reset ÑмеÑено занулÑване (индекÑа и ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“, без работното дърво)
+# soft reset меко занулÑване (Ñамо ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“, без индекÑа и работното дърво)
+# hard reset пълно занулÑване (ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“, индекÑа и работното дърво)
+# merge reset ÑлÑто занулÑване (Ñ†ÐµÐ»Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑ Ð¸ отчаÑти работното дърво — без файловете Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ð¸ между работното дърво и индекÑа)
+# keep reset запазващо занулÑване (отчаÑти индекÑа и работното дърво — файловете Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ð¸ от подаването и „HEAD“)
+# commit-ish указател към подаване
+# sequence поÑледователноÑÑ‚/поредица
+# whitespace symbol знаци за интервали
+# shortlog ÑÑŠÐºÑ€Ð°Ñ‚ÐµÐ½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»
+# ----
+# FAILED to parse неуÑпешен анализ на... -> неразпозната ÑтойноÑÑ‚ на
+#
+# ========================
+# „“…—
# ========================
# RECHECK
# ------------------------
@@ -25,70 +55,60 @@
# 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
+# FIND NON FULLY TRANSLATED
# ------------------------
-# 1988
+# msgattrib --untranslated bg.po > untranslated.po
+# msgattrib --only-fuzzy bg.po > fuzzy.po
+# msgcat.exe untranslated.po fuzzy.po > new.po
+# grep ^#: new.po | cut -c4- |tr ' ' '\n'| sed -e 's/:[0-9][0-9]*//' -e 's%.*/%%' -e 's/[.][^.]*$//' | sort -u
+#
# ========================
-# DONE alphabetical ordering
+# STRINGS statistics
# ------------------------
-#
-# advice, fsck, gc, help, parse-options, reflog, remote, rm, run-command
+# 1307t,0f,921u
#
# ========================
-# REMAINING alphabetical ordering
+# MOST IMPORTANT name asc 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
-#
+# add, blame, branch, checkout, clone, commit, common-cmds, config, diff, fetch, fsck, gc, git-rebase, git-stash, grep, log, mv, parse-options, push, reflog, remote, reset, revert, rm, wt-status
#
# ========================
-# MOST IMPORTANT strings ordering
+# IMPORTANT strings desc, name asc 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
+# 111 apply 54 git-submodule 30 git-am 13 check-ignore 10 merge-file
+# 97 merge 39 init-db 30 describe 12 pathspec 10 merge-base
+# 64 tag 35 archive 29 git-bisect 12 name-rev 10 ls-tree
+# 55 merge-recursive 32 clean 14 show-ref 11 date 10 hash-object
#
# ========================
-# WHOLE STATISTICS strings ordering
+# WHOLE STATISTICS strings desc, name asc 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
+# 144 [remote] 47 [push] 26 [revert] 12 checkout-index 6 [prune] 2 [verify-tag]
+# 137 [commit] 46 pack-objects 24 [mv] 11 date 6 [gpg-interface] 2 [update-server-info]
+# 114 [branch] 41 [help] 23 repack 11 column 6 [check-attr] 2 [run-command]
+# 111 apply 39 init-db 21 [rm] 10 urlmatch 5 [write-tree] 2 [rerere]
+# 101 notes 36 [add] 21 [common-cmds] 10 shortlog 5 [sha1_name] 2 [read-cache]
+# 100 [wt-status] 35 [reset] 19 [show-branch] 10 merge-file 5 [rev-parse] 2 [obstack]
+# 97 merge 35 archive 19 read-tree 10 merge-base 4 [wrapper] 2 [advice]
+# 78 [checkout] 34 [config] 19 bundle 10 ls-tree 4 [prune-packed] 1 [unpack-trees]
+# 77 [log] 32 clean 16 [parse-options] 10 hash-object 4 [notes-utils] 1 [unpack-objects]
+# 69 [clone] 30 git-am 15 [fsck] 10 for-each-ref 4 [mktree] 1 [progress]
+# 68 index-pack 30 describe 14 show-ref 10 cat-file 4 [check-mailmap] 1 [precompose_utf8]
+# 68 [fetch] 29 [git-stash] 14 [gc] 9 [update-ref] 3 [verify-pack] 1 [object]
+# 64 tag 29 git-bisect 14 fast-export 9 [submodule] 3 [reflog] 1 [git]
+# 64 [grep] 28 update-index 13 [diff] 8 [replace] 3 [pack-refs] 1 [diffcore-rename]
+# 56 sequencer 28 [blame] 13 check-ignore 8 [git-pull] 3 [count-objects] 1 [diffcore-order]
+# 55 merge-recursive 27 ls-files 12 pathspec 8 [fmt-merge-msg] 3 [connected] 1 [attr]
+# 54 git-submodule 27 [git-rebase] 12 name-rev 7 [symbolic-ref] 3 [bisect--helper]
+#
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"
+"POT-Creation-Date: 2014-04-19 12:50+0800\n"
+"PO-Revision-Date: 2014-05-11 17:06+0300\n"
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
"Language: bg\n"
@@ -97,16 +117,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: advice.c:57
+#: advice.c:55
#, 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
+#: advice.c:85
msgid ""
"Fix them up in the work tree,\n"
"and then use 'git add/rm <file>' as\n"
@@ -135,76 +151,76 @@ msgstr ""
msgid "git archive --remote <repo> [--exec <cmd>] --list"
msgstr ""
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
#, c-format
msgid "pathspec '%s' did not match any files"
msgstr "пътÑÑ‚ „%s“ не Ñъвпада Ñ Ð½Ð¸ÐºÐ¾Ð¹ файл"
-#: archive.c:327
+#: archive.c:328
msgid "fmt"
msgstr ""
-#: archive.c:327
+#: archive.c:328
msgid "archive format"
msgstr ""
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
msgid "prefix"
-msgstr ""
+msgstr "префикÑ"
-#: archive.c:329
+#: archive.c:330
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
+#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2258
+#: builtin/blame.c:2259 builtin/config.c:57 builtin/fast-export.c:680
+#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
+#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
msgid "file"
msgstr "файл"
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 builtin/archive.c:89
msgid "write the archive to this file"
msgstr ""
-#: archive.c:333
+#: archive.c:334
msgid "read .gitattributes in working directory"
msgstr ""
-#: archive.c:334
+#: archive.c:335
msgid "report archived files on stderr"
msgstr ""
-#: archive.c:335
+#: archive.c:336
msgid "store only"
msgstr ""
-#: archive.c:336
+#: archive.c:337
msgid "compress faster"
msgstr ""
-#: archive.c:344
+#: archive.c:345
msgid "compress better"
msgstr ""
-#: archive.c:347
+#: archive.c:348
msgid "list supported archive formats"
msgstr ""
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
msgid "repo"
-msgstr ""
+msgstr "хранилище"
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 builtin/archive.c:91
msgid "retrieve the archive from remote repository <repo>"
msgstr ""
-#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
msgid "command"
msgstr ""
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
msgid "path to the remote git-upload-archive command"
msgstr ""
@@ -213,87 +229,88 @@ msgid ""
"Negative patterns are ignored in git attributes\n"
"Use '\\!' for literal leading exclamation."
msgstr ""
+"Отрицателните шаблони Ñе игнорират в атрибутите на git.\n"
+"Ðко ви Ñ‚Ñ€Ñбва начална удивителна, ползвайте „\\!“."
#: branch.c:60
#, c-format
msgid "Not setting branch %s as its own upstream."
msgstr ""
+"Клонът „%s“ не може да Ñлужи като източник за ÑобÑтвената Ñи ÑинхронизациÑ."
-#: branch.c:82
+#: branch.c:83
#, c-format
msgid "Branch %s set up to track remote branch %s from %s by rebasing."
msgstr ""
+"Клонът „%s“ ще Ñледи клона „%s“ от отдалеченото хранилище „%s“ чрез "
+"пребазиране."
-#: branch.c:83
+#: branch.c:84
#, c-format
msgid "Branch %s set up to track remote branch %s from %s."
-msgstr ""
+msgstr "Клонът „%s“ ще Ñледи клона „%s“ от отдалеченото хранилище „%s“."
-#: branch.c:87
+#: branch.c:88
#, c-format
msgid "Branch %s set up to track local branch %s by rebasing."
msgstr ""
+"Клонът „%s“ ще Ñледи клона „%s“ от локалното хранилище чрез пребазиране."
-#: branch.c:88
+#: branch.c:89
#, c-format
msgid "Branch %s set up to track local branch %s."
-msgstr ""
+msgstr "Клонът „%s“ ще Ñледи клона „%s“ от локалното хранилище."
-#: branch.c:92
+#: branch.c:94
#, c-format
msgid "Branch %s set up to track remote ref %s by rebasing."
-msgstr ""
+msgstr "Клонът „%s“ ще Ñледи Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ» „%s“ чрез пребазиране."
-#: branch.c:93
+#: branch.c:95
#, c-format
msgid "Branch %s set up to track remote ref %s."
-msgstr ""
+msgstr "Клонът „%s“ ще Ñледи Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ» „%s“."
-#: branch.c:97
+#: branch.c:99
#, c-format
msgid "Branch %s set up to track local ref %s by rebasing."
-msgstr ""
+msgstr "Клонът „%s“ ще Ñледи Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ» „%s“ чрез пребазиране."
-#: branch.c:98
+#: branch.c:100
#, 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 ""
+msgstr "Клонът „%s“ ще Ñледи Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ» „%s“."
-#: branch.c:137
+#: branch.c:133
#, c-format
msgid "Not tracking: ambiguous information for ref %s"
-msgstr ""
+msgstr "ÐÑма Ñледене: двуÑмиÑлена Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€ž%s“"
-#: branch.c:182
+#: branch.c:178
#, c-format
msgid "'%s' is not a valid branch name."
-msgstr ""
+msgstr "„%s“ не е позволено име за клон."
-#: branch.c:187
+#: branch.c:183
#, c-format
msgid "A branch named '%s' already exists."
-msgstr ""
+msgstr "Вече ÑъщеÑтвува клон Ñ Ð¸Ð¼Ðµ „%s“."
-#: branch.c:195
+#: branch.c:191
msgid "Cannot force update the current branch."
-msgstr ""
+msgstr "ТекущиÑÑ‚ клон не може да бъде принудително обновен."
-#: branch.c:215
+#: branch.c:211
#, c-format
msgid "Cannot setup tracking information; starting point '%s' is not a branch."
-msgstr ""
+msgstr "Зададените наÑтройки за Ñледенето Ñа грешни — началото „%s“ не е клон."
-#: branch.c:217
+#: branch.c:213
#, c-format
msgid "the requested upstream branch '%s' does not exist"
-msgstr ""
+msgstr "заÑвениÑÑ‚ отдалечен клон „%s“ не ÑъщеÑтвува"
-#: branch.c:219
+#: branch.c:215
msgid ""
"\n"
"If you are planning on basing your work on an upstream\n"
@@ -304,135 +321,142 @@ msgid ""
"will track its remote counterpart, you may want to use\n"
"\"git push -u\" to set the upstream config as you push."
msgstr ""
+"\n"
+"Ðко иÑкате да базирате работата Ñи на клон от отдалечено хранилище, може \n"
+"да Ñе наложи да изпълните „git fetch“, за да получите информациÑта за него.\n"
+"\n"
+"Ðко иÑкате да изтлаÑкате нов, локален клон, който да Ñледи отдалечен клон,\n"
+"може да използвате „git push -u“, за да наÑтроите към кой клон да Ñе "
+"изтлаÑква."
-#: branch.c:264
+#: branch.c:260
#, c-format
msgid "Not a valid object name: '%s'."
-msgstr ""
+msgstr "Ðеправилно име на обект: „%s“"
-#: branch.c:284
+#: branch.c:280
#, c-format
msgid "Ambiguous object name: '%s'."
-msgstr ""
+msgstr "ДвуÑмиÑлено име на обект: „%s“"
-#: branch.c:289
+#: branch.c:285
#, c-format
msgid "Not a valid branch point: '%s'."
-msgstr ""
+msgstr "Ðеправилно мÑÑто за начало на клон: „%s“"
-#: branch.c:295
+#: branch.c:291
msgid "Failed to lock ref for update"
-msgstr ""
+msgstr "УказателÑÑ‚ не може да бъде заключен, за да бъде обновен"
-#: branch.c:313
+#: branch.c:309
msgid "Failed to write ref"
-msgstr ""
+msgstr "УказателÑÑ‚ не може да бъде запиÑан"
-#: bundle.c:37
+#: bundle.c:33
#, c-format
msgid "'%s' does not look like a v2 bundle file"
-msgstr ""
+msgstr "Файлът „%s“ не изглежда да е архив на git верÑÐ¸Ñ 2"
-#: bundle.c:64
+#: bundle.c:60
#, c-format
msgid "unrecognized header: %s%s (%d)"
msgstr ""
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
#, c-format
msgid "could not open '%s'"
-msgstr ""
+msgstr "„%s“ не може да Ñе отвори"
-#: bundle.c:141
+#: bundle.c:138
msgid "Repository lacks these prerequisite commits:"
msgstr ""
-#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: bundle.c:162 sequencer.c:669 sequencer.c:1123 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 ""
+msgstr "неуÑпешно наÑтройване на обхождането на верÑиите"
-#: bundle.c:187
+#: bundle.c:184
#, c-format
msgid "The bundle contains this ref:"
msgid_plural "The bundle contains these %d refs:"
msgstr[0] ""
msgstr[1] ""
-#: bundle.c:194
+#: bundle.c:191
msgid "The bundle records a complete history."
msgstr ""
-#: bundle.c:196
+#: bundle.c:193
#, c-format
msgid "The bundle requires this ref:"
msgid_plural "The bundle requires these %d refs:"
msgstr[0] ""
msgstr[1] ""
-#: bundle.c:296
+#: bundle.c:293
msgid "rev-list died"
msgstr ""
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
#, c-format
msgid "unrecognized argument: %s"
-msgstr ""
+msgstr "непознат аргумент: %s"
-#: bundle.c:337
+#: bundle.c:334
#, c-format
msgid "ref '%s' is excluded by the rev-list options"
msgstr ""
-#: bundle.c:382
+#: bundle.c:379
msgid "Refusing to create empty bundle."
msgstr ""
-#: bundle.c:398
+#: bundle.c:395
msgid "Could not spawn pack-objects"
msgstr ""
-#: bundle.c:416
+#: bundle.c:413
msgid "pack-objects died"
msgstr ""
-#: bundle.c:419
+#: bundle.c:416
#, c-format
msgid "cannot create '%s'"
msgstr ""
-#: bundle.c:441
+#: bundle.c:438
msgid "index-pack died"
msgstr ""
-#: commit.c:53
+#: commit.c:54
#, c-format
msgid "could not parse %s"
-msgstr ""
+msgstr "„%s“ не може да Ñе анализира"
-#: commit.c:55
+#: commit.c:56
#, c-format
msgid "%s %s is not a commit!"
-msgstr ""
+msgstr "%s %s не е подаване!"
#: compat/obstack.c:406 compat/obstack.c:408
msgid "memory exhausted"
-msgstr ""
+msgstr "паметта Ñвърши"
#: connected.c:70
msgid "Could not run 'git rev-list'"
-msgstr ""
+msgstr "Командата „git rev-list“ не може да бъде изпълнена."
#: connected.c:90
#, c-format
msgid "failed write to rev-list: %s"
-msgstr ""
+msgstr "неуÑпешен Ð·Ð°Ð¿Ð¸Ñ Ð² ÑпиÑъка Ñ Ð²ÐµÑ€Ñиите: %s"
#: connected.c:98
#, c-format
msgid "failed to close rev-list's stdin: %s"
-msgstr ""
+msgstr "ÑтандартниÑÑ‚ вход на ÑпиÑъка Ñ Ð²ÐµÑ€Ñиите не може да бъде затворен: %s"
#: date.c:95
msgid "in the future"
@@ -487,6 +511,7 @@ msgid_plural "%lu years"
msgstr[0] ""
msgstr[1] ""
+#. TRANSLATORS: "%s" is "<n> years"
#: date.c:149
#, c-format
msgid "%s, %lu month ago"
@@ -504,22 +529,28 @@ msgstr[1] ""
#: diffcore-order.c:24
#, c-format
msgid "failed to read orderfile '%s'"
-msgstr ""
+msgstr "файлът Ñ Ð¿Ð¾Ð´Ñ€ÐµÐ´Ð±Ð°Ñ‚Ð° на ÑъответÑтвиÑта „%s“ не може да бъде прочетен"
+
+#: diffcore-rename.c:517
+msgid "Performing inexact rename detection"
+msgstr "ТърÑене на Ð¿Ñ€ÐµÐ¸Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð¸Ñ Ð½Ð° обекти Ñъчетани Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ð¸"
#: diff.c:113
#, c-format
msgid " Failed to parse dirstat cut-off percentage '%s'\n"
msgstr ""
+" ÐеуÑпешно разпознаване на „%s“ като процент-праг за ÑтатиÑтиката по "
+"директории\n"
#: diff.c:118
#, c-format
msgid " Unknown dirstat parameter '%s'\n"
-msgstr ""
+msgstr " Ðепознат параметър „%s“ за ÑтатиÑтиката по директории'\n"
#: diff.c:213
#, c-format
msgid "Unknown value for 'diff.submodule' config variable: '%s'"
-msgstr ""
+msgstr "Ðепозната ÑтойноÑÑ‚ „%s“ за наÑтройката „diff.submodule“"
#: diff.c:263
#, c-format
@@ -527,70 +558,74 @@ msgid ""
"Found errors in 'diff.dirstat' config variable:\n"
"%s"
msgstr ""
+"Грешки в наÑтройката „diff.dirstat“:\n"
+"%s"
-#: diff.c:3509
+#: diff.c:3495
#, c-format
msgid ""
"Failed to parse --dirstat/-X option parameter:\n"
"%s"
msgstr ""
+"Ðеразпознат параметър към опциÑта „--dirstat/-X“:\n"
+"%s"
-#: diff.c:3523
+#: diff.c:3509
#, c-format
msgid "Failed to parse --submodule option parameter: '%s'"
-msgstr ""
+msgstr "Ðеразпознат параметър към опциÑта „--submodule“: „%s“"
#: gpg-interface.c:59 gpg-interface.c:131
msgid "could not run gpg."
-msgstr ""
+msgstr "Програмата „gpg“ не може да бъде Ñтартирана."
#: gpg-interface.c:71
msgid "gpg did not accept the data"
-msgstr ""
+msgstr "Програмата „gpg“ не прие подадените данни."
#: gpg-interface.c:82
msgid "gpg failed to sign the data"
-msgstr ""
+msgstr "Програмата „gpg“ не подпиÑа данните."
#: gpg-interface.c:115
#, c-format
msgid "could not create temporary file '%s': %s"
-msgstr ""
+msgstr "Програмата „gpg“ не уÑÐ¿Ñ Ð´Ð° Ñъздаде Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» „%s“: %s"
#: gpg-interface.c:118
#, c-format
msgid "failed writing detached signature to '%s': %s"
-msgstr ""
+msgstr "Програмата „gpg“ не уÑÐ¿Ñ Ð´Ð° запише ÑамоÑтоÑÑ‚ÐµÐ»Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñ ÐºÑŠÐ¼ „%s“: %s"
-#: grep.c:1695
+#: grep.c:1698
#, c-format
msgid "'%s': unable to read %s"
-msgstr ""
+msgstr "„%s“: файлът Ñочен от „%s“ не може да бъде прочетен"
-#: grep.c:1712
+#: grep.c:1715
#, c-format
msgid "'%s': %s"
-msgstr ""
+msgstr "„%s“: „%s“"
-#: grep.c:1723
+#: grep.c:1726
#, c-format
msgid "'%s': short read %s"
-msgstr ""
+msgstr "„%s“: изчитането на „%s“ върна по-малко байтове от заÑвените"
-#: help.c:210
+#: help.c:209
#, c-format
msgid "available git commands in '%s'"
msgstr "налични команди на git от „%s“"
-#: help.c:217
+#: help.c:216
msgid "git commands available from elsewhere on your $PATH"
msgstr "команди на git от други директории от Ð¿ÑŠÑ‚Ñ â€ž$PATH“"
-#: help.c:233
+#: help.c:232
msgid "The most commonly used git commands are:"
msgstr "Ðай-чеÑто употребÑваните команди на git Ñа:"
-#: help.c:290
+#: help.c:289
#, c-format
msgid ""
"'%s' appears to be a git command, but we were not\n"
@@ -599,11 +634,12 @@ msgstr ""
"Изглежда, че „%s“ е команда на git, но Ñ‚Ñ Ð½Ðµ може да\n"
"бъде изпълнена. ВероÑтно пакетът „git-%s“ е повреден."
-#: help.c:347
+# FIXME bad message
+#: help.c:346
msgid "Uh oh. Your system reports no Git commands at all."
msgstr "Странно, изглежда, че на ÑиÑтемата ви нÑма нито една команда на git."
-#: help.c:369
+#: help.c:368
#, c-format
msgid ""
"WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -614,17 +650,17 @@ msgstr ""
"ÑъщеÑтвува. Изпълнението автоматично продължава, като Ñе Ñчита, че имате "
"предвид „%s“"
-#: help.c:374
+#: help.c:373
#, c-format
msgid "in %0.1f seconds automatically..."
msgstr "Ñлед %0.1f Ñекунди…"
-#: help.c:381
+#: help.c:380
#, 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
+#: help.c:384 help.c:443
msgid ""
"\n"
"Did you mean this?"
@@ -638,7 +674,7 @@ msgstr[1] ""
"\n"
"Команди Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ име Ñа:"
-#: help.c:440
+#: help.c:439
#, c-format
msgid "%s: %s - %s"
msgstr "%s: %s — %s"
@@ -647,305 +683,305 @@ msgstr "%s: %s — %s"
msgid "failed to read the cache"
msgstr ""
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
#: builtin/clone.c:661
msgid "unable to write new index file"
-msgstr ""
+msgstr "неуÑпешно запиÑване на Ð½Ð¾Ð²Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑ"
#: merge-recursive.c:190
#, c-format
msgid "(bad commit)\n"
msgstr ""
-#: merge-recursive.c:206
+#: merge-recursive.c:208
#, c-format
msgid "addinfo_cache failed for path '%s'"
msgstr ""
-#: merge-recursive.c:269
+#: merge-recursive.c:271
msgid "error building trees"
msgstr ""
-#: merge-recursive.c:673
+#: merge-recursive.c:675
#, c-format
msgid "failed to create path '%s'%s"
msgstr ""
-#: merge-recursive.c:684
+#: merge-recursive.c:686
#, 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
+#: merge-recursive.c:700 merge-recursive.c:721
msgid ": perhaps a D/F conflict?"
msgstr ""
-#: merge-recursive.c:709
+#: merge-recursive.c:711
#, c-format
msgid "refusing to lose untracked file at '%s'"
msgstr ""
-#: merge-recursive.c:749
+#: merge-recursive.c:751
#, c-format
msgid "cannot read object %s '%s'"
msgstr ""
-#: merge-recursive.c:751
+#: merge-recursive.c:753
#, c-format
msgid "blob expected for %s '%s'"
msgstr ""
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
#, c-format
msgid "failed to open '%s'"
-msgstr ""
+msgstr "директориÑта „%s“ не може да бъде отворена"
-#: merge-recursive.c:782
+#: merge-recursive.c:784
#, c-format
msgid "failed to symlink '%s'"
msgstr ""
-#: merge-recursive.c:785
+#: merge-recursive.c:787
#, c-format
msgid "do not know what to do with %06o %s '%s'"
msgstr ""
-#: merge-recursive.c:923
+#: merge-recursive.c:925
msgid "Failed to execute internal merge"
msgstr ""
-#: merge-recursive.c:927
+#: merge-recursive.c:929
#, c-format
msgid "Unable to add %s to database"
msgstr ""
-#: merge-recursive.c:943
+#: merge-recursive.c:945
msgid "unsupported object type in the tree"
msgstr ""
-#: merge-recursive.c:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
#, 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
+#: merge-recursive.c:1030 merge-recursive.c:1043
#, 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
+#: merge-recursive.c:1084
msgid "rename"
msgstr ""
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
msgid "renamed"
-msgstr ""
+msgstr "преименуван"
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
#, c-format
msgid "%s is a directory in %s adding as %s instead"
msgstr ""
-#: merge-recursive.c:1160
+#: merge-recursive.c:1162
#, c-format
msgid ""
"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
"\"->\"%s\" in \"%s\"%s"
msgstr ""
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
msgid " (left unresolved)"
msgstr ""
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
#, c-format
msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
msgstr ""
-#: merge-recursive.c:1249
+#: merge-recursive.c:1251
#, c-format
msgid "Renaming %s to %s and %s to %s instead"
msgstr ""
-#: merge-recursive.c:1448
+#: merge-recursive.c:1450
#, c-format
msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
msgstr ""
-#: merge-recursive.c:1458
+#: merge-recursive.c:1460
#, c-format
msgid "Adding merged %s"
msgstr ""
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
#, c-format
msgid "Adding as %s instead"
msgstr ""
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
#, c-format
msgid "cannot read object %s"
msgstr ""
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
#, c-format
msgid "object %s is not a blob"
msgstr ""
-#: merge-recursive.c:1565
+#: merge-recursive.c:1567
msgid "modify"
msgstr ""
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
msgid "modified"
-msgstr ""
+msgstr "променен"
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
msgid "content"
msgstr ""
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
msgid "add/add"
msgstr ""
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
#, c-format
msgid "Skipped %s (merged same as existing)"
msgstr ""
-#: merge-recursive.c:1630
+#: merge-recursive.c:1632
#, c-format
msgid "Auto-merging %s"
msgstr ""
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
msgid "submodule"
-msgstr ""
+msgstr "ПОДМОДУЛ"
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
#, c-format
msgid "CONFLICT (%s): Merge conflict in %s"
msgstr ""
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
#, c-format
msgid "Removing %s"
-msgstr ""
+msgstr "Изтриване на „%s“"
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
msgid "file/directory"
msgstr ""
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
msgid "directory/file"
msgstr ""
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
#, c-format
msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
msgstr ""
-#: merge-recursive.c:1771
+#: merge-recursive.c:1773
#, c-format
msgid "Adding %s"
msgstr ""
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
msgid "Fatal merge failure, shouldn't happen."
msgstr ""
-#: merge-recursive.c:1807
+#: merge-recursive.c:1809
msgid "Already up-to-date!"
msgstr ""
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
#, c-format
msgid "merging of trees %s and %s failed"
msgstr ""
-#: merge-recursive.c:1846
+#: merge-recursive.c:1848
#, c-format
msgid "Unprocessed path??? %s"
msgstr ""
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
msgid "Merging:"
msgstr ""
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
#, c-format
msgid "found %u common ancestor:"
msgid_plural "found %u common ancestors:"
msgstr[0] ""
msgstr[1] ""
-#: merge-recursive.c:1941
+#: merge-recursive.c:1943
msgid "merge returned no commit"
msgstr ""
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
#, c-format
msgid "Could not parse object '%s'"
msgstr ""
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
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 ""
+msgstr "Лоша ÑтойноÑÑ‚ за „notes.rewriteMode“: „%s“"
#: notes-utils.c:91
#, c-format
msgid "Refusing to rewrite notes in %s (outside of refs/notes/)"
msgstr ""
+"Бележките в „%s“ нÑма да бъдат презапиÑани, защото Ñа извън „refs/notes/“."
#. 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 ""
+msgstr "Зададена е лоша ÑтойноÑÑ‚ на променливата „%s“: „%s“"
-#: object.c:202
+#: object.c:229
#, c-format
msgid "unable to parse object: %s"
-msgstr ""
+msgstr "обектът „%s“ не може да бъде анализиран"
-#: parse-options.c:537
+#: parse-options.c:532
msgid "..."
msgstr "…"
-#: parse-options.c:555
+#: parse-options.c:550
#, c-format
msgid "usage: %s"
msgstr "употреба: %s"
#. TRANSLATORS: the colon here should align with the
#. one in "usage: %s" translation
-#: parse-options.c:559
+#: parse-options.c:554
#, c-format
msgid " or: %s"
msgstr " или: %s"
-#: parse-options.c:562
+#: parse-options.c:557
#, c-format
msgid " %s"
msgstr " %s"
-#: parse-options.c:596
+#: parse-options.c:591
msgid "-NUM"
msgstr "-ЧИСЛО"
@@ -993,11 +1029,6 @@ msgstr ""
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"
@@ -1014,56 +1045,74 @@ msgid ""
"Perhaps you forgot to add either ':/' or '.' ?"
msgstr ""
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr "дейÑтвието завърши"
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"Зададена е неправилна ÑтойноÑÑ‚ на наÑтройката „index.version“.\n"
+"Ще Ñе ползва верÑÐ¸Ñ %i"
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"Зададена е неправилна ÑтойноÑÑ‚ на променливата на Ñредата "
+"„GIT_INDEX_VERSION“.\n"
+"Ще Ñе ползва верÑÐ¸Ñ %i"
+
+#: remote.c:758
#, c-format
msgid "Cannot fetch both %s and %s to %s"
msgstr "Ðевъзможно е да Ñе доÑтавÑÑ‚ едновременно и „%s“, и „%s“ към „%s“"
-#: remote.c:757
+#: remote.c:762
#, c-format
msgid "%s usually tracks %s, not %s"
msgstr "„%s“ обикновено Ñледи „%s“, а не „%s“"
-#: remote.c:761
+#: remote.c:766
#, 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
+#: remote.c:774
msgid "Internal error"
msgstr "Вътрешна грешка"
-#: remote.c:1871
+#: remote.c:1948
#, c-format
msgid "Your branch is based on '%s', but the upstream is gone.\n"
msgstr "Този клон Ñледи „%s“, но ÑледениÑÑ‚ клон е изтрит.\n"
-#: remote.c:1875
+#: remote.c:1952
msgid " (use \"git branch --unset-upstream\" to fixup)\n"
-msgstr " (за да коригирате това използвайте „git branch --unset-upstream“)\n"
+msgstr " (за да коригирате това, използвайте „git branch --unset-upstream“)\n"
-#: remote.c:1878
+#: remote.c:1955
#, c-format
msgid "Your branch is up-to-date with '%s'.\n"
msgstr "Клонът е актуализиран както „%s“.\n"
-#: remote.c:1882
+#: remote.c:1959
#, 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
+#: remote.c:1965
msgid " (use \"git push\" to publish your local commits)\n"
msgstr " (публикувайте локалните Ñи промени чрез „git push“)\n"
-#: remote.c:1891
+#: remote.c:1968
#, c-format
msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
msgid_plural ""
@@ -1073,11 +1122,11 @@ msgstr[0] ""
msgstr[1] ""
"Клонът ви е Ñ %2$d Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ñлед „%1$s“ и може да бъде тривиално ÑлÑÑ‚.\n"
-#: remote.c:1899
+#: remote.c:1976
msgid " (use \"git pull\" to update your local branch)\n"
msgstr " (обновете Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ Ñи клон чрез „git pull“)\n"
-#: remote.c:1902
+#: remote.c:1979
#, c-format
msgid ""
"Your branch and '%s' have diverged,\n"
@@ -1092,7 +1141,7 @@ msgstr[1] ""
"ТекущиÑÑ‚ клон Ñе е отделил от „%s“,\n"
"двата имат Ñъответно по %d и %d неÑъвпадащи подаваниÑ.\n"
-#: remote.c:1912
+#: remote.c:1989
msgid " (use \"git pull\" to merge the remote branch into yours)\n"
msgstr " (Ñлейте Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½ в Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ Ñ‡Ñ€ÐµÐ· „git pull“)\n"
@@ -1105,14 +1154,14 @@ msgstr "неуÑпешно отварÑне на „/dev/null“"
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
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
#, 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
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
#, c-format
msgid "Could not write to '%s'"
msgstr ""
@@ -1130,7 +1179,7 @@ msgid ""
"and commit the result with 'git commit'"
msgstr ""
-#: sequencer.c:245 sequencer.c:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
#, c-format
msgid "Could not write to %s"
msgstr ""
@@ -1156,7 +1205,7 @@ msgstr ""
#: sequencer.c:325
#, c-format
msgid "%s: Unable to write new index file"
-msgstr ""
+msgstr "%s: новиÑÑ‚ Ð¸Ð½Ð´ÐµÐºÑ Ð½Ðµ може да бъде запазен"
#: sequencer.c:356
msgid "Could not resolve HEAD commit\n"
@@ -1166,184 +1215,184 @@ msgstr ""
msgid "Unable to update cache tree\n"
msgstr ""
-#: sequencer.c:423
+#: sequencer.c:430
#, c-format
msgid "Could not parse commit %s\n"
msgstr ""
-#: sequencer.c:428
+#: sequencer.c:435
#, c-format
msgid "Could not parse parent commit %s\n"
msgstr ""
-#: sequencer.c:494
+#: sequencer.c:501
msgid "Your index file is unmerged."
-msgstr ""
+msgstr "ИндекÑÑŠÑ‚ не е ÑлÑÑ‚."
-#: sequencer.c:513
+#: sequencer.c:520
#, c-format
msgid "Commit %s is a merge but no -m option was given."
msgstr ""
-#: sequencer.c:521
+#: sequencer.c:528
#, c-format
msgid "Commit %s does not have parent %d"
msgstr ""
-#: sequencer.c:525
+#: sequencer.c:532
#, 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
+#: sequencer.c:545
#, c-format
msgid "%s: cannot parse parent commit %s"
msgstr ""
-#: sequencer.c:542
+#: sequencer.c:549
#, c-format
msgid "Cannot get commit message for %s"
msgstr ""
-#: sequencer.c:628
+#: sequencer.c:635
#, c-format
msgid "could not revert %s... %s"
msgstr ""
-#: sequencer.c:629
+#: sequencer.c:636
#, c-format
msgid "could not apply %s... %s"
msgstr ""
-#: sequencer.c:665
+#: sequencer.c:672
msgid "empty commit set passed"
msgstr ""
-#: sequencer.c:673
+#: sequencer.c:680
#, c-format
msgid "git %s: failed to read the index"
msgstr ""
-#: sequencer.c:678
+#: sequencer.c:685
#, c-format
msgid "git %s: failed to refresh the index"
msgstr ""
-#: sequencer.c:736
+#: sequencer.c:743
#, c-format
msgid "Cannot %s during a %s"
msgstr ""
-#: sequencer.c:758
+#: sequencer.c:765
#, c-format
msgid "Could not parse line %d."
msgstr ""
-#: sequencer.c:763
+#: sequencer.c:770
msgid "No commits parsed."
msgstr ""
-#: sequencer.c:776
+#: sequencer.c:783
#, c-format
msgid "Could not open %s"
msgstr ""
-#: sequencer.c:780
+#: sequencer.c:787
#, c-format
msgid "Could not read %s."
msgstr ""
-#: sequencer.c:787
+#: sequencer.c:794
#, c-format
msgid "Unusable instruction sheet: %s"
msgstr ""
-#: sequencer.c:815
+#: sequencer.c:824
#, c-format
msgid "Invalid key: %s"
msgstr ""
-#: sequencer.c:818
+#: sequencer.c:827
#, c-format
msgid "Invalid value for %s: %s"
msgstr ""
-#: sequencer.c:830
+#: sequencer.c:839
#, c-format
msgid "Malformed options sheet: %s"
msgstr ""
-#: sequencer.c:851
+#: sequencer.c:860
msgid "a cherry-pick or revert is already in progress"
msgstr ""
-#: sequencer.c:852
+#: sequencer.c:861
msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
msgstr ""
-#: sequencer.c:856
+#: sequencer.c:865
#, c-format
msgid "Could not create sequencer directory %s"
msgstr ""
-#: sequencer.c:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
#, c-format
msgid "Error wrapping up %s."
msgstr ""
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
msgid "no cherry-pick or revert in progress"
msgstr ""
-#: sequencer.c:893
+#: sequencer.c:902
msgid "cannot resolve HEAD"
msgstr ""
-#: sequencer.c:895
+#: sequencer.c:904
msgid "cannot abort from a branch yet to be born"
msgstr ""
-#: sequencer.c:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
#, c-format
msgid "cannot open %s: %s"
msgstr ""
-#: sequencer.c:920
+#: sequencer.c:929
#, c-format
msgid "cannot read %s: %s"
msgstr ""
-#: sequencer.c:921
+#: sequencer.c:930
msgid "unexpected end of file"
msgstr ""
-#: sequencer.c:927
+#: sequencer.c:936
#, c-format
msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
msgstr ""
-#: sequencer.c:950
+#: sequencer.c:959
#, c-format
msgid "Could not format %s."
msgstr ""
-#: sequencer.c:1093
+#: sequencer.c:1104
#, c-format
msgid "%s: can't cherry-pick a %s"
msgstr ""
-#: sequencer.c:1096
+#: sequencer.c:1107
#, c-format
msgid "%s: bad revision"
msgstr ""
-#: sequencer.c:1130
+#: sequencer.c:1141
msgid "Can't revert as initial commit"
msgstr ""
-#: sequencer.c:1131
+#: sequencer.c:1142
msgid "Can't cherry-pick into empty head"
msgstr ""
@@ -1359,80 +1408,76 @@ msgid ""
"examine these refs and maybe delete them. Turn this message off by\n"
"running \"git config advice.objectNameWarning false\""
msgstr ""
+"При нормална работа git никога не Ñъздава указатели, които завършват Ñ 40\n"
+"шеÑтнаÑетични знаци, защото те ще бъдат преÑкачани, когато указвате \n"
+"шеÑтнайÑетични знаци. Една възможноÑÑ‚ е такива указатели да Ñа Ñъздадени\n"
+"по погрешка. Ðапример:\n"
+"\n"
+" git checkout -b $BRANCH $(git rev-parse…)\n"
+"\n"
+"където ÑтойноÑтта на променливата на Ñредата BRANCH е празна, при което Ñе\n"
+"Ñъздава подобен указател. Прегледайте тези указатели и ги изтрийте. Можете "
+"да\n"
+"Ñпрете това Ñъобщение като изпълнете „git config advice.objectNameWarning "
+"false“"
-#: sha1_name.c:1109
+#: sha1_name.c:1072
msgid "HEAD does not point to a branch"
-msgstr ""
+msgstr "УказателÑÑ‚ „HEAD“ не Ñочи към клон"
-#: sha1_name.c:1112
+#: sha1_name.c:1075
#, c-format
msgid "No such branch: '%s'"
-msgstr ""
+msgstr "Ðе ÑъщеÑтвува клон на име „%s“"
-#: sha1_name.c:1114
+#: sha1_name.c:1077
#, c-format
msgid "No upstream configured for branch '%s'"
-msgstr ""
+msgstr "Ðе е зададен клон-източник за клона „%s“"
-#: sha1_name.c:1118
+#: sha1_name.c:1081
#, c-format
msgid "Upstream branch '%s' not stored as a remote-tracking branch"
-msgstr ""
+msgstr "Клонът-източник „%s“ не е Ñъхранен като ÑледÑщ клон"
#: submodule.c:64 submodule.c:98
msgid "Cannot change unmerged .gitmodules, resolve merge conflicts first"
msgstr ""
+"ÐеÑлетите файлове „.gitmodules“ не могат да бъдат променÑни. Първо "
+"коригирайте конфликтите"
#: submodule.c:68 submodule.c:102
#, c-format
msgid "Could not find section in .gitmodules where path=%s"
-msgstr ""
+msgstr "Във файла „.gitmodules“ липÑва раздел за Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ â€žpath=%s“"
-#. Maybe the user already did that, don't error out here
#: submodule.c:76
#, c-format
msgid "Could not update .gitmodules entry %s"
-msgstr ""
+msgstr "ЗапиÑÑŠÑ‚ „%s“ във файла „.gitmodules“ не може да бъде променен"
-#. 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 ""
+msgstr "ЗапиÑÑŠÑ‚ „%s“ във файла „.gitmodules“ не може да бъде изтрит"
-#: submodule.c:139
-msgid "unable to remove .gitmodules from index"
-msgstr ""
-
-#: submodule.c:141
-msgid "adding updated .gitmodules failed"
-msgstr ""
-
-#: submodule.c:143
+#: submodule.c:120
msgid "staging updated .gitmodules failed"
-msgstr ""
+msgstr "неуÑпешно добавÑне в индекÑа на Ð¿Ñ€Ð¾Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð» „.gitmodules“"
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 builtin/init-db.c:363
#, c-format
msgid "Could not create git link %s"
-msgstr ""
+msgstr "Връзката в Git „%s“ не може да бъде Ñъздадена"
-#: submodule.c:1155
+#: submodule.c:1132
#, c-format
msgid "Could not set core.worktree in %s"
-msgstr ""
+msgstr "Ð’ „%s“ не може да Ñе зададе наÑтройката „core.worktree“"
+
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr "ИзтеглÑне на файлове"
#: urlmatch.c:120
msgid "invalid URL scheme name or missing '://' suffix"
@@ -1466,623 +1511,623 @@ msgstr ""
#: wrapper.c:422
#, c-format
msgid "unable to access '%s': %s"
-msgstr ""
+msgstr "нÑма доÑтъп до „%s“: %s"
#: wrapper.c:443
#, c-format
msgid "unable to access '%s'"
-msgstr ""
+msgstr "нÑма доÑтъп до „%s“"
#: wrapper.c:454
#, c-format
msgid "unable to look up current user in the passwd file: %s"
-msgstr ""
+msgstr "текущиÑÑ‚ потребител не може да бъде открит във файла „/etc/passwd“: %s"
#: wrapper.c:455
msgid "no such user"
-msgstr ""
+msgstr "такъв потребител не ÑъщеÑтвува"
#: wt-status.c:150
msgid "Unmerged paths:"
-msgstr ""
+msgstr "ÐеÑлети пътища:"
#: wt-status.c:177 wt-status.c:204
#, c-format
msgid " (use \"git reset %s <file>...\" to unstage)"
-msgstr ""
+msgstr " (използвайте „git reset %s ФÐЙЛ…“, за да извадите ФÐЙЛа от индекÑа)"
#: wt-status.c:179 wt-status.c:206
msgid " (use \"git rm --cached <file>...\" to unstage)"
msgstr ""
+" (използвайте „git rm --cached %s ФÐЙЛ…“, за да извадите ФÐЙЛа от индекÑа)"
#: wt-status.c:183
msgid " (use \"git add <file>...\" to mark resolution)"
msgstr ""
+" (използвайте „git add ФÐЙЛ…“, за да укажете разрешаването на конфликта)"
#: wt-status.c:185 wt-status.c:189
msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)"
msgstr ""
+" (използвайте „git add/rm ФÐЙЛ…“, Ñпоред решението, което избирате за "
+"конфликта)"
#: wt-status.c:187
msgid " (use \"git rm <file>...\" to mark resolution)"
msgstr ""
+" (използвайте „git rm ФÐЙЛ…“, за да укажете разрешаването на конфликта)"
#: wt-status.c:198
msgid "Changes to be committed:"
-msgstr ""
+msgstr "Промени, които ще бъдат подадени:"
#: wt-status.c:216
msgid "Changes not staged for commit:"
-msgstr ""
+msgstr "Промени, които не Ñа в индекÑа за подаване:"
#: wt-status.c:220
msgid " (use \"git add <file>...\" to update what will be committed)"
msgstr ""
+" (използвайте „git add ФÐЙЛ…“, за да обновите Ñъдържанието за подаване)"
#: wt-status.c:222
msgid " (use \"git add/rm <file>...\" to update what will be committed)"
msgstr ""
+" (използвайте „git add/rm ФÐЙЛ…“, за да обновите Ñъдържанието за подаване)"
#: wt-status.c:223
msgid ""
" (use \"git checkout -- <file>...\" to discard changes in working directory)"
msgstr ""
+" (използвайте „git checkout -- ФÐЙЛ…“, за да отхвърлите промените в "
+"работното дърво)"
#: 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 ""
+" (използвайте „git %s ФÐЙЛ…“, за да определите какво включвате в подаването)"
-#: wt-status.c:254
-msgid "bug"
-msgstr ""
-
-#: wt-status.c:259
+#: wt-status.c:252
msgid "both deleted:"
-msgstr ""
+msgstr "изтрити в двата ÑлучаÑ:"
-#: wt-status.c:260
+#: wt-status.c:254
msgid "added by us:"
-msgstr ""
+msgstr "добавени от ваÑ:"
-#: wt-status.c:261
+#: wt-status.c:256
msgid "deleted by them:"
-msgstr ""
+msgstr "изтрити от Ñ‚ÑÑ…:"
-#: wt-status.c:262
+#: wt-status.c:258
msgid "added by them:"
-msgstr ""
+msgstr "добавени от Ñ‚ÑÑ…:"
-#: wt-status.c:263
+#: wt-status.c:260
msgid "deleted by us:"
-msgstr ""
+msgstr "изтрити от наÑ:"
-#: wt-status.c:264
+#: wt-status.c:262
msgid "both added:"
-msgstr ""
+msgstr "добавени и в двата ÑлучаÑ:"
-#: wt-status.c:265
+#: wt-status.c:264
msgid "both modified:"
-msgstr ""
+msgstr "променени и в двата ÑлучаÑ:"
-#: wt-status.c:275
-msgid "new file"
-msgstr ""
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "грешка: ÑÑŠÑтоÑнието на промÑната „%x“ не може да бъде обработено"
-#: wt-status.c:277
-msgid "copied"
-msgstr ""
+#: wt-status.c:274
+msgid "new file:"
+msgstr "нов файл:"
-#: wt-status.c:279
-msgid "deleted"
-msgstr ""
+#: wt-status.c:276
+msgid "copied:"
+msgstr "копиран:"
-#: wt-status.c:285
-msgid "typechange"
-msgstr ""
+#: wt-status.c:278
+msgid "deleted:"
+msgstr "изтрит:"
-#: wt-status.c:287
-msgid "unknown"
-msgstr ""
+#: wt-status.c:280
+msgid "modified:"
+msgstr "променен:"
-#: wt-status.c:289
-msgid "unmerged"
-msgstr ""
+#: wt-status.c:282
+msgid "renamed:"
+msgstr "преименуван:"
+
+#: wt-status.c:284
+msgid "typechange:"
+msgstr "ÑмÑна на вида:"
+
+#: wt-status.c:286
+msgid "unknown:"
+msgstr "непозната промÑна:"
-#: wt-status.c:336
+#: wt-status.c:288
+msgid "unmerged:"
+msgstr "неÑлÑÑ‚:"
+
+#: wt-status.c:370
msgid "new commits, "
-msgstr ""
+msgstr "нови подаваниÑ, "
-#: wt-status.c:338
+#: wt-status.c:372
msgid "modified content, "
-msgstr ""
+msgstr "променено Ñъдържание, "
-#: wt-status.c:340
+#: wt-status.c:374
msgid "untracked content, "
-msgstr ""
+msgstr "неÑледено Ñъдържание, "
-#: wt-status.c:357
+#: wt-status.c:391
#, c-format
msgid "bug: unhandled diff status %c"
-msgstr ""
+msgstr "грешка: ÑÑŠÑтоÑнието на промÑната „%c“ не може да бъде обработено"
-#: wt-status.c:732
+#: wt-status.c:765
msgid "Submodules changed but not updated:"
-msgstr ""
+msgstr "Подмодулите Ñа променени, но не Ñа обновени:"
-#: wt-status.c:734
+#: wt-status.c:767
msgid "Submodule changes to be committed:"
-msgstr ""
+msgstr "Промени в подмодулите за подаване:"
-#: wt-status.c:836
+#: wt-status.c:846
msgid ""
"Do not touch the line above.\n"
"Everything below will be removed."
msgstr ""
+"Ðе променÑйте Ð³Ð¾Ñ€Ð½Ð¸Ñ Ñ€ÐµÐ´.\n"
+"Ð’Ñичко отдолу ще бъде изтрито."
-#: wt-status.c:899
+#: wt-status.c:937
msgid "You have unmerged paths."
-msgstr ""
+msgstr "ÐÑкои пътища не Ñа Ñлети."
-#: wt-status.c:902
+#: wt-status.c:940
msgid " (fix conflicts and run \"git commit\")"
-msgstr ""
+msgstr " (коригирайте конфликтите и изпълнете „git commit“)"
-#: wt-status.c:905
+#: wt-status.c:943
msgid "All conflicts fixed but you are still merging."
-msgstr ""
+msgstr "Ð’Ñички конфликти Ñа решени, но продължавате Ñливането."
-#: wt-status.c:908
+#: wt-status.c:946
msgid " (use \"git commit\" to conclude merge)"
-msgstr ""
+msgstr " (използвайте „git commit“, за да завършите Ñливането)"
-#: wt-status.c:918
+#: wt-status.c:956
msgid "You are in the middle of an am session."
-msgstr ""
+msgstr "В момента прилагате поредица от кръпки чрез „git am“."
-#: wt-status.c:921
+#: wt-status.c:959
msgid "The current patch is empty."
-msgstr ""
+msgstr "Текущата кръпка е празна."
-#: wt-status.c:925
+#: wt-status.c:963
msgid " (fix conflicts and then run \"git am --continue\")"
-msgstr ""
+msgstr " (коригирайте конфликтите и изпълнете „git am --continue“)"
-#: wt-status.c:927
+#: wt-status.c:965
msgid " (use \"git am --skip\" to skip this patch)"
-msgstr ""
+msgstr " (използвайте „git am --skip“, за да пропуÑнете тази кръпка)"
-#: wt-status.c:929
+#: wt-status.c:967
msgid " (use \"git am --abort\" to restore the original branch)"
msgstr ""
+" (използвайте „git am --abort“, за да възÑтановите Ð¿ÑŠÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½)"
-#: wt-status.c:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
#, c-format
msgid "You are currently rebasing branch '%s' on '%s'."
-msgstr ""
+msgstr "В момента пребазирате клона „%s“ върху „%s“."
-#: wt-status.c:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
msgid "You are currently rebasing."
-msgstr ""
+msgstr "В момента пребазирате."
-#: wt-status.c:997
+#: wt-status.c:1035
msgid " (fix conflicts and then run \"git rebase --continue\")"
-msgstr ""
+msgstr " (коригирайте конфликтите и използвайте „git rebase --continue“)"
-#: wt-status.c:999
+#: wt-status.c:1037
msgid " (use \"git rebase --skip\" to skip this patch)"
-msgstr ""
+msgstr " (използвайте „git rebase --skip“, за да пропуÑнете тази кръпка)"
-#: wt-status.c:1001
+#: wt-status.c:1039
msgid " (use \"git rebase --abort\" to check out the original branch)"
msgstr ""
+" (използвайте „git rebase --abort“, за да възÑтановите Ð¿ÑŠÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½)"
-#: wt-status.c:1014
+#: wt-status.c:1052
msgid " (all conflicts fixed: run \"git rebase --continue\")"
-msgstr ""
+msgstr " (вÑички конфликти Ñа коригирани: изпълнете „git rebase --continue“)"
-#: wt-status.c:1018
+#: wt-status.c:1056
#, c-format
msgid ""
"You are currently splitting a commit while rebasing branch '%s' on '%s'."
-msgstr ""
+msgstr "Ð’ момента разделÑте подаване докато пребазирате клона „%s“ върху „%s“."
-#: wt-status.c:1023
+#: wt-status.c:1061
msgid "You are currently splitting a commit during a rebase."
-msgstr ""
+msgstr "Ð’ момента разделÑте подаване докато пребазирате."
-#: wt-status.c:1026
+#: wt-status.c:1064
msgid " (Once your working directory is clean, run \"git rebase --continue\")"
msgstr ""
+" (След като работното ви дърво Ñтане чиÑто, използвайте „git rebase --"
+"continue“)"
-#: wt-status.c:1030
+#: wt-status.c:1068
#, c-format
msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
msgstr ""
+"В момента редактирате подаване докато пребазирате клона „%s“ върху „%s“."
-#: wt-status.c:1035
+#: wt-status.c:1073
msgid "You are currently editing a commit during a rebase."
-msgstr ""
+msgstr "В момента редактирате подаване докато пребазирате."
-#: wt-status.c:1038
+#: wt-status.c:1076
msgid " (use \"git commit --amend\" to amend the current commit)"
msgstr ""
+" (използвайте „git commit --amend“, за да редактирате текущото подаване)"
-#: wt-status.c:1040
+#: wt-status.c:1078
msgid ""
" (use \"git rebase --continue\" once you are satisfied with your changes)"
msgstr ""
+" (използвайте „git rebase --continue“, Ñлед като завършите промените Ñи)"
-#: wt-status.c:1050
+#: wt-status.c:1088
#, c-format
msgid "You are currently cherry-picking commit %s."
-msgstr ""
+msgstr "В момента отбирате подаването „%s“."
-#: wt-status.c:1055
+#: wt-status.c:1093
msgid " (fix conflicts and run \"git cherry-pick --continue\")"
-msgstr ""
+msgstr " (коригирайте конфликтите и изпълнете „git cherry-pick --continue“)"
-#: wt-status.c:1058
+#: wt-status.c:1096
msgid " (all conflicts fixed: run \"git cherry-pick --continue\")"
msgstr ""
+" (вÑички конфликти Ñа коригирани, изпълнете „git cherry-pick --continue“)"
-#: wt-status.c:1060
+#: wt-status.c:1098
msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
msgstr ""
+" (използвайте „git cherry-pick --abort“, за да отмените вÑички дейÑÑ‚Ð²Ð¸Ñ Ñ "
+"отбиране)"
-#: wt-status.c:1069
+#: wt-status.c:1107
#, c-format
msgid "You are currently reverting commit %s."
-msgstr ""
+msgstr "Ð’ момента отменÑте подаване „%s“."
-#: wt-status.c:1074
+#: wt-status.c:1112
msgid " (fix conflicts and run \"git revert --continue\")"
-msgstr ""
+msgstr " (коригирайте конфликтите и изпълнете „git revert --continue“)"
-#: wt-status.c:1077
+#: wt-status.c:1115
msgid " (all conflicts fixed: run \"git revert --continue\")"
-msgstr ""
+msgstr " (вÑички конфликти Ñа коригирани, изпълнете „git revert --continue“)"
-#: wt-status.c:1079
+#: wt-status.c:1117
msgid " (use \"git revert --abort\" to cancel the revert operation)"
msgstr ""
+" (използвайте „git revert --abort“, за да преуÑтановите отмÑната на "
+"подаване)"
-#: wt-status.c:1090
+#: wt-status.c:1128
#, c-format
msgid "You are currently bisecting, started from branch '%s'."
-msgstr ""
+msgstr "Ð’ момента Ñ‚ÑŠÑ€Ñите двоично, като Ñте Ñтартирали от клон „%s“."
-#: wt-status.c:1094
+#: wt-status.c:1132
msgid "You are currently bisecting."
-msgstr ""
+msgstr "Ð’ момента Ñ‚ÑŠÑ€Ñите двоично."
-#: wt-status.c:1097
+#: wt-status.c:1135
msgid " (use \"git bisect reset\" to get back to the original branch)"
msgstr ""
+" (използвайте „git bisect reset“, за да Ñе върнете към първоначалното "
+"ÑÑŠÑтоÑние и клон)"
-#: wt-status.c:1272
+#: wt-status.c:1310
msgid "On branch "
-msgstr ""
+msgstr "Ðа клон "
-#: wt-status.c:1279
+#: wt-status.c:1317
msgid "rebase in progress; onto "
-msgstr ""
+msgstr "извършвате пребазиране върху "
-#: wt-status.c:1286
+#: wt-status.c:1324
msgid "HEAD detached at "
-msgstr ""
+msgstr "УказателÑÑ‚ „HEAD“ не е Ñвързан и е на подаване "
-#: wt-status.c:1288
+#: wt-status.c:1326
msgid "HEAD detached from "
-msgstr ""
+msgstr "УказателÑÑ‚ „HEAD“ не е Ñвързан и е отделѐн от "
-#: wt-status.c:1291
+#: wt-status.c:1329
msgid "Not currently on any branch."
-msgstr ""
+msgstr "Извън вÑички клони"
-#: wt-status.c:1308
+#: wt-status.c:1346
msgid "Initial commit"
-msgstr ""
+msgstr "Първоначално подаване"
-#: wt-status.c:1322
+#: wt-status.c:1360
msgid "Untracked files"
-msgstr ""
+msgstr "ÐеÑледени файлове"
-#: wt-status.c:1324
+#: wt-status.c:1362
msgid "Ignored files"
-msgstr ""
+msgstr "Игнорирани файлове"
-#: wt-status.c:1328
+#: wt-status.c:1366
#, 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 ""
+"БÑха необходими %.2f Ñекунди за изброÑването на неÑледените файлове.\n"
+"ДобавÑнето на опциÑта „-uno“ към командата „git status“, ще уÑкори\n"
+"нещата, но не Ñ‚Ñ€Ñбва да забравÑте ръчно да добавÑте новите файлове.\n"
+"За повече подробноÑти погледнете „git status help“."
-#: wt-status.c:1334
+#: wt-status.c:1372
#, c-format
msgid "Untracked files not listed%s"
-msgstr ""
+msgstr "ÐеÑледените файлове не Ñа изведени%s"
-#: wt-status.c:1336
+#: wt-status.c:1374
msgid " (use -u option to show untracked files)"
-msgstr ""
+msgstr " (използвайте опциÑта „-u“, за да изведете неÑледените файлове)"
-#: wt-status.c:1342
+#: wt-status.c:1380
msgid "No changes"
-msgstr ""
+msgstr "ÐÑма промени"
-#: wt-status.c:1347
+#: wt-status.c:1385
#, c-format
msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
msgstr ""
+"към индекÑа за подаване не Ñа добавени промени (използвайте „git add“ и/или "
+"„git commit -a“)\n"
-#: wt-status.c:1350
+#: wt-status.c:1388
#, c-format
msgid "no changes added to commit\n"
-msgstr ""
+msgstr "към индекÑа за подаване не Ñа добавени промени\n"
-#: wt-status.c:1353
+#: wt-status.c:1391
#, c-format
msgid ""
"nothing added to commit but untracked files present (use \"git add\" to "
"track)\n"
msgstr ""
+"към индекÑа за подаване не Ñа добавени промени, но има нови файлове "
+"(използвайте „git add“, за да започне Ñ‚Ñхното Ñледене)\n"
-#: wt-status.c:1356
+#: wt-status.c:1394
#, c-format
msgid "nothing added to commit but untracked files present\n"
-msgstr ""
+msgstr "към индекÑа за подаване не Ñа добавени промени, но има нови файлове\n"
-#: wt-status.c:1359
+#: wt-status.c:1397
#, c-format
msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
msgstr ""
+"липÑват каквито и да е промени (Ñъздайте или копирайте файлове и използвайте "
+"„git add“, за да започне Ñ‚Ñхното Ñледене)\n"
-#: wt-status.c:1362 wt-status.c:1367
+#: wt-status.c:1400 wt-status.c:1405
#, c-format
msgid "nothing to commit\n"
-msgstr ""
+msgstr "липÑват каквито и да е промени\n"
-#: wt-status.c:1365
+#: wt-status.c:1403
#, c-format
msgid "nothing to commit (use -u to show untracked files)\n"
msgstr ""
+"липÑват каквито и да е промени (използвайте опциÑта „-u“, за да Ñе изведат и "
+"неÑледените файлове)\n"
-#: wt-status.c:1369
+#: wt-status.c:1407
#, c-format
msgid "nothing to commit, working directory clean\n"
-msgstr ""
+msgstr "липÑват каквито и да е промени, работното дърво е чиÑто\n"
-#: wt-status.c:1478
+#: wt-status.c:1516
msgid "HEAD (no branch)"
-msgstr ""
+msgstr "HEAD (извън клон)"
-#: wt-status.c:1484
+#: wt-status.c:1522
msgid "Initial commit on "
-msgstr ""
+msgstr "Първоначално подаване на "
-#: wt-status.c:1514
+#: wt-status.c:1554
msgid "gone"
-msgstr ""
+msgstr "изтрит"
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
msgid "behind "
-msgstr ""
-
-#: wt-status.c:1519 wt-status.c:1522
-msgid "ahead "
-msgstr ""
-
-#: wt-status.c:1524
-msgid ", behind "
-msgstr ""
+msgstr "назад Ñ "
#: compat/precompose_utf8.c:55 builtin/clone.c:356
#, c-format
msgid "failed to unlink '%s'"
-msgstr ""
+msgstr "неуÑпешно изтриване на „%s“"
-#: builtin/add.c:20
+#: builtin/add.c:21
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 ""
+msgstr "git add [ОПЦИИ] [--] ПЪТ…"
-#: 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
+#: builtin/add.c:64
#, c-format
msgid "unexpected diff status %c"
-msgstr ""
+msgstr "неочакван изходен код при генериране на разлика: %c"
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
msgid "updating files failed"
-msgstr ""
+msgstr "неуÑпешно обновÑване на файловете"
-#: builtin/add.c:163
+#: builtin/add.c:79
#, c-format
msgid "remove '%s'\n"
-msgstr ""
+msgstr "изтриване на „%s“\n"
-#: builtin/add.c:237
+#: builtin/add.c:133
msgid "Unstaged changes after refreshing the index:"
-msgstr ""
+msgstr "Промени, които и Ñлед обновÑването на индекÑа не Ñа добавени към него:"
-#: builtin/add.c:299
+#: builtin/add.c:193
msgid "Could not read the index"
-msgstr ""
+msgstr "ИндекÑÑŠÑ‚ не може да бъде прочетен"
-#: builtin/add.c:310
+#: builtin/add.c:204
#, c-format
msgid "Could not open '%s' for writing."
-msgstr ""
+msgstr "Файлът „%s“ не може да бъде отворен за запиÑ."
-#: builtin/add.c:314
+#: builtin/add.c:208
msgid "Could not write patch"
-msgstr ""
+msgstr "Кръпката не може да бъде запиÑана"
-#: builtin/add.c:319
+#: builtin/add.c:213
#, c-format
msgid "Could not stat '%s'"
-msgstr ""
+msgstr "Ðе може да Ñе получи Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñ‡Ñ€ÐµÐ· „stat“ за файла „%s“"
-#: builtin/add.c:321
+#: builtin/add.c:215
msgid "Empty patch. Aborted."
-msgstr ""
+msgstr "Празна кръпка, преуÑтановÑване на дейÑтвието."
-#: builtin/add.c:327
+#: builtin/add.c:221
#, c-format
msgid "Could not apply '%s'"
-msgstr ""
+msgstr "Кръпката „%s“ не може да бъде приложена"
-#: builtin/add.c:337
+#: builtin/add.c:231
msgid "The following paths are ignored by one of your .gitignore files:\n"
msgstr ""
+"Следните пътища ще бъдат игнорирани Ñпоред нÑкой от файловете „.gitignore“:\n"
-#: 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/add.c:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
+#: builtin/prune-packed.c:77 builtin/push.c:489 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/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
+#: builtin/commit.c:1256 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
+#: builtin/add.c:251
msgid "interactive picking"
-msgstr ""
+msgstr "интерактивно отбиране на промени"
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
msgid "select hunks interactively"
-msgstr ""
+msgstr "интерактивен избор на парчета код"
-#: builtin/add.c:359
+#: builtin/add.c:253
msgid "edit current diff and apply"
-msgstr ""
+msgstr "редактиране на текущата разлика и прилагане"
-#: builtin/add.c:360
+#: builtin/add.c:254
msgid "allow adding otherwise ignored files"
-msgstr ""
+msgstr "добавÑне и на иначе игнорираните файлове"
-#: builtin/add.c:361
+#: builtin/add.c:255
msgid "update tracked files"
-msgstr ""
+msgstr "обновÑване на Ñледените файлове"
-#: builtin/add.c:362
+#: builtin/add.c:256
msgid "record only the fact that the path will be added later"
-msgstr ""
+msgstr "отбелÑзване Ñамо на факта, че пътÑÑ‚ ще бъде добавен по-къÑно"
-#: builtin/add.c:363
+#: builtin/add.c:257
msgid "add changes from all tracked and untracked files"
-msgstr ""
+msgstr "добавÑне на вÑички промени в Ñледените и неÑледените файлове"
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
msgid "ignore paths removed in the working tree (same as --no-all)"
msgstr ""
+"игнориране на пътищата, които Ñа изтрити от работното дърво (Ñъщото като „--"
+"no-all“)"
-#: builtin/add.c:368
+#: builtin/add.c:262
msgid "don't add, only refresh the index"
-msgstr ""
+msgstr "без добавÑне на нови файлове, Ñамо обновÑване на индекÑа"
-#: builtin/add.c:369
+#: builtin/add.c:263
msgid "just skip files which cannot be added because of errors"
msgstr ""
+"преÑкачане на файловете, които не могат да бъдат добавени поради грешки"
-#: builtin/add.c:370
+#: builtin/add.c:264
msgid "check if - even missing - files are ignored in dry run"
msgstr ""
+"проверка, че при пробно изпълнение вÑички файлове, дори и изтритите, Ñе "
+"игнорират"
-#: builtin/add.c:392
+#: builtin/add.c:286
#, c-format
msgid "Use -f if you really want to add them.\n"
-msgstr ""
+msgstr "Използвайте опциÑта „-f“, ако наиÑтина иÑкате да ги добавите.\n"
-#: builtin/add.c:393
+#: builtin/add.c:287
msgid "no files added"
-msgstr ""
+msgstr "не Ñа добавени файлове"
-#: builtin/add.c:399
+#: builtin/add.c:293
msgid "adding files failed"
-msgstr ""
+msgstr "неуÑпешно добавÑне на файлове"
-#: builtin/add.c:438
+#: builtin/add.c:330
msgid "-A and -u are mutually incompatible"
-msgstr ""
+msgstr "опциите „-A“ и „-u“ Ñа неÑъвмеÑтими"
-#: builtin/add.c:456
+#: builtin/add.c:337
msgid "Option --ignore-missing can only be used together with --dry-run"
-msgstr ""
+msgstr "ОпциÑта „--ignore-missing“ е ÑъвмеÑтима Ñамо Ñ â€ž--dry-run“"
-#: builtin/add.c:486
+#: builtin/add.c:358
#, c-format
msgid "Nothing specified, nothing added.\n"
-msgstr ""
+msgstr "Ðищо не е зададено и нищо не е добавено.\n"
-#: builtin/add.c:487
+#: builtin/add.c:359
#, c-format
msgid "Maybe you wanted to say 'git add .'?\n"
-msgstr ""
+msgstr "ВероÑтно иÑкахте да използвате „git add .“?\n"
-#: 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
+#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:920
+#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 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
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
msgid "Unable to write new index file"
-msgstr "ÐовиÑÑ‚ файл Ñ Ð¸Ð½Ð´ÐµÐºÑа не може да бъде запиÑан"
+msgstr "ÐовиÑÑ‚ Ð¸Ð½Ð´ÐµÐºÑ Ð½Ðµ може да бъде запиÑан"
#: builtin/apply.c:57
msgid "git apply [options] [<patch>...]"
@@ -2177,17 +2222,17 @@ msgstr ""
msgid "deleted file %s still has contents"
msgstr ""
+# FIXME - double **??
#: builtin/apply.c:1725
#, c-format
msgid "** warning: file %s becomes empty but is not deleted"
-msgstr ""
+msgstr "â—◠предупреждение: файлът „%s“ вече е празен, но не е изтрит"
#: 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"
@@ -2326,10 +2371,10 @@ msgstr ""
msgid "Checking patch %s..."
msgstr ""
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
#, c-format
msgid "make_cache_entry failed for path '%s'"
-msgstr ""
+msgstr "неуÑпешно Ñъздаване на Ð·Ð°Ð¿Ð¸Ñ Ð² кеша чрез „make_cache_entry“ за „%s“"
#: builtin/apply.c:3823
#, c-format
@@ -2375,7 +2420,6 @@ msgstr ""
msgid "internal error"
msgstr ""
-#. Say this even without --verbose
#: builtin/apply.c:4043
#, c-format
msgid "Applying patch %%s with %d reject..."
@@ -2404,12 +2448,12 @@ msgstr ""
#: builtin/apply.c:4238
msgid "unable to read index file"
-msgstr ""
+msgstr "индекÑÑŠÑ‚ не може да бъде запиÑан"
#: builtin/apply.c:4357 builtin/apply.c:4360 builtin/clone.c:90
#: builtin/fetch.c:78
msgid "path"
-msgstr ""
+msgstr "път"
#: builtin/apply.c:4358
msgid "don't apply changes matching the given path"
@@ -2467,14 +2511,13 @@ msgstr ""
msgid "build a temporary index based on embedded index information"
msgstr ""
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
msgid "paths are separated with NUL character"
-msgstr ""
+msgstr "разделÑне на пътищата Ñ Ð½ÑƒÐ»ÐµÐ²Ð¸Ñ Ð·Ð½Ð°Ðº „NUL“"
#: builtin/apply.c:4392
-#, fuzzy
msgid "ensure at least <n> lines of context match"
-msgstr "<брой>"
+msgstr "да Ñе оÑигури контекÑÑ‚ от поне такъв БРОЙ Ñъвпадащи редове"
#: builtin/apply.c:4393
msgid "action"
@@ -2588,132 +2631,150 @@ msgstr ""
#: builtin/bisect--helper.c:7
msgid "git bisect--helper --next-all [--no-checkout]"
-msgstr ""
+msgstr "git bisect--helper --next-all [--no-checkout]"
#: builtin/bisect--helper.c:17
msgid "perform 'git bisect next'"
-msgstr ""
+msgstr "извършване на „git bisect next“"
#: builtin/bisect--helper.c:19
msgid "update BISECT_HEAD instead of checking out the current commit"
msgstr ""
+"обновÑване на ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žBISECT_HEAD“ вмеÑто да Ñе използва текущото подаване"
#: builtin/blame.c:27
msgid "git blame [options] [rev-opts] [rev] [--] file"
-msgstr ""
+msgstr "git blame [ОПЦИИ] [ОПЦИИ_ЗÐ_ВЕРСИЯТÐ] [ВЕРСИЯ] [--] ФÐЙЛ"
#: builtin/blame.c:32
msgid "[rev-opts] are documented in git-rev-list(1)"
-msgstr ""
+msgstr "ОПЦИИте_ЗÐ_ВЕРСИЯТРÑа документирани в ръководÑтвото git-rev-list(1)"
-#: builtin/blame.c:2249
+#: builtin/blame.c:2242
msgid "Show blame entries as we find them, incrementally"
-msgstr ""
+msgstr "Извеждане на анотациите Ñ Ð½Ð°Ð¼Ð¸Ñ€Ð°Ð½ÐµÑ‚Ð¾ им, поÑледователно"
-# FIXME
-#: builtin/blame.c:2250
+# FIXME SHA-1 -> SHA1
+#: builtin/blame.c:2243
msgid "Show blank SHA-1 for boundary commits (Default: off)"
msgstr ""
+"Извеждане на празни Ñуми по SHA1 за граничните Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ (Ñтандартно опциÑта "
+"е изключена)"
-#: builtin/blame.c:2251
+#: builtin/blame.c:2244
msgid "Do not treat root commits as boundaries (Default: off)"
msgstr ""
+"Ðачалните Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð´Ð° не Ñе Ñчитат за гранични (Ñтандартно опциÑта е "
+"изключена)"
-#: builtin/blame.c:2252
+#: builtin/blame.c:2245
msgid "Show work cost statistics"
-msgstr ""
+msgstr "Извеждане на ÑтатиÑтика за извършените дейÑтвиÑ"
-#: builtin/blame.c:2253
+#: builtin/blame.c:2246
msgid "Show output score for blame entries"
-msgstr ""
+msgstr "Извеждане на допълнителна Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° определÑнето на анотациите"
-#: builtin/blame.c:2254
+#: builtin/blame.c:2247
msgid "Show original filename (Default: auto)"
msgstr ""
+"Извеждане на първоначалното име на файл (Ñтандартно това е автоматично)"
-#: builtin/blame.c:2255
+#: builtin/blame.c:2248
msgid "Show original linenumber (Default: off)"
msgstr ""
+"Извеждане на първоначалниÑÑ‚ номер на ред (Ñтандартно опциÑта е изключена)"
-#: builtin/blame.c:2256
+#: builtin/blame.c:2249
msgid "Show in a format designed for machine consumption"
-msgstr ""
+msgstr "Извеждане във формат за по-нататъшна обработка"
-#: builtin/blame.c:2257
+#: builtin/blame.c:2250
msgid "Show porcelain format with per-line commit information"
msgstr ""
+"Извеждане във формат за по-нататъшна обработка Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð° вÑеки ред"
-#: builtin/blame.c:2258
+#: builtin/blame.c:2251
msgid "Use the same output mode as git-annotate (Default: off)"
msgstr ""
+"Използване на ÑÑŠÑ‰Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ като „git-annotate“ (Ñтандартно опциÑта е "
+"изключена)"
-#: builtin/blame.c:2259
+#: builtin/blame.c:2252
msgid "Show raw timestamp (Default: off)"
-msgstr ""
+msgstr "Извеждане на неформатирани времена (Ñтандартно опциÑта е изключена)"
-#: builtin/blame.c:2260
+#: builtin/blame.c:2253
msgid "Show long commit SHA1 (Default: off)"
-msgstr ""
+msgstr "Извеждане на пълните Ñуми по SHA1 (Ñтандартно опциÑта е изключена)"
-#: builtin/blame.c:2261
+#: builtin/blame.c:2254
msgid "Suppress author name and timestamp (Default: off)"
-msgstr ""
+msgstr "Без име на автор и време на промÑна(Ñтандартно опциÑта е изключена)"
-#: builtin/blame.c:2262
+#: builtin/blame.c:2255
msgid "Show author email instead of name (Default: off)"
msgstr ""
+"Извеждане на е-пощата на автора, а не името му (Ñтандартно опциÑта е "
+"изключена)"
-#: builtin/blame.c:2263
+#: builtin/blame.c:2256
msgid "Ignore whitespace differences"
-msgstr ""
+msgstr "Без разлики в знаците за интервали"
-#: builtin/blame.c:2264
+#: builtin/blame.c:2257
msgid "Spend extra cycles to find better match"
-msgstr ""
+msgstr "Допълнителни изчиÑÐ»ÐµÐ½Ð¸Ñ Ð·Ð° по-добри резултати"
-#: builtin/blame.c:2265
+#: builtin/blame.c:2258
msgid "Use revisions from <file> instead of calling git-rev-list"
-msgstr ""
+msgstr "Изчитане на верÑиите от ФÐЙЛ, а не чрез изпълнение на „git-rev-list“"
-#: builtin/blame.c:2266
+#: builtin/blame.c:2259
msgid "Use <file>'s contents as the final image"
-msgstr ""
+msgstr "Използване на Ñъдържанието на ФÐЙЛа като крайно положение"
-#: builtin/blame.c:2267 builtin/blame.c:2268
+#: builtin/blame.c:2260 builtin/blame.c:2261
msgid "score"
-msgstr ""
+msgstr "напаÑване на редовете"
-#: builtin/blame.c:2267
+#: builtin/blame.c:2260
msgid "Find line copies within and across files"
msgstr ""
+"ТърÑене на копирани редове както в рамките на един файл, така и от един файл "
+"към друг"
-#: builtin/blame.c:2268
+#: builtin/blame.c:2261
msgid "Find line movements within and across files"
msgstr ""
+"ТърÑене на премеÑтени редове както в рамките на един файл, така и от един "
+"файл към друг"
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
msgid "n,m"
-msgstr ""
+msgstr "n,m"
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
msgid "Process only line range n,m, counting from 1"
msgstr ""
+"Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñамо за редовете в интервала от n до m включително. Броенето "
+"започва от 1"
#: builtin/branch.c:24
msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
-msgstr ""
+msgstr "git branch [ОПЦИИ] [-r | -a] [--merged | --no-merged]"
#: builtin/branch.c:25
msgid "git branch [options] [-l] [-f] <branchname> [<start-point>]"
-msgstr ""
+msgstr "git branch [ОПЦИИ] [-l] [-f] ИМЕ_ÐÐ_КЛОР[ÐÐЧÐЛО]"
#: builtin/branch.c:26
msgid "git branch [options] [-r] (-d | -D) <branchname>..."
-msgstr ""
+msgstr "git branch [ОПЦИИ] [-r] (-d | -D) ИМЕ_ÐÐ_КЛОÐ…"
#: builtin/branch.c:27
msgid "git branch [options] (-m | -M) [<oldbranch>] <newbranch>"
-msgstr ""
+msgstr "git branch [ОПЦИИ] (-m | -M) [СТÐР_КЛОÐ] ÐОВ_КЛОÐ"
#: builtin/branch.c:150
#, c-format
@@ -2721,6 +2782,8 @@ msgid ""
"deleting branch '%s' that has been merged to\n"
" '%s', but not yet merged to HEAD."
msgstr ""
+"изтриване на клона „%s“, който е ÑлÑÑ‚ към „%s“,\n"
+" но още не е ÑлÑÑ‚ към върха „HEAD“."
#: builtin/branch.c:154
#, c-format
@@ -2728,11 +2791,13 @@ msgid ""
"not deleting branch '%s' that is not yet merged to\n"
" '%s', even though it is merged to HEAD."
msgstr ""
+"отказване на изтриване на клона „%s“, който не е ÑлÑÑ‚ към\n"
+" „%s“, но е ÑлÑÑ‚ към върха „HEAD“."
#: builtin/branch.c:168
#, c-format
msgid "Couldn't look up commit object for '%s'"
-msgstr ""
+msgstr "Обектът-подаване за „%s“ не може да бъде открит"
#: builtin/branch.c:172
#, c-format
@@ -2740,336 +2805,346 @@ msgid ""
"The branch '%s' is not fully merged.\n"
"If you are sure you want to delete it, run 'git branch -D %s'."
msgstr ""
+"Клонът „%s“ не е ÑлÑÑ‚ напълно. Ðко Ñте Ñигурни, че иÑкате\n"
+"да го изтриете, изпълнете „git branch -D %s“."
#: builtin/branch.c:185
msgid "Update of config-file failed"
-msgstr ""
+msgstr "ÐеуÑпешно обновÑване на ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»"
#: builtin/branch.c:213
msgid "cannot use -a with -d"
-msgstr ""
+msgstr "ОпциÑта „-a“ е неÑъвмеÑтима Ñ Ð¾Ð¿Ñ†Ð¸Ñта „-d“"
#: builtin/branch.c:219
msgid "Couldn't look up commit object for HEAD"
-msgstr ""
+msgstr "Обектът-подаване, Ñочен от ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“, не може да бъде открит"
#: builtin/branch.c:227
#, c-format
msgid "Cannot delete the branch '%s' which you are currently on."
-msgstr ""
+msgstr "Ðе можете да изтриете клона „%s“, защото в момента е текущ."
#: builtin/branch.c:240
#, c-format
msgid "remote branch '%s' not found."
-msgstr ""
+msgstr "отдалечениÑÑ‚ клон „%s“ не може да бъде открит."
#: builtin/branch.c:241
#, c-format
msgid "branch '%s' not found."
-msgstr ""
+msgstr "клонът „%s“ не може да бъде открит."
#: builtin/branch.c:255
#, c-format
msgid "Error deleting remote branch '%s'"
-msgstr ""
+msgstr "Грешка при изтриването на Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½ „%s“"
#: builtin/branch.c:256
#, c-format
msgid "Error deleting branch '%s'"
-msgstr ""
+msgstr "Грешка при изтриването на клона „%s“"
#: builtin/branch.c:263
#, c-format
msgid "Deleted remote branch %s (was %s).\n"
-msgstr ""
+msgstr "Изтрит отдалечен клон „%s“ (той Ñочеше към „%s“).\n"
#: builtin/branch.c:264
#, c-format
msgid "Deleted branch %s (was %s).\n"
-msgstr ""
+msgstr "Изтрит клон „%s“ (той Ñочеше към „%s“).\n"
#: builtin/branch.c:366
#, c-format
msgid "branch '%s' does not point at a commit"
-msgstr ""
+msgstr "клонът „%s“ не Ñочи към подаване"
#: builtin/branch.c:454
#, c-format
msgid "[%s: gone]"
-msgstr ""
+msgstr "[%s: изтрит]"
#: builtin/branch.c:459
#, c-format
msgid "[%s]"
-msgstr ""
+msgstr "[%s]"
#: builtin/branch.c:464
#, c-format
msgid "[%s: behind %d]"
-msgstr ""
+msgstr "[%s: назад Ñ %d]"
#: builtin/branch.c:466
#, c-format
msgid "[behind %d]"
-msgstr ""
+msgstr "[назад Ñ %d]"
#: builtin/branch.c:470
#, c-format
msgid "[%s: ahead %d]"
-msgstr ""
+msgstr "[%s: напред Ñ %d]"
#: builtin/branch.c:472
#, c-format
msgid "[ahead %d]"
-msgstr ""
+msgstr "[напред Ñ %d]"
#: builtin/branch.c:475
#, c-format
msgid "[%s: ahead %d, behind %d]"
-msgstr ""
+msgstr "[%s: напред Ñ %d, назад Ñ %d]"
#: builtin/branch.c:478
#, c-format
msgid "[ahead %d, behind %d]"
-msgstr ""
+msgstr "[напред Ñ %d, назад Ñ %d]"
+# FIXME ** how many??
#: builtin/branch.c:502
msgid " **** invalid ref ****"
-msgstr ""
+msgstr " â—â—â—◠неправилен указател â—â—â—â—"
#: builtin/branch.c:594
#, c-format
msgid "(no branch, rebasing %s)"
-msgstr ""
+msgstr "(извън клон, пребазиране на „%s“)"
#: builtin/branch.c:597
#, c-format
msgid "(no branch, bisect started on %s)"
-msgstr ""
+msgstr "(извън клон, двоично Ñ‚ÑŠÑ€Ñене от „%s“)"
#: builtin/branch.c:600
#, c-format
msgid "(detached from %s)"
-msgstr ""
+msgstr "(ÑÑŠÑтоÑние, неÑвързано към „%s“)"
#: builtin/branch.c:603
msgid "(no branch)"
-msgstr ""
+msgstr "(извън клон)"
#: builtin/branch.c:649
#, c-format
msgid "object '%s' does not point to a commit"
-msgstr ""
+msgstr "обектът „%s“ не Ñочи към подаване"
#: builtin/branch.c:681
msgid "some refs could not be read"
-msgstr ""
+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 ""
+msgstr "Ðеправилно име на клон: „%s“"
#: builtin/branch.c:719
msgid "Branch rename failed"
-msgstr ""
+msgstr "ÐеуÑпешно преименуване на клон"
#: builtin/branch.c:723
#, c-format
msgid "Renamed a misnamed branch '%s' away"
-msgstr ""
+msgstr "Ðа клона Ñ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»Ð½Ð¾ име „%s“ е дадено Ñлужебно име"
#: builtin/branch.c:727
#, c-format
msgid "Branch renamed to %s, but HEAD is not updated!"
-msgstr ""
+msgstr "Клонът е преименуван на „%s“, но указателÑÑ‚ „HEAD“ не е преименуван"
#: builtin/branch.c:734
msgid "Branch is renamed, but update of config-file failed"
-msgstr ""
+msgstr "Клонът е преименуван, но конфигурационниÑÑ‚ файл не бе обновен"
#: builtin/branch.c:749
#, c-format
msgid "malformed object name %s"
-msgstr ""
+msgstr "неправилно име на обект „%s“"
#: builtin/branch.c:773
#, c-format
msgid "could not write branch description template: %s"
-msgstr ""
+msgstr "шаблонът за опиÑание на клон не бе запиÑан: „%s“"
#: builtin/branch.c:803
msgid "Generic options"
-msgstr ""
+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 ""
+msgstr "без информационни ÑъобщениÑ"
#: builtin/branch.c:807
msgid "set up tracking mode (see git-pull(1))"
-msgstr ""
+msgstr "задаване на режима на Ñледене (виж git-pull(1))"
#: builtin/branch.c:809
msgid "change upstream info"
-msgstr ""
+msgstr "ÑмÑна на ÑÐ»ÐµÐ´ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½"
#: builtin/branch.c:813
msgid "use colored output"
-msgstr ""
+msgstr "цветен изход"
#: builtin/branch.c:814
msgid "act on remote-tracking branches"
-msgstr ""
+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
+#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
+#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
+#: builtin/tag.c:533
msgid "commit"
-msgstr ""
+msgstr "подаване"
#: builtin/branch.c:818 builtin/branch.c:824
msgid "print only branches that contain the commit"
-msgstr ""
+msgstr "извеждане Ñамо на клоните, които Ñъдържат това подаване"
#: builtin/branch.c:830
msgid "Specific git-branch actions:"
-msgstr ""
+msgstr "Специални дейÑÑ‚Ð²Ð¸Ñ Ð½Ð° „git-branch“:"
#: builtin/branch.c:831
msgid "list both remote-tracking and local branches"
-msgstr ""
+msgstr "извеждане както на ÑледÑщите, така и на локалните клони"
#: builtin/branch.c:833
msgid "delete fully merged branch"
-msgstr ""
+msgstr "изтриване на клони, които Ñа напълно Ñлети"
#: builtin/branch.c:834
msgid "delete branch (even if not merged)"
-msgstr ""
+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 ""
+msgstr "премеÑтване/преименуване на клон, дори ако има вече клон Ñ Ñ‚Ð°ÐºÐ¾Ð²Ð° име"
#: builtin/branch.c:837
msgid "list branch names"
-msgstr ""
+msgstr "извеждане на имената на клоните"
#: builtin/branch.c:838
msgid "create the branch's reflog"
-msgstr ""
+msgstr "Ñъздаване на журнала на указателите на клона"
#: builtin/branch.c:840
msgid "edit the description for the branch"
-msgstr ""
+msgstr "редактиране на опиÑанието на клона"
#: builtin/branch.c:841
msgid "force creation (when already exists)"
-msgstr ""
+msgstr "принудително Ñъздаване, дори ако ÑъщеÑтвува клон Ñ Ñ‚Ð°ÐºÐ¾Ð²Ð° име"
#: builtin/branch.c:844
msgid "print only not merged branches"
-msgstr ""
+msgstr "извеждане Ñамо на неÑлетите клони"
#: builtin/branch.c:850
msgid "print only merged branches"
-msgstr ""
+msgstr "извеждане Ñамо на Ñлетите клони"
#: builtin/branch.c:854
msgid "list branches in columns"
-msgstr ""
+msgstr "извеждане по колони"
#: builtin/branch.c:867
msgid "Failed to resolve HEAD as a valid ref."
-msgstr ""
+msgstr "Ðе може да Ñе открие към какво Ñочи указателÑÑ‚ „HEAD“"
#: builtin/branch.c:872 builtin/clone.c:635
msgid "HEAD not found below refs/heads!"
-msgstr ""
+msgstr "Ð’ директориÑта „refs/heads“ липÑва файл „HEAD“"
#: builtin/branch.c:896
msgid "--column and --verbose are incompatible"
-msgstr ""
+msgstr "Опциите „--column“ и „--verbose“ Ñа неÑъвмеÑтими"
#: builtin/branch.c:902 builtin/branch.c:941
msgid "branch name required"
-msgstr ""
+msgstr "Ðеобходимо е име на клон"
#: builtin/branch.c:917
msgid "Cannot give description to detached HEAD"
-msgstr ""
+msgstr "Ðе може да зададете опиÑание на „HEAD“ извън клон"
#: builtin/branch.c:922
msgid "cannot edit description of more than one branch"
-msgstr ""
+msgstr "Ðе може да редактирате опиÑанието на повече от един клон едновременно"
#: builtin/branch.c:929
#, c-format
msgid "No commit on branch '%s' yet."
-msgstr ""
+msgstr "Ð’ клона „%s“ вÑе още нÑма подаваниÑ."
#: builtin/branch.c:932
#, c-format
msgid "No branch named '%s'."
-msgstr ""
+msgstr "ЛипÑва клон на име „%s“."
#: builtin/branch.c:947
msgid "too many branches for a rename operation"
-msgstr ""
+msgstr "Прекалено много клони за преименуване"
#: builtin/branch.c:952
msgid "too many branches to set new upstream"
-msgstr ""
+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 ""
+"Следеното от „HEAD“ не може да Ñе зададе да е „%s“, защото то не Ñочи към "
+"никой клон."
#: builtin/branch.c:959 builtin/branch.c:981 builtin/branch.c:1002
#, c-format
msgid "no such branch '%s'"
-msgstr ""
+msgstr "ÐÑма клон на име „%s“."
#: builtin/branch.c:963
#, c-format
msgid "branch '%s' does not exist"
-msgstr ""
+msgstr "Ðе ÑъщеÑтвува клон на име „%s“."
#: builtin/branch.c:975
msgid "too many branches to unset upstream"
-msgstr ""
+msgstr "Прекалено много клони за махане на Ñледене"
#: builtin/branch.c:979
msgid "could not unset upstream of HEAD when it does not point to any branch."
msgstr ""
+"Следеното от „HEAD“ не може да махне, защото то не Ñочи към никой клон."
#: builtin/branch.c:985
#, c-format
msgid "Branch '%s' has no upstream information"
-msgstr ""
+msgstr "ÐÑма Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÐºÐ»Ð¾Ð½ÑŠÑ‚ „%s“ да Ñледи нÑкой друг"
#: builtin/branch.c:999
msgid "it does not make sense to create 'HEAD' manually"
-msgstr ""
+msgstr "ÐÑма никакъв ÑмиÑъл ръчно да Ñъздавате „HEAD“."
#: builtin/branch.c:1005
msgid "-a and -r options to 'git branch' do not make sense with a branch name"
-msgstr ""
+msgstr "Опциите „-a“ и „-r“ на „git branch“ Ñа неÑъвмеÑтими Ñ Ð¸Ð¼Ðµ на клон"
#: builtin/branch.c:1008
#, c-format
@@ -3077,6 +3152,8 @@ msgid ""
"The --set-upstream flag is deprecated and will be removed. Consider using --"
"track or --set-upstream-to\n"
msgstr ""
+"ОпциÑта „--set-upstream“ вече е оÑтарÑла и предÑтои да бъде махната. "
+"Използвайте „--track“ или „--set-upstream-to“\n"
#: builtin/branch.c:1025
#, c-format
@@ -3085,16 +3162,19 @@ msgid ""
"If you wanted to make '%s' track '%s', do this:\n"
"\n"
msgstr ""
+"\n"
+"За да накарате „%s“ да Ñледи „%s“, изпълнете Ñледната команда:\n"
+"\n"
#: builtin/branch.c:1026
#, c-format
msgid " git branch -d %s\n"
-msgstr ""
+msgstr " git branch -d %s\n"
#: builtin/branch.c:1027
#, c-format
msgid " git branch --set-upstream-to %s\n"
-msgstr ""
+msgstr " git branch --set-upstream-to %s\n"
#: builtin/bundle.c:47
#, c-format
@@ -3109,71 +3189,71 @@ msgstr ""
msgid "Need a repository to unbundle."
msgstr ""
-#: builtin/cat-file.c:328
+#: builtin/cat-file.c:331
msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
msgstr ""
-#: builtin/cat-file.c:329
+#: builtin/cat-file.c:332
msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
msgstr ""
-#: builtin/cat-file.c:366
+#: builtin/cat-file.c:369
msgid "<type> can be one of: blob, tree, commit, tag"
msgstr ""
-#: builtin/cat-file.c:367
+#: builtin/cat-file.c:370
msgid "show object type"
msgstr ""
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
msgid "show object size"
msgstr ""
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
msgid "exit with zero when there's no error"
msgstr ""
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:374
msgid "pretty-print object's content"
msgstr ""
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
msgid "for blob objects, run textconv on object's content"
msgstr ""
-#: builtin/cat-file.c:375
+#: builtin/cat-file.c:378
msgid "show info and content of objects fed from the standard input"
msgstr ""
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:381
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 ""
+msgstr "git check-attr [-a | --all | ÐТРИБУТ…] [--] ПЪТ…"
#: builtin/check-attr.c:12
msgid "git check-attr --stdin [-z] [-a | --all | attr...] < <list-of-paths>"
-msgstr ""
+msgstr "git check-attr --stdin [-z] [-a | --all | ÐТРИБУТ…] < СПИСЪК_С_ПЪТИЩÐ"
#: builtin/check-attr.c:19
msgid "report all attributes set on file"
-msgstr ""
+msgstr "извеждане на вÑички атрибути, зададени върху файл"
#: builtin/check-attr.c:20
msgid "use .gitattributes only from the index"
-msgstr ""
+msgstr "използване на файла „.gitattributes“ Ñамо от индекÑа"
#: builtin/check-attr.c:21 builtin/check-ignore.c:22 builtin/hash-object.c:75
msgid "read file names from stdin"
-msgstr ""
+msgstr "изчитане на имената на файловете от ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð²Ñ…Ð¾Ð´"
#: builtin/check-attr.c:23 builtin/check-ignore.c:24
msgid "terminate input and output records by a NUL character"
-msgstr ""
+msgstr "разделÑне на входните и изходните запиÑи Ñ Ð½ÑƒÐ»ÐµÐ²Ð¸Ñ Ð·Ð½Ð°Ðº „NUL“"
-#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
msgid "suppress progress reporting"
msgstr "без показване на напредъка"
@@ -3211,20 +3291,20 @@ msgstr ""
#: builtin/check-mailmap.c:8
msgid "git check-mailmap [options] <contact>..."
-msgstr ""
+msgstr "git check-mailmap [ОПЦИИ] КОÐТÐКТ…"
#: builtin/check-mailmap.c:13
msgid "also read contacts from stdin"
-msgstr ""
+msgstr "четене на контакти и от ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð²Ñ…Ð¾Ð´"
#: builtin/check-mailmap.c:24
#, c-format
msgid "unable to parse contact: %s"
-msgstr ""
+msgstr "контактът не може да бъде анализиран: %s"
#: builtin/check-mailmap.c:47
msgid "no contacts specified"
-msgstr ""
+msgstr "не Ñа указани контакти"
#: builtin/checkout-index.c:126
msgid "git checkout-index [options] [--] [<file>...]"
@@ -3248,7 +3328,7 @@ msgstr ""
#: builtin/checkout-index.c:194
msgid "update stat information in the index file"
-msgstr ""
+msgstr "обновÑване на информациÑта получена чрез „stat“ за файловете в индекÑа"
#: builtin/checkout-index.c:200
msgid "read list of paths from the standard input"
@@ -3272,112 +3352,115 @@ msgstr ""
#: builtin/checkout.c:25
msgid "git checkout [options] <branch>"
-msgstr ""
+msgstr "git checkout [ОПЦИИ] КЛОÐ"
#: builtin/checkout.c:26
msgid "git checkout [options] [<branch>] -- <file>..."
-msgstr ""
+msgstr "git checkout [ОПЦИИ] [КЛОÐ] -- ФÐЙЛ…"
#: builtin/checkout.c:114 builtin/checkout.c:147
#, c-format
msgid "path '%s' does not have our version"
-msgstr ""
+msgstr "вашата верÑÐ¸Ñ Ð»Ð¸Ð¿Ñва в Ð¿ÑŠÑ‚Ñ â€ž%s“"
#: builtin/checkout.c:116 builtin/checkout.c:149
#, c-format
msgid "path '%s' does not have their version"
-msgstr ""
+msgstr "чуждата верÑÐ¸Ñ Ð»Ð¸Ð¿Ñва в Ð¿ÑŠÑ‚Ñ â€ž%s“"
+# FIXME SAME AS [1]
#: builtin/checkout.c:132
#, c-format
msgid "path '%s' does not have all necessary versions"
-msgstr ""
+msgstr "нÑÐºÐ¾Ñ Ð¾Ñ‚ необходимите верÑии липÑва в Ð¿ÑŠÑ‚Ñ â€ž%s“"
+# FIXME SAME AS [1]
#: builtin/checkout.c:176
#, c-format
msgid "path '%s' does not have necessary versions"
-msgstr ""
+msgstr "нÑÐºÐ¾Ñ Ð¾Ñ‚ необходимите верÑии липÑва в Ð¿ÑŠÑ‚Ñ â€ž%s“"
#: builtin/checkout.c:193
#, c-format
msgid "path '%s': cannot merge"
-msgstr ""
+msgstr "пътÑÑ‚ „%s“ не може да бъде ÑлÑн"
#: builtin/checkout.c:210
#, c-format
msgid "Unable to add merge result for '%s'"
-msgstr ""
+msgstr "Резултатът за „%s“ не може да бъде ÑлÑн"
#: 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 ""
+msgstr "ОпциÑта „%s“ е неÑъвмеÑтима Ñ Ð¾Ð±Ð½Ð¾Ð²Ñването на пътища"
#: builtin/checkout.c:244 builtin/checkout.c:247
#, c-format
msgid "'%s' cannot be used with %s"
-msgstr ""
+msgstr "ОпциÑта „%s“ е неÑъвмеÑтима Ñ â€ž%s“"
#: builtin/checkout.c:250
#, c-format
msgid "Cannot update paths and switch to branch '%s' at the same time."
msgstr ""
+"Ðевъзможно е едновременно да обновÑвате пътища и да Ñе прехвърлите към клона "
+"„%s“."
-#: builtin/checkout.c:261 builtin/checkout.c:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
msgid "corrupt index file"
-msgstr ""
+msgstr "повреден файл на индекÑа"
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
#, c-format
msgid "path '%s' is unmerged"
-msgstr ""
+msgstr "пътÑÑ‚ „%s“ не е ÑлÑÑ‚"
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
msgid "you need to resolve your current index first"
-msgstr ""
+msgstr "първо Ñ‚Ñ€Ñбва да коригирате индекÑа Ñи"
-#: builtin/checkout.c:594
+#: builtin/checkout.c:593
#, c-format
msgid "Can not do reflog for '%s'\n"
-msgstr ""
+msgstr "Журналът на указателите за „%s“ не може да бъде Ñъздаден\n"
-#: builtin/checkout.c:632
+#: builtin/checkout.c:631
msgid "HEAD is now at"
-msgstr ""
+msgstr "УказателÑÑ‚ „HEAD“ в момента Ñочи към"
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
#, c-format
msgid "Reset branch '%s'\n"
-msgstr ""
+msgstr "ЗанулÑване на клона „%s“\n"
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
#, c-format
msgid "Already on '%s'\n"
-msgstr ""
+msgstr "Вече Ñте на „%s“\n"
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
#, c-format
msgid "Switched to and reset branch '%s'\n"
-msgstr ""
+msgstr "Преминаване към клона „%s“ и занулÑване на промените\n"
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 builtin/checkout.c:1032
#, c-format
msgid "Switched to a new branch '%s'\n"
-msgstr ""
+msgstr "Преминахте към Ð½Ð¾Ð²Ð¸Ñ ÐºÐ»Ð¾Ð½ „%s“\n"
-#: builtin/checkout.c:650
+#: builtin/checkout.c:649
#, c-format
msgid "Switched to branch '%s'\n"
-msgstr ""
+msgstr "Преминахте към клона „%s“\n"
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
#, c-format
msgid " ... and %d more.\n"
-msgstr ""
+msgstr "… и още %d.\n"
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
#, c-format
msgid ""
"Warning: you are leaving %d commit behind, not connected to\n"
@@ -3390,9 +3473,16 @@ msgid_plural ""
"\n"
"%s\n"
msgstr[0] ""
+"ПРЕДУПРЕЖДЕÐИЕ: изоÑтавÑте %d подаване, което не е Ñвързано към никой клон:\n"
+"\n"
+"%s\n"
msgstr[1] ""
+"ПРЕДУПРЕЖДЕÐИЕ: изоÑтавÑте %d подаваниÑ, които не Ñа Ñвързани към никой "
+"клон:\n"
+"\n"
+"%s\n"
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
#, c-format
msgid ""
"If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3401,157 +3491,171 @@ msgid ""
" git branch new_branch_name %s\n"
"\n"
msgstr ""
+"Ðко вÑе пак иÑкате да ги запазите, Ñега вероÑтно е най-подходÑщиÑÑ‚ момент "
+"да\n"
+"Ñъздадете нов клон Ñ Ñ‚ÑÑ… чрез командата:\n"
+"\n"
+" git branch ИМЕ_ÐÐ_ÐОВИЯ_КЛОР%s\n"
+"\n"
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
msgid "internal error in revision walk"
-msgstr ""
+msgstr "вътрешна грешка при обхождането на верÑиите"
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
msgid "Previous HEAD position was"
-msgstr ""
+msgstr "Преди това „HEAD“ Ñочеше към"
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
msgid "You are on a branch yet to be born"
-msgstr ""
+msgstr "Ð’ момента Ñте на клон, който предÑтои да бъде Ñъздаден"
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
#, c-format
msgid "only one reference expected, %d given."
-msgstr ""
+msgstr "очакваше Ñе един указател, а Ñте подали %d."
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
#, c-format
msgid "invalid reference: %s"
-msgstr ""
+msgstr "неправилен указател: %s"
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
#, c-format
msgid "reference is not a tree: %s"
-msgstr ""
+msgstr "указателÑÑ‚ не Ñочи към обект-дърво: %s"
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
msgid "paths cannot be used with switching branches"
-msgstr ""
+msgstr "задаването на път е неÑъвмеÑтимо Ñ Ð¿Ñ€ÐµÐ¼Ð¸Ð½Ð°Ð²Ð°Ð½ÐµÑ‚Ð¾ от един клон към друг"
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
#, c-format
msgid "'%s' cannot be used with switching branches"
-msgstr ""
+msgstr "опциÑта „%s“ е неÑъвмеÑтима Ñ Ð¿Ñ€ÐµÐ¼Ð¸Ð½Ð°Ð²Ð°Ð½ÐµÑ‚Ð¾ от един клон към друг"
-#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
#, c-format
msgid "'%s' cannot be used with '%s'"
-msgstr ""
+msgstr "опциÑта „%s“ е неÑъвмеÑтима Ñ â€ž%s“"
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
#, c-format
msgid "Cannot switch branch to a non-commit '%s'"
msgstr ""
+"За да преминете към клон, подайте указател, който Ñочи към подаване. „%s“ не "
+"е такъв"
-#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
#: builtin/remote.c:159 builtin/remote.c:161
msgid "branch"
msgstr "клон"
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
msgid "create and checkout a new branch"
-msgstr ""
+msgstr "Ñъздаване и преминаване към нов клон"
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
msgid "create/reset and checkout a branch"
-msgstr ""
+msgstr "Ñъздаване/занулÑване на клон и преминаване към него"
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
msgid "create reflog for new branch"
-msgstr ""
+msgstr "Ñъздаване на журнал на указателите за нов клон"
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
msgid "detach the HEAD at named commit"
-msgstr ""
+msgstr "отделÑне на ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“ към указаното подаване"
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
msgid "set upstream info for new branch"
-msgstr ""
+msgstr "задаване на кой клон бива Ñледен при Ñъздаването на Ð½Ð¾Ð²Ð¸Ñ ÐºÐ»Ð¾Ð½"
-#: builtin/checkout.c:1099
-msgid "new branch"
-msgstr ""
+#: builtin/checkout.c:1098
+msgid "new-branch"
+msgstr "ÐОВ_КЛОÐ"
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
msgid "new unparented branch"
-msgstr ""
+msgstr "нов клон без родител"
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
msgid "checkout our version for unmerged files"
-msgstr ""
+msgstr "изтеглÑне на вашата верÑÐ¸Ñ Ð½Ð° неÑлетите файлове"
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
msgid "checkout their version for unmerged files"
-msgstr ""
+msgstr "изтеглÑне на чуждата верÑÐ¸Ñ Ð½Ð° неÑлетите файлове"
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
msgid "force checkout (throw away local modifications)"
-msgstr ""
+msgstr "принудително изтеглÑне (вашите промени ще бъдат занулени)"
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
msgid "perform a 3-way merge with the new branch"
-msgstr ""
+msgstr "извършване на тройно Ñливане Ñ Ð½Ð¾Ð²Ð¸Ñ ÐºÐ»Ð¾Ð½"
-#: builtin/checkout.c:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
msgid "update ignored files (default)"
-msgstr ""
+msgstr "обновÑване на игнорираните файлове (Ñтандартно)"
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
msgid "style"
msgstr "Ñтил"
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
msgid "conflict style (merge or diff3)"
-msgstr ""
+msgstr "дейÑтвие при конфликт (Ñливане или тройна разлика)"
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
msgid "do not limit pathspecs to sparse entries only"
-msgstr ""
+msgstr "без ограничаване на изброените пътища Ñамо до чаÑтично изтеглените"
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
msgid "second guess 'git checkout no-such-branch'"
msgstr ""
+"поÑледващ опит за отгатване Ñлед неуÑпешен опит Ñ â€žgit checkout no-such-"
+"branch“"
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
msgid "-b, -B and --orphan are mutually exclusive"
-msgstr ""
+msgstr "Опциите „-b“, „-B“ и „--orphan“ Ñа неÑъвмеÑтими една Ñ Ð´Ñ€ÑƒÐ³Ð°"
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
msgid "--track needs a branch name"
-msgstr ""
+msgstr "опциÑта „--track“ изиÑква име на клон"
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
msgid "Missing branch name; try -b"
-msgstr ""
+msgstr "ЛипÑва име на клон, използвайте опциÑта „-b“"
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
msgid "invalid path specification"
-msgstr ""
+msgstr "указан е неправилен път"
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
#, 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 ""
+"Ðе можете едновременно да обновÑвате пътища и да преминете към клона „%s“.\n"
+"Дали не иÑкате да изтеглите „%s“, който не Ñочи към подаване?"
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1208
#, c-format
msgid "git checkout: --detach does not take a path argument '%s'"
-msgstr ""
+msgstr "git checkout: опциÑта „--detach“ не приема аргумент-път „%s“"
-#: builtin/checkout.c:1213
+#: builtin/checkout.c:1212
msgid ""
"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
"checking out of the index."
msgstr ""
+"git checkout: опциите „--ours“/„--theirs“, „--force“ и „--merge“ Ñа "
+"неÑъвмеÑтими\n"
+"Ñ Ð¸Ð·Ñ‚ÐµÐ³Ð»Ñне от индекÑа."
#: builtin/clean.c:26
msgid ""
@@ -3583,7 +3687,7 @@ msgstr ""
msgid "failed to remove %s"
msgstr ""
-#: builtin/clean.c:294
+#: builtin/clean.c:295
msgid ""
"Prompt help:\n"
"1 - select a numbered item\n"
@@ -3591,7 +3695,7 @@ msgid ""
" - (empty) select nothing"
msgstr ""
-#: builtin/clean.c:298
+#: builtin/clean.c:299
msgid ""
"Prompt help:\n"
"1 - select a single item\n"
@@ -3603,35 +3707,35 @@ msgid ""
" - (empty) finish selecting"
msgstr ""
-#: builtin/clean.c:516
+#: builtin/clean.c:517
#, c-format
msgid "Huh (%s)?"
msgstr ""
-#: builtin/clean.c:659
+#: builtin/clean.c:660
#, c-format
msgid "Input ignore patterns>> "
msgstr ""
-#: builtin/clean.c:696
+#: builtin/clean.c:697
#, c-format
msgid "WARNING: Cannot find items matched by: %s"
msgstr ""
-#: builtin/clean.c:717
+#: builtin/clean.c:718
msgid "Select items to delete"
msgstr ""
-#: builtin/clean.c:757
+#: builtin/clean.c:758
#, c-format
msgid "remove %s? "
msgstr ""
-#: builtin/clean.c:782
+#: builtin/clean.c:783
msgid "Bye."
msgstr ""
-#: builtin/clean.c:790
+#: builtin/clean.c:791
msgid ""
"clean - start cleaning\n"
"filter by pattern - exclude items from deletion\n"
@@ -3642,215 +3746,218 @@ msgid ""
"? - help for prompt selection"
msgstr ""
-#: builtin/clean.c:817
+# FIXME how many ***
+#: builtin/clean.c:818
msgid "*** Commands ***"
-msgstr ""
+msgstr "â—â—◠Команди â—â—â—"
-#: builtin/clean.c:818
+#: builtin/clean.c:819
msgid "What now"
msgstr ""
-#: builtin/clean.c:826
+#: builtin/clean.c:827
msgid "Would remove the following item:"
msgid_plural "Would remove the following items:"
msgstr[0] ""
msgstr[1] ""
-#: builtin/clean.c:843
+#: builtin/clean.c:844
msgid "No more files to clean, exiting."
msgstr ""
-#: builtin/clean.c:874
+#: builtin/clean.c:875
msgid "do not print names of files removed"
msgstr ""
-#: builtin/clean.c:876
+#: builtin/clean.c:877
msgid "force"
msgstr ""
-#: builtin/clean.c:877
+#: builtin/clean.c:878
msgid "interactive cleaning"
msgstr ""
-#: builtin/clean.c:879
+#: builtin/clean.c:880
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
+#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
+#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
msgid "pattern"
-msgstr ""
+msgstr "шаблон"
-#: builtin/clean.c:881
+#: builtin/clean.c:882
msgid "add <pattern> to ignore rules"
msgstr ""
-#: builtin/clean.c:882
+#: builtin/clean.c:883
msgid "remove ignored files, too"
msgstr ""
-#: builtin/clean.c:884
+#: builtin/clean.c:885
msgid "remove only ignored files"
msgstr ""
-#: builtin/clean.c:902
+#: builtin/clean.c:903
msgid "-x and -X cannot be used together"
msgstr ""
-#: builtin/clean.c:906
+#: builtin/clean.c:907
msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
"clean"
msgstr ""
-#: builtin/clean.c:909
+#: builtin/clean.c:910
msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"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 ""
+msgstr "git clone [ОПЦИИ] [--] ХРÐÐИЛИЩЕ [ДИРЕКТОРИЯ]"
#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:521
+#: builtin/push.c:504
msgid "force progress reporting"
-msgstr ""
+msgstr "извеждане на напредъка"
#: builtin/clone.c:66
msgid "don't create a checkout"
-msgstr ""
+msgstr "без Ñъздаване на работно дърво"
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
msgid "create a bare repository"
-msgstr ""
+msgstr "Ñъздаване на голо хранилище"
#: builtin/clone.c:71
msgid "create a mirror repository (implies bare)"
-msgstr ""
+msgstr "Ñъздаване на хранилище-огледало (това включва хранилището да е голо)"
#: builtin/clone.c:73
msgid "to clone from a local repository"
-msgstr ""
+msgstr "клониране от локално хранилище"
#: builtin/clone.c:75
msgid "don't use local hardlinks, always copy"
-msgstr ""
+msgstr "без твърди връзки, файловете винаги да Ñе копират"
#: builtin/clone.c:77
msgid "setup as shared repository"
-msgstr ""
+msgstr "наÑтройване за Ñподелено хранилище"
#: builtin/clone.c:79 builtin/clone.c:81
msgid "initialize submodules in the clone"
-msgstr ""
+msgstr "инициализиране на подмодулите при това клониране"
-#: builtin/clone.c:82 builtin/init-db.c:485
+#: builtin/clone.c:82 builtin/init-db.c:483
msgid "template-directory"
-msgstr ""
+msgstr "Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¸"
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
msgid "directory from which templates will be used"
-msgstr ""
+msgstr "директориÑ, коÑто Ñъдържа шаблоните, които да Ñе ползват"
#: builtin/clone.c:85
msgid "reference repository"
-msgstr ""
+msgstr "еталонно хранилище"
#: builtin/clone.c:86 builtin/column.c:26 builtin/merge-file.c:44
msgid "name"
-msgstr ""
+msgstr "ИМЕ"
#: builtin/clone.c:87
msgid "use <name> instead of 'origin' to track upstream"
-msgstr ""
+msgstr "използване на това ИМЕ вмеÑто „origin“ при проÑледÑване на клони"
#: builtin/clone.c:89
msgid "checkout <branch> instead of the remote's HEAD"
-msgstr ""
+msgstr "изтеглÑне на този КЛОÐ, а не ÑочениÑÑ‚ от Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ» „HEAD“"
#: builtin/clone.c:91
msgid "path to git-upload-pack on the remote"
-msgstr ""
+msgstr "път към командата „git-upload-pack“ на отдалеченото хранилище"
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
msgid "depth"
-msgstr ""
+msgstr "ДЪЛБОЧИÐÐ"
#: builtin/clone.c:93
msgid "create a shallow clone of that depth"
-msgstr ""
+msgstr "плитко клониране до тази ДЪЛБОЧИÐÐ"
#: builtin/clone.c:95
msgid "clone only one branch, HEAD or --branch"
msgstr ""
+"клониране Ñамо на един клон — или ÑÐ¾Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚ Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ â€žHEAD“, или изрично "
+"Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð¸Ñ Ñ â€ž--branch“"
-#: builtin/clone.c:96 builtin/init-db.c:494
+#: builtin/clone.c:96 builtin/init-db.c:492
msgid "gitdir"
-msgstr ""
+msgstr "СЛУЖЕБÐÐ_ДИРЕКТОРИЯ"
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
msgid "separate git dir from working tree"
-msgstr ""
+msgstr "отделна СЛУЖЕБÐÐ_ДИРЕКТОРИЯ за git извън работното дърво"
#: builtin/clone.c:98
msgid "key=value"
-msgstr ""
+msgstr "КЛЮЧ=СТОЙÐОСТ"
#: builtin/clone.c:99
msgid "set config inside the new repository"
-msgstr ""
+msgstr "задаване на наÑтройките на новото хранилище"
#: builtin/clone.c:252
#, c-format
msgid "reference repository '%s' is not a local repository."
-msgstr ""
+msgstr "еталонното хранилище „%s“ не е локално"
#: builtin/clone.c:256
#, c-format
msgid "reference repository '%s' is shallow"
-msgstr ""
+msgstr "еталонното хранилище „%s“ е плитко"
#: builtin/clone.c:259
#, c-format
msgid "reference repository '%s' is grafted"
-msgstr ""
+msgstr "еталонното хранилище „%s“ е Ñ Ð¿Ñ€Ð¸Ñаждане"
#: builtin/clone.c:321
#, c-format
msgid "failed to create directory '%s'"
-msgstr ""
+msgstr "директориÑта „%s“ не може да бъде Ñъздадена"
#: builtin/clone.c:323 builtin/diff.c:83
#, c-format
msgid "failed to stat '%s'"
-msgstr ""
+msgstr "не може да бъде получена Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñ‡Ñ€ÐµÐ· „stat“ за „%s“"
#: builtin/clone.c:325
#, c-format
msgid "%s exists and is not a directory"
-msgstr ""
+msgstr "„%s“ ÑъщеÑтвува и не е директориÑ"
#: builtin/clone.c:339
#, c-format
msgid "failed to stat %s\n"
-msgstr ""
+msgstr "не може да бъде получена Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñ‡Ñ€ÐµÐ· „stat“ за „%s“\n"
#: builtin/clone.c:361
#, c-format
msgid "failed to create link '%s'"
-msgstr ""
+msgstr "връзката „%s“ не може да бъде Ñъздадена"
#: builtin/clone.c:365
#, c-format
msgid "failed to copy file to '%s'"
-msgstr ""
+msgstr "файлът не можа да бъде копиран като „%s“"
#: builtin/clone.c:388 builtin/clone.c:565
#, c-format
msgid "done.\n"
-msgstr ""
+msgstr "дейÑтвието завърши.\n"
#: builtin/clone.c:401
msgid ""
@@ -3858,111 +3965,121 @@ msgid ""
"You can inspect what was checked out with 'git status'\n"
"and retry the checkout with 'git checkout -f HEAD'\n"
msgstr ""
+"Клонирането бе уÑпешно за разлика от подготовката на работното дърво\n"
+"за определен клон. Ð’Ñе пак можете да проверите кои файлове и от кой\n"
+"клон в момента Ñа изтеглени Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ‚Ð° „git status“. Можете да\n"
+"завършите изтеглÑнето на клона Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ‚Ð° „git checkout -f HEAD“.\n"
#: builtin/clone.c:480
#, c-format
msgid "Could not find remote branch %s to clone."
msgstr ""
+"Клонът „%s“ от отдалеченото хранилище което клонирате,\n"
+"който Ñледва да бъде изтеглен, не ÑъщеÑтвува."
#: builtin/clone.c:560
#, c-format
msgid "Checking connectivity... "
-msgstr ""
+msgstr "Проверка на връзката…"
#: builtin/clone.c:563
msgid "remote did not send all necessary objects"
-msgstr ""
+msgstr "отдалеченото хранилище не изпрати вÑички необходими обекти."
#: builtin/clone.c:626
msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
msgstr ""
+"указателÑÑ‚ „HEAD“ от отдалеченото хранилище Ñочи към нещо,\n"
+"което не ÑъщеÑтвува. Ðе може да Ñе изтегли определен клон.\n"
#: builtin/clone.c:657
msgid "unable to checkout working tree"
-msgstr ""
+msgstr "работното дърво не може да бъде подготвено"
#: builtin/clone.c:765
msgid "Too many arguments."
-msgstr ""
+msgstr "Прекалено много аргументи."
#: builtin/clone.c:769
msgid "You must specify a repository to clone."
-msgstr ""
+msgstr "ТрÑбва да укажете кое хранилище иÑкате да клонирате."
#: builtin/clone.c:780
#, c-format
msgid "--bare and --origin %s options are incompatible."
-msgstr ""
+msgstr "опциите „--bare“ и „--origin %s“ Ñа неÑъвмеÑтими."
#: builtin/clone.c:783
msgid "--bare and --separate-git-dir are incompatible."
-msgstr ""
+msgstr "опциите „--bare“ и „--separate-git-dir“ Ñа неÑъвмеÑтими."
#: builtin/clone.c:796
#, c-format
msgid "repository '%s' does not exist"
-msgstr ""
+msgstr "не ÑъщеÑтвува хранилище „%s“"
#: builtin/clone.c:802
msgid "--depth is ignored in local clones; use file:// instead."
msgstr ""
+"При локално клониране опциÑта „--depth“ Ñе игнорира. Ползвайте Ñхемата "
+"„file://“."
#: builtin/clone.c:805
msgid "source repository is shallow, ignoring --local"
-msgstr ""
+msgstr "клонираното хранилище е плитко, затова опциÑта „--local“ Ñе игнорира"
#: builtin/clone.c:810
msgid "--local is ignored"
-msgstr ""
+msgstr "опциÑта „--local“ Ñе игнорира"
#: builtin/clone.c:814 builtin/fetch.c:1119
#, c-format
msgid "depth %s is not a positive number"
-msgstr ""
+msgstr "дълбочината Ñ‚Ñ€Ñбва да е положително цÑло чиÑло, а не „%s“"
#: builtin/clone.c:824
#, c-format
msgid "destination path '%s' already exists and is not an empty directory."
-msgstr ""
+msgstr "целевиÑÑ‚ път „%s“ ÑъщеÑтвува и не е празна директориÑ."
#: builtin/clone.c:834
#, c-format
msgid "working tree '%s' already exists."
-msgstr ""
+msgstr "в „%s“ вече ÑъщеÑтвува работно дърво."
#: builtin/clone.c:847 builtin/clone.c:859
#, c-format
msgid "could not create leading directories of '%s'"
-msgstr ""
+msgstr "родителÑките директории на „%s“ не могат да бъдат Ñъздадени"
#: builtin/clone.c:850
#, c-format
msgid "could not create work tree dir '%s'."
-msgstr ""
+msgstr "работното дърво в „%s“ не може да бъде Ñъздадено."
#: builtin/clone.c:869
#, c-format
msgid "Cloning into bare repository '%s'...\n"
-msgstr ""
+msgstr "Клониране и Ñъздаване на голо хранилище в „%s“…\n"
#: builtin/clone.c:871
#, c-format
msgid "Cloning into '%s'...\n"
-msgstr ""
+msgstr "Клониране и Ñъздаване на хранилище в „%s“…\n"
#: builtin/clone.c:906
#, c-format
msgid "Don't know how to clone %s"
-msgstr ""
+msgstr "Ðе Ñе поддържа клониране на връзки от вида „%s“ "
#: builtin/clone.c:957 builtin/clone.c:965
#, c-format
msgid "Remote branch %s not found in upstream %s"
-msgstr ""
+msgstr "ОтдалечениÑÑ‚ клон „%s“ липÑва в клонираното хранилище „%s“"
#: builtin/clone.c:968
msgid "You appear to have cloned an empty repository."
-msgstr ""
+msgstr "Изглежда клонирахте празно хранилище."
#: builtin/column.c:9
msgid "git column [options]"
@@ -3998,11 +4115,11 @@ msgstr ""
#: builtin/commit.c:36
msgid "git commit [options] [--] <pathspec>..."
-msgstr ""
+msgstr "git commit [ОПЦИИ] [--] ПЪТ…"
#: builtin/commit.c:41
msgid "git status [options] [--] <pathspec>..."
-msgstr ""
+msgstr "git status [ОПЦИИ] [--] ПЪТ…"
#: builtin/commit.c:46
msgid ""
@@ -4017,6 +4134,17 @@ msgid ""
"\n"
" git commit --amend --reset-author\n"
msgstr ""
+"Името и адреÑÑŠÑ‚ за е-поща Ñа наÑтроени автоматично на базата на името на\n"
+"Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð¸Ñ‚ÐµÐ»Ñ Ð¸ името на машината. Проверете дали Ñа верни. Можете да Ñпрете\n"
+"това Ñъобщение като изрично зададете ÑтойноÑтите:\n"
+"\n"
+" git config --global user.name \"Вашето Име\"\n"
+" git config --global user.email пенчо@example.com\n"
+"\n"
+"След като направите това, можете да коригирате информациÑта за автора на\n"
+"текущото подаване чрез:\n"
+"\n"
+" git commit --amend --reset-author\n"
#: builtin/commit.c:58
msgid ""
@@ -4024,6 +4152,11 @@ msgid ""
"it empty. You can repeat your command with --allow-empty, or you can\n"
"remove the commit entirely with \"git reset HEAD^\".\n"
msgstr ""
+"ПоиÑкахте да поправите поÑледното Ñи подаване. Това дейÑтвие ще превърне\n"
+"подаването в празно. Можете или да го повторите като разрешите такива "
+"подаваниÑ\n"
+"Ñ Ð¾Ð¿Ñ†Ð¸Ñта „--allow-empty“, или да го изтриете от иÑториÑта Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ‚Ð°:\n"
+"„git reset HEAD^“.\n"
#: builtin/commit.c:63
msgid ""
@@ -4033,10 +4166,16 @@ msgid ""
" git commit --allow-empty\n"
"\n"
msgstr ""
+"Предишното отбрано подаване вече е празно, като най-вероÑтната причина е\n"
+"ÐºÐ¾Ñ€ÐµÐºÑ†Ð¸Ñ Ð½Ð° конфликт. Ðко вÑе пак иÑкате да го ползвате, използвайте "
+"командата:\n"
+"\n"
+" git commit --allow-empty\n"
+"\n"
#: builtin/commit.c:70
msgid "Otherwise, please use 'git reset'\n"
-msgstr ""
+msgstr "Ð’ противен Ñлучай използвайте командата „git reset“\n"
#: builtin/commit.c:73
msgid ""
@@ -4047,95 +4186,101 @@ msgid ""
"Then \"git cherry-pick --continue\" will resume cherry-picking\n"
"the remaining commits.\n"
msgstr ""
+"Ðко иÑкате да преÑкочите това подаване, използвайте командата:\n"
+"\n"
+" git reset\n"
+"\n"
+"Чрез командата „git cherry-pick --continue“ ще продължите отбирането на\n"
+"оÑтаналите подаваниÑ.\n"
-#: builtin/commit.c:287
+#: builtin/commit.c:288
msgid "failed to unpack HEAD tree object"
-msgstr ""
+msgstr "неуÑпешно изваждана на върховото дърво (HEAD tree object) от пакет"
-#: builtin/commit.c:329
+#: builtin/commit.c:330
msgid "unable to create temporary index"
-msgstr ""
+msgstr "неуÑпешно Ñъздаване на временен индекÑ"
-#: builtin/commit.c:335
+#: builtin/commit.c:336
msgid "interactive add failed"
-msgstr ""
+msgstr "неуÑпешно интерактивно добавÑне"
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
msgid "unable to write new_index file"
-msgstr ""
+msgstr "неуÑпешен Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° Ð½Ð¾Ð²Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑ"
-#: builtin/commit.c:420
+#: builtin/commit.c:421
msgid "cannot do a partial commit during a merge."
-msgstr ""
+msgstr "по време на Ñливане не може да Ñе извърши чаÑтично подаване."
-#: builtin/commit.c:422
+#: builtin/commit.c:423
msgid "cannot do a partial commit during a cherry-pick."
-msgstr ""
+msgstr "по време на отбиране не може да Ñе извърши чаÑтично подаване."
-#: builtin/commit.c:432
+#: builtin/commit.c:433
msgid "cannot read the index"
-msgstr ""
+msgstr "индекÑÑŠÑ‚ не може да бъде прочетен"
-#: builtin/commit.c:452
+#: builtin/commit.c:453
msgid "unable to write temporary index file"
-msgstr ""
+msgstr "временниÑÑ‚ Ð¸Ð½Ð´ÐµÐºÑ Ð½Ðµ може да бъде запиÑан"
-#: builtin/commit.c:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
#, c-format
msgid "invalid commit: %s"
-msgstr ""
+msgstr "неправилно подаване: %s"
-#: builtin/commit.c:571
+#: builtin/commit.c:572
msgid "malformed --author parameter"
-msgstr ""
+msgstr "неправилен параметър към опциÑта „--author“"
-#: builtin/commit.c:591
+#: builtin/commit.c:592
#, c-format
msgid "Malformed ident string: '%s'"
-msgstr ""
+msgstr "Ðеправилен низ за идентичноÑÑ‚: „%s“"
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
#, c-format
msgid "could not lookup commit %s"
-msgstr ""
+msgstr "Ñледното подаване не може да бъде открито: %s"
-#: builtin/commit.c:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 builtin/shortlog.c:273
#, c-format
msgid "(reading log message from standard input)\n"
-msgstr ""
+msgstr "(изчитане на Ñъобщението за подаване от ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð²Ñ…Ð¾Ð´)\n"
-#: builtin/commit.c:644
+#: builtin/commit.c:643
msgid "could not read log from standard input"
-msgstr ""
+msgstr "Ñъобщението за подаване не бе прочетено ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð²Ñ…Ð¾Ð´"
-#: builtin/commit.c:648
+#: builtin/commit.c:647
#, c-format
msgid "could not read log file '%s'"
-msgstr ""
+msgstr "файлът ÑÑŠÑ Ñъобщението за подаване „%s“ не може да бъде прочетен"
#: builtin/commit.c:654
msgid "commit has empty message"
-msgstr ""
+msgstr "подаване Ñ Ð¿Ñ€Ð°Ð·Ð½Ð¾ Ñъобщение"
#: builtin/commit.c:670
msgid "could not read MERGE_MSG"
-msgstr ""
+msgstr "Ñъобщението за Ñливане MERGE_MSG не може да бъде прочетено"
#: builtin/commit.c:674
msgid "could not read SQUASH_MSG"
-msgstr ""
+msgstr "Ñъобщението за Ñмачкване SQUASH_MSG не може да бъде прочетено"
#: builtin/commit.c:678
#, c-format
msgid "could not read '%s'"
-msgstr ""
+msgstr "файлът „%s“ не може да бъде прочетен"
#: builtin/commit.c:749
msgid "could not write commit template"
-msgstr ""
+msgstr "шаблонът за подаване не може да бъде запазен"
# FIXME
-#: builtin/commit.c:760
+#: builtin/commit.c:764
#, c-format
msgid ""
"\n"
@@ -4144,9 +4289,14 @@ msgid ""
"\t%s\n"
"and try again.\n"
msgstr ""
+"\n"
+"Изглежда, че подавате Ñливане. Ðко това не е така, изтрийте файла:\n"
+"\n"
+" %s\n"
+"и опитайте отново.\n"
# FIXME
-#: builtin/commit.c:765
+#: builtin/commit.c:769
#, c-format
msgid ""
"\n"
@@ -4155,681 +4305,724 @@ msgid ""
"\t%s\n"
"and try again.\n"
msgstr ""
+"\n"
+"Изглежда, че извършвате отбрано подаване. Ðко това не е така, изтрийте "
+"файла:\n"
+"\n"
+" %s\n"
+"и опитайте отново.\n"
-#: builtin/commit.c:777
+#: builtin/commit.c:782
#, 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 ""
+"Въведете Ñъобщението за подаване на промените. Редовете, които започват\n"
+"Ñ â€ž%c“ ще бъдат филтрирани, а празно Ñъобщение Ð¾Ñ‚Ð¼ÐµÐ½Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ‚Ð¾.\n"
-#: builtin/commit.c:782
+#: builtin/commit.c:789
#, 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 ""
+"Въведете Ñъобщението за подаване на промените. Редовете, които започват\n"
+"Ñ â€ž%c“ ÐЯМРда бъдат филтрирани, може да ги изтриете вие. Празно \n"
+"Ñъобщение Ð¾Ñ‚Ð¼ÐµÐ½Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½ÐµÑ‚Ð¾.\n"
-#: builtin/commit.c:795
+#: builtin/commit.c:802
#, c-format
msgid "%sAuthor: %s"
-msgstr ""
+msgstr "%sÐвтор: %s"
-#: builtin/commit.c:802
+#: builtin/commit.c:809
#, c-format
msgid "%sCommitter: %s"
-msgstr ""
+msgstr "%sПодаващ: %s"
-#: builtin/commit.c:822
+#: builtin/commit.c:829
msgid "Cannot read index"
-msgstr ""
+msgstr "ИндекÑÑŠÑ‚ не може да бъде прочетен"
-#: builtin/commit.c:865
+#: builtin/commit.c:872
msgid "Error building trees"
-msgstr ""
+msgstr "Грешка при изграждане на дърветата"
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
#, c-format
msgid "Please supply the message using either -m or -F option.\n"
-msgstr ""
+msgstr "Подайте Ñъобщението Ñ Ð½ÑÐºÐ¾Ñ Ð¾Ñ‚ опциите „-m“ или „-F“.\n"
-#: builtin/commit.c:982
+#: builtin/commit.c:989
#, c-format
msgid "No existing author found with '%s'"
-msgstr ""
+msgstr "Ðе е открит автор Ñ Ð¸Ð¼Ðµ „%s“."
-#: builtin/commit.c:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
#, c-format
msgid "Invalid untracked files mode '%s'"
-msgstr ""
+msgstr "Ðеправилна ÑтойноÑÑ‚ за неÑледените файлове: „%s“"
-#: builtin/commit.c:1034
+#: builtin/commit.c:1041
msgid "--long and -z are incompatible"
-msgstr ""
+msgstr "Опциите „--long“ и „-z“ Ñа неÑъвмеÑтими."
-#: builtin/commit.c:1064
+#: builtin/commit.c:1071
msgid "Using both --reset-author and --author does not make sense"
-msgstr ""
+msgstr "Опциите „--reset-author“ и „--author“ Ñа неÑъвмеÑтими."
-#: builtin/commit.c:1075
+#: builtin/commit.c:1080
msgid "You have nothing to amend."
-msgstr ""
+msgstr "ÐÑма какво да бъде поправено."
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
msgid "You are in the middle of a merge -- cannot amend."
-msgstr ""
+msgstr "Ð’ момента Ñе извършва Ñливане, не можете да поправÑте."
-#: builtin/commit.c:1080
+#: builtin/commit.c:1085
msgid "You are in the middle of a cherry-pick -- cannot amend."
-msgstr ""
+msgstr "Ð’ момента Ñе извършва отбиране на подаване, не можете да поправÑте."
-#: builtin/commit.c:1083
+#: builtin/commit.c:1088
msgid "Options --squash and --fixup cannot be used together"
-msgstr ""
+msgstr "Опциите „--squash“ и „--fixup“ Ñа неÑъвмеÑтими."
-#: builtin/commit.c:1093
+#: builtin/commit.c:1098
msgid "Only one of -c/-C/-F/--fixup can be used."
msgstr ""
+"Можете да използвате Ñамо една от опциите „-c“, „-C“, „-F“ и „--fixup“."
-#: builtin/commit.c:1095
+#: builtin/commit.c:1100
msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
-msgstr ""
+msgstr "ОпциÑта „-m“ е неÑъвмеÑтима Ñ â€ž-c“, „-C“, „-F“ и „--fixup“."
-#: builtin/commit.c:1103
+#: builtin/commit.c:1108
msgid "--reset-author can be used only with -C, -c or --amend."
msgstr ""
+"ОпциÑта „--reset-author“ може да Ñе използва Ñамо заедно Ñ â€ž-C“, „-c“ или\n"
+"„--amend“."
-#: builtin/commit.c:1120
+#: builtin/commit.c:1125
msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
msgstr ""
+"Опциите „--include“, „--only“, „--all“, „--interactive“ и „--patch“ Ñа\n"
+"неÑъвмеÑтими."
-#: builtin/commit.c:1122
+#: builtin/commit.c:1127
msgid "No paths with --include/--only does not make sense."
-msgstr ""
+msgstr "Опциите „--include“ и „--only“ изиÑкват аргументи."
-#: builtin/commit.c:1124
+# FIXME bad message
+#: builtin/commit.c:1129
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..."
+#: builtin/commit.c:1131
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
msgstr ""
+"Зададени Ñа изрични пътища без опциите „-i“ или „-o“. Приема Ñе, че вÑе едно "
+"Ñте\n"
+"ползвали опциÑта „--only“ Ñ ÐŸÐªÐ¢Ð¸Ñ‰Ð°â€¦"
-#: builtin/commit.c:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
#, c-format
msgid "Invalid cleanup mode %s"
-msgstr ""
+msgstr "ÐеÑъщеÑтвуващ режим на изчиÑтване „%s“"
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
msgid "Paths with -a does not make sense."
-msgstr ""
+msgstr "Използването на пътища е неÑъвмеÑтимо ÑÑŠÑ Ð·Ð°Ð´Ð°Ð²Ð°Ð½ÐµÑ‚Ð¾ на опциÑта „-a“."
-#: builtin/commit.c:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
msgid "show status concisely"
-msgstr ""
+msgstr "кратка Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° ÑÑŠÑтоÑнието"
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
msgid "show branch information"
-msgstr ""
+msgstr "Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° клоните"
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
msgid "machine-readable output"
-msgstr ""
+msgstr "формат на изхода за четене от програма"
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
msgid "show status in long format (default)"
-msgstr ""
+msgstr "подробна Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° ÑÑŠÑтоÑнието (Ñтандартно)"
-#: builtin/commit.c:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
msgid "terminate entries with NUL"
-msgstr ""
+msgstr "разделÑне на елементите Ñ Ð½ÑƒÐ»ÐµÐ²Ð¸Ñ Ð·Ð½Ð°Ðº „NUL“"
-#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:459
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
msgid "mode"
-msgstr ""
+msgstr "режим"
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
msgstr ""
+"извеждане на неÑледените файлове. Възможните режими Ñа „all“ (подробна\n"
+"информациÑ), „normal“ (кратка информациÑ), „no“ (без неÑледените файлове).\n"
+"СтандартниÑÑ‚ режим е: „all“."
-#: builtin/commit.c:1267
+#: builtin/commit.c:1274
msgid "show ignored files"
-msgstr ""
+msgstr "извеждане на игнорираните файлове"
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
msgid "when"
msgstr "кога"
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
msgid ""
"ignore changes to submodules, optional when: all, dirty, untracked. "
"(Default: all)"
msgstr ""
+"игнориране на промените в подмодулите. ÐžÐ¿Ñ†Ð¸Ñ Ñ Ð½ÐµÐ·Ð°Ð´ÑŠÐ»Ð¶Ð¸Ñ‚ÐµÐ»Ð½Ð° ÑтойноÑÑ‚ — "
+"една от\n"
+"„all“ (вÑички), „dirty“ (тези Ñ Ð½ÐµÐ¿Ð¾Ð´Ð°Ð´ÐµÐ½Ð¸ промени), „untracked“ (неÑледени)"
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
msgid "list untracked files in columns"
-msgstr ""
+msgstr "извеждане на неÑледените файлове в колони"
-#: builtin/commit.c:1340
+#: builtin/commit.c:1347
msgid "couldn't look up newly created commit"
-msgstr ""
+msgstr "току що Ñъздаденото подаване не може да бъде открито"
-#: builtin/commit.c:1342
+#: builtin/commit.c:1349
msgid "could not parse newly created commit"
-msgstr ""
+msgstr "току що Ñъздаденото подаване не може да бъде анализирано"
-#: builtin/commit.c:1383
+#: builtin/commit.c:1390
msgid "detached HEAD"
-msgstr ""
+msgstr "неÑвързан връх HEAD"
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
msgid " (root-commit)"
-msgstr ""
+msgstr " (начално подаване)"
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
msgid "suppress summary after successful commit"
-msgstr ""
+msgstr "без Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñлед уÑпешно подаване"
-#: builtin/commit.c:1453
+#: builtin/commit.c:1487
msgid "show diff in commit message template"
-msgstr ""
+msgstr "добавÑне на разликата към шаблона за Ñъобщението при подаване"
-#: builtin/commit.c:1455
+#: builtin/commit.c:1489
msgid "Commit message options"
-msgstr ""
+msgstr "Опции за Ñъобщението при подаване"
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
msgid "read message from file"
-msgstr ""
+msgstr "взимане та Ñъобщението от файл"
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "author"
-msgstr ""
+msgstr "автор"
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "override author for commit"
-msgstr ""
+msgstr "задаване на автор за подаването"
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
msgid "date"
msgstr "дата"
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
msgid "override date for commit"
-msgstr ""
+msgstr "задаване на дата за подаването"
-#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405
-#: builtin/notes.c:562 builtin/tag.c:455
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
msgid "message"
-msgstr ""
+msgstr "Ñъобщение"
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
msgid "commit message"
-msgstr ""
+msgstr "Ñъобщение при подаване"
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
msgid "reuse and edit message from specified commit"
-msgstr ""
+msgstr "преизползване и редактиране на Ñъобщението от указаното подаване"
-#: builtin/commit.c:1461
+#: builtin/commit.c:1495
msgid "reuse message from specified commit"
-msgstr ""
+msgstr "преизползване на Ñъобщението от указаното подаване"
-#: builtin/commit.c:1462
+#: builtin/commit.c:1496
msgid "use autosquash formatted message to fixup specified commit"
msgstr ""
+"използване на автоматичното Ñъобщение при Ñмачкване за вкарване на "
+"указаното\n"
+"подаване в предното без Ñледа"
-#: builtin/commit.c:1463
+#: builtin/commit.c:1497
msgid "use autosquash formatted message to squash specified commit"
msgstr ""
+"използване на автоматичното Ñъобщение при Ñмачкване за Ñмачкване на "
+"указаното\n"
+"подаване в предното"
-#: builtin/commit.c:1464
+#: builtin/commit.c:1498
msgid "the commit is authored by me now (used with -C/-c/--amend)"
msgstr ""
+"ÑмÑна на автора да Ñъвпада Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ñ‰Ð¸Ñ (използва Ñе Ñ â€ž-C“/„-c“/„--amend“)"
-#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
msgid "add Signed-off-by:"
-msgstr ""
+msgstr "добавÑне на поле за Ð¿Ð¾Ð´Ð¿Ð¸Ñ â€” „Signed-off-by:“"
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
msgid "use specified template file"
-msgstr ""
+msgstr "използване на ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½ÐµÐ½ файл"
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
msgid "force edit of commit"
-msgstr ""
+msgstr "редактиране на подаване"
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
msgid "default"
-msgstr ""
+msgstr "Ñтандартно"
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
msgid "how to strip spaces and #comments from message"
-msgstr ""
+msgstr "кои празни знаци и #коментари да Ñе махат от ÑъобщениÑта"
-#: builtin/commit.c:1469
+#: builtin/commit.c:1503
msgid "include status in commit message template"
-msgstr ""
+msgstr "вмъкване на ÑÑŠÑтоÑнието в шаблона за Ñъобщението при подаване"
-#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
-msgstr ""
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
+msgstr "ИДЕÐТИФИКÐТОР_ÐÐ_КЛЮЧ"
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
msgid "GPG sign commit"
-msgstr ""
+msgstr "подпиÑване на подаването Ñ GPG"
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
msgid "Commit contents options"
-msgstr ""
+msgstr "Опции за избор на файлове при подаване"
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
msgid "commit all changed files"
-msgstr ""
+msgstr "подаване на вÑички променени файлове"
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
msgid "add specified files to index for commit"
-msgstr ""
+msgstr "добавÑне на указаните файлове към индекÑа за подаване"
-#: builtin/commit.c:1477
+#: builtin/commit.c:1511
msgid "interactively add files"
-msgstr ""
+msgstr "интерактивно добавÑне на файлове"
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
msgid "interactively add changes"
-msgstr ""
+msgstr "интерактивно добавÑне на промени"
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
msgid "commit only specified files"
-msgstr ""
+msgstr "подаване Ñамо на указаните файлове"
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
msgid "bypass pre-commit hook"
-msgstr ""
+msgstr "без изпълнение на куката преди подаване (pre-commit)"
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
msgid "show what would be committed"
-msgstr ""
+msgstr "отпечатване на това, което би било подадено"
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
msgid "amend previous commit"
-msgstr ""
+msgstr "поправÑне на предишното подаване"
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
msgid "bypass post-rewrite hook"
-msgstr ""
+msgstr "без изпълнение на куката Ñлед презапиÑване (post-rewrite)"
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
msgid "ok to record an empty change"
-msgstr ""
+msgstr "позволÑване на празни подаваниÑ"
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
msgid "ok to record a change with an empty message"
-msgstr ""
+msgstr "позволÑване на Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ñ Ð¿Ñ€Ð°Ð·Ð½Ð¸ ÑъобщениÑ"
-#: builtin/commit.c:1529
+#: builtin/commit.c:1562
msgid "could not parse HEAD commit"
-msgstr ""
+msgstr "върховото подаване „HEAD“ не може да бъде прочетено"
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 builtin/merge.c:518
#, c-format
msgid "could not open '%s' for reading"
-msgstr ""
+msgstr "файлът не може да бъде прочетен: „%s“"
-#: builtin/commit.c:1574
+#: builtin/commit.c:1608
#, c-format
msgid "Corrupt MERGE_HEAD file (%s)"
-msgstr ""
+msgstr "Повреден файл за върха за Ñливането „MERGE_HEAD“ (%s)"
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
msgid "could not read MERGE_MODE"
-msgstr ""
+msgstr "режимът на Ñливане „MERGE_MODE“ не може да бъде прочетен"
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
#, c-format
msgid "could not read commit message: %s"
-msgstr ""
+msgstr "Ñъобщението за подаване не може да бъде прочетено: %s"
-#: builtin/commit.c:1611
+#: builtin/commit.c:1645
#, c-format
msgid "Aborting commit; you did not edit the message.\n"
-msgstr ""
+msgstr "Ðеизвършване на подаване поради нередактирано Ñъобщение.\n"
-#: builtin/commit.c:1616
+#: builtin/commit.c:1650
#, c-format
msgid "Aborting commit due to empty commit message.\n"
-msgstr ""
+msgstr "Ðеизвършване на подаване поради празно Ñъобщение.\n"
-#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
msgid "failed to write commit object"
-msgstr ""
+msgstr "обектът за подаването не може да бъде запиÑан"
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
msgid "cannot lock HEAD ref"
-msgstr ""
+msgstr "указателÑÑ‚ към върха „HEAD“ не може да бъде заключен"
-#: builtin/commit.c:1656
+#: builtin/commit.c:1690
msgid "cannot update HEAD ref"
-msgstr ""
+msgstr "указателÑÑ‚ към върха „HEAD“ не може да бъде обновен"
-#: builtin/commit.c:1667
+#: builtin/commit.c:1701
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 ""
+"Хранилището е обновено, но новиÑÑ‚ файл за Ð¸Ð½Ð´ÐµÐºÑ â€žnew_index“\n"
+"не е запиÑан. Проверете дали не е препълнен диÑка или не Ñте\n"
+"превишили диÑковата Ñи квота. След това изпълнете „git reset HEAD“."
#: builtin/config.c:8
msgid "git config [options]"
-msgstr ""
+msgstr "git config [ОПЦИИ]"
-#: builtin/config.c:54
+#: builtin/config.c:53
msgid "Config file location"
-msgstr ""
+msgstr "МеÑтоположение на ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»"
-#: builtin/config.c:55
+#: builtin/config.c:54
msgid "use global config file"
-msgstr ""
+msgstr "използване на Ð³Ð»Ð¾Ð±Ð°Ð»Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¾Ð½ÐµÐ½ файл"
-#: builtin/config.c:56
+#: builtin/config.c:55
msgid "use system config file"
-msgstr ""
+msgstr "използване на ÑиÑÑ‚ÐµÐ¼Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¾Ð½ÐµÐ½ файл"
-#: builtin/config.c:57
+#: builtin/config.c:56
msgid "use repository config file"
-msgstr ""
+msgstr "използване на ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» на хранилището"
-#: builtin/config.c:58
+#: builtin/config.c:57
msgid "use given config file"
-msgstr ""
+msgstr "използване на Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¾Ð½ÐµÐ½ файл"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "blob-id"
-msgstr ""
+msgstr "идентификатор на BLOB"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "read config from given blob object"
msgstr ""
+"изчитане на конфигурациÑта от BLOB Ñ Ñ‚Ð¾Ð·Ð¸ идентификатор на Ñъдържанието"
-#: builtin/config.c:60
+#: builtin/config.c:59
msgid "Action"
-msgstr ""
+msgstr "ДейÑтвие"
-#: builtin/config.c:61
+#: builtin/config.c:60
msgid "get value: name [value-regex]"
-msgstr ""
+msgstr "извеждане на ÑтойноÑÑ‚: ИМЕ [РЕГУЛЯРЕÐ_ИЗРÐЗ_ЗÐ_СТОЙÐОСТТÐ]"
-#: builtin/config.c:62
+#: builtin/config.c:61
msgid "get all values: key [value-regex]"
-msgstr ""
+msgstr "извеждане на вÑички ÑтойноÑти: ключ [РЕГУЛЯРЕÐ_ИЗРÐЗ_ЗÐ_СТОЙÐОСТТÐ]"
-#: builtin/config.c:63
+#: builtin/config.c:62
msgid "get values for regexp: name-regex [value-regex]"
msgstr ""
+"извеждане на ÑтойноÑтите за РЕГУЛЯРÐиÑ_ИЗРÐЗ: РЕГУЛЯРЕÐ_ИЗРÐЗ_ЗÐ_ИМЕТО "
+"[РЕГУЛЯРЕÐ_ИЗРÐЗ_ЗÐ_СТОЙÐОСТТÐ]"
-#: builtin/config.c:64
+#: builtin/config.c:63
msgid "get value specific for the URL: section[.var] URL"
-msgstr ""
+msgstr "извеждане на ÑтойноÑтта за ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð°Ð´Ñ€ÐµÑ: РÐЗДЕЛ[.ПРОМЕÐЛИВÐ] ÐДРЕС"
-#: builtin/config.c:65
+#: builtin/config.c:64
msgid "replace all matching variables: name value [value_regex]"
msgstr ""
+"замÑна на вÑички Ñъвпадащи променливи: ИМЕ СТОЙÐОСТ "
+"[РЕГУЛЯРЕÐ_ИЗРÐЗ_ЗÐ_СТОЙÐОСТТÐ]"
-#: builtin/config.c:66
+#: builtin/config.c:65
msgid "add a new variable: name value"
-msgstr ""
+msgstr "добавÑне на нова променлива: ИМЕ СТОЙÐОСТ"
-#: builtin/config.c:67
+#: builtin/config.c:66
msgid "remove a variable: name [value-regex]"
-msgstr ""
+msgstr "изтриване на променлива: ИМЕ [РЕГУЛЯРЕÐ_ИЗРÐЗ_ЗÐ_СТОЙÐОСТТÐ]"
-#: builtin/config.c:68
+#: builtin/config.c:67
msgid "remove all matches: name [value-regex]"
-msgstr ""
+msgstr "изтриване на вÑички Ñъвпадащи: ИМЕ [РЕГУЛЯРЕÐ_ИЗРÐЗ_ЗÐ_СТОЙÐОСТТÐ]"
-#: builtin/config.c:69
+#: builtin/config.c:68
msgid "rename section: old-name new-name"
-msgstr ""
+msgstr "преименуване на раздел: СТÐРО_ИМЕ ÐОВО_ИМЕ"
-#: builtin/config.c:70
+#: builtin/config.c:69
msgid "remove a section: name"
-msgstr ""
+msgstr "изтриване на раздел: ИМЕ"
-#: builtin/config.c:71
+#: builtin/config.c:70
msgid "list all"
-msgstr ""
+msgstr "изброÑване на вÑички"
-#: builtin/config.c:72
+#: builtin/config.c:71
msgid "open an editor"
-msgstr ""
+msgstr "отварÑне на редактор"
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
msgid "slot"
-msgstr ""
+msgstr "наÑтройка"
-#: builtin/config.c:73
+#: builtin/config.c:72
msgid "find the color configured: [default]"
-msgstr ""
+msgstr "извеждане на Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð¸Ñ Ñ†Ð²ÑÑ‚ на наÑтройката: [Ñтандартно]"
-#: builtin/config.c:74
+#: builtin/config.c:73
msgid "find the color setting: [stdout-is-tty]"
msgstr ""
+"извеждане на Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð¸Ñ Ñ†Ð²ÑÑ‚ на наÑтройката: [ÑтандартниÑÑ‚ изход е терминал]"
-#: builtin/config.c:75
+#: builtin/config.c:74
msgid "Type"
-msgstr ""
+msgstr "Вид"
-#: builtin/config.c:76
+#: builtin/config.c:75
msgid "value is \"true\" or \"false\""
-msgstr ""
+msgstr "СТОЙÐОСТТРе „true“ (иÑтина) или „false“ (лъжа)"
-#: builtin/config.c:77
+#: builtin/config.c:76
msgid "value is decimal number"
-msgstr ""
+msgstr "СТОЙÐОСТТРе цÑло, деÑетично чиÑло"
-#: builtin/config.c:78
+#: builtin/config.c:77
msgid "value is --bool or --int"
-msgstr ""
+msgstr "СТОЙÐОСТТРе „--bool“ (булева) или „--int“ (деÑетично цÑло чиÑло)"
-#: builtin/config.c:79
+#: builtin/config.c:78
msgid "value is a path (file or directory name)"
-msgstr ""
+msgstr "СТОЙÐОСТТРе път (до файл или директориÑ)"
-#: builtin/config.c:80
+#: builtin/config.c:79
msgid "Other"
-msgstr ""
+msgstr "Други"
-#: builtin/config.c:81
+# FIXME NUL byte to null char, terminate -> razdelitel - da stane ednakvo
+#: builtin/config.c:80
msgid "terminate values with NUL byte"
-msgstr ""
+msgstr "разделÑне на ÑтойноÑтите Ñ Ð½ÑƒÐ»ÐµÐ²Ð¸Ñ Ð·Ð½Ð°Ðº „NUL“"
-#: builtin/config.c:82
+#: builtin/config.c:81
msgid "respect include directives on lookup"
-msgstr ""
+msgstr "при Ñ‚ÑŠÑ€Ñене да Ñе уважат и директивите за включване"
#: builtin/count-objects.c:82
msgid "git count-objects [-v] [-H | --human-readable]"
-msgstr ""
+msgstr "git count-objects [-v] [-H | --human-readable]"
#: builtin/count-objects.c:97
msgid "print sizes in human readable format"
-msgstr ""
+msgstr "извеждане на размерите на обектите във формат леÑно четим от хора"
+# FIXME ... instead of *???
#: builtin/describe.c:16
msgid "git describe [options] <commit-ish>*"
-msgstr ""
+msgstr "git describe [ОПЦИИ] указател към подаване…"
#: builtin/describe.c:17
msgid "git describe [options] --dirty"
msgstr ""
-#: builtin/describe.c:237
+#: builtin/describe.c:225
#, c-format
msgid "annotated tag %s not available"
msgstr ""
-#: builtin/describe.c:241
+#: builtin/describe.c:229
#, c-format
msgid "annotated tag %s has no embedded name"
msgstr ""
-#: builtin/describe.c:243
+#: builtin/describe.c:231
#, c-format
msgid "tag '%s' is really '%s' here"
msgstr ""
-#: builtin/describe.c:270
+#: builtin/describe.c:258
#, c-format
msgid "Not a valid object name %s"
msgstr ""
-#: builtin/describe.c:273
+#: builtin/describe.c:261
#, c-format
msgid "%s is not a valid '%s' object"
msgstr ""
-#: builtin/describe.c:290
+#: builtin/describe.c:278
#, c-format
msgid "no tag exactly matches '%s'"
msgstr ""
-#: builtin/describe.c:292
+#: builtin/describe.c:280
#, c-format
msgid "searching to describe %s\n"
msgstr ""
-#: builtin/describe.c:332
+#: builtin/describe.c:327
#, c-format
msgid "finished search at %s\n"
msgstr ""
-#: builtin/describe.c:359
+#: builtin/describe.c:354
#, c-format
msgid ""
"No annotated tags can describe '%s'.\n"
"However, there were unannotated tags: try --tags."
msgstr ""
-#: builtin/describe.c:363
+#: builtin/describe.c:358
#, c-format
msgid ""
"No tags can describe '%s'.\n"
"Try --always, or create some tags."
msgstr ""
-#: builtin/describe.c:384
+#: builtin/describe.c:379
#, c-format
msgid "traversed %lu commits\n"
msgstr ""
-#: builtin/describe.c:387
+#: builtin/describe.c:382
#, c-format
msgid ""
"more than %i tags found; listed %i most recent\n"
"gave up search at %s\n"
msgstr ""
-#: builtin/describe.c:409
+#: builtin/describe.c:404
msgid "find the tag that comes after the commit"
msgstr ""
-#: builtin/describe.c:410
+#: builtin/describe.c:405
msgid "debug search strategy on stderr"
msgstr ""
-#: builtin/describe.c:411
+#: builtin/describe.c:406
msgid "use any ref"
msgstr ""
-#: builtin/describe.c:412
+#: builtin/describe.c:407
msgid "use any tag, even unannotated"
msgstr ""
-#: builtin/describe.c:413
+#: builtin/describe.c:408
msgid "always use long format"
msgstr ""
-#: builtin/describe.c:414
+#: builtin/describe.c:409
msgid "only follow first parent"
msgstr ""
-#: builtin/describe.c:417
+#: builtin/describe.c:412
msgid "only output exact matches"
msgstr ""
-#: builtin/describe.c:419
-#, fuzzy
+#: builtin/describe.c:414
msgid "consider <n> most recent tags (default: 10)"
-msgstr "<брой>"
+msgstr "да Ñе Ñ‚ÑŠÑ€Ñи Ñамо в този БРОЙ поÑледни етикети (Ñтандартно: 10)"
-#: builtin/describe.c:421
+#: builtin/describe.c:416
msgid "only consider tags matching <pattern>"
msgstr ""
-#: builtin/describe.c:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
msgid "show abbreviated commit object as fallback"
msgstr ""
-#: builtin/describe.c:424
+#: builtin/describe.c:419
msgid "mark"
msgstr ""
-#: builtin/describe.c:425
+#: builtin/describe.c:420
msgid "append <mark> on dirty working tree (default: \"-dirty\")"
msgstr ""
-#: builtin/describe.c:443
+#: builtin/describe.c:438
msgid "--long is incompatible with --abbrev=0"
msgstr ""
-#: builtin/describe.c:469
+#: builtin/describe.c:464
msgid "No names found, cannot describe anything."
msgstr ""
-#: builtin/describe.c:489
+#: builtin/describe.c:484
msgid "--dirty is incompatible with commit-ishes"
-msgstr ""
+msgstr "опциÑта „--dirty“ е неÑъвмеÑтима Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ» към подаване"
#: builtin/diff.c:85
#, c-format
msgid "'%s': not a regular file or symlink"
-msgstr ""
+msgstr "„%s“: не е нито обикновен файл, нито Ñимволна връзка"
#: builtin/diff.c:236
#, c-format
msgid "invalid option: %s"
-msgstr ""
+msgstr "неправилна опциÑ: %s"
#: builtin/diff.c:357
msgid "Not a git repository"
-msgstr ""
+msgstr "Ðе е хранилище на Git"
#: builtin/diff.c:400
#, c-format
msgid "invalid object '%s' given."
-msgstr ""
+msgstr "зададен е неправилен обект „%s“."
#: builtin/diff.c:409
#, c-format
msgid "more than two blobs given: '%s'"
-msgstr ""
+msgstr "зададени Ñа повече от 2 обекта: „%s“"
#: builtin/diff.c:416
#, c-format
msgid "unhandled object '%s' given."
-msgstr ""
+msgstr "зададен е неподдържан обект „%s“."
#: 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 "<брой>"
+msgstr "Ñъобщение за напредъка на вÑеки такъв БРОЙ обекта"
#: builtin/fast-export.c:675
msgid "select handling of signed tags"
@@ -4865,165 +5058,168 @@ msgstr ""
#: builtin/fetch.c:20
msgid "git fetch [<options>] [<repository> [<refspec>...]]"
-msgstr ""
+msgstr "git fetch [ОПЦИИ] [ХРÐÐИЛИЩЕ [УКÐЗÐТЕЛ…]]"
#: builtin/fetch.c:21
msgid "git fetch [<options>] <group>"
-msgstr ""
+msgstr "git fetch [ОПЦИИ] ГРУПÐ"
#: builtin/fetch.c:22
msgid "git fetch --multiple [<options>] [(<repository> | <group>)...]"
-msgstr ""
+msgstr "git fetch --multiple [ОПЦИИ] [(ХРÐÐИЛИЩЕ | ГРУПÐ)…]"
#: builtin/fetch.c:23
msgid "git fetch --all [<options>]"
-msgstr ""
+msgstr "git fetch --all [ОПЦИИ]"
#: builtin/fetch.c:75
msgid "fetch from all remotes"
-msgstr ""
+msgstr "доÑтавÑне от вÑички отдалечени хранилища"
#: builtin/fetch.c:77
msgid "append to .git/FETCH_HEAD instead of overwriting"
-msgstr ""
+msgstr "добавÑне към вмеÑто замÑна на „.git/FETCH_HEAD“"
#: builtin/fetch.c:79
msgid "path to upload pack on remote end"
-msgstr ""
+msgstr "отдалечен път, където да Ñе качи пакетът"
#: builtin/fetch.c:80
msgid "force overwrite of local branch"
-msgstr ""
+msgstr "принудително презапиÑване на Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½"
#: builtin/fetch.c:82
msgid "fetch from multiple remotes"
-msgstr ""
+msgstr "доÑтавÑне от множеÑтво отдалечени хранилища"
#: builtin/fetch.c:84
msgid "fetch all tags and associated objects"
-msgstr ""
+msgstr "доÑтавÑне на вÑички етикети и принадлежащи обекти"
#: builtin/fetch.c:86
msgid "do not fetch all tags (--no-tags)"
-msgstr ""
+msgstr "без доÑтавÑнето на вÑички етикети „--no-tags“"
#: builtin/fetch.c:88
msgid "prune remote-tracking branches no longer on remote"
-msgstr ""
+msgstr "окаÑÑ‚Ñ€Ñне на клоните ÑледÑщи вече не ÑъщеÑтвуващи отдалечени клони"
#: builtin/fetch.c:89
msgid "on-demand"
-msgstr ""
+msgstr "при нужда"
#: builtin/fetch.c:90
msgid "control recursive fetching of submodules"
-msgstr ""
+msgstr "управление на рекурÑивното доÑтавÑне на подмодулите"
#: builtin/fetch.c:94
msgid "keep downloaded pack"
-msgstr ""
+msgstr "запазване на изтеглените пакети Ñ Ð¾Ð±ÐµÐºÑ‚Ð¸"
#: builtin/fetch.c:96
msgid "allow updating of HEAD ref"
-msgstr ""
+msgstr "позволÑване на обновÑването на ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“"
#: builtin/fetch.c:99
msgid "deepen history of shallow clone"
-msgstr ""
+msgstr "задълбочаване на иÑториÑта на плитко хранилище"
#: builtin/fetch.c:101
msgid "convert to a complete repository"
-msgstr ""
+msgstr "превръщане в пълно хранилище"
#: builtin/fetch.c:103 builtin/log.c:1197
msgid "dir"
-msgstr ""
+msgstr "директориÑ"
#: builtin/fetch.c:104
msgid "prepend this to submodule path output"
-msgstr ""
+msgstr "добавÑне на това пред Ð¿ÑŠÑ‚Ñ Ð½Ð° подмодула"
#: builtin/fetch.c:107
msgid "default mode for recursion"
-msgstr ""
+msgstr "Ñтандартен режим на рекурÑиÑ"
#: builtin/fetch.c:109
msgid "accept refs that update .git/shallow"
-msgstr ""
+msgstr "приемане на указатели, които обновÑват „.git/shallow“"
#: builtin/fetch.c:347
msgid "Couldn't find remote ref HEAD"
-msgstr ""
+msgstr "УказателÑÑ‚ „HEAD“ в отдалеченото хранилище не може да бъде открит"
#: builtin/fetch.c:411
#, c-format
msgid "object %s not found"
-msgstr ""
+msgstr "обектът „%s“ липÑва"
#: builtin/fetch.c:416
msgid "[up to date]"
-msgstr ""
+msgstr "[актуализиран]"
+# FIXME - the signs
#: builtin/fetch.c:430
#, c-format
msgid "! %-*s %-*s -> %s (can't fetch in current branch)"
-msgstr ""
+msgstr "! %-*s %-*s -> %s (в Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½ не може да Ñе доÑтавÑ)"
#: builtin/fetch.c:431 builtin/fetch.c:517
msgid "[rejected]"
-msgstr ""
+msgstr "[отхвърлен]"
#: builtin/fetch.c:442
msgid "[tag update]"
-msgstr ""
+msgstr "[обновÑване на етикетите]"
#: builtin/fetch.c:444 builtin/fetch.c:479 builtin/fetch.c:497
msgid " (unable to update local ref)"
-msgstr ""
+msgstr " (локалните указатели не могат да бъдат обновени)"
#: builtin/fetch.c:462
msgid "[new tag]"
-msgstr ""
+msgstr "[нов етикет]"
#: builtin/fetch.c:465
msgid "[new branch]"
-msgstr ""
+msgstr "[нов клон]"
#: builtin/fetch.c:468
msgid "[new ref]"
-msgstr ""
+msgstr "[нов указател]"
#: builtin/fetch.c:513
msgid "unable to update local ref"
-msgstr ""
+msgstr "локален указател не може да бъде обновен"
#: builtin/fetch.c:513
msgid "forced update"
-msgstr ""
+msgstr "принудително обновÑване"
#: builtin/fetch.c:519
msgid "(non-fast-forward)"
-msgstr ""
+msgstr "(Ñливането не е тривиално)"
#: builtin/fetch.c:552 builtin/fetch.c:785
#, c-format
msgid "cannot open %s: %s\n"
-msgstr ""
+msgstr "файлът „%s“ не може да бъде отворен: %s\n"
#: builtin/fetch.c:561
#, c-format
msgid "%s did not send all necessary objects\n"
-msgstr ""
+msgstr "хранилището „%s“ не изпрати вÑички необходими обекти\n"
#: builtin/fetch.c:579
#, c-format
msgid "reject %s because shallow roots are not allowed to be updated"
msgstr ""
+"отхвърлÑне на върха „%s“, защото плитките хранилища не могат да бъдат "
+"обновÑвани"
#: builtin/fetch.c:667 builtin/fetch.c:750
#, c-format
msgid "From %.*s\n"
-msgstr ""
+msgstr "От %.*s\n"
#: builtin/fetch.c:678
#, c-format
@@ -5031,20 +5227,23 @@ msgid ""
"some local refs could not be updated; try running\n"
" 'git remote prune %s' to remove any old, conflicting branches"
msgstr ""
+"нÑкои локални указатели не могат да бъдат обновени. Изпълнете командата\n"
+" „git remote prune %s“, за да премахнете оÑтарелите клони, които "
+"предизвикват конфликта"
#: builtin/fetch.c:730
#, c-format
msgid " (%s will become dangling)"
-msgstr ""
+msgstr " (обектът „%s“ ще Ñе окаже извън клон)"
#: builtin/fetch.c:731
#, c-format
msgid " (%s has become dangling)"
-msgstr ""
+msgstr " (обектът „%s“ вече е извън клон)"
#: builtin/fetch.c:755
msgid "[deleted]"
-msgstr ""
+msgstr "[изтрит]"
#: builtin/fetch.c:756 builtin/remote.c:1050
msgid "(none)"
@@ -5054,98 +5253,103 @@ msgstr "(нищо)"
#, c-format
msgid "Refusing to fetch into current branch %s of non-bare repository"
msgstr ""
+"Ðе може да изтеглÑте в Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½ „%s“, на хранилище, което не е голо"
#: builtin/fetch.c:794
#, c-format
msgid "Option \"%s\" value \"%s\" is not valid for %s"
-msgstr ""
+msgstr "СтойноÑтта „%2$s“ за опциÑта „%1$s“ не е ÑъвмеÑтима Ñ â€ž%3$s“"
#: builtin/fetch.c:797
#, c-format
msgid "Option \"%s\" is ignored for %s\n"
-msgstr ""
+msgstr "ОпциÑта „%s“ Ñе игнорира при „%s“\n"
#: builtin/fetch.c:853
#, c-format
msgid "Don't know how to fetch from %s"
-msgstr ""
+msgstr "Ðе Ñе поддържа доÑтавÑне от „%s“"
#: builtin/fetch.c:1015
#, c-format
msgid "Fetching %s\n"
-msgstr ""
+msgstr "ДоÑтавÑне на „%s“\n"
#: builtin/fetch.c:1017 builtin/remote.c:90
#, c-format
msgid "Could not fetch %s"
msgstr "„%s“ не може да Ñе доÑтави"
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
msgid ""
"No remote repository specified. Please, specify either a URL or a\n"
"remote name from which new revisions should be fetched."
msgstr ""
+"Ðе Ñте указали отдалечено хранилище. Задайте или адреÑ, или име\n"
+"на отдалечено хранилище, от където да Ñе доÑтавÑÑ‚ новите верÑии."
#: builtin/fetch.c:1059
msgid "You need to specify a tag name."
-msgstr ""
+msgstr "ТрÑбва да укажете име на етикет."
#: builtin/fetch.c:1107
msgid "--depth and --unshallow cannot be used together"
-msgstr ""
+msgstr "опциите „--depth“ и „--unshallow“ Ñа неÑъвмеÑтими"
#: builtin/fetch.c:1109
msgid "--unshallow on a complete repository does not make sense"
-msgstr ""
+msgstr "не можете да използвате опциÑта „--unshallow“ върху пълно хранилище"
#: builtin/fetch.c:1132
msgid "fetch --all does not take a repository argument"
-msgstr ""
+msgstr "към „git fetch --all“ не можете да добавите хранилище аргумент"
#: builtin/fetch.c:1134
msgid "fetch --all does not make sense with refspecs"
msgstr ""
+"към „git fetch --all“ не можете да добавите указател на верÑÐ¸Ñ Ð·Ð° аргумент"
#: builtin/fetch.c:1145
#, c-format
msgid "No such remote or remote group: %s"
-msgstr ""
+msgstr "ÐÑма нито отдалечено хранилище, нито група от хранилища на име „%s“"
#: builtin/fetch.c:1153
msgid "Fetching a group and specifying refspecs does not make sense"
-msgstr ""
+msgstr "Указването на група и указването на верÑÐ¸Ñ Ñа неÑъвмеÑтими"
#: builtin/fmt-merge-msg.c:13
-#, fuzzy
msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
-msgstr "<брой>"
+msgstr "git fmt-merge-msg [-m СЪОБЩЕÐИЕ] [--log[=БРОЙ]|--no-log] [--file ФÐЙЛ]"
-#: 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
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
+#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: parse-options.h:132 parse-options.h:239
msgid "n"
-msgstr "брой"
+msgstr "БРОЙ"
#: builtin/fmt-merge-msg.c:664
-#, fuzzy
msgid "populate log with at most <n> entries from shortlog"
-msgstr "<брой>"
+msgstr ""
+"вмъкване на журнал ÑÑŠÑтоÑщ Ñе от не повече от БРОЙ запиÑа от ÑÑŠÐºÑ€Ð°Ñ‚ÐµÐ½Ð¸Ñ "
+"журнал"
#: builtin/fmt-merge-msg.c:667
msgid "alias for --log (deprecated)"
-msgstr ""
+msgstr "Ñиноним на „--log“ (оÑтарÑло)"
#: builtin/fmt-merge-msg.c:670
msgid "text"
-msgstr ""
+msgstr "ТЕКСТ"
#: builtin/fmt-merge-msg.c:671
msgid "use <text> as start of message"
-msgstr ""
+msgstr "за начало на Ñъобщението да Ñе ползва ТЕКСТ"
#: builtin/fmt-merge-msg.c:672
msgid "file to read from"
-msgstr ""
+msgstr "файл, от който да Ñе чете"
#: builtin/for-each-ref.c:1063
msgid "git for-each-ref [options] [<pattern>]"
@@ -5168,17 +5372,16 @@ msgid "quote placeholders suitably for tcl"
msgstr ""
#: builtin/for-each-ref.c:1087
-#, fuzzy
msgid "show only <n> matched refs"
-msgstr "<брой>"
+msgstr "извеждане Ñамо на този БРОЙ напаÑнати указатели"
#: builtin/for-each-ref.c:1088 builtin/replace.c:177
msgid "format"
-msgstr ""
+msgstr "ФОРМÐТ"
#: builtin/for-each-ref.c:1088
msgid "format to use for the output"
-msgstr ""
+msgstr "ФОРМÐТ за изхода"
#: builtin/for-each-ref.c:1089
msgid "key"
@@ -5188,9 +5391,17 @@ msgstr ""
msgid "field name to sort on"
msgstr ""
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr "Проверка на връзката"
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr "Проверка на директориите Ñ Ð¾Ð±ÐµÐºÑ‚Ð¸"
+
#: builtin/fsck.c:607
msgid "git fsck [options] [<object>...]"
-msgstr "git fsck [ОПЦИИ] [<ОБЕКТ>…]"
+msgstr "git fsck [ОПЦИИ] [ОБЕКТ…]"
#: builtin/fsck.c:613
msgid "show unreachable objects"
@@ -5212,13 +5423,12 @@ msgstr "показване на кореновите възли"
msgid "make index objects head nodes"
msgstr "задаване на обекти от индекÑа да Ñа коренови"
+# FIXME bad message
#: 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 "допълнително да Ñе проверÑват пакетите и алтернативните обекти"
@@ -5234,51 +5444,61 @@ msgstr "запазване на обектите извън клоните в д
msgid "show progress"
msgstr "показване на напредъка"
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr "Проверка на обектите"
+
#: builtin/gc.c:24
msgid "git gc [options]"
msgstr "git gc [ОПЦИИ]"
-#: builtin/gc.c:80
+#: builtin/gc.c:90
#, c-format
msgid "Invalid %s: '%s'"
msgstr "Ðеправилна ÑтойноÑÑ‚ за „%s“: „%s“"
-#: builtin/gc.c:107
+#: builtin/gc.c:117
#, c-format
msgid "insanely long object directory %.*s"
msgstr "прекалено дълга Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð¾Ð±ÐµÐºÑ‚Ð¸ „%.*s“"
-#: builtin/gc.c:262
+#: builtin/gc.c:273
msgid "prune unreferenced objects"
msgstr "окаÑÑ‚Ñ€Ñне на обектите, към които нищо не Ñочи"
-#: builtin/gc.c:264
+#: builtin/gc.c:275
msgid "be more thorough (increased runtime)"
msgstr "изчерпателно Ñ‚ÑŠÑ€Ñене на боклука (за Ñметка на повече време работа)"
-#: builtin/gc.c:265
+#: builtin/gc.c:276
msgid "enable auto-gc mode"
msgstr "включване на автоматичното Ñъбиране на боклука (auto-gc)"
-#: builtin/gc.c:266
+#: builtin/gc.c:277
msgid "force running gc even if there may be another gc running"
msgstr ""
"изрично Ñтартиране на Ñъбирането на боклука, дори и ако вече работи друго "
"Ñъбиране"
-#: builtin/gc.c:306
+#: builtin/gc.c:318
#, 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"
+msgid "Auto packing the repository in background for optimum performance.\n"
msgstr ""
-"Ðвтоматично пакетиране на хранилището за най-добра производителноÑÑ‚. Можете "
-"и\n"
-"ръчно да Ñтартирате „git gc“. За подробноÑти погледнете помощта: „git help "
-"gc“.\n"
+"Ðвтоматично пакетиране на заден фон на хранилището за по-добра "
+"производителноÑÑ‚.\n"
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:320
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr "Ðвтоматично пакетиране на хранилището за по-добра производителноÑÑ‚.\n"
+
+#: builtin/gc.c:321
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
+msgstr ""
+"Вижте ръководÑтвото за повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÐºÐ°Ðº да изпълните „git help gc“.\n"
+
+#: builtin/gc.c:336
#, c-format
msgid ""
"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5287,7 +5507,7 @@ msgstr ""
"процеÑа: %<PRIuMAX> (ако Ñте Ñигурни, че това не е вÑрно, това използвайте\n"
"опциÑта „--force“)"
-#: builtin/gc.c:341
+#: builtin/gc.c:361
msgid ""
"There are too many unreachable loose objects; run 'git prune' to remove them."
msgstr ""
@@ -5297,236 +5517,248 @@ msgstr ""
#: builtin/grep.c:23
msgid "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]"
-msgstr ""
+msgstr "git grep [ОПЦИИ] [-e] ШÐБЛОР[ВЕРСИЯ…] [[--] ПЪТ…]"
#: builtin/grep.c:218
#, c-format
msgid "grep: failed to create thread: %s"
-msgstr ""
+msgstr "grep: неуÑпешно Ñъздаване на нишка: %s"
#: builtin/grep.c:365
#, c-format
msgid "Failed to chdir: %s"
-msgstr ""
+msgstr "ÐеуÑпешна ÑмÑна на директориÑ: %s"
#: builtin/grep.c:443 builtin/grep.c:478
#, c-format
msgid "unable to read tree (%s)"
-msgstr ""
+msgstr "дървото не може да бъде прочетено (%s)"
#: builtin/grep.c:493
#, c-format
msgid "unable to grep from object of type %s"
-msgstr ""
+msgstr "не може да Ñе изпълни „grep“ от обект от вида %s"
-#: builtin/grep.c:551
+#: builtin/grep.c:549
#, c-format
msgid "switch `%c' expects a numerical value"
-msgstr ""
+msgstr "опциÑта „%c“ очаква чиÑло за аргумент"
-#: builtin/grep.c:568
+#: builtin/grep.c:566
#, c-format
msgid "cannot open '%s'"
-msgstr ""
+msgstr "„%s“ не може да бъде отворен"
-#: builtin/grep.c:642
+#: builtin/grep.c:640
msgid "search in index instead of in the work tree"
-msgstr ""
+msgstr "Ñ‚ÑŠÑ€Ñене в индекÑа, а не в работното дърво"
-#: builtin/grep.c:644
+#: builtin/grep.c:642
msgid "find in contents not managed by git"
-msgstr ""
+msgstr "Ñ‚ÑŠÑ€Ñене и във файловете, които не Ñа под управлението на git"
-#: builtin/grep.c:646
+#: builtin/grep.c:644
msgid "search in both tracked and untracked files"
-msgstr ""
+msgstr "Ñ‚ÑŠÑ€Ñене и в Ñледените, и в неÑледените файлове"
-#: builtin/grep.c:648
+#: builtin/grep.c:646
msgid "search also in ignored files"
-msgstr ""
+msgstr "Ñ‚ÑŠÑ€Ñене и в игнорираните файлове"
-#: builtin/grep.c:651
+#: builtin/grep.c:649
msgid "show non-matching lines"
-msgstr ""
+msgstr "извеждане на редовете, които не Ñъвпадат"
-#: builtin/grep.c:653
+#: builtin/grep.c:651
msgid "case insensitive matching"
-msgstr ""
+msgstr "без значение на региÑтъра на буквите (главни/малки)"
-#: builtin/grep.c:655
+#: builtin/grep.c:653
msgid "match patterns only at word boundaries"
-msgstr ""
+msgstr "напаÑване на шаблоните Ñамо по границите на думите"
-#: builtin/grep.c:657
+#: builtin/grep.c:655
msgid "process binary files as text"
-msgstr ""
+msgstr "обработване на двоичните файлове като текÑтови"
-#: builtin/grep.c:659
+#: builtin/grep.c:657
msgid "don't match patterns in binary files"
-msgstr ""
+msgstr "преÑкачане на двоичните файлове"
-#: builtin/grep.c:662
+#: builtin/grep.c:660
msgid "process binary files with textconv filters"
msgstr ""
+"обработване на двоичните файлове чрез филтри за преобразуване към текÑÑ‚"
-#: builtin/grep.c:664
+#: builtin/grep.c:662
msgid "descend at most <depth> levels"
-msgstr ""
+msgstr "навлизане макÑимално на тази ДЪЛБОЧИÐРв дървото"
-#: builtin/grep.c:668
+#: builtin/grep.c:666
msgid "use extended POSIX regular expressions"
-msgstr ""
+msgstr "разширени регулÑрни изрази по POSIX"
-#: builtin/grep.c:671
+#: builtin/grep.c:669
msgid "use basic POSIX regular expressions (default)"
-msgstr ""
+msgstr "оÑновни регулÑрни изрази по POSIX (Ñтандартно)"
-#: builtin/grep.c:674
+#: builtin/grep.c:672
msgid "interpret patterns as fixed strings"
-msgstr ""
+msgstr "шаблоните Ñа доÑловни низове"
-#: builtin/grep.c:677
+#: builtin/grep.c:675
msgid "use Perl-compatible regular expressions"
-msgstr ""
+msgstr "регулÑрни изрази на Perl"
-#: builtin/grep.c:680
+#: builtin/grep.c:678
msgid "show line numbers"
-msgstr ""
+msgstr "извеждане на номерата на редовете"
-#: builtin/grep.c:681
+#: builtin/grep.c:679
msgid "don't show filenames"
-msgstr ""
+msgstr "без извеждане на имената на файловете"
-#: builtin/grep.c:682
+#: builtin/grep.c:680
msgid "show filenames"
-msgstr ""
+msgstr "извеждане на имената на файловете"
-#: builtin/grep.c:684
+#: builtin/grep.c:682
msgid "show filenames relative to top directory"
msgstr ""
+"извеждане на отноÑителните имена на файловете ÑпрÑмо оÑновната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° "
+"хранилището"
-#: builtin/grep.c:686
+#: builtin/grep.c:684
msgid "show only filenames instead of matching lines"
-msgstr ""
+msgstr "извеждане Ñамо на имената на файловете без напаÑващите редове"
-#: builtin/grep.c:688
+#: builtin/grep.c:686
msgid "synonym for --files-with-matches"
-msgstr ""
+msgstr "Ñиноним на „--files-with-matches“"
-#: builtin/grep.c:691
+#: builtin/grep.c:689
msgid "show only the names of files without match"
msgstr ""
+"извеждане Ñамо на имената на файловете, които не Ñъдържат ред, напаÑващ на "
+"шаблона"
-#: builtin/grep.c:693
+#: builtin/grep.c:691
msgid "print NUL after filenames"
-msgstr ""
+msgstr "извеждане на Ð½ÑƒÐ»ÐµÐ²Ð¸Ñ Ð·Ð½Ð°Ðº „NUL“ Ñлед вÑÑко име на файл"
-#: builtin/grep.c:695
+#: builtin/grep.c:693
msgid "show the number of matches instead of matching lines"
-msgstr ""
+msgstr "извеждане на Ð±Ñ€Ð¾Ñ Ð½Ð° ÑъвпадениÑта вмеÑто напаÑващите редове"
-#: builtin/grep.c:696
+#: builtin/grep.c:694
msgid "highlight matches"
-msgstr ""
+msgstr "оцветÑване на напаÑваниÑта"
-#: builtin/grep.c:698
+#: builtin/grep.c:696
msgid "print empty line between matches from different files"
-msgstr ""
+msgstr "извеждане на празен ред между напаÑваниÑта от различни файлове"
-#: builtin/grep.c:700
+#: builtin/grep.c:698
msgid "show filename only once above matches from same file"
msgstr ""
+"извеждане на името на файла Ñамо веднъж за вÑички напаÑÐ²Ð°Ð½Ð¸Ñ Ð¾Ñ‚ този файл"
-#: builtin/grep.c:703
-#, fuzzy
+#: builtin/grep.c:701
msgid "show <n> context lines before and after matches"
-msgstr "<брой>"
+msgstr "извеждане на такъв БРОЙ редове преди и Ñлед напаÑваниÑта"
-#: builtin/grep.c:706
-#, fuzzy
+#: builtin/grep.c:704
msgid "show <n> context lines before matches"
-msgstr "<брой>"
+msgstr "извеждане на такъв БРОЙ редове преди напаÑваниÑта"
-#: builtin/grep.c:708
-#, fuzzy
+#: builtin/grep.c:706
msgid "show <n> context lines after matches"
-msgstr "<брой>"
+msgstr "извеждане на такъв БРОЙ редове Ñлед напаÑваниÑта"
-#: builtin/grep.c:709
+#: builtin/grep.c:707
msgid "shortcut for -C NUM"
-msgstr ""
+msgstr "Ñиноним на „-C БРОЙ“"
-#: builtin/grep.c:712
+#: builtin/grep.c:710
msgid "show a line with the function name before matches"
-msgstr ""
+msgstr "извеждане на ред Ñ Ð¸Ð¼ÐµÑ‚Ð¾ на функциÑта, в коÑто е напаÑнат шаблона"
-#: builtin/grep.c:714
+#: builtin/grep.c:712
msgid "show the surrounding function"
-msgstr ""
+msgstr "извеждане на обхващащата функциÑ"
-#: builtin/grep.c:717
+#: builtin/grep.c:715
msgid "read patterns from file"
-msgstr ""
+msgstr "изчитане на шаблоните от файл"
-#: builtin/grep.c:719
+#: builtin/grep.c:717
msgid "match <pattern>"
-msgstr ""
+msgstr "напаÑване на ШÐБЛОÐ"
-#: builtin/grep.c:721
+#: builtin/grep.c:719
msgid "combine patterns specified with -e"
-msgstr ""
+msgstr "комбиниране на шаблоните указани Ñ Ð¾Ð¿Ñ†Ð¸Ñта „-e“"
-#: builtin/grep.c:733
+#: builtin/grep.c:731
msgid "indicate hit with exit status without output"
msgstr ""
+"без извеждане на ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð¸Ð·Ñ…Ð¾Ð´. ИзходниÑÑ‚ код указва наличието на "
+"напаÑване"
-#: builtin/grep.c:735
+#: builtin/grep.c:733
msgid "show only matches from files that match all patterns"
msgstr ""
+"извеждане на редове Ñамо от файловете, които напаÑват на вÑички шаблони"
-#: builtin/grep.c:737
+#: builtin/grep.c:735
msgid "show parse tree for grep expression"
-msgstr ""
+msgstr "извеждане на дървото за анализ на регулÑÑ€Ð½Ð¸Ñ Ð¸Ð·Ñ€Ð°Ð·"
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "pager"
-msgstr ""
+msgstr "програма за обхождане"
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "show matching files in the pager"
-msgstr ""
+msgstr "извеждане на Ñъвпадащите файлове в програма за обхождане"
-#: builtin/grep.c:744
+#: builtin/grep.c:742
msgid "allow calling of grep(1) (ignored by this build)"
msgstr ""
+"позволÑване на Ñтартирането на grep(1) (текущиÑÑ‚ компилат пренебрегва тази "
+"опциÑ)"
-#: builtin/grep.c:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
msgid "show usage"
-msgstr ""
+msgstr "извеждане на начина на употреба на командата"
-#: builtin/grep.c:812
+#: builtin/grep.c:810
msgid "no pattern given."
-msgstr ""
+msgstr "липÑва шаблон."
-#: builtin/grep.c:870
+#: builtin/grep.c:868
msgid "--open-files-in-pager only works on the worktree"
msgstr ""
+"опциÑта „--open-files-in-pager“ е ÑъвмеÑтима Ñамо Ñ Ñ‚ÑŠÑ€Ñене в работното дърво"
-#: builtin/grep.c:893
+#: builtin/grep.c:891
msgid "--cached or --untracked cannot be used with --no-index."
-msgstr ""
+msgstr "опциите „--cached“ и „--untracked“ Ñа неÑъвмеÑтими Ñ â€ž--no-index“."
-#: builtin/grep.c:898
+#: builtin/grep.c:896
msgid "--no-index or --untracked cannot be used with revs."
msgstr ""
+"опциите „--cached“ и „--untracked“ Ñа неÑъвмеÑтими Ñ Ñ‚ÑŠÑ€Ñене във верÑии."
-#: builtin/grep.c:901
+#: builtin/grep.c:899
msgid "--[no-]exclude-standard cannot be used for tracked contents."
msgstr ""
+"опциите „--(no-)exclude-standard“ Ñа неÑъвмеÑтими Ñ Ñ‚ÑŠÑ€Ñене по Ñледени "
+"файлове."
-#: builtin/grep.c:909
+#: builtin/grep.c:907
msgid "both --cached and trees are given."
-msgstr ""
+msgstr "опциÑта „--cached“ е неÑъвмеÑтима ÑÑŠÑ Ð·Ð°Ð´Ð°Ð²Ð°Ð½Ðµ на дърво."
#: builtin/hash-object.c:60
msgid ""
@@ -5538,7 +5770,7 @@ msgstr ""
msgid "git hash-object --stdin-paths < <list-of-paths>"
msgstr ""
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:72 builtin/tag.c:521
msgid "type"
msgstr ""
@@ -5777,8 +6009,8 @@ msgstr ""
msgid "SHA1 COLLISION FOUND WITH %s !"
msgstr ""
-#: builtin/index-pack.c:669 builtin/pack-objects.c:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
#, c-format
msgid "unable to read %s"
msgstr ""
@@ -5895,7 +6127,7 @@ msgstr ""
#: builtin/index-pack.c:1325
msgid "cannot store index file"
-msgstr ""
+msgstr "файлът за индекÑа не може да бъде Ñъхранен"
#: builtin/index-pack.c:1358
#, c-format
@@ -6044,424 +6276,435 @@ msgstr ""
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
+#. 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:418
#, c-format
msgid "%s%s Git repository in %s%s\n"
msgstr ""
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Reinitialized existing"
msgstr ""
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Initialized empty"
msgstr ""
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
msgid " shared"
msgstr ""
-#: builtin/init-db.c:441
+#: builtin/init-db.c:439
msgid "cannot tell cwd"
msgstr ""
-#: builtin/init-db.c:467
+#: builtin/init-db.c:465
msgid ""
"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
"shared[=<permissions>]] [directory]"
msgstr ""
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
msgid "permissions"
msgstr ""
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
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
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
msgid "be quiet"
-msgstr ""
+msgstr "без извеждане на информациÑ"
-#: builtin/init-db.c:522 builtin/init-db.c:529
+#: builtin/init-db.c:523 builtin/init-db.c:528
#, c-format
msgid "cannot mkdir %s"
msgstr ""
-#: builtin/init-db.c:533
+#: builtin/init-db.c:532
#, c-format
msgid "cannot chdir to %s"
msgstr ""
-#: builtin/init-db.c:555
+#: builtin/init-db.c:554
#, c-format
msgid ""
"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
"dir=<directory>)"
msgstr ""
-#: builtin/init-db.c:579
+#: builtin/init-db.c:578
msgid "Cannot access current working directory"
msgstr ""
-#: builtin/init-db.c:586
+#: builtin/init-db.c:585
#, c-format
msgid "Cannot access work tree '%s'"
msgstr ""
#: builtin/log.c:41
msgid "git log [<options>] [<revision range>] [[--] <path>...]\n"
-msgstr ""
+msgstr "git log [ОПЦИИ] [ДИÐПÐЗОÐ_ÐÐ_ВЕРСИИТЕ] [[--] ПЪТ…]\n"
#: builtin/log.c:42
msgid " or: git show [options] <object>..."
-msgstr ""
+msgstr " или: git show [ОПЦИИ] ОБЕКТ…"
#: builtin/log.c:125
msgid "suppress diff output"
-msgstr ""
+msgstr "без извеждане на разликите"
#: builtin/log.c:126
msgid "show source"
-msgstr ""
+msgstr "извеждане на Ð¸Ð·Ñ…Ð¾Ð´Ð½Ð¸Ñ ÐºÐ¾Ð´"
#: builtin/log.c:127
msgid "Use mail map file"
msgstr ""
+"Използване на файл за ÑъответÑтвиÑта на имената и адреÑите на е-поща („."
+"mailmap“)"
#: builtin/log.c:128
msgid "decorate options"
-msgstr ""
+msgstr "наÑтройки на форма̀та на извежданата информациÑ"
#: builtin/log.c:231
#, c-format
msgid "Final output: %d %s\n"
-msgstr ""
+msgstr "Резултат: %d %s\n"
#: builtin/log.c:473 builtin/log.c:565
#, c-format
msgid "Could not read object %s"
-msgstr ""
+msgstr "Обектът не може да бъде прочетен: %s"
#: builtin/log.c:589
#, c-format
msgid "Unknown type: %d"
-msgstr ""
+msgstr "ÐеизвеÑтен вид: %d"
#: builtin/log.c:689
msgid "format.headers without value"
-msgstr ""
+msgstr "не е зададена ÑтойноÑÑ‚ на „format.headers“"
#: builtin/log.c:771
msgid "name of output directory is too long"
-msgstr ""
+msgstr "прекалено дълго име на директориÑта за изходната информациÑ"
#: builtin/log.c:787
#, c-format
msgid "Cannot open patch file %s"
-msgstr ""
+msgstr "Файлът-кръпка „%s“ не може да бъде отворен"
#: builtin/log.c:801
msgid "Need exactly one range."
-msgstr ""
+msgstr "ТрÑбва да зададете точно един диапазон."
#: builtin/log.c:809
msgid "Not a range."
-msgstr ""
+msgstr "Ðе е диапазон."
#: builtin/log.c:911
msgid "Cover letter needs email format"
-msgstr ""
+msgstr "Придружаващото пиÑмо Ñ‚Ñ€Ñбва да е форматирано като е-пиÑмо"
#: builtin/log.c:987
#, c-format
msgid "insane in-reply-to: %s"
-msgstr ""
+msgstr "неправилен формат на заглавната чаÑÑ‚ за отговор „in-reply-to“: %s"
#: builtin/log.c:1015
msgid "git format-patch [options] [<since> | <revision range>]"
-msgstr ""
+msgstr "git format-patch [ОПЦИИ] [ОТ | ДИÐПÐЗОÐ_ÐÐ_ВЕРСИИТЕ]"
+# FIXME message
#: builtin/log.c:1060
msgid "Two output directories?"
msgstr ""
+"Можете да укажете макÑимум една Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° изход, а Ñте задали поне две."
#: builtin/log.c:1175
msgid "use [PATCH n/m] even with a single patch"
-msgstr ""
+msgstr "Ð½Ð¾Ð¼ÐµÑ€Ð°Ñ†Ð¸Ñ â€ž[PATCH n/m]“ дори и при единÑтвена кръпка"
#: builtin/log.c:1178
msgid "use [PATCH] even with multiple patches"
-msgstr ""
+msgstr "Ð½Ð¾Ð¼ÐµÑ€Ð°Ñ†Ð¸Ñ â€ž[PATCH]“ дори и при множеÑтво кръпки"
#: builtin/log.c:1182
msgid "print patches to standard out"
-msgstr ""
+msgstr "извеждане на кръпките на ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð¸Ð·Ñ…Ð¾Ð´"
#: builtin/log.c:1184
msgid "generate a cover letter"
-msgstr ""
+msgstr "Ñъздаване на придружаващо пиÑмо"
#: builtin/log.c:1186
msgid "use simple number sequence for output file names"
-msgstr ""
+msgstr "проÑта чиÑлова поÑледователноÑÑ‚ за имената на файловете-кръпки"
#: builtin/log.c:1187
msgid "sfx"
-msgstr ""
+msgstr "ЗÐÐЦИ"
#: builtin/log.c:1188
msgid "use <sfx> instead of '.patch'"
-msgstr ""
+msgstr "използване на тези ЗÐÐЦИ за ÑÑƒÑ„Ð¸ÐºÑ Ð²Ð¼ÐµÑто „.patch“"
#: builtin/log.c:1190
-#, fuzzy
msgid "start numbering patches at <n> instead of 1"
-msgstr "<брой>"
+msgstr "номерирането на кръпките да започва от този БРОЙ, а не Ñ 1"
#: builtin/log.c:1192
msgid "mark the series as Nth re-roll"
-msgstr ""
+msgstr "отбелÑзване, че това е N-тата поредна Ñ€ÐµÐ´Ð°ÐºÑ†Ð¸Ñ Ð½Ð° поредицата от кръпки"
#: builtin/log.c:1194
msgid "Use [<prefix>] instead of [PATCH]"
-msgstr ""
+msgstr "Използване на този „[ПРЕФИКС]“ вмеÑто „[PATCH]“"
#: builtin/log.c:1197
msgid "store resulting files in <dir>"
-msgstr ""
+msgstr "запазване на изходните файлове в тази ДИРЕКТОРИЯ"
#: builtin/log.c:1200
msgid "don't strip/add [PATCH]"
-msgstr ""
+msgstr "без добавÑне/махане на префикÑа „[PATCH]“"
#: builtin/log.c:1203
msgid "don't output binary diffs"
-msgstr ""
+msgstr "без извеждане на разлики между двоични файлове"
#: builtin/log.c:1205
msgid "don't include a patch matching a commit upstream"
-msgstr ""
+msgstr "да не Ñе включват кръпки, които приÑÑŠÑтват в ÑÐ»ÐµÐ´ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½"
#: builtin/log.c:1207
msgid "show patch format instead of default (patch + stat)"
msgstr ""
+"извеждане във формат за кръпки, а на в ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ (кръпка и ÑтатиÑтика)"
#: builtin/log.c:1209
msgid "Messaging"
-msgstr ""
+msgstr "Опции при изпращане"
#: builtin/log.c:1210
msgid "header"
-msgstr ""
+msgstr "ЗÐГЛÐÐ’ÐÐ_ЧÐСТ"
#: builtin/log.c:1211
msgid "add email header"
-msgstr ""
+msgstr "добавÑне на тази ЗÐГЛÐÐ’ÐÐ_ЧÐСТ"
#: builtin/log.c:1212 builtin/log.c:1214
msgid "email"
-msgstr ""
+msgstr "Е-ПОЩÐ"
#: builtin/log.c:1212
msgid "add To: header"
-msgstr ""
+msgstr "добавÑне на заглавна чаÑÑ‚ „To:“ (до)"
#: builtin/log.c:1214
msgid "add Cc: header"
-msgstr ""
+msgstr "добавÑне на заглавна чаÑÑ‚ „Cc:“ (и до)"
#: builtin/log.c:1216
msgid "ident"
-msgstr ""
+msgstr "ИДЕÐТИЧÐОСТ"
#: builtin/log.c:1217
msgid "set From address to <ident> (or committer ident if absent)"
msgstr ""
+"задаване на адреÑа в заглавната чаÑÑ‚ „From“ да е тази ИДЕÐТИЧÐОСТ. Ðко не е "
+"зададена такава, Ñе взима адреÑа на подаващиÑ"
#: builtin/log.c:1219
msgid "message-id"
-msgstr ""
+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 ""
+msgstr "граница"
#: builtin/log.c:1222
msgid "attach the patch"
-msgstr ""
+msgstr "прикрепÑне на кръпката"
#: builtin/log.c:1225
msgid "inline the patch"
-msgstr ""
+msgstr "включване на кръпката в текÑта на пиÑмата"
#: builtin/log.c:1229
msgid "enable message threading, styles: shallow, deep"
msgstr ""
+"използване на нишки за ÑъобщениÑта. Стилът е „shallow“ (плитък) или "
+"„deep“ (дълбок)"
#: builtin/log.c:1231
msgid "signature"
-msgstr ""
+msgstr "подпиÑ"
#: builtin/log.c:1232
msgid "add a signature"
-msgstr ""
+msgstr "добавÑне на поле за подпиÑ"
#: builtin/log.c:1233
msgid "don't print the patch filenames"
-msgstr ""
+msgstr "без извеждане на имената на кръпките"
#: builtin/log.c:1307
#, c-format
msgid "invalid ident line: %s"
-msgstr ""
+msgstr "грешна идентичноÑÑ‚: %s"
#: builtin/log.c:1322
msgid "-n and -k are mutually exclusive."
-msgstr ""
+msgstr "опциите „-n“ и „-k“ Ñа неÑъвмеÑтими."
#: builtin/log.c:1324
msgid "--subject-prefix and -k are mutually exclusive."
-msgstr ""
+msgstr "опциите „--subject-prefix“ и „-k“ Ñа неÑъвмеÑтими."
#: builtin/log.c:1332
msgid "--name-only does not make sense"
-msgstr ""
+msgstr "опциÑта „--name-only“ е неÑъвмеÑтима Ñ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€Ð°Ð½ÐµÑ‚Ð¾ на кръпки"
#: builtin/log.c:1334
msgid "--name-status does not make sense"
-msgstr ""
+msgstr "опциÑта „--name-status“ е неÑъвмеÑтима Ñ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€Ð°Ð½ÐµÑ‚Ð¾ на кръпки"
#: builtin/log.c:1336
msgid "--check does not make sense"
-msgstr ""
+msgstr "опциÑта „--check“ е неÑъвмеÑтима Ñ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€Ð°Ð½ÐµÑ‚Ð¾ на кръпки"
#: 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 ""
+msgstr "Папката „%s“ не може да бъде Ñъздадена"
#: builtin/log.c:1509
msgid "Failed to create output files"
-msgstr ""
+msgstr "Изходните файлове не могат да бъдат Ñъздадени"
#: builtin/log.c:1558
msgid "git cherry [-v] [<upstream> [<head> [<limit>]]]"
-msgstr ""
+msgstr "git cherry [-v] [ОТДÐЛЕЧЕÐ_КЛОР[ВРЪХ [ПРЕДЕЛ]]]"
#: builtin/log.c:1613
#, c-format
msgid ""
"Could not find a tracked remote branch, please specify <upstream> manually.\n"
msgstr ""
+"СледениÑÑ‚ отдалечен клон не бе открит, затова изрично задайте "
+"ОТДÐЛЕЧЕÐ_КЛОÐ.\n"
#: builtin/log.c:1626 builtin/log.c:1628 builtin/log.c:1640
#, c-format
msgid "Unknown commit %s"
-msgstr ""
+msgstr "Ðепознато подаване „%s“"
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
msgid "git ls-files [options] [<file>...]"
msgstr ""
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
msgid "identify the file status with tags"
msgstr ""
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
msgid "use lowercase letters for 'assume unchanged' files"
msgstr ""
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
msgid "show cached files in the output (default)"
msgstr ""
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
msgid "show deleted files in the output"
msgstr ""
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
msgid "show modified files in the output"
msgstr ""
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
msgid "show other files in the output"
msgstr ""
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
msgid "show ignored files in the output"
msgstr ""
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
msgid "show staged contents' object name in the output"
msgstr ""
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
msgid "show files on the filesystem that need to be removed"
msgstr ""
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
msgid "show 'other' directories' name only"
msgstr ""
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
msgid "don't show empty directories"
msgstr ""
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
msgid "show unmerged files in the output"
msgstr ""
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
msgid "show resolve-undo information"
msgstr ""
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
msgid "skip files matching pattern"
msgstr ""
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
msgid "exclude patterns are read from <file>"
msgstr ""
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
msgid "read additional per-directory exclude patterns in <file>"
msgstr ""
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
msgid "add the standard git exclusions"
msgstr ""
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
msgid "make the output relative to the project top directory"
msgstr ""
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
msgid "if any <file> is not in the index, treat this as an error"
msgstr ""
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
msgid "tree-ish"
msgstr ""
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
msgid "pretend that paths removed since <tree-ish> are still present"
msgstr ""
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
msgid "show debugging data"
msgstr ""
@@ -6483,7 +6726,7 @@ msgstr ""
#: builtin/ls-tree.c:133
msgid "terminate entries with NUL byte"
-msgstr ""
+msgstr "разделÑне на обектите Ñ Ð½ÑƒÐ»ÐµÐ²Ð¸Ñ Ð·Ð½Ð°Ðº „NUL“"
#: builtin/ls-tree.c:134
msgid "include object size"
@@ -6545,9 +6788,10 @@ msgid "(synonym to --stat)"
msgstr ""
#: builtin/merge.c:197
-#, fuzzy
msgid "add (at most <n>) entries from shortlog to merge commit message"
-msgstr "<брой>"
+msgstr ""
+"добавÑне (на макÑимум такъв БРОЙ) запиÑи от ÑÑŠÐºÑ€Ð°Ñ‚ÐµÐ½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð» в Ñъобщението "
+"за подаване"
#: builtin/merge.c:200
msgid "create a single commit instead of doing a merge"
@@ -6573,9 +6817,9 @@ msgstr ""
msgid "Verify that the named commit has a valid GPG signature"
msgstr ""
-#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
msgid "strategy"
-msgstr ""
+msgstr "ÑтратегиÑ"
#: builtin/merge.c:213
msgid "merge strategy to use"
@@ -6646,35 +6890,35 @@ msgstr ""
msgid "Bad branch.%s.mergeoptions string: %s"
msgstr ""
-#: builtin/merge.c:650
+#: builtin/merge.c:653
msgid "git write-tree failed to write a tree"
-msgstr ""
+msgstr "Командата „git write-tree“ не уÑÐ¿Ñ Ð´Ð° запише обект-дърво"
-#: builtin/merge.c:678
+#: builtin/merge.c:681
msgid "Not handling anything other than two heads merge."
msgstr ""
-#: builtin/merge.c:692
+#: builtin/merge.c:695
#, c-format
msgid "Unknown option for merge-recursive: -X%s"
msgstr ""
-#: builtin/merge.c:706
+#: builtin/merge.c:709
#, c-format
msgid "unable to write %s"
msgstr ""
-#: builtin/merge.c:795
+#: builtin/merge.c:798
#, c-format
msgid "Could not read from '%s'"
msgstr ""
-#: builtin/merge.c:804
+#: builtin/merge.c:807
#, c-format
msgid "Not committing merge; use 'git commit' to complete the merge.\n"
msgstr ""
-#: builtin/merge.c:810
+#: builtin/merge.c:813
#, c-format
msgid ""
"Please enter a commit message to explain why this merge is necessary,\n"
@@ -6684,157 +6928,162 @@ msgid ""
"the commit.\n"
msgstr ""
-#: builtin/merge.c:834
+#: builtin/merge.c:837
msgid "Empty commit message."
msgstr ""
-#: builtin/merge.c:846
+#: builtin/merge.c:849
#, c-format
msgid "Wonderful.\n"
msgstr ""
-#: builtin/merge.c:911
+#: builtin/merge.c:914
#, c-format
msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
msgstr ""
-#: builtin/merge.c:927
+#: builtin/merge.c:930
#, c-format
msgid "'%s' is not a commit"
msgstr ""
-#: builtin/merge.c:968
+#: builtin/merge.c:971
msgid "No current branch."
msgstr ""
-#: builtin/merge.c:970
+#: builtin/merge.c:973
msgid "No remote for the current branch."
msgstr ""
-#: builtin/merge.c:972
+#: builtin/merge.c:975
msgid "No default upstream defined for the current branch."
msgstr ""
-#: builtin/merge.c:977
+#: builtin/merge.c:980
#, c-format
msgid "No remote-tracking branch for %s from %s"
msgstr ""
-#: builtin/merge.c:1133
+#: builtin/merge.c:1136
msgid "There is no merge to abort (MERGE_HEAD missing)."
msgstr ""
-#: builtin/merge.c:1149 git-pull.sh:31
+#: builtin/merge.c:1152 git-pull.sh:31
msgid ""
"You have not concluded your merge (MERGE_HEAD exists).\n"
"Please, commit your changes before you can merge."
msgstr ""
+"Ðе Ñте завършили Ñливане. (УказателÑÑ‚ „MERGE_HEAD“ ÑъщеÑтвува).\n"
+"Подайте промените Ñи, преди да започнете ново Ñливане."
-#: builtin/merge.c:1152 git-pull.sh:34
+#: builtin/merge.c:1155 git-pull.sh:34
msgid "You have not concluded your merge (MERGE_HEAD exists)."
-msgstr ""
+msgstr "Ðе Ñте завършили Ñливане. (УказателÑÑ‚ „MERGE_HEAD“ ÑъщеÑтвува)."
-#: builtin/merge.c:1156
+#: builtin/merge.c:1159
msgid ""
"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
"Please, commit your changes before you can merge."
msgstr ""
+"Ðе Ñте завършили отбиране на подаване (указателÑÑ‚ „CHERRY_PICK_HEAD“\n"
+"ÑъщеÑтвува). Подайте промените Ñи, преди да започнете ново Ñливане."
-#: builtin/merge.c:1159
+#: builtin/merge.c:1162
msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
msgstr ""
+"Ðе Ñте завършили отбиране на подаване (указателÑÑ‚ „CHERRY_PICK_HEAD“\n"
+"ÑъщеÑтвува)."
-#: builtin/merge.c:1168
+#: builtin/merge.c:1171
msgid "You cannot combine --squash with --no-ff."
msgstr ""
-#: builtin/merge.c:1177
+#: builtin/merge.c:1180
msgid "No commit specified and merge.defaultToUpstream not set."
msgstr ""
-#: builtin/merge.c:1209
+#: builtin/merge.c:1212
msgid "Can merge only exactly one commit into empty head"
msgstr ""
-#: builtin/merge.c:1212
+#: builtin/merge.c:1215
msgid "Squash commit into empty head not supported yet"
msgstr ""
-#: builtin/merge.c:1214
+#: builtin/merge.c:1217
msgid "Non-fast-forward commit does not make sense into an empty head"
msgstr ""
-#: builtin/merge.c:1219
+#: builtin/merge.c:1222
#, c-format
msgid "%s - not something we can merge"
msgstr ""
-#: builtin/merge.c:1270
+#: builtin/merge.c:1273
#, c-format
msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
msgstr ""
-#: builtin/merge.c:1273
+#: builtin/merge.c:1276
#, c-format
msgid "Commit %s has a bad GPG signature allegedly by %s."
msgstr ""
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
#, c-format
msgid "Commit %s does not have a GPG signature."
msgstr ""
-#: builtin/merge.c:1279
+#: builtin/merge.c:1282
#, c-format
msgid "Commit %s has a good GPG signature by %s\n"
msgstr ""
-#: builtin/merge.c:1363
+#: builtin/merge.c:1366
#, c-format
msgid "Updating %s..%s\n"
msgstr ""
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
#, c-format
msgid "Trying really trivial in-index merge...\n"
msgstr ""
-#: builtin/merge.c:1409
+#: builtin/merge.c:1412
#, c-format
msgid "Nope.\n"
msgstr ""
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
msgid "Not possible to fast-forward, aborting."
msgstr ""
-#: builtin/merge.c:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
#, c-format
msgid "Rewinding the tree to pristine...\n"
msgstr ""
-#: builtin/merge.c:1468
+#: builtin/merge.c:1471
#, c-format
msgid "Trying merge strategy %s...\n"
msgstr ""
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
#, c-format
msgid "No merge strategy handled the merge.\n"
msgstr ""
-#: builtin/merge.c:1536
+#: builtin/merge.c:1539
#, c-format
msgid "Merge with strategy %s failed.\n"
msgstr ""
-#: builtin/merge.c:1545
+#: builtin/merge.c:1548
#, c-format
msgid "Using the %s to prepare resolving by hand.\n"
msgstr ""
-#: builtin/merge.c:1557
+#: builtin/merge.c:1560
#, c-format
msgid "Automatic merge went well; stopped before committing as requested\n"
msgstr ""
@@ -6917,108 +7166,109 @@ msgstr ""
msgid "set labels for file1/orig_file/file2"
msgstr ""
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
msgid "git mktree [-z] [--missing] [--batch]"
-msgstr ""
+msgstr "git mktree [-z] [--missing] [--batch]"
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
msgid "input is NUL terminated"
-msgstr ""
+msgstr "входните запиÑа Ñа разделени Ñ Ð½ÑƒÐ»ÐµÐ²Ð¸Ñ Ð·Ð½Ð°Ðº „NUL“"
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
msgid "allow missing objects"
-msgstr ""
+msgstr "разрешаване на липÑващи обекти"
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
msgid "allow creation of more than one tree"
-msgstr ""
+msgstr "разрешаване на Ñъздаването на повече от едно дърво"
#: builtin/mv.c:15
msgid "git mv [options] <source>... <destination>"
-msgstr ""
+msgstr "git mv [ОПЦИИ] ОБЕКТ… ЦЕЛ"
#: builtin/mv.c:71
msgid "force move/rename even if target exists"
-msgstr ""
+msgstr "принудително премеÑтване/преименуване дори целта да ÑъщеÑтвува"
#: builtin/mv.c:72
msgid "skip move/rename errors"
-msgstr ""
+msgstr "преÑкачане на грешките при премеÑтване/преименуване"
#: builtin/mv.c:122
#, c-format
msgid "Checking rename of '%s' to '%s'\n"
-msgstr ""
+msgstr "Проверка на преименуването на обект от „%s“ на „%s“\n"
#: builtin/mv.c:126
msgid "bad source"
-msgstr ""
+msgstr "неправилен обект"
#: builtin/mv.c:129
msgid "can not move directory into itself"
-msgstr ""
+msgstr "Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ може да Ñе премеÑти в Ñебе Ñи"
#: builtin/mv.c:132
msgid "cannot move directory over file"
-msgstr ""
+msgstr "Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ може да Ñе премеÑти върху файл"
+# FIXME message<
#: builtin/mv.c:138
#, c-format
msgid "Huh? Directory %s is in index and no submodule?"
-msgstr ""
+msgstr "ДиректориÑта „%s“ е в индекÑа, но не е подмодул"
#: builtin/mv.c:140 builtin/rm.c:318
msgid "Please, stage your changes to .gitmodules or stash them to proceed"
msgstr ""
-"За да продължите или вкарайте промените по файла „.gitmodules“ в индекÑа, "
-"или\n"
-"ги Ñкътайте"
+"За да продължите или вкарайте промените по файла „.gitmodules“ в индекÑа,\n"
+"или ги Ñкатайте"
+# FIXME message
#: builtin/mv.c:156
#, c-format
msgid "Huh? %.*s is in index?"
-msgstr ""
+msgstr "„%.*s“ вече е в индекÑа"
-#: builtin/mv.c:168
+#: builtin/mv.c:169
msgid "source directory is empty"
-msgstr ""
+msgstr "първоначалната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ðµ празна"
-#: builtin/mv.c:200
+#: builtin/mv.c:205
msgid "not under version control"
-msgstr ""
+msgstr "не е под контрола на Git"
-#: builtin/mv.c:202
+#: builtin/mv.c:207
msgid "destination exists"
-msgstr ""
+msgstr "целта ÑъщеÑтвува"
-#: builtin/mv.c:210
+#: builtin/mv.c:215
#, c-format
msgid "overwriting '%s'"
-msgstr ""
+msgstr "презапиÑване на „%s“"
-#: builtin/mv.c:213
+#: builtin/mv.c:218
msgid "Cannot overwrite"
-msgstr ""
+msgstr "ПрезапиÑването е невъзможно"
-#: builtin/mv.c:216
+#: builtin/mv.c:221
msgid "multiple sources for the same target"
-msgstr ""
+msgstr "множеÑтво източници за една цел"
-#: builtin/mv.c:218
+#: builtin/mv.c:223
msgid "destination directory does not exist"
-msgstr ""
+msgstr "целевата Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ ÑъщеÑтвува"
-#: builtin/mv.c:233
+#: builtin/mv.c:243
#, c-format
msgid "%s, source=%s, destination=%s"
-msgstr ""
+msgstr "%s, обект: „%s“, цел: „%s“"
-#: builtin/mv.c:243
+#: builtin/mv.c:253
#, c-format
msgid "Renaming %s to %s\n"
-msgstr ""
+msgstr "Преименуване на „%s“ на „%s“\n"
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
#, c-format
msgid "renaming '%s' failed"
msgstr "неуÑпешно преименуване на „%s“"
@@ -7183,7 +7433,7 @@ msgstr ""
msgid "failed to finish 'show' for object '%s'"
msgstr ""
-#: builtin/notes.c:167 builtin/tag.c:341
+#: builtin/notes.c:167 builtin/tag.c:373
#, c-format
msgid "could not create file '%s'"
msgstr ""
@@ -7192,7 +7442,7 @@ msgstr ""
msgid "Please supply the note contents using either -m or -F option"
msgstr ""
-#: builtin/notes.c:207 builtin/notes.c:844
+#: builtin/notes.c:207 builtin/notes.c:848
#, c-format
msgid "Removing note for object %s\n"
msgstr ""
@@ -7206,20 +7456,20 @@ msgstr ""
msgid "The note contents has been left in %s"
msgstr ""
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
#, c-format
msgid "cannot read '%s'"
msgstr ""
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
#, 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
+#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
+#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
+#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
+#: builtin/notes.c:843 builtin/tag.c:620
#, c-format
msgid "Failed to resolve '%s' as a valid ref."
msgstr ""
@@ -7229,355 +7479,391 @@ msgstr ""
msgid "Failed to read object '%s'."
msgstr ""
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr ""
+
+#: builtin/notes.c:316
#, c-format
msgid "Malformed input line: '%s'."
msgstr ""
-#: builtin/notes.c:327
+#: builtin/notes.c:331
#, 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
+#: builtin/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
+#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
+#: builtin/notes.c:908
msgid "too many parameters"
msgstr ""
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
#, c-format
msgid "No note found for object %s."
msgstr ""
-#: builtin/notes.c:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
msgid "note contents as a string"
msgstr ""
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
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
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
msgid "object"
msgstr ""
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
msgid "reuse and edit specified note object"
msgstr ""
-#: builtin/notes.c:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
msgid "reuse specified note object"
msgstr ""
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
msgid "replace existing notes"
msgstr ""
-#: builtin/notes.c:451
+#: builtin/notes.c:455
#, 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
+#: builtin/notes.c:460 builtin/notes.c:537
#, c-format
msgid "Overwriting existing notes for object %s\n"
msgstr ""
-#: builtin/notes.c:486
+#: builtin/notes.c:490
msgid "read objects from stdin"
msgstr ""
-#: builtin/notes.c:488
+#: builtin/notes.c:492
msgid "load rewriting config for <command> (implies --stdin)"
msgstr ""
-#: builtin/notes.c:506
+#: builtin/notes.c:510
msgid "too few parameters"
msgstr ""
-#: builtin/notes.c:527
+#: builtin/notes.c:531
#, c-format
msgid ""
"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
"existing notes"
msgstr ""
-#: builtin/notes.c:539
+#: builtin/notes.c:543
#, c-format
msgid "Missing notes on source object %s. Cannot copy."
msgstr ""
-#: builtin/notes.c:588
+#: builtin/notes.c:592
#, 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
+#: builtin/notes.c:739
msgid "General options"
msgstr ""
-#: builtin/notes.c:737
+#: builtin/notes.c:741
msgid "Merge options"
msgstr ""
-#: builtin/notes.c:739
+#: builtin/notes.c:743
msgid ""
"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
"cat_sort_uniq)"
msgstr ""
-#: builtin/notes.c:741
+#: builtin/notes.c:745
msgid "Committing unmerged notes"
msgstr ""
-#: builtin/notes.c:743
+#: builtin/notes.c:747
msgid "finalize notes merge by committing unmerged notes"
msgstr ""
-#: builtin/notes.c:745
+#: builtin/notes.c:749
msgid "Aborting notes merge resolution"
msgstr ""
-#: builtin/notes.c:747
+#: builtin/notes.c:751
msgid "abort notes merge"
msgstr ""
-#: builtin/notes.c:842
+#: builtin/notes.c:846
#, c-format
msgid "Object %s has no note\n"
msgstr ""
-#: builtin/notes.c:854
+#: builtin/notes.c:858
msgid "attempt to remove non-existent note is not an error"
msgstr ""
-#: builtin/notes.c:857
+#: builtin/notes.c:861
msgid "read object names from the standard input"
msgstr ""
-#: builtin/notes.c:938
-msgid "notes_ref"
+#: builtin/notes.c:942
+msgid "notes-ref"
msgstr ""
-#: builtin/notes.c:939
+#: builtin/notes.c:943
msgid "use notes from <notes_ref>"
msgstr ""
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
#, c-format
msgid "Unknown subcommand: %s"
msgstr "Ðепозната подкоманда: %s"
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
msgstr ""
-#: builtin/pack-objects.c:24
+#: builtin/pack-objects.c:26
msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
msgstr ""
-#: builtin/pack-objects.c:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
#, c-format
msgid "deflate error (%d)"
msgstr ""
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "ЗапиÑване на обектите"
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr ""
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr "КомпреÑиране на обектите"
+
+#: builtin/pack-objects.c:2530
#, c-format
msgid "unsupported index version %s"
msgstr ""
-#: builtin/pack-objects.c:2400
+#: builtin/pack-objects.c:2534
#, c-format
msgid "bad index version '%s'"
msgstr ""
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
#, c-format
msgid "option %s does not accept negative form"
msgstr ""
-#: builtin/pack-objects.c:2427
+#: builtin/pack-objects.c:2561
#, c-format
msgid "unable to parse value '%s' for option %s"
msgstr ""
-#: builtin/pack-objects.c:2446
+#: builtin/pack-objects.c:2580
msgid "do not show progress meter"
msgstr ""
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
msgid "show progress meter"
msgstr ""
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
msgid "show progress meter during object writing phase"
msgstr ""
-#: builtin/pack-objects.c:2453
+#: builtin/pack-objects.c:2587
msgid "similar to --all-progress when progress meter is shown"
msgstr ""
-#: builtin/pack-objects.c:2454
+#: builtin/pack-objects.c:2588
msgid "version[,offset]"
msgstr ""
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
msgid "write the pack index file in the specified idx format version"
msgstr ""
-#: builtin/pack-objects.c:2458
+#: builtin/pack-objects.c:2592
msgid "maximum size of each output pack file"
msgstr ""
-#: builtin/pack-objects.c:2460
+#: builtin/pack-objects.c:2594
msgid "ignore borrowed objects from alternate object store"
msgstr ""
-#: builtin/pack-objects.c:2462
+#: builtin/pack-objects.c:2596
msgid "ignore packed objects"
msgstr ""
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
msgid "limit pack window by objects"
msgstr ""
-#: builtin/pack-objects.c:2466
+#: builtin/pack-objects.c:2600
msgid "limit pack window by memory in addition to object limit"
msgstr ""
-#: builtin/pack-objects.c:2468
+#: builtin/pack-objects.c:2602
msgid "maximum length of delta chain allowed in the resulting pack"
msgstr ""
-#: builtin/pack-objects.c:2470
+#: builtin/pack-objects.c:2604
msgid "reuse existing deltas"
msgstr ""
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
msgid "reuse existing objects"
msgstr ""
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
msgid "use OFS_DELTA objects"
msgstr ""
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
msgid "use threads when searching for best delta matches"
msgstr ""
-#: builtin/pack-objects.c:2478
+#: builtin/pack-objects.c:2612
msgid "do not create an empty pack output"
msgstr ""
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
msgid "read revision arguments from standard input"
msgstr ""
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
msgid "limit the objects to those that are not yet packed"
msgstr ""
-#: builtin/pack-objects.c:2485
+#: builtin/pack-objects.c:2619
msgid "include objects reachable from any reference"
msgstr ""
-#: builtin/pack-objects.c:2488
+#: builtin/pack-objects.c:2622
msgid "include objects referred by reflog entries"
msgstr ""
-#: builtin/pack-objects.c:2491
+#: builtin/pack-objects.c:2625
msgid "output pack to stdout"
msgstr ""
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
msgid "include tag objects that refer to objects to be packed"
msgstr ""
-#: builtin/pack-objects.c:2495
+#: builtin/pack-objects.c:2629
msgid "keep unreachable objects"
msgstr ""
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
msgid "time"
msgstr "време"
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
msgid "unpack unreachable objects newer than <time>"
msgstr ""
-#: builtin/pack-objects.c:2500
+#: builtin/pack-objects.c:2634
msgid "create thin packs"
msgstr ""
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
msgid "ignore packs that have companion .keep file"
msgstr ""
-#: builtin/pack-objects.c:2504
+#: builtin/pack-objects.c:2638
msgid "pack compression level"
msgstr ""
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
msgid "do not hide commits by grafts"
msgstr ""
+#: builtin/pack-objects.c:2642
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2644
+msgid "write a bitmap index together with the pack index"
+msgstr ""
+
+#: builtin/pack-objects.c:2723
+msgid "Counting objects"
+msgstr "ПреброÑване на обектите"
+
#: builtin/pack-refs.c:6
msgid "git pack-refs [options]"
-msgstr ""
+msgstr "git pack-refs [ОПЦИИ]"
#: builtin/pack-refs.c:14
msgid "pack everything"
-msgstr ""
+msgstr "пакетиране на вÑичко"
#: builtin/pack-refs.c:15
msgid "prune loose refs (default)"
-msgstr ""
+msgstr "окаÑÑ‚Ñ€Ñне на недоÑтижимите указатели (Ñтандартно)"
#: builtin/prune-packed.c:7
msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
-msgstr ""
+msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]"
+
+#: builtin/prune-packed.c:49
+msgid "Removing duplicate objects"
+msgstr "Изтриване на повтарÑщите Ñе обекти"
#: builtin/prune.c:12
msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
-msgstr ""
+msgstr "git prune [-n] [-v] [--expire ВРЕМЕ] [--] [ВРЪХ…]"
#: builtin/prune.c:142
msgid "do not remove, show only"
-msgstr ""
+msgstr "Ñамо извеждане без дейÑтвително окаÑÑ‚Ñ€Ñне"
#: builtin/prune.c:143
msgid "report pruned objects"
-msgstr ""
+msgstr "Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° окаÑтрените обекти"
#: builtin/prune.c:146
msgid "expire objects older than <time>"
-msgstr ""
+msgstr "окаÑÑ‚Ñ€Ñне на обектите по-Ñтари от това ВРЕМЕ"
#: builtin/push.c:14
msgid "git push [<options>] [<repository> [<refspec>...]]"
-msgstr ""
+msgstr "git push [ОПЦИИ] [ХРÐÐИЛИЩЕ [УКÐЗÐТЕЛ_ÐÐ_ВЕРСИЯ…]]"
-#: builtin/push.c:86
+#: builtin/push.c:85
msgid "tag shorthand without <tag>"
-msgstr ""
+msgstr "Ñъкращение за етикет без ЕТИКЕТ"
-#: builtin/push.c:96
+#: builtin/push.c:95
msgid "--delete only accepts plain target ref names"
-msgstr ""
+msgstr "опциÑта „--delete“ приема за цел Ñамо проÑти имена на указатели"
-#: builtin/push.c:141
+#: builtin/push.c:140
msgid ""
"\n"
"To choose either option permanently, see push.default in 'git help config'."
msgstr ""
+"\n"
+"За да включите тази Ð¾Ð¿Ñ†Ð¸Ñ Ð·Ð° поÑтоÑнно вижте документациÑта за наÑтройката "
+"„push.default“ в „git help config“."
-#: builtin/push.c:144
+#: builtin/push.c:143
#, c-format
msgid ""
"The upstream branch of your current branch does not match\n"
@@ -7591,8 +7877,18 @@ msgid ""
" git push %s %s\n"
"%s"
msgstr ""
+"Името на Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½ Ñе различава от името на клона, който той Ñледи.\n"
+"За да изтлаÑкате към ÑÐ»ÐµÐ´ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½ използвайте командата:\n"
+"\n"
+" git push %s HEAD:%s\n"
+"\n"
+"За да изтлаÑкате към Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½ Ñ Ð¸Ð¼Ðµ като локалниÑ, използвайте "
+"командата:\n"
+"\n"
+" git push %s %s\n"
+"%s"
-#: builtin/push.c:159
+#: builtin/push.c:158
#, c-format
msgid ""
"You are not currently on a branch.\n"
@@ -7601,8 +7897,12 @@ msgid ""
"\n"
" git push %s HEAD:<name-of-remote-branch>\n"
msgstr ""
+"Ð’ момента не Ñте на никой клон. За да изтлаÑкате иÑториÑта до ÑÑŠÑтоÑнието,\n"
+"Ñочено в момента от ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“, използвайте командата:\n"
+"\n"
+" git push %s HEAD:ИМЕ_ÐÐ_ОТДÐЛЕЧЕÐИЯ_КЛОÐ\n"
-#: builtin/push.c:173
+#: builtin/push.c:172
#, c-format
msgid ""
"The current branch %s has no upstream branch.\n"
@@ -7610,25 +7910,36 @@ msgid ""
"\n"
" git push --set-upstream %s %s\n"
msgstr ""
+"Ðе е зададен отдалечен клон, който текущиÑÑ‚ клон „%s“ да Ñледи.\n"
+"За да изтлаÑкате Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½ към отдалечен и Ñъщевременно да зададете\n"
+"Ð²Ñ‚Ð¾Ñ€Ð¸Ñ ÐºÐ°Ñ‚Ð¾ този, който първиÑÑ‚ Ñледи, използвайте командата:\n"
+"\n"
+" git push --set-upstream %s %s\n"
-#: builtin/push.c:181
+#: builtin/push.c:180
#, c-format
msgid "The current branch %s has multiple upstream branches, refusing to push."
msgstr ""
+"ТекущиÑÑ‚ клон „%s“ Ñледи нÑколко отдалечени клона, не можете проÑто да "
+"изтлаÑкате."
-#: builtin/push.c:184
+#: builtin/push.c:183
#, 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 ""
+"ИзтлаÑквате към Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½ „%s“, който не е Ñледен от Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½ "
+"„%s“.\n"
+"ТрÑбва да укажете ÐºÐ¾Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð´Ð° Ñе изтлаÑка, за обновÑване на Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ "
+"клон."
-#: builtin/push.c:207
+#: builtin/push.c:206
msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"push.default is unset; its implicit value has changed in\n"
"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
-"and maintain the current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
"\n"
" git config --global push.default matching\n"
"\n"
@@ -7639,7 +7950,7 @@ msgid ""
"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"
+"Since Git 2.0, Git defaults to the more conservative 'simple'\n"
"behavior, which only pushes the current branch to the corresponding\n"
"remote branch that 'git pull' uses to update the current branch.\n"
"\n"
@@ -7648,37 +7959,71 @@ msgid ""
"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
"'current' instead of 'simple' if you sometimes use older versions of Git)"
msgstr ""
+"ÐаÑтройката „push.default“ не е зададена. СтойноÑтта Ñ Ð¿Ð¾ подразбиране е "
+"Ñменена\n"
+"в Git 2.0 от „matching“ (вÑички Ñъвпадащи клони) на „simple“ (Ñамо текущиÑ\n"
+"клон). За да подтиÑнете това Ñъобщение и да използвате традиционното "
+"поведение\n"
+"на Git 1.x, изпълнете командата:\n"
+"\n"
+" git config --global push.default matching\n"
+"\n"
+"За да подтиÑнете това Ñъобщение и да използвате новото поведение на Git 2."
+"x,\n"
+"изпълнете командата:\n"
+"\n"
+" git config --global push.default simple\n"
+"\n"
+"Когато наÑтройката „push.default“ е „matching“, git ще изтлаÑка вÑички "
+"локални\n"
+"клони, които имат отдалечен аналог ÑÑŠÑ Ñъщото име.\n"
+"\n"
+"От верÑÐ¸Ñ 2.0 Git Ñтандартно започва да ползва по-конÑÐµÑ€Ð²Ð°Ñ‚Ð¸Ð²Ð½Ð¸Ñ Ð²Ð°Ñ€Ð¸Ð°Ð½Ñ‚\n"
+"„simple“, при който „push“ изтлаÑква Ñамо Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½ към отдалечениÑ, "
+"Ñледен\n"
+"клон — ÑъщиÑ, който „git pull“ използва, за да обнови текущиÑ.\n"
+"\n"
+"За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð³Ð»ÐµÐ´Ð½ÐµÑ‚Ðµ „git help config“ и потърÑете „push."
+"default“.\n"
+"Ðовата ÑтойноÑÑ‚ „simple“ бе въведена Ñ Ð²ÐµÑ€ÑÐ¸Ñ 1.7.11 на Git. Ðко понÑкога\n"
+"ползвате Ñтари верÑии на Git, задайте ÑтойноÑÑ‚ „current“ вмеÑто „simple“."
-#: builtin/push.c:274
+#: builtin/push.c:273
msgid ""
"You didn't specify any refspecs to push, and push.default is \"nothing\"."
msgstr ""
+"Ðе Ñте указали верÑÐ¸Ñ Ð·Ð° подаване, а наÑтройката „push.default“ не е "
+"зададена."
-#: builtin/push.c:281
+#: builtin/push.c:280
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 ""
+"ОбновÑването е отхвърлено, защото върхът на Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ Ð²Ð¸ клон е преди върха "
+"на\n"
+"Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½. ВнеÑете отдалечените промени (напр. Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ‚Ð° „git "
+"pull…“),\n"
+"преди отново да изтлаÑкате промените. За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð²Ð¸Ð¶Ñ‚Ðµ раздела\n"
+"„Note about fast-forwards“ в Ñтраницата от ръководÑтвото „git push --help“."
-#: 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
+#: builtin/push.c:286
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 ""
+"ОбновÑването е отхвърлено, защото върха на изтлаÑÐºÐ²Ð°Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½ е преди върха "
+"на\n"
+"Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ ÐºÐ»Ð¾Ð½. Проверете клона и внеÑете отдалечените промени (напр. Ñ\n"
+"командата „git pull…“), преди отново да изтлаÑкате промените. За повече\n"
+"Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð²Ð¸Ð¶Ñ‚Ðµ раздела „Note about fast-forwards“ в Ñтраницата от\n"
+"ръководÑтвото „git push --help“."
-#: builtin/push.c:299
+#: builtin/push.c:292
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"
@@ -7686,34 +8031,51 @@ msgid ""
"(e.g., 'git pull ...') before pushing again.\n"
"See the 'Note about fast-forwards' in 'git push --help' for details."
msgstr ""
+"ОбновÑването е отхвърлено, защото хранилището, към което изтлаÑквате, "
+"Ñъдържа\n"
+"промени, които липÑват в локалното хранилище. Ðай-чеÑтата причина за това "
+"е,\n"
+"че нÑкой друг е изтлаÑквал към ÑÑŠÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½. Първо внеÑете отдалечените "
+"промени\n"
+"(напр. Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ‚Ð° „git pull…“), преди отново да изтлаÑкате промените.\n"
+"За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð²Ð¸Ð¶Ñ‚Ðµ раздела „Note about fast-forwards“ в Ñтраницата "
+"от\n"
+"ръководÑтвото „git push --help“."
-#: builtin/push.c:306
+#: builtin/push.c:299
msgid "Updates were rejected because the tag already exists in the remote."
msgstr ""
+"ИзтлаÑкването е отхвърлено, защото в отдалеченото хранилище ÑъщеÑтвува "
+"етикет,\n"
+"който ще припокриете Ñ ÐµÑ‚Ð¸ÐºÐµÑ‚ от вашето хранилище."
-#: builtin/push.c:309
+#: builtin/push.c:302
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 ""
+"Ðе можете да обновите отдалечен указател, който вече Ñочи към обект, който "
+"не е\n"
+"подаване, както и тепърва да го промените да Ñочи към подобен обект, без да\n"
+"укажете опциÑта опциÑта „--force“.\n"
-#: builtin/push.c:375
+#: builtin/push.c:361
#, c-format
msgid "Pushing to %s\n"
-msgstr ""
+msgstr "ИзтлаÑкване към „%s“\n"
-#: builtin/push.c:379
+#: builtin/push.c:365
#, c-format
msgid "failed to push some refs to '%s'"
-msgstr ""
+msgstr "чаÑÑ‚ от указателите не бÑха изтлаÑкани към „%s“"
-#: builtin/push.c:412
+#: builtin/push.c:395
#, c-format
msgid "bad repository '%s'"
-msgstr ""
+msgstr "неправилно указано хранилище „%s“"
-#: builtin/push.c:413
+#: builtin/push.c:396
msgid ""
"No configured push destination.\n"
"Either specify the URL from the command-line or configure a remote "
@@ -7725,98 +8087,111 @@ msgid ""
"\n"
" git push <name>\n"
msgstr ""
+"Ðе е указано хранилище, към което да Ñе изтлаÑква.\n"
+"Или укажете адреÑа на ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¸Ñ Ñ€ÐµÐ´, или наÑтройте отдалечено хранилище Ñ "
+"командата:\n"
+"\n"
+" git remote add ИМЕ ÐДРЕС\n"
+"\n"
+"и Ñлед това изтлаÑкайте, като укажете името на отдалеченото хранилище:\n"
+"\n"
+" git push ИМЕ\n"
-#: builtin/push.c:428
+#: builtin/push.c:411
msgid "--all and --tags are incompatible"
-msgstr ""
+msgstr "опциите „--all“ и „--tags“ Ñа неÑъвмеÑтими"
-#: builtin/push.c:429
+#: builtin/push.c:412
msgid "--all can't be combined with refspecs"
-msgstr ""
+msgstr "опциÑта „--all“ е неÑъвмеÑтима Ñ ÑƒÐºÐ°Ð·Ð²Ð°Ð½ÐµÑ‚Ð¾ на верÑиÑ"
-#: builtin/push.c:434
+#: builtin/push.c:417
msgid "--mirror and --tags are incompatible"
-msgstr ""
+msgstr "опциите „--mirror“ и „--tags“ Ñа неÑъвмеÑтими"
-#: builtin/push.c:435
+#: builtin/push.c:418
msgid "--mirror can't be combined with refspecs"
-msgstr ""
+msgstr "опциÑта „--mirror“ е неÑъвмеÑтима Ñ ÑƒÐºÐ°Ð·Ð²Ð°Ð½ÐµÑ‚Ð¾ на верÑиÑ"
-#: builtin/push.c:440
+#: builtin/push.c:423
msgid "--all and --mirror are incompatible"
-msgstr ""
+msgstr "опциите „--all“ и „--mirror“ Ñа неÑъвмеÑтими"
-#: builtin/push.c:500
+#: builtin/push.c:483
msgid "repository"
-msgstr ""
+msgstr "хранилище"
-#: builtin/push.c:501
+#: builtin/push.c:484
msgid "push all refs"
-msgstr ""
+msgstr "изтлаÑкване на вÑички указатели"
-#: builtin/push.c:502
+#: builtin/push.c:485
msgid "mirror all refs"
-msgstr ""
+msgstr "огледално копие на вÑички указатели"
-#: builtin/push.c:504
+#: builtin/push.c:487
msgid "delete refs"
-msgstr ""
+msgstr "изтриване на указателите"
-#: builtin/push.c:505
+#: builtin/push.c:488
msgid "push tags (can't be used with --all or --mirror)"
-msgstr ""
+msgstr "изтлаÑкване на етикетите (неÑъвмеÑтимо Ñ Ð¾Ð¿Ñ†Ð¸Ð¸Ñ‚Ðµ „--all“ и „--mirror“)"
-#: builtin/push.c:508
+#: builtin/push.c:491
msgid "force updates"
-msgstr ""
+msgstr "принудително обновÑване"
-#: builtin/push.c:510
+# # FIXME double check this
+#: builtin/push.c:493
msgid "refname>:<expect"
-msgstr ""
+msgstr "УКÐЗÐТЕЛ>:<ОЧÐКВÐÐÐ_СТОЙÐОСТ"
-#: builtin/push.c:511
+#: builtin/push.c:494
msgid "require old value of ref to be at this value"
-msgstr ""
+msgstr "УКÐЗÐТЕЛÑÑ‚ Ñ‚Ñ€Ñбва първоначално да е Ñ Ñ‚Ð°Ð·Ð¸ ОЧÐКВÐÐÐ_СТОЙÐОСТ"
-#: builtin/push.c:513
+#: builtin/push.c:496
msgid "check"
-msgstr ""
+msgstr "проверка"
-#: builtin/push.c:514
+#: builtin/push.c:497
msgid "control recursive pushing of submodules"
-msgstr ""
+msgstr "управление на рекурÑивното изтлаÑкване на подмодулите"
-#: builtin/push.c:516
+#: builtin/push.c:499
msgid "use thin pack"
-msgstr ""
+msgstr "използване на Ñъкратени пакети"
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
msgid "receive pack program"
-msgstr ""
+msgstr "програма за получаването на пакети"
-#: builtin/push.c:519
+#: builtin/push.c:502
msgid "set upstream for git pull/status"
-msgstr ""
+msgstr "задаване на отдалеченото хранилище за командите „git pull/status“"
-#: builtin/push.c:522
+#: builtin/push.c:505
msgid "prune locally removed refs"
-msgstr ""
+msgstr "окаÑÑ‚Ñ€Ñне на указателите, които Ñа премахнати от локалното хранилище"
-#: builtin/push.c:524
+#: builtin/push.c:507
msgid "bypass pre-push hook"
-msgstr ""
+msgstr "без изпълнение на куката преди изтлаÑкване (pre-push)"
-#: builtin/push.c:525
+#: builtin/push.c:508
msgid "push missing but relevant tags"
msgstr ""
+"изтлаÑкване на липÑващите в отдалеченото хранилище, но Ñвързани Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¾Ñ‚Ð¾ "
+"изтлаÑкване, етикети"
-#: builtin/push.c:535
+#: builtin/push.c:518
msgid "--delete is incompatible with --all, --mirror and --tags"
msgstr ""
+"опциÑта „--delete“ е неÑъвмеÑтима Ñ Ð¾Ð¿Ñ†Ð¸Ð¸Ñ‚Ðµ „--all“, „--mirror“ и „--tags“"
-#: builtin/push.c:537
+#: builtin/push.c:520
msgid "--delete doesn't make sense without any refs"
-msgstr ""
+msgstr "опциÑта „--delete“ изиÑква поне един указател на верÑиÑ"
#: builtin/read-tree.c:36
msgid ""
@@ -7909,92 +8284,93 @@ 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>] <ИМЕ> <ÐДРЕС>"
+"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 <СТÐРО_ИМЕ> <ÐОВО_ИМЕ>"
+msgstr "git remote rename СТÐРО_ИМЕ ÐОВО_ИМЕ"
#: builtin/remote.c:15 builtin/remote.c:38
msgid "git remote remove <name>"
-msgstr "git remote remove <ИМЕ>"
+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 |<КЛОÐ>)"
+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] <ИМЕ>"
+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] <ИМЕ>"
+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] [(<ГРУПÐ> | "
-"<ОТДÐЛЕЧЕÐО_ХРÐÐИЛИЩЕ>)…]"
+"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] <ИМЕ> <КЛОÐ>…"
+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] <ИМЕ> <ÐОВ_ÐДРЕС> [<СТÐР_ÐДРЕС>]"
+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 <ИМЕ> <ÐОВ_ÐДРЕС>"
+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 <ИМЕ> <ÐДРЕС>"
+msgstr "git remote set-url --delete ИМЕ ÐДРЕС"
#: builtin/remote.c:28
msgid "git remote add [<options>] <name> <url>"
-msgstr "git remote add [<ОПЦИИ>] <ИМЕ> <ÐДРЕС>"
+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 | <КЛОÐ>)"
+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 <ИМЕ> <КЛОÐ>…"
+msgstr "git remote set-branches ИМЕ КЛОÐ…"
#: builtin/remote.c:49
msgid "git remote set-branches --add <name> <branch>..."
-msgstr "git remote set-branches --add <ИМЕ> <КЛОÐ>…"
+msgstr "git remote set-branches --add ИМЕ КЛОÐ…"
#: builtin/remote.c:54
msgid "git remote show [<options>] <name>"
-msgstr "git remote show [<ОПЦИИ>] <ИМЕ>"
+msgstr "git remote show [ОПЦИИ] ИМЕ"
#: builtin/remote.c:59
msgid "git remote prune [<options>] <name>"
-msgstr "git remote prune [<ОПЦИИ>] <ИМЕ>"
+msgstr "git remote prune [ОПЦИИ] ИМЕ"
#: builtin/remote.c:64
msgid "git remote update [<options>] [<group> | <remote>]..."
-msgstr "git remote update [<ОПЦИИ>] [<ГРУПÐ> | <ОТДÐЛЕЧЕÐО_ХРÐÐИЛИЩЕ>]…"
+msgstr "git remote update [ОПЦИИ] [ГРУПР| ОТДÐЛЕЧЕÐО_ХРÐÐИЛИЩЕ]…"
#: builtin/remote.c:88
#, c-format
msgid "Updating %s"
msgstr "ОбновÑване на „%s“"
+# FIXME tabulator
#: 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“"
+"ползвайте „--mirror=fetch“ или „--mirror=push“"
#: builtin/remote.c:137
#, c-format
@@ -8087,14 +8463,14 @@ msgstr "Такова отдалечено хранилище нÑма: %s"
#: builtin/remote.c:651
#, c-format
msgid "Could not rename config section '%s' to '%s'"
-msgstr "СекциÑта в наÑтройките „%s“ не може да бъде преименувана на „%s“"
+msgstr "Разделът „%s“ в наÑтройките не може да бъде преименуван на „%s“"
#: builtin/remote.c:657 builtin/remote.c:794
#, c-format
msgid "Could not remove config section '%s'"
-msgstr "СекциÑта в наÑтройките „%s“ не може да бъде изтрита"
+msgstr "Разделът „%s“ в наÑтройките не може да бъде изтрит"
-# FIXME
+# FIXME tabulator
#: builtin/remote.c:672
#, c-format
msgid ""
@@ -8109,12 +8485,12 @@ msgstr ""
#: builtin/remote.c:678
#, c-format
msgid "Could not append '%s'"
-msgstr "СекциÑта „%s“ не може да бъде добавена в наÑтройките"
+msgstr "Разделът „%s“ не може да бъде добавен в наÑтройките"
#: builtin/remote.c:689
#, c-format
msgid "Could not set '%s'"
-msgstr "СекциÑта „%s“ не може да бъде зададена в наÑтройките"
+msgstr "Разделът „%s“ не може да бъде зададен в наÑтройките"
#: builtin/remote.c:711
#, c-format
@@ -8158,6 +8534,7 @@ msgstr " Ñледен"
msgid " stale (use 'git remote prune' to remove)"
msgstr " Ñтар (изтрийте чрез „git remote prune“)"
+# FIXME
#: builtin/remote.c:945
msgid " ???"
msgstr " неÑÑно"
@@ -8240,7 +8617,7 @@ msgstr "без заÑвки към отдалечените хранилища"
#: builtin/remote.c:1171
#, c-format
msgid "* remote %s"
-msgstr "* отдалечено хранилище „%s“"
+msgstr "◠отдалечено хранилище „%s“"
#: builtin/remote.c:1172
#, c-format
@@ -8299,11 +8676,11 @@ msgstr[1] " Локалните указатели, наÑтроени за „g
#: builtin/remote.c:1252
msgid "set refs/remotes/<name>/HEAD according to remote"
-msgstr "задаване на refs/remotes/<ИМЕ>/HEAD Ñпоред отдалеченото хранилище"
+msgstr "задаване на refs/remotes/ИМЕ/HEAD Ñпоред отдалеченото хранилище"
#: builtin/remote.c:1254
msgid "delete refs/remotes/<name>/HEAD"
-msgstr "изтриване на refs/remotes/<ИМЕ>/HEAD"
+msgstr "изтриване на refs/remotes/ИМЕ/HEAD"
#: builtin/remote.c:1269
msgid "Cannot determine remote HEAD"
@@ -8352,12 +8729,12 @@ msgstr "адреÑ: %s"
#: builtin/remote.c:1328
#, c-format
msgid " * [would prune] %s"
-msgstr " * [ще бъде окаÑтрено] %s"
+msgstr " â— [ще бъде окаÑтрено] %s"
#: builtin/remote.c:1331
#, c-format
msgid " * [pruned] %s"
-msgstr " * [окаÑтрено] %s"
+msgstr " â— [окаÑтрено] %s"
#: builtin/remote.c:1374
msgid "prune remotes after fetching"
@@ -8402,7 +8779,7 @@ msgstr "Ðеправилен (Ñтар) формат за адреÑ: %s"
msgid "No such URL found: %s"
msgstr "Такъв Ð°Ð´Ñ€ÐµÑ Ð½Ðµ е открит: %s"
-# MEANING
+# FIXME CHECK MEANING
#: builtin/remote.c:1550
msgid "Will not delete all non-push URLs"
msgstr "Ðикой от адреÑите, които не Ñа за изтлаÑкване, нÑма да Ñе изтрие"
@@ -8411,242 +8788,269 @@ msgstr "Ðикой от адреÑите, които не Ñа за изтлаÑ
msgid "be verbose; must be placed before a subcommand"
msgstr "повече подробноÑти. ПоÑÑ‚Ð°Ð²Ñ Ñе пред подкоманда"
-#: builtin/repack.c:15
+#: builtin/repack.c:16
msgid "git repack [options]"
msgstr ""
-#: builtin/repack.c:143
+#: builtin/repack.c:156
msgid "pack everything in a single pack"
msgstr ""
-#: builtin/repack.c:145
+#: builtin/repack.c:158
msgid "same as -a, and turn unreachable objects loose"
msgstr ""
-#: builtin/repack.c:148
+#: builtin/repack.c:161
msgid "remove redundant packs, and run git-prune-packed"
msgstr ""
-#: builtin/repack.c:150
+#: builtin/repack.c:163
msgid "pass --no-reuse-delta to git-pack-objects"
msgstr ""
-#: builtin/repack.c:152
+#: builtin/repack.c:165
msgid "pass --no-reuse-object to git-pack-objects"
msgstr ""
-#: builtin/repack.c:154
+#: builtin/repack.c:167
msgid "do not run git-update-server-info"
msgstr ""
-#: builtin/repack.c:157
+#: builtin/repack.c:170
msgid "pass --local to git-pack-objects"
msgstr ""
-#: builtin/repack.c:158
+#: builtin/repack.c:172
+msgid "write bitmap index"
+msgstr ""
+
+#: builtin/repack.c:173
msgid "approxidate"
msgstr ""
-#: builtin/repack.c:159
+#: builtin/repack.c:174
msgid "with -A, do not loosen objects older than this"
msgstr ""
-#: builtin/repack.c:161
+#: builtin/repack.c:176
msgid "size of the window used for delta compression"
msgstr ""
-#: builtin/repack.c:163
+#: builtin/repack.c:177 builtin/repack.c:181
+msgid "bytes"
+msgstr ""
+
+#: builtin/repack.c:178
msgid "same as the above, but limit memory size instead of entries count"
msgstr ""
-#: builtin/repack.c:165
+#: builtin/repack.c:180
msgid "limits the maximum delta depth"
msgstr ""
-#: builtin/repack.c:167
+#: builtin/repack.c:182
msgid "maximum size of each packfile"
msgstr ""
-#: builtin/repack.c:343
+#: builtin/repack.c:184
+msgid "repack objects in packs marked with .keep"
+msgstr ""
+
+#: builtin/repack.c:371
#, c-format
msgid "removing '%s' failed"
msgstr ""
#: builtin/replace.c:17
msgid "git replace [-f] <object> <replacement>"
-msgstr ""
+msgstr "git replace [-f] ОБЕКТ ЗÐМЯÐÐ"
#: builtin/replace.c:18
msgid "git replace -d <object>..."
-msgstr ""
+msgstr "git replace -d ОБЕКТ…"
#: builtin/replace.c:19
msgid "git replace [--format=<format>] [-l [<pattern>]]"
-msgstr ""
+msgstr "git replace [--format=ФОРМÐТ] [-l [ШÐБЛОÐ]]"
#: builtin/replace.c:174
msgid "list replace refs"
-msgstr ""
+msgstr "извеждане на ÑпиÑъка Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ð¸Ñ‚Ðµ за замÑна"
#: builtin/replace.c:175
msgid "delete replace refs"
-msgstr ""
+msgstr "изтриване на указателите за замÑна"
#: builtin/replace.c:176
msgid "replace the ref if it exists"
-msgstr ""
+msgstr "замÑна на указателите, ако ÑъщеÑтвуват"
#: builtin/replace.c:177
msgid "use this format"
-msgstr ""
+msgstr "използване на този ФОРМÐТ"
#: builtin/rerere.c:12
msgid "git rerere [clear | forget path... | status | remaining | diff | gc]"
-msgstr ""
+msgstr "git rerere [clear | forget ПЪТ… | status | remaining | diff | gc]"
#: builtin/rerere.c:57
msgid "register clean resolutions in index"
-msgstr ""
+msgstr "региÑтриране на чиÑти корекции на конфликти в индекÑа"
#: builtin/reset.c:25
msgid ""
"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"
msgstr ""
+"git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [ПОДÐÐ’ÐÐЕ]"
#: builtin/reset.c:26
msgid "git reset [-q] <tree-ish> [--] <paths>..."
-msgstr ""
+msgstr "git reset [-q] ДЪРВО [--] ПЪТИЩÐ…"
#: builtin/reset.c:27
msgid "git reset --patch [<tree-ish>] [--] [<paths>...]"
-msgstr ""
+msgstr "git reset --patch [ДЪРВО] [--] [ПЪТИЩÐ…]"
#: builtin/reset.c:33
msgid "mixed"
-msgstr ""
+msgstr "ÑмеÑено (mixed)"
#: builtin/reset.c:33
msgid "soft"
-msgstr ""
+msgstr "меко (soft)"
#: builtin/reset.c:33
msgid "hard"
-msgstr ""
+msgstr "пълно (hard)"
#: builtin/reset.c:33
msgid "merge"
-msgstr ""
+msgstr "ÑлÑто (merge)"
#: builtin/reset.c:33
msgid "keep"
-msgstr ""
+msgstr "запазващо (keep)"
#: builtin/reset.c:73
msgid "You do not have a valid HEAD."
-msgstr ""
+msgstr "УказателÑÑ‚ „HEAD“ е повреден."
#: builtin/reset.c:75
msgid "Failed to find tree of HEAD."
-msgstr ""
+msgstr "Дървото, Ñочено от ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“, не може да бъде открито."
#: builtin/reset.c:81
#, c-format
msgid "Failed to find tree of %s."
-msgstr ""
+msgstr "Дървото, Ñочено от „%s“, не може да бъде открито."
#: builtin/reset.c:99
#, c-format
msgid "HEAD is now at %s"
-msgstr ""
+msgstr "УказателÑÑ‚ „HEAD“ Ñочи към „%s“"
-#: builtin/reset.c:172
+#: builtin/reset.c:182
#, c-format
msgid "Cannot do a %s reset in the middle of a merge."
-msgstr ""
+msgstr "Ðе може да Ñе извърши %s занулÑване по време на Ñливане."
-#: builtin/reset.c:262
+#: builtin/reset.c:273
msgid "be quiet, only report errors"
-msgstr ""
+msgstr "по-малко подробноÑти, да Ñе извеждат Ñамо грешките"
-#: builtin/reset.c:264
+#: builtin/reset.c:275
msgid "reset HEAD and index"
-msgstr ""
+msgstr "индекÑа и ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“, без работното дърво"
-#: builtin/reset.c:265
+#: builtin/reset.c:276
msgid "reset only HEAD"
-msgstr ""
+msgstr "Ñамо ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“, без индекÑа и работното дърво"
-#: builtin/reset.c:267 builtin/reset.c:269
+# FIXME vs man page
+#: builtin/reset.c:278 builtin/reset.c:280
msgid "reset HEAD, index and working tree"
-msgstr ""
+msgstr "ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“, индекÑа и работното дърво"
-#: builtin/reset.c:271
+# FIXME vs man page
+#: builtin/reset.c:282
msgid "reset HEAD but keep local changes"
+msgstr "занулÑване на ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“, но запазване на локалните промени"
+
+#: builtin/reset.c:285
+msgid "record only the fact that removed paths will be added later"
msgstr ""
+"отбелÑзване Ñамо на факта, че изтритите пътища ще бъдат добавени по-къÑно"
-#: builtin/reset.c:289
+#: builtin/reset.c:302
#, c-format
msgid "Failed to resolve '%s' as a valid revision."
-msgstr ""
+msgstr "СтойноÑтта „%s“ не е разпозната като ÑъщеÑтвуваща верÑиÑ."
-#: builtin/reset.c:292 builtin/reset.c:300
+#: builtin/reset.c:305 builtin/reset.c:313
#, c-format
msgid "Could not parse object '%s'."
-msgstr ""
+msgstr "„%s“ не е разпознат като обект."
-#: builtin/reset.c:297
+#: builtin/reset.c:310
#, c-format
msgid "Failed to resolve '%s' as a valid tree."
-msgstr ""
+msgstr "„%s“ не е разпознат като дърво."
-#: builtin/reset.c:306
+#: builtin/reset.c:319
msgid "--patch is incompatible with --{hard,mixed,soft}"
msgstr ""
+"опциÑта „--patch“ е неÑъвмеÑтима Ñ Ð²ÑÑка от опциите „--hard/--mixed/--soft“"
-#: builtin/reset.c:315
+#: builtin/reset.c:328
msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
msgstr ""
+"опциÑта „--mixed“ не бива да Ñе използва заедно Ñ Ð¿ÑŠÑ‚Ð¸Ñ‰Ð°. ВмеÑто това "
+"изпълнете „git reset -- ПЪТ…“."
-#: builtin/reset.c:317
+#: builtin/reset.c:330
#, c-format
msgid "Cannot do %s reset with paths."
-msgstr ""
+msgstr "Ðе може да извършите %s занулÑване, когато Ñте задали ПЪТ."
-#: builtin/reset.c:327
+#: builtin/reset.c:340
#, c-format
msgid "%s reset is not allowed in a bare repository"
-msgstr ""
+msgstr "Ð’ голо хранилище не може да извършите %s занулÑване"
#: builtin/reset.c:344
+msgid "-N can only be used with --mixed"
+msgstr "ОпциÑта „-N“ е ÑъвмеÑтима Ñамо Ñ â€ž--mixed“"
+
+#: builtin/reset.c:361
msgid "Unstaged changes after reset:"
-msgstr ""
+msgstr "Промени извън индекÑа Ñлед занулÑването:"
-#: builtin/reset.c:350
+#: builtin/reset.c:367
#, c-format
msgid "Could not reset index file to revision '%s'."
-msgstr ""
+msgstr "ИндекÑÑŠÑ‚ не може да бъде занулен към верÑÐ¸Ñ â€ž%s“."
-#: builtin/reset.c:355
+#: builtin/reset.c:372
msgid "Could not write new index file."
-msgstr ""
+msgstr "ÐовиÑÑ‚ Ð¸Ð½Ð´ÐµÐºÑ Ð½Ðµ може да бъде запиÑан."
#: builtin/rev-parse.c:359
msgid "git rev-parse --parseopt [options] -- [<args>...]"
-msgstr ""
+msgstr "git rev-parse --parseopt [ОПЦИИ] -- [ÐРГУМЕÐТИ…]"
#: builtin/rev-parse.c:364
msgid "keep the `--` passed as an arg"
-msgstr ""
+msgstr "зададениÑÑ‚ низ „--“ да Ñе тълкува като аргумент"
#: builtin/rev-parse.c:366
msgid "stop parsing after the first non-option argument"
-msgstr ""
+msgstr "Ñпиране на анализа Ñлед Ð¿ÑŠÑ€Ð²Ð¸Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚, който не е опциÑ"
#: builtin/rev-parse.c:369
msgid "output in stuck long form"
-msgstr ""
+msgstr "изход в Ð´ÑŠÐ»Ð³Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚"
-#: builtin/rev-parse.c:486
+#: builtin/rev-parse.c:497
msgid ""
"git rev-parse --parseopt [options] -- [<args>...]\n"
" or: git rev-parse --sq-quote [<arg>...]\n"
@@ -8654,99 +9058,105 @@ msgid ""
"\n"
"Run \"git rev-parse --parseopt -h\" for more information on the first usage."
msgstr ""
+"git rev-parse --parseopt [ОПЦИИ] -- [ÐРГУМЕÐТИ…]\n"
+" или: git rev-parse --sq-quote [ÐРГУМЕÐТИ…]\n"
+" или: git rev-parse [ОПЦИИ] [ÐРГУМЕÐТИ…]\n"
+"\n"
+"За повече Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° Ð¿ÑŠÑ€Ð²Ð¸Ñ Ð²Ð°Ñ€Ð¸Ð°Ð½Ñ‚ изпълнете „git rev-parse --parseopt -"
+"h“"
#: builtin/revert.c:22
msgid "git revert [options] <commit-ish>..."
-msgstr ""
+msgstr "git revert [ОПЦИИ] УКÐЗÐТЕЛ_КЪМ_ПОДÐÐ’ÐÐЕ…"
#: builtin/revert.c:23
msgid "git revert <subcommand>"
-msgstr ""
+msgstr "git revert ПОДКОМÐÐДÐ"
#: builtin/revert.c:28
msgid "git cherry-pick [options] <commit-ish>..."
-msgstr ""
+msgstr "git cherry-pick [ОПЦИИ] УКÐЗÐТЕЛ_КЪМ_ПОДÐÐ’ÐÐЕ…"
#: builtin/revert.c:29
msgid "git cherry-pick <subcommand>"
-msgstr ""
+msgstr "git cherry-pick ПОДКОМÐÐДÐ"
#: builtin/revert.c:71
#, c-format
msgid "%s: %s cannot be used with %s"
-msgstr ""
+msgstr "%s: опциÑта „%s“ е неÑъвмеÑтима Ñ â€ž%s“"
#: builtin/revert.c:80
msgid "end revert or cherry-pick sequence"
-msgstr ""
+msgstr "завършване на поредица от отбиране или отмÑна на подаваниÑ"
#: builtin/revert.c:81
msgid "resume revert or cherry-pick sequence"
-msgstr ""
+msgstr "завършване на поредица от отбиране или отмÑна на подаваниÑ"
#: builtin/revert.c:82
msgid "cancel revert or cherry-pick sequence"
-msgstr ""
+msgstr "отмÑна на поредица от отбиране или отмÑна на подаваниÑ"
#: builtin/revert.c:83
msgid "don't automatically commit"
-msgstr ""
+msgstr "без автоматично подаване"
#: builtin/revert.c:84
msgid "edit the commit message"
-msgstr ""
+msgstr "редактиране на Ñъобщението при подаване"
#: builtin/revert.c:87
msgid "parent number"
-msgstr ""
+msgstr "номер на родителÑ"
#: builtin/revert.c:89
msgid "merge strategy"
-msgstr ""
+msgstr "ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ Ð½Ð° Ñливане"
#: builtin/revert.c:90
msgid "option"
-msgstr ""
+msgstr "опциÑ"
#: builtin/revert.c:91
msgid "option for merge strategy"
-msgstr ""
+msgstr "Ð¾Ð¿Ñ†Ð¸Ñ Ð·Ð° ÑтратегиÑта на Ñливане"
-#: builtin/revert.c:102
+#: builtin/revert.c:104
msgid "append commit name"
-msgstr ""
+msgstr "добавÑне на името на подаването"
-#: builtin/revert.c:103
+#: builtin/revert.c:105
msgid "allow fast-forward"
-msgstr ""
+msgstr "позволÑване на тривиални ÑливаниÑ"
-#: builtin/revert.c:104
+#: builtin/revert.c:106
msgid "preserve initially empty commits"
-msgstr ""
+msgstr "запазване на първоначално празните подаваниÑ"
-#: builtin/revert.c:105
+#: builtin/revert.c:107
msgid "allow commits with empty messages"
-msgstr ""
+msgstr "позволÑване на празни ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ подаване"
-#: builtin/revert.c:106
+#: builtin/revert.c:108
msgid "keep redundant, empty commits"
-msgstr ""
+msgstr "запазване на излишните, празни подаваниÑ"
-#: builtin/revert.c:110
+#: builtin/revert.c:112
msgid "program error"
-msgstr ""
+msgstr "грешка в програмата"
-#: builtin/revert.c:195
+#: builtin/revert.c:197
msgid "revert failed"
-msgstr ""
+msgstr "неуÑпешна отмÑна"
-#: builtin/revert.c:210
+#: builtin/revert.c:212
msgid "cherry-pick failed"
-msgstr ""
+msgstr "неуÑпешно отбиране"
#: builtin/rm.c:17
msgid "git rm [options] [--] <file>..."
-msgstr "git rm [ОПЦИИ] [--] <ФÐЙЛ>…"
+msgstr "git rm [ОПЦИИ] [--] ФÐЙЛ…"
#: builtin/rm.c:65
msgid ""
@@ -8756,11 +9166,13 @@ msgid_plural ""
"the following submodules (or one of its nested submodules)\n"
"use a .git directory:"
msgstr[0] ""
-"ÑледниÑÑ‚ подмодул или нÑкой от неговите подмодули\n"
-"използват Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° име „.git“:"
+"ÑледниÑÑ‚ подмодул или нÑкой от неговите подмодули използват Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° "
+"име\n"
+"„.git“:"
msgstr[1] ""
-"Ñледните подмодули или нÑкои от техните подмодули\n"
-"използват Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° име „.git“:"
+"Ñледните подмодули или нÑкои от техните подмодули използват Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° "
+"име\n"
+"„.git“:"
#: builtin/rm.c:71
msgid ""
@@ -8877,92 +9289,95 @@ msgid "Linewrap output"
msgstr ""
#: builtin/show-branch.c:9
-#, fuzzy
msgid ""
"git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--"
"current] [--color[=<when>] | --no-color] [--sparse] [--more=<n> | --list | --"
"independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | "
"<glob>)...]"
-msgstr "<брой>"
+msgstr ""
+"git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--"
+"current] [--color[=КОГÐ] | --no-color] [--sparse] [--more=БРОЙ | --list | --"
+"independent | --merge-base] [--no-name | --sha1-name] [--topics] [(РЕВИЗИЯ | "
+"УКÐЗÐТЕЛ)…]"
#: builtin/show-branch.c:10
-#, fuzzy
msgid "git show-branch (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>]"
-msgstr "<брой>"
+msgstr "git show-branch (-g|--reflog)[=БРОЙ[,БÐЗÐ]] [--list] [УКÐЗÐТЕЛ]"
#: builtin/show-branch.c:649
msgid "show remote-tracking and local branches"
-msgstr ""
+msgstr "извеждане на ÑледÑщите и локалните клони"
#: builtin/show-branch.c:651
msgid "show remote-tracking branches"
-msgstr ""
+msgstr "извеждане на ÑледÑщите клони"
#: builtin/show-branch.c:653
msgid "color '*!+-' corresponding to the branch"
-msgstr ""
+msgstr "оцветÑване на „*!+-“ Ñпоред клоните"
#: builtin/show-branch.c:655
-#, fuzzy
msgid "show <n> more commits after the common ancestor"
-msgstr "<брой>"
+msgstr "извеждане на такъв БРОЙ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‚ Ð¾Ð±Ñ‰Ð¸Ñ Ð¿Ñ€ÐµÐ´ÑˆÐµÑтвеник"
#: builtin/show-branch.c:657
msgid "synonym to more=-1"
-msgstr ""
+msgstr "Ñиноним на „more=-1“"
#: builtin/show-branch.c:658
msgid "suppress naming strings"
-msgstr ""
+msgstr "без низове за имената на клоните"
#: builtin/show-branch.c:660
msgid "include the current branch"
-msgstr ""
+msgstr "включване и на Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½"
#: builtin/show-branch.c:662
msgid "name commits with their object names"
-msgstr ""
+msgstr "именоване на подаваниÑта Ñ Ð¸Ð¼ÐµÐ½Ð°Ñ‚Ð° им на обекти"
#: builtin/show-branch.c:664
msgid "show possible merge bases"
-msgstr ""
+msgstr "извеждане на възможните бази за ÑливаниÑ"
#: builtin/show-branch.c:666
msgid "show refs unreachable from any other ref"
-msgstr ""
+msgstr "извеждане на недоÑтижимите указатели"
#: builtin/show-branch.c:668
msgid "show commits in topological order"
-msgstr ""
+msgstr "извеждане на подаваниÑта в топологичеÑка подредба"
#: builtin/show-branch.c:671
msgid "show only commits not on the first branch"
-msgstr ""
+msgstr "извеждане Ñамо на подаваниÑта, които не Ñа от Ð¿ÑŠÑ€Ð²Ð¸Ñ ÐºÐ»Ð¾Ð½"
#: builtin/show-branch.c:673
msgid "show merges reachable from only one tip"
-msgstr ""
+msgstr "извеждане на ÑливаниÑта, които могат да Ñе доÑтигнат Ñамо от един връх"
#: builtin/show-branch.c:675
msgid "topologically sort, maintaining date order where possible"
msgstr ""
+"топологичеÑка подредба, при запазване на подредбата по дата, доколкото е\n"
+"възможно"
#: builtin/show-branch.c:678
-#, fuzzy
msgid "<n>[,<base>]"
-msgstr "<брой>"
+msgstr "БРОЙ[,БÐЗÐ]"
#: builtin/show-branch.c:679
-#, fuzzy
msgid "show <n> most recent ref-log entries starting at base"
-msgstr "<брой>"
+msgstr "показване на най-много БРОЙ журнални запиÑа Ñ Ð½Ð°Ñ‡Ð°Ð»Ð¾ Ñъответната БÐЗÐ"
+# FIXME * -> ...
#: builtin/show-ref.c:10
-#, fuzzy
msgid ""
"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--"
"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "
-msgstr "<брой>"
+msgstr ""
+"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--"
+"hash[=ЧИСЛО]] [--abbrev[=ЧИСЛО]] [--tags] [--heads] [--] [ШÐБЛОÐ…]"
#: builtin/show-ref.c:11
msgid "git show-ref --exclude-existing[=pattern] < ref-list"
@@ -8989,9 +9404,8 @@ msgid "dereference tags into object IDs"
msgstr ""
#: builtin/show-ref.c:179
-#, fuzzy
msgid "only show SHA1 hash using <n> digits"
-msgstr "<брой>"
+msgstr "извеждане Ñамо на този БРОЙ цифри от вÑÑка Ñума по SHA1"
#: builtin/show-ref.c:183
msgid "do not print results to stdout (useful with --verify)"
@@ -9003,42 +9417,44 @@ msgstr ""
#: builtin/symbolic-ref.c:7
msgid "git symbolic-ref [options] name [ref]"
-msgstr ""
+msgstr "git symbolic-ref [ОПЦИИ] ИМЕ [УКÐЗÐТЕЛ]"
#: builtin/symbolic-ref.c:8
msgid "git symbolic-ref -d [-q] name"
-msgstr ""
+msgstr "git symbolic-ref -d [-q] ИМЕ"
#: builtin/symbolic-ref.c:40
msgid "suppress error message for non-symbolic (detached) refs"
-msgstr ""
+msgstr "без извеждане на грешка за неÑвързани (неÑимволни) указатели"
#: builtin/symbolic-ref.c:41
msgid "delete symbolic ref"
-msgstr ""
+msgstr "изтриване на Ñимволен указател"
#: builtin/symbolic-ref.c:42
msgid "shorten ref output"
-msgstr ""
+msgstr "кратка Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° указателÑ"
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
msgid "reason"
-msgstr ""
+msgstr "причина"
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
msgid "reason of the update"
-msgstr ""
+msgstr "причина за обновÑването"
#: builtin/tag.c:22
msgid ""
"git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]"
msgstr ""
+"git tag [-a|-s|-u ИДЕÐТИФИКÐТОР_ÐÐ_КЛЮЧ] [-f] [-m СЪОБЩЕÐИЕ|-F ФÐЙЛ] ЕТИКЕТ "
+"[ВРЪХ]"
#: builtin/tag.c:23
msgid "git tag -d <tagname>..."
msgstr ""
-# FIXME
+# FIXME tabulator
#: builtin/tag.c:24
msgid ""
"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] \n"
@@ -9049,32 +9465,32 @@ msgstr ""
msgid "git tag -v <tagname>..."
msgstr ""
-#: builtin/tag.c:60
+#: builtin/tag.c:67
#, c-format
msgid "malformed object at '%s'"
msgstr ""
-#: builtin/tag.c:207
+#: builtin/tag.c:239
#, c-format
msgid "tag name too long: %.*s..."
msgstr ""
-#: builtin/tag.c:212
+#: builtin/tag.c:244
#, c-format
msgid "tag '%s' not found."
msgstr ""
-#: builtin/tag.c:227
+#: builtin/tag.c:259
#, c-format
msgid "Deleted tag '%s' (was %s)\n"
msgstr ""
-#: builtin/tag.c:239
+#: builtin/tag.c:271
#, c-format
msgid "could not verify the tag '%s'"
msgstr ""
-#: builtin/tag.c:249
+#: builtin/tag.c:281
#, c-format
msgid ""
"\n"
@@ -9082,7 +9498,7 @@ msgid ""
"Lines starting with '%c' will be ignored.\n"
msgstr ""
-#: builtin/tag.c:253
+#: builtin/tag.c:285
#, c-format
msgid ""
"\n"
@@ -9091,329 +9507,348 @@ msgid ""
"want to.\n"
msgstr ""
-#: builtin/tag.c:292
+#: builtin/tag.c:324
msgid "unable to sign the tag"
msgstr ""
-#: builtin/tag.c:294
+#: builtin/tag.c:326
msgid "unable to write tag file"
msgstr ""
-#: builtin/tag.c:319
+#: builtin/tag.c:351
msgid "bad object type."
msgstr ""
-#: builtin/tag.c:332
+#: builtin/tag.c:364
msgid "tag header too big."
msgstr ""
-#: builtin/tag.c:368
+#: builtin/tag.c:400
msgid "no tag message?"
msgstr ""
-#: builtin/tag.c:374
+#: builtin/tag.c:406
#, c-format
msgid "The tag message has been left in %s\n"
msgstr ""
-#: builtin/tag.c:423
+#: builtin/tag.c:455
msgid "switch 'points-at' requires an object"
msgstr ""
-#: builtin/tag.c:425
+#: builtin/tag.c:457
#, c-format
msgid "malformed object name '%s'"
msgstr ""
-#: builtin/tag.c:445
+#: builtin/tag.c:480
+#, c-format
+msgid "unsupported sort specification %s"
+msgstr "зададена е неподдържана подредба: „%s“"
+
+#: builtin/tag.c:500
msgid "list tag names"
msgstr ""
-#: builtin/tag.c:447
-#, fuzzy
+#: builtin/tag.c:502
msgid "print <n> lines of each tag message"
-msgstr "<брой>"
+msgstr "извеждане на този БРОЙ редове от вÑÑко Ñъобщение за етикет"
-#: builtin/tag.c:449
+#: builtin/tag.c:504
msgid "delete tags"
msgstr ""
-#: builtin/tag.c:450
+#: builtin/tag.c:505
msgid "verify tags"
msgstr ""
-#: builtin/tag.c:452
+#: builtin/tag.c:507
msgid "Tag creation options"
msgstr ""
-#: builtin/tag.c:454
+#: builtin/tag.c:509
msgid "annotated tag, needs a message"
msgstr ""
-#: builtin/tag.c:456
+#: builtin/tag.c:511
msgid "tag message"
msgstr ""
-#: builtin/tag.c:458
+#: builtin/tag.c:513
msgid "annotated and GPG-signed tag"
msgstr ""
-#: builtin/tag.c:462
+#: builtin/tag.c:517
msgid "use another key to sign the tag"
msgstr ""
-#: builtin/tag.c:463
+#: builtin/tag.c:518
msgid "replace the tag if exists"
msgstr ""
-#: builtin/tag.c:464
+#: builtin/tag.c:519
msgid "show tag list in columns"
msgstr ""
-#: builtin/tag.c:466
+#: builtin/tag.c:521
+msgid "sort tags"
+msgstr "подреждане на етикетите"
+
+#: builtin/tag.c:525
msgid "Tag listing options"
msgstr ""
-#: builtin/tag.c:469
+#: builtin/tag.c:528 builtin/tag.c:534
msgid "print only tags that contain the commit"
msgstr ""
-#: builtin/tag.c:475
+#: builtin/tag.c:540
msgid "print only tags of the object"
msgstr ""
-#: builtin/tag.c:501
+#: builtin/tag.c:566
msgid "--column and -n are incompatible"
msgstr ""
-#: builtin/tag.c:518
+#: builtin/tag.c:578
+msgid "--sort and -n are incompatible"
+msgstr "Опциите „--long“ и „-n“ Ñа неÑъвмеÑтими"
+
+#: builtin/tag.c:585
msgid "-n option is only allowed with -l."
msgstr ""
-#: builtin/tag.c:520
+#: builtin/tag.c:587
msgid "--contains option is only allowed with -l."
msgstr ""
-#: builtin/tag.c:522
+#: builtin/tag.c:589
msgid "--points-at option is only allowed with -l."
msgstr ""
-#: builtin/tag.c:530
+#: builtin/tag.c:597
msgid "only one -F or -m option is allowed."
msgstr ""
-#: builtin/tag.c:550
+#: builtin/tag.c:617
msgid "too many params"
msgstr ""
-#: builtin/tag.c:556
+#: builtin/tag.c:623
#, c-format
msgid "'%s' is not a valid tag name."
msgstr ""
-#: builtin/tag.c:561
+#: builtin/tag.c:628
#, c-format
msgid "tag '%s' already exists"
msgstr ""
-#: builtin/tag.c:579
+#: builtin/tag.c:646
#, c-format
msgid "%s: cannot lock the ref"
msgstr ""
-#: builtin/tag.c:581
+#: builtin/tag.c:648
#, c-format
msgid "%s: cannot update the ref"
msgstr ""
-#: builtin/tag.c:583
+#: builtin/tag.c:650
#, c-format
msgid "Updated tag '%s' (was %s)\n"
msgstr ""
-#: builtin/update-index.c:402
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr "Разпакетиране на обектите"
+
+#: builtin/update-index.c:399
msgid "git update-index [options] [--] [<file>...]"
msgstr ""
-#: builtin/update-index.c:720
+#: builtin/update-index.c:748
msgid "continue refresh even when index needs update"
msgstr ""
-#: builtin/update-index.c:723
+#: builtin/update-index.c:751
msgid "refresh: ignore submodules"
msgstr ""
-#: builtin/update-index.c:726
+#: builtin/update-index.c:754
msgid "do not ignore new files"
msgstr ""
-#: builtin/update-index.c:728
+#: builtin/update-index.c:756
msgid "let files replace directories and vice-versa"
msgstr ""
-#: builtin/update-index.c:730
+#: builtin/update-index.c:758
msgid "notice files missing from worktree"
msgstr ""
-#: builtin/update-index.c:732
+#: builtin/update-index.c:760
msgid "refresh even if index contains unmerged entries"
msgstr ""
-#: builtin/update-index.c:735
+#: builtin/update-index.c:763
msgid "refresh stat information"
msgstr ""
-#: builtin/update-index.c:739
+#: builtin/update-index.c:767
msgid "like --refresh, but ignore assume-unchanged setting"
msgstr ""
-#: builtin/update-index.c:743
-msgid "<mode> <object> <path>"
+#: builtin/update-index.c:771
+msgid "<mode>,<object>,<path>"
msgstr ""
-#: builtin/update-index.c:744
+#: builtin/update-index.c:772
msgid "add the specified entry to the index"
msgstr ""
-#: builtin/update-index.c:748
+#: builtin/update-index.c:776
msgid "(+/-)x"
msgstr ""
-#: builtin/update-index.c:749
+#: builtin/update-index.c:777
msgid "override the executable bit of the listed files"
msgstr ""
-#: builtin/update-index.c:753
+#: builtin/update-index.c:781
msgid "mark files as \"not changing\""
msgstr ""
-#: builtin/update-index.c:756
+#: builtin/update-index.c:784
msgid "clear assumed-unchanged bit"
msgstr ""
-#: builtin/update-index.c:759
+#: builtin/update-index.c:787
msgid "mark files as \"index-only\""
msgstr ""
-#: builtin/update-index.c:762
+#: builtin/update-index.c:790
msgid "clear skip-worktree bit"
msgstr ""
-#: builtin/update-index.c:765
+#: builtin/update-index.c:793
msgid "add to index only; do not add content to object database"
msgstr ""
-#: builtin/update-index.c:767
+#: builtin/update-index.c:795
msgid "remove named paths even if present in worktree"
msgstr ""
-#: builtin/update-index.c:769
+#: builtin/update-index.c:797
msgid "with --stdin: input lines are terminated by null bytes"
msgstr ""
-#: builtin/update-index.c:771
+#: builtin/update-index.c:799
msgid "read list of paths to be updated from standard input"
msgstr ""
-#: builtin/update-index.c:775
+#: builtin/update-index.c:803
msgid "add entries from standard input to the index"
msgstr ""
-#: builtin/update-index.c:779
+#: builtin/update-index.c:807
msgid "repopulate stages #2 and #3 for the listed paths"
msgstr ""
-#: builtin/update-index.c:783
+#: builtin/update-index.c:811
msgid "only update entries that differ from HEAD"
msgstr ""
-#: builtin/update-index.c:787
+#: builtin/update-index.c:815
msgid "ignore files missing from worktree"
msgstr ""
-#: builtin/update-index.c:790
+#: builtin/update-index.c:818
msgid "report actions to standard output"
msgstr ""
-#: builtin/update-index.c:792
+#: builtin/update-index.c:820
msgid "(for porcelains) forget saved unresolved conflicts"
msgstr ""
-#: builtin/update-index.c:796
+#: builtin/update-index.c:824
msgid "write index in this format"
msgstr ""
#: builtin/update-ref.c:9
msgid "git update-ref [options] -d <refname> [<oldval>]"
-msgstr ""
+msgstr "git update-ref [ОПЦИИ] -d ИМЕ_ÐÐ_УКÐЗÐТЕЛ [СТÐРÐ_СТОЙÐОСТ]"
#: builtin/update-ref.c:10
msgid "git update-ref [options] <refname> <newval> [<oldval>]"
msgstr ""
+"git update-ref [ОПЦИИ] ИМЕ_ÐÐ_УКÐЗÐТЕЛ ÐОВÐ_СТОЙÐОСТ [СТÐРÐ_СТОЙÐОСТ]"
#: builtin/update-ref.c:11
msgid "git update-ref [options] --stdin [-z]"
-msgstr ""
+msgstr "git update-ref [ОПЦИИ] --stdin [-z]"
-#: builtin/update-ref.c:255
+#: builtin/update-ref.c:256
msgid "delete the reference"
-msgstr ""
+msgstr "изтриване на указателÑ"
-#: builtin/update-ref.c:257
+#: builtin/update-ref.c:258
msgid "update <refname> not the one it points to"
-msgstr ""
+msgstr "обновÑване на ИМЕто_ÐÐ_УКÐЗÐТЕЛÑ, а не това, към което Ñочи"
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:259
msgid "stdin has NUL-terminated arguments"
msgstr ""
+"нÑкои от елементите подадени на ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð²Ñ…Ð¾Ð´ завършват Ñ Ð½ÑƒÐ»ÐµÐ²Ð¸Ñ Ð·Ð½Ð°Ðº "
+"„NUL“"
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:260
msgid "read updates from stdin"
-msgstr ""
+msgstr "изчитане на указателите от ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð²Ñ…Ð¾Ð´"
#: builtin/update-server-info.c:6
msgid "git update-server-info [--force]"
-msgstr ""
+msgstr "git update-server-info [--force]"
#: builtin/update-server-info.c:14
msgid "update the info files from scratch"
-msgstr ""
+msgstr "обновÑване на информационните файлове от нулата"
#: builtin/verify-pack.c:56
msgid "git verify-pack [-v|--verbose] [-s|--stat-only] <pack>..."
-msgstr ""
+msgstr "git verify-pack [-v|--verbose] [-s|--stat-only] ПÐКЕТ…"
#: builtin/verify-pack.c:66
msgid "verbose"
-msgstr ""
+msgstr "извеждане на подробна информациÑ"
#: builtin/verify-pack.c:68
msgid "show statistics only"
-msgstr ""
+msgstr "извеждане Ñамо на ÑтатиÑтиката"
#: builtin/verify-tag.c:17
msgid "git verify-tag [-v|--verbose] <tag>..."
-msgstr ""
+msgstr "git verify-tag [-v|--verbose] ЕТИКЕТ…"
#: builtin/verify-tag.c:73
msgid "print tag contents"
-msgstr ""
+msgstr "извеждане на Ñъдържанието на ЕТИКЕТи"
#: builtin/write-tree.c:13
msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
-msgstr ""
+msgstr "git write-tree [--missing-ok] [--prefix=ПРЕДСТÐВКÐ/]"
#: builtin/write-tree.c:26
msgid "<prefix>/"
-msgstr ""
+msgstr "ПРЕДСТÐВКÐ/"
#: builtin/write-tree.c:27
msgid "write tree object for a subdirectory <prefix>"
-msgstr ""
+msgstr "Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° обект-дърво за поддиректориÑта започваща Ñ Ñ‚Ð°Ð·Ð¸ ПРЕДСТÐВКÐ"
#: builtin/write-tree.c:30
msgid "only useful for debugging"
-msgstr ""
+msgstr "Ñамо за изчиÑтване на грешки"
#: git.c:17
msgid ""
@@ -9421,123 +9856,130 @@ msgid ""
"concept guides. See 'git help <command>' or 'git help <concept>'\n"
"to read about a specific subcommand or concept."
msgstr ""
+"„git help -a“ извежда наличните подкоманди, а „git help -g“ извежда "
+"наличните\n"
+"ръководÑтва. За помощ за Ñпецифична КОМÐÐДРползвайте „git help КОМÐÐДГ, а "
+"за\n"
+"нÑкое определено ПОÐЯТИЕ използвайте „git help ПОÐЯТИЕ“."
-#: parse-options.h:146
-msgid "expiry date"
-msgstr "период на валидноÑÑ‚"
+#: parse-options.h:143
+msgid "expiry-date"
+msgstr "период на валидноÑÑ‚/запазване"
-#: parse-options.h:161
+#: parse-options.h:158
msgid "no-op (backward compatibility)"
msgstr "нулева Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ (за ÑъвмеÑтимоÑÑ‚ Ñ Ð¿Ñ€ÐµÐ´Ð¸ÑˆÐ½Ð¸ верÑии)"
-#: parse-options.h:235
+#: parse-options.h:232
msgid "be more verbose"
msgstr "повече подробноÑти"
-#: parse-options.h:237
+#: parse-options.h:234
msgid "be more quiet"
msgstr "по-малко подробноÑти"
-# FIXME
-#: parse-options.h:243
+# FIXME SHA-1 -> SHA1
+#: parse-options.h:240
msgid "use <n> digits to display SHA-1s"
-msgstr "да Ñе показват такъв <брой> цифри от Ñумите по SHA1"
+msgstr "да Ñе показват такъв БРОЙ цифри от Ñумите по SHA1"
#: common-cmds.h:8
msgid "Add file contents to the index"
-msgstr ""
+msgstr "ДобавÑне на Ñъдържанието на файла към индекÑа"
#: common-cmds.h:9
msgid "Find by binary search the change that introduced a bug"
-msgstr ""
+msgstr "Двоично Ñ‚ÑŠÑ€Ñене на промÑната, коÑто е причинила грешка"
+# FIXME - should be similar to tag
#: common-cmds.h:10
msgid "List, create, or delete branches"
-msgstr ""
+msgstr "Извеждане, Ñъздаване, изтриване на клони"
#: common-cmds.h:11
msgid "Checkout a branch or paths to the working tree"
-msgstr ""
+msgstr "ИзтеглÑне на цÑл клон или файлове/директории в работното дърво"
#: common-cmds.h:12
msgid "Clone a repository into a new directory"
-msgstr ""
+msgstr "Клониране на хранилище в нова директориÑ"
#: common-cmds.h:13
msgid "Record changes to the repository"
-msgstr ""
+msgstr "Подаване на промени в хранилището"
#: common-cmds.h:14
msgid "Show changes between commits, commit and working tree, etc"
-msgstr ""
+msgstr "Извеждане на разликите между подаваниÑта, верÑиите, работното дърво"
#: common-cmds.h:15
msgid "Download objects and refs from another repository"
-msgstr ""
+msgstr "ИзтеглÑне на обекти и указатели от друго хранилище"
#: common-cmds.h:16
msgid "Print lines matching a pattern"
-msgstr ""
+msgstr "Извеждане на редовете напаÑващи на шаблон"
#: common-cmds.h:17
msgid "Create an empty Git repository or reinitialize an existing one"
-msgstr ""
+msgstr "Създаване на празно хранилище на Git или занулÑване на ÑъщеÑтвуващо"
#: common-cmds.h:18
msgid "Show commit logs"
-msgstr ""
+msgstr "Извеждане на журнала Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ð½Ð¸Ñта"
#: common-cmds.h:19
msgid "Join two or more development histories together"
-msgstr ""
+msgstr "Сливане на две или повече поредици/иÑтории от промени"
#: common-cmds.h:20
msgid "Move or rename a file, a directory, or a symlink"
-msgstr ""
+msgstr "ПремеÑтване или преименуване на файл, Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð¸Ð»Ð¸ Ñимволна връзка"
#: common-cmds.h:21
msgid "Fetch from and integrate with another repository or a local branch"
-msgstr ""
+msgstr "ДоÑтавÑне и интегрирането на промените от друго хранилище или клон"
#: common-cmds.h:22
msgid "Update remote refs along with associated objects"
-msgstr ""
+msgstr "ОбновÑване на отдалечените указатели и Ñвързаните Ñ Ñ‚ÑÑ… обекти"
#: common-cmds.h:23
msgid "Forward-port local commits to the updated upstream head"
-msgstr ""
+msgstr "Пребазиране на промени към нова оÑнова"
#: common-cmds.h:24
msgid "Reset current HEAD to the specified state"
-msgstr ""
+msgstr "Привеждане на ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ â€žHEAD“ към зададеното ÑÑŠÑтоÑние"
#: common-cmds.h:25
msgid "Remove files from the working tree and from the index"
-msgstr ""
+msgstr "Изтриване на файлове от работното дърво и индекÑа"
#: common-cmds.h:26
msgid "Show various types of objects"
-msgstr ""
+msgstr "Извеждане на различните видове обекти в Git"
#: common-cmds.h:27
msgid "Show the working tree status"
-msgstr ""
+msgstr "Извеждане на ÑÑŠÑтоÑнието на работното дърво"
+# FIXME - should be similar to branch
#: common-cmds.h:28
msgid "Create, list, delete or verify a tag object signed with GPG"
-msgstr ""
+msgstr "Извеждане, Ñъздаване, изтриване, проверка на етикети подпиÑани Ñ GPG"
-#: git-am.sh:50
+#: git-am.sh:52
msgid "You need to set your committer info first"
msgstr ""
-#: git-am.sh:95
+#: git-am.sh:97
msgid ""
"You seem to have moved HEAD since the last 'am' failure.\n"
"Not rewinding to ORIG_HEAD"
msgstr ""
-#: git-am.sh:105
+#: git-am.sh:107
#, sh-format
msgid ""
"When you have resolved this problem, run \"$cmdline --continue\".\n"
@@ -9545,77 +9987,77 @@ msgid ""
"To restore the original branch and stop patching, run \"$cmdline --abort\"."
msgstr ""
-#: git-am.sh:121
+#: git-am.sh:123
msgid "Cannot fall back to three-way merge."
msgstr ""
-#: git-am.sh:137
+#: git-am.sh:139
msgid "Repository lacks necessary blobs to fall back on 3-way merge."
msgstr ""
-#: git-am.sh:139
+#: git-am.sh:141
msgid "Using index info to reconstruct a base tree..."
msgstr ""
-#: git-am.sh:154
+#: git-am.sh:156
msgid ""
"Did you hand edit your patch?\n"
"It does not apply to blobs recorded in its index."
msgstr ""
-#: git-am.sh:163
+#: git-am.sh:165
msgid "Falling back to patching base and 3-way merge..."
msgstr ""
-#: git-am.sh:179
+#: git-am.sh:181
msgid "Failed to merge in the changes."
msgstr ""
-#: git-am.sh:274
+#: git-am.sh:276
msgid "Only one StGIT patch series can be applied at once"
msgstr ""
-#: git-am.sh:361
+#: git-am.sh:363
#, sh-format
msgid "Patch format $patch_format is not supported."
msgstr ""
-#: git-am.sh:363
+#: git-am.sh:365
msgid "Patch format detection failed."
msgstr ""
-#: git-am.sh:389
+#: git-am.sh:392
msgid ""
"The -b/--binary option has been a no-op for long time, and\n"
"it will be removed. Please do not use it anymore."
msgstr ""
-#: git-am.sh:479
+#: git-am.sh:486
#, sh-format
msgid "previous rebase directory $dotest still exists but mbox given."
msgstr ""
-#: git-am.sh:484
+#: git-am.sh:491
msgid "Please make up your mind. --skip or --abort?"
msgstr ""
-#: git-am.sh:520
+#: git-am.sh:527
#, sh-format
msgid ""
"Stray $dotest directory found.\n"
"Use \"git am --abort\" to remove it."
msgstr ""
-#: git-am.sh:528
+#: git-am.sh:535
msgid "Resolve operation not in progress, we are not resuming."
msgstr ""
-#: git-am.sh:594
+#: git-am.sh:601
#, sh-format
msgid "Dirty index: cannot apply patches (dirty: $files)"
msgstr ""
-#: git-am.sh:698
+#: git-am.sh:705
#, sh-format
msgid ""
"Patch is empty. Was it split wrong?\n"
@@ -9623,60 +10065,60 @@ msgid ""
"To restore the original branch and stop patching run \"$cmdline --abort\"."
msgstr ""
-#: git-am.sh:725
+#: git-am.sh:732
msgid "Patch does not have a valid e-mail address."
msgstr ""
-#: git-am.sh:772
+#: git-am.sh:779
msgid "cannot be interactive without stdin connected to a terminal."
msgstr ""
-#: git-am.sh:776
+#: git-am.sh:783
msgid "Commit Body is:"
msgstr ""
#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
#. in your translation. The program will only accept English
#. input at this point.
-#: git-am.sh:783
+#: git-am.sh:790
msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
msgstr ""
-#: git-am.sh:819
+#: git-am.sh:826
#, sh-format
msgid "Applying: $FIRSTLINE"
msgstr ""
-#: git-am.sh:840
+#: git-am.sh:847
msgid ""
"No changes - did you forget to use 'git add'?\n"
"If there is nothing left to stage, chances are that something else\n"
"already introduced the same changes; you might want to skip this patch."
msgstr ""
-#: git-am.sh:848
+#: git-am.sh:855
msgid ""
"You still have unmerged paths in your index\n"
"did you forget to use 'git add'?"
msgstr ""
-#: git-am.sh:864
+#: git-am.sh:871
msgid "No changes -- Patch already applied."
msgstr ""
-#: git-am.sh:874
+#: git-am.sh:881
#, sh-format
msgid "Patch failed at $msgnum $FIRSTLINE"
msgstr ""
-#: git-am.sh:877
+#: git-am.sh:884
#, sh-format
msgid ""
"The copy of the patch that failed is found in:\n"
" $dotest/patch"
msgstr ""
-#: git-am.sh:895
+#: git-am.sh:902
msgid "applying to an empty history"
msgstr ""
@@ -9742,8 +10184,6 @@ msgstr ""
msgid "'git bisect bad' can take only one argument."
msgstr ""
-#. have bad but not good. we could bisect although
-#. this is less optimum.
#: git-bisect.sh:273
msgid "Warning: bisecting only with a bad commit."
msgstr ""
@@ -9830,96 +10270,115 @@ msgid ""
"Please, fix them up in the work tree, and then use 'git add/rm <file>'\n"
"as appropriate to mark resolution, or use 'git commit -a'."
msgstr ""
+"Ðевъзможно е да издърпвате в момента, защото нÑкои файлове не Ñа Ñлети. "
+"ТрÑбва\n"
+"да ги прегледате, коригирате, ако е необходимо и да ги добавите или извадите "
+"от\n"
+"индекÑа Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ‚Ð° „git add/rm ФÐЙЛ“. Ðко вÑичко е наред, можете да "
+"ползвате и\n"
+"командата „git commit -a“."
#: git-pull.sh:25
msgid "Pull is not possible because you have unmerged files."
msgstr ""
+"Ðевъзможно е да издърпвате в момента, защото нÑкои файлове не Ñа Ñлети."
-#: git-pull.sh:223
+#: git-pull.sh:247
msgid "updating an unborn branch with changes added to the index"
-msgstr ""
+msgstr "обновÑване на още неÑъздаден клон Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ð¸Ñ‚Ðµ от индекÑа"
-#. The fetch involved updating the current branch.
-#. The working tree and the index file is still based on the
-#. $orig_head commit, but we are merging into $curr_head.
-#. First update the working tree to match $curr_head.
-#: git-pull.sh:247
+#: git-pull.sh:271
#, sh-format
msgid ""
"Warning: fetch updated the current branch head.\n"
"Warning: fast-forwarding your working tree from\n"
"Warning: commit $orig_head."
msgstr ""
+"ПРЕДУПРЕЖДЕÐИЕ: доÑтавÑнето обнови върха на Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ ÐºÐ»Ð¾Ð½.Работното ви копие\n"
+"ПРЕДУПРЕЖДЕÐИЕ: бе тривиално ÑлÑто от подаване „$orig_head“."
-#: git-pull.sh:272
+#: git-pull.sh:296
msgid "Cannot merge multiple branches into empty head"
-msgstr ""
+msgstr "Ðе може да Ñливате множеÑтво клони в празен върхов указател"
-#: git-pull.sh:276
+#: git-pull.sh:300
msgid "Cannot rebase onto multiple branches"
-msgstr ""
+msgstr "Ðе може да пребазирате върху повече от един клон"
-#: git-rebase.sh:55
+#: git-rebase.sh:57
msgid ""
"When you have resolved this problem, run \"git rebase --continue\".\n"
"If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
"To check out the original branch and stop rebasing, run \"git rebase --abort"
"\"."
msgstr ""
+"След коригирането на този проблем изпълнете „git rebase --continue“.\n"
+"Ðко предпочитате да преÑкочите тази кръпка, изпълнете „git rebase --skip“.\n"
+"За да откажете пребазирането и да Ñе върнете към първоначалното ÑÑŠÑтоÑние,\n"
+"изпълнете „git rebase --abort“."
-#: git-rebase.sh:158
+#: git-rebase.sh:164
msgid "Applied autostash."
-msgstr ""
+msgstr "Ðвтоматично Ñкатаното е приложено."
-#: git-rebase.sh:161
+#: git-rebase.sh:167
#, sh-format
msgid "Cannot store $stash_sha1"
-msgstr ""
+msgstr "„$stash_sha1“ не може да бъде запазен"
-#: git-rebase.sh:162
+#: git-rebase.sh:168
msgid ""
"Applying autostash resulted in conflicts.\n"
"Your changes are safe in the stash.\n"
"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
msgstr ""
+"Прилагането на автоматично Ñкатаното доведе до конфликти. Промените ви Ñа\n"
+"надеждно Ñкатани. Можете да пробвате да ги приложите чрез „git stash pop“\n"
+"или да ги изхвърлите чрез „git stash drop“, когато поиÑкате.\n"
-#: git-rebase.sh:201
+#: git-rebase.sh:207
msgid "The pre-rebase hook refused to rebase."
-msgstr ""
+msgstr "Куката за изпълнение преди пребазиране отхвърли пребазирането."
-#: git-rebase.sh:206
+#: git-rebase.sh:212
msgid "It looks like git-am is in progress. Cannot rebase."
msgstr ""
+"Изглежда, че Ñега Ñе прилагат кръпки чрез командата „git-am“. Ðе може да "
+"пребазирате в момента."
-#: git-rebase.sh:346
+#: git-rebase.sh:350
msgid "The --exec option must be used with the --interactive option"
-msgstr ""
+msgstr "ОпциÑта „--exec“ задължително изиÑква опциÑта „--interactive“"
-#: git-rebase.sh:351
+# FIXME message
+#: git-rebase.sh:355
msgid "No rebase in progress?"
-msgstr ""
+msgstr "Изглежда в момента не тече пребазиране"
-#: git-rebase.sh:362
+#: git-rebase.sh:366
msgid "The --edit-todo action can only be used during interactive rebase."
msgstr ""
+"ОпциÑта „--edit-todo“ е доÑтъпна Ñамо по време на интерактивно пребазиране."
-#: git-rebase.sh:369
+#: git-rebase.sh:373
msgid "Cannot read HEAD"
-msgstr ""
+msgstr "УказателÑÑ‚ „HEAD“ не може да бъде прочетен"
-#: git-rebase.sh:372
+#: git-rebase.sh:376
msgid ""
"You must edit all merge conflicts and then\n"
"mark them as resolved using git add"
msgstr ""
+"ТрÑбва да редактирате вÑички конфликти при Ñливането. След това\n"
+"отбележете коригирането им чрез командата „git add“"
-#: git-rebase.sh:390
+#: git-rebase.sh:394
#, sh-format
msgid "Could not move back to $head_name"
-msgstr ""
+msgstr "Връщането към „$head_name“ е невъзможно"
-# FIXME
-#: git-rebase.sh:409
+# FIXME tabulators, I, double spaces
+#: git-rebase.sh:413
#, sh-format
msgid ""
"It seems that there is already a $state_dir_base directory, and\n"
@@ -9931,102 +10390,117 @@ msgid ""
"and run me again. I am stopping in case you still have something\n"
"valuable there."
msgstr ""
+"Вече ÑъщеÑтвува Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ â€ž$state_dir_base directory“. Възможно ли е да "
+"Ñте\n"
+"в Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð° друго пребазиране? Ðко това е така, изпълнете:\n"
+" $cmd_live_rebase\n"
+"Ðко не Ñте в Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð° друго пребазиране, изпълнете:\n"
+" $cmd_clear_stale_rebase\n"
+"и отново започнете пребазирането. Текущото пребазиране Ñе преуÑтановÑва, за\n"
+"да не загубите Ñлучайно промени."
-#: git-rebase.sh:456
+#: git-rebase.sh:464
#, sh-format
msgid "invalid upstream $upstream_name"
-msgstr ""
+msgstr "неправилна оÑнова за Ñравнение „$upstream_name“"
-#: git-rebase.sh:480
+#: git-rebase.sh:488
#, sh-format
msgid "$onto_name: there are more than one merge bases"
msgstr ""
+"указателÑÑ‚ „$onto_name“ може да Ñочи към повече от една оÑнова за "
+"пребазирането"
-#: git-rebase.sh:483 git-rebase.sh:487
+#: git-rebase.sh:491 git-rebase.sh:495
#, sh-format
msgid "$onto_name: there is no merge base"
-msgstr ""
+msgstr "указателÑÑ‚ „$onto_name“ не Ñочи към никаква оÑнова за пребазирането"
-#: git-rebase.sh:492
+#: git-rebase.sh:500
#, sh-format
msgid "Does not point to a valid commit: $onto_name"
-msgstr ""
+msgstr "УказателÑÑ‚ „$onto_name“ не Ñочи към подаване"
-#: git-rebase.sh:515
+#: git-rebase.sh:523
#, sh-format
msgid "fatal: no such branch: $branch_name"
-msgstr ""
+msgstr "фатална грешка: не ÑъщеÑтвува клон „$branch_name“"
-#: git-rebase.sh:548
+#: git-rebase.sh:556
msgid "Cannot autostash"
-msgstr ""
+msgstr "Ðе може да Ñе Ñкатае автоматично"
-#: git-rebase.sh:553
+#: git-rebase.sh:561
#, sh-format
msgid "Created autostash: $stash_abbrev"
-msgstr ""
+msgstr "Ðвтоматично Ñкатано: „$stash_abbrev“"
-#: git-rebase.sh:557
+#: git-rebase.sh:565
msgid "Please commit or stash them."
-msgstr ""
+msgstr "Промените Ñ‚Ñ€Ñбва или да Ñе подадат, или да Ñе ÑкатаÑÑ‚."
-#: git-rebase.sh:577
+#: git-rebase.sh:585
#, sh-format
msgid "Current branch $branch_name is up to date."
-msgstr ""
+msgstr "ТекущиÑÑ‚ клон „$branch_name“ е напълно актуален."
-#: git-rebase.sh:581
+#: git-rebase.sh:589
#, sh-format
msgid "Current branch $branch_name is up to date, rebase forced."
msgstr ""
+"ТекущиÑÑ‚ клон „$branch_name“ е напълно актуален. Пребазирането е "
+"принудително."
-#: git-rebase.sh:592
+#: git-rebase.sh:600
#, sh-format
msgid "Changes from $mb to $onto:"
-msgstr ""
+msgstr "Промените от „$mb“ към „$onto“:"
-#. Detach HEAD and reset the tree
-#: git-rebase.sh:601
+#: git-rebase.sh:609
msgid "First, rewinding head to replay your work on top of it..."
msgstr ""
+"Първо, указателÑÑ‚ „HEAD“ започва да Ñочи към базата, върху коÑто пребазирате…"
-#: git-rebase.sh:611
+#: git-rebase.sh:619
#, sh-format
msgid "Fast-forwarded $branch_name to $onto_name."
-msgstr ""
+msgstr "Тривиално Ñливане на „$branch_name“ върху „$onto_name“."
+# FIXME - should 'clear' not take parameters in principle?
#: git-stash.sh:51
msgid "git stash clear with parameters is unimplemented"
-msgstr ""
+msgstr "Командата „git stash clear“ не поддържа аргументи"
#: git-stash.sh:74
msgid "You do not have the initial commit yet"
-msgstr ""
+msgstr "Ð’Ñе още липÑва първоначално подаване"
#: git-stash.sh:89
msgid "Cannot save the current index state"
-msgstr ""
+msgstr "СъÑтоÑнието на Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑ Ð½Ðµ може да бъде запазено"
#: git-stash.sh:123 git-stash.sh:136
msgid "Cannot save the current worktree state"
-msgstr ""
+msgstr "СъÑтоÑнието на работното дърво не може да бъде запазено"
#: git-stash.sh:140
msgid "No changes selected"
-msgstr ""
+msgstr "Ðе Ñа избрани никакви промени"
+# FIXME can't happen??? може, може
#: git-stash.sh:143
msgid "Cannot remove temporary index (can't happen)"
-msgstr ""
+msgstr "ВременниÑÑ‚ Ð¸Ð½Ð´ÐµÐºÑ Ð½Ðµ може да бъде изтрит"
#: git-stash.sh:156
msgid "Cannot record working tree state"
-msgstr ""
+msgstr "СъÑтоÑнието на работното дърво не може да бъде запазено"
#: git-stash.sh:190
#, sh-format
msgid "Cannot update $ref_stash with $w_commit"
msgstr ""
+"УказателÑÑ‚ „$ref_stash“ не може да бъде обновен да Ñочи към „$w_commit“"
#. TRANSLATORS: $option is an invalid option, like
#. `--blah-blah'. The 7 spaces at the beginning of the
@@ -10044,88 +10518,92 @@ msgid ""
"error: unknown option for 'stash save': $option\n"
" To provide a message, use git stash save -- '$option'"
msgstr ""
+"грешка: командата „git stash save“ не поддържа Ð¾Ð¿Ñ†Ð¸Ñ â€ž$option“\n"
+" За да зададете Ñъобщение, изпълнете „git stash save -- '$option'“"
#: git-stash.sh:258
msgid "No local changes to save"
-msgstr ""
+msgstr "ÐÑма никакви локални промени за Ñкатаване"
#: git-stash.sh:262
msgid "Cannot initialize stash"
-msgstr ""
+msgstr "Скатаването не може да Ñтартира"
#: git-stash.sh:266
msgid "Cannot save the current status"
-msgstr ""
+msgstr "Текущото ÑÑŠÑтоÑние не може да бъде запазено"
#: git-stash.sh:284
msgid "Cannot remove worktree changes"
-msgstr ""
+msgstr "Промените в работното дърво не могат да бъдат занулени"
#: git-stash.sh:383
msgid "No stash found."
-msgstr ""
+msgstr "Ðе е открито нищо Ñкатано."
#: git-stash.sh:390
#, sh-format
msgid "Too many revisions specified: $REV"
-msgstr ""
+msgstr "Указани Ñа прекалено много верÑии: „$REV“"
#: git-stash.sh:396
#, sh-format
msgid "$reference is not valid reference"
-msgstr ""
+msgstr "УказателÑÑ‚ „$reference“ е грешен"
#: git-stash.sh:424
#, sh-format
msgid "'$args' is not a stash-like commit"
-msgstr ""
+msgstr "„$args“ не е подаване приличащо на нещо Ñкатано"
#: git-stash.sh:435
#, sh-format
msgid "'$args' is not a stash reference"
-msgstr ""
+msgstr "„$args“ не е указател към нещо Ñкатано"
#: git-stash.sh:443
msgid "unable to refresh index"
-msgstr ""
+msgstr "индекÑÑŠÑ‚ не може да бъде обновен"
#: git-stash.sh:447
msgid "Cannot apply a stash in the middle of a merge"
-msgstr ""
+msgstr "По време на Ñливане не може да приложите нещо Ñкатано"
#: git-stash.sh:455
msgid "Conflicts in index. Try without --index."
msgstr ""
+"Ð’ индекÑа има конфликти. Пробвайте да изпълните командата без опциÑта „--"
+"index“."
#: git-stash.sh:457
msgid "Could not save index tree"
-msgstr ""
+msgstr "Дървото Ñочено от индекÑа не може да бъде запазено"
#: git-stash.sh:491
msgid "Cannot unstage modified files"
-msgstr ""
+msgstr "Променените файлове не могат да бъдат извадени от индекÑа"
#: git-stash.sh:506
msgid "Index was not unstashed."
-msgstr ""
+msgstr "ИндекÑÑŠÑ‚ не е Ñкатан."
-#: git-stash.sh:523
+#: git-stash.sh:529
#, sh-format
msgid "Dropped ${REV} ($s)"
-msgstr ""
+msgstr "Изтрито е Ñкатаното „${REV}“ ($s)"
-#: git-stash.sh:524
+#: git-stash.sh:530
#, sh-format
msgid "${REV}: Could not drop stash entry"
-msgstr ""
+msgstr "Скатаното „${REV}“ не може да бъде изтрито"
-#: git-stash.sh:531
+#: git-stash.sh:537
msgid "No branch name specified"
-msgstr ""
+msgstr "Ðе е указано име на клон"
-#: git-stash.sh:603
+#: git-stash.sh:609
msgid "(To restore them type \"git stash apply\")"
-msgstr ""
+msgstr "(За да ги възÑтановите, изпълнете командата „git stash apply“)"
#: git-submodule.sh:95
#, sh-format
@@ -10137,31 +10615,31 @@ msgstr ""
msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
msgstr ""
-#: git-submodule.sh:281
+#: git-submodule.sh:287
#, sh-format
msgid "Clone of '$url' into submodule path '$sm_path' failed"
msgstr ""
-#: git-submodule.sh:293
+#: git-submodule.sh:299
#, sh-format
msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
msgstr ""
-#: git-submodule.sh:403
+#: git-submodule.sh:409
msgid "Relative path can only be used from the toplevel of the working tree"
msgstr ""
-#: git-submodule.sh:413
+#: git-submodule.sh:419
#, sh-format
msgid "repo URL: '$repo' must be absolute or begin with ./|../"
msgstr ""
-#: git-submodule.sh:430
+#: git-submodule.sh:436
#, sh-format
msgid "'$sm_path' already exists in the index"
msgstr ""
-#: git-submodule.sh:434
+#: git-submodule.sh:440
#, sh-format
msgid ""
"The following path is ignored by one of your .gitignore files:\n"
@@ -10169,236 +10647,235 @@ msgid ""
"Use -f if you really want to add it."
msgstr ""
-#: git-submodule.sh:452
+#: git-submodule.sh:458
#, sh-format
msgid "Adding existing repo at '$sm_path' to the index"
msgstr ""
-#: git-submodule.sh:454
+#: git-submodule.sh:460
#, sh-format
msgid "'$sm_path' already exists and is not a valid git repo"
msgstr ""
-#: git-submodule.sh:462
+#: git-submodule.sh:468
#, sh-format
msgid "A git directory for '$sm_name' is found locally with remote(s):"
msgstr ""
-#: git-submodule.sh:464
+#: git-submodule.sh:470
#, sh-format
msgid ""
"If you want to reuse this local git directory instead of cloning again from"
msgstr ""
-#: git-submodule.sh:466
+#: git-submodule.sh:472
#, sh-format
msgid ""
"use the '--force' option. If the local git directory is not the correct repo"
msgstr ""
-#: git-submodule.sh:467
+#: git-submodule.sh:473
#, sh-format
msgid ""
"or you are unsure what this means choose another name with the '--name' "
"option."
msgstr ""
-#: git-submodule.sh:469
+#: git-submodule.sh:475
#, sh-format
msgid "Reactivating local git directory for submodule '$sm_name'."
msgstr ""
-#: git-submodule.sh:481
+#: git-submodule.sh:487
#, sh-format
msgid "Unable to checkout submodule '$sm_path'"
msgstr ""
-#: git-submodule.sh:486
+#: git-submodule.sh:492
#, sh-format
msgid "Failed to add submodule '$sm_path'"
msgstr ""
-#: git-submodule.sh:495
+#: git-submodule.sh:501
#, sh-format
msgid "Failed to register submodule '$sm_path'"
msgstr ""
-#: git-submodule.sh:539
+#: git-submodule.sh:545
#, sh-format
msgid "Entering '$prefix$displaypath'"
msgstr ""
-#: git-submodule.sh:559
+#: git-submodule.sh:565
#, sh-format
msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
msgstr ""
-#: git-submodule.sh:605
+#: git-submodule.sh:611
#, sh-format
msgid "No url found for submodule path '$displaypath' in .gitmodules"
msgstr ""
-#: git-submodule.sh:614
+#: git-submodule.sh:620
#, sh-format
msgid "Failed to register url for submodule path '$displaypath'"
msgstr ""
-#: git-submodule.sh:616
+#: git-submodule.sh:622
#, sh-format
msgid "Submodule '$name' ($url) registered for path '$displaypath'"
msgstr ""
-#: git-submodule.sh:633
+#: git-submodule.sh:639
#, sh-format
msgid "Failed to register update mode for submodule path '$displaypath'"
msgstr ""
-#: git-submodule.sh:671
+#: git-submodule.sh:677
#, sh-format
msgid "Use '.' if you really want to deinitialize all submodules"
msgstr ""
-#: git-submodule.sh:688
+#: git-submodule.sh:694
#, sh-format
msgid "Submodule work tree '$displaypath' contains a .git directory"
msgstr ""
-#: git-submodule.sh:689
+#: git-submodule.sh:695
#, sh-format
msgid ""
"(use 'rm -rf' if you really want to remove it including all of its history)"
msgstr ""
-#: git-submodule.sh:695
+#: git-submodule.sh:701
#, sh-format
msgid ""
"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
"discard them"
msgstr ""
-#: git-submodule.sh:698
+#: git-submodule.sh:704
#, sh-format
msgid "Cleared directory '$displaypath'"
msgstr ""
-#: git-submodule.sh:699
+#: git-submodule.sh:705
#, sh-format
msgid "Could not remove submodule work tree '$displaypath'"
msgstr ""
-#: git-submodule.sh:702
+#: git-submodule.sh:708
#, sh-format
msgid "Could not create empty submodule directory '$displaypath'"
msgstr ""
-#: git-submodule.sh:711
+#: git-submodule.sh:717
#, sh-format
msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
msgstr ""
-#: git-submodule.sh:834
+#: git-submodule.sh:833
#, sh-format
msgid ""
"Submodule path '$displaypath' not initialized\n"
"Maybe you want to use 'update --init'?"
msgstr ""
-#: git-submodule.sh:847
+#: git-submodule.sh:846
#, sh-format
msgid "Unable to find current revision in submodule path '$displaypath'"
msgstr ""
-#: git-submodule.sh:856
+#: git-submodule.sh:855
#, sh-format
msgid "Unable to fetch in submodule path '$sm_path'"
msgstr ""
-#: git-submodule.sh:880
+#: git-submodule.sh:879
#, sh-format
msgid "Unable to fetch in submodule path '$displaypath'"
msgstr ""
+#: git-submodule.sh:893
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr ""
+
#: git-submodule.sh:894
#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr ""
+
+#: git-submodule.sh:898
+#, sh-format
msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
msgstr ""
-#: git-submodule.sh:895
+#: git-submodule.sh:899
#, sh-format
msgid "Submodule path '$displaypath': rebased into '$sha1'"
msgstr ""
-#: git-submodule.sh:900
+#: git-submodule.sh:904
#, sh-format
msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
msgstr ""
-#: git-submodule.sh:901
+#: git-submodule.sh:905
#, sh-format
msgid "Submodule path '$displaypath': merged in '$sha1'"
msgstr ""
-#: git-submodule.sh:906
+#: git-submodule.sh:910
#, sh-format
msgid ""
"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
msgstr ""
-#: git-submodule.sh:907
+#: git-submodule.sh:911
#, sh-format
msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
msgstr ""
-#: git-submodule.sh:912
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
-msgstr ""
-
-#: git-submodule.sh:913
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr ""
-
-#: git-submodule.sh:940
+#: git-submodule.sh:941
#, sh-format
msgid "Failed to recurse into submodule path '$displaypath'"
msgstr ""
-#: git-submodule.sh:1048
+#: git-submodule.sh:1049
msgid "The --cached option cannot be used with the --files option"
msgstr ""
-#. unexpected type
-#: git-submodule.sh:1096
+#: git-submodule.sh:1097
#, sh-format
msgid "unexpected mode $mod_dst"
msgstr ""
-#: git-submodule.sh:1116
+#: git-submodule.sh:1117
#, sh-format
msgid " Warn: $display_name doesn't contain commit $sha1_src"
msgstr ""
-#: git-submodule.sh:1119
+#: git-submodule.sh:1120
#, sh-format
msgid " Warn: $display_name doesn't contain commit $sha1_dst"
msgstr ""
-#: git-submodule.sh:1122
+#: git-submodule.sh:1123
#, sh-format
msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
msgstr ""
-#: git-submodule.sh:1147
+#: git-submodule.sh:1148
msgid "blob"
msgstr ""
-#: git-submodule.sh:1261
+#: git-submodule.sh:1262
#, sh-format
msgid "Failed to recurse into submodule path '$sm_path'"
msgstr ""
-#: git-submodule.sh:1325
+#: git-submodule.sh:1326
#, sh-format
msgid "Synchronizing submodule url for '$displaypath'"
msgstr ""
diff --git a/po/de.po b/po/de.po
index b777ef4803..8f126d78da 100644
--- a/po/de.po
+++ b/po/de.po
@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: git 1.9\n"
+"Project-Id-Version: git 2.0.0\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-02-01 08:06+0800\n"
+"POT-Creation-Date: 2014-04-17 12:13+0800\n"
"PO-Revision-Date: 2013-07-28 18:42+0200\n"
"Last-Translator: Ralf Thielow <ralf.thielow@gmail.com>\n"
"Language-Team: German <>\n"
@@ -17,16 +17,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
-#: advice.c:57
+#: advice.c:55
#, c-format
msgid "hint: %.*s\n"
msgstr "Hinweis: %.*s\n"
-#.
-#. * Message used both when 'git commit' fails and when
-#. * other commands doing a merge do.
-#.
-#: advice.c:87
+#: advice.c:85
msgid ""
"Fix them up in the work tree,\n"
"and then use 'git add/rm <file>' as\n"
@@ -57,76 +53,76 @@ msgstr ""
msgid "git archive --remote <repo> [--exec <cmd>] --list"
msgstr "git archive --remote <Repository> [--exec <Programm>] --list"
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
#, c-format
msgid "pathspec '%s' did not match any files"
msgstr "Pfadspezifikation '%s' stimmt mit keinen Dateien überein"
-#: archive.c:327
+#: archive.c:328
msgid "fmt"
msgstr "Format"
-#: archive.c:327
+#: archive.c:328
msgid "archive format"
msgstr "Archivformat"
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
msgid "prefix"
msgstr "Präfix"
-#: archive.c:329
+#: archive.c:330
msgid "prepend prefix to each pathname in the archive"
msgstr "stellt einen Präfix vor jeden Pfadnamen in dem Archiv"
-#: 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
+#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2258
+#: builtin/blame.c:2259 builtin/config.c:57 builtin/fast-export.c:680
+#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
+#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
msgid "file"
msgstr "Datei"
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 builtin/archive.c:89
msgid "write the archive to this file"
msgstr "schreibt das Archiv in diese Datei"
-#: archive.c:333
+#: archive.c:334
msgid "read .gitattributes in working directory"
msgstr "liest .gitattributes aus dem Arbeitsverzeichnis"
-#: archive.c:334
+#: archive.c:335
msgid "report archived files on stderr"
msgstr "gibt archivierte Dateien in der Standard-Fehlerausgabe aus"
-#: archive.c:335
+#: archive.c:336
msgid "store only"
msgstr "nur speichern"
-#: archive.c:336
+#: archive.c:337
msgid "compress faster"
msgstr "schneller komprimieren"
-#: archive.c:344
+#: archive.c:345
msgid "compress better"
msgstr "besser komprimieren"
-#: archive.c:347
+#: archive.c:348
msgid "list supported archive formats"
msgstr "listet unterstützte Archivformate auf"
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
msgid "repo"
msgstr "Repository"
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 builtin/archive.c:91
msgid "retrieve the archive from remote repository <repo>"
msgstr "ruft das Archiv von Remote-Repository <Repository> ab"
-#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
msgid "command"
msgstr "Programm"
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
msgid "path to the remote git-upload-archive command"
msgstr "Pfad zum externen \"git-upload-archive\"-Programm"
@@ -143,88 +139,82 @@ msgstr ""
msgid "Not setting branch %s as its own upstream."
msgstr "Branch %s kann nicht sein eigener Upstream-Branch sein."
-#: branch.c:82
+#: branch.c:83
#, c-format
msgid "Branch %s set up to track remote branch %s from %s by rebasing."
msgstr ""
"Branch %s konfiguriert zum Folgen von Remote-Branch %s von %s durch Rebase."
-#: branch.c:83
+#: branch.c:84
#, c-format
msgid "Branch %s set up to track remote branch %s from %s."
msgstr "Branch %s konfiguriert zum Folgen von Remote-Branch %s von %s."
-#: branch.c:87
+#: branch.c:88
#, c-format
msgid "Branch %s set up to track local branch %s by rebasing."
msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s durch Rebase."
-#: branch.c:88
+#: branch.c:89
#, c-format
msgid "Branch %s set up to track local branch %s."
msgstr "Branch %s konfiguriert zum Folgen von lokalem Branch %s."
-#: branch.c:92
+#: branch.c:94
#, c-format
msgid "Branch %s set up to track remote ref %s by rebasing."
msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s durch Rebase."
-#: branch.c:93
+#: branch.c:95
#, c-format
msgid "Branch %s set up to track remote ref %s."
msgstr "Branch %s konfiguriert zum Folgen von Remote-Referenz %s."
-#: branch.c:97
+#: branch.c:99
#, c-format
msgid "Branch %s set up to track local ref %s by rebasing."
msgstr ""
"Branch %s konfiguriert zum Folgen von lokaler Referenz %s durch Rebase."
-#: branch.c:98
+#: branch.c:100
#, c-format
msgid "Branch %s set up to track local ref %s."
msgstr "Branch %s konfiguriert zum Folgen von lokaler Referenz %s."
-#: branch.c:118
-#, c-format
-msgid "Tracking not set up: name too long: %s"
-msgstr ""
-"Konfiguration zum Folgen von Branch nicht eingerichtet. Name zu lang: %s"
-
-#: branch.c:137
+#: branch.c:133
#, c-format
msgid "Not tracking: ambiguous information for ref %s"
msgstr ""
"Konfiguration zum Folgen von Branch nicht eingerichtet. Referenz %s ist "
"mehrdeutig."
-#: branch.c:182
+#: branch.c:178
#, c-format
msgid "'%s' is not a valid branch name."
msgstr "'%s' ist kein gültiger Branchname."
-#: branch.c:187
+#: branch.c:183
#, c-format
msgid "A branch named '%s' already exists."
msgstr "Branch '%s' existiert bereits."
-#: branch.c:195
+#: branch.c:191
msgid "Cannot force update the current branch."
msgstr "Kann Aktualisierung des aktuellen Branches nicht erzwingen."
-#: branch.c:215
+#: branch.c:211
#, c-format
msgid "Cannot setup tracking information; starting point '%s' is not a branch."
msgstr ""
"Kann Tracking-Informationen nicht einrichten; Startpunkt '%s' ist kein "
"Branch."
-#: branch.c:217
+#: branch.c:213
#, c-format
msgid "the requested upstream branch '%s' does not exist"
msgstr "der angeforderte Upstream-Branch '%s' existiert nicht"
-#: branch.c:219
+#: branch.c:215
msgid ""
"\n"
"If you are planning on basing your work on an upstream\n"
@@ -245,113 +235,113 @@ msgstr ""
"\"git push -u\" verwenden, um den Upstream-Branch beim \"push\"\n"
"zu konfigurieren."
-#: branch.c:264
+#: branch.c:260
#, c-format
msgid "Not a valid object name: '%s'."
msgstr "Ungültiger Objekt-Name: '%s'"
-#: branch.c:284
+#: branch.c:280
#, c-format
msgid "Ambiguous object name: '%s'."
msgstr "mehrdeutiger Objekt-Name: '%s'"
-#: branch.c:289
+#: branch.c:285
#, c-format
msgid "Not a valid branch point: '%s'."
msgstr "Ungültiger Branchpunkt: '%s'"
-#: branch.c:295
+#: branch.c:291
msgid "Failed to lock ref for update"
msgstr "Fehler beim Sperren der Referenz zur Aktualisierung."
-#: branch.c:313
+#: branch.c:309
msgid "Failed to write ref"
msgstr "Fehler beim Schreiben der Referenz."
-#: bundle.c:37
+#: bundle.c:33
#, c-format
msgid "'%s' does not look like a v2 bundle file"
msgstr "'%s' sieht nicht wie eine v2 Paketdatei aus"
-#: bundle.c:64
+#: bundle.c:60
#, c-format
msgid "unrecognized header: %s%s (%d)"
msgstr "nicht erkannter Kopfbereich: %s%s (%d)"
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
#, c-format
msgid "could not open '%s'"
msgstr "Konnte '%s' nicht öffnen"
-#: bundle.c:141
+#: bundle.c:138
msgid "Repository lacks these prerequisite commits:"
msgstr "Dem Repository fehlen folgende vorausgesetzte Commits:"
-#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: bundle.c:162 sequencer.c:669 sequencer.c:1123 builtin/log.c:332
#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357
#: builtin/shortlog.c:158
msgid "revision walk setup failed"
msgstr "Einrichtung des Revisionsgangs fehlgeschlagen"
-#: bundle.c:187
+#: bundle.c:184
#, c-format
msgid "The bundle contains this ref:"
msgid_plural "The bundle contains these %d refs:"
msgstr[0] "Das Paket enthält diese Referenz:"
msgstr[1] "Das Paket enthält diese %d Referenzen:"
-#: bundle.c:194
+#: bundle.c:191
msgid "The bundle records a complete history."
msgstr "Das Paket speichert eine komplette Historie."
-#: bundle.c:196
+#: bundle.c:193
#, c-format
msgid "The bundle requires this ref:"
msgid_plural "The bundle requires these %d refs:"
msgstr[0] "Das Paket benötigt diese Referenz:"
msgstr[1] "Das Paket benötigt diese %d Referenzen:"
-#: bundle.c:296
+#: bundle.c:293
msgid "rev-list died"
msgstr "\"rev-list\" abgebrochen"
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
#, c-format
msgid "unrecognized argument: %s"
msgstr "nicht erkanntes Argument: %s"
-#: bundle.c:337
+#: bundle.c:334
#, c-format
msgid "ref '%s' is excluded by the rev-list options"
msgstr "Referenz '%s' wird durch \"rev-list\" Optionen ausgeschlossen"
-#: bundle.c:382
+#: bundle.c:379
msgid "Refusing to create empty bundle."
msgstr "Erstellung eines leeren Pakets zurückgewiesen."
-#: bundle.c:398
+#: bundle.c:395
msgid "Could not spawn pack-objects"
msgstr "Konnte Paketobjekte nicht erstellen"
-#: bundle.c:416
+#: bundle.c:413
msgid "pack-objects died"
msgstr "Erstellung der Paketobjekte abgebrochen"
-#: bundle.c:419
+#: bundle.c:416
#, c-format
msgid "cannot create '%s'"
msgstr "kann '%s' nicht erstellen"
-#: bundle.c:441
+#: bundle.c:438
msgid "index-pack died"
msgstr "Erstellung der Paketindexdatei abgebrochen"
-#: commit.c:53
+#: commit.c:54
#, c-format
msgid "could not parse %s"
msgstr "konnte %s nicht parsen"
-#: commit.c:55
+#: commit.c:56
#, c-format
msgid "%s %s is not a commit!"
msgstr "%s %s ist kein Commit!"
@@ -427,6 +417,7 @@ msgid_plural "%lu years"
msgstr[0] "vor %lu Jahr"
msgstr[1] "vor %lu Jahren"
+#. TRANSLATORS: "%s" is "<n> years"
#: date.c:149
#, c-format
msgid "%s, %lu month ago"
@@ -446,6 +437,10 @@ msgstr[1] "vor %lu Jahren"
msgid "failed to read orderfile '%s'"
msgstr "Fehler beim Lesen der Reihenfolgedatei '%s'."
+#: diffcore-rename.c:517
+msgid "Performing inexact rename detection"
+msgstr "Führe Erkennung für ungenaue Umbenennung aus"
+
#: diff.c:113
#, c-format
msgid " Failed to parse dirstat cut-off percentage '%s'\n"
@@ -471,7 +466,7 @@ msgstr ""
"Fehler in 'diff.dirstat' Konfigurationsvariable gefunden:\n"
"%s"
-#: diff.c:3509
+#: diff.c:3495
#, c-format
msgid ""
"Failed to parse --dirstat/-X option parameter:\n"
@@ -480,7 +475,7 @@ msgstr ""
"Fehler beim Parsen des --dirstat/-X Optionsparameters:\n"
"%s"
-#: diff.c:3523
+#: diff.c:3509
#, c-format
msgid "Failed to parse --submodule option parameter: '%s'"
msgstr "Fehler beim Parsen des --submodule Optionsparameters: '%s'"
@@ -507,35 +502,35 @@ msgstr "konnte temporäre Datei '%s' nicht erstellen: %s"
msgid "failed writing detached signature to '%s': %s"
msgstr "Fehler beim Schreiben der Signatur nach '%s': %s"
-#: grep.c:1695
+#: grep.c:1698
#, c-format
msgid "'%s': unable to read %s"
msgstr "'%s': konnte nicht lesen %s"
-#: grep.c:1712
+#: grep.c:1715
#, c-format
msgid "'%s': %s"
msgstr "'%s': %s"
-#: grep.c:1723
+#: grep.c:1726
#, c-format
msgid "'%s': short read %s"
msgstr "'%s': read() zu kurz %s"
-#: help.c:210
+#: help.c:209
#, c-format
msgid "available git commands in '%s'"
msgstr "Vorhandene Git-Kommandos in '%s'"
-#: help.c:217
+#: help.c:216
msgid "git commands available from elsewhere on your $PATH"
msgstr "Vorhandene Git-Kommandos irgendwo in Ihrem $PATH"
-#: help.c:233
+#: help.c:232
msgid "The most commonly used git commands are:"
msgstr "Die allgemein verwendeten Git-Kommandos sind:"
-#: help.c:290
+#: help.c:289
#, c-format
msgid ""
"'%s' appears to be a git command, but we were not\n"
@@ -544,30 +539,30 @@ msgstr ""
"'%s' scheint ein git-Kommando zu sein, konnte aber\n"
"nicht ausgeführt werden. Vielleicht ist git-%s fehlerhaft?"
-#: help.c:347
+#: help.c:346
msgid "Uh oh. Your system reports no Git commands at all."
msgstr "Uh oh. Keine Git-Kommandos auf Ihrem System vorhanden."
-#: help.c:369
+#: help.c:368
#, 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 ""
"Warnung: Sie haben das nicht existierende Git-Kommando '%s' ausgeführt.\n"
-"Setze fort unter der Annahme, dass Sie '%s' gemeint haben"
+"Setze fort unter der Annahme, dass Sie '%s' gemeint haben."
-#: help.c:374
+#: help.c:373
#, c-format
msgid "in %0.1f seconds automatically..."
-msgstr "automatisch in %0.1f Sekunden..."
+msgstr "Automatische Ausführung in %0.1f Sekunden..."
-#: help.c:381
+#: help.c:380
#, c-format
msgid "git: '%s' is not a git command. See 'git --help'."
msgstr "git: '%s' ist kein Git-Kommando. Siehe 'git --help'."
-#: help.c:385 help.c:444
+#: help.c:384 help.c:443
msgid ""
"\n"
"Did you mean this?"
@@ -581,7 +576,7 @@ msgstr[1] ""
"\n"
"Haben Sie eines von diesen gemeint?"
-#: help.c:440
+#: help.c:439
#, c-format
msgid "%s: %s - %s"
msgstr "%s: %s - %s"
@@ -590,7 +585,7 @@ msgstr "%s: %s - %s"
msgid "failed to read the cache"
msgstr "Lesen des Zwischenspeichers fehlgeschlagen"
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
#: builtin/clone.c:661
msgid "unable to write new index file"
msgstr "Konnte neue Staging-Area-Datei nicht schreiben."
@@ -600,75 +595,73 @@ msgstr "Konnte neue Staging-Area-Datei nicht schreiben."
msgid "(bad commit)\n"
msgstr "(ungültiger Commit)\n"
-#: merge-recursive.c:206
+#: merge-recursive.c:208
#, c-format
msgid "addinfo_cache failed for path '%s'"
msgstr "addinfo_cache für Pfad '%s' fehlgeschlagen"
-#: merge-recursive.c:269
+#: merge-recursive.c:271
msgid "error building trees"
msgstr "Fehler beim Erstellen der \"Tree\"-Objekte"
-#: merge-recursive.c:673
+#: merge-recursive.c:675
#, c-format
msgid "failed to create path '%s'%s"
msgstr "Fehler beim Erstellen des Pfades '%s'%s"
-#: merge-recursive.c:684
+#: merge-recursive.c:686
#, c-format
msgid "Removing %s to make room for subdirectory\n"
msgstr "Entferne %s um Platz für Unterverzeichnis zu schaffen\n"
-#. something else exists
-#. .. but not some other error (who really cares what?)
-#: merge-recursive.c:698 merge-recursive.c:719
+#: merge-recursive.c:700 merge-recursive.c:721
msgid ": perhaps a D/F conflict?"
msgstr ": vielleicht ein Verzeichnis/Datei-Konflikt?"
-#: merge-recursive.c:709
+#: merge-recursive.c:711
#, c-format
msgid "refusing to lose untracked file at '%s'"
msgstr "verweigere, da unbeobachtete Dateien in '%s' verloren gehen würden"
-#: merge-recursive.c:749
+#: merge-recursive.c:751
#, c-format
msgid "cannot read object %s '%s'"
msgstr "kann Objekt %s '%s' nicht lesen"
-#: merge-recursive.c:751
+#: merge-recursive.c:753
#, c-format
msgid "blob expected for %s '%s'"
msgstr "Blob erwartet für %s '%s'"
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
#, c-format
msgid "failed to open '%s'"
msgstr "Fehler beim Öffnen von '%s'"
-#: merge-recursive.c:782
+#: merge-recursive.c:784
#, c-format
msgid "failed to symlink '%s'"
msgstr "Fehler beim Erstellen eines symbolischen Verweises für '%s'"
-#: merge-recursive.c:785
+#: merge-recursive.c:787
#, c-format
msgid "do not know what to do with %06o %s '%s'"
msgstr "weiß nicht was mit %06o %s '%s' zu machen ist"
-#: merge-recursive.c:923
+#: merge-recursive.c:925
msgid "Failed to execute internal merge"
msgstr "Fehler bei Ausführung des internen Merges"
-#: merge-recursive.c:927
+#: merge-recursive.c:929
#, c-format
msgid "Unable to add %s to database"
msgstr "Konnte %s nicht zur Datenbank hinzufügen"
-#: merge-recursive.c:943
+#: merge-recursive.c:945
msgid "unsupported object type in the tree"
msgstr "nicht unterstützter Objekttyp im Verzeichnis"
-#: merge-recursive.c:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -677,7 +670,7 @@ msgstr ""
"KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde "
"im Arbeitsbereich gelassen."
-#: merge-recursive.c:1028 merge-recursive.c:1041
+#: merge-recursive.c:1030 merge-recursive.c:1043
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -686,20 +679,20 @@ msgstr ""
"KONFLIKT (%s/löschen): %s gelöscht in %s und %s in %s. Stand %s von %s wurde "
"im Arbeitsbereich bei %s gelassen."
-#: merge-recursive.c:1082
+#: merge-recursive.c:1084
msgid "rename"
msgstr "umbenennen"
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
msgid "renamed"
msgstr "umbenannt"
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
#, c-format
msgid "%s is a directory in %s adding as %s instead"
msgstr "%s ist ein Verzeichnis in %s, füge es stattdessen als %s hinzu"
-#: merge-recursive.c:1160
+#: merge-recursive.c:1162
#, c-format
msgid ""
"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -708,148 +701,148 @@ msgstr ""
"KONFLIKT (umbenennen/umbenennen): Benenne um \"%s\"->\"%s\" in Branch \"%s\" "
"und \"%s\"->\"%s\" in Branch \"%s\"%s"
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
msgid " (left unresolved)"
msgstr " (bleibt unaufgelöst)"
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
#, c-format
msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
msgstr ""
"KONFLIKT (umbenennen/umbenennen): Benenne um %s->%s in %s. Benenne um %s->%s "
"in %s"
-#: merge-recursive.c:1249
+#: merge-recursive.c:1251
#, c-format
msgid "Renaming %s to %s and %s to %s instead"
msgstr "Benenne stattdessen %s nach %s und %s nach %s um"
-#: merge-recursive.c:1448
+#: merge-recursive.c:1450
#, c-format
msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
msgstr ""
"KONFLIKT (umbenennen/hinzufügen): Benenne um %s->%s in %s. %s hinzugefügt in "
"%s"
-#: merge-recursive.c:1458
+#: merge-recursive.c:1460
#, c-format
msgid "Adding merged %s"
msgstr "Füge zusammengeführte Datei %s hinzu"
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
#, c-format
msgid "Adding as %s instead"
msgstr "Füge stattdessen als %s hinzu"
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
#, c-format
msgid "cannot read object %s"
msgstr "kann Objekt %s nicht lesen"
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
#, c-format
msgid "object %s is not a blob"
msgstr "Objekt %s ist kein Blob"
-#: merge-recursive.c:1565
+#: merge-recursive.c:1567
msgid "modify"
msgstr "ändern"
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
msgid "modified"
msgstr "geändert"
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
msgid "content"
msgstr "Inhalt"
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
msgid "add/add"
msgstr "hinzufügen/hinzufügen"
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
#, c-format
msgid "Skipped %s (merged same as existing)"
msgstr "%s ausgelassen (Ergebnis des Merges existiert bereits)"
-#: merge-recursive.c:1630
+#: merge-recursive.c:1632
#, c-format
msgid "Auto-merging %s"
msgstr "automatischer Merge von %s"
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
msgid "submodule"
msgstr "Submodul"
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
#, c-format
msgid "CONFLICT (%s): Merge conflict in %s"
msgstr "KONFLIKT (%s): Merge-Konflikt in %s"
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
#, c-format
msgid "Removing %s"
msgstr "Entferne %s"
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
msgid "file/directory"
msgstr "Datei/Verzeichnis"
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
msgid "directory/file"
msgstr "Verzeichnis/Datei"
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
#, c-format
msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
msgstr ""
"KONFLIKT (%s): Es existiert bereits ein Verzeichnis %s in %s. Füge %s als %s "
"hinzu."
-#: merge-recursive.c:1771
+#: merge-recursive.c:1773
#, c-format
msgid "Adding %s"
msgstr "Füge %s hinzu"
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
msgid "Fatal merge failure, shouldn't happen."
msgstr "Fataler Merge-Fehler. Sollte nicht passieren."
-#: merge-recursive.c:1807
+#: merge-recursive.c:1809
msgid "Already up-to-date!"
msgstr "Bereits aktuell!"
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
#, c-format
msgid "merging of trees %s and %s failed"
msgstr "Zusammenführen der \"Tree\"-Objekte %s und %s fehlgeschlagen"
-#: merge-recursive.c:1846
+#: merge-recursive.c:1848
#, c-format
msgid "Unprocessed path??? %s"
msgstr "unverarbeiteter Pfad??? %s"
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
msgid "Merging:"
msgstr "Merge:"
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
#, c-format
msgid "found %u common ancestor:"
msgid_plural "found %u common ancestors:"
msgstr[0] "%u gemeinsamen Vorgänger-Commit gefunden"
msgstr[1] "%u gemeinsame Vorgänger-Commits gefunden"
-#: merge-recursive.c:1941
+#: merge-recursive.c:1943
msgid "merge returned no commit"
msgstr "Merge hat keinen Commit zurückgegeben"
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
#, c-format
msgid "Could not parse object '%s'"
msgstr "Konnte Objekt '%s' nicht parsen."
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
msgid "Unable to write index."
msgstr "Konnte Staging-Area nicht schreiben."
@@ -876,33 +869,33 @@ msgstr ""
msgid "Bad %s value: '%s'"
msgstr "Ungültiger %s Wert: '%s'"
-#: object.c:202
+#: object.c:229
#, c-format
msgid "unable to parse object: %s"
msgstr "Konnte Objekt '%s' nicht parsen."
-#: parse-options.c:537
+#: parse-options.c:532
msgid "..."
msgstr "..."
-#: parse-options.c:555
+#: parse-options.c:550
#, c-format
msgid "usage: %s"
msgstr "Verwendung: %s"
#. TRANSLATORS: the colon here should align with the
#. one in "usage: %s" translation
-#: parse-options.c:559
+#: parse-options.c:554
#, c-format
msgid " or: %s"
msgstr " oder: %s"
-#: parse-options.c:562
+#: parse-options.c:557
#, c-format
msgid " %s"
msgstr " %s"
-#: parse-options.c:596
+#: parse-options.c:591
msgid "-NUM"
msgstr "-NUM"
@@ -954,11 +947,6 @@ msgstr "%s: '%s' liegt außerhalb des Repositories"
msgid "Pathspec '%s' is in submodule '%.*s'"
msgstr "Pfadspezifikation '%s' befindet sich in Submodul '%.*s'"
-#.
-#. * We may want to substitute "this command" with a command
-#. * name. E.g. when add--interactive dies when running
-#. * "checkout -p"
-#.
#: pathspec.c:353
#, c-format
msgid "%s: pathspec magic not supported by this command: %s"
@@ -978,56 +966,73 @@ msgstr ""
":(exclude) Muster, aber keine anderen Pfadspezifikationen angegeben.\n"
"Vielleicht haben Sie vergessen entweder ':/' oder '.' hinzuzufügen?"
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr "Fertig"
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"index.version gesetzt, aber Wert ungültig.\n"
+"Verwende Version %i"
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"GIT_INDEX_VERSION gesetzt, aber Wert ungültig.\n"
+"Verwende Version %i"
+
+#: remote.c:758
#, c-format
msgid "Cannot fetch both %s and %s to %s"
msgstr "Kann 'fetch' nicht für sowohl %s als auch %s nach %s ausführen."
-#: remote.c:757
+#: remote.c:762
#, c-format
msgid "%s usually tracks %s, not %s"
msgstr "%s folgt üblicherweise %s, nicht %s"
-#: remote.c:761
+#: remote.c:766
#, c-format
msgid "%s tracks both %s and %s"
msgstr "%s folgt sowohl %s als auch %s"
-#.
-#. * This last possibility doesn't occur because
-#. * FETCH_HEAD_IGNORE entries always appear at
-#. * the end of the list.
-#.
-#: remote.c:769
+#: remote.c:774
msgid "Internal error"
msgstr "Interner Fehler"
-#: remote.c:1871
+#: remote.c:1948
#, c-format
msgid "Your branch is based on '%s', but the upstream is gone.\n"
msgstr "Ihr Branch basiert auf '%s', aber Upstream-Branch wurde entfernt.\n"
-#: remote.c:1875
+#: remote.c:1952
msgid " (use \"git branch --unset-upstream\" to fixup)\n"
msgstr " (benutzen Sie \"git branch --unset-upstream\" zum Beheben)\n"
-#: remote.c:1878
+#: remote.c:1955
#, c-format
msgid "Your branch is up-to-date with '%s'.\n"
msgstr "Ihr Branch ist auf dem selben Stand wie '%s'.\n"
-#: remote.c:1882
+#: remote.c:1959
#, c-format
msgid "Your branch is ahead of '%s' by %d commit.\n"
msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
msgstr[0] "Ihr Branch ist vor '%s' um %d Commit.\n"
msgstr[1] "Ihr Branch ist vor '%s' um %d Commits.\n"
-#: remote.c:1888
+#: remote.c:1965
msgid " (use \"git push\" to publish your local commits)\n"
msgstr " (benutzen Sie \"git push\" um lokale Commits zu publizieren)\n"
-#: remote.c:1891
+#: remote.c:1968
#, c-format
msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
msgid_plural ""
@@ -1037,12 +1042,12 @@ msgstr[0] ""
msgstr[1] ""
"Ihr Branch ist zu '%s' um %d Commits hinterher, und kann vorgespult werden.\n"
-#: remote.c:1899
+#: remote.c:1976
msgid " (use \"git pull\" to update your local branch)\n"
msgstr ""
" (benutzen Sie \"git pull\" um Ihren lokalen Branch zu aktualisieren)\n"
-#: remote.c:1902
+#: remote.c:1979
#, c-format
msgid ""
"Your branch and '%s' have diverged,\n"
@@ -1057,7 +1062,7 @@ msgstr[1] ""
"Ihr Branch und '%s' sind divergiert,\n"
"und haben jeweils %d und %d unterschiedliche Commits.\n"
-#: remote.c:1912
+#: remote.c:1989
msgid " (use \"git pull\" to merge the remote branch into yours)\n"
msgstr ""
" (benutzen Sie \"git pull\" um Ihren Branch mit dem Remote-Branch "
@@ -1072,14 +1077,14 @@ msgstr "Öffnen von /dev/null fehlgeschlagen"
msgid "dup2(%d,%d) failed"
msgstr "dup2(%d,%d) fehlgeschlagen"
-#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896
-#: builtin/merge.c:1006 builtin/merge.c:1016
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
#, c-format
msgid "Could not open '%s' for writing"
msgstr "Konnte '%s' nicht zum Schreiben öffnen."
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786
-#: builtin/merge.c:1008 builtin/merge.c:1021
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
#, c-format
msgid "Could not write to '%s'"
msgstr "Konnte nicht nach '%s' schreiben."
@@ -1102,7 +1107,7 @@ msgstr ""
"mit 'git add <Pfade>' oder 'git rm <Pfade>'und tragen Sie das Ergebnis mit\n"
"'git commit' ein"
-#: sequencer.c:245 sequencer.c:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
#, c-format
msgid "Could not write to %s"
msgstr "Konnte nicht nach %s schreiben"
@@ -1140,184 +1145,184 @@ msgstr "Konnte Commit von HEAD nicht auflösen\n"
msgid "Unable to update cache tree\n"
msgstr "Konnte Cache-Verzeichnis nicht aktualisieren\n"
-#: sequencer.c:423
+#: sequencer.c:430
#, c-format
msgid "Could not parse commit %s\n"
msgstr "Konnte Commit %s nicht parsen\n"
-#: sequencer.c:428
+#: sequencer.c:435
#, c-format
msgid "Could not parse parent commit %s\n"
msgstr "Konnte Eltern-Commit %s nicht parsen\n"
-#: sequencer.c:494
+#: sequencer.c:501
msgid "Your index file is unmerged."
msgstr "Ihre Staging-Area-Datei ist nicht zusammengeführt."
-#: sequencer.c:513
+#: sequencer.c:520
#, c-format
msgid "Commit %s is a merge but no -m option was given."
msgstr "Commit %s ist ein Merge, aber die Option -m wurde nicht angegeben."
-#: sequencer.c:521
+#: sequencer.c:528
#, c-format
msgid "Commit %s does not have parent %d"
msgstr "Commit %s hat keinen Elternteil %d"
-#: sequencer.c:525
+#: sequencer.c:532
#, c-format
msgid "Mainline was specified but commit %s is not a merge."
msgstr "Hauptlinie wurde spezifiziert, aber Commit %s ist kein Merge."
#. TRANSLATORS: The first %s will be "revert" or
#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:538
+#: sequencer.c:545
#, c-format
msgid "%s: cannot parse parent commit %s"
msgstr "%s: kann Eltern-Commit %s nicht parsen"
-#: sequencer.c:542
+#: sequencer.c:549
#, c-format
msgid "Cannot get commit message for %s"
msgstr "Kann keine Commit-Beschreibung für %s bekommen"
-#: sequencer.c:628
+#: sequencer.c:635
#, c-format
msgid "could not revert %s... %s"
msgstr "Konnte \"revert\" nicht auf %s ausführen... %s"
-#: sequencer.c:629
+#: sequencer.c:636
#, c-format
msgid "could not apply %s... %s"
msgstr "Konnte %s nicht anwenden... %s"
-#: sequencer.c:665
+#: sequencer.c:672
msgid "empty commit set passed"
msgstr "leere Menge von Commits übergeben"
-#: sequencer.c:673
+#: sequencer.c:680
#, c-format
msgid "git %s: failed to read the index"
msgstr "git %s: Fehler beim Lesen der Staging-Area"
-#: sequencer.c:678
+#: sequencer.c:685
#, c-format
msgid "git %s: failed to refresh the index"
msgstr "git %s: Fehler beim Aktualisieren der Staging-Area"
-#: sequencer.c:736
+#: sequencer.c:743
#, c-format
msgid "Cannot %s during a %s"
msgstr "Kann %s nicht während eines %s durchführen"
-#: sequencer.c:758
+#: sequencer.c:765
#, c-format
msgid "Could not parse line %d."
msgstr "Konnte Zeile %d nicht parsen."
-#: sequencer.c:763
+#: sequencer.c:770
msgid "No commits parsed."
msgstr "Keine Commits geparst."
-#: sequencer.c:776
+#: sequencer.c:783
#, c-format
msgid "Could not open %s"
msgstr "Konnte %s nicht öffnen"
-#: sequencer.c:780
+#: sequencer.c:787
#, c-format
msgid "Could not read %s."
msgstr "Konnte %s nicht lesen."
-#: sequencer.c:787
+#: sequencer.c:794
#, c-format
msgid "Unusable instruction sheet: %s"
msgstr "Unbenutzbares Instruktionsblatt: %s"
-#: sequencer.c:815
+#: sequencer.c:824
#, c-format
msgid "Invalid key: %s"
msgstr "Ungültiger Schlüssel: %s"
-#: sequencer.c:818
+#: sequencer.c:827
#, c-format
msgid "Invalid value for %s: %s"
msgstr "Ungültiger Wert für %s: %s"
-#: sequencer.c:830
+#: sequencer.c:839
#, c-format
msgid "Malformed options sheet: %s"
msgstr "Fehlerhaftes Optionsblatt: %s"
-#: sequencer.c:851
+#: sequencer.c:860
msgid "a cherry-pick or revert is already in progress"
msgstr "\"cherry-pick\" oder \"revert\" ist bereits im Gang"
-#: sequencer.c:852
+#: sequencer.c:861
msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
msgstr "versuchen Sie \"git cherry-pick (--continue | --quit | --abort)\""
-#: sequencer.c:856
+#: sequencer.c:865
#, c-format
msgid "Could not create sequencer directory %s"
msgstr "Konnte \"sequencer\"-Verzeichnis %s nicht erstellen"
-#: sequencer.c:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
#, c-format
msgid "Error wrapping up %s."
msgstr "Fehler beim Einpacken von %s."
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
msgid "no cherry-pick or revert in progress"
msgstr "kein \"cherry-pick\" oder \"revert\" im Gang"
-#: sequencer.c:893
+#: sequencer.c:902
msgid "cannot resolve HEAD"
msgstr "kann HEAD nicht auflösen"
-#: sequencer.c:895
+#: sequencer.c:904
msgid "cannot abort from a branch yet to be born"
msgstr "kann nicht abbrechen: bin auf einem Branch, der noch geboren wird"
-#: sequencer.c:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
#, c-format
msgid "cannot open %s: %s"
msgstr "Kann %s nicht öffnen: %s"
-#: sequencer.c:920
+#: sequencer.c:929
#, c-format
msgid "cannot read %s: %s"
msgstr "Kann %s nicht lesen: %s"
-#: sequencer.c:921
+#: sequencer.c:930
msgid "unexpected end of file"
msgstr "Unerwartetes Dateiende"
-#: sequencer.c:927
+#: sequencer.c:936
#, c-format
msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
msgstr "gespeicherte \"pre-cherry-pick\" HEAD Datei '%s' ist beschädigt"
-#: sequencer.c:950
+#: sequencer.c:959
#, c-format
msgid "Could not format %s."
msgstr "Konnte %s nicht formatieren."
-#: sequencer.c:1093
+#: sequencer.c:1104
#, c-format
msgid "%s: can't cherry-pick a %s"
msgstr "%s: %s kann nicht in \"cherry-pick\" benutzt werden"
-#: sequencer.c:1096
+#: sequencer.c:1107
#, c-format
msgid "%s: bad revision"
msgstr "%s: ungültiger Commit"
-#: sequencer.c:1130
+#: sequencer.c:1141
msgid "Can't revert as initial commit"
msgstr "Kann nicht als allerersten Commit einen Revert ausführen."
-#: sequencer.c:1131
+#: sequencer.c:1142
msgid "Can't cherry-pick into empty head"
msgstr "Kann nicht als allerersten Commit einen Cherry-Pick ausführen."
@@ -1346,21 +1351,21 @@ msgstr ""
"indem Sie \"git config advice.objectNameWarning false\"\n"
"ausführen."
-#: sha1_name.c:1070
+#: sha1_name.c:1072
msgid "HEAD does not point to a branch"
msgstr "HEAD zeigt auf keinen Branch"
-#: sha1_name.c:1073
+#: sha1_name.c:1075
#, c-format
msgid "No such branch: '%s'"
msgstr "Kein solcher Branch '%s'"
-#: sha1_name.c:1075
+#: sha1_name.c:1077
#, c-format
msgid "No upstream configured for branch '%s'"
msgstr "Kein Upstream-Branch für Branch '%s' konfiguriert."
-#: sha1_name.c:1079
+#: sha1_name.c:1081
#, c-format
msgid "Upstream branch '%s' not stored as a remote-tracking branch"
msgstr "Upstream-Branch '%s' ist nicht als Remote-Tracking-Branch gespeichert"
@@ -1376,52 +1381,34 @@ msgstr ""
msgid "Could not find section in .gitmodules where path=%s"
msgstr "Konnte keine Sektion in .gitmodules mit Pfad \"%s\" finden"
-#. Maybe the user already did that, don't error out here
#: submodule.c:76
#, c-format
msgid "Could not update .gitmodules entry %s"
msgstr "Konnte Eintrag '%s' in .gitmodules nicht aktualisieren"
-#. Maybe the user already did that, don't error out here
#: submodule.c:109
#, c-format
msgid "Could not remove .gitmodules entry for %s"
msgstr "Konnte Eintrag '%s' nicht aus .gitmodules entfernen"
-#: submodule.c:127
-msgid "could not find .gitmodules in index"
-msgstr "Konnte .gitmodules nicht in der Staging-Area finden"
-
-#: submodule.c:133
-msgid "reading updated .gitmodules failed"
-msgstr "Lesen der aktualisierten .gitmodules-Datei fehlgeschlagen"
-
-#: submodule.c:135
-msgid "unable to stat updated .gitmodules"
-msgstr "Konnte aktualisierte .gitmodules-Datei nicht lesen"
-
-#: submodule.c:139
-msgid "unable to remove .gitmodules from index"
-msgstr "Konnte .gitmodules nicht aus der Staging-Area entfernen"
-
-#: submodule.c:141
-msgid "adding updated .gitmodules failed"
-msgstr "Konnte aktualisierte .gitmodules-Datei nicht hinzufügen"
-
-#: submodule.c:143
+#: submodule.c:120
msgid "staging updated .gitmodules failed"
msgstr "Konnte aktualisierte .gitmodules-Datei nicht zum Commit vormerken"
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 builtin/init-db.c:363
#, c-format
msgid "Could not create git link %s"
msgstr "Konnte git-Verweis %s nicht erstellen"
-#: submodule.c:1155
+#: submodule.c:1132
#, c-format
msgid "Could not set core.worktree in %s"
msgstr "Konnte core.worktree in '%s' nicht setzen."
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr "Checke Dateien aus"
+
#: urlmatch.c:120
msgid "invalid URL scheme name or missing '://' suffix"
msgstr "Ungültiges URL-Schema oder Suffix '://' fehlt"
@@ -1543,88 +1530,97 @@ msgstr ""
" (benutzen Sie \"git %s <Datei>...\" um die Änderungen zum Commit "
"vorzumerken)"
-#: wt-status.c:254
-msgid "bug"
-msgstr "Fehler"
-
-#: wt-status.c:259
+#: wt-status.c:252
msgid "both deleted:"
msgstr "beide gelöscht:"
-#: wt-status.c:260
+#: wt-status.c:254
msgid "added by us:"
msgstr "von uns hinzugefügt:"
-#: wt-status.c:261
+#: wt-status.c:256
msgid "deleted by them:"
msgstr "von denen gelöscht:"
-#: wt-status.c:262
+#: wt-status.c:258
msgid "added by them:"
msgstr "von denen hinzugefügt:"
-#: wt-status.c:263
+#: wt-status.c:260
msgid "deleted by us:"
msgstr "von uns gelöscht:"
-#: wt-status.c:264
+#: wt-status.c:262
msgid "both added:"
msgstr "von beiden hinzugefügt:"
-#: wt-status.c:265
+#: wt-status.c:264
msgid "both modified:"
msgstr "von beiden geändert:"
-#: wt-status.c:275
-msgid "new file"
-msgstr "neue Datei"
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "Bug: unbehandelter Unmerged-Status %x"
-#: wt-status.c:277
-msgid "copied"
-msgstr "kopiert"
+#: wt-status.c:274
+msgid "new file:"
+msgstr "neue Datei:"
-#: wt-status.c:279
-msgid "deleted"
-msgstr "gelöscht"
+#: wt-status.c:276
+msgid "copied:"
+msgstr "kopiert:"
-#: wt-status.c:285
-msgid "typechange"
-msgstr "Typänderung"
+#: wt-status.c:278
+msgid "deleted:"
+msgstr "gelöscht:"
-#: wt-status.c:287
-msgid "unknown"
-msgstr "unbekannt"
+#: wt-status.c:280
+msgid "modified:"
+msgstr "geändert:"
-#: wt-status.c:289
-msgid "unmerged"
-msgstr "nicht zusammengeführt"
+#: wt-status.c:282
+msgid "renamed:"
+msgstr "umbenannt:"
-#: wt-status.c:336
+#: wt-status.c:284
+msgid "typechange:"
+msgstr "Typänderung:"
+
+#: wt-status.c:286
+msgid "unknown:"
+msgstr "unbekannt:"
+
+#: wt-status.c:288
+msgid "unmerged:"
+msgstr "nicht gemerged:"
+
+#: wt-status.c:370
msgid "new commits, "
msgstr "neue Commits, "
-#: wt-status.c:338
+#: wt-status.c:372
msgid "modified content, "
msgstr "geänderter Inhalt, "
-#: wt-status.c:340
+#: wt-status.c:374
msgid "untracked content, "
msgstr "unbeobachteter Inhalt, "
-#: wt-status.c:357
+#: wt-status.c:391
#, c-format
msgid "bug: unhandled diff status %c"
msgstr "Fehler: unbehandelter Differenz-Status %c"
-#: wt-status.c:732
+#: wt-status.c:765
msgid "Submodules changed but not updated:"
msgstr "Submodule geändert, aber nicht aktualisiert:"
-#: wt-status.c:734
+#: wt-status.c:767
msgid "Submodule changes to be committed:"
msgstr "Änderungen in Submodul zum Committen:"
-#: wt-status.c:836
+#: wt-status.c:846
msgid ""
"Do not touch the line above.\n"
"Everything below will be removed."
@@ -1632,75 +1628,75 @@ msgstr ""
"Ändern Sie nicht die obige Zeile.\n"
"Alles unterhalb von ihr wird entfernt."
-#: wt-status.c:899
+#: wt-status.c:937
msgid "You have unmerged paths."
msgstr "Sie haben nicht zusammengeführte Pfade."
-#: wt-status.c:902
+#: wt-status.c:940
msgid " (fix conflicts and run \"git commit\")"
msgstr " (beheben Sie die Konflikte und führen Sie \"git commit\" aus)"
-#: wt-status.c:905
+#: wt-status.c:943
msgid "All conflicts fixed but you are still merging."
msgstr "Alle Konflikte sind behoben, aber Sie sind immer noch beim Merge."
-#: wt-status.c:908
+#: wt-status.c:946
msgid " (use \"git commit\" to conclude merge)"
msgstr " (benutzen Sie \"git commit\" um den Merge abzuschließen)"
-#: wt-status.c:918
+#: wt-status.c:956
msgid "You are in the middle of an am session."
msgstr "Eine \"am\"-Sitzung ist im Gange."
-#: wt-status.c:921
+#: wt-status.c:959
msgid "The current patch is empty."
msgstr "Der aktuelle Patch ist leer."
-#: wt-status.c:925
+#: wt-status.c:963
msgid " (fix conflicts and then run \"git am --continue\")"
msgstr ""
" (beheben Sie die Konflikte und führen Sie dann \"git am --continue\" aus)"
-#: wt-status.c:927
+#: wt-status.c:965
msgid " (use \"git am --skip\" to skip this patch)"
msgstr " (benutzen Sie \"git am --skip\" um diesen Patch auszulassen)"
-#: wt-status.c:929
+#: wt-status.c:967
msgid " (use \"git am --abort\" to restore the original branch)"
msgstr ""
" (benutzen Sie \"git am --abort\" um den ursprünglichen Branch "
"wiederherzustellen)"
-#: wt-status.c:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
#, c-format
msgid "You are currently rebasing branch '%s' on '%s'."
msgstr "Sie sind gerade beim Rebase von Branch '%s' auf '%s'."
-#: wt-status.c:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
msgid "You are currently rebasing."
msgstr "Sie sind gerade beim Rebase."
-#: wt-status.c:997
+#: wt-status.c:1035
msgid " (fix conflicts and then run \"git rebase --continue\")"
msgstr ""
" (beheben Sie die Konflikte und führen Sie dann \"git rebase --continue\" "
"aus)"
-#: wt-status.c:999
+#: wt-status.c:1037
msgid " (use \"git rebase --skip\" to skip this patch)"
msgstr " (benutzen Sie \"git rebase --skip\" um diesen Patch auszulassen)"
-#: wt-status.c:1001
+#: wt-status.c:1039
msgid " (use \"git rebase --abort\" to check out the original branch)"
msgstr ""
" (benutzen Sie \"git rebase --abort\" um den ursprünglichen Branch "
"auszuchecken)"
-#: wt-status.c:1014
+#: wt-status.c:1052
msgid " (all conflicts fixed: run \"git rebase --continue\")"
msgstr " (alle Konflikte behoben: führen Sie \"git rebase --continue\" aus)"
-#: wt-status.c:1018
+#: wt-status.c:1056
#, c-format
msgid ""
"You are currently splitting a commit while rebasing branch '%s' on '%s'."
@@ -1708,129 +1704,129 @@ msgstr ""
"Sie teilen gerade einen Commit auf, während ein Rebase von Branch '%s' auf "
"'%s' im Gange ist."
-#: wt-status.c:1023
+#: wt-status.c:1061
msgid "You are currently splitting a commit during a rebase."
msgstr "Sie teilen gerade einen Commit während eines Rebase auf."
-#: wt-status.c:1026
+#: wt-status.c:1064
msgid " (Once your working directory is clean, run \"git rebase --continue\")"
msgstr ""
" (Sobald Ihr Arbeitsverzeichnis unverändert ist, führen Sie \"git rebase --"
"continue\" aus)"
-#: wt-status.c:1030
+#: wt-status.c:1068
#, c-format
msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
msgstr ""
"Sie editieren gerade einen Commit während eines Rebase von Branch '%s' auf "
"'%s'."
-#: wt-status.c:1035
+#: wt-status.c:1073
msgid "You are currently editing a commit during a rebase."
msgstr "Sie editieren gerade einen Commit während eines Rebase."
-#: wt-status.c:1038
+#: wt-status.c:1076
msgid " (use \"git commit --amend\" to amend the current commit)"
msgstr ""
" (benutzen Sie \"git commit --amend\" um den aktuellen Commit nachzubessern)"
-#: wt-status.c:1040
+#: wt-status.c:1078
msgid ""
" (use \"git rebase --continue\" once you are satisfied with your changes)"
msgstr ""
" (benutzen Sie \"git rebase --continue\" sobald Ihre Änderungen "
"abgeschlossen sind)"
-#: wt-status.c:1050
+#: wt-status.c:1088
#, c-format
msgid "You are currently cherry-picking commit %s."
msgstr "Sie führen gerade \"cherry-pick\" von Commit %s aus."
-#: wt-status.c:1055
+#: wt-status.c:1093
msgid " (fix conflicts and run \"git cherry-pick --continue\")"
msgstr ""
" (beheben Sie die Konflikte und führen Sie dann \"git cherry-pick --continue"
"\" aus)"
-#: wt-status.c:1058
+#: wt-status.c:1096
msgid " (all conflicts fixed: run \"git cherry-pick --continue\")"
msgstr ""
" (alle Konflikte behoben: führen Sie \"git cherry-pick --continue\" aus)"
-#: wt-status.c:1060
+#: wt-status.c:1098
msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
msgstr ""
" (benutzen Sie \"git cherry-pick --abort\" um die Cherry-Pick-Operation "
"abzubrechen)"
-#: wt-status.c:1069
+#: wt-status.c:1107
#, c-format
msgid "You are currently reverting commit %s."
msgstr "Sie sind gerade an einem Revert von Commit '%s'."
-#: wt-status.c:1074
+#: wt-status.c:1112
msgid " (fix conflicts and run \"git revert --continue\")"
msgstr ""
" (beheben Sie die Konflikte und führen Sie dann \"git revert --continue\" "
"aus)"
-#: wt-status.c:1077
+#: wt-status.c:1115
msgid " (all conflicts fixed: run \"git revert --continue\")"
msgstr " (alle Konflikte behoben: führen Sie \"git revert --continue\" aus)"
-#: wt-status.c:1079
+#: wt-status.c:1117
msgid " (use \"git revert --abort\" to cancel the revert operation)"
msgstr ""
" (benutzen Sie \"git revert --abort\" um die Revert-Operation abzubrechen)"
-#: wt-status.c:1090
+#: wt-status.c:1128
#, c-format
msgid "You are currently bisecting, started from branch '%s'."
msgstr "Sie sind gerade bei einer binären Suche, gestartet von Branch '%s'."
-#: wt-status.c:1094
+#: wt-status.c:1132
msgid "You are currently bisecting."
msgstr "Sie sind gerade bei einer binären Suche."
-#: wt-status.c:1097
+#: wt-status.c:1135
msgid " (use \"git bisect reset\" to get back to the original branch)"
msgstr ""
" (benutzen Sie \"git bisect reset\" um zum ursprünglichen Branch "
"zurückzukehren)"
-#: wt-status.c:1272
+#: wt-status.c:1310
msgid "On branch "
msgstr "Auf Branch "
-#: wt-status.c:1279
+#: wt-status.c:1317
msgid "rebase in progress; onto "
msgstr "Rebase im Gange; auf "
-#: wt-status.c:1286
+#: wt-status.c:1324
msgid "HEAD detached at "
msgstr "HEAD losgelöst bei "
-#: wt-status.c:1288
+#: wt-status.c:1326
msgid "HEAD detached from "
msgstr "HEAD losgelöst von "
-#: wt-status.c:1291
+#: wt-status.c:1329
msgid "Not currently on any branch."
msgstr "Im Moment auf keinem Branch."
-#: wt-status.c:1308
+#: wt-status.c:1346
msgid "Initial commit"
msgstr "Initialer Commit"
-#: wt-status.c:1322
+#: wt-status.c:1360
msgid "Untracked files"
msgstr "Unbeobachtete Dateien"
-#: wt-status.c:1324
+#: wt-status.c:1362
msgid "Ignored files"
msgstr "Ignorierte Dateien"
-#: wt-status.c:1328
+#: wt-status.c:1366
#, c-format
msgid ""
"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1841,32 +1837,32 @@ msgstr ""
"'status -uno' könnte das beschleunigen, aber Sie müssen darauf achten,\n"
"neue Dateien selbstständig hinzuzufügen (siehe 'git help status')."
-#: wt-status.c:1334
+#: wt-status.c:1372
#, c-format
msgid "Untracked files not listed%s"
msgstr "Unbeobachtete Dateien nicht aufgelistet%s"
-#: wt-status.c:1336
+#: wt-status.c:1374
msgid " (use -u option to show untracked files)"
msgstr " (benutzen Sie die Option -u um unbeobachteten Dateien anzuzeigen)"
-#: wt-status.c:1342
+#: wt-status.c:1380
msgid "No changes"
msgstr "Keine Änderungen"
-#: wt-status.c:1347
+#: wt-status.c:1385
#, c-format
msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
msgstr ""
"keine Änderungen zum Commit vorgemerkt (benutzen Sie \"git add\" und/oder "
"\"git commit -a\")\n"
-#: wt-status.c:1350
+#: wt-status.c:1388
#, c-format
msgid "no changes added to commit\n"
msgstr "keine Änderungen zum Commit vorgemerkt\n"
-#: wt-status.c:1353
+#: wt-status.c:1391
#, c-format
msgid ""
"nothing added to commit but untracked files present (use \"git add\" to "
@@ -1875,290 +1871,209 @@ msgstr ""
"nichts zum Commit vorgemerkt, aber es gibt unbeobachtete Dateien (benutzen "
"Sie \"git add\" zum Beobachten)\n"
-#: wt-status.c:1356
+#: wt-status.c:1394
#, c-format
msgid "nothing added to commit but untracked files present\n"
msgstr "nichts zum Commit vorgemerkt, aber es gibt unbeobachtete Dateien\n"
-#: wt-status.c:1359
+#: wt-status.c:1397
#, c-format
msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
msgstr ""
"nichts zu committen (Erstellen/Kopieren Sie Dateien und benutzen Sie \"git "
"add\" zum Beobachten)\n"
-#: wt-status.c:1362 wt-status.c:1367
+#: wt-status.c:1400 wt-status.c:1405
#, c-format
msgid "nothing to commit\n"
msgstr "nichts zu committen\n"
-#: wt-status.c:1365
+#: wt-status.c:1403
#, c-format
msgid "nothing to commit (use -u to show untracked files)\n"
msgstr ""
"nichts zu committen (benutzen Sie die Option -u, um unbeobachtete Dateien "
"anzuzeigen)\n"
-#: wt-status.c:1369
+#: wt-status.c:1407
#, c-format
msgid "nothing to commit, working directory clean\n"
msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n"
-#: wt-status.c:1478
+#: wt-status.c:1516
msgid "HEAD (no branch)"
msgstr "HEAD (kein Branch)"
-#: wt-status.c:1484
+#: wt-status.c:1522
msgid "Initial commit on "
msgstr "Initialer Commit auf "
-#: wt-status.c:1514
+#: wt-status.c:1554
msgid "gone"
msgstr "entfernt"
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
msgid "behind "
msgstr "hinterher "
-#: wt-status.c:1519 wt-status.c:1522
-msgid "ahead "
-msgstr "voraus "
-
-#: wt-status.c:1524
-msgid ", behind "
-msgstr ", hinterher "
-
#: compat/precompose_utf8.c:55 builtin/clone.c:356
#, c-format
msgid "failed to unlink '%s'"
msgstr "Konnte '%s' nicht entfernen."
-#: builtin/add.c:20
+#: builtin/add.c:21
msgid "git add [options] [--] <pathspec>..."
msgstr "git add [Optionen] [--] [<Pfadspezifikation>...]"
-#.
-#. * 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 ""
-"Das Verhalten von 'git add %s (oder %s)' ohne ein Pfad-Argument von\n"
-"einem Unterverzeichnis aus wird in Git 2.0 geändert und sollte nicht\n"
-"mehr verwendet werden.\n"
-"Um Dateien des gesamten Projektverzeichnisses hinzuzufügen, führen Sie aus:\n"
-"\n"
-" git add %s :/\n"
-" (oder git add %s :/)\n"
-"\n"
-"Zur Einschränkung auf das aktuelle Verzeichnis führen Sie aus:\n"
-"\n"
-" git add %s .\n"
-" (oder git add %s .)\n"
-"\n"
-"Mit der aktuellen Version von Git ist das Kommando auf das aktuelle\n"
-"Verzeichnis beschränkt.\n"
-
-#: 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 ""
-"Sie haben 'git add' weder mit '-A (--all)' noch mit '--ignore-removal'\n"
-"ausgeführt. Das Verhalten des Kommandos ändert sich in Git 2.0 durch\n"
-"Berücksichtigung der gelöschten Pfade.\n"
-"Pfade wie '%s', die im Arbeitsverzeichnis gelöscht wurden, werden in\n"
-"dieser Version von Git ignoriert.\n"
-"\n"
-"* 'git add --ignore-removal <Pfadspezifikation>', was der aktuelle\n"
-" Standardwert ist, ignoriert gelöschte Pfade im Arbeitsverzeichnis.\n"
-"* 'git add --all <Pfadspezifikation>' berücksichtigt ebenfalls gelöschte\n"
-" Pfade.\n"
-"Führen Sie 'git status' aus, um die gelöschten Pfade zu überprüfen.\n"
-
-#: builtin/add.c:144
+#: builtin/add.c:64
#, c-format
msgid "unexpected diff status %c"
msgstr "unerwarteter Differenz-Status %c"
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
msgid "updating files failed"
msgstr "Aktualisierung der Dateien fehlgeschlagen"
-#: builtin/add.c:163
+#: builtin/add.c:79
#, c-format
msgid "remove '%s'\n"
msgstr "lösche '%s'\n"
-#: builtin/add.c:237
+#: builtin/add.c:133
msgid "Unstaged changes after refreshing the index:"
msgstr ""
"Nicht zum Commit vorgemerkte Änderungen nach Aktualisierung der Staging-Area:"
-#: builtin/add.c:299
+#: builtin/add.c:193
msgid "Could not read the index"
msgstr "Konnte die Staging-Area nicht lesen"
-#: builtin/add.c:310
+#: builtin/add.c:204
#, c-format
msgid "Could not open '%s' for writing."
msgstr "Konnte '%s' nicht zum Schreiben öffnen."
-#: builtin/add.c:314
+#: builtin/add.c:208
msgid "Could not write patch"
msgstr "Konnte Patch nicht schreiben"
-#: builtin/add.c:319
+#: builtin/add.c:213
#, c-format
msgid "Could not stat '%s'"
msgstr "Konnte Verzeichnis '%s' nicht lesen"
-#: builtin/add.c:321
+#: builtin/add.c:215
msgid "Empty patch. Aborted."
msgstr "Leerer Patch. Abgebrochen."
-#: builtin/add.c:327
+#: builtin/add.c:221
#, c-format
msgid "Could not apply '%s'"
msgstr "Konnte '%s' nicht anwenden."
-#: builtin/add.c:337
+#: builtin/add.c:231
msgid "The following paths are ignored by one of your .gitignore files:\n"
msgstr ""
"Die folgenden Pfade werden durch eine Ihrer \".gitignore\" Dateien "
"ignoriert:\n"
-#: builtin/add.c: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/add.c:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
+#: builtin/prune-packed.c:77 builtin/push.c:489 builtin/remote.c:1344
#: builtin/rm.c:269
msgid "dry run"
msgstr "Probelauf"
-#: 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/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
+#: builtin/commit.c:1256 builtin/count-objects.c:95 builtin/fsck.c:612
#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113
msgid "be verbose"
msgstr "erweiterte Ausgaben"
-#: builtin/add.c:357
+#: builtin/add.c:251
msgid "interactive picking"
msgstr "interaktives Auswählen"
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
msgid "select hunks interactively"
msgstr "Blöcke interaktiv auswählen"
-#: builtin/add.c:359
+#: builtin/add.c:253
msgid "edit current diff and apply"
msgstr "aktuelle Unterschiede editieren und anwenden"
-#: builtin/add.c:360
+#: builtin/add.c:254
msgid "allow adding otherwise ignored files"
msgstr "erlaubt das Hinzufügen andernfalls ignorierter Dateien"
-#: builtin/add.c:361
+#: builtin/add.c:255
msgid "update tracked files"
msgstr "aktualisiert beobachtete Dateien"
-#: builtin/add.c:362
+#: builtin/add.c:256
msgid "record only the fact that the path will be added later"
msgstr "speichert nur, dass der Pfad später hinzugefügt werden soll"
-#: builtin/add.c:363
+#: builtin/add.c:257
msgid "add changes from all tracked and untracked files"
msgstr ""
"fügt Änderungen von allen beobachteten und unbeobachteten Dateien hinzu"
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
msgid "ignore paths removed in the working tree (same as --no-all)"
msgstr "ignoriert gelöschte Pfade im Arbeitsverzeichnis (genau wie --no-all)"
-#: builtin/add.c:368
+#: builtin/add.c:262
msgid "don't add, only refresh the index"
msgstr "fügt nichts hinzu, aktualisiert nur die Staging-Area"
-#: builtin/add.c:369
+#: builtin/add.c:263
msgid "just skip files which cannot be added because of errors"
msgstr ""
"überspringt Dateien, die aufgrund von Fehlern nicht hinzugefügt werden "
"konnten"
-#: builtin/add.c:370
+#: builtin/add.c:264
msgid "check if - even missing - files are ignored in dry run"
msgstr "prüft ob - auch fehlende - Dateien im Probelauf ignoriert werden"
-#: builtin/add.c:392
+#: builtin/add.c:286
#, c-format
msgid "Use -f if you really want to add them.\n"
msgstr "Verwenden Sie -f wenn Sie diese wirklich hinzufügen möchten.\n"
-#: builtin/add.c:393
+#: builtin/add.c:287
msgid "no files added"
msgstr "keine Dateien hinzugefügt"
-#: builtin/add.c:399
+#: builtin/add.c:293
msgid "adding files failed"
msgstr "Hinzufügen von Dateien fehlgeschlagen"
-#: builtin/add.c:438
+#: builtin/add.c:330
msgid "-A and -u are mutually incompatible"
msgstr "Die Optionen -A und -u sind zueinander inkompatibel."
-#: builtin/add.c:456
+#: builtin/add.c:337
msgid "Option --ignore-missing can only be used together with --dry-run"
msgstr ""
"Die Option --ignore-missing kann nur zusammen mit --dry-run verwendet werden."
-#: builtin/add.c:486
+#: builtin/add.c:358
#, c-format
msgid "Nothing specified, nothing added.\n"
msgstr "Nichts spezifiziert, nichts hinzugefügt.\n"
-#: builtin/add.c:487
+#: builtin/add.c:359
#, c-format
msgid "Maybe you wanted to say 'git add .'?\n"
msgstr "Wollten Sie vielleicht 'git add .' sagen?\n"
-#: 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
+#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:920
+#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 builtin/rm.c:299
msgid "index file corrupt"
msgstr "Staging-Area-Datei beschädigt"
-#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
msgid "Unable to write new index file"
msgstr "Konnte neue Staging-Area-Datei nicht schreiben."
@@ -2273,7 +2188,6 @@ msgstr "** Warnung: Datei %s wird leer, aber nicht entfernt."
msgid "corrupt binary patch at line %d: %.*s"
msgstr "fehlerhafter Binär-Patch bei Zeile %d: %.*s"
-#. there has to be one hunk (forward hunk)
#: builtin/apply.c:1900
#, c-format
msgid "unrecognized binary patch at line %d"
@@ -2416,7 +2330,7 @@ msgstr "%s: Patch konnte nicht angewendet werden"
msgid "Checking patch %s..."
msgstr "Prüfe Patch %s..."
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
#, c-format
msgid "make_cache_entry failed for path '%s'"
msgstr "make_cache_entry für Pfad '%s' fehlgeschlagen"
@@ -2465,7 +2379,6 @@ msgstr "Patch %s sauber angewendet"
msgid "internal error"
msgstr "interner Fehler"
-#. Say this even without --verbose
#: builtin/apply.c:4043
#, c-format
msgid "Applying patch %%s with %d reject..."
@@ -2570,7 +2483,7 @@ msgstr ""
"erstellt eine temporäre Staging-Area basierend auf den integrierten Staging-"
"Area-Informationen"
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
msgid "paths are separated with NUL character"
msgstr "Pfade sind getrennt durch NUL Zeichen"
@@ -2712,96 +2625,96 @@ msgstr "git blame [Optionen] [rev-opts] [rev] [--] Datei"
msgid "[rev-opts] are documented in git-rev-list(1)"
msgstr "[rev-opts] sind dokumentiert in git-rev-list(1)"
-#: builtin/blame.c:2249
+#: builtin/blame.c:2242
msgid "Show blame entries as we find them, incrementally"
msgstr "Zeigt \"blame\"-Einträge schrittweise, während wir sie generieren"
-#: builtin/blame.c:2250
+#: builtin/blame.c:2243
msgid "Show blank SHA-1 for boundary commits (Default: off)"
msgstr "Zeigt leere SHA-1 für Grenz-Commits (Standard: aus)"
-#: builtin/blame.c:2251
+#: builtin/blame.c:2244
msgid "Do not treat root commits as boundaries (Default: off)"
msgstr "Behandelt Ursprungs-Commit nicht als Grenzen (Standard: aus)"
-#: builtin/blame.c:2252
+#: builtin/blame.c:2245
msgid "Show work cost statistics"
msgstr "Zeigt Statistiken zum Arbeitsaufwand"
-#: builtin/blame.c:2253
+#: builtin/blame.c:2246
msgid "Show output score for blame entries"
msgstr "Zeigt Ausgabebewertung für \"blame\"-Einträge"
-#: builtin/blame.c:2254
+#: builtin/blame.c:2247
msgid "Show original filename (Default: auto)"
msgstr "Zeigt ursprünglichen Dateinamen (Standard: auto)"
-#: builtin/blame.c:2255
+#: builtin/blame.c:2248
msgid "Show original linenumber (Default: off)"
msgstr "Zeigt ursprüngliche Zeilennummer (Standard: aus)"
-#: builtin/blame.c:2256
+#: builtin/blame.c:2249
msgid "Show in a format designed for machine consumption"
msgstr "Anzeige in einem Format für maschinelle Auswertung"
-#: builtin/blame.c:2257
+#: builtin/blame.c:2250
msgid "Show porcelain format with per-line commit information"
msgstr ""
"Anzeige in Format für Fremdprogramme mit Commit-Informationen pro Zeile"
-#: builtin/blame.c:2258
+#: builtin/blame.c:2251
msgid "Use the same output mode as git-annotate (Default: off)"
msgstr "Benutzt den gleichen Ausgabemodus wie \"git-annotate\" (Standard: aus)"
-#: builtin/blame.c:2259
+#: builtin/blame.c:2252
msgid "Show raw timestamp (Default: off)"
msgstr "Zeigt unbearbeiteten Zeitstempel (Standard: aus)"
-#: builtin/blame.c:2260
+#: builtin/blame.c:2253
msgid "Show long commit SHA1 (Default: off)"
msgstr "Zeigt langen Commit-SHA1 (Standard: aus)"
-#: builtin/blame.c:2261
+#: builtin/blame.c:2254
msgid "Suppress author name and timestamp (Default: off)"
msgstr "Unterdrückt den Namen des Autors und den Zeitstempel (Standard: aus)"
-#: builtin/blame.c:2262
+#: builtin/blame.c:2255
msgid "Show author email instead of name (Default: off)"
msgstr "Zeigt anstatt des Namens die Email-Adresse des Autors (Standard: aus)"
-#: builtin/blame.c:2263
+#: builtin/blame.c:2256
msgid "Ignore whitespace differences"
msgstr "Ignoriert Unterschiede im Whitespace"
-#: builtin/blame.c:2264
+#: builtin/blame.c:2257
msgid "Spend extra cycles to find better match"
msgstr "arbeite länger, um bessere Übereinstimmungen zu finden"
-#: builtin/blame.c:2265
+#: builtin/blame.c:2258
msgid "Use revisions from <file> instead of calling git-rev-list"
msgstr "Benutzt Commits von <Datei> anstatt \"git-rev-list\" aufzurufen"
-#: builtin/blame.c:2266
+#: builtin/blame.c:2259
msgid "Use <file>'s contents as the final image"
msgstr "Benutzt Inhalte der <Datei>en als entgültiges Abbild"
-#: builtin/blame.c:2267 builtin/blame.c:2268
+#: builtin/blame.c:2260 builtin/blame.c:2261
msgid "score"
msgstr "Bewertung"
-#: builtin/blame.c:2267
+#: builtin/blame.c:2260
msgid "Find line copies within and across files"
msgstr "Findet kopierte Zeilen innerhalb oder zwischen Dateien"
-#: builtin/blame.c:2268
+#: builtin/blame.c:2261
msgid "Find line movements within and across files"
msgstr "Findet verschobene Zeilen innerhalb oder zwischen Dateien"
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
msgid "n,m"
msgstr "n,m"
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
msgid "Process only line range n,m, counting from 1"
msgstr "Verarbeitet nur Zeilen im Bereich n,m, gezählt von 1"
@@ -3048,8 +2961,9 @@ msgid "act on remote-tracking branches"
msgstr "wirkt auf Remote-Tracking-Branches"
#: 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
+#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
+#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
+#: builtin/tag.c:533
msgid "commit"
msgstr "Commit"
@@ -3239,45 +3153,45 @@ msgstr "Um ein Paket zu erstellen wird ein Repository benötigt."
msgid "Need a repository to unbundle."
msgstr "Zum Entpacken wird ein Repository benötigt."
-#: builtin/cat-file.c:328
+#: builtin/cat-file.c:331
msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
msgstr "git cat-file (-t|-s|-e|-p|<Art>|--textconv) <Objekt>"
-#: builtin/cat-file.c:329
+#: builtin/cat-file.c:332
msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
msgstr "git cat-file (--batch|--batch-check) < <Liste_von_Objekten>"
-#: builtin/cat-file.c:366
+#: builtin/cat-file.c:369
msgid "<type> can be one of: blob, tree, commit, tag"
msgstr "<Art> kann sein: blob, tree, commit, tag"
-#: builtin/cat-file.c:367
+#: builtin/cat-file.c:370
msgid "show object type"
msgstr "zeigt Objektart"
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
msgid "show object size"
msgstr "zeigt Objektgröße"
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
msgid "exit with zero when there's no error"
msgstr "beendet mit Rückgabewert 0, wenn kein Fehler aufgetreten ist"
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:374
msgid "pretty-print object's content"
msgstr "ansprechende Anzeige des Objektinhaltes"
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
msgid "for blob objects, run textconv on object's content"
msgstr "führt eine Textkonvertierung auf den Inhalt von Blob-Objekten aus"
-#: builtin/cat-file.c:375
+#: builtin/cat-file.c:378
msgid "show info and content of objects fed from the standard input"
msgstr ""
"Anzeige von Informationen und Inhalt von Objekten, gelesen von der Standard-"
"Eingabe"
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:381
msgid "show info about objects fed from the standard input"
msgstr ""
"Anzeige von Informationen über Objekte, gelesen von der Standard-Eingabe"
@@ -3307,7 +3221,7 @@ msgstr "liest Dateinamen von der Standard-Eingabe"
msgid "terminate input and output records by a NUL character"
msgstr "schließt Einträge von Ein- und Ausgabe mit NUL-Zeichen ab"
-#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
msgid "suppress progress reporting"
msgstr "unterdrückt Fortschrittsanzeige"
@@ -3463,60 +3377,59 @@ msgid "Cannot update paths and switch to branch '%s' at the same time."
msgstr ""
"Kann nicht gleichzeitig Pfade aktualisieren und zu Branch '%s' wechseln"
-#: builtin/checkout.c:261 builtin/checkout.c:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
msgid "corrupt index file"
msgstr "beschädigte Staging-Area-Datei"
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
#, c-format
msgid "path '%s' is unmerged"
msgstr "Pfad '%s' ist nicht zusammengeführt."
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
msgid "you need to resolve your current index first"
msgstr "Sie müssen zuerst Ihre aktuelle Staging-Area auflösen."
-#: builtin/checkout.c:594
+#: builtin/checkout.c:593
#, c-format
msgid "Can not do reflog for '%s'\n"
msgstr "Konnte \"reflog\" für '%s' nicht durchführen\n"
-#: builtin/checkout.c:632
+#: builtin/checkout.c:631
msgid "HEAD is now at"
msgstr "HEAD ist jetzt bei"
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
#, c-format
msgid "Reset branch '%s'\n"
msgstr "Setze Branch '%s' neu\n"
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
#, c-format
msgid "Already on '%s'\n"
msgstr "Bereits auf '%s'\n"
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
#, c-format
msgid "Switched to and reset branch '%s'\n"
msgstr "Gewechselt zu umgesetzten Branch '%s'\n"
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 builtin/checkout.c:1032
#, c-format
msgid "Switched to a new branch '%s'\n"
msgstr "Gewechselt zu einem neuem Branch '%s'\n"
-#: builtin/checkout.c:650
+#: builtin/checkout.c:649
#, c-format
msgid "Switched to branch '%s'\n"
msgstr "Gewechselt zu Branch '%s'\n"
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
#, c-format
msgid " ... and %d more.\n"
msgstr " ... und %d weitere.\n"
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
#, c-format
msgid ""
"Warning: you are leaving %d commit behind, not connected to\n"
@@ -3539,7 +3452,7 @@ msgstr[1] ""
"\n"
"%s\n"
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
#, c-format
msgid ""
"If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3554,140 +3467,139 @@ msgstr ""
" git branch neuer_branch_name %s\n"
"\n"
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
msgid "internal error in revision walk"
msgstr "interner Fehler im Revisionsgang"
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
msgid "Previous HEAD position was"
msgstr "Vorherige Position von HEAD war"
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
msgid "You are on a branch yet to be born"
msgstr "Sie sind auf einem Branch, der noch geboren wird"
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
#, c-format
msgid "only one reference expected, %d given."
msgstr "nur eine Referenz erwartet, %d gegeben."
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
#, c-format
msgid "invalid reference: %s"
msgstr "Ungültige Referenz: %s"
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
#, c-format
msgid "reference is not a tree: %s"
msgstr "Referenz ist kein \"Tree\"-Objekt: %s"
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
msgid "paths cannot be used with switching branches"
msgstr "Pfade können nicht beim Wechseln von Branches verwendet werden"
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
#, c-format
msgid "'%s' cannot be used with switching branches"
msgstr "'%s' kann nicht beim Wechseln von Branches verwendet werden"
-#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
#, c-format
msgid "'%s' cannot be used with '%s'"
msgstr "'%s' kann nicht mit '%s' verwendet werden"
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
#, c-format
msgid "Cannot switch branch to a non-commit '%s'"
msgstr "Kann Branch nicht zu Nicht-Commit '%s' wechseln"
-#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
#: builtin/remote.c:159 builtin/remote.c:161
msgid "branch"
msgstr "Branch"
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
msgid "create and checkout a new branch"
msgstr "erzeugt und checkt einen neuen Branch aus"
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
msgid "create/reset and checkout a branch"
msgstr "erzeugt/setzt um und checkt einen Branch aus"
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
msgid "create reflog for new branch"
msgstr "erzeugt das Reflog für den neuen Branch"
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
msgid "detach the HEAD at named commit"
msgstr "setzt HEAD zu benanntem Commit"
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
msgid "set upstream info for new branch"
msgstr "setzt Informationen zum Upstream-Branch für den neuen Branch"
-#: builtin/checkout.c:1099
-msgid "new branch"
+#: builtin/checkout.c:1098
+msgid "new-branch"
msgstr "neuer Branch"
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
msgid "new unparented branch"
msgstr "neuer Branch ohne Eltern-Commit"
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
msgid "checkout our version for unmerged files"
msgstr "checkt unsere Variante für nicht zusammengeführte Dateien aus"
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
msgid "checkout their version for unmerged files"
msgstr "checkt ihre Variante für nicht zusammengeführte Dateien aus"
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
msgid "force checkout (throw away local modifications)"
msgstr "erzwingt Auschecken (verwirft lokale Änderungen)"
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
msgid "perform a 3-way merge with the new branch"
msgstr "führt einen 3-Wege-Merge mit dem neuen Branch aus"
-#: builtin/checkout.c:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
msgid "update ignored files (default)"
msgstr "aktualisiert ignorierte Dateien (Standard)"
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
msgid "style"
msgstr "Stil"
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
msgid "conflict style (merge or diff3)"
msgstr "Konfliktstil (merge oder diff3)"
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
msgid "do not limit pathspecs to sparse entries only"
msgstr "Pfadspezifikationen ignorieren Einstellungen zum partiellen Auschecken"
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
msgid "second guess 'git checkout no-such-branch'"
msgstr "second guess 'git checkout no-such-branch'"
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
msgid "-b, -B and --orphan are mutually exclusive"
msgstr "Die Optionen -b, -B und --orphan schließen sich gegenseitig aus."
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
msgid "--track needs a branch name"
msgstr "Bei der Option --track muss ein Branchname angegeben werden."
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
msgid "Missing branch name; try -b"
msgstr "Vermisse Branchnamen; versuchen Sie -b"
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
msgid "invalid path specification"
msgstr "ungültige Pfadspezifikation"
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
#, c-format
msgid ""
"Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3697,12 +3609,12 @@ msgstr ""
"Haben Sie beabsichtigt '%s' auszuchecken, welcher nicht als Commit aufgelöst "
"werden kann?"
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1208
#, c-format
msgid "git checkout: --detach does not take a path argument '%s'"
msgstr "git checkout: --detach nimmt kein Pfad-Argument '%s'"
-#: builtin/checkout.c:1213
+#: builtin/checkout.c:1212
msgid ""
"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
"checking out of the index."
@@ -3741,7 +3653,7 @@ msgstr "Würde Repository %s überspringen\n"
msgid "failed to remove %s"
msgstr "Fehler beim Löschen von %s"
-#: builtin/clean.c:294
+#: builtin/clean.c:295
msgid ""
"Prompt help:\n"
"1 - select a numbered item\n"
@@ -3753,7 +3665,7 @@ msgstr ""
"foo - Element anhand eines eindeutigen Präfix auswählen\n"
" - (leer) nichts auswählen"
-#: builtin/clean.c:298
+#: builtin/clean.c:299
msgid ""
"Prompt help:\n"
"1 - select a single item\n"
@@ -3773,35 +3685,35 @@ msgstr ""
"* - alle Elemente auswählen\n"
" - (leer) Auswahl beenden"
-#: builtin/clean.c:516
+#: builtin/clean.c:517
#, c-format
msgid "Huh (%s)?"
msgstr "Wie bitte (%s)?"
-#: builtin/clean.c:659
+#: builtin/clean.c:660
#, c-format
msgid "Input ignore patterns>> "
msgstr "Ignorier-Muster eingeben>> "
-#: builtin/clean.c:696
+#: builtin/clean.c:697
#, c-format
msgid "WARNING: Cannot find items matched by: %s"
msgstr "WARNUNG: Kann keine Einträge finden die Muster entsprechen: %s"
-#: builtin/clean.c:717
+#: builtin/clean.c:718
msgid "Select items to delete"
msgstr "Wählen Sie Einträge zum Löschen"
-#: builtin/clean.c:757
+#: builtin/clean.c:758
#, c-format
msgid "remove %s? "
msgstr "'%s' löschen? "
-#: builtin/clean.c:782
+#: builtin/clean.c:783
msgid "Bye."
msgstr "Tschüss."
-#: builtin/clean.c:790
+#: builtin/clean.c:791
msgid ""
"clean - start cleaning\n"
"filter by pattern - exclude items from deletion\n"
@@ -3819,72 +3731,72 @@ msgstr ""
"help - diese Meldung anzeigen\n"
"? - Hilfe zur Auswahl mittels Eingabe anzeigen"
-#: builtin/clean.c:817
+#: builtin/clean.c:818
msgid "*** Commands ***"
msgstr "*** Kommandos ***"
-#: builtin/clean.c:818
+#: builtin/clean.c:819
msgid "What now"
msgstr "Was nun"
-#: builtin/clean.c:826
+#: builtin/clean.c:827
msgid "Would remove the following item:"
msgid_plural "Would remove the following items:"
msgstr[0] "Würde das folgende Element entfernen:"
msgstr[1] "Würde die folgenden Elemente entfernen:"
-#: builtin/clean.c:843
+#: builtin/clean.c:844
msgid "No more files to clean, exiting."
msgstr "Keine Dateien mehr zum Löschen, beende."
-#: builtin/clean.c:874
+#: builtin/clean.c:875
msgid "do not print names of files removed"
msgstr "gibt keine Namen von gelöschten Dateien aus"
-#: builtin/clean.c:876
+#: builtin/clean.c:877
msgid "force"
msgstr "erzwingt Aktion"
-#: builtin/clean.c:877
+#: builtin/clean.c:878
msgid "interactive cleaning"
msgstr "interaktives Clean"
-#: builtin/clean.c:879
+#: builtin/clean.c:880
msgid "remove whole directories"
msgstr "löscht ganze Verzeichnisse"
-#: 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
+#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
+#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
msgid "pattern"
msgstr "Muster"
-#: builtin/clean.c:881
+#: builtin/clean.c:882
msgid "add <pattern> to ignore rules"
msgstr "fügt <Muster> zu den Regeln für ignorierte Pfade hinzu"
-#: builtin/clean.c:882
+#: builtin/clean.c:883
msgid "remove ignored files, too"
msgstr "löscht auch ignorierte Dateien"
-#: builtin/clean.c:884
+#: builtin/clean.c:885
msgid "remove only ignored files"
msgstr "löscht nur ignorierte Dateien"
-#: builtin/clean.c:902
+#: builtin/clean.c:903
msgid "-x and -X cannot be used together"
msgstr "Die Optionen -x und -X können nicht gemeinsam verwendet werden."
-#: builtin/clean.c:906
+#: builtin/clean.c:907
msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
"clean"
msgstr ""
"clean.requireForce auf \"true\" gesetzt und weder -i, -n noch -f gegeben; "
"\"clean\" verweigert"
-#: builtin/clean.c:909
+#: builtin/clean.c:910
msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
"refusing to clean"
msgstr ""
"clean.requireForce standardmäßig auf \"true\" gesetzt und weder -i, -n noch -"
@@ -3895,7 +3807,7 @@ msgid "git clone [options] [--] <repo> [<dir>]"
msgstr "git clone [Optionen] [--] <Repository> [<Verzeichnis>]"
#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:521
+#: builtin/push.c:504
msgid "force progress reporting"
msgstr "erzwingt Fortschrittsanzeige"
@@ -3903,7 +3815,7 @@ msgstr "erzwingt Fortschrittsanzeige"
msgid "don't create a checkout"
msgstr "kein Auschecken"
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
msgid "create a bare repository"
msgstr "erstellt ein Bare-Repository"
@@ -3927,11 +3839,11 @@ msgstr "Einrichtung als verteiltes Repository"
msgid "initialize submodules in the clone"
msgstr "initialisiert Submodule im Klon"
-#: builtin/clone.c:82 builtin/init-db.c:485
+#: builtin/clone.c:82 builtin/init-db.c:483
msgid "template-directory"
msgstr "Vorlagenverzeichnis"
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
msgid "directory from which templates will be used"
msgstr "Verzeichnis, von welchem die Vorlagen verwendet werden"
@@ -3955,23 +3867,24 @@ msgstr "checkt <Branch> aus, anstatt HEAD des Remote-Repositories"
msgid "path to git-upload-pack on the remote"
msgstr "Pfad zu \"git-upload-pack\" auf der Gegenseite"
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
msgid "depth"
msgstr "Tiefe"
#: builtin/clone.c:93
msgid "create a shallow clone of that depth"
-msgstr "erstellt einen Klon mit unvollständiger Historie (shallow) in dieser Tiefe"
+msgstr ""
+"erstellt einen Klon mit unvollständiger Historie (shallow) in dieser Tiefe"
#: builtin/clone.c:95
msgid "clone only one branch, HEAD or --branch"
msgstr "klont nur einen Branch, HEAD oder --branch"
-#: builtin/clone.c:96 builtin/init-db.c:494
+#: builtin/clone.c:96 builtin/init-db.c:492
msgid "gitdir"
msgstr ".git-Verzeichnis"
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
msgid "separate git dir from working tree"
msgstr "separiert Git-Verzeichnis vom Arbeitsverzeichnis"
@@ -3991,12 +3904,15 @@ msgstr "Referenziertes Repository '%s' ist kein lokales Repository."
#: builtin/clone.c:256
#, c-format
msgid "reference repository '%s' is shallow"
-msgstr "Referenziertes Repository '%s' hat eine unvollständige Historie (shallow)."
+msgstr ""
+"Referenziertes Repository '%s' hat eine unvollständige Historie (shallow)."
#: builtin/clone.c:259
#, c-format
msgid "reference repository '%s' is grafted"
-msgstr "Referenziertes Repository '%s' ist mit künstlichen Vorgängern (\"grafts\") eingehängt."
+msgstr ""
+"Referenziertes Repository '%s' ist mit künstlichen Vorgängern (\"grafts\") "
+"eingehängt."
#: builtin/clone.c:321
#, c-format
@@ -4097,8 +4013,9 @@ msgstr ""
#: builtin/clone.c:805
msgid "source repository is shallow, ignoring --local"
-msgstr "Quelle ist ein Repository mit unvollständiger Historie (shallow),"
-"ignoriere --local"
+msgstr ""
+"Quelle ist ein Repository mit unvollständiger Historie (shallow),ignoriere --"
+"local"
#: builtin/clone.c:810
msgid "--local is ignored"
@@ -4264,68 +4181,68 @@ msgstr ""
"Benutzen Sie anschließend \"git cherry-pick --continue\", um die\n"
"Cherry-Pick-Operation mit den verbleibenden Commits fortzusetzen.\n"
-#: builtin/commit.c:287
+#: builtin/commit.c:288
msgid "failed to unpack HEAD tree object"
msgstr "Fehler beim Entpacken des \"Tree\"-Objektes von HEAD."
-#: builtin/commit.c:329
+#: builtin/commit.c:330
msgid "unable to create temporary index"
msgstr "Konnte temporäre Staging-Area nicht erstellen."
-#: builtin/commit.c:335
+#: builtin/commit.c:336
msgid "interactive add failed"
msgstr "interaktives Hinzufügen fehlgeschlagen"
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
msgid "unable to write new_index file"
msgstr "Konnte new_index Datei nicht schreiben"
-#: builtin/commit.c:420
+#: builtin/commit.c:421
msgid "cannot do a partial commit during a merge."
msgstr "Kann keinen Teil-Commit durchführen, während ein Merge im Gange ist."
-#: builtin/commit.c:422
+#: builtin/commit.c:423
msgid "cannot do a partial commit during a cherry-pick."
msgstr ""
"Kann keinen Teil-Commit durchführen, während \"cherry-pick\" im Gange ist."
-#: builtin/commit.c:432
+#: builtin/commit.c:433
msgid "cannot read the index"
msgstr "Kann Staging-Area nicht lesen"
-#: builtin/commit.c:452
+#: builtin/commit.c:453
msgid "unable to write temporary index file"
msgstr "Konnte temporäre Staging-Area-Datei nicht schreiben."
-#: builtin/commit.c:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
#, c-format
msgid "invalid commit: %s"
msgstr "Ungültiger Commit: %s"
-#: builtin/commit.c:571
+#: builtin/commit.c:572
msgid "malformed --author parameter"
msgstr "Fehlerhafter --author Parameter"
-#: builtin/commit.c:591
+#: builtin/commit.c:592
#, c-format
msgid "Malformed ident string: '%s'"
msgstr "Fehlerhafter Ident-String: '%s'"
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
#, c-format
msgid "could not lookup commit %s"
msgstr "Konnte Commit %s nicht nachschlagen"
-#: builtin/commit.c:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 builtin/shortlog.c:273
#, c-format
msgid "(reading log message from standard input)\n"
msgstr "(lese Log-Nachricht von Standard-Eingabe)\n"
-#: builtin/commit.c:644
+#: builtin/commit.c:643
msgid "could not read log from standard input"
msgstr "Konnte Log nicht von Standard-Eingabe lesen."
-#: builtin/commit.c:648
+#: builtin/commit.c:647
#, c-format
msgid "could not read log file '%s'"
msgstr "Konnte Log-Datei '%s' nicht lesen"
@@ -4351,7 +4268,7 @@ msgstr "Konnte '%s' nicht lesen"
msgid "could not write commit template"
msgstr "Konnte Commit-Vorlage nicht schreiben"
-#: builtin/commit.c:760
+#: builtin/commit.c:764
#, c-format
msgid ""
"\n"
@@ -4366,7 +4283,7 @@ msgstr ""
"\t%s\n"
"und versuchen Sie es erneut.\n"
-#: builtin/commit.c:765
+#: builtin/commit.c:769
#, c-format
msgid ""
"\n"
@@ -4381,7 +4298,7 @@ msgstr ""
"\t%s\n"
"und versuchen Sie es erneut.\n"
-#: builtin/commit.c:777
+#: builtin/commit.c:782
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
@@ -4391,7 +4308,7 @@ msgstr ""
"die mit '%c' beginnen, werden ignoriert, und eine leere Beschreibung\n"
"bricht den Commit ab.\n"
-#: builtin/commit.c:782
+#: builtin/commit.c:789
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
@@ -4404,152 +4321,150 @@ msgstr ""
"entfernen.\n"
"Eine leere Beschreibung bricht den Commit ab.\n"
-#: builtin/commit.c:795
+#: builtin/commit.c:802
#, c-format
msgid "%sAuthor: %s"
msgstr "%sAutor: %s"
-#: builtin/commit.c:802
+#: builtin/commit.c:809
#, c-format
msgid "%sCommitter: %s"
msgstr "%sCommit-Ersteller: %s"
-#: builtin/commit.c:822
+#: builtin/commit.c:829
msgid "Cannot read index"
msgstr "Kann Staging-Area nicht lesen"
-#: builtin/commit.c:865
+#: builtin/commit.c:872
msgid "Error building trees"
msgstr "Fehler beim Erzeugen der \"Tree\"-Objekte"
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
#, c-format
msgid "Please supply the message using either -m or -F option.\n"
msgstr ""
"Bitte liefern Sie eine Beschreibung entweder mit der Option -m oder -F.\n"
-#: builtin/commit.c:982
+#: builtin/commit.c:989
#, c-format
msgid "No existing author found with '%s'"
msgstr "Kein existierender Autor mit '%s' gefunden."
-#: builtin/commit.c:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
#, c-format
msgid "Invalid untracked files mode '%s'"
msgstr "Ungültiger Modus '%s' für unbeobachtete Dateien"
-#: builtin/commit.c:1034
+#: builtin/commit.c:1041
msgid "--long and -z are incompatible"
msgstr "Die Optionen --long und -z sind inkompatibel."
-#: builtin/commit.c:1064
+#: builtin/commit.c:1071
msgid "Using both --reset-author and --author does not make sense"
msgstr ""
"Die Optionen --reset-author und --author können nicht gemeinsam verwendet "
"werden."
-#: builtin/commit.c:1075
+#: builtin/commit.c:1080
msgid "You have nothing to amend."
msgstr "Sie haben nichts für \"--amend\"."
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
msgid "You are in the middle of a merge -- cannot amend."
msgstr "Ein Merge ist im Gange -- kann \"--amend\" nicht ausführen."
-#: builtin/commit.c:1080
+#: builtin/commit.c:1085
msgid "You are in the middle of a cherry-pick -- cannot amend."
msgstr "\"cherry-pick\" ist im Gange -- kann \"--amend\" nicht ausführen."
-#: builtin/commit.c:1083
+#: builtin/commit.c:1088
msgid "Options --squash and --fixup cannot be used together"
msgstr ""
"Die Optionen --squash und --fixup können nicht gemeinsam verwendet werden."
-#: builtin/commit.c:1093
+#: builtin/commit.c:1098
msgid "Only one of -c/-C/-F/--fixup can be used."
msgstr "Es kann nur eine Option von -c/-C/-F/--fixup verwendet werden."
-#: builtin/commit.c:1095
+#: builtin/commit.c:1100
msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
msgstr "Die Option -m kann nicht mit -c/-C/-F/--fixup kombiniert werden."
-#: builtin/commit.c:1103
+#: builtin/commit.c:1108
msgid "--reset-author can be used only with -C, -c or --amend."
msgstr ""
"Die Option --reset--author kann nur mit -C, -c oder --amend verwendet werden."
-#: builtin/commit.c:1120
+#: builtin/commit.c:1125
msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
msgstr ""
"Es kann nur eine Option von --include/--only/--all/--interactive/--patch "
"verwendet werden."
-#: builtin/commit.c:1122
+#: builtin/commit.c:1127
msgid "No paths with --include/--only does not make sense."
msgstr ""
"Die Optionen --include und --only können nur mit der Angabe von Pfaden "
"verwendet werden."
-#: builtin/commit.c:1124
+#: builtin/commit.c:1129
msgid "Clever... amending the last one with dirty index."
msgstr ""
"Klug... den letzten Commit mit einer geänderten Staging-Area nachbessern."
-#: builtin/commit.c:1126
-msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
-msgstr ""
-"Explizite Pfade ohne -i oder -o angegeben; unter der Annahme von --only "
-"Pfaden..."
+#: builtin/commit.c:1131
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
+msgstr "Explizite Pfade ohne -i oder -o angegeben; nehme --only an"
-#: builtin/commit.c:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
#, c-format
msgid "Invalid cleanup mode %s"
msgstr "Ungültiger \"cleanup\" Modus %s"
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
msgid "Paths with -a does not make sense."
msgstr "Die Option -a kann nur mit der Angabe von Pfaden verwendet werden."
-#: builtin/commit.c:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
msgid "show status concisely"
msgstr "zeigt Status im Kurzformat"
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
msgid "show branch information"
msgstr "zeigt Branchinformationen"
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
msgid "machine-readable output"
msgstr "maschinenlesbare Ausgabe"
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
msgid "show status in long format (default)"
msgstr "zeigt Status im Langformat (Standard)"
-#: builtin/commit.c:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
msgid "terminate entries with NUL"
msgstr "schließt Einträge mit NUL-Zeichen ab"
-#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:459
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
msgid "mode"
msgstr "Modus"
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
msgstr ""
"zeigt nicht beobachtete Dateien, optionale Modi: all, normal, no. (Standard: "
"all)"
-#: builtin/commit.c:1267
+#: builtin/commit.c:1274
msgid "show ignored files"
msgstr "zeigt ignorierte Dateien"
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
msgid "when"
msgstr "wann"
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
msgid ""
"ignore changes to submodules, optional when: all, dirty, untracked. "
"(Default: all)"
@@ -4557,219 +4472,219 @@ msgstr ""
"ignoriert Änderungen in Submodulen, optional wenn: all, dirty, untracked. "
"(Standard: all)"
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
msgid "list untracked files in columns"
msgstr "listet unbeobachtete Dateien in Spalten auf"
-#: builtin/commit.c:1340
+#: builtin/commit.c:1347
msgid "couldn't look up newly created commit"
msgstr "Konnte neu erstellten Commit nicht nachschlagen."
-#: builtin/commit.c:1342
+#: builtin/commit.c:1349
msgid "could not parse newly created commit"
msgstr "Konnte neulich erstellten Commit nicht analysieren."
-#: builtin/commit.c:1383
+#: builtin/commit.c:1390
msgid "detached HEAD"
msgstr "losgelöster HEAD"
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
msgid " (root-commit)"
msgstr " (Basis-Commit)"
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
msgid "suppress summary after successful commit"
msgstr "unterdrückt Zusammenfassung nach erfolgreichem Commit"
-#: builtin/commit.c:1453
+#: builtin/commit.c:1487
msgid "show diff in commit message template"
msgstr "zeigt Unterschiede in Commit-Beschreibungsvorlage an"
-#: builtin/commit.c:1455
+#: builtin/commit.c:1489
msgid "Commit message options"
msgstr "Optionen für Commit-Beschreibung"
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
msgid "read message from file"
msgstr "liest Beschreibung von Datei"
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "author"
msgstr "Autor"
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "override author for commit"
msgstr "überschreibt Autor eines Commits"
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
msgid "date"
msgstr "Datum"
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
msgid "override date for commit"
msgstr "überschreibt Datum eines Commits"
-#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405
-#: builtin/notes.c:562 builtin/tag.c:455
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
msgid "message"
msgstr "Beschreibung"
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
msgid "commit message"
msgstr "Commit-Beschreibung"
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
msgid "reuse and edit message from specified commit"
msgstr "verwendet wieder und editiert Beschreibung des angegebenen Commits"
-#: builtin/commit.c:1461
+#: builtin/commit.c:1495
msgid "reuse message from specified commit"
msgstr "verwendet Beschreibung des angegebenen Commits wieder"
-#: builtin/commit.c:1462
+#: builtin/commit.c:1496
msgid "use autosquash formatted message to fixup specified commit"
msgstr ""
"verwendet eine automatisch zusammengesetzte Beschreibung zum Nachbessern des "
"angegebenen Commits"
-#: builtin/commit.c:1463
+#: builtin/commit.c:1497
msgid "use autosquash formatted message to squash specified commit"
msgstr ""
"verwendet eine automatisch zusammengesetzte Beschreibung beim \"squash\" des "
"angegebenen Commits"
-#: builtin/commit.c:1464
+#: builtin/commit.c:1498
msgid "the commit is authored by me now (used with -C/-c/--amend)"
msgstr "Setzt Sie als Autor des Commits (verwendet mit -C/-c/--amend)"
-#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
msgid "add Signed-off-by:"
msgstr "fügt 'Signed-off-by:'-Zeile hinzu"
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
msgid "use specified template file"
msgstr "verwendet angegebene Vorlagendatei"
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
msgid "force edit of commit"
msgstr "erzwingt Bearbeitung des Commits"
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
msgid "default"
msgstr "Standard"
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
msgid "how to strip spaces and #comments from message"
msgstr ""
"wie Leerzeichen und #Kommentare von der Beschreibung getrennt werden sollen"
-#: builtin/commit.c:1469
+#: builtin/commit.c:1503
msgid "include status in commit message template"
msgstr "fügt Status in die Commit-Beschreibungsvorlage ein"
-#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
-msgstr "Schlüssel-ID"
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
+msgstr "GPG-Schlüsselkennung"
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
msgid "GPG sign commit"
msgstr "signiert Commit mit GPG"
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
msgid "Commit contents options"
msgstr "Optionen für Commit-Inhalt"
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
msgid "commit all changed files"
msgstr "committet alle geänderten Dateien"
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
msgid "add specified files to index for commit"
msgstr "merkt die angegebenen Dateien zusätzlich zum Commit vor"
-#: builtin/commit.c:1477
+#: builtin/commit.c:1511
msgid "interactively add files"
msgstr "interaktives Hinzufügen von Dateien"
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
msgid "interactively add changes"
msgstr "interaktives Hinzufügen von Änderungen"
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
msgid "commit only specified files"
msgstr "committet nur die angegebenen Dateien"
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
msgid "bypass pre-commit hook"
msgstr "umgeht \"pre-commit hook\""
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
msgid "show what would be committed"
msgstr "zeigt an, was committet werden würde"
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
msgid "amend previous commit"
msgstr "ändert vorherigen Commit"
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
msgid "bypass post-rewrite hook"
msgstr "umgeht \"post-rewrite hook\""
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
msgid "ok to record an empty change"
msgstr "erlaubt Aufzeichnung einer leeren Änderung"
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
msgid "ok to record a change with an empty message"
msgstr "erlaubt Aufzeichnung einer Änderung mit einer leeren Beschreibung"
-#: builtin/commit.c:1529
+#: builtin/commit.c:1562
msgid "could not parse HEAD commit"
msgstr "Konnte Commit von HEAD nicht analysieren."
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 builtin/merge.c:518
#, c-format
msgid "could not open '%s' for reading"
msgstr "Konnte '%s' nicht zum Lesen öffnen."
-#: builtin/commit.c:1574
+#: builtin/commit.c:1608
#, c-format
msgid "Corrupt MERGE_HEAD file (%s)"
msgstr "Beschädigte MERGE_HEAD-Datei (%s)"
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
msgid "could not read MERGE_MODE"
msgstr "Konnte MERGE_MODE nicht lesen"
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
#, c-format
msgid "could not read commit message: %s"
msgstr "Konnte Commit-Beschreibung nicht lesen: %s"
-#: builtin/commit.c:1611
+#: builtin/commit.c:1645
#, c-format
msgid "Aborting commit; you did not edit the message.\n"
msgstr "Commit abgebrochen; Sie haben die Beschreibung nicht editiert.\n"
-#: builtin/commit.c:1616
+#: builtin/commit.c:1650
#, c-format
msgid "Aborting commit due to empty commit message.\n"
msgstr "Commit aufgrund leerer Beschreibung abgebrochen.\n"
-#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
msgid "failed to write commit object"
msgstr "Fehler beim Schreiben des Commit-Objektes."
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
msgid "cannot lock HEAD ref"
msgstr "Kann Referenz von HEAD nicht sperren."
-#: builtin/commit.c:1656
+#: builtin/commit.c:1690
msgid "cannot update HEAD ref"
msgstr "Kann Referenz von HEAD nicht aktualisieren."
-#: builtin/commit.c:1667
+#: builtin/commit.c:1701
msgid ""
"Repository has been updated, but unable to write\n"
"new_index file. Check that disk is not full or quota is\n"
@@ -4784,127 +4699,127 @@ msgstr ""
msgid "git config [options]"
msgstr "git config [Optionen]"
-#: builtin/config.c:54
+#: builtin/config.c:53
msgid "Config file location"
msgstr "Ort der Konfigurationsdatei"
-#: builtin/config.c:55
+#: builtin/config.c:54
msgid "use global config file"
msgstr "verwendet globale Konfigurationsdatei"
-#: builtin/config.c:56
+#: builtin/config.c:55
msgid "use system config file"
msgstr "verwendet systemweite Konfigurationsdatei"
-#: builtin/config.c:57
+#: builtin/config.c:56
msgid "use repository config file"
msgstr "verwendet Konfigurationsdatei des Repositories"
-#: builtin/config.c:58
+#: builtin/config.c:57
msgid "use given config file"
msgstr "verwendet die angegebene Konfigurationsdatei"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "blob-id"
msgstr "Blob-Id"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "read config from given blob object"
msgstr "liest Konfiguration von angegebenem Blob-Objekt"
-#: builtin/config.c:60
+#: builtin/config.c:59
msgid "Action"
msgstr "Aktion"
-#: builtin/config.c:61
+#: builtin/config.c:60
msgid "get value: name [value-regex]"
msgstr "gibt Wert zurück: Name [Wert-regex]"
-#: builtin/config.c:62
+#: builtin/config.c:61
msgid "get all values: key [value-regex]"
msgstr "gibt alle Werte zurück: Schlüssel [Wert-regex]"
-#: builtin/config.c:63
+#: builtin/config.c:62
msgid "get values for regexp: name-regex [value-regex]"
msgstr "gibt Werte für den regulären Ausdruck zurück: Name-regex [Wert-regex]"
-#: builtin/config.c:64
+#: builtin/config.c:63
msgid "get value specific for the URL: section[.var] URL"
msgstr "gibt Wert spezifisch für eine URL zurück: section[.var] URL"
-#: builtin/config.c:65
+#: builtin/config.c:64
msgid "replace all matching variables: name value [value_regex]"
msgstr "ersetzt alle passenden Variablen: Name Wert [Wert-regex] "
-#: builtin/config.c:66
+#: builtin/config.c:65
msgid "add a new variable: name value"
msgstr "fügt neue Variable hinzu: Name Wert"
-#: builtin/config.c:67
+#: builtin/config.c:66
msgid "remove a variable: name [value-regex]"
msgstr "entfernt eine Variable: Name [Wert-regex]"
-#: builtin/config.c:68
+#: builtin/config.c:67
msgid "remove all matches: name [value-regex]"
msgstr "entfernt alle Ãœbereinstimmungen: Name [Wert-regex]"
-#: builtin/config.c:69
+#: builtin/config.c:68
msgid "rename section: old-name new-name"
msgstr "benennt eine Sektion um: alter-Name neuer-Name"
-#: builtin/config.c:70
+#: builtin/config.c:69
msgid "remove a section: name"
msgstr "entfernt eine Sektion: Name"
-#: builtin/config.c:71
+#: builtin/config.c:70
msgid "list all"
msgstr "listet alles auf"
-#: builtin/config.c:72
+#: builtin/config.c:71
msgid "open an editor"
msgstr "öffnet einen Editor"
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
msgid "slot"
msgstr "Slot"
-#: builtin/config.c:73
+#: builtin/config.c:72
msgid "find the color configured: [default]"
msgstr "findet die konfigurierte Farbe: [Standard]"
-#: builtin/config.c:74
+#: builtin/config.c:73
msgid "find the color setting: [stdout-is-tty]"
msgstr "findet die Farbeinstellung: [Standard-Ausgabe-ist-Terminal]"
-#: builtin/config.c:75
+#: builtin/config.c:74
msgid "Type"
msgstr "Typ"
-#: builtin/config.c:76
+#: builtin/config.c:75
msgid "value is \"true\" or \"false\""
msgstr "Wert ist \"true\" oder \"false\""
-#: builtin/config.c:77
+#: builtin/config.c:76
msgid "value is decimal number"
msgstr "Wert ist eine Dezimalzahl"
-#: builtin/config.c:78
+#: builtin/config.c:77
msgid "value is --bool or --int"
msgstr "Wert ist --bool oder --int"
-#: builtin/config.c:79
+#: builtin/config.c:78
msgid "value is a path (file or directory name)"
msgstr "Wert ist ein Pfad (Datei oder Verzeichnisname)"
-#: builtin/config.c:80
+#: builtin/config.c:79
msgid "Other"
msgstr "Sonstiges"
-#: builtin/config.c:81
+#: builtin/config.c:80
msgid "terminate values with NUL byte"
msgstr "schließt Werte mit NUL-Byte ab"
-#: builtin/config.c:82
+#: builtin/config.c:81
msgid "respect include directives on lookup"
msgstr "beachtet \"include\"-Direktiven beim Nachschlagen"
@@ -4924,47 +4839,47 @@ msgstr "git describe [Optionen] <commit-ish>*"
msgid "git describe [options] --dirty"
msgstr "git describe [Optionen] --dirty"
-#: builtin/describe.c:237
+#: builtin/describe.c:225
#, c-format
msgid "annotated tag %s not available"
msgstr "annotiertes Tag %s ist nicht verfügbar"
-#: builtin/describe.c:241
+#: builtin/describe.c:229
#, c-format
msgid "annotated tag %s has no embedded name"
msgstr "annotiertes Tag %s hat keinen eingebetteten Namen"
-#: builtin/describe.c:243
+#: builtin/describe.c:231
#, c-format
msgid "tag '%s' is really '%s' here"
msgstr "Tag '%s' ist eigentlich '%s' hier"
-#: builtin/describe.c:270
+#: builtin/describe.c:258
#, c-format
msgid "Not a valid object name %s"
msgstr "%s ist kein gültiger Objekt-Name"
-#: builtin/describe.c:273
+#: builtin/describe.c:261
#, c-format
msgid "%s is not a valid '%s' object"
msgstr "%s ist kein gültiges '%s' Objekt"
-#: builtin/describe.c:290
+#: builtin/describe.c:278
#, c-format
msgid "no tag exactly matches '%s'"
msgstr "kein Tag entspricht exakt '%s'"
-#: builtin/describe.c:292
+#: builtin/describe.c:280
#, c-format
msgid "searching to describe %s\n"
msgstr "suche zur Beschreibung von %s\n"
-#: builtin/describe.c:332
+#: builtin/describe.c:327
#, c-format
msgid "finished search at %s\n"
msgstr "beendete Suche bei %s\n"
-#: builtin/describe.c:359
+#: builtin/describe.c:354
#, c-format
msgid ""
"No annotated tags can describe '%s'.\n"
@@ -4973,7 +4888,7 @@ msgstr ""
"Keine annotierten Tags können '%s' beschreiben.\n"
"Jedoch gab es nicht-annotierte Tags: versuchen Sie --tags."
-#: builtin/describe.c:363
+#: builtin/describe.c:358
#, c-format
msgid ""
"No tags can describe '%s'.\n"
@@ -4982,12 +4897,12 @@ msgstr ""
"Keine Tags können '%s' beschreiben.\n"
"Versuchen Sie --always oder erstellen Sie einige Tags."
-#: builtin/describe.c:384
+#: builtin/describe.c:379
#, c-format
msgid "traversed %lu commits\n"
msgstr "%lu Commits durchlaufen\n"
-#: builtin/describe.c:387
+#: builtin/describe.c:382
#, c-format
msgid ""
"more than %i tags found; listed %i most recent\n"
@@ -4996,65 +4911,65 @@ msgstr ""
"mehr als %i Tags gefunden; Führe die ersten %i auf\n"
"Suche bei %s aufgegeben\n"
-#: builtin/describe.c:409
+#: builtin/describe.c:404
msgid "find the tag that comes after the commit"
msgstr "findet das Tag, das nach Commit kommt"
-#: builtin/describe.c:410
+#: builtin/describe.c:405
msgid "debug search strategy on stderr"
msgstr "protokolliert die Suchstrategie in der Standard-Fehlerausgabe"
-#: builtin/describe.c:411
+#: builtin/describe.c:406
msgid "use any ref"
msgstr "verwendet alle Referenzen"
-#: builtin/describe.c:412
+#: builtin/describe.c:407
msgid "use any tag, even unannotated"
msgstr "verwendet jedes Tag, auch nicht-annotierte"
-#: builtin/describe.c:413
+#: builtin/describe.c:408
msgid "always use long format"
msgstr "verwendet immer langes Format"
-#: builtin/describe.c:414
+#: builtin/describe.c:409
msgid "only follow first parent"
msgstr "folgt nur erstem Elternteil"
-#: builtin/describe.c:417
+#: builtin/describe.c:412
msgid "only output exact matches"
msgstr "gibt nur exakte Ãœbereinstimmungen aus"
-#: builtin/describe.c:419
+#: builtin/describe.c:414
msgid "consider <n> most recent tags (default: 10)"
msgstr "betrachtet die jüngsten <n> Tags (Standard: 10)"
-#: builtin/describe.c:421
+#: builtin/describe.c:416
msgid "only consider tags matching <pattern>"
msgstr "betrachtet nur Tags die <Muster> entsprechen"
-#: builtin/describe.c:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
msgid "show abbreviated commit object as fallback"
msgstr "zeigt gekürztes Commit-Objekt, wenn sonst nichts zutrifft"
-#: builtin/describe.c:424
+#: builtin/describe.c:419
msgid "mark"
msgstr "Kennzeichen"
-#: builtin/describe.c:425
+#: builtin/describe.c:420
msgid "append <mark> on dirty working tree (default: \"-dirty\")"
msgstr ""
"fügt <Kennzeichen> bei geändertem Arbeitsverzeichnis hinzu (Standard: \"-"
"dirty\")"
-#: builtin/describe.c:443
+#: builtin/describe.c:438
msgid "--long is incompatible with --abbrev=0"
msgstr "Die Optionen --long und --abbrev=0 sind inkompatibel."
-#: builtin/describe.c:469
+#: builtin/describe.c:464
msgid "No names found, cannot describe anything."
msgstr "Keine Namen gefunden, kann nichts beschreiben."
-#: builtin/describe.c:489
+#: builtin/describe.c:484
msgid "--dirty is incompatible with commit-ishes"
msgstr "Die Option --dirty kann nicht mit Commits verwendet werden."
@@ -5195,7 +5110,8 @@ msgstr "erlaubt Aktualisierung der \"HEAD\"-Referenz"
#: builtin/fetch.c:99
msgid "deepen history of shallow clone"
-msgstr "vertieft die Historie eines Klons mit unvollständiger Historie (shallow)"
+msgstr ""
+"vertieft die Historie eines Klons mit unvollständiger Historie (shallow)"
#: builtin/fetch.c:101
msgid "convert to a complete repository"
@@ -5285,8 +5201,9 @@ msgstr "%s hat nicht alle erforderlichen Objekte gesendet\n"
#: builtin/fetch.c:579
#, c-format
msgid "reject %s because shallow roots are not allowed to be updated"
-msgstr "%s wurde zurückgewiesen, da Ursprungs-Commits von Repositories"
-"mit unvollständiger Historie (shallow) nicht aktualisiert werden dürfen."
+msgstr ""
+"%s wurde zurückgewiesen, da Ursprungs-Commits von Repositoriesmit "
+"unvollständiger Historie (shallow) nicht aktualisiert werden dürfen."
#: builtin/fetch.c:667 builtin/fetch.c:750
#, c-format
@@ -5352,7 +5269,7 @@ msgstr "Fordere an von %s\n"
msgid "Could not fetch %s"
msgstr "Konnte nicht von %s anfordern"
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
msgid ""
"No remote repository specified. Please, specify either a URL or a\n"
"remote name from which new revisions should be fetched."
@@ -5373,8 +5290,8 @@ msgstr ""
#: builtin/fetch.c:1109
msgid "--unshallow on a complete repository does not make sense"
msgstr ""
-"Die Option --unshallow kann nicht in einem Repository mit unvollständiger Historie "
-"verwendet werden."
+"Die Option --unshallow kann nicht in einem Repository mit unvollständiger "
+"Historie verwendet werden."
#: builtin/fetch.c:1132
msgid "fetch --all does not take a repository argument"
@@ -5400,10 +5317,10 @@ msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
msgstr ""
"git fmt-merge-msg [-m <Beschreibung>] [--log[=<n>]|--no-log] [--file <Datei>]"
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702
-#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446
-#: parse-options.h:135 parse-options.h:242
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
+#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: parse-options.h:132 parse-options.h:239
msgid "n"
msgstr "Anzahl"
@@ -5467,6 +5384,14 @@ msgstr "Schüssel"
msgid "field name to sort on"
msgstr "sortiere nach diesem Feld"
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr "Prüfe Konnektivität"
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr "Prüfe Objekt-Verzeichnisse"
+
#: builtin/fsck.c:607
msgid "git fsck [options] [<object>...]"
msgstr "git fsck [Optionen] [<Objekt>...]"
@@ -5511,50 +5436,62 @@ msgstr "schreibt unreferenzierte Objekte nach .git/lost-found"
msgid "show progress"
msgstr "zeigt Fortschrittsanzeige"
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr "Prüfe Objekte"
+
#: builtin/gc.c:24
msgid "git gc [options]"
msgstr "git gc [Optionen]"
-#: builtin/gc.c:80
+#: builtin/gc.c:90
#, c-format
msgid "Invalid %s: '%s'"
msgstr "Ungültiger %s: '%s'"
-#: builtin/gc.c:107
+#: builtin/gc.c:117
#, c-format
msgid "insanely long object directory %.*s"
msgstr "zu langes Objekt-Verzeichnis %.*s"
-#: builtin/gc.c:262
+#: builtin/gc.c:273
msgid "prune unreferenced objects"
msgstr "entfernt unreferenzierte Objekte"
-#: builtin/gc.c:264
+#: builtin/gc.c:275
msgid "be more thorough (increased runtime)"
msgstr "mehr Gründlichkeit (erhöht Laufzeit)"
-#: builtin/gc.c:265
+#: builtin/gc.c:276
msgid "enable auto-gc mode"
msgstr "aktiviert \"auto-gc\" Modus"
-#: builtin/gc.c:266
+#: builtin/gc.c:277
msgid "force running gc even if there may be another gc running"
msgstr ""
"erzwingt Ausführung von \"git gc\" selbst wenn ein anderes\n"
"\"git gc\" bereits ausgeführt wird"
-#: builtin/gc.c:306
+#: builtin/gc.c:318
#, 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"
+msgid "Auto packing the repository in background for optimum performance.\n"
+msgstr ""
+"Die Datenbank des Repositories wird für eine optimale Performance im\n"
+"Hintergrund komprimiert.\n"
+
+#: builtin/gc.c:320
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
msgstr ""
-"Die Datenbank des Repositories wird für eine optimale Performance\n"
-"komprimiert. Sie können auch \"git gc\" manuell ausführen.\n"
-"Siehe \"git help gc\" für weitere Informationen.\n"
+"Die Datenbank des Projektarchivs wird für eine optimale Performance "
+"komprimiert.\n"
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:321
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
+msgstr "Siehe \"git help gc\" für manuelles Aufräumen.\n"
+
+#: builtin/gc.c:336
#, c-format
msgid ""
"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5562,7 +5499,7 @@ msgstr ""
"\"git gc\" wird bereits auf Maschine '%s' pid %<PRIuMAX> ausgeführt\n"
"(benutzen Sie --force falls nicht)"
-#: builtin/gc.c:341
+#: builtin/gc.c:361
msgid ""
"There are too many unreachable loose objects; run 'git prune' to remove them."
msgstr ""
@@ -5593,220 +5530,220 @@ msgstr "konnte \"Tree\"-Objekt (%s) nicht lesen"
msgid "unable to grep from object of type %s"
msgstr "kann \"grep\" nicht mit Objekten des Typs %s durchführen"
-#: builtin/grep.c:551
+#: builtin/grep.c:549
#, c-format
msgid "switch `%c' expects a numerical value"
msgstr "Schalter '%c' erwartet einen numerischen Wert"
-#: builtin/grep.c:568
+#: builtin/grep.c:566
#, c-format
msgid "cannot open '%s'"
msgstr "kann '%s' nicht öffnen"
-#: builtin/grep.c:642
+#: builtin/grep.c:640
msgid "search in index instead of in the work tree"
msgstr "sucht in der Staging-Area anstatt im Arbeitsverzeichnis"
-#: builtin/grep.c:644
+#: builtin/grep.c:642
msgid "find in contents not managed by git"
msgstr "findet auch in Inhalten, die nicht von Git verwaltet werden"
-#: builtin/grep.c:646
+#: builtin/grep.c:644
msgid "search in both tracked and untracked files"
msgstr "sucht in beobachteten und unbeobachteten Dateien"
-#: builtin/grep.c:648
+#: builtin/grep.c:646
msgid "search also in ignored files"
msgstr "sucht auch in ignorierten Dateien"
-#: builtin/grep.c:651
+#: builtin/grep.c:649
msgid "show non-matching lines"
msgstr "zeigt Zeilen ohne Ãœbereinstimmungen"
-#: builtin/grep.c:653
+#: builtin/grep.c:651
msgid "case insensitive matching"
msgstr "findet Übereinstimmungen unabhängig von Groß- und Kleinschreibung"
-#: builtin/grep.c:655
+#: builtin/grep.c:653
msgid "match patterns only at word boundaries"
msgstr "sucht nur ganze Wörter"
-#: builtin/grep.c:657
+#: builtin/grep.c:655
msgid "process binary files as text"
msgstr "verarbeitet binäre Dateien als Text"
-#: builtin/grep.c:659
+#: builtin/grep.c:657
msgid "don't match patterns in binary files"
msgstr "findet keine Muster in Binärdateien"
-#: builtin/grep.c:662
+#: builtin/grep.c:660
msgid "process binary files with textconv filters"
msgstr "verarbeitet binäre Dateien mit \"textconv\"-Filtern"
-#: builtin/grep.c:664
+#: builtin/grep.c:662
msgid "descend at most <depth> levels"
msgstr "durchläuft höchstens <Tiefe> Ebenen"
-#: builtin/grep.c:668
+#: builtin/grep.c:666
msgid "use extended POSIX regular expressions"
msgstr "verwendet erweiterte reguläre Ausdrücke aus POSIX"
-#: builtin/grep.c:671
+#: builtin/grep.c:669
msgid "use basic POSIX regular expressions (default)"
msgstr "verwendet grundlegende reguläre Ausdrücke aus POSIX (Standard)"
-#: builtin/grep.c:674
+#: builtin/grep.c:672
msgid "interpret patterns as fixed strings"
msgstr "interpretiert Muster als feste Zeichenketten"
-#: builtin/grep.c:677
+#: builtin/grep.c:675
msgid "use Perl-compatible regular expressions"
msgstr "verwendet Perl-kompatible reguläre Ausdrücke"
-#: builtin/grep.c:680
+#: builtin/grep.c:678
msgid "show line numbers"
msgstr "zeigt Zeilennummern"
-#: builtin/grep.c:681
+#: builtin/grep.c:679
msgid "don't show filenames"
msgstr "zeigt keine Dateinamen"
-#: builtin/grep.c:682
+#: builtin/grep.c:680
msgid "show filenames"
msgstr "zeigt Dateinamen"
-#: builtin/grep.c:684
+#: builtin/grep.c:682
msgid "show filenames relative to top directory"
msgstr "zeigt Dateinamen relativ zum Projektverzeichnis"
-#: builtin/grep.c:686
+#: builtin/grep.c:684
msgid "show only filenames instead of matching lines"
msgstr "zeigt nur Dateinamen anstatt übereinstimmende Zeilen"
-#: builtin/grep.c:688
+#: builtin/grep.c:686
msgid "synonym for --files-with-matches"
msgstr "Synonym für --files-with-matches"
-#: builtin/grep.c:691
+#: builtin/grep.c:689
msgid "show only the names of files without match"
msgstr "zeigt nur die Dateinamen ohne Ãœbereinstimmungen"
-#: builtin/grep.c:693
+#: builtin/grep.c:691
msgid "print NUL after filenames"
msgstr "gibt NUL-Zeichen nach Dateinamen aus"
-#: builtin/grep.c:695
+#: builtin/grep.c:693
msgid "show the number of matches instead of matching lines"
msgstr "zeigt, anstatt der Zeilen, die Anzahl der übereinstimmenden Zeilen"
-#: builtin/grep.c:696
+#: builtin/grep.c:694
msgid "highlight matches"
msgstr "hebt Ãœbereinstimmungen hervor"
-#: builtin/grep.c:698
+#: builtin/grep.c:696
msgid "print empty line between matches from different files"
msgstr ""
"gibt eine Leerzeile zwischen Ãœbereinstimmungen in verschiedenen Dateien aus"
-#: builtin/grep.c:700
+#: builtin/grep.c:698
msgid "show filename only once above matches from same file"
msgstr ""
"zeigt den Dateinamen nur einmal oberhalb der Ãœbereinstimmungen aus dieser "
"Datei an"
-#: builtin/grep.c:703
+#: builtin/grep.c:701
msgid "show <n> context lines before and after matches"
msgstr "zeigt <n> Zeilen vor und nach den Ãœbereinstimmungen an"
-#: builtin/grep.c:706
+#: builtin/grep.c:704
msgid "show <n> context lines before matches"
msgstr "zeigt <n> Zeilen vor den Ãœbereinstimmungen an"
-#: builtin/grep.c:708
+#: builtin/grep.c:706
msgid "show <n> context lines after matches"
msgstr "zeigt <n> Zeilen nach den Ãœbereinstimmungen an"
-#: builtin/grep.c:709
+#: builtin/grep.c:707
msgid "shortcut for -C NUM"
msgstr "Kurzform für -C NUM"
-#: builtin/grep.c:712
+#: builtin/grep.c:710
msgid "show a line with the function name before matches"
msgstr "zeigt eine Zeile mit dem Funktionsnamen vor Ãœbereinstimmungen an"
-#: builtin/grep.c:714
+#: builtin/grep.c:712
msgid "show the surrounding function"
msgstr "zeigt die umgebende Funktion an"
-#: builtin/grep.c:717
+#: builtin/grep.c:715
msgid "read patterns from file"
msgstr "liest Muster von einer Datei"
-#: builtin/grep.c:719
+#: builtin/grep.c:717
msgid "match <pattern>"
msgstr "findet <Muster>"
-#: builtin/grep.c:721
+#: builtin/grep.c:719
msgid "combine patterns specified with -e"
msgstr "kombiniert Muster, die mit -e angegeben wurden"
-#: builtin/grep.c:733
+#: builtin/grep.c:731
msgid "indicate hit with exit status without output"
msgstr "zeigt Ãœbereinstimmungen nur durch Beendigungsstatus an"
-#: builtin/grep.c:735
+#: builtin/grep.c:733
msgid "show only matches from files that match all patterns"
msgstr "zeigt nur Ãœbereinstimmungen von Dateien, die allen Mustern entsprechen"
-#: builtin/grep.c:737
+#: builtin/grep.c:735
msgid "show parse tree for grep expression"
msgstr "zeigt geparstes Verzeichnis für \"grep\"-Ausdruck"
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "pager"
msgstr "Anzeigeprogramm"
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "show matching files in the pager"
msgstr "zeigt Dateien mit Ãœbereinstimmungen im Anzeigeprogramm"
-#: builtin/grep.c:744
+#: builtin/grep.c:742
msgid "allow calling of grep(1) (ignored by this build)"
msgstr "erlaubt den Aufruf von grep(1) (von dieser Programmversion ignoriert)"
-#: builtin/grep.c:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
msgid "show usage"
msgstr "zeigt Verwendung"
-#: builtin/grep.c:812
+#: builtin/grep.c:810
msgid "no pattern given."
msgstr "keine Muster angegeben"
-#: builtin/grep.c:870
+#: builtin/grep.c:868
msgid "--open-files-in-pager only works on the worktree"
msgstr ""
"Die Option --open-files-in-pager kann nur innerhalb des "
"Arbeitsverzeichnisses verwendet werden."
-#: builtin/grep.c:893
+#: builtin/grep.c:891
msgid "--cached or --untracked cannot be used with --no-index."
msgstr ""
"Die Optionen --cached und --untracked können nicht mit --no-index verwendet "
"werden."
-#: builtin/grep.c:898
+#: builtin/grep.c:896
msgid "--no-index or --untracked cannot be used with revs."
msgstr ""
"Die Optionen --no-index und --untracked können nicht mit Commits verwendet "
"werden."
-#: builtin/grep.c:901
+#: builtin/grep.c:899
msgid "--[no-]exclude-standard cannot be used for tracked contents."
msgstr ""
"Die Option --[no-]exclude-standard kann nicht mit beobachteten Inhalten "
"verwendet werden."
-#: builtin/grep.c:909
+#: builtin/grep.c:907
msgid "both --cached and trees are given."
msgstr "Die Option --cached kann nicht mit \"Tree\"-Objekten verwendet werden."
@@ -5822,7 +5759,7 @@ msgstr ""
msgid "git hash-object --stdin-paths < <list-of-paths>"
msgstr "git hash-object --stdin-paths < <Liste-von-Pfaden>"
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:72 builtin/tag.c:521
msgid "type"
msgstr "Art"
@@ -6062,8 +5999,8 @@ msgstr "ernsthafte Inkonsistenz nach Dekomprimierung"
msgid "SHA1 COLLISION FOUND WITH %s !"
msgstr "SHA1 KOLLISION MIT %s GEFUNDEN !"
-#: builtin/index-pack.c:669 builtin/pack-objects.c:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
#, c-format
msgid "unable to read %s"
msgstr "kann %s nicht lesen"
@@ -6136,7 +6073,7 @@ msgstr "Fehler beim Auflösen der Unterschiede"
#: builtin/index-pack.c:1138
#, c-format
msgid "completed with %d local objects"
-msgstr "vervollständigt mit %d lokalen Objekten"
+msgstr "abgeschlossen mit %d lokalen Objekten"
#: builtin/index-pack.c:1148
#, c-format
@@ -6329,33 +6266,31 @@ msgstr "kann nicht mit Dateityp %d umgehen"
msgid "unable to move %s to %s"
msgstr "Konnte %s nicht nach %s verschieben"
-#.
-#. * TRANSLATORS: The first '%s' is either "Reinitialized
-#. * existing" or "Initialized empty", the second " shared" or
-#. * "", and the last '%s%s' is the verbatim directory name.
-#.
-#: builtin/init-db.c:420
+#. 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:418
#, c-format
msgid "%s%s Git repository in %s%s\n"
msgstr "%s%s Git-Repository in %s%s\n"
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Reinitialized existing"
msgstr "Reinitialisierte existierendes"
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Initialized empty"
msgstr "Initialisierte leeres"
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
msgid " shared"
msgstr " gemeinsames"
-#: builtin/init-db.c:441
+#: builtin/init-db.c:439
msgid "cannot tell cwd"
msgstr "kann aktuelles Arbeitsverzeichnis nicht ermitteln"
-#: builtin/init-db.c:467
+#: builtin/init-db.c:465
msgid ""
"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared"
"[=<permissions>]] [directory]"
@@ -6363,29 +6298,29 @@ msgstr ""
"git init [-q | --quiet] [--bare] [--template=<Vorlagenverzeichnis>] [--shared"
"[=<Berechtigungen>]] [Verzeichnis]"
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
msgid "permissions"
msgstr "Berechtigungen"
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
msgid "specify that the git repository is to be shared amongst several users"
msgstr "gibt an, dass das Git-Repository mit mehreren Benutzern geteilt wird"
-#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
msgid "be quiet"
msgstr "weniger Ausgaben"
-#: builtin/init-db.c:525 builtin/init-db.c:530
+#: builtin/init-db.c:523 builtin/init-db.c:528
#, c-format
msgid "cannot mkdir %s"
msgstr "kann Verzeichnis %s nicht erstellen"
-#: builtin/init-db.c:534
+#: builtin/init-db.c:532
#, c-format
msgid "cannot chdir to %s"
msgstr "kann nicht in Verzeichnis %s wechseln"
-#: builtin/init-db.c:556
+#: builtin/init-db.c:554
#, c-format
msgid ""
"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6394,11 +6329,11 @@ msgstr ""
"%s (oder --work-tree=<Verzeichnis>) nicht erlaubt ohne Spezifizierung von %s "
"(oder --git-dir=<Verzeichnis>)"
-#: builtin/init-db.c:580
+#: builtin/init-db.c:578
msgid "Cannot access current working directory"
msgstr "Kann nicht auf aktuelles Arbeitsverzeichnis zugreifen."
-#: builtin/init-db.c:587
+#: builtin/init-db.c:585
#, c-format
msgid "Cannot access work tree '%s'"
msgstr "Kann nicht auf Arbeitsverzeichnis '%s' zugreifen."
@@ -6666,102 +6601,102 @@ msgstr ""
msgid "Unknown commit %s"
msgstr "Unbekannter Commit %s"
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
msgid "git ls-files [options] [<file>...]"
msgstr "git ls-files [Optionen] [<Datei>...]"
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
msgid "identify the file status with tags"
msgstr "zeigt den Dateistatus mit Tags"
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
msgid "use lowercase letters for 'assume unchanged' files"
msgstr ""
"verwendet Kleinbuchstaben für Dateien mit 'assume unchanged' Markierung"
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
msgid "show cached files in the output (default)"
msgstr "zeigt zwischengespeicherten Dateien in der Ausgabe an (Standard)"
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
msgid "show deleted files in the output"
msgstr "zeigt entfernte Dateien in der Ausgabe an"
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
msgid "show modified files in the output"
msgstr "zeigt geänderte Dateien in der Ausgabe an"
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
msgid "show other files in the output"
msgstr "zeigt sonstige Dateien in der Ausgabe an"
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
msgid "show ignored files in the output"
msgstr "zeigt ignorierte Dateien in der Ausgabe an"
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
msgid "show staged contents' object name in the output"
msgstr ""
"zeigt Objektnamen von Inhalten, die zum Commit vorgemerkt sind, in der "
"Ausgabe an"
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
msgid "show files on the filesystem that need to be removed"
msgstr "zeigt Dateien im Dateisystem, die gelöscht werden müssen, an"
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
msgid "show 'other' directories' name only"
msgstr "zeigt nur Namen von 'sonstigen' Verzeichnissen an"
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
msgid "don't show empty directories"
msgstr "zeigt keine leeren Verzeichnisse an"
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
msgid "show unmerged files in the output"
msgstr "zeigt nicht zusammengeführte Dateien in der Ausgabe an"
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
msgid "show resolve-undo information"
msgstr "zeigt 'resolve-undo' Informationen an"
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
msgid "skip files matching pattern"
msgstr "lässt Dateien aus, die einem Muster entsprechen"
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
msgid "exclude patterns are read from <file>"
msgstr "schließt Muster, gelesen von <Datei>, aus"
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
msgid "read additional per-directory exclude patterns in <file>"
msgstr "liest zusätzliche pro-Verzeichnis Auschlussmuster aus <Datei>"
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
msgid "add the standard git exclusions"
msgstr "fügt die standardmäßigen Git-Ausschlüsse hinzu"
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
msgid "make the output relative to the project top directory"
msgstr "Ausgabe relativ zum Projektverzeichnis"
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
msgid "if any <file> is not in the index, treat this as an error"
msgstr ""
"behandle es als Fehler, wenn sich eine <Datei> nicht in der Staging-Area "
"befindet"
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
msgid "tree-ish"
msgstr "Commit-Referenz"
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
msgid "pretend that paths removed since <tree-ish> are still present"
msgstr ""
"gibt vor, dass Pfade, die seit <Commit-Referenz> gelöscht wurden, immer noch "
"vorhanden sind"
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
msgid "show debugging data"
msgstr "zeigt Ausgaben zur Fehlersuche an"
@@ -6876,7 +6811,7 @@ msgstr "bricht ab, wenn kein Vorspulen möglich ist"
msgid "Verify that the named commit has a valid GPG signature"
msgstr "überprüft den genannten Commit auf eine gültige GPG-Signatur"
-#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
msgid "strategy"
msgstr "Strategie"
@@ -6950,37 +6885,37 @@ msgstr "'%s' zeigt auf keinen Commit"
msgid "Bad branch.%s.mergeoptions string: %s"
msgstr "Ungültiger branch.%s.mergeoptions String: %s"
-#: builtin/merge.c:650
+#: builtin/merge.c:653
msgid "git write-tree failed to write a tree"
msgstr "\"git write-tree\" schlug beim Schreiben eines \"Tree\"-Objektes fehl"
-#: builtin/merge.c:678
+#: builtin/merge.c:681
msgid "Not handling anything other than two heads merge."
msgstr "Es wird nur der Merge von zwei Branches behandelt."
-#: builtin/merge.c:692
+#: builtin/merge.c:695
#, c-format
msgid "Unknown option for merge-recursive: -X%s"
msgstr "Unbekannte Option für merge-recursive: -X%s"
-#: builtin/merge.c:706
+#: builtin/merge.c:709
#, c-format
msgid "unable to write %s"
msgstr "konnte %s nicht schreiben"
-#: builtin/merge.c:795
+#: builtin/merge.c:798
#, c-format
msgid "Could not read from '%s'"
msgstr "konnte nicht von '%s' lesen"
-#: builtin/merge.c:804
+#: builtin/merge.c:807
#, c-format
msgid "Not committing merge; use 'git commit' to complete the merge.\n"
msgstr ""
"Merge wurde nicht committet; benutzen Sie 'git commit' um den Merge "
"abzuschließen.\n"
-#: builtin/merge.c:810
+#: builtin/merge.c:813
#, c-format
msgid ""
"Please enter a commit message to explain why this merge is necessary,\n"
@@ -6996,50 +6931,50 @@ msgstr ""
"Zeilen beginnend mit '%c' werden ignoriert, und eine leere Beschreibung\n"
"bricht den Commit ab.\n"
-#: builtin/merge.c:834
+#: builtin/merge.c:837
msgid "Empty commit message."
msgstr "Leere Commit-Beschreibung"
-#: builtin/merge.c:846
+#: builtin/merge.c:849
#, c-format
msgid "Wonderful.\n"
msgstr "Wunderbar.\n"
-#: builtin/merge.c:911
+#: builtin/merge.c:914
#, c-format
msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
msgstr ""
"Automatischer Merge fehlgeschlagen; beheben Sie die Konflikte und committen "
"Sie dann das Ergebnis.\n"
-#: builtin/merge.c:927
+#: builtin/merge.c:930
#, c-format
msgid "'%s' is not a commit"
msgstr "'%s' ist kein Commit"
-#: builtin/merge.c:968
+#: builtin/merge.c:971
msgid "No current branch."
msgstr "Sie befinden sich auf keinem Branch."
-#: builtin/merge.c:970
+#: builtin/merge.c:973
msgid "No remote for the current branch."
msgstr "Kein Remote-Repository für den aktuellen Branch."
-#: builtin/merge.c:972
+#: builtin/merge.c:975
msgid "No default upstream defined for the current branch."
msgstr ""
"Es ist kein Standard-Upstream-Branch für den aktuellen Branch definiert."
-#: builtin/merge.c:977
+#: builtin/merge.c:980
#, c-format
msgid "No remote-tracking branch for %s from %s"
msgstr "Kein Remote-Tracking-Branch für %s von %s"
-#: builtin/merge.c:1133
+#: builtin/merge.c:1136
msgid "There is no merge to abort (MERGE_HEAD missing)."
msgstr "Es gibt keinen Merge zum Abbrechen (vermisse MERGE_HEAD)"
-#: builtin/merge.c:1149 git-pull.sh:31
+#: builtin/merge.c:1152 git-pull.sh:31
msgid ""
"You have not concluded your merge (MERGE_HEAD exists).\n"
"Please, commit your changes before you can merge."
@@ -7047,11 +6982,11 @@ msgstr ""
"Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert).\n"
"Bitte committen Sie Ihre Änderungen, bevor Sie \"merge\" ausführen können."
-#: builtin/merge.c:1152 git-pull.sh:34
+#: builtin/merge.c:1155 git-pull.sh:34
msgid "You have not concluded your merge (MERGE_HEAD exists)."
msgstr "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert)."
-#: builtin/merge.c:1156
+#: builtin/merge.c:1159
msgid ""
"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
"Please, commit your changes before you can merge."
@@ -7059,106 +6994,105 @@ msgstr ""
"Sie haben \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD existiert).\n"
"Bitte committen Sie Ihre Änderungen, bevor Sie \"merge\" ausführen können."
-#: builtin/merge.c:1159
+#: builtin/merge.c:1162
msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
msgstr ""
"Sie haben \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD existiert)."
-#: builtin/merge.c:1168
+#: builtin/merge.c:1171
msgid "You cannot combine --squash with --no-ff."
msgstr "Sie können --squash nicht mit --no-ff kombinieren."
-#: builtin/merge.c:1177
+#: builtin/merge.c:1180
msgid "No commit specified and merge.defaultToUpstream not set."
msgstr "Kein Commit angegeben und merge.defaultToUpstream ist nicht gesetzt."
-#: builtin/merge.c:1209
+#: builtin/merge.c:1212
msgid "Can merge only exactly one commit into empty head"
msgstr "Kann nur exakt einen Commit in einem leeren Branch zusammenführen."
-#: builtin/merge.c:1212
+#: builtin/merge.c:1215
msgid "Squash commit into empty head not supported yet"
msgstr ""
"Bin auf einem Commit, der noch geboren wird; kann \"squash\" nicht ausführen."
-#: builtin/merge.c:1214
+#: builtin/merge.c:1217
msgid "Non-fast-forward commit does not make sense into an empty head"
msgstr ""
"Nicht vorzuspulender Commit kann nicht in einem leeren Branch verwendet "
"werden."
-#: builtin/merge.c:1219
+#: builtin/merge.c:1222
#, c-format
msgid "%s - not something we can merge"
msgstr "%s - nichts was wir zusammenführen können"
-#: builtin/merge.c:1270
+#: builtin/merge.c:1273
#, c-format
msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
msgstr ""
"Commit %s hat eine nicht vertrauenswürdige GPG-Signatur, angeblich von %s."
-#: builtin/merge.c:1273
+#: builtin/merge.c:1276
#, c-format
msgid "Commit %s has a bad GPG signature allegedly by %s."
msgstr "Commit %s hat eine ungültige GPG-Signatur, angeblich von %s."
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
#, c-format
msgid "Commit %s does not have a GPG signature."
msgstr "Commit %s hat keine GPG-Signatur."
-#: builtin/merge.c:1279
+#: builtin/merge.c:1282
#, c-format
msgid "Commit %s has a good GPG signature by %s\n"
msgstr "Commit %s hat eine gültige GPG-Signatur von %s\n"
-#: builtin/merge.c:1363
+#: builtin/merge.c:1366
#, c-format
msgid "Updating %s..%s\n"
msgstr "Aktualisiere %s..%s\n"
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
#, c-format
msgid "Trying really trivial in-index merge...\n"
msgstr "Probiere wirklich trivialen \"in-index\"-Merge...\n"
-#: builtin/merge.c:1409
+#: builtin/merge.c:1412
#, c-format
msgid "Nope.\n"
msgstr "Nein.\n"
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
msgid "Not possible to fast-forward, aborting."
msgstr "Vorspulen nicht möglich, breche ab."
-#: builtin/merge.c:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
#, c-format
msgid "Rewinding the tree to pristine...\n"
msgstr "Rücklauf des Verzeichnisses bis zum Ursprung...\n"
-#: builtin/merge.c:1468
+#: builtin/merge.c:1471
#, c-format
msgid "Trying merge strategy %s...\n"
msgstr "Probiere Merge-Strategie %s...\n"
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
#, c-format
msgid "No merge strategy handled the merge.\n"
msgstr "Keine Merge-Strategie behandelt diesen Merge.\n"
-#: builtin/merge.c:1536
+#: builtin/merge.c:1539
#, c-format
msgid "Merge with strategy %s failed.\n"
msgstr "Merge mit Strategie %s fehlgeschlagen.\n"
-#: builtin/merge.c:1545
+#: builtin/merge.c:1548
#, c-format
msgid "Using the %s to prepare resolving by hand.\n"
msgstr "Benutzen Sie \"%s\" um die Auflösung per Hand vorzubereiten.\n"
-#: builtin/merge.c:1557
+#: builtin/merge.c:1560
#, c-format
msgid "Automatic merge went well; stopped before committing as requested\n"
msgstr ""
@@ -7244,19 +7178,19 @@ msgstr "keine Warnung bei Konflikten"
msgid "set labels for file1/orig_file/file2"
msgstr "setzt Beschriftung für Datei1/orig_Datei/Datei2"
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
msgid "git mktree [-z] [--missing] [--batch]"
msgstr "git mktree [-z] [--missing] [--batch]"
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
msgid "input is NUL terminated"
msgstr "Eingabe ist durch NUL-Zeichen abgeschlossen"
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
msgid "allow missing objects"
msgstr "erlaubt fehlende Objekte"
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
msgid "allow creation of more than one tree"
msgstr "erlaubt die Erstellung von mehr als einem \"Tree\"-Objekt"
@@ -7306,46 +7240,46 @@ msgstr ""
msgid "Huh? %.*s is in index?"
msgstr "Huh? %.*s ist zum Commit vorgemerkt?"
-#: builtin/mv.c:168
+#: builtin/mv.c:169
msgid "source directory is empty"
msgstr "Quellverzeichnis ist leer"
-#: builtin/mv.c:200
+#: builtin/mv.c:205
msgid "not under version control"
msgstr "nicht unter Versionskontrolle"
-#: builtin/mv.c:202
+#: builtin/mv.c:207
msgid "destination exists"
msgstr "Ziel existiert bereits"
-#: builtin/mv.c:210
+#: builtin/mv.c:215
#, c-format
msgid "overwriting '%s'"
msgstr "überschreibe '%s'"
-#: builtin/mv.c:213
+#: builtin/mv.c:218
msgid "Cannot overwrite"
msgstr "Kann nicht überschreiben"
-#: builtin/mv.c:216
+#: builtin/mv.c:221
msgid "multiple sources for the same target"
msgstr "mehrere Quellen für das selbe Ziel"
-#: builtin/mv.c:218
+#: builtin/mv.c:223
msgid "destination directory does not exist"
msgstr "Zielverzeichnis existiert nicht"
-#: builtin/mv.c:233
+#: builtin/mv.c:243
#, c-format
msgid "%s, source=%s, destination=%s"
msgstr "%s, Quelle=%s, Ziel=%s"
-#: builtin/mv.c:243
+#: builtin/mv.c:253
#, c-format
msgid "Renaming %s to %s\n"
msgstr "Benenne %s nach %s um\n"
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
#, c-format
msgid "renaming '%s' failed"
msgstr "Umbenennung von '%s' fehlgeschlagen"
@@ -7516,7 +7450,7 @@ msgstr "Konnte Ausgabe von 'show' nicht lesen."
msgid "failed to finish 'show' for object '%s'"
msgstr "konnte 'show' für Objekt '%s' nicht abschließen"
-#: builtin/notes.c:167 builtin/tag.c:341
+#: builtin/notes.c:167 builtin/tag.c:373
#, c-format
msgid "could not create file '%s'"
msgstr "konnte Datei '%s' nicht erstellen"
@@ -7526,7 +7460,7 @@ msgid "Please supply the note contents using either -m or -F option"
msgstr ""
"Bitte liefern Sie den Notiz-Inhalt unter Verwendung der Option -m oder -F."
-#: builtin/notes.c:207 builtin/notes.c:844
+#: builtin/notes.c:207 builtin/notes.c:848
#, c-format
msgid "Removing note for object %s\n"
msgstr "Entferne Notiz für Objekt %s\n"
@@ -7540,20 +7474,20 @@ msgstr "Konnte Notiz-Objekt nicht schreiben"
msgid "The note contents has been left in %s"
msgstr "Die Notiz-Inhalte wurden in %s belassen"
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
#, c-format
msgid "cannot read '%s'"
msgstr "kann '%s' nicht lesen"
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
#, c-format
msgid "could not open or read '%s'"
msgstr "konnte '%s' nicht öffnen oder lesen"
-#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318
-#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515
-#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637
-#: builtin/notes.c:839 builtin/tag.c:553
+#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
+#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
+#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
+#: builtin/notes.c:843 builtin/tag.c:620
#, c-format
msgid "Failed to resolve '%s' as a valid ref."
msgstr "Konnte '%s' nicht als gültige Referenz auflösen."
@@ -7563,53 +7497,58 @@ msgstr "Konnte '%s' nicht als gültige Referenz auflösen."
msgid "Failed to read object '%s'."
msgstr "Fehler beim Lesen des Objektes '%s'."
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr "Kann Notiz-Daten nicht von Nicht-Blob Objekt '%s' lesen."
+
+#: builtin/notes.c:316
#, c-format
msgid "Malformed input line: '%s'."
msgstr "Fehlerhafte Eingabezeile: '%s'."
-#: builtin/notes.c:327
+#: builtin/notes.c:331
#, c-format
msgid "Failed to copy notes from '%s' to '%s'"
msgstr "Fehler beim Kopieren der Notizen von '%s' nach '%s'"
-#: 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
+#: builtin/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
+#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
+#: builtin/notes.c:908
msgid "too many parameters"
msgstr "zu viele Parameter"
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
#, c-format
msgid "No note found for object %s."
msgstr "Kein Notiz für Objekt %s gefunden."
-#: builtin/notes.c:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
msgid "note contents as a string"
msgstr "Notizinhalte als Zeichenkette"
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
msgid "note contents in a file"
msgstr "Notizinhalte in einer Datei"
-#: builtin/notes.c:411 builtin/notes.c:414 builtin/notes.c:568
-#: builtin/notes.c:571 builtin/tag.c:474
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
msgid "object"
msgstr "Objekt"
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
msgid "reuse and edit specified note object"
msgstr "Wiederverwendung und Bearbeitung des angegebenen Notiz-Objektes"
-#: builtin/notes.c:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
msgid "reuse specified note object"
msgstr "Wiederverwendung des angegebenen Notiz-Objektes"
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
msgid "replace existing notes"
msgstr "ersetzt existierende Notizen"
-#: builtin/notes.c:451
+#: builtin/notes.c:455
#, c-format
msgid ""
"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7618,26 +7557,26 @@ msgstr ""
"Konnte Notizen nicht hinzufügen. Existierende Notizen für Objekt %s "
"gefunden. Verwenden Sie '-f' um die existierenden Notizen zu überschreiben."
-#: builtin/notes.c:456 builtin/notes.c:533
+#: builtin/notes.c:460 builtin/notes.c:537
#, c-format
msgid "Overwriting existing notes for object %s\n"
msgstr "Überschreibe existierende Notizen für Objekt %s\n"
-#: builtin/notes.c:486
+#: builtin/notes.c:490
msgid "read objects from stdin"
msgstr "liest Objekte von der Standard-Eingabe"
-#: builtin/notes.c:488
+#: builtin/notes.c:492
msgid "load rewriting config for <command> (implies --stdin)"
msgstr ""
"lädt Konfiguration für <Kommando> beim Umschreiben von Versionen (impliziert "
"--stdin)"
-#: builtin/notes.c:506
+#: builtin/notes.c:510
msgid "too few parameters"
msgstr "zu wenig Parameter"
-#: builtin/notes.c:527
+#: builtin/notes.c:531
#, c-format
msgid ""
"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7646,12 +7585,12 @@ msgstr ""
"Kann Notizen nicht kopieren. Existierende Notizen für Objekt %s gefunden. "
"Verwenden Sie '-f' um die existierenden Notizen zu überschreiben."
-#: builtin/notes.c:539
+#: builtin/notes.c:543
#, c-format
msgid "Missing notes on source object %s. Cannot copy."
msgstr "Keine Notizen für Quell-Objekt %s. Kopie nicht möglich."
-#: builtin/notes.c:588
+#: builtin/notes.c:592
#, c-format
msgid ""
"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -7660,15 +7599,15 @@ msgstr ""
"Die Optionen -m/-F/-c/-C sind für das Unterkommando 'edit' veraltet.\n"
"Bitte benutzen Sie stattdessen 'git notes add -f -m/-F/-c/-C'.\n"
-#: builtin/notes.c:735
+#: builtin/notes.c:739
msgid "General options"
msgstr "Allgemeine Optionen"
-#: builtin/notes.c:737
+#: builtin/notes.c:741
msgid "Merge options"
msgstr "Merge-Optionen"
-#: builtin/notes.c:739
+#: builtin/notes.c:743
msgid ""
"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
"cat_sort_uniq)"
@@ -7676,210 +7615,235 @@ msgstr ""
"löst Konflikte bei Notizen mit der angegebenen Strategie auf (manual/ours/"
"theirs/union/cat_sort_uniq)"
-#: builtin/notes.c:741
+#: builtin/notes.c:745
msgid "Committing unmerged notes"
msgstr "trägt nicht zusammengeführte Notizen ein"
-#: builtin/notes.c:743
+#: builtin/notes.c:747
msgid "finalize notes merge by committing unmerged notes"
msgstr ""
"schließt Merge von Notizen ab, in dem nicht zusammengeführte Notizen "
"committet werden"
-#: builtin/notes.c:745
+#: builtin/notes.c:749
msgid "Aborting notes merge resolution"
msgstr "bricht Konfliktauflösung beim Merge von Notizen ab"
-#: builtin/notes.c:747
+#: builtin/notes.c:751
msgid "abort notes merge"
msgstr "bricht Merge von Notizen ab"
-#: builtin/notes.c:842
+#: builtin/notes.c:846
#, c-format
msgid "Object %s has no note\n"
msgstr "Objekt %s hat keine Notiz\n"
-#: builtin/notes.c:854
+#: builtin/notes.c:858
msgid "attempt to remove non-existent note is not an error"
msgstr "der Versuch, eine nicht existierende Notiz zu löschen, ist kein Fehler"
-#: builtin/notes.c:857
+#: builtin/notes.c:861
msgid "read object names from the standard input"
msgstr "liest Objektnamen von der Standard-Eingabe"
-#: builtin/notes.c:938
-msgid "notes_ref"
+#: builtin/notes.c:942
+msgid "notes-ref"
msgstr "Notiz-Referenz"
-#: builtin/notes.c:939
+#: builtin/notes.c:943
msgid "use notes from <notes_ref>"
msgstr "verwendet Notizen von <Notiz-Referenz>"
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
#, c-format
msgid "Unknown subcommand: %s"
msgstr "Unbekanntes Unterkommando: %s"
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
msgstr ""
"git pack-objects --stdout [Optionen...] [< Referenzliste | < Objektliste]"
-#: builtin/pack-objects.c:24
+#: builtin/pack-objects.c:26
msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
msgstr ""
"git pack-objects [Optionen...] Basis-Name [< Referenzliste | < Objektliste]"
-#: builtin/pack-objects.c:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
#, c-format
msgid "deflate error (%d)"
msgstr "Fehler beim Komprimieren (%d)"
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "Schreibe Objekte"
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr "Deaktiviere Schreiben des Bitmap-Index, da einige Objekte nicht in\n"
+"eine Pack-Datei geschrieben wurden"
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr "Komprimiere Objekte"
+
+#: builtin/pack-objects.c:2530
#, c-format
msgid "unsupported index version %s"
msgstr "Nicht unterstützte Staging-Area-Version %s"
-#: builtin/pack-objects.c:2400
+#: builtin/pack-objects.c:2534
#, c-format
msgid "bad index version '%s'"
msgstr "Ungültige Staging-Area-Version '%s'"
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
#, c-format
msgid "option %s does not accept negative form"
msgstr "Option %s akzeptiert keine negative Form"
-#: builtin/pack-objects.c:2427
+#: builtin/pack-objects.c:2561
#, c-format
msgid "unable to parse value '%s' for option %s"
msgstr "konnte Wert '%s' für Option %s nicht parsen"
-#: builtin/pack-objects.c:2446
+#: builtin/pack-objects.c:2580
msgid "do not show progress meter"
msgstr "zeigt keine Fortschrittsanzeige"
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
msgid "show progress meter"
msgstr "zeigt Fortschrittsanzeige"
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
msgid "show progress meter during object writing phase"
msgstr "zeigt Forschrittsanzeige während der Phase des Schreibens der Objekte"
-#: builtin/pack-objects.c:2453
+#: builtin/pack-objects.c:2587
msgid "similar to --all-progress when progress meter is shown"
msgstr "ähnlich zu --all-progress wenn Fortschrittsanzeige darstellt wird"
-#: builtin/pack-objects.c:2454
+#: builtin/pack-objects.c:2588
msgid "version[,offset]"
msgstr "version[,offset]"
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
msgid "write the pack index file in the specified idx format version"
msgstr ""
"schreibt die Index-Datei des Paketes in der angegebenen Indexformat-Version"
-#: builtin/pack-objects.c:2458
+#: builtin/pack-objects.c:2592
msgid "maximum size of each output pack file"
msgstr "maximale Größe für jede ausgegebene Paketdatei"
-#: builtin/pack-objects.c:2460
+#: builtin/pack-objects.c:2594
msgid "ignore borrowed objects from alternate object store"
msgstr "ignoriert geliehene Objekte von alternativem Objektspeicher"
-#: builtin/pack-objects.c:2462
+#: builtin/pack-objects.c:2596
msgid "ignore packed objects"
msgstr "ignoriert gepackte Objekte"
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
msgid "limit pack window by objects"
msgstr "begrenzt Paketfenster durch Objekte"
-#: builtin/pack-objects.c:2466
+#: builtin/pack-objects.c:2600
msgid "limit pack window by memory in addition to object limit"
msgstr "begrenzt Paketfenster, zusätzlich zur Objektbegrenzung, durch Speicher"
-#: builtin/pack-objects.c:2468
+#: builtin/pack-objects.c:2602
msgid "maximum length of delta chain allowed in the resulting pack"
msgstr ""
"maximale Länge der erlaubten Differenzverkettung im resultierenden Paket"
-#: builtin/pack-objects.c:2470
+#: builtin/pack-objects.c:2604
msgid "reuse existing deltas"
msgstr "verwendet existierende Unterschiede wieder"
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
msgid "reuse existing objects"
msgstr "verwendet existierende Objekte wieder"
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
msgid "use OFS_DELTA objects"
msgstr "verwendet OFS_DELTA Objekte"
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
msgid "use threads when searching for best delta matches"
msgstr ""
"verwendet Threads bei der Suche nach den besten Ãœbereinstimmungen bei "
"Unterschieden"
-#: builtin/pack-objects.c:2478
+#: builtin/pack-objects.c:2612
msgid "do not create an empty pack output"
msgstr "erzeugt keine leeren Pakete"
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
msgid "read revision arguments from standard input"
msgstr "liest Argumente bezüglich Commits von der Standard-Eingabe"
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
msgid "limit the objects to those that are not yet packed"
msgstr "begrenzt die Objekte zu solchen, die noch nicht gepackt wurden"
-#: builtin/pack-objects.c:2485
+#: builtin/pack-objects.c:2619
msgid "include objects reachable from any reference"
msgstr "schließt Objekte ein, die von jeder Referenz erreichbar sind"
-#: builtin/pack-objects.c:2488
+#: builtin/pack-objects.c:2622
msgid "include objects referred by reflog entries"
msgstr ""
"schließt Objekte ein, die von Einträgen des Reflogs referenziert werden"
-#: builtin/pack-objects.c:2491
+#: builtin/pack-objects.c:2625
msgid "output pack to stdout"
msgstr "schreibt Paket in die Standard-Ausgabe"
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
msgid "include tag objects that refer to objects to be packed"
msgstr "schließt Tag-Objekte ein, die auf gepackte Objekte referenzieren"
-#: builtin/pack-objects.c:2495
+#: builtin/pack-objects.c:2629
msgid "keep unreachable objects"
msgstr "behält nicht erreichbare Objekte"
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
msgid "time"
msgstr "Zeit"
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
msgid "unpack unreachable objects newer than <time>"
msgstr "entpackt nicht erreichbare Objekte, die neuer als <Zeit> sind"
-#: builtin/pack-objects.c:2500
+#: builtin/pack-objects.c:2634
msgid "create thin packs"
msgstr "erzeugt dünnere Pakete"
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
msgid "ignore packs that have companion .keep file"
msgstr "ignoriert Pakete die .keep Dateien haben"
-#: builtin/pack-objects.c:2504
+#: builtin/pack-objects.c:2638
msgid "pack compression level"
msgstr "Komprimierungsgrad für Paketierung"
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
msgid "do not hide commits by grafts"
msgstr "verbirgt keine künstlichen Vorgänger-Commits (\"grafts\")"
+#: builtin/pack-objects.c:2642
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr "benutzt Bitmap-Index (falls verfügbar) zur Optimierung der Objektzählung"
+
+#: builtin/pack-objects.c:2644
+msgid "write a bitmap index together with the pack index"
+msgstr "schreibt Bitmap-Index zusammen mit Pack-Index"
+
+#: builtin/pack-objects.c:2723
+msgid "Counting objects"
+msgstr "Zähle Objekte"
+
#: builtin/pack-refs.c:6
msgid "git pack-refs [options]"
msgstr "git pack-refs [Optionen]"
@@ -7896,6 +7860,10 @@ msgstr "entfernt lose Referenzen (Standard)"
msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]"
+#: builtin/prune-packed.c:49
+msgid "Removing duplicate objects"
+msgstr "Lösche doppelte Objekte"
+
#: builtin/prune.c:12
msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
msgstr "git prune [-n] [-v] [--expire <Zeit>] [--] [<head>...]"
@@ -7916,15 +7884,15 @@ msgstr "lässt Objekte älter als <Zeit> verfallen"
msgid "git push [<options>] [<repository> [<refspec>...]]"
msgstr "git push [<Optionen>] [<Repository> [<Refspec>...]]"
-#: builtin/push.c:86
+#: builtin/push.c:85
msgid "tag shorthand without <tag>"
msgstr "Kurzschrift für Tag ohne <Tag>"
-#: builtin/push.c:96
+#: builtin/push.c:95
msgid "--delete only accepts plain target ref names"
msgstr "Die Option --delete akzeptiert nur reine Referenznamen als Ziel."
-#: builtin/push.c:141
+#: builtin/push.c:140
msgid ""
"\n"
"To choose either option permanently, see push.default in 'git help config'."
@@ -7933,7 +7901,7 @@ msgstr ""
"Um eine Variante permanent zu verwenden, siehe push.default in 'git help "
"config'."
-#: builtin/push.c:144
+#: builtin/push.c:143
#, c-format
msgid ""
"The upstream branch of your current branch does not match\n"
@@ -7959,7 +7927,7 @@ msgstr ""
" git push %s %s\n"
"%s"
-#: builtin/push.c:159
+#: builtin/push.c:158
#, c-format
msgid ""
"You are not currently on a branch.\n"
@@ -7974,7 +7942,7 @@ msgstr ""
"\n"
" git push %s HEAD:<Name-des-Remote-Branches>\n"
-#: builtin/push.c:173
+#: builtin/push.c:172
#, c-format
msgid ""
"The current branch %s has no upstream branch.\n"
@@ -7988,13 +7956,13 @@ msgstr ""
"\n"
" git push --set-upstream %s %s\n"
-#: builtin/push.c:181
+#: builtin/push.c:180
#, c-format
msgid "The current branch %s has multiple upstream branches, refusing to push."
msgstr ""
"Der aktuelle Branch %s hat mehrere Upstream-Branches, \"push\" verweigert."
-#: builtin/push.c:184
+#: builtin/push.c:183
#, c-format
msgid ""
"You are pushing to remote '%s', which is not the upstream of\n"
@@ -8005,11 +7973,11 @@ msgstr ""
"Branches '%s' ist, ohne anzugeben, was versendet werden soll, um welchen\n"
"Remote-Branch zu aktualisieren."
-#: builtin/push.c:207
+#: builtin/push.c:206
msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"push.default is unset; its implicit value has changed in\n"
"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
-"and maintain the current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
"\n"
" git config --global push.default matching\n"
"\n"
@@ -8020,7 +7988,7 @@ msgid ""
"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"
+"Since Git 2.0, Git defaults to the more conservative 'simple'\n"
"behavior, which only pushes the current branch to the corresponding\n"
"remote branch that 'git pull' uses to update the current branch.\n"
"\n"
@@ -8030,7 +7998,7 @@ msgid ""
"'current' instead of 'simple' if you sometimes use older versions of Git)"
msgstr ""
"'push.default' ist nicht gesetzt; der implizit gesetzte Wert\n"
-"wird in Git 2.0 von 'matching' nach 'simple' geändert. Um diese Meldung zu\n"
+"wurde in Git 2.0 von 'matching' nach 'simple' geändert. Um diese Meldung zu\n"
"unterdrücken und das aktuelle Verhalten nach Änderung des Standardwertes\n"
"beizubehalten, benutzen Sie:\n"
"\n"
@@ -8044,24 +8012,26 @@ msgstr ""
"Wenn 'push.default' auf den Wert 'matching' gesetzt ist, werden lokale\n"
"Branches zu den Remote-Branches mit den selben Namen versendet.\n"
"\n"
-"In Git 2.0 wird das Standardverhalten zu 'simple' geändert. Hierbei wird\n"
+"In Git 2.0 wurde das Standardverhalten zu 'simple' geändert. Hierbei wird\n"
"der aktuelle Branch zu dem entsprechenden Remote-Branch versendet, den\n"
"'git pull' zur Aktualisierung des aktuellen Branches verwendet.\n"
"\n"
"Führen Sie 'git help config' aus und suchen Sie nach 'push.default' für\n"
"weitere Informationen.\n"
-"(Der Modus 'simple' wurde in Git 1.7.11 eingeführt. Benutzen Sie den ähnlichen\n"
-"Modus 'current' anstatt 'simple', falls Sie gelegentlich ältere Versionen von\n"
+"(Der Modus 'simple' wurde in Git 1.7.11 eingeführt. Benutzen Sie den "
+"ähnlichen\n"
+"Modus 'current' anstatt 'simple', falls Sie gelegentlich ältere Versionen "
+"von\n"
"Git benutzen.)"
-#: builtin/push.c:274
+#: builtin/push.c:273
msgid ""
"You didn't specify any refspecs to push, and push.default is \"nothing\"."
msgstr ""
"Sie haben keine Refspec für \"push\" angegeben, und push.default ist "
"\"nothing\"."
-#: builtin/push.c:281
+#: builtin/push.c:280
msgid ""
"Updates were rejected because the tip of your current branch is behind\n"
"its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -8075,23 +8045,7 @@ msgstr ""
"Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n"
"für weitere Details."
-#: 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 ""
-"Aktualisierungen wurden zurückgewiesen, weil die Spitze eines versendeten\n"
-"Branches hinter seinem externen Gegenstück zurückgefallen ist. Wenn Sie "
-"nicht\n"
-"beabsichtigt haben, diesen Branch zu versenden, können Sie auch den zu "
-"versendenden\n"
-"Branch spezifizieren oder die Konfigurationsvariable 'push.default' zu "
-"'simple', 'current'\n"
-"oder 'upstream' setzen, um nur den aktuellen Branch zu versenden."
-
-#: builtin/push.c:293
+#: builtin/push.c:286
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"
@@ -8105,7 +8059,7 @@ msgstr ""
"Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n"
"für weitere Details."
-#: builtin/push.c:299
+#: builtin/push.c:292
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"
@@ -8124,13 +8078,13 @@ msgstr ""
"Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n"
"für weitere Details."
-#: builtin/push.c:306
+#: builtin/push.c:299
msgid "Updates were rejected because the tag already exists in the remote."
msgstr ""
"Aktualisierungen wurden zurückgewiesen, weil das Tag bereits\n"
"im Remote-Repository existiert."
-#: builtin/push.c:309
+#: builtin/push.c:302
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"
@@ -8140,22 +8094,22 @@ msgstr ""
"das kein Commit ist, oder es auf ein solches Objekt zeigen lassen, ohne\n"
"die Option '--force' zu verwenden.\n"
-#: builtin/push.c:375
+#: builtin/push.c:361
#, c-format
msgid "Pushing to %s\n"
msgstr "Versende nach %s\n"
-#: builtin/push.c:379
+#: builtin/push.c:365
#, c-format
msgid "failed to push some refs to '%s'"
msgstr "Fehler beim Versenden einiger Referenzen nach '%s'"
-#: builtin/push.c:412
+#: builtin/push.c:395
#, c-format
msgid "bad repository '%s'"
msgstr "ungültiges Repository '%s'"
-#: builtin/push.c:413
+#: builtin/push.c:396
msgid ""
"No configured push destination.\n"
"Either specify the URL from the command-line or configure a remote "
@@ -8177,95 +8131,95 @@ msgstr ""
"\n"
" git push <Name>\n"
-#: builtin/push.c:428
+#: builtin/push.c:411
msgid "--all and --tags are incompatible"
msgstr "Die Optionen --all und --tags sind inkompatibel."
-#: builtin/push.c:429
+#: builtin/push.c:412
msgid "--all can't be combined with refspecs"
msgstr "Die Option --all kann nicht mit Refspecs kombiniert werden."
-#: builtin/push.c:434
+#: builtin/push.c:417
msgid "--mirror and --tags are incompatible"
msgstr "Die Optionen --mirror und --tags sind inkompatibel."
-#: builtin/push.c:435
+#: builtin/push.c:418
msgid "--mirror can't be combined with refspecs"
msgstr "Die Option --mirror kann nicht mit Refspecs kombiniert werden."
-#: builtin/push.c:440
+#: builtin/push.c:423
msgid "--all and --mirror are incompatible"
msgstr "Die Optionen --all und --mirror sind inkompatibel."
-#: builtin/push.c:500
+#: builtin/push.c:483
msgid "repository"
msgstr "Repository"
-#: builtin/push.c:501
+#: builtin/push.c:484
msgid "push all refs"
msgstr "versendet alle Referenzen"
-#: builtin/push.c:502
+#: builtin/push.c:485
msgid "mirror all refs"
msgstr "spiegelt alle Referenzen"
-#: builtin/push.c:504
+#: builtin/push.c:487
msgid "delete refs"
msgstr "löscht Referenzen"
-#: builtin/push.c:505
+#: builtin/push.c:488
msgid "push tags (can't be used with --all or --mirror)"
msgstr "versendet Tags (kann nicht mit --all oder --mirror verwendet werden)"
-#: builtin/push.c:508
+#: builtin/push.c:491
msgid "force updates"
msgstr "erzwingt Aktualisierung"
-#: builtin/push.c:510
+#: builtin/push.c:493
msgid "refname>:<expect"
msgstr "Referenzname>:<Erwartungswert"
-#: builtin/push.c:511
+#: builtin/push.c:494
msgid "require old value of ref to be at this value"
msgstr "Referenz muss sich auf dem angegebenen Wert befinden"
-#: builtin/push.c:513
+#: builtin/push.c:496
msgid "check"
msgstr ""
-#: builtin/push.c:514
+#: builtin/push.c:497
msgid "control recursive pushing of submodules"
msgstr "steuert rekursiven \"push\" von Submodulen"
-#: builtin/push.c:516
+#: builtin/push.c:499
msgid "use thin pack"
msgstr "verwendet kleinere Pakete"
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
msgid "receive pack program"
msgstr "'receive pack' Programm"
-#: builtin/push.c:519
+#: builtin/push.c:502
msgid "set upstream for git pull/status"
msgstr "setzt Upstream für \"git pull/status\""
-#: builtin/push.c:522
+#: builtin/push.c:505
msgid "prune locally removed refs"
msgstr "entfernt lokal gelöschte Referenzen"
-#: builtin/push.c:524
+#: builtin/push.c:507
msgid "bypass pre-push hook"
msgstr "umgeht \"pre-push hook\""
-#: builtin/push.c:525
+#: builtin/push.c:508
msgid "push missing but relevant tags"
msgstr "versendet fehlende, aber relevante Tags"
-#: builtin/push.c:535
+#: builtin/push.c:518
msgid "--delete is incompatible with --all, --mirror and --tags"
msgstr "Die Option --delete ist inkompatibel mit --all, --mirror und --tags."
-#: builtin/push.c:537
+#: builtin/push.c:520
msgid "--delete doesn't make sense without any refs"
msgstr "Die Option --delete kann nur mit Referenzen verwendet werden."
@@ -8865,69 +8819,77 @@ msgstr "Werde keine URLs entfernen, die nicht für \"push\" bestimmt sind"
msgid "be verbose; must be placed before a subcommand"
msgstr "erweiterte Ausgaben; muss vor einem Unterkommando angegeben werden"
-#: builtin/repack.c:15
+#: builtin/repack.c:16
msgid "git repack [options]"
msgstr "git repack [Optionen]"
-#: builtin/repack.c:143
+#: builtin/repack.c:156
msgid "pack everything in a single pack"
msgstr "packt alles in eine einzige Pack-Datei"
-#: builtin/repack.c:145
+#: builtin/repack.c:158
msgid "same as -a, and turn unreachable objects loose"
msgstr "genau wie -a, unerreichbare Objekte werden aber nicht gelöscht"
-#: builtin/repack.c:148
+#: builtin/repack.c:161
msgid "remove redundant packs, and run git-prune-packed"
msgstr "entfernt redundante Pakete und führt \"git-prune-packed\" aus"
-#: builtin/repack.c:150
+#: builtin/repack.c:163
msgid "pass --no-reuse-delta to git-pack-objects"
msgstr "übergibt --no-reuse-delta an git-pack-objects"
-#: builtin/repack.c:152
+#: builtin/repack.c:165
msgid "pass --no-reuse-object to git-pack-objects"
msgstr "übergibt --no-reuse-object an git-pack-objects"
-#: builtin/repack.c:154
+#: builtin/repack.c:167
msgid "do not run git-update-server-info"
msgstr "git-update-server-info nicht ausführen"
-#: builtin/repack.c:157
+#: builtin/repack.c:170
msgid "pass --local to git-pack-objects"
msgstr "übergibt --local an git-pack-objects"
-#: builtin/repack.c:158
+#: builtin/repack.c:172
+msgid "write bitmap index"
+msgstr "schreibt Bitmap-Index"
+
+#: builtin/repack.c:173
msgid "approxidate"
msgstr "Datumsangabe"
-#: builtin/repack.c:159
+#: builtin/repack.c:174
msgid "with -A, do not loosen objects older than this"
msgstr "mit -A, löscht keine Objekte älter als dieses Datum"
-#: builtin/repack.c:161
+#: builtin/repack.c:176
msgid "size of the window used for delta compression"
msgstr "Größe des Fensters für die Delta-Kompression"
-#: builtin/repack.c:162 builtin/repack.c:166
+#: builtin/repack.c:177 builtin/repack.c:181
msgid "bytes"
msgstr "Bytes"
-#: builtin/repack.c:163
+#: builtin/repack.c:178
msgid "same as the above, but limit memory size instead of entries count"
msgstr ""
"gleiches wie oben, limitiert aber die Speichergröße anstatt der\n"
"Anzahl der Einträge"
-#: builtin/repack.c:165
+#: builtin/repack.c:180
msgid "limits the maximum delta depth"
msgstr "limitiert die maximale Delta-Tiefe"
-#: builtin/repack.c:167
+#: builtin/repack.c:182
msgid "maximum size of each packfile"
msgstr "maximale Größe für jede Paketdatei"
-#: builtin/repack.c:343
+#: builtin/repack.c:184
+msgid "repack objects in packs marked with .keep"
+msgstr "packt Objekte um, die sich in mit .keep markierten Pack-Dateien befinden"
+
+#: builtin/repack.c:371
#, c-format
msgid "removing '%s' failed"
msgstr "Löschen von '%s' fehlgeschlagen"
@@ -9020,76 +8982,84 @@ msgstr "Fehler beim Finden des \"Tree\"-Objektes von %s."
msgid "HEAD is now at %s"
msgstr "HEAD ist jetzt bei %s"
-#: builtin/reset.c:172
+#: builtin/reset.c:182
#, c-format
msgid "Cannot do a %s reset in the middle of a merge."
msgstr "Kann keinen '%s'-Reset durchführen, während ein Merge im Gange ist."
-#: builtin/reset.c:262
+#: builtin/reset.c:273
msgid "be quiet, only report errors"
msgstr "weniger Ausgaben, meldet nur Fehler"
-#: builtin/reset.c:264
+#: builtin/reset.c:275
msgid "reset HEAD and index"
msgstr "setzt HEAD und Staging-Area um"
-#: builtin/reset.c:265
+#: builtin/reset.c:276
msgid "reset only HEAD"
msgstr "setzt nur HEAD um"
-#: builtin/reset.c:267 builtin/reset.c:269
+#: builtin/reset.c:278 builtin/reset.c:280
msgid "reset HEAD, index and working tree"
msgstr "setzt HEAD, Staging-Area und Arbeitsverzeichnis um"
-#: builtin/reset.c:271
+#: builtin/reset.c:282
msgid "reset HEAD but keep local changes"
msgstr "setzt HEAD um, behält aber lokale Änderungen"
-#: builtin/reset.c:289
+#: builtin/reset.c:285
+msgid "record only the fact that removed paths will be added later"
+msgstr "speichert nur, dass gelöschte Pfade später hinzugefügt werden sollen"
+
+#: builtin/reset.c:302
#, c-format
msgid "Failed to resolve '%s' as a valid revision."
msgstr "Konnte '%s' nicht als gültigen Commit auflösen."
-#: builtin/reset.c:292 builtin/reset.c:300
+#: builtin/reset.c:305 builtin/reset.c:313
#, c-format
msgid "Could not parse object '%s'."
msgstr "Konnte Objekt '%s' nicht parsen."
-#: builtin/reset.c:297
+#: builtin/reset.c:310
#, c-format
msgid "Failed to resolve '%s' as a valid tree."
msgstr "Konnte '%s' nicht als gültiges \"Tree\"-Objekt auflösen."
-#: builtin/reset.c:306
+#: builtin/reset.c:319
msgid "--patch is incompatible with --{hard,mixed,soft}"
msgstr "--patch ist inkompatibel mit --{hard,mixed,soft}"
-#: builtin/reset.c:315
+#: builtin/reset.c:328
msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
msgstr ""
"--mixed mit Pfaden ist veraltet; benutzen Sie stattdessen 'git reset -- "
"<Pfade>'."
-#: builtin/reset.c:317
+#: builtin/reset.c:330
#, c-format
msgid "Cannot do %s reset with paths."
msgstr "Ein '%s'-Reset mit Pfaden ist nicht möglich."
-#: builtin/reset.c:327
+#: builtin/reset.c:340
#, c-format
msgid "%s reset is not allowed in a bare repository"
msgstr "'%s'-Reset ist in einem Bare-Repository nicht erlaubt"
#: builtin/reset.c:344
+msgid "-N can only be used with --mixed"
+msgstr "-N kann nur mit -mixed benutzt werden"
+
+#: builtin/reset.c:361
msgid "Unstaged changes after reset:"
msgstr "Nicht zum Commit vorgemerkte Änderungen nach Zurücksetzung:"
-#: builtin/reset.c:350
+#: builtin/reset.c:367
#, c-format
msgid "Could not reset index file to revision '%s'."
msgstr "Konnte Staging-Area-Datei nicht zu Commit '%s' setzen."
-#: builtin/reset.c:355
+#: builtin/reset.c:372
msgid "Could not write new index file."
msgstr "Konnte neue Staging-Area-Datei nicht schreiben."
@@ -9107,9 +9077,10 @@ msgstr "stoppt das Parsen nach dem ersten Argument was keine Option ist"
#: builtin/rev-parse.c:369
msgid "output in stuck long form"
-msgstr "Ausgabe in Langform mit Argumenten an den Optionen (getrennt durch '=')"
+msgstr ""
+"Ausgabe in Langform mit Argumenten an den Optionen (getrennt durch '=')"
-#: builtin/rev-parse.c:486
+#: builtin/rev-parse.c:497
msgid ""
"git rev-parse --parseopt [options] -- [<args>...]\n"
" or: git rev-parse --sq-quote [<arg>...]\n"
@@ -9181,35 +9152,35 @@ msgstr "Option"
msgid "option for merge strategy"
msgstr "Option für Merge-Strategie"
-#: builtin/revert.c:102
+#: builtin/revert.c:104
msgid "append commit name"
msgstr "hängt Commit-Namen an"
-#: builtin/revert.c:103
+#: builtin/revert.c:105
msgid "allow fast-forward"
msgstr "erlaubt Vorspulen"
-#: builtin/revert.c:104
+#: builtin/revert.c:106
msgid "preserve initially empty commits"
msgstr "erhält ursprüngliche, leere Commits"
-#: builtin/revert.c:105
+#: builtin/revert.c:107
msgid "allow commits with empty messages"
msgstr "erlaubt Commits mit leerer Beschreibung"
-#: builtin/revert.c:106
+#: builtin/revert.c:108
msgid "keep redundant, empty commits"
msgstr "behält redundante, leere Commits"
-#: builtin/revert.c:110
+#: builtin/revert.c:112
msgid "program error"
msgstr "Programmfehler"
-#: builtin/revert.c:195
+#: builtin/revert.c:197
msgid "revert failed"
msgstr "\"revert\" fehlgeschlagen"
-#: builtin/revert.c:210
+#: builtin/revert.c:212
msgid "cherry-pick failed"
msgstr "\"cherry-pick\" fehlgeschlagen"
@@ -9491,11 +9462,11 @@ msgstr "löscht symbolische Referenzen"
msgid "shorten ref output"
msgstr "verkürzte Ausgabe der Referenzen"
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
msgid "reason"
msgstr "Grund"
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
msgid "reason of the update"
msgstr "Grund für die Aktualisierung"
@@ -9522,32 +9493,32 @@ msgstr ""
msgid "git tag -v <tagname>..."
msgstr "git tag -v <Tagname>..."
-#: builtin/tag.c:60
+#: builtin/tag.c:67
#, c-format
msgid "malformed object at '%s'"
msgstr "fehlerhaftes Objekt bei '%s'"
-#: builtin/tag.c:207
+#: builtin/tag.c:239
#, c-format
msgid "tag name too long: %.*s..."
msgstr "Tagname zu lang: %.*s..."
-#: builtin/tag.c:212
+#: builtin/tag.c:244
#, c-format
msgid "tag '%s' not found."
msgstr "Tag '%s' nicht gefunden."
-#: builtin/tag.c:227
+#: builtin/tag.c:259
#, c-format
msgid "Deleted tag '%s' (was %s)\n"
msgstr "Tag '%s' gelöscht (war %s)\n"
-#: builtin/tag.c:239
+#: builtin/tag.c:271
#, c-format
msgid "could not verify the tag '%s'"
msgstr "Konnte Tag '%s' nicht verifizieren"
-#: builtin/tag.c:249
+#: builtin/tag.c:281
#, c-format
msgid ""
"\n"
@@ -9558,7 +9529,7 @@ msgstr ""
"Geben Sie eine Tag-Beschreibung ein.\n"
"Zeilen, die mit '%c' beginnen, werden ignoriert.\n"
-#: builtin/tag.c:253
+#: builtin/tag.c:285
#, c-format
msgid ""
"\n"
@@ -9571,262 +9542,279 @@ msgstr ""
"Zeilen, die mit '%c' beginnen, werden behalten; Sie dürfen diese\n"
"selbst entfernen wenn Sie möchten.\n"
-#: builtin/tag.c:292
+#: builtin/tag.c:324
msgid "unable to sign the tag"
msgstr "konnte Tag nicht signieren"
-#: builtin/tag.c:294
+#: builtin/tag.c:326
msgid "unable to write tag file"
msgstr "konnte Tag-Datei nicht schreiben"
-#: builtin/tag.c:319
+#: builtin/tag.c:351
msgid "bad object type."
msgstr "ungültiger Objekt-Typ"
-#: builtin/tag.c:332
+#: builtin/tag.c:364
msgid "tag header too big."
msgstr "Tag-Kopf zu groß."
-#: builtin/tag.c:368
+#: builtin/tag.c:400
msgid "no tag message?"
msgstr "keine Tag-Beschreibung?"
-#: builtin/tag.c:374
+#: builtin/tag.c:406
#, c-format
msgid "The tag message has been left in %s\n"
msgstr "Die Tag-Beschreibung wurde gelassen in %s\n"
-#: builtin/tag.c:423
+#: builtin/tag.c:455
msgid "switch 'points-at' requires an object"
msgstr "Option 'points-at' erfordert ein Objekt"
-#: builtin/tag.c:425
+#: builtin/tag.c:457
#, c-format
msgid "malformed object name '%s'"
msgstr "fehlerhafter Objekt-Name '%s'"
-#: builtin/tag.c:445
+#: builtin/tag.c:480
+#, c-format
+msgid "unsupported sort specification %s"
+msgstr "Nicht unterstützte Angabe für \"--sort\": %s"
+
+#: builtin/tag.c:500
msgid "list tag names"
msgstr "listet Tagnamen auf"
-#: builtin/tag.c:447
+#: builtin/tag.c:502
msgid "print <n> lines of each tag message"
msgstr "zeigt <n> Zeilen jeder Tag-Beschreibung"
-#: builtin/tag.c:449
+#: builtin/tag.c:504
msgid "delete tags"
msgstr "löscht Tags"
-#: builtin/tag.c:450
+#: builtin/tag.c:505
msgid "verify tags"
msgstr "überprüft Tags"
-#: builtin/tag.c:452
+#: builtin/tag.c:507
msgid "Tag creation options"
msgstr "Optionen für Erstellung von Tags"
-#: builtin/tag.c:454
+#: builtin/tag.c:509
msgid "annotated tag, needs a message"
msgstr "annotiertes Tag, benötigt eine Beschreibung"
-#: builtin/tag.c:456
+#: builtin/tag.c:511
msgid "tag message"
msgstr "Tag-Beschreibung"
-#: builtin/tag.c:458
+#: builtin/tag.c:513
msgid "annotated and GPG-signed tag"
msgstr "annotiertes und GPG-signiertes Tag"
-#: builtin/tag.c:462
+#: builtin/tag.c:517
msgid "use another key to sign the tag"
msgstr "verwendet einen anderen Schlüssel um das Tag zu signieren"
-#: builtin/tag.c:463
+#: builtin/tag.c:518
msgid "replace the tag if exists"
msgstr "ersetzt das Tag, wenn es existiert"
-#: builtin/tag.c:464
+#: builtin/tag.c:519
msgid "show tag list in columns"
msgstr "zeigt Liste der Tags in Spalten"
-#: builtin/tag.c:466
+#: builtin/tag.c:521
+msgid "sort tags"
+msgstr "sortiert Tags"
+
+#: builtin/tag.c:525
msgid "Tag listing options"
msgstr "Optionen für Auflistung der Tags"
-#: builtin/tag.c:469
+#: builtin/tag.c:528 builtin/tag.c:534
msgid "print only tags that contain the commit"
msgstr "gibt nur Tags aus, die diesen Commit beinhalten"
-#: builtin/tag.c:475
+#: builtin/tag.c:540
msgid "print only tags of the object"
msgstr "gibt nur Tags von dem Objekt aus"
-#: builtin/tag.c:501
+#: builtin/tag.c:566
msgid "--column and -n are incompatible"
msgstr "--column und -n sind inkompatibel"
-#: builtin/tag.c:518
+#: builtin/tag.c:578
+msgid "--sort and -n are incompatible"
+msgstr "--sort und -n sind inkompatibel"
+
+#: builtin/tag.c:585
msgid "-n option is only allowed with -l."
msgstr "-n Option ist nur erlaubt mit -l."
-#: builtin/tag.c:520
+#: builtin/tag.c:587
msgid "--contains option is only allowed with -l."
msgstr "--contains Option ist nur erlaubt mit -l."
-#: builtin/tag.c:522
+#: builtin/tag.c:589
msgid "--points-at option is only allowed with -l."
msgstr "--points-at Option ist nur erlaubt mit -l."
-#: builtin/tag.c:530
+#: builtin/tag.c:597
msgid "only one -F or -m option is allowed."
msgstr "nur eine -F oder -m Option ist erlaubt."
-#: builtin/tag.c:550
+#: builtin/tag.c:617
msgid "too many params"
msgstr "zu viele Parameter"
-#: builtin/tag.c:556
+#: builtin/tag.c:623
#, c-format
msgid "'%s' is not a valid tag name."
msgstr "'%s' ist kein gültiger Tagname."
-#: builtin/tag.c:561
+#: builtin/tag.c:628
#, c-format
msgid "tag '%s' already exists"
msgstr "Tag '%s' existiert bereits"
-#: builtin/tag.c:579
+#: builtin/tag.c:646
#, c-format
msgid "%s: cannot lock the ref"
msgstr "%s: kann Referenz nicht sperren"
-#: builtin/tag.c:581
+#: builtin/tag.c:648
#, c-format
msgid "%s: cannot update the ref"
msgstr "%s: kann Referenz nicht aktualisieren"
-#: builtin/tag.c:583
+#: builtin/tag.c:650
#, c-format
msgid "Updated tag '%s' (was %s)\n"
msgstr "Tag '%s' aktualisiert (war %s)\n"
-#: builtin/update-index.c:402
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr "Entpacke Objekte"
+
+#: builtin/update-index.c:399
msgid "git update-index [options] [--] [<file>...]"
msgstr "git update-index [Optionen] [--] [<Datei>...]"
-#: builtin/update-index.c:720
+#: builtin/update-index.c:748
msgid "continue refresh even when index needs update"
msgstr ""
"Aktualisierung fortsetzen, auch wenn die Staging-Area aktualisiert werden "
"muss"
-#: builtin/update-index.c:723
+#: builtin/update-index.c:751
msgid "refresh: ignore submodules"
msgstr "Aktualisierung: ignoriert Submodule"
-#: builtin/update-index.c:726
+#: builtin/update-index.c:754
msgid "do not ignore new files"
msgstr "ignoriert keine neuen Dateien"
-#: builtin/update-index.c:728
+#: builtin/update-index.c:756
msgid "let files replace directories and vice-versa"
msgstr "lässt Dateien Verzeichnisse ersetzen, und umgedreht"
-#: builtin/update-index.c:730
+#: builtin/update-index.c:758
msgid "notice files missing from worktree"
msgstr "beachtet fehlende Dateien im Arbeitsverzeichnis"
-#: builtin/update-index.c:732
+#: builtin/update-index.c:760
msgid "refresh even if index contains unmerged entries"
msgstr ""
"aktualisiert, auch wenn die Staging-Area nicht zusammengeführte Einträge "
"beinhaltet"
-#: builtin/update-index.c:735
+#: builtin/update-index.c:763
msgid "refresh stat information"
msgstr "aktualisiert Dateiinformationen"
-#: builtin/update-index.c:739
+#: builtin/update-index.c:767
msgid "like --refresh, but ignore assume-unchanged setting"
msgstr "wie --refresh, ignoriert aber \"assume-unchanged\" Einstellung"
-#: builtin/update-index.c:743
-msgid "<mode> <object> <path>"
-msgstr "<Modus> <Objekt> <Pfad>"
+#: builtin/update-index.c:771
+msgid "<mode>,<object>,<path>"
+msgstr "<Modus>,<Objekt>,<Pfad>"
-#: builtin/update-index.c:744
+#: builtin/update-index.c:772
msgid "add the specified entry to the index"
msgstr "merkt den angegebenen Eintrag zum Commit vor"
-#: builtin/update-index.c:748
+#: builtin/update-index.c:776
msgid "(+/-)x"
msgstr "(+/-)x"
-#: builtin/update-index.c:749
+#: builtin/update-index.c:777
msgid "override the executable bit of the listed files"
msgstr "überschreibt das \"ausführbar\"-Bit der aufgelisteten Dateien"
-#: builtin/update-index.c:753
+#: builtin/update-index.c:781
msgid "mark files as \"not changing\""
msgstr "betrachte diese Datei immer als unverändert"
-#: builtin/update-index.c:756
+#: builtin/update-index.c:784
msgid "clear assumed-unchanged bit"
msgstr "löscht \"assumed-unchanged\"-Bit"
-#: builtin/update-index.c:759
+#: builtin/update-index.c:787
msgid "mark files as \"index-only\""
msgstr "markiert Dateien als \"index-only\""
-#: builtin/update-index.c:762
+#: builtin/update-index.c:790
msgid "clear skip-worktree bit"
msgstr "löscht \"skip-worktree\"-Bit"
-#: builtin/update-index.c:765
+#: builtin/update-index.c:793
msgid "add to index only; do not add content to object database"
msgstr ""
"merkt die Änderungen nur zum Commit vor; Inhalt wird nicht der Objekt-"
"Datenbank hinzugefügt"
-#: builtin/update-index.c:767
+#: builtin/update-index.c:795
msgid "remove named paths even if present in worktree"
msgstr ""
"löscht benannte Pfade, auch wenn sie sich im Arbeitsverzeichnis befinden"
-#: builtin/update-index.c:769
+#: builtin/update-index.c:797
msgid "with --stdin: input lines are terminated by null bytes"
msgstr "mit --stdin: eingegebene Zeilen sind durch NUL-Bytes abgeschlossen"
-#: builtin/update-index.c:771
+#: builtin/update-index.c:799
msgid "read list of paths to be updated from standard input"
msgstr "liest Liste der zu aktualisierenden Pfade von der Standard-Eingabe"
-#: builtin/update-index.c:775
+#: builtin/update-index.c:803
msgid "add entries from standard input to the index"
msgstr "merkt Einträge von der Standard-Eingabe zum Commit vor"
-#: builtin/update-index.c:779
+#: builtin/update-index.c:807
msgid "repopulate stages #2 and #3 for the listed paths"
msgstr ""
"wiederholtes Einpflegen der Zustände #2 und #3 für die aufgelisteten Pfade"
-#: builtin/update-index.c:783
+#: builtin/update-index.c:811
msgid "only update entries that differ from HEAD"
msgstr "aktualisiert nur Einträge, die unterschiedlich zu HEAD sind"
-#: builtin/update-index.c:787
+#: builtin/update-index.c:815
msgid "ignore files missing from worktree"
msgstr "ignoriert fehlende Dateien im Arbeitsverzeichnis"
-#: builtin/update-index.c:790
+#: builtin/update-index.c:818
msgid "report actions to standard output"
msgstr "gibt die Aktionen in der Standard-Ausgabe aus"
-#: builtin/update-index.c:792
+#: builtin/update-index.c:820
msgid "(for porcelains) forget saved unresolved conflicts"
msgstr "(für Fremdprogramme) keine gespeicherten, nicht aufgelöste Konflikte"
-#: builtin/update-index.c:796
+#: builtin/update-index.c:824
msgid "write index in this format"
msgstr "schreibt Staging-Area-Datei in diesem Format"
@@ -9842,19 +9830,19 @@ msgstr "git update-ref [Optionen] <Referenzname> <neuerWert> [<alterWert>]"
msgid "git update-ref [options] --stdin [-z]"
msgstr "git update-ref [Optionen] --stdin [-z]"
-#: builtin/update-ref.c:255
+#: builtin/update-ref.c:256
msgid "delete the reference"
msgstr "löscht diese Referenz"
-#: builtin/update-ref.c:257
+#: builtin/update-ref.c:258
msgid "update <refname> not the one it points to"
msgstr "aktualisiert <Referenzname>, nicht den Verweis"
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:259
msgid "stdin has NUL-terminated arguments"
msgstr "Standard-Eingabe hat durch NUL-Zeichen abgeschlossene Argumente"
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:260
msgid "read updates from stdin"
msgstr "liest Aktualisierungen von der Standard-Eingabe"
@@ -9913,23 +9901,23 @@ msgstr ""
"oder 'git help <Konzept>' um mehr über ein spezifisches Kommando oder\n"
"Konzept zu erfahren."
-#: parse-options.h:146
-msgid "expiry date"
+#: parse-options.h:143
+msgid "expiry-date"
msgstr "Verfallsdatum"
-#: parse-options.h:161
+#: parse-options.h:158
msgid "no-op (backward compatibility)"
msgstr "Kein Effekt (Rückwärtskompatibilität)"
-#: parse-options.h:235
+#: parse-options.h:232
msgid "be more verbose"
msgstr "erweiterte Ausgaben"
-#: parse-options.h:237
+#: parse-options.h:234
msgid "be more quiet"
msgstr "weniger Ausgaben"
-#: parse-options.h:243
+#: parse-options.h:240
msgid "use <n> digits to display SHA-1s"
msgstr "benutze <n> Ziffern zur Anzeige von SHA-1s"
@@ -10026,11 +10014,11 @@ msgstr ""
"Erzeugt, listet auf, löscht oder verifiziert ein mit GPG signiertes Tag-"
"Objekt"
-#: git-am.sh:50
+#: git-am.sh:52
msgid "You need to set your committer info first"
msgstr "Sie müssen zuerst die Informationen zum Commit-Ersteller setzen."
-#: git-am.sh:95
+#: git-am.sh:97
msgid ""
"You seem to have moved HEAD since the last 'am' failure.\n"
"Not rewinding to ORIG_HEAD"
@@ -10038,7 +10026,7 @@ msgstr ""
"Sie scheinen seit dem letzten gescheiterten 'am' HEAD geändert zu haben.\n"
"Keine Zurücksetzung zu ORIG_HEAD."
-#: git-am.sh:105
+#: git-am.sh:107
#, sh-format
msgid ""
"When you have resolved this problem, run \"$cmdline --continue\".\n"
@@ -10051,23 +10039,23 @@ msgstr ""
"Um den ursprünglichen Branch wiederherzustellen und die Anwendung der\n"
"Patches abzubrechen, führen Sie \"$cmdline --abort\" aus."
-#: git-am.sh:121
+#: git-am.sh:123
msgid "Cannot fall back to three-way merge."
msgstr "Kann nicht zu 3-Wege-Merge zurückfallen."
-#: git-am.sh:137
+#: git-am.sh:139
msgid "Repository lacks necessary blobs to fall back on 3-way merge."
msgstr ""
"Dem Repository fehlen notwendige Blobs um auf einen 3-Wege-Merge "
"zurückzufallen."
-#: git-am.sh:139
+#: git-am.sh:141
msgid "Using index info to reconstruct a base tree..."
msgstr ""
"Verwende Informationen aus der Staging-Area um einen Basisverzeichnis "
"nachzustellen"
-#: git-am.sh:154
+#: git-am.sh:156
msgid ""
"Did you hand edit your patch?\n"
"It does not apply to blobs recorded in its index."
@@ -10075,28 +10063,28 @@ msgstr ""
"Haben Sie den Patch per Hand editiert?\n"
"Er kann nicht auf die Blobs in seiner 'index' Zeile angewendet werden."
-#: git-am.sh:163
+#: git-am.sh:165
msgid "Falling back to patching base and 3-way merge..."
msgstr "Falle zurück zum Patchen der Basis und des 3-Wege-Merges..."
-#: git-am.sh:179
+#: git-am.sh:181
msgid "Failed to merge in the changes."
msgstr "Merge der Änderungen fehlgeschlagen"
-#: git-am.sh:274
+#: git-am.sh:276
msgid "Only one StGIT patch series can be applied at once"
msgstr "Es kann nur eine StGIT Patch-Serie auf einmal angewendet werden."
-#: git-am.sh:361
+#: git-am.sh:363
#, sh-format
msgid "Patch format $patch_format is not supported."
msgstr "Patch-Format $patch_format wird nicht unterstützt."
-#: git-am.sh:363
+#: git-am.sh:365
msgid "Patch format detection failed."
msgstr "Patch-Formaterkennung fehlgeschlagen."
-#: git-am.sh:389
+#: git-am.sh:392
msgid ""
"The -b/--binary option has been a no-op for long time, and\n"
"it will be removed. Please do not use it anymore."
@@ -10104,17 +10092,17 @@ msgstr ""
"Die -b/--binary Option hat seit Langem keinen Effekt und wird\n"
"entfernt. Bitte nicht mehr verwenden."
-#: git-am.sh:479
+#: git-am.sh:486
#, sh-format
msgid "previous rebase directory $dotest still exists but mbox given."
msgstr ""
"Vorheriges Rebase-Verzeichnis $dotest existiert noch, aber mbox gegeben."
-#: git-am.sh:484
+#: git-am.sh:491
msgid "Please make up your mind. --skip or --abort?"
msgstr "Bitte werden Sie sich klar. --skip oder --abort?"
-#: git-am.sh:520
+#: git-am.sh:527
#, sh-format
msgid ""
"Stray $dotest directory found.\n"
@@ -10123,16 +10111,16 @@ msgstr ""
"Stray $dotest Verzeichnis gefunden.\n"
"Benutzen Sie \"git am --abort\" um es zu entfernen."
-#: git-am.sh:528
+#: git-am.sh:535
msgid "Resolve operation not in progress, we are not resuming."
msgstr "Es ist keine Auflösung im Gange, es wird nicht fortgesetzt."
-#: git-am.sh:594
+#: git-am.sh:601
#, sh-format
msgid "Dirty index: cannot apply patches (dirty: $files)"
msgstr "Geänderte Staging-Area: kann Patches nicht anwenden (geändert: $files)"
-#: git-am.sh:698
+#: git-am.sh:705
#, sh-format
msgid ""
"Patch is empty. Was it split wrong?\n"
@@ -10146,33 +10134,33 @@ msgstr ""
"Patches\n"
"abzubrechen, führen Sie \"$cmdline --abort\" aus."
-#: git-am.sh:725
+#: git-am.sh:732
msgid "Patch does not have a valid e-mail address."
msgstr "Patch enthält keine gültige Email-Adresse."
-#: git-am.sh:772
+#: git-am.sh:779
msgid "cannot be interactive without stdin connected to a terminal."
msgstr ""
"Kann nicht interaktiv sein, ohne dass die Standard-Eingabe mit einem "
"Terminal verbunden ist."
-#: git-am.sh:776
+#: git-am.sh:783
msgid "Commit Body is:"
msgstr "Commit-Beschreibung ist:"
#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
#. in your translation. The program will only accept English
#. input at this point.
-#: git-am.sh:783
+#: git-am.sh:790
msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
msgstr "Anwenden? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
-#: git-am.sh:819
+#: git-am.sh:826
#, sh-format
msgid "Applying: $FIRSTLINE"
msgstr "Wende an: $FIRSTLINE"
-#: git-am.sh:840
+#: git-am.sh:847
msgid ""
"No changes - did you forget to use 'git add'?\n"
"If there is nothing left to stage, chances are that something else\n"
@@ -10183,7 +10171,7 @@ msgstr ""
"diese bereits anderweitig eingefügt worden sein; Sie könnten diesen Patch\n"
"auslassen."
-#: git-am.sh:848
+#: git-am.sh:855
msgid ""
"You still have unmerged paths in your index\n"
"did you forget to use 'git add'?"
@@ -10191,16 +10179,16 @@ msgstr ""
"Sie haben immer noch nicht zusammengeführte Pfade in der Staging-Area.\n"
"Haben Sie vergessen 'git add' zu benutzen?"
-#: git-am.sh:864
+#: git-am.sh:871
msgid "No changes -- Patch already applied."
msgstr "Keine Änderungen -- Patches bereits angewendet."
-#: git-am.sh:874
+#: git-am.sh:881
#, sh-format
msgid "Patch failed at $msgnum $FIRSTLINE"
msgstr "Anwendung des Patches fehlgeschlagen bei $msgnum $FIRSTLINE"
-#: git-am.sh:877
+#: git-am.sh:884
#, sh-format
msgid ""
"The copy of the patch that failed is found in:\n"
@@ -10209,7 +10197,7 @@ msgstr ""
"Die Kopie des fehlgeschlagenen Patches befindet sich in:\n"
" $dotest/patch"
-#: git-am.sh:895
+#: git-am.sh:902
msgid "applying to an empty history"
msgstr "wende zu leerer Historie an"
@@ -10278,8 +10266,6 @@ msgstr "Ungültige Referenz-Eingabe: $rev"
msgid "'git bisect bad' can take only one argument."
msgstr "'git bisect bad' kann nur ein Argument entgegennehmen."
-#. have bad but not good. we could bisect although
-#. this is less optimum.
#: git-bisect.sh:273
msgid "Warning: bisecting only with a bad commit."
msgstr "Warnung: binäre Suche nur mit einem fehlerhaften Commit"
@@ -10389,17 +10375,13 @@ msgid "Pull is not possible because you have unmerged files."
msgstr ""
"\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
-#: git-pull.sh:223
+#: git-pull.sh:247
msgid "updating an unborn branch with changes added to the index"
msgstr ""
"Aktualisiere einen ungeborenen Branch mit Änderungen, die zum Commit "
"vorgemerkt sind"
-#. The fetch involved updating the current branch.
-#. The working tree and the index file is still based on the
-#. $orig_head commit, but we are merging into $curr_head.
-#. First update the working tree to match $curr_head.
-#: git-pull.sh:247
+#: git-pull.sh:271
#, sh-format
msgid ""
"Warning: fetch updated the current branch head.\n"
@@ -10409,15 +10391,15 @@ msgstr ""
"Warnung: \"fetch\" aktualisierte die Spitze des aktuellen Branches.\n"
"Warnung: Spule Ihr Arbeitsverzeichnis von Commit $orig_head vor."
-#: git-pull.sh:272
+#: git-pull.sh:296
msgid "Cannot merge multiple branches into empty head"
msgstr "Kann nicht mehrere Branches in einen ungeborenen Branch zusammenführen"
-#: git-pull.sh:276
+#: git-pull.sh:300
msgid "Cannot rebase onto multiple branches"
msgstr "kann Rebase nicht auf mehrere Branches ausführen"
-#: git-rebase.sh:55
+#: git-rebase.sh:57
msgid ""
"When you have resolved this problem, run \"git rebase --continue\".\n"
"If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
@@ -10431,16 +10413,16 @@ msgstr ""
"Um den ursprünglichen Branch wiederherzustellen und den Rebase abzubrechen,\n"
"führen Sie \"git rebase --abort\" aus."
-#: git-rebase.sh:158
+#: git-rebase.sh:164
msgid "Applied autostash."
msgstr "\"autostash\" angewendet."
-#: git-rebase.sh:161
+#: git-rebase.sh:167
#, sh-format
msgid "Cannot store $stash_sha1"
msgstr "Kann $stash_sha1 nicht speichern."
-#: git-rebase.sh:162
+#: git-rebase.sh:168
msgid ""
"Applying autostash resulted in conflicts.\n"
"Your changes are safe in the stash.\n"
@@ -10450,33 +10432,33 @@ msgstr ""
"Ihre Änderungen sind im Stash sicher.\n"
"Sie können jederzeit \"git stash pop\" oder \"git stash drop\" ausführen.\n"
-#: git-rebase.sh:201
+#: git-rebase.sh:207
msgid "The pre-rebase hook refused to rebase."
msgstr "Der \"pre-rebase hook\" hat den Rebase zurückgewiesen."
-#: git-rebase.sh:206
+#: git-rebase.sh:212
msgid "It looks like git-am is in progress. Cannot rebase."
msgstr "\"git-am\" scheint im Gange zu sein. Kann Rebase nicht durchführen."
-#: git-rebase.sh:346
+#: git-rebase.sh:350
msgid "The --exec option must be used with the --interactive option"
msgstr "Die Option --exec muss mit --interactive verwendet werden."
-#: git-rebase.sh:351
+#: git-rebase.sh:355
msgid "No rebase in progress?"
msgstr "Kein Rebase im Gange?"
-#: git-rebase.sh:362
+#: git-rebase.sh:366
msgid "The --edit-todo action can only be used during interactive rebase."
msgstr ""
"Die --edit-todo Aktion kann nur während eines interaktiven Rebase verwendet "
"werden."
-#: git-rebase.sh:369
+#: git-rebase.sh:373
msgid "Cannot read HEAD"
msgstr "Kann HEAD nicht lesen"
-#: git-rebase.sh:372
+#: git-rebase.sh:376
msgid ""
"You must edit all merge conflicts and then\n"
"mark them as resolved using git add"
@@ -10484,12 +10466,12 @@ msgstr ""
"Sie müssen alle Merge-Konflikte editieren und diese dann\n"
"mittels \"git add\" als aufgelöst markieren"
-#: git-rebase.sh:390
+#: git-rebase.sh:394
#, sh-format
msgid "Could not move back to $head_name"
msgstr "Konnte nicht zu $head_name zurückgehen"
-#: git-rebase.sh:409
+#: git-rebase.sh:413
#, sh-format
msgid ""
"It seems that there is already a $state_dir_base directory, and\n"
@@ -10510,68 +10492,67 @@ msgstr ""
"und führen Sie dieses Kommando nochmal aus. Es wird angehalten, falls noch\n"
"etwas Schützenswertes vorhanden ist."
-#: git-rebase.sh:456
+#: git-rebase.sh:464
#, sh-format
msgid "invalid upstream $upstream_name"
msgstr "ungültiger Upstream-Branch $upstream_name"
-#: git-rebase.sh:480
+#: git-rebase.sh:488
#, sh-format
msgid "$onto_name: there are more than one merge bases"
msgstr "$onto_name: es gibt mehr als eine Merge-Basis"
-#: git-rebase.sh:483 git-rebase.sh:487
+#: git-rebase.sh:491 git-rebase.sh:495
#, sh-format
msgid "$onto_name: there is no merge base"
msgstr "$onto_name: es gibt keine Merge-Basis"
-#: git-rebase.sh:492
+#: git-rebase.sh:500
#, sh-format
msgid "Does not point to a valid commit: $onto_name"
msgstr "$onto_name zeigt auf keinen gültigen Commit"
-#: git-rebase.sh:515
+#: git-rebase.sh:523
#, sh-format
msgid "fatal: no such branch: $branch_name"
msgstr "fatal: Branch $branch_name nicht gefunden"
-#: git-rebase.sh:548
+#: git-rebase.sh:556
msgid "Cannot autostash"
msgstr "Kann \"autostash\" nicht ausführen."
-#: git-rebase.sh:553
+#: git-rebase.sh:561
#, sh-format
msgid "Created autostash: $stash_abbrev"
msgstr "\"autostash\" erzeugt: $stash_abbrev"
-#: git-rebase.sh:557
+#: git-rebase.sh:565
msgid "Please commit or stash them."
msgstr "Bitte committen Sie die Änderungen oder benutzen Sie \"stash\"."
-#: git-rebase.sh:577
+#: git-rebase.sh:585
#, sh-format
msgid "Current branch $branch_name is up to date."
msgstr "Aktueller Branch $branch_name ist auf dem neusten Stand."
-#: git-rebase.sh:581
+#: git-rebase.sh:589
#, sh-format
msgid "Current branch $branch_name is up to date, rebase forced."
msgstr ""
"Aktueller Branch $branch_name ist auf dem neusten Stand, Rebase erzwungen."
-#: git-rebase.sh:592
+#: git-rebase.sh:600
#, sh-format
msgid "Changes from $mb to $onto:"
msgstr "Änderungen von $mb zu $onto:"
-#. Detach HEAD and reset the tree
-#: git-rebase.sh:601
+#: git-rebase.sh:609
msgid "First, rewinding head to replay your work on top of it..."
msgstr ""
"Zunächst wird der Branch zurückgespult, um Ihre Änderungen\n"
"darauf neu anzuwenden..."
-#: git-rebase.sh:611
+#: git-rebase.sh:619
#, sh-format
msgid "Fast-forwarded $branch_name to $onto_name."
msgstr "$branch_name zu $onto_name vorgespult."
@@ -10693,21 +10674,21 @@ msgstr "Kann geänderte Dateien nicht aus der Staging-Area entfernen"
msgid "Index was not unstashed."
msgstr "Staging-Area wurde nicht aus dem Stash zurückgeladen."
-#: git-stash.sh:523
+#: git-stash.sh:529
#, sh-format
msgid "Dropped ${REV} ($s)"
msgstr "Gelöscht ${REV} ($s)"
-#: git-stash.sh:524
+#: git-stash.sh:530
#, sh-format
msgid "${REV}: Could not drop stash entry"
msgstr "${REV}: Konnte \"stash\"-Eintrag nicht löschen"
-#: git-stash.sh:531
+#: git-stash.sh:537
msgid "No branch name specified"
msgstr "Kein Branchname spezifiziert"
-#: git-stash.sh:603
+#: git-stash.sh:609
msgid "(To restore them type \"git stash apply\")"
msgstr "(Zur Wiederherstellung geben Sie \"git stash apply\" ein)"
@@ -10721,33 +10702,33 @@ msgstr "Kann eine Komponente von URL '$remoteurl' nicht extrahieren"
msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
msgstr "Keine Submodul-Zuordnung in .gitmodules für Pfad '$sm_path' gefunden"
-#: git-submodule.sh:281
+#: git-submodule.sh:287
#, sh-format
msgid "Clone of '$url' into submodule path '$sm_path' failed"
msgstr "Klonen von '$url' in Submodul-Pfad '$sm_path' fehlgeschlagen"
-#: git-submodule.sh:293
+#: git-submodule.sh:299
#, sh-format
msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
msgstr "Git-Verzeichnis '$a' ist Teil des Submodul-Pfades '$b', oder umgekehrt"
-#: git-submodule.sh:403
+#: git-submodule.sh:409
msgid "Relative path can only be used from the toplevel of the working tree"
msgstr ""
"Relative Pfade können nur von der obersten Ebene des Arbeitsverzeichnisses "
"benutzt werden."
-#: git-submodule.sh:413
+#: git-submodule.sh:419
#, sh-format
msgid "repo URL: '$repo' must be absolute or begin with ./|../"
msgstr "repo URL: '$repo' muss absolut sein oder mit ./|../ beginnen"
-#: git-submodule.sh:430
+#: git-submodule.sh:436
#, sh-format
msgid "'$sm_path' already exists in the index"
msgstr "'$sm_path' ist bereits zum Commit vorgemerkt"
-#: git-submodule.sh:434
+#: git-submodule.sh:440
#, sh-format
msgid ""
"The following path is ignored by one of your .gitignore files:\n"
@@ -10758,24 +10739,24 @@ msgstr ""
"$sm_path\n"
"Benutzen Sie -f wenn Sie diesen wirklich hinzufügen möchten."
-#: git-submodule.sh:452
+#: git-submodule.sh:458
#, sh-format
msgid "Adding existing repo at '$sm_path' to the index"
msgstr "Füge existierendes Repository in '$sm_path' der Staging-Area hinzu."
-#: git-submodule.sh:454
+#: git-submodule.sh:460
#, sh-format
msgid "'$sm_path' already exists and is not a valid git repo"
msgstr "'$sm_path' existiert bereits und ist kein gültiges Git-Repository"
-#: git-submodule.sh:462
+#: git-submodule.sh:468
#, sh-format
msgid "A git directory for '$sm_name' is found locally with remote(s):"
msgstr ""
"Ein Git-Verzeichnis für '$sm_name' wurde lokal gefunden mit den Remote-"
"Repositories:"
-#: git-submodule.sh:464
+#: git-submodule.sh:470
#, sh-format
msgid ""
"If you want to reuse this local git directory instead of cloning again from"
@@ -10783,7 +10764,7 @@ msgstr ""
"Wenn Sie dieses lokale Git-Verzeichnis wiederverwenden möchtest, anstatt "
"erneut zu klonen"
-#: git-submodule.sh:466
+#: git-submodule.sh:472
#, sh-format
msgid ""
"use the '--force' option. If the local git directory is not the correct repo"
@@ -10791,7 +10772,7 @@ msgstr ""
"benutzen Sie die Option '--force'. Wenn das lokale Git-Verzeichnis nicht das "
"korrekte Repository ist"
-#: git-submodule.sh:467
+#: git-submodule.sh:473
#, sh-format
msgid ""
"or you are unsure what this means choose another name with the '--name' "
@@ -10800,77 +10781,77 @@ msgstr ""
"oder Sie sich unsicher sind, was das bedeutet, wählen Sie einen anderen "
"Namenmit der Option '--name'."
-#: git-submodule.sh:469
+#: git-submodule.sh:475
#, sh-format
msgid "Reactivating local git directory for submodule '$sm_name'."
msgstr "Reaktiviere lokales Git-Verzeichnis für Submodul '$sm_name'."
-#: git-submodule.sh:481
+#: git-submodule.sh:487
#, sh-format
msgid "Unable to checkout submodule '$sm_path'"
-msgstr "Unfähig Submodul '$sm_path' auszuchecken"
+msgstr "Kann Submodul '$sm_path' nicht auschecken"
-#: git-submodule.sh:486
+#: git-submodule.sh:492
#, sh-format
msgid "Failed to add submodule '$sm_path'"
msgstr "Hinzufügen von Submodul '$sm_path' fehlgeschlagen"
-#: git-submodule.sh:495
+#: git-submodule.sh:501
#, sh-format
msgid "Failed to register submodule '$sm_path'"
msgstr "Fehler beim Eintragen von Submodul '$sm_path' in die Konfiguration."
-#: git-submodule.sh:539
+#: git-submodule.sh:545
#, sh-format
msgid "Entering '$prefix$displaypath'"
msgstr "Betrete '$prefix$displaypath'"
-#: git-submodule.sh:559
+#: git-submodule.sh:565
#, sh-format
msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
msgstr "Stoppe bei '$prefix$displaypath'; Skript gab nicht-Null Status zurück."
-#: git-submodule.sh:605
+#: git-submodule.sh:611
#, sh-format
msgid "No url found for submodule path '$displaypath' in .gitmodules"
msgstr "Keine URL für Submodul-Pfad '$displaypath' in .gitmodules gefunden"
-#: git-submodule.sh:614
+#: git-submodule.sh:620
#, sh-format
msgid "Failed to register url for submodule path '$displaypath'"
msgstr ""
"Fehler beim Eintragen der URL für Submodul-Pfad '$displaypath' in die "
"Konfiguration."
-#: git-submodule.sh:616
+#: git-submodule.sh:622
#, sh-format
msgid "Submodule '$name' ($url) registered for path '$displaypath'"
msgstr ""
"Submodul '$name' ($url) für Pfad '$displaypath' in die Konfiguration "
"eingetragen."
-#: git-submodule.sh:633
+#: git-submodule.sh:639
#, sh-format
msgid "Failed to register update mode for submodule path '$displaypath'"
msgstr ""
"Fehler bei Änderung des Aktualisierungsmodus für Submodul-Pfad "
"'$displaypath' in der Konfiguration."
-#: git-submodule.sh:671
+#: git-submodule.sh:677
#, sh-format
msgid "Use '.' if you really want to deinitialize all submodules"
msgstr ""
"Verwenden Sie '.' wenn Sie wirklich alle Submodule\n"
"deinitialisieren möchten."
-#: git-submodule.sh:688
+#: git-submodule.sh:694
#, sh-format
msgid "Submodule work tree '$displaypath' contains a .git directory"
msgstr ""
"Arbeitsverzeichnis des Submoduls in '$displaypath' enthält ein .git-"
"Verzeichnis"
-#: git-submodule.sh:689
+#: git-submodule.sh:695
#, sh-format
msgid ""
"(use 'rm -rf' if you really want to remove it including all of its history)"
@@ -10878,7 +10859,7 @@ msgstr ""
"(benutzen Sie 'rm -rf' wenn Sie dieses Submodul wirklich mitsamt\n"
"seiner Historie löschen möchten)"
-#: git-submodule.sh:695
+#: git-submodule.sh:701
#, sh-format
msgid ""
"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -10887,31 +10868,31 @@ msgstr ""
"Arbeitsverzeichnis von Submodul in '$displaypath' enthält lokale Änderungen; "
"verwenden Sie '-f' um diese zu verwerfen"
-#: git-submodule.sh:698
+#: git-submodule.sh:704
#, sh-format
msgid "Cleared directory '$displaypath'"
msgstr "Verzeichnis '$displaypath' bereinigt."
-#: git-submodule.sh:699
+#: git-submodule.sh:705
#, sh-format
msgid "Could not remove submodule work tree '$displaypath'"
msgstr ""
"Konnte Arbeitsverzeichnis des Submoduls in '$displaypath' nicht löschen."
-#: git-submodule.sh:702
+#: git-submodule.sh:708
#, sh-format
msgid "Could not create empty submodule directory '$displaypath'"
msgstr ""
"Konnte kein leeres Verzeichnis für Submodul in '$displaypath' erstellen."
-#: git-submodule.sh:711
+#: git-submodule.sh:717
#, sh-format
msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
msgstr ""
"Submodul '$name' ($url) für Pfad '$displaypath' wurde aus der Konfiguration "
"entfernt."
-#: git-submodule.sh:834
+#: git-submodule.sh:833
#, sh-format
msgid ""
"Submodule path '$displaypath' not initialized\n"
@@ -10920,42 +10901,52 @@ msgstr ""
"Submodul-Pfad '$displaypath' ist nicht initialisiert.\n"
"Vielleicht möchten Sie 'update --init' benutzen?"
-#: git-submodule.sh:847
+#: git-submodule.sh:846
#, sh-format
msgid "Unable to find current revision in submodule path '$displaypath'"
msgstr "Konnte aktuellen Commit in Submodul-Pfad '$displaypath' nicht finden."
-#: git-submodule.sh:856
+#: git-submodule.sh:855
#, sh-format
msgid "Unable to fetch in submodule path '$sm_path'"
msgstr "Konnte \"fetch\" in Submodul-Pfad '$sm_path' nicht ausführen"
-#: git-submodule.sh:880
+#: git-submodule.sh:879
#, sh-format
msgid "Unable to fetch in submodule path '$displaypath'"
msgstr "Konnte \"fetch\" in Submodul-Pfad '$displaypath' nicht ausführen"
+#: git-submodule.sh:893
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr "Konnte '$sha1' in Submodul-Pfad '$displaypath' nicht auschecken."
+
#: git-submodule.sh:894
#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "Submodul-Pfad: '$displaypath': '$sha1' ausgecheckt"
+
+#: git-submodule.sh:898
+#, sh-format
msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
msgstr "Rebase auf '$sha1' in Submodul-Pfad '$displaypath' nicht möglich"
-#: git-submodule.sh:895
+#: git-submodule.sh:899
#, sh-format
msgid "Submodule path '$displaypath': rebased into '$sha1'"
msgstr "Submodul-Pfad '$displaypath': Rebase auf '$sha1'"
-#: git-submodule.sh:900
+#: git-submodule.sh:904
#, sh-format
msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
msgstr "Merge von '$sha1' in Submodul-Pfad '$displaypath' fehlgeschlagen"
-#: git-submodule.sh:901
+#: git-submodule.sh:905
#, sh-format
msgid "Submodule path '$displaypath': merged in '$sha1'"
msgstr "Submodul-Pfad '$displaypath': zusammengeführt in '$sha1'"
-#: git-submodule.sh:906
+#: git-submodule.sh:910
#, sh-format
msgid ""
"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
@@ -10963,67 +10954,172 @@ msgstr ""
"Ausführung von '$command $sha1' in Submodul-Pfad '$prefix$sm_path' "
"fehlgeschlagen"
-#: git-submodule.sh:907
+#: git-submodule.sh:911
#, sh-format
msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
msgstr "Submodul-Pfad '$prefix$sm_path': '$command $sha1'"
-#: git-submodule.sh:912
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
-msgstr "Konnte '$sha1' in Submodul-Pfad '$displaypath' nicht auschecken."
-
-#: git-submodule.sh:913
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "Submodul-Pfad: '$displaypath': '$sha1' ausgecheckt"
-
-#: git-submodule.sh:940
+#: git-submodule.sh:941
#, sh-format
msgid "Failed to recurse into submodule path '$displaypath'"
msgstr "Fehler bei Rekursion in Submodul-Pfad '$displaypath'"
-#: git-submodule.sh:1048
+#: git-submodule.sh:1049
msgid "The --cached option cannot be used with the --files option"
msgstr ""
"Die Optionen --cached und --files können nicht gemeinsam verwendet werden."
-#. unexpected type
-#: git-submodule.sh:1096
+#: git-submodule.sh:1097
#, sh-format
msgid "unexpected mode $mod_dst"
msgstr "unerwarteter Modus $mod_dst"
-#: git-submodule.sh:1116
+#: git-submodule.sh:1117
#, sh-format
msgid " Warn: $display_name doesn't contain commit $sha1_src"
msgstr " Warnung: $display_name beinhaltet nicht Commit $sha1_src"
-#: git-submodule.sh:1119
+#: git-submodule.sh:1120
#, sh-format
msgid " Warn: $display_name doesn't contain commit $sha1_dst"
msgstr " Warnung: $display_name beinhaltet nicht Commit $sha1_dst"
-#: git-submodule.sh:1122
+#: git-submodule.sh:1123
#, sh-format
msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
msgstr ""
" Warnung: $display_name beinhaltet nicht die Commits $sha1_src und $sha1_dst"
-#: git-submodule.sh:1147
+#: git-submodule.sh:1148
msgid "blob"
msgstr "Blob"
-#: git-submodule.sh:1261
+#: git-submodule.sh:1262
#, sh-format
msgid "Failed to recurse into submodule path '$sm_path'"
msgstr "Fehler bei Rekursion in Submodul-Pfad '$sm_path'"
-#: git-submodule.sh:1325
+#: git-submodule.sh:1326
#, sh-format
msgid "Synchronizing submodule url for '$displaypath'"
msgstr "Synchronisiere Submodul-URL für '$displaypath'"
+#~ msgid "key id"
+#~ msgstr "Schlüssel-ID"
+
+#~ msgid "Tracking not set up: name too long: %s"
+#~ msgstr ""
+#~ "Konfiguration zum Folgen von Branch nicht eingerichtet. Name zu lang: %s"
+
+#~ msgid "bug"
+#~ msgstr "Fehler"
+
+#~ msgid "ahead "
+#~ msgstr "voraus "
+
+#~ msgid ", behind "
+#~ msgstr ", hinterher "
+
+#~ msgid "could not find .gitmodules in index"
+#~ msgstr "Konnte .gitmodules nicht in der Staging-Area finden"
+
+#~ msgid "reading updated .gitmodules failed"
+#~ msgstr "Lesen der aktualisierten .gitmodules-Datei fehlgeschlagen"
+
+#~ msgid "unable to stat updated .gitmodules"
+#~ msgstr "Konnte aktualisierte .gitmodules-Datei nicht lesen"
+
+#~ msgid "unable to remove .gitmodules from index"
+#~ msgstr "Konnte .gitmodules nicht aus der Staging-Area entfernen"
+
+#~ msgid "adding updated .gitmodules failed"
+#~ msgstr "Konnte aktualisierte .gitmodules-Datei nicht hinzufügen"
+
+#~ msgid ""
+#~ "The behavior of 'git add %s (or %s)' with no path argument from a\n"
+#~ "subdirectory of the tree will change in Git 2.0 and should not be used "
+#~ "anymore.\n"
+#~ "To add content for the whole tree, run:\n"
+#~ "\n"
+#~ " git add %s :/\n"
+#~ " (or git add %s :/)\n"
+#~ "\n"
+#~ "To restrict the command to the current directory, run:\n"
+#~ "\n"
+#~ " git add %s .\n"
+#~ " (or git add %s .)\n"
+#~ "\n"
+#~ "With the current Git version, the command is restricted to the current "
+#~ "directory.\n"
+#~ msgstr ""
+#~ "Das Verhalten von 'git add %s (oder %s)' ohne ein Pfad-Argument von\n"
+#~ "einem Unterverzeichnis aus wird in Git 2.0 geändert und sollte nicht\n"
+#~ "mehr verwendet werden.\n"
+#~ "Um Dateien des gesamten Projektverzeichnisses hinzuzufügen, führen Sie "
+#~ "aus:\n"
+#~ "\n"
+#~ " git add %s :/\n"
+#~ " (oder git add %s :/)\n"
+#~ "\n"
+#~ "Zur Einschränkung auf das aktuelle Verzeichnis führen Sie aus:\n"
+#~ "\n"
+#~ " git add %s .\n"
+#~ " (oder git add %s .)\n"
+#~ "\n"
+#~ "Mit der aktuellen Version von Git ist das Kommando auf das aktuelle\n"
+#~ "Verzeichnis beschränkt.\n"
+
+#~ msgid ""
+#~ "You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
+#~ "whose behaviour will change in Git 2.0 with respect to paths you "
+#~ "removed.\n"
+#~ "Paths like '%s' that are\n"
+#~ "removed from your working tree are ignored with this version of Git.\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <pathspec>', which is the current default,\n"
+#~ " ignores paths you removed from your working tree.\n"
+#~ "\n"
+#~ "* 'git add --all <pathspec>' will let you also record the removals.\n"
+#~ "\n"
+#~ "Run 'git status' to check the paths you removed from your working tree.\n"
+#~ msgstr ""
+#~ "Sie haben 'git add' weder mit '-A (--all)' noch mit '--ignore-removal'\n"
+#~ "ausgeführt. Das Verhalten des Kommandos ändert sich in Git 2.0 durch\n"
+#~ "Berücksichtigung der gelöschten Pfade.\n"
+#~ "Pfade wie '%s', die im Arbeitsverzeichnis gelöscht wurden, werden in\n"
+#~ "dieser Version von Git ignoriert.\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <Pfadspezifikation>', was der aktuelle\n"
+#~ " Standardwert ist, ignoriert gelöschte Pfade im Arbeitsverzeichnis.\n"
+#~ "* 'git add --all <Pfadspezifikation>' berücksichtigt ebenfalls gelöschte\n"
+#~ " Pfade.\n"
+#~ "Führen Sie 'git status' aus, um die gelöschten Pfade zu überprüfen.\n"
+
+#~ msgid ""
+#~ "Auto packing the repository for optimum performance. You may also\n"
+#~ "run \"git gc\" manually. See \"git help gc\" for more information.\n"
+#~ msgstr ""
+#~ "Die Datenbank des Repositories wird für eine optimale Performance\n"
+#~ "komprimiert. Sie können auch \"git gc\" manuell ausführen.\n"
+#~ "Siehe \"git help gc\" für weitere Informationen.\n"
+
+#~ msgid ""
+#~ "Updates were rejected because a pushed branch tip is behind its remote\n"
+#~ "counterpart. If you did not intend to push that branch, you may want to\n"
+#~ "specify branches to push or set the 'push.default' configuration "
+#~ "variable\n"
+#~ "to 'simple', 'current' or 'upstream' to push only the current branch."
+#~ msgstr ""
+#~ "Aktualisierungen wurden zurückgewiesen, weil die Spitze eines "
+#~ "versendeten\n"
+#~ "Branches hinter seinem externen Gegenstück zurückgefallen ist. Wenn Sie "
+#~ "nicht\n"
+#~ "beabsichtigt haben, diesen Branch zu versenden, können Sie auch den zu "
+#~ "versendenden\n"
+#~ "Branch spezifizieren oder die Konfigurationsvariable 'push.default' zu "
+#~ "'simple', 'current'\n"
+#~ "oder 'upstream' setzen, um nur den aktuellen Branch zu versenden."
+
#~ msgid "copied: %s -> %s"
#~ msgstr "kopiert: %s -> %s"
@@ -11042,9 +11138,6 @@ msgstr "Synchronisiere Submodul-URL für '$displaypath'"
#~ msgid "input paths are terminated by a null character"
#~ msgstr "Eingabepfade sind durch ein NUL Zeichen abgeschlossen"
-#~ msgid "done\n"
-#~ msgstr "Fertig\n"
-
#~ msgid ""
#~ "The following untracked files would NOT be saved but need to be removed "
#~ "by stash save:"
@@ -11176,20 +11269,12 @@ msgstr "Synchronisiere Submodul-URL für '$displaypath'"
#~ msgstr[0] ", %d Zeile entfernt(-)"
#~ msgstr[1] ", %d Zeilen entfernt(-)"
-#~ msgid "Auto packing the repository for optimum performance.\n"
-#~ msgstr ""
-#~ "Die Datenbank des Projektarchivs wird für eine optimale Performance "
-#~ "komprimiert.\n"
-
#~ msgid "git remote set-head <name> (-a | -d | <branch>])"
#~ msgstr "git remote set-head <Name> (-a | -d | <Zweig>])"
#~ msgid " (use \"git add\" to track)"
#~ msgstr " (benutze \"git add\" zum Beobachten)"
-#~ msgid "-B cannot be used with -b"
-#~ msgstr "-B kann nicht mit -b benutzt werden"
-
#~ msgid "--detach cannot be used with -b/-B/--orphan"
#~ msgstr "--detach kann nicht mit -b/-B/--orphan benutzt werden"
diff --git a/po/fr.po b/po/fr.po
index 0b9d59e8fa..6b32da05bc 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -73,8 +73,8 @@ msgid ""
msgstr ""
"Project-Id-Version: git\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-02-01 08:06+0800\n"
-"PO-Revision-Date: 2014-02-02 14:35+0100\n"
+"POT-Creation-Date: 2014-04-19 12:50+0800\n"
+"PO-Revision-Date: 2014-04-22 21:28+0200\n"
"Last-Translator: Jean-Noël Avila <jn.avila@free.fr>\n"
"Language-Team: Jean-Noël Avila <jn.avila@free.fr>\n"
"Language: fr\n"
@@ -83,16 +83,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n<=1 ?0 : 1;\n"
-#: advice.c:57
+#: advice.c:55
#, c-format
msgid "hint: %.*s\n"
msgstr "astuce: %.*s\n"
-#.
-#. * Message used both when 'git commit' fails and when
-#. * other commands doing a merge do.
-#.
-#: advice.c:87
+#: advice.c:85
msgid ""
"Fix them up in the work tree,\n"
"and then use 'git add/rm <file>' as\n"
@@ -123,76 +119,76 @@ msgstr ""
msgid "git archive --remote <repo> [--exec <cmd>] --list"
msgstr "git archive --remote <dépôt> [--exec <commande>] --list"
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
#, c-format
msgid "pathspec '%s' did not match any files"
msgstr "le chemin '%s' ne correspond à aucun fichier"
-#: archive.c:327
+#: archive.c:328
msgid "fmt"
msgstr "fmt"
-#: archive.c:327
+#: archive.c:328
msgid "archive format"
msgstr "format d'archive"
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
msgid "prefix"
msgstr "préfixe"
-#: archive.c:329
+#: archive.c:330
msgid "prepend prefix to each pathname in the archive"
msgstr "préfixer chaque chemin de fichier dans l'archive"
-#: 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
+#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2258
+#: builtin/blame.c:2259 builtin/config.c:57 builtin/fast-export.c:680
+#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
+#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
msgid "file"
msgstr "fichier"
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 builtin/archive.c:89
msgid "write the archive to this file"
msgstr "écrire l'archive dans ce fichier"
-#: archive.c:333
+#: archive.c:334
msgid "read .gitattributes in working directory"
msgstr "lire .gitattributes dans le répertoire de travail"
-#: archive.c:334
+#: archive.c:335
msgid "report archived files on stderr"
msgstr "afficher les fichiers archivés sur stderr"
-#: archive.c:335
+#: archive.c:336
msgid "store only"
msgstr "stockage seulement"
-#: archive.c:336
+#: archive.c:337
msgid "compress faster"
msgstr "compression rapide"
-#: archive.c:344
+#: archive.c:345
msgid "compress better"
msgstr "compression efficace"
-#: archive.c:347
+#: archive.c:348
msgid "list supported archive formats"
msgstr "afficher les formats d'archive supportés"
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
msgid "repo"
msgstr "dépôt"
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 builtin/archive.c:91
msgid "retrieve the archive from remote repository <repo>"
msgstr "récupérer l'archive depuis le dépôt distant <dépôt>"
-#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
msgid "command"
msgstr "commande"
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
msgid "path to the remote git-upload-archive command"
msgstr "chemin vers la commande distante git-upload-archive"
@@ -209,90 +205,85 @@ msgstr ""
msgid "Not setting branch %s as its own upstream."
msgstr "La branche %s ne peut pas être sa propre branche amont."
-#: branch.c:82
+#: branch.c:83
#, c-format
msgid "Branch %s set up to track remote branch %s from %s by rebasing."
msgstr ""
"La branche %s est paramétrée pour suivre la branche distante %s de %s en "
"rebasant."
-#: branch.c:83
+#: branch.c:84
#, c-format
msgid "Branch %s set up to track remote branch %s from %s."
msgstr ""
"La branche %s est paramétrée pour suivre la branche distante %s depuis %s."
-#: branch.c:87
+#: branch.c:88
#, c-format
msgid "Branch %s set up to track local branch %s by rebasing."
msgstr ""
"La branche %s est paramétrée pour suivre la branche locale %s en rebasant."
-#: branch.c:88
+#: branch.c:89
#, c-format
msgid "Branch %s set up to track local branch %s."
msgstr "La branche %s est paramétrée pour suivre la branche locale %s."
-#: branch.c:92
+#: branch.c:94
#, c-format
msgid "Branch %s set up to track remote ref %s by rebasing."
msgstr ""
"La branche %s est paramétrée pour suivre la référence distante %s en "
"rebasant."
-#: branch.c:93
+#: branch.c:95
#, c-format
msgid "Branch %s set up to track remote ref %s."
msgstr "La branche %s est paramétrée pour suivre la référence distante %s."
-#: branch.c:97
+#: branch.c:99
#, c-format
msgid "Branch %s set up to track local ref %s by rebasing."
msgstr ""
"La branche %s est paramétrée pour suivre la référence locale %s en rebasant."
-#: branch.c:98
+#: branch.c:100
#, c-format
msgid "Branch %s set up to track local ref %s."
msgstr "La branche %s est paramétrée pour suivre la référence locale %s."
-#: branch.c:118
-#, c-format
-msgid "Tracking not set up: name too long: %s"
-msgstr "Suivi de branche non paramétré : le nom est trop long : %s"
-
-#: branch.c:137
+#: branch.c:133
#, c-format
msgid "Not tracking: ambiguous information for ref %s"
msgstr "Pas de suivi : information ambiguë pour la référence %s"
-#: branch.c:182
+#: branch.c:178
#, c-format
msgid "'%s' is not a valid branch name."
msgstr "'%s' n'est pas un nom de branche valide."
-#: branch.c:187
+#: branch.c:183
#, c-format
msgid "A branch named '%s' already exists."
msgstr "Une branche nommée '%s' existe déjà."
-#: branch.c:195
+#: branch.c:191
msgid "Cannot force update the current branch."
msgstr "Impossible de forcer la mise à jour de la branche courante."
-#: branch.c:215
+#: branch.c:211
#, c-format
msgid "Cannot setup tracking information; starting point '%s' is not a branch."
msgstr ""
"Impossible de paramétrer le suivi de branche ; le point de départ '%s' n'est "
"pas une branche."
-#: branch.c:217
+#: branch.c:213
#, c-format
msgid "the requested upstream branch '%s' does not exist"
msgstr "la branche amont demandée '%s' n'existe pas"
-#: branch.c:219
+#: branch.c:215
msgid ""
"\n"
"If you are planning on basing your work on an upstream\n"
@@ -305,120 +296,120 @@ msgid ""
msgstr ""
"\n"
"Si vous comptez baser votre travail sur une branche\n"
-"amont qui existe déjà sur le serveur distant, vous pourriez\n"
-"devoir lancer \"git fetch\" pour la récupérer.\n"
+"amont qui existe déjà sur le serveur distant, vous pouvez\n"
+"lancer \"git fetch\" pour la récupérer.\n"
"\n"
"Si vous comptez pousser une nouvelle branche locale qui suivra\n"
-"sa jumelle distante, vous souhaiterez utiliser \"git push -u\"\n"
+"sa jumelle distante, vous pouvez utiliser \"git push -u\"\n"
"pour paramétrer le suivi distant en même temps que vous poussez."
-#: branch.c:264
+#: branch.c:260
#, c-format
msgid "Not a valid object name: '%s'."
msgstr "Nom d'objet invalide : '%s'."
-#: branch.c:284
+#: branch.c:280
#, c-format
msgid "Ambiguous object name: '%s'."
msgstr "Nom d'objet ambigu : '%s'."
-#: branch.c:289
+#: branch.c:285
#, c-format
msgid "Not a valid branch point: '%s'."
msgstr "Point d'embranchement invalide : '%s'."
-#: branch.c:295
+#: branch.c:291
msgid "Failed to lock ref for update"
msgstr "Échec du verrouillage de la référence pour mise à jour"
-#: branch.c:313
+#: branch.c:309
msgid "Failed to write ref"
msgstr "Échec de l'écriture de la référence"
-#: bundle.c:37
+#: bundle.c:33
#, c-format
msgid "'%s' does not look like a v2 bundle file"
msgstr "'%s' ne semble pas être un fichier bundle v2"
-#: bundle.c:64
+#: bundle.c:60
#, c-format
msgid "unrecognized header: %s%s (%d)"
msgstr "en-tête non reconnu : %s%s (%d)"
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
#, c-format
msgid "could not open '%s'"
msgstr "impossible d'ouvrir '%s'"
-#: bundle.c:141
+#: bundle.c:138
msgid "Repository lacks these prerequisite commits:"
-msgstr "Le dépôt ne dispose pas des commits prérequis :"
+msgstr "Le dépôt ne dispose pas des commits prérequis suivants :"
-#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: bundle.c:162 sequencer.c:669 sequencer.c:1123 builtin/log.c:332
#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357
#: builtin/shortlog.c:158
msgid "revision walk setup failed"
msgstr "échec de la préparation du parcours des révisions"
-#: bundle.c:187
+#: bundle.c:184
#, c-format
msgid "The bundle contains this ref:"
msgid_plural "The bundle contains these %d refs:"
msgstr[0] "Le colis contient cette référence :"
msgstr[1] "Le colis contient ces %d références :"
-#: bundle.c:194
+#: bundle.c:191
msgid "The bundle records a complete history."
msgstr "Le colis enregistre l'historique complet."
-#: bundle.c:196
+#: bundle.c:193
#, c-format
msgid "The bundle requires this ref:"
msgid_plural "The bundle requires these %d refs:"
msgstr[0] "Le colis exige cette référence :"
msgstr[1] "Le colis exige ces %d références :"
-#: bundle.c:296
+#: bundle.c:293
msgid "rev-list died"
msgstr "rev-list a disparu"
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
#, c-format
msgid "unrecognized argument: %s"
msgstr "argument non reconnu : %s"
-#: bundle.c:337
+#: bundle.c:334
#, c-format
msgid "ref '%s' is excluded by the rev-list options"
msgstr "la référence '%s' est exclue par les options de rev-list"
-#: bundle.c:382
+#: bundle.c:379
msgid "Refusing to create empty bundle."
msgstr "Refus de créer un colis vide."
-#: bundle.c:398
+#: bundle.c:395
msgid "Could not spawn pack-objects"
msgstr "Impossible de créer des objets groupés"
-#: bundle.c:416
+#: bundle.c:413
msgid "pack-objects died"
msgstr "les objets groupés ont disparu"
-#: bundle.c:419
+#: bundle.c:416
#, c-format
msgid "cannot create '%s'"
msgstr "impossible de créer '%s'"
-#: bundle.c:441
+#: bundle.c:438
msgid "index-pack died"
msgstr "l'index de groupe a disparu"
-#: commit.c:53
+#: commit.c:54
#, c-format
msgid "could not parse %s"
msgstr "impossible d'analyser %s"
-#: commit.c:55
+#: commit.c:56
#, c-format
msgid "%s %s is not a commit!"
msgstr "%s %s n'est pas un commit !"
@@ -494,6 +485,7 @@ msgid_plural "%lu years"
msgstr[0] "%lu an"
msgstr[1] "%lu ans"
+#. TRANSLATORS: "%s" is "<n> years"
#: date.c:149
#, c-format
msgid "%s, %lu month ago"
@@ -513,6 +505,10 @@ msgstr[1] "il y a %lu ans"
msgid "failed to read orderfile '%s'"
msgstr "impossible de lire le fichier de commande '%s'"
+#: diffcore-rename.c:517
+msgid "Performing inexact rename detection"
+msgstr "Détection de renommage inexact en cours"
+
#: diff.c:113
#, c-format
msgid " Failed to parse dirstat cut-off percentage '%s'\n"
@@ -539,7 +535,7 @@ msgstr ""
"Erreurs dans la variable de configuration 'diff.dirstat' :\n"
"%s"
-#: diff.c:3509
+#: diff.c:3495
#, c-format
msgid ""
"Failed to parse --dirstat/-X option parameter:\n"
@@ -548,7 +544,7 @@ msgstr ""
"Impossible d'analyser le paramètre de l'option --dirstat/-X :\n"
"%s"
-#: diff.c:3523
+#: diff.c:3509
#, c-format
msgid "Failed to parse --submodule option parameter: '%s'"
msgstr "Impossible d'analyser le paramètre de l'option --submodule : '%s'"
@@ -575,35 +571,35 @@ msgstr "impossible de créer un fichier temporaire '%s' : %s"
msgid "failed writing detached signature to '%s': %s"
msgstr "impossible d'écrire la signature détachée dans '%s' : %s"
-#: grep.c:1695
+#: grep.c:1698
#, c-format
msgid "'%s': unable to read %s"
msgstr "'%s' : lecture de %s impossible"
-#: grep.c:1712
+#: grep.c:1715
#, c-format
msgid "'%s': %s"
msgstr "'%s' : %s"
-#: grep.c:1723
+#: grep.c:1726
#, c-format
msgid "'%s': short read %s"
msgstr "'%s' : lecture tronquée %s"
-#: help.c:210
+#: help.c:209
#, c-format
msgid "available git commands in '%s'"
msgstr "commandes git disponibles dans '%s'"
-#: help.c:217
+#: help.c:216
msgid "git commands available from elsewhere on your $PATH"
msgstr "commandes git disponibles depuis un autre endroit de votre $PATH"
-#: help.c:233
+#: help.c:232
msgid "The most commonly used git commands are:"
msgstr "Les commandes git les plus utilisées sont :"
-#: help.c:290
+#: help.c:289
#, c-format
msgid ""
"'%s' appears to be a git command, but we were not\n"
@@ -612,11 +608,11 @@ msgstr ""
"'%s' semble être une commande git, mais elle n'a pas pu\n"
"être exécutée. Peut-être git-%s est-elle cassée ?"
-#: help.c:347
+#: help.c:346
msgid "Uh oh. Your system reports no Git commands at all."
msgstr "Ahem. Votre système n'indique aucune commande Git."
-#: help.c:369
+#: help.c:368
#, c-format
msgid ""
"WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -624,19 +620,19 @@ msgid ""
msgstr ""
"ATTENTION : vous avez invoqué une commande Git nommée '%s' qui n'existe "
"pas.\n"
-"Poursuite en supposant que vous avez voulu dire '%s'"
+"Continuons en supposant que vous avez voulu dire '%s'"
-#: help.c:374
+#: help.c:373
#, c-format
msgid "in %0.1f seconds automatically..."
msgstr "dans %0.1f secondes automatiquement..."
-#: help.c:381
+#: help.c:380
#, c-format
msgid "git: '%s' is not a git command. See 'git --help'."
msgstr "git : '%s' n'est pas une commande git. Voir 'git --help'."
-#: help.c:385 help.c:444
+#: help.c:384 help.c:443
msgid ""
"\n"
"Did you mean this?"
@@ -650,7 +646,7 @@ msgstr[1] ""
"\n"
"Vouliez-vous dire un de ceux-là ?"
-#: help.c:440
+#: help.c:439
#, c-format
msgid "%s: %s - %s"
msgstr "%s: %s - %s"
@@ -659,7 +655,7 @@ msgstr "%s: %s - %s"
msgid "failed to read the cache"
msgstr "impossible de lire le cache"
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
#: builtin/clone.c:661
msgid "unable to write new index file"
msgstr "impossible d'écrire le nouveau fichier d'index"
@@ -669,75 +665,73 @@ msgstr "impossible d'écrire le nouveau fichier d'index"
msgid "(bad commit)\n"
msgstr "(mauvais commit)\n"
-#: merge-recursive.c:206
+#: merge-recursive.c:208
#, c-format
msgid "addinfo_cache failed for path '%s'"
msgstr "échec de addinfo_cache pour le chemin '%s'"
-#: merge-recursive.c:269
+#: merge-recursive.c:271
msgid "error building trees"
msgstr "erreur de construction des arbres"
-#: merge-recursive.c:673
+#: merge-recursive.c:675
#, c-format
msgid "failed to create path '%s'%s"
msgstr "impossible de créer le chemin '%s' %s"
-#: merge-recursive.c:684
+#: merge-recursive.c:686
#, c-format
msgid "Removing %s to make room for subdirectory\n"
msgstr "Suppression de %s pour faire de la place pour le sous-répertoire\n"
-#. something else exists
-#. .. but not some other error (who really cares what?)
-#: merge-recursive.c:698 merge-recursive.c:719
+#: merge-recursive.c:700 merge-recursive.c:721
msgid ": perhaps a D/F conflict?"
msgstr ": peut-être un conflit D/F ?"
-#: merge-recursive.c:709
+#: merge-recursive.c:711
#, c-format
msgid "refusing to lose untracked file at '%s'"
msgstr "refus de perdre le fichier non suivi '%s'"
-#: merge-recursive.c:749
+#: merge-recursive.c:751
#, c-format
msgid "cannot read object %s '%s'"
msgstr "impossible de lire l'objet %s '%s'"
-#: merge-recursive.c:751
+#: merge-recursive.c:753
#, c-format
msgid "blob expected for %s '%s'"
msgstr "blob attendu pour %s '%s'"
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
#, c-format
msgid "failed to open '%s'"
msgstr "échec à l'ouverture de '%s'"
-#: merge-recursive.c:782
+#: merge-recursive.c:784
#, c-format
msgid "failed to symlink '%s'"
msgstr "échec à la création du lien symbolique '%s'"
-#: merge-recursive.c:785
+#: merge-recursive.c:787
#, c-format
msgid "do not know what to do with %06o %s '%s'"
msgstr "ne sait pas traiter %06o %s '%s'"
-#: merge-recursive.c:923
+#: merge-recursive.c:925
msgid "Failed to execute internal merge"
msgstr "Échec à l'exécution de la fusion interne"
-#: merge-recursive.c:927
+#: merge-recursive.c:929
#, c-format
msgid "Unable to add %s to database"
msgstr "Impossible d'ajouter %s à la base de données"
-#: merge-recursive.c:943
+#: merge-recursive.c:945
msgid "unsupported object type in the tree"
msgstr "type d'objet non supporté dans l'arbre"
-#: merge-recursive.c:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -746,7 +740,7 @@ msgstr ""
"CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de "
"%s laissée dans l'arbre."
-#: merge-recursive.c:1028 merge-recursive.c:1041
+#: merge-recursive.c:1030 merge-recursive.c:1043
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -755,20 +749,20 @@ msgstr ""
"CONFLIT (%s/suppression) : %s supprimé dans %s et %s dans %s. Version %s de "
"%s laissée dans l'arbre dans le fichier %s."
-#: merge-recursive.c:1082
+#: merge-recursive.c:1084
msgid "rename"
msgstr "renommage"
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
msgid "renamed"
msgstr "renommé"
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
#, c-format
msgid "%s is a directory in %s adding as %s instead"
msgstr "%s est un répertoire dans %s ajouté plutôt comme %s"
-#: merge-recursive.c:1160
+#: merge-recursive.c:1162
#, c-format
msgid ""
"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -777,146 +771,146 @@ msgstr ""
"CONFLIT (renommage/renommage) : Renommage de \"%s\"->\"%s\" dans la branche "
"\"%s\" et renommage \"%s\"->\"%s\" dans \"%s\"%s"
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
msgid " (left unresolved)"
msgstr " (laissé non résolu)"
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
#, c-format
msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
msgstr ""
"CONFLIT (renommage/renommage) : renommage '%s'->'%s' dans %s. Renommage '%s'-"
">'%s' dans %s"
-#: merge-recursive.c:1249
+#: merge-recursive.c:1251
#, c-format
msgid "Renaming %s to %s and %s to %s instead"
msgstr "Renommage de %s en %s et de %s en %s à la place"
-#: merge-recursive.c:1448
+#: merge-recursive.c:1450
#, c-format
msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
msgstr ""
"CONFLIT (renommage/ajout) : Renommage de %s->%s dans %s. %s ajouté dans %s"
-#: merge-recursive.c:1458
+#: merge-recursive.c:1460
#, c-format
msgid "Adding merged %s"
msgstr "Ajout de %s fusionné"
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
#, c-format
msgid "Adding as %s instead"
msgstr "Ajout plutôt comme %s"
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
#, c-format
msgid "cannot read object %s"
msgstr "impossible de lire l'objet %s"
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
#, c-format
msgid "object %s is not a blob"
msgstr "l'objet %s n'est pas un blob"
-#: merge-recursive.c:1565
+#: merge-recursive.c:1567
msgid "modify"
msgstr "modification"
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
msgid "modified"
msgstr "modifié"
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
msgid "content"
msgstr "contenu"
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
msgid "add/add"
msgstr "ajout/ajout"
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
#, c-format
msgid "Skipped %s (merged same as existing)"
msgstr "%s sauté (fusion identique à l'existant)"
-#: merge-recursive.c:1630
+#: merge-recursive.c:1632
#, c-format
msgid "Auto-merging %s"
msgstr "Fusion automatique de %s"
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
msgid "submodule"
msgstr "sous-module"
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
#, c-format
msgid "CONFLICT (%s): Merge conflict in %s"
msgstr "CONFLIT (%s) : Conflit de fusion dans %s"
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
#, c-format
msgid "Removing %s"
msgstr "Suppression de %s"
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
msgid "file/directory"
msgstr "fichier/répertoire"
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
msgid "directory/file"
msgstr "répertoire/fichier"
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
#, c-format
msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
msgstr ""
"CONFLIT (%s) : Il y a un répertoire nommé %s dans %s. Ajout de %s comme %s"
-#: merge-recursive.c:1771
+#: merge-recursive.c:1773
#, c-format
msgid "Adding %s"
msgstr "Ajout de %s"
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
msgid "Fatal merge failure, shouldn't happen."
msgstr "Échec fatal de fusion, qui ne devrait jamais arriver."
-#: merge-recursive.c:1807
+#: merge-recursive.c:1809
msgid "Already up-to-date!"
msgstr "Déjà à jour !"
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
#, c-format
msgid "merging of trees %s and %s failed"
msgstr "échec de fusion des arbres %s et %s"
-#: merge-recursive.c:1846
+#: merge-recursive.c:1848
#, c-format
msgid "Unprocessed path??? %s"
msgstr "Chemin non traité ??? %s"
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
msgid "Merging:"
msgstr "Fusion :"
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
#, c-format
msgid "found %u common ancestor:"
msgid_plural "found %u common ancestors:"
msgstr[0] "%u ancêtre commun trouvé :"
msgstr[1] "%u ancêtres communs trouvés :"
-#: merge-recursive.c:1941
+#: merge-recursive.c:1943
msgid "merge returned no commit"
msgstr "la fusion n'a pas retourné de commit"
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
#, c-format
msgid "Could not parse object '%s'"
msgstr "Impossible d'analyser l'objet '%s'"
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
msgid "Unable to write index."
msgstr "Impossible d'écrire l'index."
@@ -941,33 +935,33 @@ msgstr "Refus de réécrire des notes dans %s (hors de refs/notes/)"
msgid "Bad %s value: '%s'"
msgstr "Mauvaise valeur de %s : '%s'"
-#: object.c:202
+#: object.c:229
#, c-format
msgid "unable to parse object: %s"
msgstr "impossible d'analyser l'objet : %s"
-#: parse-options.c:537
+#: parse-options.c:532
msgid "..."
msgstr "..."
-#: parse-options.c:555
+#: parse-options.c:550
#, c-format
msgid "usage: %s"
msgstr "usage : %s"
#. TRANSLATORS: the colon here should align with the
#. one in "usage: %s" translation
-#: parse-options.c:559
+#: parse-options.c:554
#, c-format
msgid " or: %s"
msgstr " ou : %s"
-#: parse-options.c:562
+#: parse-options.c:557
#, c-format
msgid " %s"
msgstr " %s"
-#: parse-options.c:596
+#: parse-options.c:591
msgid "-NUM"
msgstr "-NUM"
@@ -1019,11 +1013,6 @@ msgstr "%s : '%s' est hors du dépôt"
msgid "Pathspec '%s' is in submodule '%.*s'"
msgstr "Le chemin '%s' est dans le sous-module '%.*s'"
-#.
-#. * We may want to substitute "this command" with a command
-#. * name. E.g. when add--interactive dies when running
-#. * "checkout -p"
-#.
#: pathspec.c:353
#, c-format
msgid "%s: pathspec magic not supported by this command: %s"
@@ -1044,56 +1033,73 @@ msgstr ""
"Il n'y a rien dont il faut exclure par des motifs :(exclure).\n"
"Peut-être avez-vous oublié d'ajouter ':/' ou '.' ?"
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr "fait"
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"version d'index renseignée, mais la valeur est invalide.\n"
+"Utilisation de la version %i"
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"GIT_INDEX_VERSION est renseigné, mais la valeur est invalide.\n"
+"Utilisation de la version %i"
+
+#: remote.c:758
#, c-format
msgid "Cannot fetch both %s and %s to %s"
msgstr "Impossible de récupérer à la fois %s et %s pour %s"
-#: remote.c:757
+#: remote.c:762
#, c-format
msgid "%s usually tracks %s, not %s"
msgstr "%s suit habituellement %s, pas %s"
-#: remote.c:761
+#: remote.c:766
#, c-format
msgid "%s tracks both %s and %s"
msgstr "%s suit à la fois %s et %s"
-#.
-#. * This last possibility doesn't occur because
-#. * FETCH_HEAD_IGNORE entries always appear at
-#. * the end of the list.
-#.
-#: remote.c:769
+#: remote.c:774
msgid "Internal error"
msgstr "Erreur interne"
-#: remote.c:1871
+#: remote.c:1948
#, c-format
msgid "Your branch is based on '%s', but the upstream is gone.\n"
msgstr "Votre branche est basée sur '%s', mais la branche amont a disparu.\n"
-#: remote.c:1875
+#: remote.c:1952
msgid " (use \"git branch --unset-upstream\" to fixup)\n"
msgstr " (utilisez \"git branch --unset-upstream\" pour corriger)\n"
-#: remote.c:1878
+#: remote.c:1955
#, c-format
msgid "Your branch is up-to-date with '%s'.\n"
msgstr "Votre branche est à jour avec '%s'.\n"
-#: remote.c:1882
+#: remote.c:1959
#, c-format
msgid "Your branch is ahead of '%s' by %d commit.\n"
msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
msgstr[0] "Votre branche est en avance sur '%s' de %d commit.\n"
msgstr[1] "Votre branche est en avance sur '%s' de %d commits.\n"
-#: remote.c:1888
+#: remote.c:1965
msgid " (use \"git push\" to publish your local commits)\n"
msgstr " (utilisez \"git push\" pour publier vos commits locaux)\n"
-#: remote.c:1891
+#: remote.c:1968
#, c-format
msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
msgid_plural ""
@@ -1105,11 +1111,11 @@ msgstr[1] ""
"Votre branche est en retard sur '%s' de %d commits, et peut être mise à jour "
"en avance rapide.\n"
-#: remote.c:1899
+#: remote.c:1976
msgid " (use \"git pull\" to update your local branch)\n"
msgstr " (utilisez \"git pull\" pour mettre à jour votre branche locale)\n"
-#: remote.c:1902
+#: remote.c:1979
#, c-format
msgid ""
"Your branch and '%s' have diverged,\n"
@@ -1124,7 +1130,7 @@ msgstr[1] ""
"Votre branche et '%s' ont divergé,\n"
"et ont %d et %d commits différents chacune respectivement.\n"
-#: remote.c:1912
+#: remote.c:1989
msgid " (use \"git pull\" to merge the remote branch into yours)\n"
msgstr ""
" (utilisez \"git pull\" pour fusionner la branche distante dans la vôtre)\n"
@@ -1138,14 +1144,14 @@ msgstr "échec de l'ouverture de /dev/null"
msgid "dup2(%d,%d) failed"
msgstr "échec de dup2(%d,%d)"
-#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896
-#: builtin/merge.c:1006 builtin/merge.c:1016
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
#, c-format
msgid "Could not open '%s' for writing"
msgstr "Impossible d'ouvrir '%s' en écriture"
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786
-#: builtin/merge.c:1008 builtin/merge.c:1021
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
#, c-format
msgid "Could not write to '%s'"
msgstr "Impossible d'écrire dans '%s'"
@@ -1168,7 +1174,7 @@ msgstr ""
"avec 'git add <chemins>' ou 'git rm <chemins>'\n"
"puis validez le résultat avec 'git commit'"
-#: sequencer.c:245 sequencer.c:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
#, c-format
msgid "Could not write to %s"
msgstr "Impossible d'écrire dans %s"
@@ -1204,31 +1210,31 @@ msgstr "Impossible de résoudre le commit HEAD\n"
msgid "Unable to update cache tree\n"
msgstr "Impossible de mettre à jour l'arbre de cache\n"
-#: sequencer.c:423
+#: sequencer.c:430
#, c-format
msgid "Could not parse commit %s\n"
msgstr "Impossible d'analyser le commit %s\n"
-#: sequencer.c:428
+#: sequencer.c:435
#, c-format
msgid "Could not parse parent commit %s\n"
msgstr "Impossible d'analyser le commit parent %s\n"
-#: sequencer.c:494
+#: sequencer.c:501
msgid "Your index file is unmerged."
msgstr "Votre fichier d'index n'est pas fusionné."
-#: sequencer.c:513
+#: sequencer.c:520
#, c-format
msgid "Commit %s is a merge but no -m option was given."
msgstr "Le commit %s est une fusion mais l'option -m n'a pas été spécifiée."
-#: sequencer.c:521
+#: sequencer.c:528
#, c-format
msgid "Commit %s does not have parent %d"
msgstr "Le commit %s n'a pas le parent %d"
-#: sequencer.c:525
+#: sequencer.c:532
#, c-format
msgid "Mainline was specified but commit %s is not a merge."
msgstr ""
@@ -1237,153 +1243,153 @@ msgstr ""
#. TRANSLATORS: The first %s will be "revert" or
#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:538
+#: sequencer.c:545
#, c-format
msgid "%s: cannot parse parent commit %s"
msgstr "%s : impossible d'analyser le commit parent %s"
-#: sequencer.c:542
+#: sequencer.c:549
#, c-format
msgid "Cannot get commit message for %s"
msgstr "Impossible d'obtenir un message de validation pour %s"
-#: sequencer.c:628
+#: sequencer.c:635
#, c-format
msgid "could not revert %s... %s"
msgstr "impossible d'annuler %s... %s"
-#: sequencer.c:629
+#: sequencer.c:636
#, c-format
msgid "could not apply %s... %s"
msgstr "impossible d'appliquer %s... %s"
-#: sequencer.c:665
+#: sequencer.c:672
msgid "empty commit set passed"
msgstr "l'ensemble de commits spécifié est vide"
-#: sequencer.c:673
+#: sequencer.c:680
#, c-format
msgid "git %s: failed to read the index"
msgstr "git %s : échec à la lecture de l'index"
-#: sequencer.c:678
+#: sequencer.c:685
#, c-format
msgid "git %s: failed to refresh the index"
msgstr "git %s : échec du rafraîchissement de l'index"
-#: sequencer.c:736
+#: sequencer.c:743
#, c-format
msgid "Cannot %s during a %s"
msgstr "Impossible de %s pendant un %s"
-#: sequencer.c:758
+#: sequencer.c:765
#, c-format
msgid "Could not parse line %d."
msgstr "Impossible d'analyser la ligne %d."
-#: sequencer.c:763
+#: sequencer.c:770
msgid "No commits parsed."
msgstr "Aucun commit analysé."
-#: sequencer.c:776
+#: sequencer.c:783
#, c-format
msgid "Could not open %s"
msgstr "Impossible d'ouvrir %s"
-#: sequencer.c:780
+#: sequencer.c:787
#, c-format
msgid "Could not read %s."
msgstr "Impossible de lire %s."
-#: sequencer.c:787
+#: sequencer.c:794
#, c-format
msgid "Unusable instruction sheet: %s"
msgstr "Feuille d'instruction inutilisable : %s"
-#: sequencer.c:815
+#: sequencer.c:824
#, c-format
msgid "Invalid key: %s"
msgstr "Clé invalide: %s"
-#: sequencer.c:818
+#: sequencer.c:827
#, c-format
msgid "Invalid value for %s: %s"
msgstr "Valeur invalide pour %s : %s"
-#: sequencer.c:830
+#: sequencer.c:839
#, c-format
msgid "Malformed options sheet: %s"
msgstr "Feuille d'options malformée : %s"
-#: sequencer.c:851
+#: sequencer.c:860
msgid "a cherry-pick or revert is already in progress"
msgstr "un picorage ou un retour est déjà en cours"
-#: sequencer.c:852
+#: sequencer.c:861
msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
msgstr "essayez \"git cherry-pick (--continue|--quit|-- abort)\""
-#: sequencer.c:856
+#: sequencer.c:865
#, c-format
msgid "Could not create sequencer directory %s"
msgstr "Impossible de créer le répertoire de séquenceur %s"
-#: sequencer.c:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
#, c-format
msgid "Error wrapping up %s."
msgstr "Erreur lors de l'emballage de %s."
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
msgid "no cherry-pick or revert in progress"
msgstr "aucun picorage ou retour en cours"
-#: sequencer.c:893
+#: sequencer.c:902
msgid "cannot resolve HEAD"
msgstr "impossible de résoudre HEAD"
-#: sequencer.c:895
+#: sequencer.c:904
msgid "cannot abort from a branch yet to be born"
msgstr "impossible d'abandonner depuis une branche non encore créée"
-#: sequencer.c:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
#, c-format
msgid "cannot open %s: %s"
msgstr "impossible d'ouvrir %s : %s"
-#: sequencer.c:920
+#: sequencer.c:929
#, c-format
msgid "cannot read %s: %s"
msgstr "impossible de lire %s : %s"
-#: sequencer.c:921
+#: sequencer.c:930
msgid "unexpected end of file"
msgstr "fin de fichier inattendue"
-#: sequencer.c:927
+#: sequencer.c:936
#, c-format
msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
msgstr "le fichier HEAD de préparation de picorage '%s' est corrompu"
-#: sequencer.c:950
+#: sequencer.c:959
#, c-format
msgid "Could not format %s."
msgstr "Impossible de formater %s."
-#: sequencer.c:1093
+#: sequencer.c:1104
#, c-format
msgid "%s: can't cherry-pick a %s"
msgstr "%s : impossible de picorer un %s"
-#: sequencer.c:1096
+#: sequencer.c:1107
#, c-format
msgid "%s: bad revision"
msgstr "%s : mauvaise révision"
-#: sequencer.c:1130
+#: sequencer.c:1141
msgid "Can't revert as initial commit"
msgstr "Impossible d'annuler en tant que commit initial"
-#: sequencer.c:1131
+#: sequencer.c:1142
msgid "Can't cherry-pick into empty head"
msgstr "Impossible de picorer vers une HEAD vide"
@@ -1412,21 +1418,21 @@ msgstr ""
"message\n"
"en lançant \"git config advice.objectNameWarning false\""
-#: sha1_name.c:1070
+#: sha1_name.c:1072
msgid "HEAD does not point to a branch"
msgstr "HEAD ne pointe pas sur une branche"
-#: sha1_name.c:1073
+#: sha1_name.c:1075
#, c-format
msgid "No such branch: '%s'"
msgstr "Branche inconnue : '%s'"
-#: sha1_name.c:1075
+#: sha1_name.c:1077
#, c-format
msgid "No upstream configured for branch '%s'"
msgstr "Aucune branche amont configurée pour la branche '%s'"
-#: sha1_name.c:1079
+#: sha1_name.c:1081
#, c-format
msgid "Upstream branch '%s' not stored as a remote-tracking branch"
msgstr "La branche amont '%s' n'est pas stockée comme branche de suivi"
@@ -1442,53 +1448,35 @@ msgstr ""
msgid "Could not find section in .gitmodules where path=%s"
msgstr "Impossible de trouver une section où path=%s dans .gitmodules"
-#. Maybe the user already did that, don't error out here
#: submodule.c:76
#, c-format
msgid "Could not update .gitmodules entry %s"
msgstr "Impossible de mettre à jour l'élément %s de .gitmodules"
# ici %s est un chemin
-#. Maybe the user already did that, don't error out here
#: submodule.c:109
#, c-format
msgid "Could not remove .gitmodules entry for %s"
msgstr "Impossible de supprimer l'élément de .gitmodules pour %s"
-#: submodule.c:127
-msgid "could not find .gitmodules in index"
-msgstr "impossible de trouver .gitmodules dans l'index"
-
-#: submodule.c:133
-msgid "reading updated .gitmodules failed"
-msgstr "échec de la lecture du .gitmodules mis à jour"
-
-#: submodule.c:135
-msgid "unable to stat updated .gitmodules"
-msgstr "échec de stat du .gitmodules mis à jour"
-
-#: submodule.c:139
-msgid "unable to remove .gitmodules from index"
-msgstr "suppression du .gitmodules dans l'index impossible"
-
-#: submodule.c:141
-msgid "adding updated .gitmodules failed"
-msgstr "échec de l'ajout du .gitmodules mis à jour"
-
-#: submodule.c:143
+#: submodule.c:120
msgid "staging updated .gitmodules failed"
msgstr "échec de la mise en index du .gitmodules mis à jour"
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 builtin/init-db.c:363
#, c-format
msgid "Could not create git link %s"
msgstr "Impossible de créer le lien git %s"
-#: submodule.c:1155
+#: submodule.c:1132
#, c-format
msgid "Could not set core.worktree in %s"
msgstr "Impossible de paramétrer core.worktree dans %s"
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr "Extraction des fichiers"
+
#: urlmatch.c:120
msgid "invalid URL scheme name or missing '://' suffix"
msgstr "nom de schéma d'URL invalide ou suffixe '://' manquant"
@@ -1603,88 +1591,97 @@ msgid " (use \"git %s <file>...\" to include in what will be committed)"
msgstr ""
" (utilisez \"git %s <fichier>...\" pour inclure dans ce qui sera validé)"
-#: wt-status.c:254
-msgid "bug"
-msgstr "bogue"
-
-#: wt-status.c:259
+#: wt-status.c:252
msgid "both deleted:"
msgstr "supprimé des deux côtés :"
-#: wt-status.c:260
+#: wt-status.c:254
msgid "added by us:"
msgstr "ajouté par nous :"
-#: wt-status.c:261
+#: wt-status.c:256
msgid "deleted by them:"
msgstr "supprimé par eux :"
-#: wt-status.c:262
+#: wt-status.c:258
msgid "added by them:"
msgstr "ajouté par eux :"
-#: wt-status.c:263
+#: wt-status.c:260
msgid "deleted by us:"
msgstr "supprimé par nous :"
-#: wt-status.c:264
+#: wt-status.c:262
msgid "both added:"
msgstr "ajouté de deux côtés :"
-#: wt-status.c:265
+#: wt-status.c:264
msgid "both modified:"
msgstr "modifié des deux côtés :"
-#: wt-status.c:275
-msgid "new file"
-msgstr "nouveau fichier"
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "bogue : état de non-fusion non géré %x"
+
+#: wt-status.c:274
+msgid "new file:"
+msgstr "nouveau fichier :"
-#: wt-status.c:277
-msgid "copied"
-msgstr "copié"
+#: wt-status.c:276
+msgid "copied:"
+msgstr "copié :"
-#: wt-status.c:279
-msgid "deleted"
-msgstr "supprimé"
+#: wt-status.c:278
+msgid "deleted:"
+msgstr "supprimé :"
-#: wt-status.c:285
-msgid "typechange"
-msgstr "modif. type"
+#: wt-status.c:280
+msgid "modified:"
+msgstr "modifié :"
-#: wt-status.c:287
-msgid "unknown"
-msgstr "inconnu"
+#: wt-status.c:282
+msgid "renamed:"
+msgstr "renommé :"
-#: wt-status.c:289
-msgid "unmerged"
-msgstr "non fusionné"
+#: wt-status.c:284
+msgid "typechange:"
+msgstr "modif. type :"
-#: wt-status.c:336
+#: wt-status.c:286
+msgid "unknown:"
+msgstr "inconnu :"
+
+#: wt-status.c:288
+msgid "unmerged:"
+msgstr "non fusionné :"
+
+#: wt-status.c:370
msgid "new commits, "
msgstr "nouveaux commits, "
-#: wt-status.c:338
+#: wt-status.c:372
msgid "modified content, "
msgstr "contenu modifié, "
-#: wt-status.c:340
+#: wt-status.c:374
msgid "untracked content, "
msgstr "contenu non suivi, "
-#: wt-status.c:357
+#: wt-status.c:391
#, c-format
msgid "bug: unhandled diff status %c"
msgstr "bogue : état de diff non géré %c"
-#: wt-status.c:732
+#: wt-status.c:765
msgid "Submodules changed but not updated:"
msgstr "Sous-modules modifiés mais non mis à jour :"
-#: wt-status.c:734
+#: wt-status.c:767
msgid "Submodule changes to be committed:"
msgstr "Changements du sous-module à valider :"
-#: wt-status.c:836
+#: wt-status.c:846
msgid ""
"Do not touch the line above.\n"
"Everything below will be removed."
@@ -1692,68 +1689,68 @@ msgstr ""
"Ne touchez pas à la ligne ci-dessus\n"
"Tout se qui suit sera éliminé."
-#: wt-status.c:899
+#: wt-status.c:937
msgid "You have unmerged paths."
msgstr "Vous avez des chemins non fusionnés."
-#: wt-status.c:902
+#: wt-status.c:940
msgid " (fix conflicts and run \"git commit\")"
msgstr " (réglez les conflits puis lancez \"git commit\")"
-#: wt-status.c:905
+#: wt-status.c:943
msgid "All conflicts fixed but you are still merging."
msgstr "Tous les conflits sont réglés mais la fusion n'est pas terminée."
-#: wt-status.c:908
+#: wt-status.c:946
msgid " (use \"git commit\" to conclude merge)"
msgstr " (utilisez \"git commit\" pour terminer la fusion)"
-#: wt-status.c:918
+#: wt-status.c:956
msgid "You are in the middle of an am session."
msgstr "Vous êtes au milieu d'une session am."
-#: wt-status.c:921
+#: wt-status.c:959
msgid "The current patch is empty."
msgstr "Le patch actuel est vide."
-#: wt-status.c:925
+#: wt-status.c:963
msgid " (fix conflicts and then run \"git am --continue\")"
msgstr " (réglez les conflits puis lancez \"git am --continue\")"
-#: wt-status.c:927
+#: wt-status.c:965
msgid " (use \"git am --skip\" to skip this patch)"
msgstr " (utilisez \"git am --skip\" pour sauter ce patch)"
-#: wt-status.c:929
+#: wt-status.c:967
msgid " (use \"git am --abort\" to restore the original branch)"
msgstr " (utilisez \"git am --abort\" pour restaurer la branche d'origine)"
-#: wt-status.c:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
#, c-format
msgid "You are currently rebasing branch '%s' on '%s'."
msgstr "Vous êtes en train de rebaser la branche '%s' sur '%s'."
-#: wt-status.c:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
msgid "You are currently rebasing."
msgstr "Vous êtes en train de rebaser."
-#: wt-status.c:997
+#: wt-status.c:1035
msgid " (fix conflicts and then run \"git rebase --continue\")"
msgstr " (réglez les conflits puis lancez \"git rebase --continue\")"
-#: wt-status.c:999
+#: wt-status.c:1037
msgid " (use \"git rebase --skip\" to skip this patch)"
msgstr " (utilisez \"git rebase --skip\" pour sauter ce patch)"
-#: wt-status.c:1001
+#: wt-status.c:1039
msgid " (use \"git rebase --abort\" to check out the original branch)"
msgstr " (utilisez \"git rebase --abort\" pour extraire la branche d'origine)"
-#: wt-status.c:1014
+#: wt-status.c:1052
msgid " (all conflicts fixed: run \"git rebase --continue\")"
msgstr " (tous les conflits sont réglés : lancez \"git rebase --continue\")"
-#: wt-status.c:1018
+#: wt-status.c:1056
#, c-format
msgid ""
"You are currently splitting a commit while rebasing branch '%s' on '%s'."
@@ -1761,120 +1758,120 @@ msgstr ""
"Vous êtes actuellement en train de fractionner un commit pendant un rebasage "
"de la branche '%s' sur '%s'."
-#: wt-status.c:1023
+#: wt-status.c:1061
msgid "You are currently splitting a commit during a rebase."
msgstr ""
"Vous êtes actuellement en train de fractionner un commit pendant un rebasage."
-#: wt-status.c:1026
+#: wt-status.c:1064
msgid " (Once your working directory is clean, run \"git rebase --continue\")"
msgstr ""
" (Une fois la copie de travail nettoyée, lancez \"git rebase --continue\")"
-#: wt-status.c:1030
+#: wt-status.c:1068
#, c-format
msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
msgstr ""
"Vous êtes actuellement en train d'éditer un commit pendant un rebasage de la "
"branche '%s' sur '%s'."
-#: wt-status.c:1035
+#: wt-status.c:1073
msgid "You are currently editing a commit during a rebase."
msgstr ""
"Vous êtes actuellement en train d'éditer un commit pendant un rebasage."
-#: wt-status.c:1038
+#: wt-status.c:1076
msgid " (use \"git commit --amend\" to amend the current commit)"
msgstr " (utilisez \"git commit --amend\" pour corriger le commit actuel)"
-#: wt-status.c:1040
+#: wt-status.c:1078
msgid ""
" (use \"git rebase --continue\" once you are satisfied with your changes)"
msgstr ""
" (utilisez \"git rebase --continue\" quand vous êtes satisfait de vos "
"modifications)"
-#: wt-status.c:1050
+#: wt-status.c:1088
#, c-format
msgid "You are currently cherry-picking commit %s."
msgstr "Vous êtes actuellement en train de picorer le commit %s."
-#: wt-status.c:1055
+#: wt-status.c:1093
msgid " (fix conflicts and run \"git cherry-pick --continue\")"
msgstr " (réglez les conflits puis lancez \"git cherry-pick --continue\")"
-#: wt-status.c:1058
+#: wt-status.c:1096
msgid " (all conflicts fixed: run \"git cherry-pick --continue\")"
msgstr ""
" (tous les conflits sont réglés : lancez \"git cherry-pick --continue\")"
-#: wt-status.c:1060
+#: wt-status.c:1098
msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
msgstr " (utilisez \"git cherry-pick --abort\" pour annuler le picorage)"
-#: wt-status.c:1069
+#: wt-status.c:1107
#, c-format
msgid "You are currently reverting commit %s."
msgstr "Vous êtes actuellement en train de rétablir le commit %s."
-#: wt-status.c:1074
+#: wt-status.c:1112
msgid " (fix conflicts and run \"git revert --continue\")"
msgstr " (réglez les conflits puis lancez \"git revert --continue\")"
-#: wt-status.c:1077
+#: wt-status.c:1115
msgid " (all conflicts fixed: run \"git revert --continue\")"
msgstr " (tous les conflits sont réglés : lancez \"git revert --continue\")"
-#: wt-status.c:1079
+#: wt-status.c:1117
msgid " (use \"git revert --abort\" to cancel the revert operation)"
msgstr " (utilisez \"git revert --abort\" pour annuler le rétablissement)"
-#: wt-status.c:1090
+#: wt-status.c:1128
#, c-format
msgid "You are currently bisecting, started from branch '%s'."
msgstr "Vous êtes en cours de bissection, depuis la branche '%s'."
-#: wt-status.c:1094
+#: wt-status.c:1132
msgid "You are currently bisecting."
msgstr "Vous êtes en cours de bissection."
-#: wt-status.c:1097
+#: wt-status.c:1135
msgid " (use \"git bisect reset\" to get back to the original branch)"
msgstr " (utilisez \"git bisect reset\" pour revenir à la branche d'origine)"
-#: wt-status.c:1272
+#: wt-status.c:1310
msgid "On branch "
msgstr "Sur la branche "
-#: wt-status.c:1279
+#: wt-status.c:1317
msgid "rebase in progress; onto "
msgstr "rebasage en cours ; sur "
-#: wt-status.c:1286
+#: wt-status.c:1324
msgid "HEAD detached at "
msgstr "HEAD détachée sur "
-#: wt-status.c:1288
+#: wt-status.c:1326
msgid "HEAD detached from "
msgstr "HEAD détachée depuis "
-#: wt-status.c:1291
+#: wt-status.c:1329
msgid "Not currently on any branch."
msgstr "Actuellement sur aucun branche."
-#: wt-status.c:1308
+#: wt-status.c:1346
msgid "Initial commit"
msgstr "Validation initiale"
-#: wt-status.c:1322
+#: wt-status.c:1360
msgid "Untracked files"
msgstr "Fichiers non suivis"
-#: wt-status.c:1324
+#: wt-status.c:1362
msgid "Ignored files"
msgstr "Fichiers ignorés"
-#: wt-status.c:1328
+#: wt-status.c:1366
#, c-format
msgid ""
"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1886,32 +1883,32 @@ msgstr ""
"oublier d'ajouter les nouveaux fichiers par vous-même (voir 'git help "
"status')."
-#: wt-status.c:1334
+#: wt-status.c:1372
#, c-format
msgid "Untracked files not listed%s"
msgstr "Fichiers non suivis non affichés%s"
-#: wt-status.c:1336
+#: wt-status.c:1374
msgid " (use -u option to show untracked files)"
msgstr " (utilisez -u pour afficher les fichiers non suivis)"
-#: wt-status.c:1342
+#: wt-status.c:1380
msgid "No changes"
msgstr "Aucune modification"
-#: wt-status.c:1347
+#: wt-status.c:1385
#, c-format
msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
msgstr ""
"aucune modification n'a été ajoutée à la validation (utilisez \"git add\" ou "
"\"git commit -a\")\n"
-#: wt-status.c:1350
+#: wt-status.c:1388
#, c-format
msgid "no changes added to commit\n"
msgstr "aucune modification ajoutée à la validation\n"
-#: wt-status.c:1353
+#: wt-status.c:1391
#, c-format
msgid ""
"nothing added to commit but untracked files present (use \"git add\" to "
@@ -1920,292 +1917,208 @@ msgstr ""
"aucune modification ajoutée à la validation mais des fichiers non suivis "
"sont présents (utilisez \"git add\" pour les suivre)\n"
-#: wt-status.c:1356
+#: wt-status.c:1394
#, c-format
msgid "nothing added to commit but untracked files present\n"
msgstr ""
"aucune modification ajoutée à la validation mais des fichiers non suivis "
"sont présents\n"
-#: wt-status.c:1359
+#: wt-status.c:1397
#, c-format
msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
msgstr ""
"rien à valider (créez/copiez des fichiers et utilisez \"git add\" pour les "
"suivre)\n"
-#: wt-status.c:1362 wt-status.c:1367
+#: wt-status.c:1400 wt-status.c:1405
#, c-format
msgid "nothing to commit\n"
msgstr "rien à valider\n"
-#: wt-status.c:1365
+#: wt-status.c:1403
#, c-format
msgid "nothing to commit (use -u to show untracked files)\n"
msgstr "rien à valider (utilisez -u pour afficher les fichiers non suivis)\n"
-#: wt-status.c:1369
+#: wt-status.c:1407
#, c-format
msgid "nothing to commit, working directory clean\n"
msgstr "rien à valider, la copie de travail est propre\n"
-#: wt-status.c:1478
+#: wt-status.c:1516
msgid "HEAD (no branch)"
msgstr "HEAD (aucune branche)"
-#: wt-status.c:1484
+#: wt-status.c:1522
msgid "Initial commit on "
msgstr "Validation initiale sur "
# à priori on parle d'une branche ici
-#: wt-status.c:1514
+#: wt-status.c:1554
msgid "gone"
msgstr "disparue"
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
msgid "behind "
msgstr "derrière "
-#: wt-status.c:1519 wt-status.c:1522
-msgid "ahead "
-msgstr "devant "
-
-#: wt-status.c:1524
-msgid ", behind "
-msgstr ", derrière "
-
#: compat/precompose_utf8.c:55 builtin/clone.c:356
#, c-format
msgid "failed to unlink '%s'"
msgstr "échec lors de l'unlink de '%s'"
-#: builtin/add.c:20
+#: builtin/add.c:21
msgid "git add [options] [--] <pathspec>..."
msgstr "git add [options] [--] <chemin>..."
-#.
-#. * 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 ""
-"Le comportement de 'git add %s (ou %s)' sans argument de chemin depuis un\n"
-"sous-répertoire du projet va changer dans Git 2.0 et ne doit plus être "
-"utilisé.\n"
-"Pour ajouter le contenu de toute l'arborescence, lancez :\n"
-"\n"
-" git add %s :/\n"
-" (ou git add %s :/)\n"
-"\n"
-"Pour restreindre la commande au répertoire courant, lancez :\n"
-"\n"
-" git add %s .\n"
-" (ou git add %s .)\n"
-"\n"
-"Avec la version actuelle de Git, la commande est restreinte au répertoire "
-"courant.\n"
-
-#: 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 ""
-"Vous avez lancé 'git add' sans '-A (--all)' ni '--ignore-removal',\n"
-"dont le comportement va changer dans Git 2.0 avec le respect des chemins que "
-"vous supprimez.\n"
-"Les chemins tels que '%s' qui ont été\n"
-"retirés de votre copie de travail sont ignorés avec cette version de Git.\n"
-"\n"
-"* 'git add --ignore-removal <chemin>', qui est l'option par défaut "
-"actuelle,\n"
-" ignore les chemins que vous avez supprimés de votre copie de travail.\n"
-"\n"
-"* 'git add --all <chemin>' permet d'enregistrer aussi les suppressions.\n"
-"\n"
-"Lancez 'git status' pour vérifier les chemins que vous avez supprimés de "
-"votre copie de travail.\n"
-
-#: builtin/add.c:144
+#: builtin/add.c:64
#, c-format
msgid "unexpected diff status %c"
msgstr "status de diff inattendu %c"
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
msgid "updating files failed"
msgstr "échec de la mise à jour des fichiers"
-#: builtin/add.c:163
+#: builtin/add.c:79
#, c-format
msgid "remove '%s'\n"
msgstr "suppression de '%s'\n"
-#: builtin/add.c:237
+#: builtin/add.c:133
msgid "Unstaged changes after refreshing the index:"
msgstr "Modifications non indexées après rafraîchissement de l'index :"
-#: builtin/add.c:299
+#: builtin/add.c:193
msgid "Could not read the index"
msgstr "Impossible de lire l'index"
-#: builtin/add.c:310
+#: builtin/add.c:204
#, c-format
msgid "Could not open '%s' for writing."
msgstr "Impossible d'ouvrir '%s' en écriture."
-#: builtin/add.c:314
+#: builtin/add.c:208
msgid "Could not write patch"
msgstr "Impossible d'écrire le patch"
-#: builtin/add.c:319
+#: builtin/add.c:213
#, c-format
msgid "Could not stat '%s'"
msgstr "Stat de '%s' impossible"
-#: builtin/add.c:321
+#: builtin/add.c:215
msgid "Empty patch. Aborted."
msgstr "Patch vide. Abandon."
-#: builtin/add.c:327
+#: builtin/add.c:221
#, c-format
msgid "Could not apply '%s'"
msgstr "Impossible d'appliquer '%s'"
-#: builtin/add.c:337
+#: builtin/add.c:231
msgid "The following paths are ignored by one of your .gitignore files:\n"
msgstr ""
"Les chemins suivants sont ignorés par un de vos fichiers .gitignore :\n"
-#: builtin/add.c: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/add.c:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
+#: builtin/prune-packed.c:77 builtin/push.c:489 builtin/remote.c:1344
#: builtin/rm.c:269
msgid "dry run"
msgstr "simuler l'action"
-#: 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/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
+#: builtin/commit.c:1256 builtin/count-objects.c:95 builtin/fsck.c:612
#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113
msgid "be verbose"
msgstr "mode verbeux"
-#: builtin/add.c:357
+#: builtin/add.c:251
msgid "interactive picking"
msgstr "sélection interactive"
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
msgid "select hunks interactively"
msgstr "sélection interactive des sections"
-#: builtin/add.c:359
+#: builtin/add.c:253
msgid "edit current diff and apply"
msgstr "édition du diff actuel et application"
-#: builtin/add.c:360
+#: builtin/add.c:254
msgid "allow adding otherwise ignored files"
msgstr "permettre l'ajout de fichiers ignorés"
-#: builtin/add.c:361
+#: builtin/add.c:255
msgid "update tracked files"
msgstr "mettre à jour les fichiers suivis"
-#: builtin/add.c:362
+#: builtin/add.c:256
msgid "record only the fact that the path will be added later"
msgstr "enregistrer seulement le fait que le chemin sera ajouté plus tard"
-#: builtin/add.c:363
+#: builtin/add.c:257
msgid "add changes from all tracked and untracked files"
msgstr "ajouter les modifications de tous les fichiers suivis et non suivis"
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
msgid "ignore paths removed in the working tree (same as --no-all)"
msgstr ""
"ignorer les chemins effacés dans la copie de travail (identique à --no-all)"
-#: builtin/add.c:368
+#: builtin/add.c:262
msgid "don't add, only refresh the index"
msgstr "ne pas ajouter, juste rafraîchir l'index"
-#: builtin/add.c:369
+#: builtin/add.c:263
msgid "just skip files which cannot be added because of errors"
msgstr ""
"sauter seulement les fichiers qui ne peuvent pas être ajoutés du fait "
"d'erreurs"
-#: builtin/add.c:370
+#: builtin/add.c:264
msgid "check if - even missing - files are ignored in dry run"
msgstr "vérifier si des fichiers - même manquants - sont ignorés, à vide"
-#: builtin/add.c:392
+#: builtin/add.c:286
#, c-format
msgid "Use -f if you really want to add them.\n"
msgstr "Utilisez -f si vous voulez réellement les ajouter.\n"
-#: builtin/add.c:393
+#: builtin/add.c:287
msgid "no files added"
msgstr "aucun fichier ajouté"
-#: builtin/add.c:399
+#: builtin/add.c:293
msgid "adding files failed"
msgstr "échec de l'ajout de fichiers"
-#: builtin/add.c:438
+#: builtin/add.c:330
msgid "-A and -u are mutually incompatible"
msgstr "-A et -u sont mutuellement incompatibles"
-#: builtin/add.c:456
+#: builtin/add.c:337
msgid "Option --ignore-missing can only be used together with --dry-run"
msgstr ""
"L'option --ignore-missing ne peut être utilisée qu'en complément de --dry-run"
-#: builtin/add.c:486
+#: builtin/add.c:358
#, c-format
msgid "Nothing specified, nothing added.\n"
msgstr "Rien de spécifié, rien n'a été ajouté.\n"
-#: builtin/add.c:487
+#: builtin/add.c:359
#, c-format
msgid "Maybe you wanted to say 'git add .'?\n"
msgstr "Vous vouliez sûrement dire 'git add .' ?\n"
-#: 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
+#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:920
+#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 builtin/rm.c:299
msgid "index file corrupt"
msgstr "fichier d'index corrompu"
-#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
msgid "Unable to write new index file"
msgstr "Impossible d'écrire le nouveau fichier d'index"
@@ -2323,7 +2236,6 @@ msgstr "** attention : le fichier %s devient vide mais n'est pas supprimé"
msgid "corrupt binary patch at line %d: %.*s"
msgstr "patch binaire corrompu à la ligne %d : %.*s"
-#. there has to be one hunk (forward hunk)
#: builtin/apply.c:1900
#, c-format
msgid "unrecognized binary patch at line %d"
@@ -2467,7 +2379,7 @@ msgstr "%s : le patch ne s'applique pas"
msgid "Checking patch %s..."
msgstr "Vérification du patch %s..."
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
#, c-format
msgid "make_cache_entry failed for path '%s'"
msgstr "échec de make_cache_entry pour le chemin '%s'"
@@ -2518,7 +2430,6 @@ msgstr "Patch %s appliqué proprement."
msgid "internal error"
msgstr "erreur interne"
-#. Say this even without --verbose
#: builtin/apply.c:4043
#, c-format
msgid "Applying patch %%s with %d reject..."
@@ -2612,7 +2523,7 @@ msgid "build a temporary index based on embedded index information"
msgstr ""
"construire un index temporaire fondé sur l'information de l'index embarqué"
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
msgid "paths are separated with NUL character"
msgstr "les chemins sont séparés par un caractère NUL"
@@ -2754,100 +2665,100 @@ msgstr "git blame [options] [options-de-révision] [rev] [--] fichier"
msgid "[rev-opts] are documented in git-rev-list(1)"
msgstr "[options-de-révision] sont documentés dans git-rev-list(1)"
-#: builtin/blame.c:2249
+#: builtin/blame.c:2242
msgid "Show blame entries as we find them, incrementally"
msgstr ""
"Montrer les éléments de blâme au fur et à mesure de leur découverte, de "
"manière incrémentale"
-#: builtin/blame.c:2250
+#: builtin/blame.c:2243
msgid "Show blank SHA-1 for boundary commits (Default: off)"
msgstr "Montrer un SHA-1 blanc pour les commits de limite (Défaut : désactivé)"
-#: builtin/blame.c:2251
+#: builtin/blame.c:2244
msgid "Do not treat root commits as boundaries (Default: off)"
msgstr ""
"Ne pas traiter les commits racine comme des limites (Défaut : désactivé)"
-#: builtin/blame.c:2252
+#: builtin/blame.c:2245
msgid "Show work cost statistics"
msgstr "Montrer les statistiques de coût d'activité"
-#: builtin/blame.c:2253
+#: builtin/blame.c:2246
msgid "Show output score for blame entries"
msgstr "Montrer le score de sortie pour les éléments de blâme"
-#: builtin/blame.c:2254
+#: builtin/blame.c:2247
msgid "Show original filename (Default: auto)"
msgstr "Montrer les noms de fichier originaux (Défaut : auto)"
-#: builtin/blame.c:2255
+#: builtin/blame.c:2248
msgid "Show original linenumber (Default: off)"
msgstr "Montrer les numéros de lignes originaux (Défaut : désactivé)"
-#: builtin/blame.c:2256
+#: builtin/blame.c:2249
msgid "Show in a format designed for machine consumption"
msgstr "Afficher dans un format propice à la consommation par machine"
-#: builtin/blame.c:2257
+#: builtin/blame.c:2250
msgid "Show porcelain format with per-line commit information"
msgstr "Afficher en format porcelaine avec l'information de commit par ligne"
-#: builtin/blame.c:2258
+#: builtin/blame.c:2251
msgid "Use the same output mode as git-annotate (Default: off)"
msgstr "Utiliser le même mode de sortie que git-annotate (Défaut : désactivé)"
-#: builtin/blame.c:2259
+#: builtin/blame.c:2252
msgid "Show raw timestamp (Default: off)"
msgstr "Afficher les horodatages bruts (Défaut : désactivé)"
-#: builtin/blame.c:2260
+#: builtin/blame.c:2253
msgid "Show long commit SHA1 (Default: off)"
msgstr "Afficher les longs SHA1 de commits (Défaut : désactivé)"
-#: builtin/blame.c:2261
+#: builtin/blame.c:2254
msgid "Suppress author name and timestamp (Default: off)"
msgstr "Supprimer le nom de l'auteur et l'horodatage (Défaut : désactivé)"
-#: builtin/blame.c:2262
+#: builtin/blame.c:2255
msgid "Show author email instead of name (Default: off)"
msgstr "Afficher l'e-mail de l'auteur au lieu du nom (Défaut : désactivé)"
-#: builtin/blame.c:2263
+#: builtin/blame.c:2256
msgid "Ignore whitespace differences"
msgstr "Ignorer les différences d'espace"
-#: builtin/blame.c:2264
+#: builtin/blame.c:2257
msgid "Spend extra cycles to find better match"
msgstr ""
"Dépenser des cycles supplémentaires pour trouver une meilleure correspondance"
-#: builtin/blame.c:2265
+#: builtin/blame.c:2258
msgid "Use revisions from <file> instead of calling git-rev-list"
msgstr ""
"Utiliser les révisions du fichier <fichier> au lieu d'appeler git-rev-list"
-#: builtin/blame.c:2266
+#: builtin/blame.c:2259
msgid "Use <file>'s contents as the final image"
msgstr "Utiliser le contenu de <fichier> comme image finale"
-#: builtin/blame.c:2267 builtin/blame.c:2268
+#: builtin/blame.c:2260 builtin/blame.c:2261
msgid "score"
msgstr "score"
-#: builtin/blame.c:2267
+#: builtin/blame.c:2260
msgid "Find line copies within and across files"
msgstr "Trouver les copies de ligne dans et entre les fichiers"
-#: builtin/blame.c:2268
+#: builtin/blame.c:2261
msgid "Find line movements within and across files"
msgstr "Trouver les mouvements de ligne dans et entre les fichiers"
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
msgid "n,m"
msgstr "n,m"
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
msgid "Process only line range n,m, counting from 1"
msgstr ""
"Traiter seulement l'intervalle de ligne n,m en commençant le compte à 1"
@@ -3093,8 +3004,9 @@ msgid "act on remote-tracking branches"
msgstr "agir sur les branches de suivi distantes"
#: 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
+#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
+#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
+#: builtin/tag.c:533
msgid "commit"
msgstr "commit"
@@ -3281,44 +3193,44 @@ msgstr "La création d'un colis requiert un dépôt."
msgid "Need a repository to unbundle."
msgstr "Le dépaquetage d'un colis requiert un dépôt."
-#: builtin/cat-file.c:328
+#: builtin/cat-file.c:331
msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
msgstr "git cat-file (-t|-s|-e|-p|<type>|--textconv) <objet>"
-#: builtin/cat-file.c:329
+#: builtin/cat-file.c:332
msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
msgstr "git cat-file (--batch|--batch-check) < <liste_d_objets>"
-#: builtin/cat-file.c:366
+#: builtin/cat-file.c:369
msgid "<type> can be one of: blob, tree, commit, tag"
msgstr "<type> peut être : blob, tree, commit ou tag"
-#: builtin/cat-file.c:367
+#: builtin/cat-file.c:370
msgid "show object type"
msgstr "afficher le type de l'objet"
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
msgid "show object size"
msgstr "afficher la taille de l'objet"
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
msgid "exit with zero when there's no error"
msgstr "sortir avec un code d'erreur nul quand il n'y a aucune erreur"
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:374
msgid "pretty-print object's content"
msgstr "afficher avec mise en forme le contenu de l'objet"
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
msgid "for blob objects, run textconv on object's content"
msgstr "pour les objets blob, lancer textconv sur le contenu de l'objet"
-#: builtin/cat-file.c:375
+#: builtin/cat-file.c:378
msgid "show info and content of objects fed from the standard input"
msgstr ""
"afficher l'information et le contenu des objets passés en entrée standard"
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:381
msgid "show info about objects fed from the standard input"
msgstr "afficher l'information des objets passés en entrée standard"
@@ -3348,7 +3260,7 @@ msgid "terminate input and output records by a NUL character"
msgstr ""
"terminer les enregistrements en entrée et en sortie par un caractère NUL"
-#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
msgid "suppress progress reporting"
msgstr "supprimer l'état d'avancement"
@@ -3503,60 +3415,59 @@ msgstr ""
"Impossible de mettre à jour les chemins et basculer sur la branche '%s' en "
"même temps."
-#: builtin/checkout.c:261 builtin/checkout.c:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
msgid "corrupt index file"
msgstr "fichier d'index corrompu"
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
#, c-format
msgid "path '%s' is unmerged"
msgstr "le chemin '%s' n'est pas fusionné"
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
msgid "you need to resolve your current index first"
msgstr "vous devez d'abord résoudre votre index courant"
-#: builtin/checkout.c:594
+#: builtin/checkout.c:593
#, c-format
msgid "Can not do reflog for '%s'\n"
msgstr "Impossible de faire un reflog pour '%s'\n"
-#: builtin/checkout.c:632
+#: builtin/checkout.c:631
msgid "HEAD is now at"
msgstr "HEAD est maintenant sur"
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
#, c-format
msgid "Reset branch '%s'\n"
msgstr "Remise à zéro de la branche '%s'\n"
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
#, c-format
msgid "Already on '%s'\n"
msgstr "Déjà sur '%s'\n"
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
#, c-format
msgid "Switched to and reset branch '%s'\n"
msgstr "Basculement et remise à zéro de la branche '%s'\n"
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 builtin/checkout.c:1032
#, c-format
msgid "Switched to a new branch '%s'\n"
msgstr "Basculement sur la nouvelle branche '%s'\n"
-#: builtin/checkout.c:650
+#: builtin/checkout.c:649
#, c-format
msgid "Switched to branch '%s'\n"
msgstr "Basculement sur la branche '%s'\n"
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
#, c-format
msgid " ... and %d more.\n"
msgstr " ... et %d en plus.\n"
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
#, c-format
msgid ""
"Warning: you are leaving %d commit behind, not connected to\n"
@@ -3569,17 +3480,17 @@ msgid_plural ""
"\n"
"%s\n"
msgstr[0] ""
-"Attention : vous laissez %d commit en retard, non connectés à\n"
+"Attention : vous abandonnez %d commit, non connecté à\n"
"une branche :\n"
"\n"
"%s\n"
msgstr[1] ""
-"Attention : vous laissez %d commits en retard, non connectés à\n"
+"Attention : vous abandonnez %d commits, non connectés à\n"
"une branche :\n"
"\n"
"%s\n"
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
#, c-format
msgid ""
"If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3590,145 +3501,144 @@ msgid ""
msgstr ""
"Si vous souhaitez les garder en créant une nouvelle branche, c'est le bon "
"moment\n"
-"de le faire avec :\n"
+"pour le faire avec :\n"
"\n"
-"git branche nouvelle_branche %s\n"
+"git branch nouvelle_branche %s\n"
"\n"
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
msgid "internal error in revision walk"
msgstr "erreur interne lors du parcours des révisions"
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
msgid "Previous HEAD position was"
msgstr "La position précédente de HEAD était"
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
msgid "You are on a branch yet to be born"
msgstr "Vous êtes sur une branche qui doit encore naître"
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
#, c-format
msgid "only one reference expected, %d given."
msgstr "une seule référence attendue, %d fournies."
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
#, c-format
msgid "invalid reference: %s"
msgstr "référence invalide : %s"
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
#, c-format
msgid "reference is not a tree: %s"
msgstr "la référence n'est pas un arbre : %s"
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
msgid "paths cannot be used with switching branches"
msgstr "impossible d'utiliser des chemins avec un basculement de branches"
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
#, c-format
msgid "'%s' cannot be used with switching branches"
msgstr "'%s' ne peut pas être utilisé avec un basculement de branches"
-#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
#, c-format
msgid "'%s' cannot be used with '%s'"
msgstr "'%s' ne peut pas être utilisé avec '%s'"
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
#, c-format
msgid "Cannot switch branch to a non-commit '%s'"
msgstr "Impossible de basculer de branche vers '%s' qui n'est pas un commit"
-#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
#: builtin/remote.c:159 builtin/remote.c:161
msgid "branch"
msgstr "branche"
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
msgid "create and checkout a new branch"
msgstr "créer et extraire une nouvelle branche"
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
msgid "create/reset and checkout a branch"
msgstr "créer/réinitialiser et extraire une branche"
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
msgid "create reflog for new branch"
msgstr "créer un reflog pour une nouvelle branche"
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
msgid "detach the HEAD at named commit"
msgstr "détacher la HEAD à la validation nommée"
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
msgid "set upstream info for new branch"
-msgstr "paramétrer l'information de branche amont pour une nouvelle branche"
+msgstr "paramétrer les coordonnées de branche amont pour une nouvelle branche"
-#: builtin/checkout.c:1099
-msgid "new branch"
+#: builtin/checkout.c:1098
+msgid "new-branch"
msgstr "nouvelle branche"
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
msgid "new unparented branch"
msgstr "nouvelle branche sans parent"
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
msgid "checkout our version for unmerged files"
msgstr "extraire notre version pour les fichiers non fusionnés"
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
msgid "checkout their version for unmerged files"
msgstr "extraire leur version pour les fichiers non fusionnés"
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
msgid "force checkout (throw away local modifications)"
msgstr "forcer l'extraction (laisser tomber les modifications locales)"
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
msgid "perform a 3-way merge with the new branch"
msgstr "effectuer une fusion à 3 points avec la nouvelle branche"
-#: builtin/checkout.c:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
msgid "update ignored files (default)"
msgstr "mettre à jour les fichiers ignorés (par défaut)"
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
msgid "style"
msgstr "style"
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
msgid "conflict style (merge or diff3)"
msgstr "style de conflit (fusion ou diff3)"
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
msgid "do not limit pathspecs to sparse entries only"
msgstr "ne pas limiter les spécificateurs de chemins aux seuls éléments creux"
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
msgid "second guess 'git checkout no-such-branch'"
msgstr "deuxième chance 'git checkout branche-inexistante'"
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
msgid "-b, -B and --orphan are mutually exclusive"
msgstr "-b, -B et --orphan sont mutuellement exclusifs"
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
msgid "--track needs a branch name"
msgstr "--track requiert un nom de branche"
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
msgid "Missing branch name; try -b"
msgstr "Nom de branche manquant ; essayez -b"
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
msgid "invalid path specification"
msgstr "spécification de chemin invalide"
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
#, c-format
msgid ""
"Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3738,12 +3648,12 @@ msgstr ""
"en même temps.\n"
"Souhaitiez-vous extraire '%s' qui ne peut être résolu comme commit ?"
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1208
#, c-format
msgid "git checkout: --detach does not take a path argument '%s'"
msgstr "git checkout: --detach n'accepte pas un argument de chemin '%s'"
-#: builtin/checkout.c:1213
+#: builtin/checkout.c:1212
msgid ""
"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
"checking out of the index."
@@ -3782,7 +3692,7 @@ msgstr "Ignorerait le dépôt %s\n"
msgid "failed to remove %s"
msgstr "échec de la suppression de %s"
-#: builtin/clean.c:294
+#: builtin/clean.c:295
msgid ""
"Prompt help:\n"
"1 - select a numbered item\n"
@@ -3794,7 +3704,7 @@ msgstr ""
"foo - sélectionner un élément par un préfixe unique\n"
" - (vide) ne rien sélectionner"
-#: builtin/clean.c:298
+#: builtin/clean.c:299
msgid ""
"Prompt help:\n"
"1 - select a single item\n"
@@ -3814,35 +3724,35 @@ msgstr ""
"* - choisir tous les éléments\n"
" - (vide) terminer la sélection"
-#: builtin/clean.c:516
+#: builtin/clean.c:517
#, c-format
msgid "Huh (%s)?"
msgstr "Hein (%s) ?"
-#: builtin/clean.c:659
+#: builtin/clean.c:660
#, c-format
msgid "Input ignore patterns>> "
msgstr "Entrez les motifs à ignorer>> "
-#: builtin/clean.c:696
+#: builtin/clean.c:697
#, c-format
msgid "WARNING: Cannot find items matched by: %s"
msgstr "ATTENTION : Impossible de trouver les éléments correspondant à : %s"
-#: builtin/clean.c:717
+#: builtin/clean.c:718
msgid "Select items to delete"
msgstr "Sélectionner les éléments à supprimer"
-#: builtin/clean.c:757
+#: builtin/clean.c:758
#, c-format
msgid "remove %s? "
msgstr "supprimer %s ? "
-#: builtin/clean.c:782
+#: builtin/clean.c:783
msgid "Bye."
msgstr "Au revoir."
-#: builtin/clean.c:790
+#: builtin/clean.c:791
msgid ""
"clean - start cleaning\n"
"filter by pattern - exclude items from deletion\n"
@@ -3860,72 +3770,70 @@ msgstr ""
"help - cet écran\n"
"? - aide pour la sélection en ligne"
-#: builtin/clean.c:817
+#: builtin/clean.c:818
msgid "*** Commands ***"
msgstr "*** Commandes ***"
-#: builtin/clean.c:818
+#: builtin/clean.c:819
msgid "What now"
msgstr "Et maintenant ?"
-#: builtin/clean.c:826
+#: builtin/clean.c:827
msgid "Would remove the following item:"
msgid_plural "Would remove the following items:"
msgstr[0] "Supprimerait l'élément suivant :"
msgstr[1] "Supprimerait les éléments suivants :"
-#: builtin/clean.c:843
+#: builtin/clean.c:844
msgid "No more files to clean, exiting."
msgstr "Plus de fichier à nettoyer, sortie."
-#: builtin/clean.c:874
+#: builtin/clean.c:875
msgid "do not print names of files removed"
msgstr "ne pas afficher les noms des fichiers supprimés"
-#: builtin/clean.c:876
+#: builtin/clean.c:877
msgid "force"
msgstr "forcer"
-#: builtin/clean.c:877
+#: builtin/clean.c:878
msgid "interactive cleaning"
msgstr "nettoyage interactif"
-#: builtin/clean.c:879
+#: builtin/clean.c:880
msgid "remove whole directories"
msgstr "supprimer les répertoires entiers"
-#: 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
+#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
+#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
msgid "pattern"
msgstr "motif"
-#: builtin/clean.c:881
+#: builtin/clean.c:882
msgid "add <pattern> to ignore rules"
msgstr "ajouter <motif> aux règles ignore"
-#: builtin/clean.c:882
+#: builtin/clean.c:883
msgid "remove ignored files, too"
msgstr "supprimer les fichiers ignorés, aussi"
-#: builtin/clean.c:884
+#: builtin/clean.c:885
msgid "remove only ignored files"
msgstr "supprimer seulement les fichiers ignorés"
-#: builtin/clean.c:902
+#: builtin/clean.c:903
msgid "-x and -X cannot be used together"
msgstr "-x et -X ne peuvent pas être utilisés ensemble"
-#: builtin/clean.c:906
+#: builtin/clean.c:907
msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
"clean"
-msgstr ""
-"clean.requireForce positionné à true et ni -i, -n ou -f fourni ; refus de "
-"nettoyer"
+msgstr "clean.requireForce positionné à true et ni -i, -n ou -f fourni ; refus de nettoyer"
-#: builtin/clean.c:909
+#: builtin/clean.c:910
msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
"refusing to clean"
msgstr ""
"clean.requireForce à true par défaut et ni -i, -n ou -f fourni ; refus de "
@@ -3936,15 +3844,15 @@ msgid "git clone [options] [--] <repo> [<dir>]"
msgstr "git clone [options] [--] <dépôt> [<répertoire>]"
#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:521
+#: builtin/push.c:504
msgid "force progress reporting"
-msgstr "forcer l'état d'avancement"
+msgstr "forcer l'affichage de l'état d'avancement"
#: builtin/clone.c:66
msgid "don't create a checkout"
msgstr "ne pas créer d'extraction"
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
msgid "create a bare repository"
msgstr "créer un dépôt nu"
@@ -3968,11 +3876,11 @@ msgstr "régler comme dépôt partagé"
msgid "initialize submodules in the clone"
msgstr "initialiser les sous-modules dans le clone"
-#: builtin/clone.c:82 builtin/init-db.c:485
+#: builtin/clone.c:82 builtin/init-db.c:483
msgid "template-directory"
msgstr "répertoire-modèle"
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
msgid "directory from which templates will be used"
msgstr "répertoire depuis lequel les modèles vont être utilisés"
@@ -3996,7 +3904,7 @@ msgstr "extraire <branche> au lieu de la HEAD du répertoire distant"
msgid "path to git-upload-pack on the remote"
msgstr "chemin vers git-upload-pack sur le serveur distant"
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
msgid "depth"
msgstr "profondeur"
@@ -4008,11 +3916,11 @@ msgstr "créer un clone superficiel de cette profondeur"
msgid "clone only one branch, HEAD or --branch"
msgstr "cloner seulement une branche, HEAD ou --branch"
-#: builtin/clone.c:96 builtin/init-db.c:494
+#: builtin/clone.c:96 builtin/init-db.c:492
msgid "gitdir"
msgstr "gitdir"
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
msgid "separate git dir from working tree"
msgstr "séparer le répertoire git de la copie de travail"
@@ -4248,7 +4156,7 @@ msgid ""
msgstr ""
"Votre nom et votre adresse e-mail ont été configurés automatiquement en se "
"fondant\n"
-"sur votre nom d'utilisateur et votre nom d'ordinateur. Veuillez vérifier "
+"sur votre nom d'utilisateur et le nom de votre machine. Veuillez vérifier "
"qu'ils sont corrects.\n"
"Vous pouvez supprimer ce message en les paramétrant explicitement :\n"
"\n"
@@ -4305,67 +4213,67 @@ msgstr ""
"Puis \"git cherry-pick --continue\" continuera le picorage \n"
"des commits restants.\n"
-#: builtin/commit.c:287
+#: builtin/commit.c:288
msgid "failed to unpack HEAD tree object"
msgstr "échec du dépaquetage de l'objet arbre HEAD"
-#: builtin/commit.c:329
+#: builtin/commit.c:330
msgid "unable to create temporary index"
msgstr "impossible de créer l'index temporaire"
-#: builtin/commit.c:335
+#: builtin/commit.c:336
msgid "interactive add failed"
msgstr "échec de l'ajout interactif"
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
msgid "unable to write new_index file"
msgstr "impossible d'écrire le fichier new_index"
-#: builtin/commit.c:420
+#: builtin/commit.c:421
msgid "cannot do a partial commit during a merge."
msgstr "impossible de faire une validation partielle pendant une fusion."
-#: builtin/commit.c:422
+#: builtin/commit.c:423
msgid "cannot do a partial commit during a cherry-pick."
msgstr "impossible de faire une validation partielle pendant un picorage."
-#: builtin/commit.c:432
+#: builtin/commit.c:433
msgid "cannot read the index"
msgstr "impossible de lire l'index"
-#: builtin/commit.c:452
+#: builtin/commit.c:453
msgid "unable to write temporary index file"
msgstr "impossible d'écrire le fichier d'index temporaire"
-#: builtin/commit.c:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
#, c-format
msgid "invalid commit: %s"
msgstr "commit invalide : %s"
-#: builtin/commit.c:571
+#: builtin/commit.c:572
msgid "malformed --author parameter"
msgstr "paramètre --author mal formé"
-#: builtin/commit.c:591
+#: builtin/commit.c:592
#, c-format
msgid "Malformed ident string: '%s'"
msgstr "Chaîne ident mal formée : '%s'"
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
#, c-format
msgid "could not lookup commit %s"
msgstr "impossible de rechercher le commit %s"
-#: builtin/commit.c:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 builtin/shortlog.c:273
#, c-format
msgid "(reading log message from standard input)\n"
msgstr "(lecture du message de journal depuis l'entrée standard)\n"
-#: builtin/commit.c:644
+#: builtin/commit.c:643
msgid "could not read log from standard input"
msgstr "impossible de lire le journal depuis l'entrée standard"
-#: builtin/commit.c:648
+#: builtin/commit.c:647
#, c-format
msgid "could not read log file '%s'"
msgstr "impossible de lire le fichier de journal '%s'"
@@ -4391,7 +4299,7 @@ msgstr "impossible de lire '%s'"
msgid "could not write commit template"
msgstr "impossible d'écrire le modèle de commit"
-#: builtin/commit.c:760
+#: builtin/commit.c:764
#, c-format
msgid ""
"\n"
@@ -4406,7 +4314,7 @@ msgstr ""
"\t%s\n"
"et essayez à nouveau.\n"
-#: builtin/commit.c:765
+#: builtin/commit.c:769
#, c-format
msgid ""
"\n"
@@ -4421,7 +4329,7 @@ msgstr ""
"\t%s\n"
"et essayez à nouveau.\n"
-#: builtin/commit.c:777
+#: builtin/commit.c:782
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
@@ -4431,7 +4339,7 @@ msgstr ""
"commençant par '%c' seront ignorées, et un message vide abandonne la "
"validation.\n"
-#: builtin/commit.c:782
+#: builtin/commit.c:789
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
@@ -4442,142 +4350,142 @@ msgstr ""
"commençant par '%c' seront conservées ; vous pouvez les supprimer vous-même\n"
"si vous le souhaitez. Un message vide abandonne la validation.\n"
-#: builtin/commit.c:795
+#: builtin/commit.c:802
#, c-format
msgid "%sAuthor: %s"
msgstr "%sAuteur : %s"
-#: builtin/commit.c:802
+#: builtin/commit.c:809
#, c-format
msgid "%sCommitter: %s"
msgstr "%sValidateur : %s"
-#: builtin/commit.c:822
+#: builtin/commit.c:829
msgid "Cannot read index"
msgstr "Impossible de lire l'index"
-#: builtin/commit.c:865
+#: builtin/commit.c:872
msgid "Error building trees"
msgstr "Erreur lors de la construction des arbres"
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
#, c-format
msgid "Please supply the message using either -m or -F option.\n"
msgstr "Veuillez fournir le message en utilisant l'option -m ou -F.\n"
-#: builtin/commit.c:982
+#: builtin/commit.c:989
#, c-format
msgid "No existing author found with '%s'"
msgstr "Aucun auteur existant trouvé avec '%s'"
-#: builtin/commit.c:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
#, c-format
msgid "Invalid untracked files mode '%s'"
msgstr "Mode de fichier non suivi invalide '%s'"
-#: builtin/commit.c:1034
+#: builtin/commit.c:1041
msgid "--long and -z are incompatible"
msgstr "--long et -z sont incompatibles"
-#: builtin/commit.c:1064
+#: builtin/commit.c:1071
msgid "Using both --reset-author and --author does not make sense"
msgstr "L'utilisation simultanée de --reset-author et --author n'a pas de sens"
-#: builtin/commit.c:1075
+#: builtin/commit.c:1080
msgid "You have nothing to amend."
msgstr "Il n'y a rien à corriger."
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
msgid "You are in the middle of a merge -- cannot amend."
msgstr "Vous êtes en pleine fusion -- impossible de corriger (amend)."
-#: builtin/commit.c:1080
+#: builtin/commit.c:1085
msgid "You are in the middle of a cherry-pick -- cannot amend."
msgstr "Vous êtes en plein picorage -- impossible de corriger (amend)."
-#: builtin/commit.c:1083
+#: builtin/commit.c:1088
msgid "Options --squash and --fixup cannot be used together"
msgstr "Les options --squash et --fixup ne peuvent pas être utilisées ensemble"
-#: builtin/commit.c:1093
+#: builtin/commit.c:1098
msgid "Only one of -c/-C/-F/--fixup can be used."
msgstr "Une seule option parmi -c/-C/-F/--fixup peut être utilisée."
-#: builtin/commit.c:1095
+#: builtin/commit.c:1100
msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
msgstr "L'option -m ne peut pas être combinée avec -c/-C/-F/--fixup."
-#: builtin/commit.c:1103
+#: builtin/commit.c:1108
msgid "--reset-author can be used only with -C, -c or --amend."
msgstr "--reset-author ne peut être utilisé qu'avec -C, -c ou --amend."
-#: builtin/commit.c:1120
+#: builtin/commit.c:1125
msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
msgstr ""
"Une seule option parmi --include/--only/--all/--interactive/--patch peut "
"être utilisée."
-#: builtin/commit.c:1122
+#: builtin/commit.c:1127
msgid "No paths with --include/--only does not make sense."
msgstr "Aucun chemin avec les options --include/--only n'a pas de sens."
-#: builtin/commit.c:1124
+#: builtin/commit.c:1129
msgid "Clever... amending the last one with dirty index."
msgstr "Malin... correction du dernier avec un index sale."
-#: builtin/commit.c:1126
-msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
+#: builtin/commit.c:1131
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
msgstr "Chemins explicites spécifiés sans -i ni -o ; --only supposé..."
-#: builtin/commit.c:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
#, c-format
msgid "Invalid cleanup mode %s"
msgstr "Mode de nettoyage invalide %s"
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
msgid "Paths with -a does not make sense."
msgstr "Spécifier des chemins avec l'option -a n'a pas de sens."
-#: builtin/commit.c:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
msgid "show status concisely"
msgstr "afficher le statut avec concision"
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
msgid "show branch information"
msgstr "afficher l'information de branche"
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
msgid "machine-readable output"
msgstr "sortie pour traitement automatique"
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
msgid "show status in long format (default)"
msgstr "afficher le statut en format long (par défaut)"
-#: builtin/commit.c:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
msgid "terminate entries with NUL"
msgstr "terminer les éléments par NUL"
-#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:459
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
msgid "mode"
msgstr "mode"
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
msgstr ""
"afficher les fichiers non suivis, \"mode\" facultatif : all (tous), normal, "
"no. (Défaut : all)"
-#: builtin/commit.c:1267
+#: builtin/commit.c:1274
msgid "show ignored files"
msgstr "afficher les fichiers ignorés"
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
msgid "when"
msgstr "quand"
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
msgid ""
"ignore changes to submodules, optional when: all, dirty, untracked. "
"(Default: all)"
@@ -4585,217 +4493,217 @@ msgstr ""
"ignorer les modifications dans les sous-modules, \"quand\" facultatif : all "
"(tous), dirty (sale), untracked (non suivi). (Défaut : all)"
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
msgid "list untracked files in columns"
msgstr "afficher les fichiers non suivis en colonnes"
-#: builtin/commit.c:1340
+#: builtin/commit.c:1347
msgid "couldn't look up newly created commit"
msgstr "impossible de retrouver le commit nouvellement créé"
-#: builtin/commit.c:1342
+#: builtin/commit.c:1349
msgid "could not parse newly created commit"
msgstr "impossible d'analyser le commit nouvellement créé"
-#: builtin/commit.c:1383
+#: builtin/commit.c:1390
msgid "detached HEAD"
msgstr "HEAD détachée"
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
msgid " (root-commit)"
msgstr " (commit racine)"
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
msgid "suppress summary after successful commit"
msgstr "supprimer le résumé après une validation réussie"
-#: builtin/commit.c:1453
+#: builtin/commit.c:1487
msgid "show diff in commit message template"
msgstr "afficher les diff dans le modèle de message de validation"
-#: builtin/commit.c:1455
+#: builtin/commit.c:1489
msgid "Commit message options"
msgstr "Options du message de validation"
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
msgid "read message from file"
msgstr "lire le message depuis un fichier"
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "author"
msgstr "auteur"
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "override author for commit"
msgstr "remplacer l'auteur pour la validation"
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
msgid "date"
msgstr "date"
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
msgid "override date for commit"
msgstr "remplacer la date pour la validation"
-#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405
-#: builtin/notes.c:562 builtin/tag.c:455
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
msgid "message"
msgstr "message"
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
msgid "commit message"
msgstr "message de validation"
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
msgid "reuse and edit message from specified commit"
msgstr "réutiliser et éditer le message du commit spécifié"
-#: builtin/commit.c:1461
+#: builtin/commit.c:1495
msgid "reuse message from specified commit"
msgstr "réutiliser le message du commit spécifié"
-#: builtin/commit.c:1462
+#: builtin/commit.c:1496
msgid "use autosquash formatted message to fixup specified commit"
msgstr ""
-"utiliser un message formaté par autosquash pour corriger le commit spécifié"
+"utiliser un message au format autosquash pour corriger le commit spécifié"
-#: builtin/commit.c:1463
+#: builtin/commit.c:1497
msgid "use autosquash formatted message to squash specified commit"
msgstr ""
-"utiliser un message formaté par autosquash pour compresser le commit spécifié"
+"utiliser un message au format autosquash pour compresser le commit spécifié"
-#: builtin/commit.c:1464
+#: builtin/commit.c:1498
msgid "the commit is authored by me now (used with -C/-c/--amend)"
msgstr ""
"à présent je suis l'auteur de la validation (utilisé avec -C/-c/--amend)"
-#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
msgid "add Signed-off-by:"
msgstr "ajouter une entrée Signed-off-by :"
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
msgid "use specified template file"
msgstr "utiliser le fichier de modèle spécifié"
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
msgid "force edit of commit"
msgstr "forcer l'édition du commit"
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
msgid "default"
msgstr "défaut"
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
msgid "how to strip spaces and #comments from message"
msgstr "comment éliminer les espaces et les commentaires # du message"
-#: builtin/commit.c:1469
+#: builtin/commit.c:1503
msgid "include status in commit message template"
msgstr "inclure le statut dans le modèle de message de validation"
-#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
-msgstr "identifiant de clé"
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
+msgstr "id de clé"
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
msgid "GPG sign commit"
msgstr "signer la validation avec GPG"
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
msgid "Commit contents options"
msgstr "Valider les options des contenus"
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
msgid "commit all changed files"
msgstr "valider tous les fichiers modifiés"
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
msgid "add specified files to index for commit"
msgstr "ajouter les fichiers spécifiés à l'index pour la validation"
-#: builtin/commit.c:1477
+#: builtin/commit.c:1511
msgid "interactively add files"
msgstr "ajouter des fichiers en mode interactif"
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
msgid "interactively add changes"
msgstr "ajouter les modifications en mode interactif"
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
msgid "commit only specified files"
msgstr "valider seulement les fichiers spécifiés"
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
msgid "bypass pre-commit hook"
msgstr "éviter d'utiliser le crochet pre-commit"
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
msgid "show what would be committed"
msgstr "afficher ce qui serait validé"
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
msgid "amend previous commit"
msgstr "corriger la validation précédente"
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
msgid "bypass post-rewrite hook"
msgstr "éviter d'utiliser le crochet post-rewrite"
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
msgid "ok to record an empty change"
msgstr "accepter d'enregistrer une modification vide"
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
msgid "ok to record a change with an empty message"
msgstr "accepter d'enregistrer une modification avec un message vide"
-#: builtin/commit.c:1529
+#: builtin/commit.c:1562
msgid "could not parse HEAD commit"
msgstr "impossible d'analyser le commit HEAD"
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 builtin/merge.c:518
#, c-format
msgid "could not open '%s' for reading"
msgstr "impossible d'ouvrir '%s' en lecture"
-#: builtin/commit.c:1574
+#: builtin/commit.c:1608
#, c-format
msgid "Corrupt MERGE_HEAD file (%s)"
msgstr "Fichier MERGE_HEAD corrompu (%s)"
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
msgid "could not read MERGE_MODE"
msgstr "impossible de lire MERGE_MODE"
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
#, c-format
msgid "could not read commit message: %s"
msgstr "impossible de lire le message de validation : %s"
-#: builtin/commit.c:1611
+#: builtin/commit.c:1645
#, c-format
msgid "Aborting commit; you did not edit the message.\n"
msgstr "Abandon de la validation ; vous n'avez pas édité le message\n"
-#: builtin/commit.c:1616
+#: builtin/commit.c:1650
#, c-format
msgid "Aborting commit due to empty commit message.\n"
msgstr "Abandon de la validation du à un message de validation vide\n"
-#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
msgid "failed to write commit object"
msgstr "échec de l'écriture de l'objet commit"
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
msgid "cannot lock HEAD ref"
msgstr "impossible de verrouiller la référence HEAD"
-#: builtin/commit.c:1656
+#: builtin/commit.c:1690
msgid "cannot update HEAD ref"
msgstr "impossible de mettre à jour la référence HEAD"
-#: builtin/commit.c:1667
+#: builtin/commit.c:1701
msgid ""
"Repository has been updated, but unable to write\n"
"new_index file. Check that disk is not full or quota is\n"
@@ -4809,128 +4717,128 @@ msgstr ""
msgid "git config [options]"
msgstr "git config [options]"
-#: builtin/config.c:54
+#: builtin/config.c:53
msgid "Config file location"
msgstr "Emplacement du fichier de configuration"
-#: builtin/config.c:55
+#: builtin/config.c:54
msgid "use global config file"
msgstr "utiliser les fichier de configuration global"
-#: builtin/config.c:56
+#: builtin/config.c:55
msgid "use system config file"
msgstr "utiliser le fichier de configuration du système"
-#: builtin/config.c:57
+#: builtin/config.c:56
msgid "use repository config file"
msgstr "utiliser le fichier de configuration du dépôt"
-#: builtin/config.c:58
+#: builtin/config.c:57
msgid "use given config file"
msgstr "utiliser le fichier de configuration spécifié"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "blob-id"
msgstr "blob-id"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "read config from given blob object"
msgstr "lire la configuration depuis l'objet blob fourni"
-#: builtin/config.c:60
+#: builtin/config.c:59
msgid "Action"
msgstr "Action"
-#: builtin/config.c:61
+#: builtin/config.c:60
msgid "get value: name [value-regex]"
msgstr "obtenir la valeur : nom [regex-de-valeur]"
-#: builtin/config.c:62
+#: builtin/config.c:61
msgid "get all values: key [value-regex]"
msgstr "obtenir toutes le valeurs : clé [regex-de-valeur]"
-#: builtin/config.c:63
+#: builtin/config.c:62
msgid "get values for regexp: name-regex [value-regex]"
msgstr "obtenir les valeur pour la regexp : regex-de-nom [regex-de-valeur]"
-#: builtin/config.c:64
+#: builtin/config.c:63
msgid "get value specific for the URL: section[.var] URL"
msgstr "obtenir la valeur spécifique pour l'URL : section[.var] URL"
-#: builtin/config.c:65
+#: builtin/config.c:64
msgid "replace all matching variables: name value [value_regex]"
msgstr ""
"remplacer toutes les variables correspondant : nom valeur [regex-de-valeur]"
-#: builtin/config.c:66
+#: builtin/config.c:65
msgid "add a new variable: name value"
msgstr "ajouter une nouvelle variable : nom valeur"
-#: builtin/config.c:67
+#: builtin/config.c:66
msgid "remove a variable: name [value-regex]"
msgstr "supprimer une variable : nom [regex-de-valeur]"
-#: builtin/config.c:68
+#: builtin/config.c:67
msgid "remove all matches: name [value-regex]"
msgstr "supprimer toutes les correspondances nom [regex-de-valeur]"
-#: builtin/config.c:69
+#: builtin/config.c:68
msgid "rename section: old-name new-name"
msgstr "renommer une section : ancien-nom nouveau-nom"
-#: builtin/config.c:70
+#: builtin/config.c:69
msgid "remove a section: name"
msgstr "supprimer une section : nom"
-#: builtin/config.c:71
+#: builtin/config.c:70
msgid "list all"
msgstr "afficher tout"
-#: builtin/config.c:72
+#: builtin/config.c:71
msgid "open an editor"
msgstr "ouvrir un éditeur"
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
msgid "slot"
msgstr "emplacement"
-#: builtin/config.c:73
+#: builtin/config.c:72
msgid "find the color configured: [default]"
msgstr "trouver la couleur configurée : [par défaut]"
-#: builtin/config.c:74
+#: builtin/config.c:73
msgid "find the color setting: [stdout-is-tty]"
msgstr "trouver le réglage de la couleur : [stdout-est-tty]"
-#: builtin/config.c:75
+#: builtin/config.c:74
msgid "Type"
msgstr "Type"
-#: builtin/config.c:76
+#: builtin/config.c:75
msgid "value is \"true\" or \"false\""
-msgstr "la valeur est \"true\" (vrai) our \"false\" (faux)"
+msgstr "la valeur est \"true\" (vrai) ou \"false\" (faux)"
-#: builtin/config.c:77
+#: builtin/config.c:76
msgid "value is decimal number"
msgstr "la valeur est un nombre décimal"
-#: builtin/config.c:78
+#: builtin/config.c:77
msgid "value is --bool or --int"
msgstr "la valeur est --bool ou --int"
-#: builtin/config.c:79
+#: builtin/config.c:78
msgid "value is a path (file or directory name)"
msgstr "la valeur est un chemin (vers un fichier ou un répertoire)"
-#: builtin/config.c:80
+#: builtin/config.c:79
msgid "Other"
msgstr "Autre"
-#: builtin/config.c:81
+#: builtin/config.c:80
msgid "terminate values with NUL byte"
msgstr "terminer les valeurs avec un caractère NUL"
-#: builtin/config.c:82
+#: builtin/config.c:81
msgid "respect include directives on lookup"
msgstr "respecter les directives d'inclusion lors de la recherche"
@@ -4950,47 +4858,47 @@ msgstr "git describe [options] <commit ou apparenté>*"
msgid "git describe [options] --dirty"
msgstr "git describe [options] --dirty"
-#: builtin/describe.c:237
+#: builtin/describe.c:225
#, c-format
msgid "annotated tag %s not available"
msgstr "l'étiquette annotée %s n'est pas disponible"
-#: builtin/describe.c:241
+#: builtin/describe.c:229
#, c-format
msgid "annotated tag %s has no embedded name"
msgstr "l'étiquette annotée %s n'a pas de nom embarqué"
-#: builtin/describe.c:243
+#: builtin/describe.c:231
#, c-format
msgid "tag '%s' is really '%s' here"
msgstr "l'étiquette '%s' est en fait '%s'"
-#: builtin/describe.c:270
+#: builtin/describe.c:258
#, c-format
msgid "Not a valid object name %s"
msgstr "%s n'est pas un nom d'objet valide"
-#: builtin/describe.c:273
+#: builtin/describe.c:261
#, c-format
msgid "%s is not a valid '%s' object"
msgstr "%s n'est pas un objet '%s' valide"
-#: builtin/describe.c:290
+#: builtin/describe.c:278
#, c-format
msgid "no tag exactly matches '%s'"
msgstr "aucune étiquette ne correspond parfaitement à '%s'"
-#: builtin/describe.c:292
+#: builtin/describe.c:280
#, c-format
msgid "searching to describe %s\n"
msgstr "recherche de la description de %s\n"
-#: builtin/describe.c:332
+#: builtin/describe.c:327
#, c-format
msgid "finished search at %s\n"
msgstr "recherche terminée à %s\n"
-#: builtin/describe.c:359
+#: builtin/describe.c:354
#, c-format
msgid ""
"No annotated tags can describe '%s'.\n"
@@ -4999,7 +4907,7 @@ msgstr ""
"Aucune étiquette annotée ne peut décrire '%s'.\n"
"Cependant, il existe des étiquettes non-annotées : essayez avec --tags."
-#: builtin/describe.c:363
+#: builtin/describe.c:358
#, c-format
msgid ""
"No tags can describe '%s'.\n"
@@ -5008,12 +4916,12 @@ msgstr ""
"Aucune étiquette ne peut décrire '%s'.\n"
"Essayez --always, ou créez des étiquettes."
-#: builtin/describe.c:384
+#: builtin/describe.c:379
#, c-format
msgid "traversed %lu commits\n"
msgstr "%lu commits parcourus\n"
-#: builtin/describe.c:387
+#: builtin/describe.c:382
#, c-format
msgid ""
"more than %i tags found; listed %i most recent\n"
@@ -5023,64 +4931,64 @@ msgstr ""
"affichées\n"
"abandon de la recherche à %s\n"
-#: builtin/describe.c:409
+#: builtin/describe.c:404
msgid "find the tag that comes after the commit"
msgstr "rechercher l'étiquette qui suit le commit"
-#: builtin/describe.c:410
+#: builtin/describe.c:405
msgid "debug search strategy on stderr"
msgstr "déboguer la stratégie de recherche sur stderr"
-#: builtin/describe.c:411
+#: builtin/describe.c:406
msgid "use any ref"
msgstr "utiliser n'importe quelle référence"
-#: builtin/describe.c:412
+#: builtin/describe.c:407
msgid "use any tag, even unannotated"
msgstr "utiliser n'importe quelle étiquette, même non-annotée"
-#: builtin/describe.c:413
+#: builtin/describe.c:408
msgid "always use long format"
msgstr "toujours utiliser le format long"
-#: builtin/describe.c:414
+#: builtin/describe.c:409
msgid "only follow first parent"
msgstr "ne suivre que le premier parent"
-#: builtin/describe.c:417
+#: builtin/describe.c:412
msgid "only output exact matches"
msgstr "n'afficher que les correspondances exactes"
-#: builtin/describe.c:419
+#: builtin/describe.c:414
msgid "consider <n> most recent tags (default: 10)"
msgstr ""
"considérer uniquement les <n> étiquettes le plus récentes (défaut : 10)"
-#: builtin/describe.c:421
+#: builtin/describe.c:416
msgid "only consider tags matching <pattern>"
msgstr "ne considérer que les étiquettes correspondant à <motif>"
-#: builtin/describe.c:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
msgid "show abbreviated commit object as fallback"
msgstr "afficher les objets commits abrégés en dernier recours"
-#: builtin/describe.c:424
+#: builtin/describe.c:419
msgid "mark"
msgstr "marque"
-#: builtin/describe.c:425
+#: builtin/describe.c:420
msgid "append <mark> on dirty working tree (default: \"-dirty\")"
msgstr "ajouter <marque> si la copie de travail est sale (défaut : \"-dirty\")"
-#: builtin/describe.c:443
+#: builtin/describe.c:438
msgid "--long is incompatible with --abbrev=0"
msgstr "--long et --abbrev=0 sont incompatibles"
-#: builtin/describe.c:469
+#: builtin/describe.c:464
msgid "No names found, cannot describe anything."
msgstr "aucun nom trouvé, impossible de décrire quoi que ce soit."
-#: builtin/describe.c:489
+#: builtin/describe.c:484
msgid "--dirty is incompatible with commit-ishes"
msgstr "--dirty est incompatible avec la spécification de commits ou assimilés"
@@ -5376,7 +5284,7 @@ msgstr "Récupération de %s\n"
msgid "Could not fetch %s"
msgstr "Impossible de récupérer %s"
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
msgid ""
"No remote repository specified. Please, specify either a URL or a\n"
"remote name from which new revisions should be fetched."
@@ -5420,10 +5328,10 @@ msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
msgstr ""
"git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <fichier>]"
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702
-#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446
-#: parse-options.h:135 parse-options.h:242
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
+#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: parse-options.h:132 parse-options.h:239
msgid "n"
msgstr "n"
@@ -5487,6 +5395,14 @@ msgstr "clé"
msgid "field name to sort on"
msgstr "nom du champ servant à trier"
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr "Vérification de la connectivité"
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr "Vérification des répertoires d'objet"
+
#: builtin/fsck.c:607
msgid "git fsck [options] [<object>...]"
msgstr "git fsck [options] [<objet>...]"
@@ -5532,51 +5448,58 @@ msgstr "écrire les objets en suspens dans .git/lost-found"
msgid "show progress"
msgstr "afficher la progression"
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr "Vérification des objets"
+
#: builtin/gc.c:24
msgid "git gc [options]"
msgstr "git gc [options]"
-#: builtin/gc.c:80
+#: builtin/gc.c:90
#, c-format
msgid "Invalid %s: '%s'"
msgstr "%s invalide : '%s'"
-#: builtin/gc.c:107
+#: builtin/gc.c:117
#, c-format
msgid "insanely long object directory %.*s"
msgstr "objet répertoire démentiellement long %.*s"
-#: builtin/gc.c:262
+#: builtin/gc.c:273
msgid "prune unreferenced objects"
msgstr "éliminer les objets non référencés"
-#: builtin/gc.c:264
+#: builtin/gc.c:275
msgid "be more thorough (increased runtime)"
msgstr "être plus consciencieux (durée de traitement allongée)"
-#: builtin/gc.c:265
+#: builtin/gc.c:276
msgid "enable auto-gc mode"
msgstr "activer le mode auto-gc"
-#: builtin/gc.c:266
+#: builtin/gc.c:277
msgid "force running gc even if there may be another gc running"
msgstr ""
"forcer le lancement du ramasse-miettes même si un autre ramasse-miettes "
"tourne déjà"
-#: builtin/gc.c:306
+#: builtin/gc.c:318
#, 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 ""
-"Compression automatique du dépôt pour une performance optimum. Vous pouvez "
-"aussi\n"
-"lancer \"git gc\" manuellement. Voir \"git help gc\" pour plus "
-"d'information.\n"
+msgid "Auto packing the repository in background for optimum performance.\n"
+msgstr "Compression automatique du dépôt en tâche de fond pour optimiser les performances.\n"
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:320
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr "Compression du dépôt pour optimiser les performances.\n"
+
+#: builtin/gc.c:321
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
+msgstr "Voir \"git help gc\" pour toute information sur le nettoyage manuel.\n"
+
+#: builtin/gc.c:336
#, c-format
msgid ""
"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5584,7 +5507,7 @@ msgstr ""
"un ramasse-miettes est déjà en cours sur la machine '%s' pid %<PRIuMAX> "
"(utilisez --force si ce n'est pas le cas)"
-#: builtin/gc.c:341
+#: builtin/gc.c:361
msgid ""
"There are too many unreachable loose objects; run 'git prune' to remove them."
msgstr ""
@@ -5615,218 +5538,218 @@ msgstr "impossible de lire l'arbre (%s)"
msgid "unable to grep from object of type %s"
msgstr "impossible de faire un grep sur un objet de type %s"
-#: builtin/grep.c:551
+#: builtin/grep.c:549
#, c-format
msgid "switch `%c' expects a numerical value"
msgstr "l'option '%c' attend un valeur numérique"
-#: builtin/grep.c:568
+#: builtin/grep.c:566
#, c-format
msgid "cannot open '%s'"
msgstr "impossible d'ouvrir '%s'"
-#: builtin/grep.c:642
+#: builtin/grep.c:640
msgid "search in index instead of in the work tree"
msgstr "rechercher dans l'index plutôt que dans la copie de travail"
-#: builtin/grep.c:644
+#: builtin/grep.c:642
msgid "find in contents not managed by git"
msgstr "rechercher dans les contenus non gérés par git"
-#: builtin/grep.c:646
+#: builtin/grep.c:644
msgid "search in both tracked and untracked files"
msgstr "rechercher dans les fichiers suivis et non-suivis"
-#: builtin/grep.c:648
+#: builtin/grep.c:646
msgid "search also in ignored files"
msgstr "rechercher aussi dans les fichiers ignorés"
-#: builtin/grep.c:651
+#: builtin/grep.c:649
msgid "show non-matching lines"
msgstr "afficher les lignes qui ne correspondent pas"
-#: builtin/grep.c:653
+#: builtin/grep.c:651
msgid "case insensitive matching"
msgstr "correspondance insensible à la casse"
-#: builtin/grep.c:655
+#: builtin/grep.c:653
msgid "match patterns only at word boundaries"
msgstr "rechercher les motifs aux séparateurs de mots"
-#: builtin/grep.c:657
+#: builtin/grep.c:655
msgid "process binary files as text"
msgstr "traiter les fichiers binaires comme texte"
-#: builtin/grep.c:659
+#: builtin/grep.c:657
msgid "don't match patterns in binary files"
msgstr "ne pas chercher les motifs dans les fichiers binaires"
-#: builtin/grep.c:662
+#: builtin/grep.c:660
msgid "process binary files with textconv filters"
msgstr "traiter les fichiers binaires avec les filtres textconv"
-#: builtin/grep.c:664
+#: builtin/grep.c:662
msgid "descend at most <depth> levels"
msgstr "descendre au plus de <profondeur> dans l'arborescence"
-#: builtin/grep.c:668
+#: builtin/grep.c:666
msgid "use extended POSIX regular expressions"
msgstr "utiliser des expressions régulières étendues POSIX"
-#: builtin/grep.c:671
+#: builtin/grep.c:669
msgid "use basic POSIX regular expressions (default)"
msgstr "utiliser des expressions régulières basiques POSIX (par défaut)"
-#: builtin/grep.c:674
+#: builtin/grep.c:672
msgid "interpret patterns as fixed strings"
msgstr "interpréter les motifs comme de chaînes fixes"
-#: builtin/grep.c:677
+#: builtin/grep.c:675
msgid "use Perl-compatible regular expressions"
msgstr "utiliser des expressions régulières compatibles avec Perl"
-#: builtin/grep.c:680
+#: builtin/grep.c:678
msgid "show line numbers"
msgstr "afficher les numéros de ligne"
-#: builtin/grep.c:681
+#: builtin/grep.c:679
msgid "don't show filenames"
msgstr "ne pas pas afficher les noms de fichier"
-#: builtin/grep.c:682
+#: builtin/grep.c:680
msgid "show filenames"
msgstr "afficher les noms de fichier"
-#: builtin/grep.c:684
+#: builtin/grep.c:682
msgid "show filenames relative to top directory"
msgstr "afficher les noms de fichiers relativement au répertoire de base"
-#: builtin/grep.c:686
+#: builtin/grep.c:684
msgid "show only filenames instead of matching lines"
msgstr "n'afficher que les noms de fichiers au lieu des lignes correspondant"
-#: builtin/grep.c:688
+#: builtin/grep.c:686
msgid "synonym for --files-with-matches"
msgstr "synonyme pour --files-with-matches"
-#: builtin/grep.c:691
+#: builtin/grep.c:689
msgid "show only the names of files without match"
msgstr "n'afficher que les noms des fichiers sans correspondance"
-#: builtin/grep.c:693
+#: builtin/grep.c:691
msgid "print NUL after filenames"
msgstr "imprimer une caractère NUL après le noms de fichier"
-#: builtin/grep.c:695
+#: builtin/grep.c:693
msgid "show the number of matches instead of matching lines"
msgstr "afficher le nombre de correspondances au lieu des lignes correspondant"
-#: builtin/grep.c:696
+#: builtin/grep.c:694
msgid "highlight matches"
msgstr "mettre en évidence les correspondances"
-#: builtin/grep.c:698
+#: builtin/grep.c:696
msgid "print empty line between matches from different files"
msgstr ""
"imprimer une ligne vide entre les correspondances de fichiers différents"
-#: builtin/grep.c:700
+#: builtin/grep.c:698
msgid "show filename only once above matches from same file"
msgstr ""
"afficher le nom de fichier une fois au dessus des correspondances du même "
"fichier"
-#: builtin/grep.c:703
+#: builtin/grep.c:701
msgid "show <n> context lines before and after matches"
msgstr "afficher <n> lignes de contexte avant et après les correspondances"
-#: builtin/grep.c:706
+#: builtin/grep.c:704
msgid "show <n> context lines before matches"
msgstr "afficher <n> lignes de contexte avant les correspondances"
-#: builtin/grep.c:708
+#: builtin/grep.c:706
msgid "show <n> context lines after matches"
msgstr "afficher <n> lignes de contexte après les correspondances"
-#: builtin/grep.c:709
+#: builtin/grep.c:707
msgid "shortcut for -C NUM"
msgstr "raccourci pour -C NUM"
-#: builtin/grep.c:712
+#: builtin/grep.c:710
msgid "show a line with the function name before matches"
msgstr ""
"afficher une ligne avec le nom de la fonction avant les correspondances"
-#: builtin/grep.c:714
+#: builtin/grep.c:712
msgid "show the surrounding function"
msgstr "afficher la fonction contenante"
-#: builtin/grep.c:717
+#: builtin/grep.c:715
msgid "read patterns from file"
msgstr "lire les motifs depuis fichier"
-#: builtin/grep.c:719
+#: builtin/grep.c:717
msgid "match <pattern>"
msgstr "rechercher <motif>"
-#: builtin/grep.c:721
+#: builtin/grep.c:719
msgid "combine patterns specified with -e"
msgstr "combiner les motifs spécifiés par -e"
-#: builtin/grep.c:733
+#: builtin/grep.c:731
msgid "indicate hit with exit status without output"
msgstr ""
"indiquer des correspondances avec le code de sortie mais sans rien afficher"
-#: builtin/grep.c:735
+#: builtin/grep.c:733
msgid "show only matches from files that match all patterns"
msgstr ""
"n'afficher que les correspondances de fichiers qui correspondent à tous les "
"motifs"
-#: builtin/grep.c:737
+#: builtin/grep.c:735
msgid "show parse tree for grep expression"
msgstr "afficher l'arbre d'analyse pour le motif grep"
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "pager"
msgstr "pagineur"
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "show matching files in the pager"
msgstr "afficher les fichiers correspondant dans le pagineur"
-#: builtin/grep.c:744
+#: builtin/grep.c:742
msgid "allow calling of grep(1) (ignored by this build)"
msgstr "permettre l'appel de grep(1) (ignoré par ce build)"
-#: builtin/grep.c:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
msgid "show usage"
msgstr "afficher l'usage"
-#: builtin/grep.c:812
+#: builtin/grep.c:810
msgid "no pattern given."
msgstr "aucun motif fourni."
-#: builtin/grep.c:870
+#: builtin/grep.c:868
msgid "--open-files-in-pager only works on the worktree"
msgstr "--open-files-in-pager ne fonctionne que sur la copie de travail"
-#: builtin/grep.c:893
+#: builtin/grep.c:891
msgid "--cached or --untracked cannot be used with --no-index."
msgstr "--cached ou --untracked ne peuvent pas être utilisés avec --no-index."
-#: builtin/grep.c:898
+#: builtin/grep.c:896
msgid "--no-index or --untracked cannot be used with revs."
msgstr ""
"--no-index ou --untracked ne peuvent pas être utilisés avec des révisions."
-#: builtin/grep.c:901
+#: builtin/grep.c:899
msgid "--[no-]exclude-standard cannot be used for tracked contents."
msgstr ""
"--[no-]exclude-standard ne peut pas être utilisé avec du contenu suivi."
-#: builtin/grep.c:909
+#: builtin/grep.c:907
msgid "both --cached and trees are given."
msgstr "--cached et des arbres sont fournis en même temps."
@@ -5842,7 +5765,7 @@ msgstr ""
msgid "git hash-object --stdin-paths < <list-of-paths>"
msgstr "git hash-object --stdin-paths < <liste-de-chemins>"
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:72 builtin/tag.c:521
msgid "type"
msgstr "type"
@@ -6082,8 +6005,8 @@ msgstr "grave incohérence dans la décompression (inflate)"
msgid "SHA1 COLLISION FOUND WITH %s !"
msgstr "COLLISION SHA1 TROUVÉE AVEC %s !"
-#: builtin/index-pack.c:669 builtin/pack-objects.c:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
#, c-format
msgid "unable to read %s"
msgstr "impossible de lire %s"
@@ -6351,33 +6274,31 @@ msgstr "impossible de traiter le fichier de type %d"
msgid "unable to move %s to %s"
msgstr "impossible de déplacer %s vers %s"
-#.
-#. * 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
+#. 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:418
#, c-format
msgid "%s%s Git repository in %s%s\n"
msgstr "Dépôt Git%2$s %1$s dans %3$s%4$s\n"
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Reinitialized existing"
msgstr "existant réinitialisé"
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Initialized empty"
msgstr "vide initialisé"
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
msgid " shared"
msgstr " partagé"
-#: builtin/init-db.c:441
+#: builtin/init-db.c:439
msgid "cannot tell cwd"
msgstr "impossible de déterminer le répertoire de travail courant"
-#: builtin/init-db.c:467
+#: builtin/init-db.c:465
msgid ""
"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
"shared[=<permissions>]] [directory]"
@@ -6385,29 +6306,29 @@ msgstr ""
"git init [-q | --quiet] [--bare] [--template=<répertoire-modèle>] [--"
"shared[=<permissions>]] [répertoire]"
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
msgid "permissions"
msgstr "permissions"
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
msgid "specify that the git repository is to be shared amongst several users"
msgstr "spécifier que le dépôt git sera partagé entre plusieurs utilisateurs"
-#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
msgid "be quiet"
msgstr "être silencieux"
-#: builtin/init-db.c:525 builtin/init-db.c:530
+#: builtin/init-db.c:523 builtin/init-db.c:528
#, c-format
msgid "cannot mkdir %s"
msgstr "impossible de créer le répertoire (mkdir) %s"
-#: builtin/init-db.c:534
+#: builtin/init-db.c:532
#, c-format
msgid "cannot chdir to %s"
msgstr "impossible de se déplacer vers le répertoire (chdir) %s"
-#: builtin/init-db.c:556
+#: builtin/init-db.c:554
#, c-format
msgid ""
"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6416,11 +6337,11 @@ msgstr ""
"%s (ou --work-tree=<répertoire>) n'est pas autorisé sans spécifier %s (ou --"
"git-dir=<répertoire>)"
-#: builtin/init-db.c:580
+#: builtin/init-db.c:578
msgid "Cannot access current working directory"
msgstr "Impossible d'accéder au répertoire de travail courant"
-#: builtin/init-db.c:587
+#: builtin/init-db.c:585
#, c-format
msgid "Cannot access work tree '%s'"
msgstr "Impossible d'accéder à l'arbre de travail '%s'"
@@ -6483,7 +6404,7 @@ msgstr "Exactement une plage nécessaire."
#: builtin/log.c:809
msgid "Not a range."
-msgstr "Pas une plage."
+msgstr "Ceci n'est pas une plage."
#: builtin/log.c:911
msgid "Cover letter needs email format"
@@ -6606,7 +6527,7 @@ msgstr "répondre dans le premier message à <id-message>"
#: builtin/log.c:1221 builtin/log.c:1224
msgid "boundary"
-msgstr "frontière"
+msgstr "limite"
#: builtin/log.c:1222
msgid "attach the patch"
@@ -6688,98 +6609,98 @@ msgstr ""
msgid "Unknown commit %s"
msgstr "Commit inconnu %s"
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
msgid "git ls-files [options] [<file>...]"
msgstr "git ls-files [options] [<fichier>...]"
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
msgid "identify the file status with tags"
msgstr "identifier le statut de fichier avec les étiquettes"
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
msgid "use lowercase letters for 'assume unchanged' files"
msgstr "utiliser des minuscules pour les fichier 'assumés inchangés'"
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
msgid "show cached files in the output (default)"
msgstr "afficher les fichiers mis en cache dans la sortie (défaut)"
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
msgid "show deleted files in the output"
msgstr "afficher les fichiers supprimés dans la sortie"
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
msgid "show modified files in the output"
msgstr "afficher les fichiers modifiés dans la sortie"
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
msgid "show other files in the output"
msgstr "afficher les autres fichiers dans la sortie"
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
msgid "show ignored files in the output"
msgstr "afficher les fichiers ignorés dans la sortie"
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
msgid "show staged contents' object name in the output"
msgstr "afficher les nom des objets indexés dans la sortie"
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
msgid "show files on the filesystem that need to be removed"
msgstr ""
"afficher les fichiers du système de fichiers qui ont besoin d'être supprimés"
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
msgid "show 'other' directories' name only"
msgstr "afficher seulement les noms des répertoires 'other'"
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
msgid "don't show empty directories"
msgstr "ne pas afficher les répertoires vides"
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
msgid "show unmerged files in the output"
msgstr "afficher les fichiers non fusionnés dans la sortie"
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
msgid "show resolve-undo information"
msgstr "afficher l'information resolv-undo"
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
msgid "skip files matching pattern"
msgstr "sauter les fichiers correspondant au motif"
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
msgid "exclude patterns are read from <file>"
msgstr "les motifs d'exclusion sont lus depuis <fichier>"
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
msgid "read additional per-directory exclude patterns in <file>"
msgstr "lire des motifs d'exclusion additionnels par répertoire dans <fichier>"
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
msgid "add the standard git exclusions"
msgstr "ajouter les exclusions git standard"
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
msgid "make the output relative to the project top directory"
msgstr "afficher en relatif par rapport au répertoire racine du projet"
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
msgid "if any <file> is not in the index, treat this as an error"
msgstr "si un <fichier> n'est pas dans l'index, traiter cela comme une erreur"
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
msgid "tree-ish"
msgstr "arbre ou apparenté"
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
msgid "pretend that paths removed since <tree-ish> are still present"
msgstr ""
"considérer que les chemins supprimés depuis <arbre ou apparenté> sont "
"toujours présents"
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
msgid "show debugging data"
msgstr "afficher les données de débogage"
@@ -6894,7 +6815,7 @@ msgstr "abandonner si l'avance rapide n'est pas possible"
msgid "Verify that the named commit has a valid GPG signature"
msgstr "Vérifier que la validation a une signature GPG valide"
-#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
msgid "strategy"
msgstr "stratégie"
@@ -6968,37 +6889,37 @@ msgstr "'%s' ne pointe pas sur un commit"
msgid "Bad branch.%s.mergeoptions string: %s"
msgstr "Mauvaise chaîne branch.%s.mergeoptions : %s"
-#: builtin/merge.c:650
+#: builtin/merge.c:653
msgid "git write-tree failed to write a tree"
msgstr "git write-tree a échoué à écrire un arbre"
-#: builtin/merge.c:678
+#: builtin/merge.c:681
msgid "Not handling anything other than two heads merge."
msgstr "Impossible de gérer autre chose que la fusion de deux têtes."
-#: builtin/merge.c:692
+#: builtin/merge.c:695
#, c-format
msgid "Unknown option for merge-recursive: -X%s"
msgstr "Options inconnue pour merge-recursive : -X%s"
-#: builtin/merge.c:706
+#: builtin/merge.c:709
#, c-format
msgid "unable to write %s"
msgstr "impossible d'écrire %s"
-#: builtin/merge.c:795
+#: builtin/merge.c:798
#, c-format
msgid "Could not read from '%s'"
msgstr "Impossible de lire depuis '%s'"
-#: builtin/merge.c:804
+#: builtin/merge.c:807
#, c-format
msgid "Not committing merge; use 'git commit' to complete the merge.\n"
msgstr ""
"Pas de validation de la fusion ; utilisez 'git commit' pour terminer la "
"fusion.\n"
-#: builtin/merge.c:810
+#: builtin/merge.c:813
#, c-format
msgid ""
"Please enter a commit message to explain why this merge is necessary,\n"
@@ -7015,49 +6936,49 @@ msgstr ""
"Les lignes commençant par '%c' seront ignorées, et un message vide\n"
"abandonne la validation.\n"
-#: builtin/merge.c:834
+#: builtin/merge.c:837
msgid "Empty commit message."
msgstr "Message de validation vide."
-#: builtin/merge.c:846
+#: builtin/merge.c:849
#, c-format
msgid "Wonderful.\n"
msgstr "Merveilleux.\n"
-#: builtin/merge.c:911
+#: builtin/merge.c:914
#, c-format
msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
msgstr ""
"La fusion automatique a échoué ; réglez les conflits et validez le "
"résultat.\n"
-#: builtin/merge.c:927
+#: builtin/merge.c:930
#, c-format
msgid "'%s' is not a commit"
msgstr "'%s' n'est pas une validation"
-#: builtin/merge.c:968
+#: builtin/merge.c:971
msgid "No current branch."
msgstr "Pas de branche courante."
-#: builtin/merge.c:970
+#: builtin/merge.c:973
msgid "No remote for the current branch."
msgstr "Pas de branche distante pour la branche courante."
-#: builtin/merge.c:972
+#: builtin/merge.c:975
msgid "No default upstream defined for the current branch."
msgstr "Pas de branche amont par défaut définie pour la branche courante."
-#: builtin/merge.c:977
+#: builtin/merge.c:980
#, c-format
msgid "No remote-tracking branch for %s from %s"
msgstr "Pas de branche de suivi pour %s depuis %s"
-#: builtin/merge.c:1133
+#: builtin/merge.c:1136
msgid "There is no merge to abort (MERGE_HEAD missing)."
msgstr "Il n'y a pas de fusion à abandonner (MERGE_HEAD manquant)."
-#: builtin/merge.c:1149 git-pull.sh:31
+#: builtin/merge.c:1152 git-pull.sh:31
msgid ""
"You have not concluded your merge (MERGE_HEAD exists).\n"
"Please, commit your changes before you can merge."
@@ -7065,11 +6986,11 @@ msgstr ""
"Vous n'avez pas terminé votre fusion (MERGE_HEAD existe).\n"
"Veuillez valider vos changements avant de pouvoir fusionner."
-#: builtin/merge.c:1152 git-pull.sh:34
+#: builtin/merge.c:1155 git-pull.sh:34
msgid "You have not concluded your merge (MERGE_HEAD exists)."
msgstr "Vous n'avez pas terminé votre fusion (MERGE_HEAD existe)."
-#: builtin/merge.c:1156
+#: builtin/merge.c:1159
msgid ""
"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
"Please, commit your changes before you can merge."
@@ -7077,103 +6998,102 @@ msgstr ""
"Vous n'avez pas terminé votre picorage (CHERRY_PICK_HEAD existe).\n"
"Veuillez valider vos changements avant de pouvoir fusionner."
-#: builtin/merge.c:1159
+#: builtin/merge.c:1162
msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
msgstr "Vous n'avez pas terminé votre picorage (CHERRY_PICK_HEAD existe)."
-#: builtin/merge.c:1168
+#: builtin/merge.c:1171
msgid "You cannot combine --squash with --no-ff."
msgstr "Vous ne pouvez pas combiner --squash avec --no-ff."
-#: builtin/merge.c:1177
+#: builtin/merge.c:1180
msgid "No commit specified and merge.defaultToUpstream not set."
msgstr ""
"Pas de validation spécifiée et merge.defaultToUpstream n'est pas défini."
-#: builtin/merge.c:1209
+#: builtin/merge.c:1212
msgid "Can merge only exactly one commit into empty head"
msgstr ""
"Possible de fusionner exactement une seule validation dans une tête vide"
-#: builtin/merge.c:1212
+#: builtin/merge.c:1215
msgid "Squash commit into empty head not supported yet"
msgstr "La validation compressée vers une tête vide n'est pas encore supportée"
-#: builtin/merge.c:1214
+#: builtin/merge.c:1217
msgid "Non-fast-forward commit does not make sense into an empty head"
msgstr "Une validation sans avance rapide n'a pas de sens dans une tête vide"
-#: builtin/merge.c:1219
+#: builtin/merge.c:1222
#, c-format
msgid "%s - not something we can merge"
msgstr "%s - pas possible de fusionner ceci"
-#: builtin/merge.c:1270
+#: builtin/merge.c:1273
#, c-format
msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
msgstr "La validation %s a une signature GPG non fiable, prétendument par %s."
-#: builtin/merge.c:1273
+#: builtin/merge.c:1276
#, c-format
msgid "Commit %s has a bad GPG signature allegedly by %s."
msgstr "La validation %s a une mauvaise signature GPG prétendument par %s."
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
#, c-format
msgid "Commit %s does not have a GPG signature."
msgstr "La validation %s n'a pas de signature GPG."
-#: builtin/merge.c:1279
+#: builtin/merge.c:1282
#, c-format
msgid "Commit %s has a good GPG signature by %s\n"
msgstr "La validation %s a une signature GPG correcte par %s\n"
-#: builtin/merge.c:1363
+#: builtin/merge.c:1366
#, c-format
msgid "Updating %s..%s\n"
msgstr "Mise à jour %s..%s\n"
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
#, c-format
msgid "Trying really trivial in-index merge...\n"
msgstr "Essai de fusion vraiment triviale dans l'index...\n"
-#: builtin/merge.c:1409
+#: builtin/merge.c:1412
#, c-format
msgid "Nope.\n"
msgstr "Non.\n"
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
msgid "Not possible to fast-forward, aborting."
msgstr "Pas possible d'avancer rapidement, abandon."
-#: builtin/merge.c:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
#, c-format
msgid "Rewinding the tree to pristine...\n"
msgstr "Retour de l'arbre à l'original...\n"
-#: builtin/merge.c:1468
+#: builtin/merge.c:1471
#, c-format
msgid "Trying merge strategy %s...\n"
msgstr "Essai de la stratégie de fusion %s...\n"
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
#, c-format
msgid "No merge strategy handled the merge.\n"
msgstr "Aucune stratégie de fusion n'a pris en charge la fusion.\n"
-#: builtin/merge.c:1536
+#: builtin/merge.c:1539
#, c-format
msgid "Merge with strategy %s failed.\n"
msgstr "La fusion avec la stratégie %s a échoué.\n"
-#: builtin/merge.c:1545
+#: builtin/merge.c:1548
#, c-format
msgid "Using the %s to prepare resolving by hand.\n"
msgstr "Utilisation de %s pour préparer la résolution à la main.\n"
-#: builtin/merge.c:1557
+#: builtin/merge.c:1560
#, c-format
msgid "Automatic merge went well; stopped before committing as requested\n"
msgstr ""
@@ -7259,19 +7179,19 @@ msgstr "ne pas avertir à propos des conflits"
msgid "set labels for file1/orig_file/file2"
msgstr "définir les labels pour fichier1/orig_file/fichier2"
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
msgid "git mktree [-z] [--missing] [--batch]"
msgstr "git mktree [-z] [--missing] [--batch]"
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
msgid "input is NUL terminated"
msgstr "l'entrée se termine par NUL"
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
msgid "allow missing objects"
msgstr "autoriser les objets manquants"
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
msgid "allow creation of more than one tree"
msgstr "autoriser la création de plus d'un arbre"
@@ -7321,46 +7241,46 @@ msgstr ""
msgid "Huh? %.*s is in index?"
msgstr "Hein ? %.*s est dans l'index ?"
-#: builtin/mv.c:168
+#: builtin/mv.c:169
msgid "source directory is empty"
msgstr "le répertoire source est vide"
-#: builtin/mv.c:200
+#: builtin/mv.c:205
msgid "not under version control"
msgstr "pas sous le contrôle de version"
-#: builtin/mv.c:202
+#: builtin/mv.c:207
msgid "destination exists"
msgstr "la destination existe"
-#: builtin/mv.c:210
+#: builtin/mv.c:215
#, c-format
msgid "overwriting '%s'"
msgstr "écrasement de '%s'"
-#: builtin/mv.c:213
+#: builtin/mv.c:218
msgid "Cannot overwrite"
msgstr "Impossible d'écraser"
-#: builtin/mv.c:216
+#: builtin/mv.c:221
msgid "multiple sources for the same target"
msgstr "multiples sources pour la même destination"
-#: builtin/mv.c:218
+#: builtin/mv.c:223
msgid "destination directory does not exist"
msgstr "le répertoire de destination n'existe pas"
-#: builtin/mv.c:233
+#: builtin/mv.c:243
#, c-format
msgid "%s, source=%s, destination=%s"
msgstr "%s, source=%s, destination=%s"
-#: builtin/mv.c:243
+#: builtin/mv.c:253
#, c-format
msgid "Renaming %s to %s\n"
msgstr "Renommage de %s en %s\n"
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
#, c-format
msgid "renaming '%s' failed"
msgstr "le renommage de '%s' a échoué"
@@ -7532,7 +7452,7 @@ msgstr "impossible de lire la sortie de 'show'"
msgid "failed to finish 'show' for object '%s'"
msgstr "impossible de finir 'show' pour l'objet '%s'"
-#: builtin/notes.c:167 builtin/tag.c:341
+#: builtin/notes.c:167 builtin/tag.c:373
#, c-format
msgid "could not create file '%s'"
msgstr "impossible de créer le fichier '%s'"
@@ -7541,7 +7461,7 @@ msgstr "impossible de créer le fichier '%s'"
msgid "Please supply the note contents using either -m or -F option"
msgstr "Veuillez fournir le contenu de la note en utilisant l'option -m ou -F"
-#: builtin/notes.c:207 builtin/notes.c:844
+#: builtin/notes.c:207 builtin/notes.c:848
#, c-format
msgid "Removing note for object %s\n"
msgstr "Suppression de la note pour l'objet %s\n"
@@ -7555,20 +7475,20 @@ msgstr "impossible d'écrire l'objet note"
msgid "The note contents has been left in %s"
msgstr "Le contenu de la note a été laissé dans %s"
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
#, c-format
msgid "cannot read '%s'"
msgstr "impossible de lire '%s'"
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
#, c-format
msgid "could not open or read '%s'"
msgstr "impossible d'ouvrir ou lire '%s'"
-#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318
-#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515
-#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637
-#: builtin/notes.c:839 builtin/tag.c:553
+#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
+#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
+#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
+#: builtin/notes.c:843 builtin/tag.c:620
#, c-format
msgid "Failed to resolve '%s' as a valid ref."
msgstr "Impossible de résoudre '%s' comme une référence valide."
@@ -7578,53 +7498,58 @@ msgstr "Impossible de résoudre '%s' comme une référence valide."
msgid "Failed to read object '%s'."
msgstr "Impossible de lire l'objet '%s'."
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr "Impossible de lire les informations de note d'un objet non-blob '%s'."
+
+#: builtin/notes.c:316
#, c-format
msgid "Malformed input line: '%s'."
msgstr "Ligne en entrée malformée : '%s'."
-#: builtin/notes.c:327
+#: builtin/notes.c:331
#, c-format
msgid "Failed to copy notes from '%s' to '%s'"
msgstr "Impossible de copier les notes de '%s' vers '%s'"
-#: 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
+#: builtin/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
+#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
+#: builtin/notes.c:908
msgid "too many parameters"
msgstr "trop de paramètres"
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
#, c-format
msgid "No note found for object %s."
msgstr "Pas de note trouvée pour l'objet %s."
-#: builtin/notes.c:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
msgid "note contents as a string"
msgstr "contenu de la note sous forme de chaîne"
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
msgid "note contents in a file"
msgstr "contenu de la note dans un fichier"
-#: builtin/notes.c:411 builtin/notes.c:414 builtin/notes.c:568
-#: builtin/notes.c:571 builtin/tag.c:474
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
msgid "object"
msgstr "objet"
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
msgid "reuse and edit specified note object"
msgstr "réutiliser et éditer l'objet de note spécifié"
-#: builtin/notes.c:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
msgid "reuse specified note object"
msgstr "réutiliser l'objet de note spécifié"
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
msgid "replace existing notes"
msgstr "remplacer les notes existantes"
-#: builtin/notes.c:451
+#: builtin/notes.c:455
#, c-format
msgid ""
"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7633,25 +7558,25 @@ msgstr ""
"Impossible d'ajouter des notes. Des notes ont été trouvées pour l'objet %s. "
"Utilisez '-f' pour écraser les notes existantes"
-#: builtin/notes.c:456 builtin/notes.c:533
+#: builtin/notes.c:460 builtin/notes.c:537
#, c-format
msgid "Overwriting existing notes for object %s\n"
msgstr "Écrasement des notes existantes pour l'objet %s\n"
-#: builtin/notes.c:486
+#: builtin/notes.c:490
msgid "read objects from stdin"
msgstr "lire les objets depuis l'entrée standard"
-#: builtin/notes.c:488
+#: builtin/notes.c:492
msgid "load rewriting config for <command> (implies --stdin)"
msgstr ""
"charger la configuration de réécriture pour <commande> (implique --stdin)"
-#: builtin/notes.c:506
+#: builtin/notes.c:510
msgid "too few parameters"
msgstr "pas assez de paramètres"
-#: builtin/notes.c:527
+#: builtin/notes.c:531
#, c-format
msgid ""
"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7660,12 +7585,12 @@ msgstr ""
"Impossible de copier des notes. Des notes ont été trouvées pour l'objet %s. "
"Utilisez '-f' pour écraser les notes existantes"
-#: builtin/notes.c:539
+#: builtin/notes.c:543
#, c-format
msgid "Missing notes on source object %s. Cannot copy."
msgstr "Notes manquantes sur l'objet source %s. Impossible de copier."
-#: builtin/notes.c:588
+#: builtin/notes.c:592
#, c-format
msgid ""
"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -7674,15 +7599,15 @@ msgstr ""
"Les options -m/-F/-c/-C sont obsolètes pour la sous-commande 'edit'.\n"
"Veuillez utiliser 'git notes add -f -m/-F/-c/-C' à la place.\n"
-#: builtin/notes.c:735
+#: builtin/notes.c:739
msgid "General options"
msgstr "Options générales"
-#: builtin/notes.c:737
+#: builtin/notes.c:741
msgid "Merge options"
msgstr "Options de fusion"
-#: builtin/notes.c:739
+#: builtin/notes.c:743
msgid ""
"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
"cat_sort_uniq)"
@@ -7690,210 +7615,234 @@ msgstr ""
"résoudre les conflits de notes en utilisant la stratégie donnée (manual/ours/"
"theirs/union/cat_sort_uniq)"
-#: builtin/notes.c:741
+#: builtin/notes.c:745
msgid "Committing unmerged notes"
msgstr "Validation des notes non fusionnées"
-#: builtin/notes.c:743
+#: builtin/notes.c:747
msgid "finalize notes merge by committing unmerged notes"
msgstr "finaliser la fusion de notes en validant les notes non fusionnées"
-#: builtin/notes.c:745
+#: builtin/notes.c:749
msgid "Aborting notes merge resolution"
msgstr "Abandon de la résolution de fusion des notes"
-#: builtin/notes.c:747
+#: builtin/notes.c:751
msgid "abort notes merge"
msgstr "abandonner la fusion de notes"
-#: builtin/notes.c:842
+#: builtin/notes.c:846
#, c-format
msgid "Object %s has no note\n"
msgstr "L'objet %s n'a pas de note\n"
-#: builtin/notes.c:854
+#: builtin/notes.c:858
msgid "attempt to remove non-existent note is not an error"
msgstr ""
"la tentative de suppression d'une note non existante n'est pas une erreur"
-#: builtin/notes.c:857
+#: builtin/notes.c:861
msgid "read object names from the standard input"
msgstr "lire les noms d'objet depuis l'entrée standard"
-#: builtin/notes.c:938
-msgid "notes_ref"
-msgstr "références_notes"
+#: builtin/notes.c:942
+msgid "notes-ref"
+msgstr "références-notes"
-#: builtin/notes.c:939
+#: builtin/notes.c:943
msgid "use notes from <notes_ref>"
msgstr "utiliser les notes depuis <références_notes>"
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
#, c-format
msgid "Unknown subcommand: %s"
msgstr "Sous-commande inconnue : %s"
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
msgstr ""
"git pack-objects --stdout [options...] [< liste-références | < liste-objets]"
-#: builtin/pack-objects.c:24
+#: builtin/pack-objects.c:26
msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
msgstr ""
"git pack-objects [options...] base-name [< liste-références | < liste-objets]"
-#: builtin/pack-objects.c:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
#, c-format
msgid "deflate error (%d)"
msgstr "erreur de compression (%d)"
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "Écriture des objets"
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr "désactivation de l'écriture en bitmap car certains objets ne sont pas compressés"
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr "Compression des objets"
+
+#: builtin/pack-objects.c:2530
#, c-format
msgid "unsupported index version %s"
msgstr "version d'index non supportée %s"
-#: builtin/pack-objects.c:2400
+#: builtin/pack-objects.c:2534
#, c-format
msgid "bad index version '%s'"
msgstr "mauvaise version d'index '%s'"
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
#, c-format
msgid "option %s does not accept negative form"
msgstr "l'option %s n'accepte pas de valeur négative"
-#: builtin/pack-objects.c:2427
+#: builtin/pack-objects.c:2561
#, c-format
msgid "unable to parse value '%s' for option %s"
msgstr "impossible d'analyser la valeur '%s' pour l'option %s"
-#: builtin/pack-objects.c:2446
+#: builtin/pack-objects.c:2580
msgid "do not show progress meter"
msgstr "ne pas afficher la barre de progression"
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
msgid "show progress meter"
msgstr "afficher la barre de progression"
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
msgid "show progress meter during object writing phase"
msgstr "afficher la barre de progression durant la phase d'écrite des objets"
-#: builtin/pack-objects.c:2453
+#: builtin/pack-objects.c:2587
msgid "similar to --all-progress when progress meter is shown"
msgstr "similaire à --all-progress quand la barre de progression est affichée"
-#: builtin/pack-objects.c:2454
+#: builtin/pack-objects.c:2588
msgid "version[,offset]"
msgstr "version[,offset]"
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
msgid "write the pack index file in the specified idx format version"
msgstr ""
"écrire le fichier d'index du paquet dans le format d'index de version "
"spécifié"
-#: builtin/pack-objects.c:2458
+#: builtin/pack-objects.c:2592
msgid "maximum size of each output pack file"
msgstr "taille maximum de chaque fichier paquet en sortie"
-#: builtin/pack-objects.c:2460
+#: builtin/pack-objects.c:2594
msgid "ignore borrowed objects from alternate object store"
msgstr "ignorer les objets empruntés à un autre magasin d'objets"
-#: builtin/pack-objects.c:2462
+#: builtin/pack-objects.c:2596
msgid "ignore packed objects"
msgstr "ignorer les objets empaquetés"
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
msgid "limit pack window by objects"
msgstr "limiter la fenêtre d'empaquetage par objets"
-#: builtin/pack-objects.c:2466
+#: builtin/pack-objects.c:2600
msgid "limit pack window by memory in addition to object limit"
msgstr ""
"limiter la fenêtre d'empaquetage par mémoire en plus de la limite d'objets"
-#: builtin/pack-objects.c:2468
+#: builtin/pack-objects.c:2602
msgid "maximum length of delta chain allowed in the resulting pack"
msgstr ""
"longueur maximum de la chaîne de delta autorisée dans le paquet résultant"
-#: builtin/pack-objects.c:2470
+#: builtin/pack-objects.c:2604
msgid "reuse existing deltas"
msgstr "réutiliser les deltas existants"
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
msgid "reuse existing objects"
msgstr "réutiliser les objets existants"
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
msgid "use OFS_DELTA objects"
msgstr "utiliser les objets OFS_DELTA"
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
msgid "use threads when searching for best delta matches"
msgstr ""
"utiliser des fils lors de la recherche pour une meilleurs correspondance des "
"deltas"
-#: builtin/pack-objects.c:2478
+#: builtin/pack-objects.c:2612
msgid "do not create an empty pack output"
msgstr "ne pas créer un paquet vide"
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
msgid "read revision arguments from standard input"
msgstr "lire les paramètres de révision depuis l'entrée standard"
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
msgid "limit the objects to those that are not yet packed"
msgstr "limiter les objets à ceux qui ne sont pas encore empaquetés"
-#: builtin/pack-objects.c:2485
+#: builtin/pack-objects.c:2619
msgid "include objects reachable from any reference"
msgstr "inclure les objets accessibles depuis toute référence"
-#: builtin/pack-objects.c:2488
+#: builtin/pack-objects.c:2622
msgid "include objects referred by reflog entries"
msgstr "inclure les objets référencés par les éléments de reflog"
-#: builtin/pack-objects.c:2491
+#: builtin/pack-objects.c:2625
msgid "output pack to stdout"
msgstr "afficher l'empaquetage sur la sortie standard"
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
msgid "include tag objects that refer to objects to be packed"
msgstr "inclure les objets d'étiquettes qui réfèrent à des objets à empaqueter"
-#: builtin/pack-objects.c:2495
+#: builtin/pack-objects.c:2629
msgid "keep unreachable objects"
msgstr "garder les objets inaccessibles"
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
msgid "time"
msgstr "heure"
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
msgid "unpack unreachable objects newer than <time>"
msgstr "dépaqueter les objets inaccessibles plus récents que <heure>"
-#: builtin/pack-objects.c:2500
+#: builtin/pack-objects.c:2634
msgid "create thin packs"
msgstr "créer des paquets légers"
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
msgid "ignore packs that have companion .keep file"
msgstr "ignorer les paquets qui ont un fichier .keep"
-#: builtin/pack-objects.c:2504
+#: builtin/pack-objects.c:2638
msgid "pack compression level"
msgstr "niveau de compression du paquet"
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
msgid "do not hide commits by grafts"
msgstr "ne pas cacher les validations par greffes"
+#: builtin/pack-objects.c:2642
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr "utiliser un index en bitmap si disponible pour accélerer le décompte des objets"
+
+#: builtin/pack-objects.c:2644
+msgid "write a bitmap index together with the pack index"
+msgstr "écrire un index en bitmap associé à l'index de paquet"
+
+#: builtin/pack-objects.c:2723
+msgid "Counting objects"
+msgstr "Décompte des objets"
+
#: builtin/pack-refs.c:6
msgid "git pack-refs [options]"
msgstr "git pack-refs [options]"
@@ -7910,6 +7859,10 @@ msgstr "éliminer les références perdues (défaut)"
msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]"
+#: builtin/prune-packed.c:49
+msgid "Removing duplicate objects"
+msgstr "Suppression des objets dupliqués"
+
#: builtin/prune.c:12
msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
msgstr "git prune [-n] [-v] [--expire <heure>] [--] [<head>...]"
@@ -7930,15 +7883,15 @@ msgstr "faire expirer les objets plus vieux que <heure>"
msgid "git push [<options>] [<repository> [<refspec>...]]"
msgstr "git push [<options>] [<dépôt> [<spécification-de-référence>...]]"
-#: builtin/push.c:86
+#: builtin/push.c:85
msgid "tag shorthand without <tag>"
msgstr "raccourci d'étiquette sans <étiquette>"
-#: builtin/push.c:96
+#: builtin/push.c:95
msgid "--delete only accepts plain target ref names"
msgstr "--delete accepte seulement des noms entiers de références cibles"
-#: builtin/push.c:141
+#: builtin/push.c:140
msgid ""
"\n"
"To choose either option permanently, see push.default in 'git help config'."
@@ -7947,7 +7900,7 @@ msgstr ""
"Pour choisir l'option de manière permanente, voir push.default dans 'git "
"help config'."
-#: builtin/push.c:144
+#: builtin/push.c:143
#, c-format
msgid ""
"The upstream branch of your current branch does not match\n"
@@ -7972,7 +7925,7 @@ msgstr ""
" git push %s %s\n"
"%s"
-#: builtin/push.c:159
+#: builtin/push.c:158
#, c-format
msgid ""
"You are not currently on a branch.\n"
@@ -7987,7 +7940,7 @@ msgstr ""
"\n"
" git push %s HEAD:<nom-de-la-branche-amont>\n"
-#: builtin/push.c:173
+#: builtin/push.c:172
#, c-format
msgid ""
"The current branch %s has no upstream branch.\n"
@@ -8001,13 +7954,13 @@ msgstr ""
"\n"
" git push --set-upstream %s %s\n"
-#: builtin/push.c:181
+#: builtin/push.c:180
#, c-format
msgid "The current branch %s has multiple upstream branches, refusing to push."
msgstr ""
"La branche courante %s a de multiples branches amont, impossible de pousser."
-#: builtin/push.c:184
+#: builtin/push.c:183
#, c-format
msgid ""
"You are pushing to remote '%s', which is not the upstream of\n"
@@ -8018,11 +7971,11 @@ msgstr ""
"pas une branche amont de votre branche courante '%s', sans me dire\n"
"quoi pousser pour mettre à jour quelle branche amont."
-#: builtin/push.c:207
+#: builtin/push.c:206
msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"push.default is unset; its implicit value has changed in\n"
"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
-"and maintain the current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
"\n"
" git config --global push.default matching\n"
"\n"
@@ -8033,7 +7986,7 @@ msgid ""
"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"
+"Since Git 2.0, Git defaults to the more conservative 'simple'\n"
"behavior, which only pushes the current branch to the corresponding\n"
"remote branch that 'git pull' uses to update the current branch.\n"
"\n"
@@ -8042,41 +7995,35 @@ msgid ""
"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
"'current' instead of 'simple' if you sometimes use older versions of Git)"
msgstr ""
-"push.default n'est pas défini ; sa valeur implicite change dans Git 2.0\n"
+"push.default n'est pas défini ; sa valeur implicite a changé dans Git 2.0\n"
"de 'matching' vers 'simple'. Pour supprimer ce message et maintenir\n"
-"le comportement actuel après la modification de la valeur de défaut, "
-"utilisez :\n"
+"le comportement actuel après la modification de la valeur de défaut, utilisez :\n"
"\n"
" git config --global push.default matching\n"
"\n"
-"Pour supprimer ce message et adopter le nouveau comportement maintenant, "
-"utilisez :\n"
+"Pour supprimer ce message et adopter le nouveau comportement maintenant, utilisez :\n"
"\n"
" git config --global push.default simple\n"
"\n"
"Quand push.default vaudra 'matching', git poussera les branches locales\n"
"sur les branches distantes qui existent déjà avec le même nom.\n"
"\n"
-"Dans Git 2.0 Git utilisera par défaut le comportement plus conservatif "
-"'simple'\n"
-"qui ne pousse la branche courante vers la branche distante que 'git pull' "
-"utilise\n"
-"pour mettre à jour la branche courante.\n"
+"Depuis Git 2.0, Git utilise par défaut le comportement plus conservatif 'simple'\n"
+"qui ne pousse la branche courante que vers la branche distante correspondante\n"
+"que 'git pull' utilise pour mettre à jour la branche courante.\n"
" \n"
"Voir 'git help config' et chercher 'push.default' pour plus d'information.\n"
-"(le mode 'simple' a été introduit dans Git 1.7.11. Utilisez le mode "
-"similaire\n"
-"'current' au lieu de 'simple' si vous utilisez de temps en temps d'anciennes "
-"versions de Git)"
+"(le mode 'simple' a été introduit dans Git 1.7.11. Utilisez le mode similaire\n"
+"'current' au lieu de 'simple' si vous utilisez de temps en temps d'anciennes versions de Git)"
-#: builtin/push.c:274
+#: builtin/push.c:273
msgid ""
"You didn't specify any refspecs to push, and push.default is \"nothing\"."
msgstr ""
"Vous n'avez pas spécifié de spécifications de référence à pousser, et push."
"default est \"nothing\"."
-#: builtin/push.c:281
+#: builtin/push.c:280
msgid ""
"Updates were rejected because the tip of your current branch is behind\n"
"its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -8091,23 +8038,7 @@ msgstr ""
"Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
"d'information."
-#: 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 ""
-"Les mises à jour ont été rejetées car la pointe de la branche poussée est "
-"derrière\n"
-"son homologue distant. Si vous ne vouliez pas pousser cette branche, vous "
-"pourriez\n"
-"vouloir spécifier les branches à pousser ou définir la variable de "
-"configuration\n"
-"'push.default' à 'simple', 'current' ou 'upstream' pour pousser seulement la "
-"branche courante."
-
-#: builtin/push.c:293
+#: builtin/push.c:286
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"
@@ -8122,7 +8053,7 @@ msgstr ""
"Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
"d'information."
-#: builtin/push.c:299
+#: builtin/push.c:292
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"
@@ -8140,13 +8071,13 @@ msgstr ""
"Voir la 'Note à propos des avances rapides' dans 'git push --help' pour plus "
"d'information."
-#: builtin/push.c:306
+#: builtin/push.c:299
msgid "Updates were rejected because the tag already exists in the remote."
msgstr ""
"Les mises à jour ont été rejetées car l'étiquette existe déjà dans la "
"branche distante."
-#: builtin/push.c:309
+#: builtin/push.c:302
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"
@@ -8158,22 +8089,22 @@ msgstr ""
"pointer\n"
"vers un objet qui n'est pas un commit, sans utiliser l'option '--force'.\n"
-#: builtin/push.c:375
+#: builtin/push.c:361
#, c-format
msgid "Pushing to %s\n"
-msgstr "Poussage vers %s\n"
+msgstr "Poussée vers %s\n"
-#: builtin/push.c:379
+#: builtin/push.c:365
#, c-format
msgid "failed to push some refs to '%s'"
msgstr "impossible de pousser des références vers '%s'"
-#: builtin/push.c:412
+#: builtin/push.c:395
#, c-format
msgid "bad repository '%s'"
msgstr "mauvais dépôt '%s'"
-#: builtin/push.c:413
+#: builtin/push.c:396
msgid ""
"No configured push destination.\n"
"Either specify the URL from the command-line or configure a remote "
@@ -8195,96 +8126,96 @@ msgstr ""
"\n"
" git push <nom>\n"
-#: builtin/push.c:428
+#: builtin/push.c:411
msgid "--all and --tags are incompatible"
msgstr "--all et --tags sont incompatibles"
-#: builtin/push.c:429
+#: builtin/push.c:412
msgid "--all can't be combined with refspecs"
msgstr "--all ne peut pas être combiné avec des spécifications de référence"
-#: builtin/push.c:434
+#: builtin/push.c:417
msgid "--mirror and --tags are incompatible"
msgstr "--mirror et --tags sont incompatibles"
-#: builtin/push.c:435
+#: builtin/push.c:418
msgid "--mirror can't be combined with refspecs"
msgstr "--mirror ne peut pas être combiné avec des spécifications de référence"
-#: builtin/push.c:440
+#: builtin/push.c:423
msgid "--all and --mirror are incompatible"
msgstr "--all et --mirror sont incompatibles"
-#: builtin/push.c:500
+#: builtin/push.c:483
msgid "repository"
msgstr "dépôt"
-#: builtin/push.c:501
+#: builtin/push.c:484
msgid "push all refs"
msgstr "pousser toutes les références"
-#: builtin/push.c:502
+#: builtin/push.c:485
msgid "mirror all refs"
msgstr "refléter toutes les références"
-#: builtin/push.c:504
+#: builtin/push.c:487
msgid "delete refs"
msgstr "supprimer les références"
-#: builtin/push.c:505
+#: builtin/push.c:488
msgid "push tags (can't be used with --all or --mirror)"
msgstr ""
"pousser les étiquettes (ne peut pas être utilisé avec --all ou --mirror)"
-#: builtin/push.c:508
+#: builtin/push.c:491
msgid "force updates"
msgstr "forcer les mises à jour"
-#: builtin/push.c:510
+#: builtin/push.c:493
msgid "refname>:<expect"
msgstr "nom de référence>:<attendu"
-#: builtin/push.c:511
+#: builtin/push.c:494
msgid "require old value of ref to be at this value"
msgstr "exiger que l'ancienne valeur de la référence soit à cette valeur"
-#: builtin/push.c:513
+#: builtin/push.c:496
msgid "check"
msgstr "check"
-#: builtin/push.c:514
+#: builtin/push.c:497
msgid "control recursive pushing of submodules"
-msgstr "contrôler le poussage récursif des sous-modules"
+msgstr "contrôler la poussée récursive des sous-modules"
-#: builtin/push.c:516
+#: builtin/push.c:499
msgid "use thin pack"
msgstr "utiliser un empaquetage léger"
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
msgid "receive pack program"
msgstr "recevoir le programme d'empaquetage"
-#: builtin/push.c:519
+#: builtin/push.c:502
msgid "set upstream for git pull/status"
msgstr "définir la branche amont pour git pull/status"
-#: builtin/push.c:522
+#: builtin/push.c:505
msgid "prune locally removed refs"
msgstr "éliminer les références locales supprimées"
-#: builtin/push.c:524
+#: builtin/push.c:507
msgid "bypass pre-push hook"
msgstr "éviter d'utiliser le crochet pre-push"
-#: builtin/push.c:525
+#: builtin/push.c:508
msgid "push missing but relevant tags"
msgstr "pousser les étiquettes manquantes mais pertinentes"
-#: builtin/push.c:535
+#: builtin/push.c:518
msgid "--delete is incompatible with --all, --mirror and --tags"
msgstr "--delete est incompatible avec --all, --mirror et --tags"
-#: builtin/push.c:537
+#: builtin/push.c:520
msgid "--delete doesn't make sense without any refs"
msgstr "--delete n'a pas de sens sans aucune référence"
@@ -8805,12 +8736,12 @@ msgstr "Impossible de paramétrer %s"
#: builtin/remote.c:1307
#, c-format
msgid " %s will become dangling!"
-msgstr " %s deviendra en suspens !"
+msgstr " %s se retrouvera en suspens !"
#: builtin/remote.c:1308
#, c-format
msgid " %s has become dangling!"
-msgstr " %s est devenu en suspens !"
+msgstr " %s se retrouve en suspens !"
#: builtin/remote.c:1314
#, c-format
@@ -8883,68 +8814,76 @@ msgstr "Pas de suppression de toutes les URLs non-push"
msgid "be verbose; must be placed before a subcommand"
msgstr "être verbeux : doit être placé avant une sous-commande"
-#: builtin/repack.c:15
+#: builtin/repack.c:16
msgid "git repack [options]"
msgstr "git repack [options]"
-#: builtin/repack.c:143
+#: builtin/repack.c:156
msgid "pack everything in a single pack"
msgstr "empaqueter tout dans un seul paquet"
-#: builtin/repack.c:145
+#: builtin/repack.c:158
msgid "same as -a, and turn unreachable objects loose"
msgstr "identique à -a et transformer les objets inaccessibles en suspens"
-#: builtin/repack.c:148
+#: builtin/repack.c:161
msgid "remove redundant packs, and run git-prune-packed"
msgstr "supprimer les paquets redondants et lancer git-prune-packed"
-#: builtin/repack.c:150
+#: builtin/repack.c:163
msgid "pass --no-reuse-delta to git-pack-objects"
msgstr "passer --no-reuse-delta à git-pack-objects"
-#: builtin/repack.c:152
+#: builtin/repack.c:165
msgid "pass --no-reuse-object to git-pack-objects"
msgstr "passer --no-reuse-object à git-pack-objects"
-#: builtin/repack.c:154
+#: builtin/repack.c:167
msgid "do not run git-update-server-info"
msgstr "ne pas lancer git update-server-info"
-#: builtin/repack.c:157
+#: builtin/repack.c:170
msgid "pass --local to git-pack-objects"
msgstr "passer --local à git-pack-objects"
-#: builtin/repack.c:158
+#: builtin/repack.c:172
+msgid "write bitmap index"
+msgstr "écrire un index en bitmap"
+
+#: builtin/repack.c:173
msgid "approxidate"
msgstr "date approximative"
-#: builtin/repack.c:159
+#: builtin/repack.c:174
msgid "with -A, do not loosen objects older than this"
msgstr "avec -A, ne pas suspendre les objets plus vieux que celui-ci"
-#: builtin/repack.c:161
+#: builtin/repack.c:176
msgid "size of the window used for delta compression"
msgstr "taille de la fenêtre utilisée pour la compression des deltas"
-#: builtin/repack.c:162 builtin/repack.c:166
+#: builtin/repack.c:177 builtin/repack.c:181
msgid "bytes"
msgstr "octets"
-#: builtin/repack.c:163
+#: builtin/repack.c:178
msgid "same as the above, but limit memory size instead of entries count"
msgstr ""
"idem ci-dessus, mais limiter la taille mémoire au lieu du nombre d'éléments"
-#: builtin/repack.c:165
+#: builtin/repack.c:180
msgid "limits the maximum delta depth"
msgstr "limite la profondeur maximale des deltas"
-#: builtin/repack.c:167
+#: builtin/repack.c:182
msgid "maximum size of each packfile"
msgstr "taille maximum de chaque fichier paquet"
-#: builtin/repack.c:343
+#: builtin/repack.c:184
+msgid "repack objects in packs marked with .keep"
+msgstr "réempaqueter les objets dans des paquets marqués avec .keep"
+
+#: builtin/repack.c:371
#, c-format
msgid "removing '%s' failed"
msgstr "la suppression de '%s' a échoué"
@@ -9037,76 +8976,84 @@ msgstr "Impossible de trouver l'arbre pour %s."
msgid "HEAD is now at %s"
msgstr "HEAD est maintenant à %s"
-#: builtin/reset.c:172
+#: builtin/reset.c:182
#, c-format
msgid "Cannot do a %s reset in the middle of a merge."
msgstr "Impossible de faire un \"reset %s\" au milieu d'une fusion."
-#: builtin/reset.c:262
+#: builtin/reset.c:273
msgid "be quiet, only report errors"
msgstr "être silencieux, afficher seulement les erreurs"
-#: builtin/reset.c:264
+#: builtin/reset.c:275
msgid "reset HEAD and index"
msgstr "réinitialiser HEAD et l'index"
-#: builtin/reset.c:265
+#: builtin/reset.c:276
msgid "reset only HEAD"
msgstr "réinitialiser seulement HEAD"
-#: builtin/reset.c:267 builtin/reset.c:269
+#: builtin/reset.c:278 builtin/reset.c:280
msgid "reset HEAD, index and working tree"
msgstr "réinitialiser HEAD, l'index et la copie de travail"
-#: builtin/reset.c:271
+#: builtin/reset.c:282
msgid "reset HEAD but keep local changes"
msgstr "réinitialiser HEAD mais garder les changements locaux"
-#: builtin/reset.c:289
+#: builtin/reset.c:285
+msgid "record only the fact that removed paths will be added later"
+msgstr "enregistrer seulement le fait que les chemins effacés seront ajoutés plus tard"
+
+#: builtin/reset.c:302
#, c-format
msgid "Failed to resolve '%s' as a valid revision."
msgstr "Échec de résolution de '%s' comme une révision valide."
-#: builtin/reset.c:292 builtin/reset.c:300
+#: builtin/reset.c:305 builtin/reset.c:313
#, c-format
msgid "Could not parse object '%s'."
msgstr "Impossible d'analyser l'objet '%s'."
-#: builtin/reset.c:297
+#: builtin/reset.c:310
#, c-format
msgid "Failed to resolve '%s' as a valid tree."
msgstr "Échec de résolution de '%s' comme un arbre valide."
-#: builtin/reset.c:306
+#: builtin/reset.c:319
msgid "--patch is incompatible with --{hard,mixed,soft}"
msgstr "--patch est incompatible avec --{hard,mixed,soft}"
-#: builtin/reset.c:315
+#: builtin/reset.c:328
msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
msgstr ""
"--mixed avec des chemins est obsolète ; utilisez 'git reset -- <paths>' à la "
"place."
-#: builtin/reset.c:317
+#: builtin/reset.c:330
#, c-format
msgid "Cannot do %s reset with paths."
msgstr "Impossible de faire un \"%s reset\" avec des chemins."
-#: builtin/reset.c:327
+#: builtin/reset.c:340
#, c-format
msgid "%s reset is not allowed in a bare repository"
msgstr "Le \"%s reset\" n'est pas permis dans un dépôt nu"
#: builtin/reset.c:344
+msgid "-N can only be used with --mixed"
+msgstr "-N ne peut être utilisé qu'avec --mixed"
+
+#: builtin/reset.c:361
msgid "Unstaged changes after reset:"
msgstr "Modifications non indexées après reset :"
-#: builtin/reset.c:350
+#: builtin/reset.c:367
#, c-format
msgid "Could not reset index file to revision '%s'."
msgstr "Impossible de réinitialiser le fichier d'index à la révision '%s'."
-#: builtin/reset.c:355
+#: builtin/reset.c:372
msgid "Could not write new index file."
msgstr "Impossible d'écrire le nouveau fichier d'index."
@@ -9126,7 +9073,7 @@ msgstr "arrêt de l'analyse après le premier argument qui n'est pas une option"
msgid "output in stuck long form"
msgstr "sortie en forme longue fixée"
-#: builtin/rev-parse.c:486
+#: builtin/rev-parse.c:497
msgid ""
"git rev-parse --parseopt [options] -- [<args>...]\n"
" or: git rev-parse --sq-quote [<arg>...]\n"
@@ -9198,35 +9145,35 @@ msgstr "option"
msgid "option for merge strategy"
msgstr "option pour la stratégie de fusion"
-#: builtin/revert.c:102
+#: builtin/revert.c:104
msgid "append commit name"
msgstr "ajouter le nom de validation"
-#: builtin/revert.c:103
+#: builtin/revert.c:105
msgid "allow fast-forward"
msgstr "autoriser l'avance rapide"
-#: builtin/revert.c:104
+#: builtin/revert.c:106
msgid "preserve initially empty commits"
msgstr "préserver les validations vides initialement"
-#: builtin/revert.c:105
+#: builtin/revert.c:107
msgid "allow commits with empty messages"
msgstr "autoriser les validations avec des messages vides"
-#: builtin/revert.c:106
+#: builtin/revert.c:108
msgid "keep redundant, empty commits"
msgstr "garder les validations redondantes, vides"
-#: builtin/revert.c:110
+#: builtin/revert.c:112
msgid "program error"
msgstr "erreur du programme"
-#: builtin/revert.c:195
+#: builtin/revert.c:197
msgid "revert failed"
msgstr "revert a échoué"
-#: builtin/revert.c:210
+#: builtin/revert.c:212
msgid "cherry-pick failed"
msgstr "le picorage a échoué"
@@ -9512,11 +9459,11 @@ msgstr "supprimer la référence symbolique"
msgid "shorten ref output"
msgstr "raccourcir l'affichage de la référence"
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
msgid "reason"
msgstr "raison"
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
msgid "reason of the update"
msgstr "raison de la mise à jour"
@@ -9543,32 +9490,32 @@ msgstr ""
msgid "git tag -v <tagname>..."
msgstr "git tag -v <nométiquette>..."
-#: builtin/tag.c:60
+#: builtin/tag.c:67
#, c-format
msgid "malformed object at '%s'"
msgstr "objet malformé à '%s'"
-#: builtin/tag.c:207
+#: builtin/tag.c:239
#, c-format
msgid "tag name too long: %.*s..."
msgstr "nom d'étiquette trop long : %.*s..."
-#: builtin/tag.c:212
+#: builtin/tag.c:244
#, c-format
msgid "tag '%s' not found."
msgstr "étiquette '%s' non trouvée."
-#: builtin/tag.c:227
+#: builtin/tag.c:259
#, c-format
msgid "Deleted tag '%s' (was %s)\n"
msgstr "Étiquette '%s' supprimée (elle était %s)\n"
-#: builtin/tag.c:239
+#: builtin/tag.c:271
#, c-format
msgid "could not verify the tag '%s'"
msgstr "impossible de vérifier l'étiquette '%s'"
-#: builtin/tag.c:249
+#: builtin/tag.c:281
#, c-format
msgid ""
"\n"
@@ -9579,7 +9526,7 @@ msgstr ""
"Écrire un message pour l'étiquette\n"
"Les lignes commençant par '%c' seront ignorées.\n"
-#: builtin/tag.c:253
+#: builtin/tag.c:285
#, c-format
msgid ""
"\n"
@@ -9592,258 +9539,275 @@ msgstr ""
"Les lignes commençant par '%c' seront gardées ; vous pouvez les retirer vous-"
"même si vous le souhaitez.\n"
-#: builtin/tag.c:292
+#: builtin/tag.c:324
msgid "unable to sign the tag"
msgstr "impossible de signer l'étiquette"
-#: builtin/tag.c:294
+#: builtin/tag.c:326
msgid "unable to write tag file"
msgstr "impossible d'écrire le fichier d'étiquettes"
-#: builtin/tag.c:319
+#: builtin/tag.c:351
msgid "bad object type."
msgstr "mauvais type d'objet."
-#: builtin/tag.c:332
+#: builtin/tag.c:364
msgid "tag header too big."
msgstr "en-tête d'étiquette trop gros."
-#: builtin/tag.c:368
+#: builtin/tag.c:400
msgid "no tag message?"
msgstr "pas de message pour l'étiquette ?"
-#: builtin/tag.c:374
+#: builtin/tag.c:406
#, c-format
msgid "The tag message has been left in %s\n"
msgstr "Le message pour l'étiquette a été laissé dans %s\n"
-#: builtin/tag.c:423
+#: builtin/tag.c:455
msgid "switch 'points-at' requires an object"
msgstr "le commutateur 'points-at' a besoin d'un objet"
-#: builtin/tag.c:425
+#: builtin/tag.c:457
#, c-format
msgid "malformed object name '%s'"
msgstr "nom d'objet malformé '%s'"
-#: builtin/tag.c:445
+#: builtin/tag.c:480
+#, c-format
+msgid "unsupported sort specification %s"
+msgstr "spécification de tri non supportée %s"
+
+#: builtin/tag.c:500
msgid "list tag names"
msgstr "afficher les noms des étiquettes"
-#: builtin/tag.c:447
+#: builtin/tag.c:502
msgid "print <n> lines of each tag message"
msgstr "affiche <n> lignes de chaque message d'étiquette"
-#: builtin/tag.c:449
+#: builtin/tag.c:504
msgid "delete tags"
msgstr "supprimer des étiquettes"
-#: builtin/tag.c:450
+#: builtin/tag.c:505
msgid "verify tags"
msgstr "vérifier des étiquettes"
-#: builtin/tag.c:452
+#: builtin/tag.c:507
msgid "Tag creation options"
msgstr "Options de création de l'étiquette"
-#: builtin/tag.c:454
+#: builtin/tag.c:509
msgid "annotated tag, needs a message"
msgstr "étiquette annotée, nécessite un message"
-#: builtin/tag.c:456
+#: builtin/tag.c:511
msgid "tag message"
msgstr "message pour l'étiquette"
-#: builtin/tag.c:458
+#: builtin/tag.c:513
msgid "annotated and GPG-signed tag"
msgstr "étiquette annotée et signée avec GPG"
-#: builtin/tag.c:462
+#: builtin/tag.c:517
msgid "use another key to sign the tag"
msgstr "utiliser une autre clé pour signer l'étiquette"
-#: builtin/tag.c:463
+#: builtin/tag.c:518
msgid "replace the tag if exists"
msgstr "remplacer l'étiquette si elle existe"
-#: builtin/tag.c:464
+#: builtin/tag.c:519
msgid "show tag list in columns"
msgstr "afficher la liste des étiquettes sous forme de colonnes"
-#: builtin/tag.c:466
+#: builtin/tag.c:521
+msgid "sort tags"
+msgstr "trier les étiquettes"
+
+#: builtin/tag.c:525
msgid "Tag listing options"
msgstr "Options d'affichage des étiquettes"
-#: builtin/tag.c:469
+#: builtin/tag.c:528 builtin/tag.c:534
msgid "print only tags that contain the commit"
msgstr "afficher seulement les étiquettes qui contiennent la validation"
-#: builtin/tag.c:475
+#: builtin/tag.c:540
msgid "print only tags of the object"
msgstr "afficher seulement les étiquettes de l'objet"
-#: builtin/tag.c:501
+#: builtin/tag.c:566
msgid "--column and -n are incompatible"
msgstr "--column et -n sont incompatibles"
-#: builtin/tag.c:518
+#: builtin/tag.c:578
+msgid "--sort and -n are incompatible"
+msgstr "--sort et -n sont incompatibles"
+
+#: builtin/tag.c:585
msgid "-n option is only allowed with -l."
msgstr "l'option -n est autorisée seulement avec -l."
-#: builtin/tag.c:520
+#: builtin/tag.c:587
msgid "--contains option is only allowed with -l."
msgstr "l'option --contains est autorisée seulement avec -l."
-#: builtin/tag.c:522
+#: builtin/tag.c:589
msgid "--points-at option is only allowed with -l."
msgstr "l'option --points-at est autorisée seulement avec -l."
-#: builtin/tag.c:530
+#: builtin/tag.c:597
msgid "only one -F or -m option is allowed."
msgstr "une seule option -F ou -m est autorisée."
-#: builtin/tag.c:550
+#: builtin/tag.c:617
msgid "too many params"
msgstr "trop de paramètres"
-#: builtin/tag.c:556
+#: builtin/tag.c:623
#, c-format
msgid "'%s' is not a valid tag name."
msgstr "'%s' n'est pas un nom d'étiquette valide."
-#: builtin/tag.c:561
+#: builtin/tag.c:628
#, c-format
msgid "tag '%s' already exists"
msgstr "l'étiquette '%s' existe déjà"
-#: builtin/tag.c:579
+#: builtin/tag.c:646
#, c-format
msgid "%s: cannot lock the ref"
msgstr "%s : impossible de verrouiller la référence"
-#: builtin/tag.c:581
+#: builtin/tag.c:648
#, c-format
msgid "%s: cannot update the ref"
msgstr "%s : impossible de mettre à jour la référence"
-#: builtin/tag.c:583
+#: builtin/tag.c:650
#, c-format
msgid "Updated tag '%s' (was %s)\n"
msgstr "Étiquette '%s' mise à jour (elle était %s)\n"
-#: builtin/update-index.c:402
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr "Dépaquetage des objets"
+
+#: builtin/update-index.c:399
msgid "git update-index [options] [--] [<file>...]"
msgstr "git update-index [options] [--] [<fichier>...]"
-#: builtin/update-index.c:720
+#: builtin/update-index.c:748
msgid "continue refresh even when index needs update"
msgstr "continuer de rafraîchir même si l'index a besoin d'une mise à jour"
-#: builtin/update-index.c:723
+#: builtin/update-index.c:751
msgid "refresh: ignore submodules"
msgstr "rafraîchir : ignorer les sous-modules"
-#: builtin/update-index.c:726
+#: builtin/update-index.c:754
msgid "do not ignore new files"
msgstr "ne pas ignorer les nouveaux fichiers"
-#: builtin/update-index.c:728
+#: builtin/update-index.c:756
msgid "let files replace directories and vice-versa"
msgstr "laisser les fichiers remplacer des répertoires et vice-versa"
-#: builtin/update-index.c:730
+#: builtin/update-index.c:758
msgid "notice files missing from worktree"
msgstr "aviser des fichiers manquants dans la copie de travail"
-#: builtin/update-index.c:732
+#: builtin/update-index.c:760
msgid "refresh even if index contains unmerged entries"
msgstr "rafraîchir même si l'index contient des éléments non fusionnés"
-#: builtin/update-index.c:735
+#: builtin/update-index.c:763
msgid "refresh stat information"
msgstr "rafraîchir l'information de stat"
-#: builtin/update-index.c:739
+#: builtin/update-index.c:767
msgid "like --refresh, but ignore assume-unchanged setting"
msgstr "comme --refresh, mais en ignorant l'option assume-unchanged"
-#: builtin/update-index.c:743
-msgid "<mode> <object> <path>"
-msgstr "<mode> <objet> <chemin>"
+#: builtin/update-index.c:771
+msgid "<mode>,<object>,<path>"
+msgstr "<mode>, <objet>, <chemin>"
-#: builtin/update-index.c:744
+#: builtin/update-index.c:772
msgid "add the specified entry to the index"
msgstr "ajouter l'élément spécifié dans l'index"
-#: builtin/update-index.c:748
+#: builtin/update-index.c:776
msgid "(+/-)x"
msgstr "(+/-)x"
-#: builtin/update-index.c:749
+#: builtin/update-index.c:777
msgid "override the executable bit of the listed files"
msgstr "outrepasser le bit exécutable pour les fichiers listés"
-#: builtin/update-index.c:753
+#: builtin/update-index.c:781
msgid "mark files as \"not changing\""
msgstr "marquer les fichiers comme \"non changeants\""
-#: builtin/update-index.c:756
+#: builtin/update-index.c:784
msgid "clear assumed-unchanged bit"
msgstr "mettre à zéro le bit supposé-non-modifié"
-#: builtin/update-index.c:759
+#: builtin/update-index.c:787
msgid "mark files as \"index-only\""
msgstr "marquer les fichiers comme \"index seulement\""
-#: builtin/update-index.c:762
+#: builtin/update-index.c:790
msgid "clear skip-worktree bit"
msgstr "mettre à zéro le bit sauter-la-copie-de travail"
-#: builtin/update-index.c:765
+#: builtin/update-index.c:793
msgid "add to index only; do not add content to object database"
msgstr ""
"ajouter seulement à l'index ; ne pas ajouter le contenu dans la base de "
"données des objets"
-#: builtin/update-index.c:767
+#: builtin/update-index.c:795
msgid "remove named paths even if present in worktree"
msgstr ""
"supprimer les chemins nommés même s'ils sont présents dans la copie de "
"travail"
-#: builtin/update-index.c:769
+#: builtin/update-index.c:797
msgid "with --stdin: input lines are terminated by null bytes"
msgstr "avec --stdin : les lignes en entrée sont terminées par des octets nuls"
-#: builtin/update-index.c:771
+#: builtin/update-index.c:799
msgid "read list of paths to be updated from standard input"
msgstr "lire la liste des chemins à mettre à jour depuis l'entrée standard"
-#: builtin/update-index.c:775
+#: builtin/update-index.c:803
msgid "add entries from standard input to the index"
msgstr "ajouter les éléments depuis l'entrée standard à l'index"
-#: builtin/update-index.c:779
+#: builtin/update-index.c:807
msgid "repopulate stages #2 and #3 for the listed paths"
msgstr "repeupler les étapes n°2 et n°3 pour les chemins listés"
-#: builtin/update-index.c:783
+#: builtin/update-index.c:811
msgid "only update entries that differ from HEAD"
msgstr "mettre à jour seulement les éléments qui diffèrent de HEAD"
-#: builtin/update-index.c:787
+#: builtin/update-index.c:815
msgid "ignore files missing from worktree"
msgstr "ignorer les fichiers manquants dans la copie de travail"
-#: builtin/update-index.c:790
+#: builtin/update-index.c:818
msgid "report actions to standard output"
msgstr "afficher les actions sur la sortie standard"
-#: builtin/update-index.c:792
+#: builtin/update-index.c:820
msgid "(for porcelains) forget saved unresolved conflicts"
msgstr "(pour porcelaines) oublier les conflits sauvés et non résolus"
-#: builtin/update-index.c:796
+#: builtin/update-index.c:824
msgid "write index in this format"
msgstr "écrire l'index dans ce format"
@@ -9861,19 +9825,19 @@ msgstr ""
msgid "git update-ref [options] --stdin [-z]"
msgstr "git update-ref [options] --stdin [-z]"
-#: builtin/update-ref.c:255
+#: builtin/update-ref.c:256
msgid "delete the reference"
msgstr "supprimer la référence"
-#: builtin/update-ref.c:257
+#: builtin/update-ref.c:258
msgid "update <refname> not the one it points to"
msgstr "mettre à jour <nomréférence> et non la référence pointée par lui"
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:259
msgid "stdin has NUL-terminated arguments"
msgstr "l'entrée standard a des arguments qui se terminent par NUL"
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:260
msgid "read updates from stdin"
msgstr "lire les mises à jour depuis l'entrée standard"
@@ -9931,23 +9895,23 @@ msgstr ""
"quelques concepts. Voir 'git help <command>' ou 'git help <concept>'\n"
"pour en lire plus à propos d'une commande spécifique ou d'un concept."
-#: parse-options.h:146
-msgid "expiry date"
-msgstr "date d'expiration"
+#: parse-options.h:143
+msgid "expiry-date"
+msgstr "date-d'expiration"
-#: parse-options.h:161
+#: parse-options.h:158
msgid "no-op (backward compatibility)"
msgstr "sans action (rétrocompatibilité)"
-#: parse-options.h:235
+#: parse-options.h:232
msgid "be more verbose"
msgstr "être plus verbeux"
-#: parse-options.h:237
+#: parse-options.h:234
msgid "be more quiet"
msgstr "être plus silencieux"
-#: parse-options.h:243
+#: parse-options.h:240
msgid "use <n> digits to display SHA-1s"
msgstr "utiliser <n> chiffres pour afficher les SHA-1s"
@@ -10039,11 +10003,11 @@ msgid "Create, list, delete or verify a tag object signed with GPG"
msgstr ""
"Créer, lister, supprimer ou vérifier un objet d'étiquette signé avec GPG"
-#: git-am.sh:50
+#: git-am.sh:52
msgid "You need to set your committer info first"
msgstr "Vous devez d'abord définir vos informations de validateur"
-#: git-am.sh:95
+#: git-am.sh:97
msgid ""
"You seem to have moved HEAD since the last 'am' failure.\n"
"Not rewinding to ORIG_HEAD"
@@ -10051,7 +10015,7 @@ msgstr ""
"Vous semblez avoir déplacé la HEAD depuis le dernier échec de 'am'.\n"
"Pas de retour à ORIG_HEAD"
-#: git-am.sh:105
+#: git-am.sh:107
#, sh-format
msgid ""
"When you have resolved this problem, run \"$cmdline --continue\".\n"
@@ -10063,22 +10027,22 @@ msgstr ""
"Pour restaurer la branche d'origine et stopper le patchage, lancez "
"\"$cmdline --abort\"."
-#: git-am.sh:121
+#: git-am.sh:123
msgid "Cannot fall back to three-way merge."
msgstr "Impossible de retourner à une fusion à 3 points."
-#: git-am.sh:137
+#: git-am.sh:139
msgid "Repository lacks necessary blobs to fall back on 3-way merge."
msgstr ""
"Le dépôt n'a pas les blobs nécessaires pour un retour à une fusion à 3 "
"points."
-#: git-am.sh:139
+#: git-am.sh:141
msgid "Using index info to reconstruct a base tree..."
msgstr ""
"Utilisation de l'information de l'index pour reconstruire un arbre de base..."
-#: git-am.sh:154
+#: git-am.sh:156
msgid ""
"Did you hand edit your patch?\n"
"It does not apply to blobs recorded in its index."
@@ -10086,28 +10050,28 @@ msgstr ""
"Avez-vous édité le patch à la main ?\n"
"Il ne s'applique pas aux blobs enregistrés dans son index."
-#: git-am.sh:163
+#: git-am.sh:165
msgid "Falling back to patching base and 3-way merge..."
msgstr "Retour à un patch de la base et fusion à 3 points..."
-#: git-am.sh:179
+#: git-am.sh:181
msgid "Failed to merge in the changes."
msgstr "Échec d'intégration des modifications."
-#: git-am.sh:274
+#: git-am.sh:276
msgid "Only one StGIT patch series can be applied at once"
msgstr "Seulement une série de patchs StGIT peut être appliquée à la fois"
-#: git-am.sh:361
+#: git-am.sh:363
#, sh-format
msgid "Patch format $patch_format is not supported."
msgstr "Le format de patch $patch_format n'est pas supporté."
-#: git-am.sh:363
+#: git-am.sh:365
msgid "Patch format detection failed."
msgstr "Échec de détection du format du patch."
-#: git-am.sh:389
+#: git-am.sh:392
msgid ""
"The -b/--binary option has been a no-op for long time, and\n"
"it will be removed. Please do not use it anymore."
@@ -10115,17 +10079,17 @@ msgstr ""
"L'option -b/--binary ne fait plus rien depuis longtemps,\n"
"et elle sera supprimée. Veuillez ne plus l'utiliser."
-#: git-am.sh:479
+#: git-am.sh:486
#, sh-format
msgid "previous rebase directory $dotest still exists but mbox given."
msgstr ""
"le répertoire précédent de rebasage $dotest existe toujours mais mbox donnée."
-#: git-am.sh:484
+#: git-am.sh:491
msgid "Please make up your mind. --skip or --abort?"
msgstr "Décidez-vous. --skip ou --abort ?"
-#: git-am.sh:520
+#: git-am.sh:527
#, sh-format
msgid ""
"Stray $dotest directory found.\n"
@@ -10134,18 +10098,18 @@ msgstr ""
"Répertoire abandonné $dotest trouvé.\n"
"Utilisez \"git am --abort\" pour le supprimer."
-#: git-am.sh:528
+#: git-am.sh:535
msgid "Resolve operation not in progress, we are not resuming."
msgstr ""
"Pas de résolution de l'opération en cours, nous ne sommes pas dans une "
"reprise."
-#: git-am.sh:594
+#: git-am.sh:601
#, sh-format
msgid "Dirty index: cannot apply patches (dirty: $files)"
msgstr "Index sale : impossible d'appliquer des patchs (sales : $files)"
-#: git-am.sh:698
+#: git-am.sh:705
#, sh-format
msgid ""
"Patch is empty. Was it split wrong?\n"
@@ -10157,32 +10121,32 @@ msgstr ""
"Pour restaurer la branche d'origine et stopper le patchage, lancez "
"\"$cmdline --abort\"."
-#: git-am.sh:725
+#: git-am.sh:732
msgid "Patch does not have a valid e-mail address."
msgstr "Le patch n'a pas d'adresse e-mail valide."
-#: git-am.sh:772
+#: git-am.sh:779
msgid "cannot be interactive without stdin connected to a terminal."
msgstr ""
"impossible d'être interactif sans entrée standard connectée à un terminal."
-#: git-am.sh:776
+#: git-am.sh:783
msgid "Commit Body is:"
msgstr "Le corps de la validation est :"
#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
#. in your translation. The program will only accept English
#. input at this point.
-#: git-am.sh:783
+#: git-am.sh:790
msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
msgstr "Appliquer ? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
-#: git-am.sh:819
+#: git-am.sh:826
#, sh-format
msgid "Applying: $FIRSTLINE"
msgstr "Application : $FIRSTLINE"
-#: git-am.sh:840
+#: git-am.sh:847
msgid ""
"No changes - did you forget to use 'git add'?\n"
"If there is nothing left to stage, chances are that something else\n"
@@ -10193,7 +10157,7 @@ msgstr ""
"introduit les mêmes changements ; vous pourriez avoir envie de sauter ce "
"patch."
-#: git-am.sh:848
+#: git-am.sh:855
msgid ""
"You still have unmerged paths in your index\n"
"did you forget to use 'git add'?"
@@ -10201,16 +10165,16 @@ msgstr ""
"Vous avez toujours des chemins non fusionnés dans votre index\n"
"auriez-vous oublié de faire 'git add' ?"
-#: git-am.sh:864
+#: git-am.sh:871
msgid "No changes -- Patch already applied."
msgstr "Pas de changement -- Patch déjà appliqué."
-#: git-am.sh:874
+#: git-am.sh:881
#, sh-format
msgid "Patch failed at $msgnum $FIRSTLINE"
msgstr "Le patch a échoué à $msgnum $FIRSTLINE"
-#: git-am.sh:877
+#: git-am.sh:884
#, sh-format
msgid ""
"The copy of the patch that failed is found in:\n"
@@ -10219,7 +10183,7 @@ msgstr ""
"La copie du patch qui a échoué se trouve dans :\n"
" $dotest/patch"
-#: git-am.sh:895
+#: git-am.sh:902
msgid "applying to an empty history"
msgstr "application à un historique vide"
@@ -10287,8 +10251,6 @@ msgstr "Mauvaise révision en entrée : $rev"
msgid "'git bisect bad' can take only one argument."
msgstr "'git bisect bad' n'accepte qu'un seul argument."
-#. have bad but not good. we could bisect although
-#. this is less optimum.
#: git-bisect.sh:273
msgid "Warning: bisecting only with a bad commit."
msgstr "Attention : bissection avec seulement une mauvaise validation."
@@ -10395,17 +10357,13 @@ msgstr ""
msgid "Pull is not possible because you have unmerged files."
msgstr "Le pull n'est pas possible car vous avez des fichiers non fusionnés."
-#: git-pull.sh:223
+#: git-pull.sh:247
msgid "updating an unborn branch with changes added to the index"
msgstr ""
"mise à jour d'une branche non encore créée avec les changements ajoutés dans "
"l'index"
-#. The fetch involved updating the current branch.
-#. The working tree and the index file is still based on the
-#. $orig_head commit, but we are merging into $curr_head.
-#. First update the working tree to match $curr_head.
-#: git-pull.sh:247
+#: git-pull.sh:271
#, sh-format
msgid ""
"Warning: fetch updated the current branch head.\n"
@@ -10416,15 +10374,15 @@ msgstr ""
"Attention : mise à jour en avance rapide de votre copie de travail\n"
"Attention : depuis la validation $orig_head."
-#: git-pull.sh:272
+#: git-pull.sh:296
msgid "Cannot merge multiple branches into empty head"
msgstr "Impossible de fusionner de multiples branches sur une tête vide"
-#: git-pull.sh:276
+#: git-pull.sh:300
msgid "Cannot rebase onto multiple branches"
msgstr "Impossible de rebaser sur de multiples branches"
-#: git-rebase.sh:55
+#: git-rebase.sh:57
msgid ""
"When you have resolved this problem, run \"git rebase --continue\".\n"
"If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
@@ -10436,16 +10394,16 @@ msgstr ""
"Pour extraire la branche d'origine et stopper le rebasage, lancez \"git "
"rebase --abort\"."
-#: git-rebase.sh:158
+#: git-rebase.sh:164
msgid "Applied autostash."
msgstr "Autoremisage appliqué."
-#: git-rebase.sh:161
+#: git-rebase.sh:167
#, sh-format
msgid "Cannot store $stash_sha1"
msgstr "Impossible de stocker $stash_sha1"
-#: git-rebase.sh:162
+#: git-rebase.sh:168
msgid ""
"Applying autostash resulted in conflicts.\n"
"Your changes are safe in the stash.\n"
@@ -10455,33 +10413,33 @@ msgstr ""
"Vos modifications sont à l'abri dans la remise.\n"
"Vous pouvez lancer \"git stash pop\" ou \"git stash drop\" à tout moment.\n"
-#: git-rebase.sh:201
+#: git-rebase.sh:207
msgid "The pre-rebase hook refused to rebase."
msgstr "Le crochet pre-rebase a refusé de rebaser."
-#: git-rebase.sh:206
+#: git-rebase.sh:212
msgid "It looks like git-am is in progress. Cannot rebase."
msgstr "Il semble que git-am soit en cours. Impossible de rebaser."
-#: git-rebase.sh:346
+#: git-rebase.sh:350
msgid "The --exec option must be used with the --interactive option"
msgstr "L'option --exec doit être utilisée avec l'option --interactive"
-#: git-rebase.sh:351
+#: git-rebase.sh:355
msgid "No rebase in progress?"
msgstr "Pas de rebasage en cours ?"
-#: git-rebase.sh:362
+#: git-rebase.sh:366
msgid "The --edit-todo action can only be used during interactive rebase."
msgstr ""
"L'action --edit-todo peut seulement être utilisée lors d'un rebasage "
"interactif."
-#: git-rebase.sh:369
+#: git-rebase.sh:373
msgid "Cannot read HEAD"
msgstr "Impossible de lire HEAD"
-#: git-rebase.sh:372
+#: git-rebase.sh:376
msgid ""
"You must edit all merge conflicts and then\n"
"mark them as resolved using git add"
@@ -10489,12 +10447,12 @@ msgstr ""
"Vous devez éditer tous les conflits de fusion et\n"
"les marquer comme résolus avec git add"
-#: git-rebase.sh:390
+#: git-rebase.sh:394
#, sh-format
msgid "Could not move back to $head_name"
msgstr "Impossible de revenir à $head_name"
-#: git-rebase.sh:409
+#: git-rebase.sh:413
#, sh-format
msgid ""
"It seems that there is already a $state_dir_base directory, and\n"
@@ -10516,66 +10474,65 @@ msgstr ""
"chose\n"
"d'important ici."
-#: git-rebase.sh:456
+#: git-rebase.sh:464
#, sh-format
msgid "invalid upstream $upstream_name"
msgstr "invalide $upstream_name en amont"
-#: git-rebase.sh:480
+#: git-rebase.sh:488
#, sh-format
msgid "$onto_name: there are more than one merge bases"
msgstr "$onto_name : il y a plus d'une base de fusion"
-#: git-rebase.sh:483 git-rebase.sh:487
+#: git-rebase.sh:491 git-rebase.sh:495
#, sh-format
msgid "$onto_name: there is no merge base"
msgstr "$onto_name : il n'y a pas de base de fusion"
-#: git-rebase.sh:492
+#: git-rebase.sh:500
#, sh-format
msgid "Does not point to a valid commit: $onto_name"
msgstr "Ne pointe pas sur une validation valide : $onto_name"
-#: git-rebase.sh:515
+#: git-rebase.sh:523
#, sh-format
msgid "fatal: no such branch: $branch_name"
msgstr "fatal : pas de branche : $branch_name"
-#: git-rebase.sh:548
+#: git-rebase.sh:556
msgid "Cannot autostash"
msgstr "Autoremisage impossible"
-#: git-rebase.sh:553
+#: git-rebase.sh:561
#, sh-format
msgid "Created autostash: $stash_abbrev"
msgstr "Autoremisage créé : $stash_abbrev"
-#: git-rebase.sh:557
+#: git-rebase.sh:565
msgid "Please commit or stash them."
msgstr "Veuillez les valider ou les remiser."
-#: git-rebase.sh:577
+#: git-rebase.sh:585
#, sh-format
msgid "Current branch $branch_name is up to date."
msgstr "La branche courante $branch_name est à jour."
-#: git-rebase.sh:581
+#: git-rebase.sh:589
#, sh-format
msgid "Current branch $branch_name is up to date, rebase forced."
msgstr "La branche courante $branch_name est à jour, rebasage forcé."
-#: git-rebase.sh:592
+#: git-rebase.sh:600
#, sh-format
msgid "Changes from $mb to $onto:"
msgstr "Changements de $mb sur $onto :"
-#. Detach HEAD and reset the tree
-#: git-rebase.sh:601
+#: git-rebase.sh:609
msgid "First, rewinding head to replay your work on top of it..."
msgstr ""
"Premièrement, rembobinons head pour rejouer votre travail par-dessus..."
-#: git-rebase.sh:611
+#: git-rebase.sh:619
#, sh-format
msgid "Fast-forwarded $branch_name to $onto_name."
msgstr "$branch_name mise à jour en avance rapide sur $onto_name."
@@ -10686,7 +10643,7 @@ msgstr "Conflits dans l'index. Essayez sans --index."
#: git-stash.sh:457
msgid "Could not save index tree"
-msgstr "Impossible de sauver l'arbre d'index"
+msgstr "Impossible de sauvegarder l'arbre d'index"
#: git-stash.sh:491
msgid "Cannot unstage modified files"
@@ -10696,21 +10653,21 @@ msgstr "Impossible de désindexer les fichiers modifiés"
msgid "Index was not unstashed."
msgstr "L'index n'a pas été sorti de remise."
-#: git-stash.sh:523
+#: git-stash.sh:529
#, sh-format
msgid "Dropped ${REV} ($s)"
msgstr "${REV} supprimé ($s)"
-#: git-stash.sh:524
+#: git-stash.sh:530
#, sh-format
msgid "${REV}: Could not drop stash entry"
msgstr "${REV}: Impossible de supprimer l'élément de stash"
-#: git-stash.sh:531
+#: git-stash.sh:537
msgid "No branch name specified"
msgstr "Aucune branche spécifiée"
-#: git-stash.sh:603
+#: git-stash.sh:609
msgid "(To restore them type \"git stash apply\")"
msgstr "(Pour les restaurer tapez \"git stash apply\")"
@@ -10726,35 +10683,35 @@ msgstr ""
"Pas de mise en correspondance du sous-module trouvé dans .gitmodules pour le "
"chemin '$sm_path'"
-#: git-submodule.sh:281
+#: git-submodule.sh:287
#, sh-format
msgid "Clone of '$url' into submodule path '$sm_path' failed"
msgstr "Le clonage de '$url' dans le chemin de sous-module '$sm_path' a échoué"
-#: git-submodule.sh:293
+#: git-submodule.sh:299
#, sh-format
msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
msgstr ""
"Le répertoire Git '$a' fait partie du chemin de sous-module '$b' ou vice-"
"versa"
-#: git-submodule.sh:403
+#: git-submodule.sh:409
msgid "Relative path can only be used from the toplevel of the working tree"
msgstr ""
"Un chemin relatif ne peut être utilisé que depuis la racine de la copie de "
"travail"
-#: git-submodule.sh:413
+#: git-submodule.sh:419
#, sh-format
msgid "repo URL: '$repo' must be absolute or begin with ./|../"
msgstr "L'URL de dépôt '$repo' doit être absolu ou commencer par ./|../"
-#: git-submodule.sh:430
+#: git-submodule.sh:436
#, sh-format
msgid "'$sm_path' already exists in the index"
msgstr "'$sm_path' existe déjà dans l'index"
-#: git-submodule.sh:434
+#: git-submodule.sh:440
#, sh-format
msgid ""
"The following path is ignored by one of your .gitignore files:\n"
@@ -10765,24 +10722,24 @@ msgstr ""
"$sm_path\n"
"Utilisez -f si vous voulez vraiment l'ajouter."
-#: git-submodule.sh:452
+#: git-submodule.sh:458
#, sh-format
msgid "Adding existing repo at '$sm_path' to the index"
msgstr "Ajout du dépôt existant à '$sm_path' dans l'index"
-#: git-submodule.sh:454
+#: git-submodule.sh:460
#, sh-format
msgid "'$sm_path' already exists and is not a valid git repo"
msgstr "'$sm_path' existe déjà et n'est pas un dépôt git valide"
-#: git-submodule.sh:462
+#: git-submodule.sh:468
#, sh-format
msgid "A git directory for '$sm_name' is found locally with remote(s):"
msgstr ""
"Un répertoire git pour '$sm_name' est trouvé en local avec le(s) serveur(s) "
"distant(s) :"
-#: git-submodule.sh:464
+#: git-submodule.sh:470
#, sh-format
msgid ""
"If you want to reuse this local git directory instead of cloning again from"
@@ -10790,7 +10747,7 @@ msgstr ""
"Si vous voulez réutiliser ce répertoire git local au lieu de cloner à "
"nouveau depuis"
-#: git-submodule.sh:466
+#: git-submodule.sh:472
#, sh-format
msgid ""
"use the '--force' option. If the local git directory is not the correct repo"
@@ -10798,7 +10755,7 @@ msgstr ""
"utilisez l'option '--force'. Si le répertoire local git n'est pas le dépôt "
"correct"
-#: git-submodule.sh:467
+#: git-submodule.sh:473
#, sh-format
msgid ""
"or you are unsure what this means choose another name with the '--name' "
@@ -10807,74 +10764,74 @@ msgstr ""
"ou vous ne savez pas ce que cela signifie de choisir un autre nom avec "
"l'option '--name'."
-#: git-submodule.sh:469
+#: git-submodule.sh:475
#, sh-format
msgid "Reactivating local git directory for submodule '$sm_name'."
msgstr "Réactivation du répertoire git local pour le sous-module '$sm_name'."
-#: git-submodule.sh:481
+#: git-submodule.sh:487
#, sh-format
msgid "Unable to checkout submodule '$sm_path'"
msgstr "Impossible d'extraire le sous-module '$sm_path'"
-#: git-submodule.sh:486
+#: git-submodule.sh:492
#, sh-format
msgid "Failed to add submodule '$sm_path'"
msgstr "Échec d'ajout du sous-module '$sm_path'"
-#: git-submodule.sh:495
+#: git-submodule.sh:501
#, sh-format
msgid "Failed to register submodule '$sm_path'"
msgstr "Échec d'enregistrement du sous-module '$sm_path'"
-#: git-submodule.sh:539
+#: git-submodule.sh:545
#, sh-format
msgid "Entering '$prefix$displaypath'"
msgstr "Entrée dans '$prefix$displaypath'"
-#: git-submodule.sh:559
+#: git-submodule.sh:565
#, sh-format
msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
msgstr ""
"Arrêt sur '$prefix$displaypath' ; le script a retourné un statut non nul."
-#: git-submodule.sh:605
+#: git-submodule.sh:611
#, sh-format
msgid "No url found for submodule path '$displaypath' in .gitmodules"
msgstr ""
-"URL non trouvé pour le chemin de sous-module '$displaypath' dans .gitmodules"
+"URL non trouvée pour le chemin de sous-module '$displaypath' dans .gitmodules"
-#: git-submodule.sh:614
+#: git-submodule.sh:620
#, sh-format
msgid "Failed to register url for submodule path '$displaypath'"
msgstr ""
"Échec d'enregistrement de l'URL pour le chemin de sous-module '$displaypath'"
-#: git-submodule.sh:616
+#: git-submodule.sh:622
#, sh-format
msgid "Submodule '$name' ($url) registered for path '$displaypath'"
msgstr "Sous-module '$name' ($url) enregistré pour le chemin '$displaypath'"
-#: git-submodule.sh:633
+#: git-submodule.sh:639
#, sh-format
msgid "Failed to register update mode for submodule path '$displaypath'"
msgstr ""
"Échec d'enregistrement du mode de mise à jour pour le chemin de sous-module "
"'$displaypath'"
-#: git-submodule.sh:671
+#: git-submodule.sh:677
#, sh-format
msgid "Use '.' if you really want to deinitialize all submodules"
msgstr ""
"Utilisez '.' si vous voulez vraiment réinitialiser tous les sous-modules"
-#: git-submodule.sh:688
+#: git-submodule.sh:694
#, sh-format
msgid "Submodule work tree '$displaypath' contains a .git directory"
msgstr ""
"La copie de travail du sous-module '$displaypath' contient un répertoire .git"
-#: git-submodule.sh:689
+#: git-submodule.sh:695
#, sh-format
msgid ""
"(use 'rm -rf' if you really want to remove it including all of its history)"
@@ -10882,7 +10839,7 @@ msgstr ""
"(utilisez 'rm -rf' si vous voulez vraiment le supprimer en incluant tout son "
"historique)"
-#: git-submodule.sh:695
+#: git-submodule.sh:701
#, sh-format
msgid ""
"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -10891,30 +10848,30 @@ msgstr ""
"La copie de travail du sous-module '$displaypath' contient des modifications "
"locales ; utilisez '-f' pour les annuler"
-#: git-submodule.sh:698
+#: git-submodule.sh:704
#, sh-format
msgid "Cleared directory '$displaypath'"
msgstr "Répertoire '$displaypath' nettoyé"
-#: git-submodule.sh:699
+#: git-submodule.sh:705
#, sh-format
msgid "Could not remove submodule work tree '$displaypath'"
msgstr ""
"Impossible de supprimer la copie de travail du sous-module '$displaypath'"
-#: git-submodule.sh:702
+#: git-submodule.sh:708
#, sh-format
msgid "Could not create empty submodule directory '$displaypath'"
msgstr "Impossible de créer le répertoire vide du sous-module '$displaypath'"
-#: git-submodule.sh:711
+#: git-submodule.sh:717
#, sh-format
msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
msgstr ""
"Le sous-module '$name' ($url) n'est pas enregistré pour le chemin "
"'$displaypath'"
-#: git-submodule.sh:834
+#: git-submodule.sh:833
#, sh-format
msgid ""
"Submodule path '$displaypath' not initialized\n"
@@ -10923,46 +10880,57 @@ msgstr ""
"Chemin de sous-module '$displaypath' non initialisé\n"
"Peut-être souhaitez-vous utiliser 'update --init' ?"
-#: git-submodule.sh:847
+#: git-submodule.sh:846
#, sh-format
msgid "Unable to find current revision in submodule path '$displaypath'"
msgstr ""
"Impossible de trouver la révision courante dans le chemin de sous-module "
"'$displaypath'"
-#: git-submodule.sh:856
+#: git-submodule.sh:855
#, sh-format
msgid "Unable to fetch in submodule path '$sm_path'"
msgstr "Impossible de rapatrier dans le chemin de sous-module '$sm_path'"
-#: git-submodule.sh:880
+#: git-submodule.sh:879
#, sh-format
msgid "Unable to fetch in submodule path '$displaypath'"
msgstr "Impossible de rapatrier dans le chemin de sous-module '$displaypath'"
+#: git-submodule.sh:893
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr ""
+"Impossible d'extraire '$sha1' dans le chemin de sous-module '$displaypath'"
+
#: git-submodule.sh:894
#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "Chemin de sous-module '$displaypath' : '$sha1' extrait"
+
+#: git-submodule.sh:898
+#, sh-format
msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
msgstr ""
"Impossible de rebaser '$sha1' dans le chemin de sous-module '$displaypath'"
-#: git-submodule.sh:895
+#: git-submodule.sh:899
#, sh-format
msgid "Submodule path '$displaypath': rebased into '$sha1'"
msgstr "Chemin de sous-module '$displaypath' : rebasé dans '$sha1'"
-#: git-submodule.sh:900
+#: git-submodule.sh:904
#, sh-format
msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
msgstr ""
"Impossible de fusionner '$sha1' dans le chemin de sous-module '$displaypath'"
-#: git-submodule.sh:901
+#: git-submodule.sh:905
#, sh-format
msgid "Submodule path '$displaypath': merged in '$sha1'"
msgstr "Chemin de sous-module '$displaypath' : fusionné dans '$sha1'"
-#: git-submodule.sh:906
+#: git-submodule.sh:910
#, sh-format
msgid ""
"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
@@ -10970,70 +10938,174 @@ msgstr ""
"L'exécution de '$command $sha1' a échoué dans le chemin de sous-module "
"'$prefix$sm_path'"
-#: git-submodule.sh:907
+#: git-submodule.sh:911
#, sh-format
msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
msgstr "Chemin de sous-module '$prefix$sm_path' : '$command $sha1'"
-#: git-submodule.sh:912
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
-msgstr ""
-"Impossible d'extraire '$sha1' dans le chemin de sous-module '$displaypath'"
-
-#: git-submodule.sh:913
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "Chemin de sous-module '$displaypath' : '$sha1' extrait"
-
-#: git-submodule.sh:940
+#: git-submodule.sh:941
#, sh-format
msgid "Failed to recurse into submodule path '$displaypath'"
msgstr "Échec de parcours dans le chemin du sous-module '$displaypath'"
-#: git-submodule.sh:1048
+#: git-submodule.sh:1049
msgid "The --cached option cannot be used with the --files option"
msgstr "L'option --cached ne peut pas être utilisée avec l'option --files"
-#. unexpected type
-#: git-submodule.sh:1096
+#: git-submodule.sh:1097
#, sh-format
msgid "unexpected mode $mod_dst"
msgstr "mode $mod_dst inattendu"
-#: git-submodule.sh:1116
+#: git-submodule.sh:1117
#, sh-format
msgid " Warn: $display_name doesn't contain commit $sha1_src"
msgstr " Attention : $display_name ne contient pas la validation $sha1_src"
-#: git-submodule.sh:1119
+#: git-submodule.sh:1120
#, sh-format
msgid " Warn: $display_name doesn't contain commit $sha1_dst"
msgstr " Attention : $display_name ne contient pas la validation $sha1_dst"
-#: git-submodule.sh:1122
+#: git-submodule.sh:1123
#, sh-format
msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
msgstr ""
" Attention : $display_name ne contient pas les validations $sha1_src et "
"$sha1_dst"
-#: git-submodule.sh:1147
+#: git-submodule.sh:1148
msgid "blob"
msgstr "blob"
-#: git-submodule.sh:1261
+#: git-submodule.sh:1262
#, sh-format
msgid "Failed to recurse into submodule path '$sm_path'"
msgstr "Échec de parcours dans le chemin du sous-module '$sm_path'"
-#: git-submodule.sh:1325
+#: git-submodule.sh:1326
#, sh-format
msgid "Synchronizing submodule url for '$displaypath'"
msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
-#~ msgid "copied: %s -> %s"
+#~ msgid "Tracking not set up: name too long: %s"
+#~ msgstr "Suivi de branche non paramétré : le nom est trop long : %s"
+
+#~ msgid "could not find .gitmodules in index"
+#~ msgstr "impossible de trouver .gitmodules dans l'index"
+
+#~ msgid "reading updated .gitmodules failed"
+#~ msgstr "échec de la lecture du .gitmodules mis à jour"
+
+#~ msgid "unable to stat updated .gitmodules"
+#~ msgstr "échec de stat du .gitmodules mis à jour"
+
+#~ msgid "unable to remove .gitmodules from index"
+#~ msgstr "suppression du .gitmodules dans l'index impossible"
+
+#~ msgid "adding updated .gitmodules failed"
+#~ msgstr "échec de l'ajout du .gitmodules mis à jour"
+
+#~ msgid "bug"
+#~ msgstr "bogue"
+
+#~ msgid "ahead "
+#~ msgstr "devant "
+
+#~ msgid ", behind "
+#~ msgstr ", derrière "
+
+#~ 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 ""
+#~ "Le comportement de 'git add %s (ou %s)' sans argument de chemin depuis "
+#~ "un\n"
+#~ "sous-répertoire du projet va changer dans Git 2.0 et ne doit plus être "
+#~ "utilisé.\n"
+#~ "Pour ajouter le contenu de toute l'arborescence, lancez :\n"
+#~ "\n"
+#~ " git add %s :/\n"
+#~ " (ou git add %s :/)\n"
+#~ "\n"
+#~ "Pour restreindre la commande au répertoire courant, lancez :\n"
+#~ "\n"
+#~ " git add %s .\n"
+#~ " (ou git add %s .)\n"
+#~ "\n"
+#~ "Avec la version actuelle de Git, la commande est restreinte au répertoire "
+#~ "courant.\n"
+
+#~ msgid ""
+#~ "You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
+#~ "whose behaviour will change in Git 2.0 with respect to paths you "
+#~ "removed.\n"
+#~ "Paths like '%s' that are\n"
+#~ "removed from your working tree are ignored with this version of Git.\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <pathspec>', which is the current default,\n"
+#~ " ignores paths you removed from your working tree.\n"
+#~ "\n"
+#~ "* 'git add --all <pathspec>' will let you also record the removals.\n"
+#~ "\n"
+#~ "Run 'git status' to check the paths you removed from your working tree.\n"
#~ msgstr ""
+#~ "Vous avez lancé 'git add' sans '-A (--all)' ni '--ignore-removal',\n"
+#~ "dont le comportement va changer dans Git 2.0 avec le respect des chemins "
+#~ "que vous supprimez.\n"
+#~ "Les chemins tels que '%s' qui ont été\n"
+#~ "retirés de votre copie de travail sont ignorés avec cette version de "
+#~ "Git.\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <chemin>', qui est l'option par défaut "
+#~ "actuelle,\n"
+#~ " ignore les chemins que vous avez supprimés de votre copie de travail.\n"
+#~ "\n"
+#~ "* 'git add --all <chemin>' permet d'enregistrer aussi les suppressions.\n"
+#~ "\n"
+#~ "Lancez 'git status' pour vérifier les chemins que vous avez supprimés de "
+#~ "votre copie de travail.\n"
+
+#~ msgid "key id"
+#~ msgstr "identifiant de clé"
+
+#~ 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 ""
+#~ "Compression automatique du dépôt pour une performance optimum. Vous "
+#~ "pouvez aussi\n"
+#~ "lancer \"git gc\" manuellement. Voir \"git help gc\" pour plus "
+#~ "d'information.\n"
+
+#~ msgid ""
+#~ "Updates were rejected because a pushed branch tip is behind its remote\n"
+#~ "counterpart. If you did not intend to push that branch, you may want to\n"
+#~ "specify branches to push or set the 'push.default' configuration "
+#~ "variable\n"
+#~ "to 'simple', 'current' or 'upstream' to push only the current branch."
+#~ msgstr ""
+#~ "Les mises à jour ont été rejetées car la pointe de la branche poussée est "
+#~ "derrière\n"
+#~ "son homologue distant. Si vous ne vouliez pas pousser cette branche, vous "
+#~ "pourriez\n"
+#~ "vouloir spécifier les branches à pousser ou définir la variable de "
+#~ "configuration\n"
+#~ "'push.default' à 'simple', 'current' ou 'upstream' pour pousser seulement "
+#~ "la branche courante."
#~ msgid "deleted: %s"
#~ msgstr "supprimé : %s"
@@ -11050,9 +11122,6 @@ msgstr "Synchronisation de l'URL sous-module pour '$displaypath'"
#~ msgid "input paths are terminated by a null character"
#~ msgstr "les chemins en entrée sont terminés par le caractère nul"
-#~ msgid "done\n"
-#~ msgstr "fait\n"
-
#~ msgid ""
#~ "The following untracked files would NOT be saved but need to be removed "
#~ "by stash save:"
diff --git a/po/git.pot b/po/git.pot
index 33cc31d51b..1407f06e8d 100644
--- a/po/git.pot
+++ b/po/git.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-02-01 08:06+0800\n"
+"POT-Creation-Date: 2014-04-19 12:50+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,16 +18,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: advice.c:57
+#: advice.c:55
#, c-format
msgid "hint: %.*s\n"
msgstr ""
-#.
-#. * Message used both when 'git commit' fails and when
-#. * other commands doing a merge do.
-#.
-#: advice.c:87
+#: advice.c:85
msgid ""
"Fix them up in the work tree,\n"
"and then use 'git add/rm <file>' as\n"
@@ -52,76 +48,76 @@ msgstr ""
msgid "git archive --remote <repo> [--exec <cmd>] --list"
msgstr ""
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
#, c-format
msgid "pathspec '%s' did not match any files"
msgstr ""
-#: archive.c:327
+#: archive.c:328
msgid "fmt"
msgstr ""
-#: archive.c:327
+#: archive.c:328
msgid "archive format"
msgstr ""
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
msgid "prefix"
msgstr ""
-#: archive.c:329
+#: archive.c:330
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
+#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2258
+#: builtin/blame.c:2259 builtin/config.c:57 builtin/fast-export.c:680
+#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
+#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
msgid "file"
msgstr ""
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 builtin/archive.c:89
msgid "write the archive to this file"
msgstr ""
-#: archive.c:333
+#: archive.c:334
msgid "read .gitattributes in working directory"
msgstr ""
-#: archive.c:334
+#: archive.c:335
msgid "report archived files on stderr"
msgstr ""
-#: archive.c:335
+#: archive.c:336
msgid "store only"
msgstr ""
-#: archive.c:336
+#: archive.c:337
msgid "compress faster"
msgstr ""
-#: archive.c:344
+#: archive.c:345
msgid "compress better"
msgstr ""
-#: archive.c:347
+#: archive.c:348
msgid "list supported archive formats"
msgstr ""
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
msgid "repo"
msgstr ""
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 builtin/archive.c:91
msgid "retrieve the archive from remote repository <repo>"
msgstr ""
-#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
msgid "command"
msgstr ""
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
msgid "path to the remote git-upload-archive command"
msgstr ""
@@ -136,81 +132,76 @@ msgstr ""
msgid "Not setting branch %s as its own upstream."
msgstr ""
-#: branch.c:82
+#: branch.c:83
#, c-format
msgid "Branch %s set up to track remote branch %s from %s by rebasing."
msgstr ""
-#: branch.c:83
+#: branch.c:84
#, c-format
msgid "Branch %s set up to track remote branch %s from %s."
msgstr ""
-#: branch.c:87
+#: branch.c:88
#, c-format
msgid "Branch %s set up to track local branch %s by rebasing."
msgstr ""
-#: branch.c:88
+#: branch.c:89
#, c-format
msgid "Branch %s set up to track local branch %s."
msgstr ""
-#: branch.c:92
+#: branch.c:94
#, c-format
msgid "Branch %s set up to track remote ref %s by rebasing."
msgstr ""
-#: branch.c:93
+#: branch.c:95
#, c-format
msgid "Branch %s set up to track remote ref %s."
msgstr ""
-#: branch.c:97
+#: branch.c:99
#, c-format
msgid "Branch %s set up to track local ref %s by rebasing."
msgstr ""
-#: branch.c:98
+#: branch.c:100
#, 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
+#: branch.c:133
#, c-format
msgid "Not tracking: ambiguous information for ref %s"
msgstr ""
-#: branch.c:182
+#: branch.c:178
#, c-format
msgid "'%s' is not a valid branch name."
msgstr ""
-#: branch.c:187
+#: branch.c:183
#, c-format
msgid "A branch named '%s' already exists."
msgstr ""
-#: branch.c:195
+#: branch.c:191
msgid "Cannot force update the current branch."
msgstr ""
-#: branch.c:215
+#: branch.c:211
#, c-format
msgid "Cannot setup tracking information; starting point '%s' is not a branch."
msgstr ""
-#: branch.c:217
+#: branch.c:213
#, c-format
msgid "the requested upstream branch '%s' does not exist"
msgstr ""
-#: branch.c:219
+#: branch.c:215
msgid ""
"\n"
"If you are planning on basing your work on an upstream\n"
@@ -222,113 +213,113 @@ msgid ""
"\"git push -u\" to set the upstream config as you push."
msgstr ""
-#: branch.c:264
+#: branch.c:260
#, c-format
msgid "Not a valid object name: '%s'."
msgstr ""
-#: branch.c:284
+#: branch.c:280
#, c-format
msgid "Ambiguous object name: '%s'."
msgstr ""
-#: branch.c:289
+#: branch.c:285
#, c-format
msgid "Not a valid branch point: '%s'."
msgstr ""
-#: branch.c:295
+#: branch.c:291
msgid "Failed to lock ref for update"
msgstr ""
-#: branch.c:313
+#: branch.c:309
msgid "Failed to write ref"
msgstr ""
-#: bundle.c:37
+#: bundle.c:33
#, c-format
msgid "'%s' does not look like a v2 bundle file"
msgstr ""
-#: bundle.c:64
+#: bundle.c:60
#, c-format
msgid "unrecognized header: %s%s (%d)"
msgstr ""
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
#, c-format
msgid "could not open '%s'"
msgstr ""
-#: bundle.c:141
+#: bundle.c:138
msgid "Repository lacks these prerequisite commits:"
msgstr ""
-#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: bundle.c:162 sequencer.c:669 sequencer.c:1123 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
+#: bundle.c:184
#, c-format
msgid "The bundle contains this ref:"
msgid_plural "The bundle contains these %d refs:"
msgstr[0] ""
msgstr[1] ""
-#: bundle.c:194
+#: bundle.c:191
msgid "The bundle records a complete history."
msgstr ""
-#: bundle.c:196
+#: bundle.c:193
#, c-format
msgid "The bundle requires this ref:"
msgid_plural "The bundle requires these %d refs:"
msgstr[0] ""
msgstr[1] ""
-#: bundle.c:296
+#: bundle.c:293
msgid "rev-list died"
msgstr ""
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
#, c-format
msgid "unrecognized argument: %s"
msgstr ""
-#: bundle.c:337
+#: bundle.c:334
#, c-format
msgid "ref '%s' is excluded by the rev-list options"
msgstr ""
-#: bundle.c:382
+#: bundle.c:379
msgid "Refusing to create empty bundle."
msgstr ""
-#: bundle.c:398
+#: bundle.c:395
msgid "Could not spawn pack-objects"
msgstr ""
-#: bundle.c:416
+#: bundle.c:413
msgid "pack-objects died"
msgstr ""
-#: bundle.c:419
+#: bundle.c:416
#, c-format
msgid "cannot create '%s'"
msgstr ""
-#: bundle.c:441
+#: bundle.c:438
msgid "index-pack died"
msgstr ""
-#: commit.c:53
+#: commit.c:54
#, c-format
msgid "could not parse %s"
msgstr ""
-#: commit.c:55
+#: commit.c:56
#, c-format
msgid "%s %s is not a commit!"
msgstr ""
@@ -404,6 +395,7 @@ msgid_plural "%lu years"
msgstr[0] ""
msgstr[1] ""
+#. TRANSLATORS: "%s" is "<n> years"
#: date.c:149
#, c-format
msgid "%s, %lu month ago"
@@ -423,6 +415,10 @@ msgstr[1] ""
msgid "failed to read orderfile '%s'"
msgstr ""
+#: diffcore-rename.c:517
+msgid "Performing inexact rename detection"
+msgstr ""
+
#: diff.c:113
#, c-format
msgid " Failed to parse dirstat cut-off percentage '%s'\n"
@@ -445,14 +441,14 @@ msgid ""
"%s"
msgstr ""
-#: diff.c:3509
+#: diff.c:3495
#, c-format
msgid ""
"Failed to parse --dirstat/-X option parameter:\n"
"%s"
msgstr ""
-#: diff.c:3523
+#: diff.c:3509
#, c-format
msgid "Failed to parse --submodule option parameter: '%s'"
msgstr ""
@@ -479,63 +475,63 @@ msgstr ""
msgid "failed writing detached signature to '%s': %s"
msgstr ""
-#: grep.c:1695
+#: grep.c:1698
#, c-format
msgid "'%s': unable to read %s"
msgstr ""
-#: grep.c:1712
+#: grep.c:1715
#, c-format
msgid "'%s': %s"
msgstr ""
-#: grep.c:1723
+#: grep.c:1726
#, c-format
msgid "'%s': short read %s"
msgstr ""
-#: help.c:210
+#: help.c:209
#, c-format
msgid "available git commands in '%s'"
msgstr ""
-#: help.c:217
+#: help.c:216
msgid "git commands available from elsewhere on your $PATH"
msgstr ""
-#: help.c:233
+#: help.c:232
msgid "The most commonly used git commands are:"
msgstr ""
-#: help.c:290
+#: help.c:289
#, 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 ""
-#: help.c:347
+#: help.c:346
msgid "Uh oh. Your system reports no Git commands at all."
msgstr ""
-#: help.c:369
+#: help.c:368
#, 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 ""
-#: help.c:374
+#: help.c:373
#, c-format
msgid "in %0.1f seconds automatically..."
msgstr ""
-#: help.c:381
+#: help.c:380
#, c-format
msgid "git: '%s' is not a git command. See 'git --help'."
msgstr ""
-#: help.c:385 help.c:444
+#: help.c:384 help.c:443
msgid ""
"\n"
"Did you mean this?"
@@ -545,7 +541,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: help.c:440
+#: help.c:439
#, c-format
msgid "%s: %s - %s"
msgstr ""
@@ -554,7 +550,7 @@ msgstr ""
msgid "failed to read the cache"
msgstr ""
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
#: builtin/clone.c:661
msgid "unable to write new index file"
msgstr ""
@@ -564,244 +560,242 @@ msgstr ""
msgid "(bad commit)\n"
msgstr ""
-#: merge-recursive.c:206
+#: merge-recursive.c:208
#, c-format
msgid "addinfo_cache failed for path '%s'"
msgstr ""
-#: merge-recursive.c:269
+#: merge-recursive.c:271
msgid "error building trees"
msgstr ""
-#: merge-recursive.c:673
+#: merge-recursive.c:675
#, c-format
msgid "failed to create path '%s'%s"
msgstr ""
-#: merge-recursive.c:684
+#: merge-recursive.c:686
#, 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
+#: merge-recursive.c:700 merge-recursive.c:721
msgid ": perhaps a D/F conflict?"
msgstr ""
-#: merge-recursive.c:709
+#: merge-recursive.c:711
#, c-format
msgid "refusing to lose untracked file at '%s'"
msgstr ""
-#: merge-recursive.c:749
+#: merge-recursive.c:751
#, c-format
msgid "cannot read object %s '%s'"
msgstr ""
-#: merge-recursive.c:751
+#: merge-recursive.c:753
#, c-format
msgid "blob expected for %s '%s'"
msgstr ""
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
#, c-format
msgid "failed to open '%s'"
msgstr ""
-#: merge-recursive.c:782
+#: merge-recursive.c:784
#, c-format
msgid "failed to symlink '%s'"
msgstr ""
-#: merge-recursive.c:785
+#: merge-recursive.c:787
#, c-format
msgid "do not know what to do with %06o %s '%s'"
msgstr ""
-#: merge-recursive.c:923
+#: merge-recursive.c:925
msgid "Failed to execute internal merge"
msgstr ""
-#: merge-recursive.c:927
+#: merge-recursive.c:929
#, c-format
msgid "Unable to add %s to database"
msgstr ""
-#: merge-recursive.c:943
+#: merge-recursive.c:945
msgid "unsupported object type in the tree"
msgstr ""
-#: merge-recursive.c:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
#, 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
+#: merge-recursive.c:1030 merge-recursive.c:1043
#, 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
+#: merge-recursive.c:1084
msgid "rename"
msgstr ""
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
msgid "renamed"
msgstr ""
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
#, c-format
msgid "%s is a directory in %s adding as %s instead"
msgstr ""
-#: merge-recursive.c:1160
+#: merge-recursive.c:1162
#, c-format
msgid ""
"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
"\"->\"%s\" in \"%s\"%s"
msgstr ""
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
msgid " (left unresolved)"
msgstr ""
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
#, c-format
msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
msgstr ""
-#: merge-recursive.c:1249
+#: merge-recursive.c:1251
#, c-format
msgid "Renaming %s to %s and %s to %s instead"
msgstr ""
-#: merge-recursive.c:1448
+#: merge-recursive.c:1450
#, c-format
msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
msgstr ""
-#: merge-recursive.c:1458
+#: merge-recursive.c:1460
#, c-format
msgid "Adding merged %s"
msgstr ""
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
#, c-format
msgid "Adding as %s instead"
msgstr ""
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
#, c-format
msgid "cannot read object %s"
msgstr ""
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
#, c-format
msgid "object %s is not a blob"
msgstr ""
-#: merge-recursive.c:1565
+#: merge-recursive.c:1567
msgid "modify"
msgstr ""
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
msgid "modified"
msgstr ""
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
msgid "content"
msgstr ""
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
msgid "add/add"
msgstr ""
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
#, c-format
msgid "Skipped %s (merged same as existing)"
msgstr ""
-#: merge-recursive.c:1630
+#: merge-recursive.c:1632
#, c-format
msgid "Auto-merging %s"
msgstr ""
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
msgid "submodule"
msgstr ""
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
#, c-format
msgid "CONFLICT (%s): Merge conflict in %s"
msgstr ""
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
#, c-format
msgid "Removing %s"
msgstr ""
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
msgid "file/directory"
msgstr ""
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
msgid "directory/file"
msgstr ""
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
#, c-format
msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
msgstr ""
-#: merge-recursive.c:1771
+#: merge-recursive.c:1773
#, c-format
msgid "Adding %s"
msgstr ""
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
msgid "Fatal merge failure, shouldn't happen."
msgstr ""
-#: merge-recursive.c:1807
+#: merge-recursive.c:1809
msgid "Already up-to-date!"
msgstr ""
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
#, c-format
msgid "merging of trees %s and %s failed"
msgstr ""
-#: merge-recursive.c:1846
+#: merge-recursive.c:1848
#, c-format
msgid "Unprocessed path??? %s"
msgstr ""
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
msgid "Merging:"
msgstr ""
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
#, c-format
msgid "found %u common ancestor:"
msgid_plural "found %u common ancestors:"
msgstr[0] ""
msgstr[1] ""
-#: merge-recursive.c:1941
+#: merge-recursive.c:1943
msgid "merge returned no commit"
msgstr ""
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
#, c-format
msgid "Could not parse object '%s'"
msgstr ""
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
msgid "Unable to write index."
msgstr ""
@@ -826,33 +820,33 @@ msgstr ""
msgid "Bad %s value: '%s'"
msgstr ""
-#: object.c:202
+#: object.c:229
#, c-format
msgid "unable to parse object: %s"
msgstr ""
-#: parse-options.c:537
+#: parse-options.c:532
msgid "..."
msgstr ""
-#: parse-options.c:555
+#: parse-options.c:550
#, c-format
msgid "usage: %s"
msgstr ""
#. TRANSLATORS: the colon here should align with the
#. one in "usage: %s" translation
-#: parse-options.c:559
+#: parse-options.c:554
#, c-format
msgid " or: %s"
msgstr ""
-#: parse-options.c:562
+#: parse-options.c:557
#, c-format
msgid " %s"
msgstr ""
-#: parse-options.c:596
+#: parse-options.c:591
msgid "-NUM"
msgstr ""
@@ -900,11 +894,6 @@ msgstr ""
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"
@@ -921,56 +910,69 @@ msgid ""
"Perhaps you forgot to add either ':/' or '.' ?"
msgstr ""
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr ""
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+
+#: remote.c:758
#, c-format
msgid "Cannot fetch both %s and %s to %s"
msgstr ""
-#: remote.c:757
+#: remote.c:762
#, c-format
msgid "%s usually tracks %s, not %s"
msgstr ""
-#: remote.c:761
+#: remote.c:766
#, c-format
msgid "%s tracks both %s and %s"
msgstr ""
-#.
-#. * This last possibility doesn't occur because
-#. * FETCH_HEAD_IGNORE entries always appear at
-#. * the end of the list.
-#.
-#: remote.c:769
+#: remote.c:774
msgid "Internal error"
msgstr ""
-#: remote.c:1871
+#: remote.c:1948
#, c-format
msgid "Your branch is based on '%s', but the upstream is gone.\n"
msgstr ""
-#: remote.c:1875
+#: remote.c:1952
msgid " (use \"git branch --unset-upstream\" to fixup)\n"
msgstr ""
-#: remote.c:1878
+#: remote.c:1955
#, c-format
msgid "Your branch is up-to-date with '%s'.\n"
msgstr ""
-#: remote.c:1882
+#: remote.c:1959
#, c-format
msgid "Your branch is ahead of '%s' by %d commit.\n"
msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
msgstr[0] ""
msgstr[1] ""
-#: remote.c:1888
+#: remote.c:1965
msgid " (use \"git push\" to publish your local commits)\n"
msgstr ""
-#: remote.c:1891
+#: remote.c:1968
#, c-format
msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
msgid_plural ""
@@ -978,11 +980,11 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: remote.c:1899
+#: remote.c:1976
msgid " (use \"git pull\" to update your local branch)\n"
msgstr ""
-#: remote.c:1902
+#: remote.c:1979
#, c-format
msgid ""
"Your branch and '%s' have diverged,\n"
@@ -993,7 +995,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: remote.c:1912
+#: remote.c:1989
msgid " (use \"git pull\" to merge the remote branch into yours)\n"
msgstr ""
@@ -1006,14 +1008,14 @@ msgstr ""
msgid "dup2(%d,%d) failed"
msgstr ""
-#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896
-#: builtin/merge.c:1006 builtin/merge.c:1016
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
#, 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
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
#, c-format
msgid "Could not write to '%s'"
msgstr ""
@@ -1031,7 +1033,7 @@ msgid ""
"and commit the result with 'git commit'"
msgstr ""
-#: sequencer.c:245 sequencer.c:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
#, c-format
msgid "Could not write to %s"
msgstr ""
@@ -1067,184 +1069,184 @@ msgstr ""
msgid "Unable to update cache tree\n"
msgstr ""
-#: sequencer.c:423
+#: sequencer.c:430
#, c-format
msgid "Could not parse commit %s\n"
msgstr ""
-#: sequencer.c:428
+#: sequencer.c:435
#, c-format
msgid "Could not parse parent commit %s\n"
msgstr ""
-#: sequencer.c:494
+#: sequencer.c:501
msgid "Your index file is unmerged."
msgstr ""
-#: sequencer.c:513
+#: sequencer.c:520
#, c-format
msgid "Commit %s is a merge but no -m option was given."
msgstr ""
-#: sequencer.c:521
+#: sequencer.c:528
#, c-format
msgid "Commit %s does not have parent %d"
msgstr ""
-#: sequencer.c:525
+#: sequencer.c:532
#, 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
+#: sequencer.c:545
#, c-format
msgid "%s: cannot parse parent commit %s"
msgstr ""
-#: sequencer.c:542
+#: sequencer.c:549
#, c-format
msgid "Cannot get commit message for %s"
msgstr ""
-#: sequencer.c:628
+#: sequencer.c:635
#, c-format
msgid "could not revert %s... %s"
msgstr ""
-#: sequencer.c:629
+#: sequencer.c:636
#, c-format
msgid "could not apply %s... %s"
msgstr ""
-#: sequencer.c:665
+#: sequencer.c:672
msgid "empty commit set passed"
msgstr ""
-#: sequencer.c:673
+#: sequencer.c:680
#, c-format
msgid "git %s: failed to read the index"
msgstr ""
-#: sequencer.c:678
+#: sequencer.c:685
#, c-format
msgid "git %s: failed to refresh the index"
msgstr ""
-#: sequencer.c:736
+#: sequencer.c:743
#, c-format
msgid "Cannot %s during a %s"
msgstr ""
-#: sequencer.c:758
+#: sequencer.c:765
#, c-format
msgid "Could not parse line %d."
msgstr ""
-#: sequencer.c:763
+#: sequencer.c:770
msgid "No commits parsed."
msgstr ""
-#: sequencer.c:776
+#: sequencer.c:783
#, c-format
msgid "Could not open %s"
msgstr ""
-#: sequencer.c:780
+#: sequencer.c:787
#, c-format
msgid "Could not read %s."
msgstr ""
-#: sequencer.c:787
+#: sequencer.c:794
#, c-format
msgid "Unusable instruction sheet: %s"
msgstr ""
-#: sequencer.c:815
+#: sequencer.c:824
#, c-format
msgid "Invalid key: %s"
msgstr ""
-#: sequencer.c:818
+#: sequencer.c:827
#, c-format
msgid "Invalid value for %s: %s"
msgstr ""
-#: sequencer.c:830
+#: sequencer.c:839
#, c-format
msgid "Malformed options sheet: %s"
msgstr ""
-#: sequencer.c:851
+#: sequencer.c:860
msgid "a cherry-pick or revert is already in progress"
msgstr ""
-#: sequencer.c:852
+#: sequencer.c:861
msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
msgstr ""
-#: sequencer.c:856
+#: sequencer.c:865
#, c-format
msgid "Could not create sequencer directory %s"
msgstr ""
-#: sequencer.c:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
#, c-format
msgid "Error wrapping up %s."
msgstr ""
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
msgid "no cherry-pick or revert in progress"
msgstr ""
-#: sequencer.c:893
+#: sequencer.c:902
msgid "cannot resolve HEAD"
msgstr ""
-#: sequencer.c:895
+#: sequencer.c:904
msgid "cannot abort from a branch yet to be born"
msgstr ""
-#: sequencer.c:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
#, c-format
msgid "cannot open %s: %s"
msgstr ""
-#: sequencer.c:920
+#: sequencer.c:929
#, c-format
msgid "cannot read %s: %s"
msgstr ""
-#: sequencer.c:921
+#: sequencer.c:930
msgid "unexpected end of file"
msgstr ""
-#: sequencer.c:927
+#: sequencer.c:936
#, c-format
msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
msgstr ""
-#: sequencer.c:950
+#: sequencer.c:959
#, c-format
msgid "Could not format %s."
msgstr ""
-#: sequencer.c:1093
+#: sequencer.c:1104
#, c-format
msgid "%s: can't cherry-pick a %s"
msgstr ""
-#: sequencer.c:1096
+#: sequencer.c:1107
#, c-format
msgid "%s: bad revision"
msgstr ""
-#: sequencer.c:1130
+#: sequencer.c:1141
msgid "Can't revert as initial commit"
msgstr ""
-#: sequencer.c:1131
+#: sequencer.c:1142
msgid "Can't cherry-pick into empty head"
msgstr ""
@@ -1261,21 +1263,21 @@ msgid ""
"running \"git config advice.objectNameWarning false\""
msgstr ""
-#: sha1_name.c:1070
+#: sha1_name.c:1072
msgid "HEAD does not point to a branch"
msgstr ""
-#: sha1_name.c:1073
+#: sha1_name.c:1075
#, c-format
msgid "No such branch: '%s'"
msgstr ""
-#: sha1_name.c:1075
+#: sha1_name.c:1077
#, c-format
msgid "No upstream configured for branch '%s'"
msgstr ""
-#: sha1_name.c:1079
+#: sha1_name.c:1081
#, c-format
msgid "Upstream branch '%s' not stored as a remote-tracking branch"
msgstr ""
@@ -1289,52 +1291,34 @@ msgstr ""
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
+#: submodule.c:120
msgid "staging updated .gitmodules failed"
msgstr ""
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 builtin/init-db.c:363
#, c-format
msgid "Could not create git link %s"
msgstr ""
-#: submodule.c:1155
+#: submodule.c:1132
#, c-format
msgid "Could not set core.worktree in %s"
msgstr ""
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr ""
+
#: urlmatch.c:120
msgid "invalid URL scheme name or missing '://' suffix"
msgstr ""
@@ -1438,266 +1422,275 @@ msgstr ""
msgid " (use \"git %s <file>...\" to include in what will be committed)"
msgstr ""
-#: wt-status.c:254
-msgid "bug"
-msgstr ""
-
-#: wt-status.c:259
+#: wt-status.c:252
msgid "both deleted:"
msgstr ""
-#: wt-status.c:260
+#: wt-status.c:254
msgid "added by us:"
msgstr ""
-#: wt-status.c:261
+#: wt-status.c:256
msgid "deleted by them:"
msgstr ""
-#: wt-status.c:262
+#: wt-status.c:258
msgid "added by them:"
msgstr ""
-#: wt-status.c:263
+#: wt-status.c:260
msgid "deleted by us:"
msgstr ""
-#: wt-status.c:264
+#: wt-status.c:262
msgid "both added:"
msgstr ""
-#: wt-status.c:265
+#: wt-status.c:264
msgid "both modified:"
msgstr ""
-#: wt-status.c:275
-msgid "new file"
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr ""
+
+#: wt-status.c:274
+msgid "new file:"
+msgstr ""
+
+#: wt-status.c:276
+msgid "copied:"
+msgstr ""
+
+#: wt-status.c:278
+msgid "deleted:"
msgstr ""
-#: wt-status.c:277
-msgid "copied"
+#: wt-status.c:280
+msgid "modified:"
msgstr ""
-#: wt-status.c:279
-msgid "deleted"
+#: wt-status.c:282
+msgid "renamed:"
msgstr ""
-#: wt-status.c:285
-msgid "typechange"
+#: wt-status.c:284
+msgid "typechange:"
msgstr ""
-#: wt-status.c:287
-msgid "unknown"
+#: wt-status.c:286
+msgid "unknown:"
msgstr ""
-#: wt-status.c:289
-msgid "unmerged"
+#: wt-status.c:288
+msgid "unmerged:"
msgstr ""
-#: wt-status.c:336
+#: wt-status.c:370
msgid "new commits, "
msgstr ""
-#: wt-status.c:338
+#: wt-status.c:372
msgid "modified content, "
msgstr ""
-#: wt-status.c:340
+#: wt-status.c:374
msgid "untracked content, "
msgstr ""
-#: wt-status.c:357
+#: wt-status.c:391
#, c-format
msgid "bug: unhandled diff status %c"
msgstr ""
-#: wt-status.c:732
+#: wt-status.c:765
msgid "Submodules changed but not updated:"
msgstr ""
-#: wt-status.c:734
+#: wt-status.c:767
msgid "Submodule changes to be committed:"
msgstr ""
-#: wt-status.c:836
+#: wt-status.c:846
msgid ""
"Do not touch the line above.\n"
"Everything below will be removed."
msgstr ""
-#: wt-status.c:899
+#: wt-status.c:937
msgid "You have unmerged paths."
msgstr ""
-#: wt-status.c:902
+#: wt-status.c:940
msgid " (fix conflicts and run \"git commit\")"
msgstr ""
-#: wt-status.c:905
+#: wt-status.c:943
msgid "All conflicts fixed but you are still merging."
msgstr ""
-#: wt-status.c:908
+#: wt-status.c:946
msgid " (use \"git commit\" to conclude merge)"
msgstr ""
-#: wt-status.c:918
+#: wt-status.c:956
msgid "You are in the middle of an am session."
msgstr ""
-#: wt-status.c:921
+#: wt-status.c:959
msgid "The current patch is empty."
msgstr ""
-#: wt-status.c:925
+#: wt-status.c:963
msgid " (fix conflicts and then run \"git am --continue\")"
msgstr ""
-#: wt-status.c:927
+#: wt-status.c:965
msgid " (use \"git am --skip\" to skip this patch)"
msgstr ""
-#: wt-status.c:929
+#: wt-status.c:967
msgid " (use \"git am --abort\" to restore the original branch)"
msgstr ""
-#: wt-status.c:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
#, c-format
msgid "You are currently rebasing branch '%s' on '%s'."
msgstr ""
-#: wt-status.c:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
msgid "You are currently rebasing."
msgstr ""
-#: wt-status.c:997
+#: wt-status.c:1035
msgid " (fix conflicts and then run \"git rebase --continue\")"
msgstr ""
-#: wt-status.c:999
+#: wt-status.c:1037
msgid " (use \"git rebase --skip\" to skip this patch)"
msgstr ""
-#: wt-status.c:1001
+#: wt-status.c:1039
msgid " (use \"git rebase --abort\" to check out the original branch)"
msgstr ""
-#: wt-status.c:1014
+#: wt-status.c:1052
msgid " (all conflicts fixed: run \"git rebase --continue\")"
msgstr ""
-#: wt-status.c:1018
+#: wt-status.c:1056
#, c-format
msgid ""
"You are currently splitting a commit while rebasing branch '%s' on '%s'."
msgstr ""
-#: wt-status.c:1023
+#: wt-status.c:1061
msgid "You are currently splitting a commit during a rebase."
msgstr ""
-#: wt-status.c:1026
+#: wt-status.c:1064
msgid " (Once your working directory is clean, run \"git rebase --continue\")"
msgstr ""
-#: wt-status.c:1030
+#: wt-status.c:1068
#, c-format
msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
msgstr ""
-#: wt-status.c:1035
+#: wt-status.c:1073
msgid "You are currently editing a commit during a rebase."
msgstr ""
-#: wt-status.c:1038
+#: wt-status.c:1076
msgid " (use \"git commit --amend\" to amend the current commit)"
msgstr ""
-#: wt-status.c:1040
+#: wt-status.c:1078
msgid ""
" (use \"git rebase --continue\" once you are satisfied with your changes)"
msgstr ""
-#: wt-status.c:1050
+#: wt-status.c:1088
#, c-format
msgid "You are currently cherry-picking commit %s."
msgstr ""
-#: wt-status.c:1055
+#: wt-status.c:1093
msgid " (fix conflicts and run \"git cherry-pick --continue\")"
msgstr ""
-#: wt-status.c:1058
+#: wt-status.c:1096
msgid " (all conflicts fixed: run \"git cherry-pick --continue\")"
msgstr ""
-#: wt-status.c:1060
+#: wt-status.c:1098
msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
msgstr ""
-#: wt-status.c:1069
+#: wt-status.c:1107
#, c-format
msgid "You are currently reverting commit %s."
msgstr ""
-#: wt-status.c:1074
+#: wt-status.c:1112
msgid " (fix conflicts and run \"git revert --continue\")"
msgstr ""
-#: wt-status.c:1077
+#: wt-status.c:1115
msgid " (all conflicts fixed: run \"git revert --continue\")"
msgstr ""
-#: wt-status.c:1079
+#: wt-status.c:1117
msgid " (use \"git revert --abort\" to cancel the revert operation)"
msgstr ""
-#: wt-status.c:1090
+#: wt-status.c:1128
#, c-format
msgid "You are currently bisecting, started from branch '%s'."
msgstr ""
-#: wt-status.c:1094
+#: wt-status.c:1132
msgid "You are currently bisecting."
msgstr ""
-#: wt-status.c:1097
+#: wt-status.c:1135
msgid " (use \"git bisect reset\" to get back to the original branch)"
msgstr ""
-#: wt-status.c:1272
+#: wt-status.c:1310
msgid "On branch "
msgstr ""
-#: wt-status.c:1279
+#: wt-status.c:1317
msgid "rebase in progress; onto "
msgstr ""
-#: wt-status.c:1286
+#: wt-status.c:1324
msgid "HEAD detached at "
msgstr ""
-#: wt-status.c:1288
+#: wt-status.c:1326
msgid "HEAD detached from "
msgstr ""
-#: wt-status.c:1291
+#: wt-status.c:1329
msgid "Not currently on any branch."
msgstr ""
-#: wt-status.c:1308
+#: wt-status.c:1346
msgid "Initial commit"
msgstr ""
-#: wt-status.c:1322
+#: wt-status.c:1360
msgid "Untracked files"
msgstr ""
-#: wt-status.c:1324
+#: wt-status.c:1362
msgid "Ignored files"
msgstr ""
-#: wt-status.c:1328
+#: wt-status.c:1366
#, c-format
msgid ""
"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1705,283 +1698,228 @@ msgid ""
"new files yourself (see 'git help status')."
msgstr ""
-#: wt-status.c:1334
+#: wt-status.c:1372
#, c-format
msgid "Untracked files not listed%s"
msgstr ""
-#: wt-status.c:1336
+#: wt-status.c:1374
msgid " (use -u option to show untracked files)"
msgstr ""
-#: wt-status.c:1342
+#: wt-status.c:1380
msgid "No changes"
msgstr ""
-#: wt-status.c:1347
+#: wt-status.c:1385
#, c-format
msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
msgstr ""
-#: wt-status.c:1350
+#: wt-status.c:1388
#, c-format
msgid "no changes added to commit\n"
msgstr ""
-#: wt-status.c:1353
+#: wt-status.c:1391
#, c-format
msgid ""
"nothing added to commit but untracked files present (use \"git add\" to "
"track)\n"
msgstr ""
-#: wt-status.c:1356
+#: wt-status.c:1394
#, c-format
msgid "nothing added to commit but untracked files present\n"
msgstr ""
-#: wt-status.c:1359
+#: wt-status.c:1397
#, 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
+#: wt-status.c:1400 wt-status.c:1405
#, c-format
msgid "nothing to commit\n"
msgstr ""
-#: wt-status.c:1365
+#: wt-status.c:1403
#, c-format
msgid "nothing to commit (use -u to show untracked files)\n"
msgstr ""
-#: wt-status.c:1369
+#: wt-status.c:1407
#, c-format
msgid "nothing to commit, working directory clean\n"
msgstr ""
-#: wt-status.c:1478
+#: wt-status.c:1516
msgid "HEAD (no branch)"
msgstr ""
-#: wt-status.c:1484
+#: wt-status.c:1522
msgid "Initial commit on "
msgstr ""
-#: wt-status.c:1514
+#: wt-status.c:1554
msgid "gone"
msgstr ""
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
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
+#: builtin/add.c:21
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
+#: builtin/add.c:64
#, c-format
msgid "unexpected diff status %c"
msgstr ""
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
msgid "updating files failed"
msgstr ""
-#: builtin/add.c:163
+#: builtin/add.c:79
#, c-format
msgid "remove '%s'\n"
msgstr ""
-#: builtin/add.c:237
+#: builtin/add.c:133
msgid "Unstaged changes after refreshing the index:"
msgstr ""
-#: builtin/add.c:299
+#: builtin/add.c:193
msgid "Could not read the index"
msgstr ""
-#: builtin/add.c:310
+#: builtin/add.c:204
#, c-format
msgid "Could not open '%s' for writing."
msgstr ""
-#: builtin/add.c:314
+#: builtin/add.c:208
msgid "Could not write patch"
msgstr ""
-#: builtin/add.c:319
+#: builtin/add.c:213
#, c-format
msgid "Could not stat '%s'"
msgstr ""
-#: builtin/add.c:321
+#: builtin/add.c:215
msgid "Empty patch. Aborted."
msgstr ""
-#: builtin/add.c:327
+#: builtin/add.c:221
#, c-format
msgid "Could not apply '%s'"
msgstr ""
-#: builtin/add.c:337
+#: builtin/add.c:231
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/add.c:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
+#: builtin/prune-packed.c:77 builtin/push.c:489 builtin/remote.c:1344
#: builtin/rm.c:269
msgid "dry run"
msgstr ""
-#: 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/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
+#: builtin/commit.c:1256 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
+#: builtin/add.c:251
msgid "interactive picking"
msgstr ""
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
msgid "select hunks interactively"
msgstr ""
-#: builtin/add.c:359
+#: builtin/add.c:253
msgid "edit current diff and apply"
msgstr ""
-#: builtin/add.c:360
+#: builtin/add.c:254
msgid "allow adding otherwise ignored files"
msgstr ""
-#: builtin/add.c:361
+#: builtin/add.c:255
msgid "update tracked files"
msgstr ""
-#: builtin/add.c:362
+#: builtin/add.c:256
msgid "record only the fact that the path will be added later"
msgstr ""
-#: builtin/add.c:363
+#: builtin/add.c:257
msgid "add changes from all tracked and untracked files"
msgstr ""
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
msgid "ignore paths removed in the working tree (same as --no-all)"
msgstr ""
-#: builtin/add.c:368
+#: builtin/add.c:262
msgid "don't add, only refresh the index"
msgstr ""
-#: builtin/add.c:369
+#: builtin/add.c:263
msgid "just skip files which cannot be added because of errors"
msgstr ""
-#: builtin/add.c:370
+#: builtin/add.c:264
msgid "check if - even missing - files are ignored in dry run"
msgstr ""
-#: builtin/add.c:392
+#: builtin/add.c:286
#, c-format
msgid "Use -f if you really want to add them.\n"
msgstr ""
-#: builtin/add.c:393
+#: builtin/add.c:287
msgid "no files added"
msgstr ""
-#: builtin/add.c:399
+#: builtin/add.c:293
msgid "adding files failed"
msgstr ""
-#: builtin/add.c:438
+#: builtin/add.c:330
msgid "-A and -u are mutually incompatible"
msgstr ""
-#: builtin/add.c:456
+#: builtin/add.c:337
msgid "Option --ignore-missing can only be used together with --dry-run"
msgstr ""
-#: builtin/add.c:486
+#: builtin/add.c:358
#, c-format
msgid "Nothing specified, nothing added.\n"
msgstr ""
-#: builtin/add.c:487
+#: builtin/add.c:359
#, 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
+#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:920
+#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 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
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
msgid "Unable to write new index file"
msgstr ""
@@ -2088,7 +2026,6 @@ msgstr ""
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"
@@ -2227,7 +2164,7 @@ msgstr ""
msgid "Checking patch %s..."
msgstr ""
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
#, c-format
msgid "make_cache_entry failed for path '%s'"
msgstr ""
@@ -2276,7 +2213,6 @@ msgstr ""
msgid "internal error"
msgstr ""
-#. Say this even without --verbose
#: builtin/apply.c:4043
#, c-format
msgid "Applying patch %%s with %d reject..."
@@ -2368,7 +2304,7 @@ msgstr ""
msgid "build a temporary index based on embedded index information"
msgstr ""
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
msgid "paths are separated with NUL character"
msgstr ""
@@ -2506,95 +2442,95 @@ msgstr ""
msgid "[rev-opts] are documented in git-rev-list(1)"
msgstr ""
-#: builtin/blame.c:2249
+#: builtin/blame.c:2242
msgid "Show blame entries as we find them, incrementally"
msgstr ""
-#: builtin/blame.c:2250
+#: builtin/blame.c:2243
msgid "Show blank SHA-1 for boundary commits (Default: off)"
msgstr ""
-#: builtin/blame.c:2251
+#: builtin/blame.c:2244
msgid "Do not treat root commits as boundaries (Default: off)"
msgstr ""
-#: builtin/blame.c:2252
+#: builtin/blame.c:2245
msgid "Show work cost statistics"
msgstr ""
-#: builtin/blame.c:2253
+#: builtin/blame.c:2246
msgid "Show output score for blame entries"
msgstr ""
-#: builtin/blame.c:2254
+#: builtin/blame.c:2247
msgid "Show original filename (Default: auto)"
msgstr ""
-#: builtin/blame.c:2255
+#: builtin/blame.c:2248
msgid "Show original linenumber (Default: off)"
msgstr ""
-#: builtin/blame.c:2256
+#: builtin/blame.c:2249
msgid "Show in a format designed for machine consumption"
msgstr ""
-#: builtin/blame.c:2257
+#: builtin/blame.c:2250
msgid "Show porcelain format with per-line commit information"
msgstr ""
-#: builtin/blame.c:2258
+#: builtin/blame.c:2251
msgid "Use the same output mode as git-annotate (Default: off)"
msgstr ""
-#: builtin/blame.c:2259
+#: builtin/blame.c:2252
msgid "Show raw timestamp (Default: off)"
msgstr ""
-#: builtin/blame.c:2260
+#: builtin/blame.c:2253
msgid "Show long commit SHA1 (Default: off)"
msgstr ""
-#: builtin/blame.c:2261
+#: builtin/blame.c:2254
msgid "Suppress author name and timestamp (Default: off)"
msgstr ""
-#: builtin/blame.c:2262
+#: builtin/blame.c:2255
msgid "Show author email instead of name (Default: off)"
msgstr ""
-#: builtin/blame.c:2263
+#: builtin/blame.c:2256
msgid "Ignore whitespace differences"
msgstr ""
-#: builtin/blame.c:2264
+#: builtin/blame.c:2257
msgid "Spend extra cycles to find better match"
msgstr ""
-#: builtin/blame.c:2265
+#: builtin/blame.c:2258
msgid "Use revisions from <file> instead of calling git-rev-list"
msgstr ""
-#: builtin/blame.c:2266
+#: builtin/blame.c:2259
msgid "Use <file>'s contents as the final image"
msgstr ""
-#: builtin/blame.c:2267 builtin/blame.c:2268
+#: builtin/blame.c:2260 builtin/blame.c:2261
msgid "score"
msgstr ""
-#: builtin/blame.c:2267
+#: builtin/blame.c:2260
msgid "Find line copies within and across files"
msgstr ""
-#: builtin/blame.c:2268
+#: builtin/blame.c:2261
msgid "Find line movements within and across files"
msgstr ""
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
msgid "n,m"
msgstr ""
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
msgid "Process only line range n,m, counting from 1"
msgstr ""
@@ -2830,8 +2766,9 @@ 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
+#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
+#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
+#: builtin/tag.c:533
msgid "commit"
msgstr ""
@@ -3008,43 +2945,43 @@ msgstr ""
msgid "Need a repository to unbundle."
msgstr ""
-#: builtin/cat-file.c:328
+#: builtin/cat-file.c:331
msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
msgstr ""
-#: builtin/cat-file.c:329
+#: builtin/cat-file.c:332
msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
msgstr ""
-#: builtin/cat-file.c:366
+#: builtin/cat-file.c:369
msgid "<type> can be one of: blob, tree, commit, tag"
msgstr ""
-#: builtin/cat-file.c:367
+#: builtin/cat-file.c:370
msgid "show object type"
msgstr ""
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
msgid "show object size"
msgstr ""
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
msgid "exit with zero when there's no error"
msgstr ""
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:374
msgid "pretty-print object's content"
msgstr ""
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
msgid "for blob objects, run textconv on object's content"
msgstr ""
-#: builtin/cat-file.c:375
+#: builtin/cat-file.c:378
msgid "show info and content of objects fed from the standard input"
msgstr ""
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:381
msgid "show info about objects fed from the standard input"
msgstr ""
@@ -3072,7 +3009,7 @@ msgstr ""
msgid "terminate input and output records by a NUL character"
msgstr ""
-#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
msgid "suppress progress reporting"
msgstr ""
@@ -3223,60 +3160,59 @@ msgstr ""
msgid "Cannot update paths and switch to branch '%s' at the same time."
msgstr ""
-#: builtin/checkout.c:261 builtin/checkout.c:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
msgid "corrupt index file"
msgstr ""
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
#, c-format
msgid "path '%s' is unmerged"
msgstr ""
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
msgid "you need to resolve your current index first"
msgstr ""
-#: builtin/checkout.c:594
+#: builtin/checkout.c:593
#, c-format
msgid "Can not do reflog for '%s'\n"
msgstr ""
-#: builtin/checkout.c:632
+#: builtin/checkout.c:631
msgid "HEAD is now at"
msgstr ""
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
#, c-format
msgid "Reset branch '%s'\n"
msgstr ""
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
#, c-format
msgid "Already on '%s'\n"
msgstr ""
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
#, c-format
msgid "Switched to and reset branch '%s'\n"
msgstr ""
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 builtin/checkout.c:1032
#, c-format
msgid "Switched to a new branch '%s'\n"
msgstr ""
-#: builtin/checkout.c:650
+#: builtin/checkout.c:649
#, c-format
msgid "Switched to branch '%s'\n"
msgstr ""
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
#, c-format
msgid " ... and %d more.\n"
msgstr ""
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
#, c-format
msgid ""
"Warning: you are leaving %d commit behind, not connected to\n"
@@ -3291,7 +3227,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
#, c-format
msgid ""
"If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3301,152 +3237,151 @@ msgid ""
"\n"
msgstr ""
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
msgid "internal error in revision walk"
msgstr ""
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
msgid "Previous HEAD position was"
msgstr ""
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
msgid "You are on a branch yet to be born"
msgstr ""
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
#, c-format
msgid "only one reference expected, %d given."
msgstr ""
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
#, c-format
msgid "invalid reference: %s"
msgstr ""
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
#, c-format
msgid "reference is not a tree: %s"
msgstr ""
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
msgid "paths cannot be used with switching branches"
msgstr ""
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
#, 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
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
#, c-format
msgid "'%s' cannot be used with '%s'"
msgstr ""
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
#, 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/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
#: builtin/remote.c:159 builtin/remote.c:161
msgid "branch"
msgstr ""
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
msgid "create and checkout a new branch"
msgstr ""
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
msgid "create/reset and checkout a branch"
msgstr ""
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
msgid "create reflog for new branch"
msgstr ""
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
msgid "detach the HEAD at named commit"
msgstr ""
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
msgid "set upstream info for new branch"
msgstr ""
-#: builtin/checkout.c:1099
-msgid "new branch"
+#: builtin/checkout.c:1098
+msgid "new-branch"
msgstr ""
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
msgid "new unparented branch"
msgstr ""
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
msgid "checkout our version for unmerged files"
msgstr ""
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
msgid "checkout their version for unmerged files"
msgstr ""
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
msgid "force checkout (throw away local modifications)"
msgstr ""
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
msgid "perform a 3-way merge with the new branch"
msgstr ""
-#: builtin/checkout.c:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
msgid "update ignored files (default)"
msgstr ""
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
msgid "style"
msgstr ""
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
msgid "conflict style (merge or diff3)"
msgstr ""
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
msgid "do not limit pathspecs to sparse entries only"
msgstr ""
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
msgid "second guess 'git checkout no-such-branch'"
msgstr ""
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
msgid "-b, -B and --orphan are mutually exclusive"
msgstr ""
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
msgid "--track needs a branch name"
msgstr ""
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
msgid "Missing branch name; try -b"
msgstr ""
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
msgid "invalid path specification"
msgstr ""
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
#, 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
+#: builtin/checkout.c:1208
#, c-format
msgid "git checkout: --detach does not take a path argument '%s'"
msgstr ""
-#: builtin/checkout.c:1213
+#: builtin/checkout.c:1212
msgid ""
"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
"checking out of the index."
@@ -3482,7 +3417,7 @@ msgstr ""
msgid "failed to remove %s"
msgstr ""
-#: builtin/clean.c:294
+#: builtin/clean.c:295
msgid ""
"Prompt help:\n"
"1 - select a numbered item\n"
@@ -3490,7 +3425,7 @@ msgid ""
" - (empty) select nothing"
msgstr ""
-#: builtin/clean.c:298
+#: builtin/clean.c:299
msgid ""
"Prompt help:\n"
"1 - select a single item\n"
@@ -3502,35 +3437,35 @@ msgid ""
" - (empty) finish selecting"
msgstr ""
-#: builtin/clean.c:516
+#: builtin/clean.c:517
#, c-format
msgid "Huh (%s)?"
msgstr ""
-#: builtin/clean.c:659
+#: builtin/clean.c:660
#, c-format
msgid "Input ignore patterns>> "
msgstr ""
-#: builtin/clean.c:696
+#: builtin/clean.c:697
#, c-format
msgid "WARNING: Cannot find items matched by: %s"
msgstr ""
-#: builtin/clean.c:717
+#: builtin/clean.c:718
msgid "Select items to delete"
msgstr ""
-#: builtin/clean.c:757
+#: builtin/clean.c:758
#, c-format
msgid "remove %s? "
msgstr ""
-#: builtin/clean.c:782
+#: builtin/clean.c:783
msgid "Bye."
msgstr ""
-#: builtin/clean.c:790
+#: builtin/clean.c:791
msgid ""
"clean - start cleaning\n"
"filter by pattern - exclude items from deletion\n"
@@ -3541,70 +3476,70 @@ msgid ""
"? - help for prompt selection"
msgstr ""
-#: builtin/clean.c:817
+#: builtin/clean.c:818
msgid "*** Commands ***"
msgstr ""
-#: builtin/clean.c:818
+#: builtin/clean.c:819
msgid "What now"
msgstr ""
-#: builtin/clean.c:826
+#: builtin/clean.c:827
msgid "Would remove the following item:"
msgid_plural "Would remove the following items:"
msgstr[0] ""
msgstr[1] ""
-#: builtin/clean.c:843
+#: builtin/clean.c:844
msgid "No more files to clean, exiting."
msgstr ""
-#: builtin/clean.c:874
+#: builtin/clean.c:875
msgid "do not print names of files removed"
msgstr ""
-#: builtin/clean.c:876
+#: builtin/clean.c:877
msgid "force"
msgstr ""
-#: builtin/clean.c:877
+#: builtin/clean.c:878
msgid "interactive cleaning"
msgstr ""
-#: builtin/clean.c:879
+#: builtin/clean.c:880
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
+#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
+#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
msgid "pattern"
msgstr ""
-#: builtin/clean.c:881
+#: builtin/clean.c:882
msgid "add <pattern> to ignore rules"
msgstr ""
-#: builtin/clean.c:882
+#: builtin/clean.c:883
msgid "remove ignored files, too"
msgstr ""
-#: builtin/clean.c:884
+#: builtin/clean.c:885
msgid "remove only ignored files"
msgstr ""
-#: builtin/clean.c:902
+#: builtin/clean.c:903
msgid "-x and -X cannot be used together"
msgstr ""
-#: builtin/clean.c:906
+#: builtin/clean.c:907
msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
"clean"
msgstr ""
-#: builtin/clean.c:909
+#: builtin/clean.c:910
msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
"refusing to clean"
msgstr ""
@@ -3613,7 +3548,7 @@ msgid "git clone [options] [--] <repo> [<dir>]"
msgstr ""
#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:521
+#: builtin/push.c:504
msgid "force progress reporting"
msgstr ""
@@ -3621,7 +3556,7 @@ msgstr ""
msgid "don't create a checkout"
msgstr ""
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
msgid "create a bare repository"
msgstr ""
@@ -3645,11 +3580,11 @@ msgstr ""
msgid "initialize submodules in the clone"
msgstr ""
-#: builtin/clone.c:82 builtin/init-db.c:485
+#: builtin/clone.c:82 builtin/init-db.c:483
msgid "template-directory"
msgstr ""
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
msgid "directory from which templates will be used"
msgstr ""
@@ -3673,7 +3608,7 @@ msgstr ""
msgid "path to git-upload-pack on the remote"
msgstr ""
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
msgid "depth"
msgstr ""
@@ -3685,11 +3620,11 @@ msgstr ""
msgid "clone only one branch, HEAD or --branch"
msgstr ""
-#: builtin/clone.c:96 builtin/init-db.c:494
+#: builtin/clone.c:96 builtin/init-db.c:492
msgid "gitdir"
msgstr ""
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
msgid "separate git dir from working tree"
msgstr ""
@@ -3947,67 +3882,67 @@ msgid ""
"the remaining commits.\n"
msgstr ""
-#: builtin/commit.c:287
+#: builtin/commit.c:288
msgid "failed to unpack HEAD tree object"
msgstr ""
-#: builtin/commit.c:329
+#: builtin/commit.c:330
msgid "unable to create temporary index"
msgstr ""
-#: builtin/commit.c:335
+#: builtin/commit.c:336
msgid "interactive add failed"
msgstr ""
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
msgid "unable to write new_index file"
msgstr ""
-#: builtin/commit.c:420
+#: builtin/commit.c:421
msgid "cannot do a partial commit during a merge."
msgstr ""
-#: builtin/commit.c:422
+#: builtin/commit.c:423
msgid "cannot do a partial commit during a cherry-pick."
msgstr ""
-#: builtin/commit.c:432
+#: builtin/commit.c:433
msgid "cannot read the index"
msgstr ""
-#: builtin/commit.c:452
+#: builtin/commit.c:453
msgid "unable to write temporary index file"
msgstr ""
-#: builtin/commit.c:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
#, c-format
msgid "invalid commit: %s"
msgstr ""
-#: builtin/commit.c:571
+#: builtin/commit.c:572
msgid "malformed --author parameter"
msgstr ""
-#: builtin/commit.c:591
+#: builtin/commit.c:592
#, c-format
msgid "Malformed ident string: '%s'"
msgstr ""
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
#, c-format
msgid "could not lookup commit %s"
msgstr ""
-#: builtin/commit.c:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 builtin/shortlog.c:273
#, c-format
msgid "(reading log message from standard input)\n"
msgstr ""
-#: builtin/commit.c:644
+#: builtin/commit.c:643
msgid "could not read log from standard input"
msgstr ""
-#: builtin/commit.c:648
+#: builtin/commit.c:647
#, c-format
msgid "could not read log file '%s'"
msgstr ""
@@ -4033,7 +3968,7 @@ msgstr ""
msgid "could not write commit template"
msgstr ""
-#: builtin/commit.c:760
+#: builtin/commit.c:764
#, c-format
msgid ""
"\n"
@@ -4043,7 +3978,7 @@ msgid ""
"and try again.\n"
msgstr ""
-#: builtin/commit.c:765
+#: builtin/commit.c:769
#, c-format
msgid ""
"\n"
@@ -4053,14 +3988,14 @@ msgid ""
"and try again.\n"
msgstr ""
-#: builtin/commit.c:777
+#: builtin/commit.c:782
#, 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
+#: builtin/commit.c:789
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
@@ -4068,351 +4003,351 @@ msgid ""
"An empty message aborts the commit.\n"
msgstr ""
-#: builtin/commit.c:795
+#: builtin/commit.c:802
#, c-format
msgid "%sAuthor: %s"
msgstr ""
-#: builtin/commit.c:802
+#: builtin/commit.c:809
#, c-format
msgid "%sCommitter: %s"
msgstr ""
-#: builtin/commit.c:822
+#: builtin/commit.c:829
msgid "Cannot read index"
msgstr ""
-#: builtin/commit.c:865
+#: builtin/commit.c:872
msgid "Error building trees"
msgstr ""
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
#, c-format
msgid "Please supply the message using either -m or -F option.\n"
msgstr ""
-#: builtin/commit.c:982
+#: builtin/commit.c:989
#, c-format
msgid "No existing author found with '%s'"
msgstr ""
-#: builtin/commit.c:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
#, c-format
msgid "Invalid untracked files mode '%s'"
msgstr ""
-#: builtin/commit.c:1034
+#: builtin/commit.c:1041
msgid "--long and -z are incompatible"
msgstr ""
-#: builtin/commit.c:1064
+#: builtin/commit.c:1071
msgid "Using both --reset-author and --author does not make sense"
msgstr ""
-#: builtin/commit.c:1075
+#: builtin/commit.c:1080
msgid "You have nothing to amend."
msgstr ""
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
msgid "You are in the middle of a merge -- cannot amend."
msgstr ""
-#: builtin/commit.c:1080
+#: builtin/commit.c:1085
msgid "You are in the middle of a cherry-pick -- cannot amend."
msgstr ""
-#: builtin/commit.c:1083
+#: builtin/commit.c:1088
msgid "Options --squash and --fixup cannot be used together"
msgstr ""
-#: builtin/commit.c:1093
+#: builtin/commit.c:1098
msgid "Only one of -c/-C/-F/--fixup can be used."
msgstr ""
-#: builtin/commit.c:1095
+#: builtin/commit.c:1100
msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
msgstr ""
-#: builtin/commit.c:1103
+#: builtin/commit.c:1108
msgid "--reset-author can be used only with -C, -c or --amend."
msgstr ""
-#: builtin/commit.c:1120
+#: builtin/commit.c:1125
msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
msgstr ""
-#: builtin/commit.c:1122
+#: builtin/commit.c:1127
msgid "No paths with --include/--only does not make sense."
msgstr ""
-#: builtin/commit.c:1124
+#: builtin/commit.c:1129
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..."
+#: builtin/commit.c:1131
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
msgstr ""
-#: builtin/commit.c:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
#, c-format
msgid "Invalid cleanup mode %s"
msgstr ""
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
msgid "Paths with -a does not make sense."
msgstr ""
-#: builtin/commit.c:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
msgid "show status concisely"
msgstr ""
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
msgid "show branch information"
msgstr ""
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
msgid "machine-readable output"
msgstr ""
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
msgid "show status in long format (default)"
msgstr ""
-#: builtin/commit.c:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
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
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
msgid "mode"
msgstr ""
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
msgstr ""
-#: builtin/commit.c:1267
+#: builtin/commit.c:1274
msgid "show ignored files"
msgstr ""
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
msgid "when"
msgstr ""
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
msgid ""
"ignore changes to submodules, optional when: all, dirty, untracked. "
"(Default: all)"
msgstr ""
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
msgid "list untracked files in columns"
msgstr ""
-#: builtin/commit.c:1340
+#: builtin/commit.c:1347
msgid "couldn't look up newly created commit"
msgstr ""
-#: builtin/commit.c:1342
+#: builtin/commit.c:1349
msgid "could not parse newly created commit"
msgstr ""
-#: builtin/commit.c:1383
+#: builtin/commit.c:1390
msgid "detached HEAD"
msgstr ""
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
msgid " (root-commit)"
msgstr ""
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
msgid "suppress summary after successful commit"
msgstr ""
-#: builtin/commit.c:1453
+#: builtin/commit.c:1487
msgid "show diff in commit message template"
msgstr ""
-#: builtin/commit.c:1455
+#: builtin/commit.c:1489
msgid "Commit message options"
msgstr ""
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
msgid "read message from file"
msgstr ""
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "author"
msgstr ""
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "override author for commit"
msgstr ""
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
msgid "date"
msgstr ""
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
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
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
msgid "message"
msgstr ""
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
msgid "commit message"
msgstr ""
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
msgid "reuse and edit message from specified commit"
msgstr ""
-#: builtin/commit.c:1461
+#: builtin/commit.c:1495
msgid "reuse message from specified commit"
msgstr ""
-#: builtin/commit.c:1462
+#: builtin/commit.c:1496
msgid "use autosquash formatted message to fixup specified commit"
msgstr ""
-#: builtin/commit.c:1463
+#: builtin/commit.c:1497
msgid "use autosquash formatted message to squash specified commit"
msgstr ""
-#: builtin/commit.c:1464
+#: builtin/commit.c:1498
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
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
msgid "add Signed-off-by:"
msgstr ""
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
msgid "use specified template file"
msgstr ""
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
msgid "force edit of commit"
msgstr ""
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
msgid "default"
msgstr ""
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
msgid "how to strip spaces and #comments from message"
msgstr ""
-#: builtin/commit.c:1469
+#: builtin/commit.c:1503
msgid "include status in commit message template"
msgstr ""
-#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
msgstr ""
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
msgid "GPG sign commit"
msgstr ""
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
msgid "Commit contents options"
msgstr ""
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
msgid "commit all changed files"
msgstr ""
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
msgid "add specified files to index for commit"
msgstr ""
-#: builtin/commit.c:1477
+#: builtin/commit.c:1511
msgid "interactively add files"
msgstr ""
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
msgid "interactively add changes"
msgstr ""
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
msgid "commit only specified files"
msgstr ""
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
msgid "bypass pre-commit hook"
msgstr ""
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
msgid "show what would be committed"
msgstr ""
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
msgid "amend previous commit"
msgstr ""
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
msgid "bypass post-rewrite hook"
msgstr ""
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
msgid "ok to record an empty change"
msgstr ""
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
msgid "ok to record a change with an empty message"
msgstr ""
-#: builtin/commit.c:1529
+#: builtin/commit.c:1562
msgid "could not parse HEAD commit"
msgstr ""
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 builtin/merge.c:518
#, c-format
msgid "could not open '%s' for reading"
msgstr ""
-#: builtin/commit.c:1574
+#: builtin/commit.c:1608
#, c-format
msgid "Corrupt MERGE_HEAD file (%s)"
msgstr ""
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
msgid "could not read MERGE_MODE"
msgstr ""
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
#, c-format
msgid "could not read commit message: %s"
msgstr ""
-#: builtin/commit.c:1611
+#: builtin/commit.c:1645
#, c-format
msgid "Aborting commit; you did not edit the message.\n"
msgstr ""
-#: builtin/commit.c:1616
+#: builtin/commit.c:1650
#, c-format
msgid "Aborting commit due to empty commit message.\n"
msgstr ""
-#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
msgid "failed to write commit object"
msgstr ""
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
msgid "cannot lock HEAD ref"
msgstr ""
-#: builtin/commit.c:1656
+#: builtin/commit.c:1690
msgid "cannot update HEAD ref"
msgstr ""
-#: builtin/commit.c:1667
+#: builtin/commit.c:1701
msgid ""
"Repository has been updated, but unable to write\n"
"new_index file. Check that disk is not full or quota is\n"
@@ -4423,127 +4358,127 @@ msgstr ""
msgid "git config [options]"
msgstr ""
-#: builtin/config.c:54
+#: builtin/config.c:53
msgid "Config file location"
msgstr ""
-#: builtin/config.c:55
+#: builtin/config.c:54
msgid "use global config file"
msgstr ""
-#: builtin/config.c:56
+#: builtin/config.c:55
msgid "use system config file"
msgstr ""
-#: builtin/config.c:57
+#: builtin/config.c:56
msgid "use repository config file"
msgstr ""
-#: builtin/config.c:58
+#: builtin/config.c:57
msgid "use given config file"
msgstr ""
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "blob-id"
msgstr ""
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "read config from given blob object"
msgstr ""
-#: builtin/config.c:60
+#: builtin/config.c:59
msgid "Action"
msgstr ""
-#: builtin/config.c:61
+#: builtin/config.c:60
msgid "get value: name [value-regex]"
msgstr ""
-#: builtin/config.c:62
+#: builtin/config.c:61
msgid "get all values: key [value-regex]"
msgstr ""
-#: builtin/config.c:63
+#: builtin/config.c:62
msgid "get values for regexp: name-regex [value-regex]"
msgstr ""
-#: builtin/config.c:64
+#: builtin/config.c:63
msgid "get value specific for the URL: section[.var] URL"
msgstr ""
-#: builtin/config.c:65
+#: builtin/config.c:64
msgid "replace all matching variables: name value [value_regex]"
msgstr ""
-#: builtin/config.c:66
+#: builtin/config.c:65
msgid "add a new variable: name value"
msgstr ""
-#: builtin/config.c:67
+#: builtin/config.c:66
msgid "remove a variable: name [value-regex]"
msgstr ""
-#: builtin/config.c:68
+#: builtin/config.c:67
msgid "remove all matches: name [value-regex]"
msgstr ""
-#: builtin/config.c:69
+#: builtin/config.c:68
msgid "rename section: old-name new-name"
msgstr ""
-#: builtin/config.c:70
+#: builtin/config.c:69
msgid "remove a section: name"
msgstr ""
-#: builtin/config.c:71
+#: builtin/config.c:70
msgid "list all"
msgstr ""
-#: builtin/config.c:72
+#: builtin/config.c:71
msgid "open an editor"
msgstr ""
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
msgid "slot"
msgstr ""
-#: builtin/config.c:73
+#: builtin/config.c:72
msgid "find the color configured: [default]"
msgstr ""
-#: builtin/config.c:74
+#: builtin/config.c:73
msgid "find the color setting: [stdout-is-tty]"
msgstr ""
-#: builtin/config.c:75
+#: builtin/config.c:74
msgid "Type"
msgstr ""
-#: builtin/config.c:76
+#: builtin/config.c:75
msgid "value is \"true\" or \"false\""
msgstr ""
-#: builtin/config.c:77
+#: builtin/config.c:76
msgid "value is decimal number"
msgstr ""
-#: builtin/config.c:78
+#: builtin/config.c:77
msgid "value is --bool or --int"
msgstr ""
-#: builtin/config.c:79
+#: builtin/config.c:78
msgid "value is a path (file or directory name)"
msgstr ""
-#: builtin/config.c:80
+#: builtin/config.c:79
msgid "Other"
msgstr ""
-#: builtin/config.c:81
+#: builtin/config.c:80
msgid "terminate values with NUL byte"
msgstr ""
-#: builtin/config.c:82
+#: builtin/config.c:81
msgid "respect include directives on lookup"
msgstr ""
@@ -4563,129 +4498,129 @@ msgstr ""
msgid "git describe [options] --dirty"
msgstr ""
-#: builtin/describe.c:237
+#: builtin/describe.c:225
#, c-format
msgid "annotated tag %s not available"
msgstr ""
-#: builtin/describe.c:241
+#: builtin/describe.c:229
#, c-format
msgid "annotated tag %s has no embedded name"
msgstr ""
-#: builtin/describe.c:243
+#: builtin/describe.c:231
#, c-format
msgid "tag '%s' is really '%s' here"
msgstr ""
-#: builtin/describe.c:270
+#: builtin/describe.c:258
#, c-format
msgid "Not a valid object name %s"
msgstr ""
-#: builtin/describe.c:273
+#: builtin/describe.c:261
#, c-format
msgid "%s is not a valid '%s' object"
msgstr ""
-#: builtin/describe.c:290
+#: builtin/describe.c:278
#, c-format
msgid "no tag exactly matches '%s'"
msgstr ""
-#: builtin/describe.c:292
+#: builtin/describe.c:280
#, c-format
msgid "searching to describe %s\n"
msgstr ""
-#: builtin/describe.c:332
+#: builtin/describe.c:327
#, c-format
msgid "finished search at %s\n"
msgstr ""
-#: builtin/describe.c:359
+#: builtin/describe.c:354
#, c-format
msgid ""
"No annotated tags can describe '%s'.\n"
"However, there were unannotated tags: try --tags."
msgstr ""
-#: builtin/describe.c:363
+#: builtin/describe.c:358
#, c-format
msgid ""
"No tags can describe '%s'.\n"
"Try --always, or create some tags."
msgstr ""
-#: builtin/describe.c:384
+#: builtin/describe.c:379
#, c-format
msgid "traversed %lu commits\n"
msgstr ""
-#: builtin/describe.c:387
+#: builtin/describe.c:382
#, c-format
msgid ""
"more than %i tags found; listed %i most recent\n"
"gave up search at %s\n"
msgstr ""
-#: builtin/describe.c:409
+#: builtin/describe.c:404
msgid "find the tag that comes after the commit"
msgstr ""
-#: builtin/describe.c:410
+#: builtin/describe.c:405
msgid "debug search strategy on stderr"
msgstr ""
-#: builtin/describe.c:411
+#: builtin/describe.c:406
msgid "use any ref"
msgstr ""
-#: builtin/describe.c:412
+#: builtin/describe.c:407
msgid "use any tag, even unannotated"
msgstr ""
-#: builtin/describe.c:413
+#: builtin/describe.c:408
msgid "always use long format"
msgstr ""
-#: builtin/describe.c:414
+#: builtin/describe.c:409
msgid "only follow first parent"
msgstr ""
-#: builtin/describe.c:417
+#: builtin/describe.c:412
msgid "only output exact matches"
msgstr ""
-#: builtin/describe.c:419
+#: builtin/describe.c:414
msgid "consider <n> most recent tags (default: 10)"
msgstr ""
-#: builtin/describe.c:421
+#: builtin/describe.c:416
msgid "only consider tags matching <pattern>"
msgstr ""
-#: builtin/describe.c:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
msgid "show abbreviated commit object as fallback"
msgstr ""
-#: builtin/describe.c:424
+#: builtin/describe.c:419
msgid "mark"
msgstr ""
-#: builtin/describe.c:425
+#: builtin/describe.c:420
msgid "append <mark> on dirty working tree (default: \"-dirty\")"
msgstr ""
-#: builtin/describe.c:443
+#: builtin/describe.c:438
msgid "--long is incompatible with --abbrev=0"
msgstr ""
-#: builtin/describe.c:469
+#: builtin/describe.c:464
msgid "No names found, cannot describe anything."
msgstr ""
-#: builtin/describe.c:489
+#: builtin/describe.c:484
msgid "--dirty is incompatible with commit-ishes"
msgstr ""
@@ -4975,7 +4910,7 @@ msgstr ""
msgid "Could not fetch %s"
msgstr ""
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
msgid ""
"No remote repository specified. Please, specify either a URL or a\n"
"remote name from which new revisions should be fetched."
@@ -5014,10 +4949,10 @@ msgstr ""
msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
msgstr ""
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702
-#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446
-#: parse-options.h:135 parse-options.h:242
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
+#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: parse-options.h:132 parse-options.h:239
msgid "n"
msgstr ""
@@ -5081,6 +5016,14 @@ msgstr ""
msgid "field name to sort on"
msgstr ""
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr ""
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr ""
+
#: builtin/fsck.c:607
msgid "git fsck [options] [<object>...]"
msgstr ""
@@ -5125,51 +5068,62 @@ msgstr ""
msgid "show progress"
msgstr ""
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr ""
+
#: builtin/gc.c:24
msgid "git gc [options]"
msgstr ""
-#: builtin/gc.c:80
+#: builtin/gc.c:90
#, c-format
msgid "Invalid %s: '%s'"
msgstr ""
-#: builtin/gc.c:107
+#: builtin/gc.c:117
#, c-format
msgid "insanely long object directory %.*s"
msgstr ""
-#: builtin/gc.c:262
+#: builtin/gc.c:273
msgid "prune unreferenced objects"
msgstr ""
-#: builtin/gc.c:264
+#: builtin/gc.c:275
msgid "be more thorough (increased runtime)"
msgstr ""
-#: builtin/gc.c:265
+#: builtin/gc.c:276
msgid "enable auto-gc mode"
msgstr ""
-#: builtin/gc.c:266
+#: builtin/gc.c:277
msgid "force running gc even if there may be another gc running"
msgstr ""
-#: builtin/gc.c:306
+#: builtin/gc.c:318
#, 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"
+msgid "Auto packing the repository in background for optimum performance.\n"
+msgstr ""
+
+#: builtin/gc.c:320
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr ""
+
+#: builtin/gc.c:321
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
msgstr ""
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:336
#, c-format
msgid ""
"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
msgstr ""
-#: builtin/gc.c:341
+#: builtin/gc.c:361
msgid ""
"There are too many unreachable loose objects; run 'git prune' to remove them."
msgstr ""
@@ -5198,209 +5152,209 @@ msgstr ""
msgid "unable to grep from object of type %s"
msgstr ""
-#: builtin/grep.c:551
+#: builtin/grep.c:549
#, c-format
msgid "switch `%c' expects a numerical value"
msgstr ""
-#: builtin/grep.c:568
+#: builtin/grep.c:566
#, c-format
msgid "cannot open '%s'"
msgstr ""
-#: builtin/grep.c:642
+#: builtin/grep.c:640
msgid "search in index instead of in the work tree"
msgstr ""
-#: builtin/grep.c:644
+#: builtin/grep.c:642
msgid "find in contents not managed by git"
msgstr ""
-#: builtin/grep.c:646
+#: builtin/grep.c:644
msgid "search in both tracked and untracked files"
msgstr ""
-#: builtin/grep.c:648
+#: builtin/grep.c:646
msgid "search also in ignored files"
msgstr ""
-#: builtin/grep.c:651
+#: builtin/grep.c:649
msgid "show non-matching lines"
msgstr ""
-#: builtin/grep.c:653
+#: builtin/grep.c:651
msgid "case insensitive matching"
msgstr ""
-#: builtin/grep.c:655
+#: builtin/grep.c:653
msgid "match patterns only at word boundaries"
msgstr ""
-#: builtin/grep.c:657
+#: builtin/grep.c:655
msgid "process binary files as text"
msgstr ""
-#: builtin/grep.c:659
+#: builtin/grep.c:657
msgid "don't match patterns in binary files"
msgstr ""
-#: builtin/grep.c:662
+#: builtin/grep.c:660
msgid "process binary files with textconv filters"
msgstr ""
-#: builtin/grep.c:664
+#: builtin/grep.c:662
msgid "descend at most <depth> levels"
msgstr ""
-#: builtin/grep.c:668
+#: builtin/grep.c:666
msgid "use extended POSIX regular expressions"
msgstr ""
-#: builtin/grep.c:671
+#: builtin/grep.c:669
msgid "use basic POSIX regular expressions (default)"
msgstr ""
-#: builtin/grep.c:674
+#: builtin/grep.c:672
msgid "interpret patterns as fixed strings"
msgstr ""
-#: builtin/grep.c:677
+#: builtin/grep.c:675
msgid "use Perl-compatible regular expressions"
msgstr ""
-#: builtin/grep.c:680
+#: builtin/grep.c:678
msgid "show line numbers"
msgstr ""
-#: builtin/grep.c:681
+#: builtin/grep.c:679
msgid "don't show filenames"
msgstr ""
-#: builtin/grep.c:682
+#: builtin/grep.c:680
msgid "show filenames"
msgstr ""
-#: builtin/grep.c:684
+#: builtin/grep.c:682
msgid "show filenames relative to top directory"
msgstr ""
-#: builtin/grep.c:686
+#: builtin/grep.c:684
msgid "show only filenames instead of matching lines"
msgstr ""
-#: builtin/grep.c:688
+#: builtin/grep.c:686
msgid "synonym for --files-with-matches"
msgstr ""
-#: builtin/grep.c:691
+#: builtin/grep.c:689
msgid "show only the names of files without match"
msgstr ""
-#: builtin/grep.c:693
+#: builtin/grep.c:691
msgid "print NUL after filenames"
msgstr ""
-#: builtin/grep.c:695
+#: builtin/grep.c:693
msgid "show the number of matches instead of matching lines"
msgstr ""
-#: builtin/grep.c:696
+#: builtin/grep.c:694
msgid "highlight matches"
msgstr ""
-#: builtin/grep.c:698
+#: builtin/grep.c:696
msgid "print empty line between matches from different files"
msgstr ""
-#: builtin/grep.c:700
+#: builtin/grep.c:698
msgid "show filename only once above matches from same file"
msgstr ""
-#: builtin/grep.c:703
+#: builtin/grep.c:701
msgid "show <n> context lines before and after matches"
msgstr ""
-#: builtin/grep.c:706
+#: builtin/grep.c:704
msgid "show <n> context lines before matches"
msgstr ""
-#: builtin/grep.c:708
+#: builtin/grep.c:706
msgid "show <n> context lines after matches"
msgstr ""
-#: builtin/grep.c:709
+#: builtin/grep.c:707
msgid "shortcut for -C NUM"
msgstr ""
-#: builtin/grep.c:712
+#: builtin/grep.c:710
msgid "show a line with the function name before matches"
msgstr ""
-#: builtin/grep.c:714
+#: builtin/grep.c:712
msgid "show the surrounding function"
msgstr ""
-#: builtin/grep.c:717
+#: builtin/grep.c:715
msgid "read patterns from file"
msgstr ""
-#: builtin/grep.c:719
+#: builtin/grep.c:717
msgid "match <pattern>"
msgstr ""
-#: builtin/grep.c:721
+#: builtin/grep.c:719
msgid "combine patterns specified with -e"
msgstr ""
-#: builtin/grep.c:733
+#: builtin/grep.c:731
msgid "indicate hit with exit status without output"
msgstr ""
-#: builtin/grep.c:735
+#: builtin/grep.c:733
msgid "show only matches from files that match all patterns"
msgstr ""
-#: builtin/grep.c:737
+#: builtin/grep.c:735
msgid "show parse tree for grep expression"
msgstr ""
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "pager"
msgstr ""
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "show matching files in the pager"
msgstr ""
-#: builtin/grep.c:744
+#: builtin/grep.c:742
msgid "allow calling of grep(1) (ignored by this build)"
msgstr ""
-#: builtin/grep.c:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
msgid "show usage"
msgstr ""
-#: builtin/grep.c:812
+#: builtin/grep.c:810
msgid "no pattern given."
msgstr ""
-#: builtin/grep.c:870
+#: builtin/grep.c:868
msgid "--open-files-in-pager only works on the worktree"
msgstr ""
-#: builtin/grep.c:893
+#: builtin/grep.c:891
msgid "--cached or --untracked cannot be used with --no-index."
msgstr ""
-#: builtin/grep.c:898
+#: builtin/grep.c:896
msgid "--no-index or --untracked cannot be used with revs."
msgstr ""
-#: builtin/grep.c:901
+#: builtin/grep.c:899
msgid "--[no-]exclude-standard cannot be used for tracked contents."
msgstr ""
-#: builtin/grep.c:909
+#: builtin/grep.c:907
msgid "both --cached and trees are given."
msgstr ""
@@ -5414,7 +5368,7 @@ msgstr ""
msgid "git hash-object --stdin-paths < <list-of-paths>"
msgstr ""
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:72 builtin/tag.c:521
msgid "type"
msgstr ""
@@ -5649,8 +5603,8 @@ msgstr ""
msgid "SHA1 COLLISION FOUND WITH %s !"
msgstr ""
-#: builtin/index-pack.c:669 builtin/pack-objects.c:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
#, c-format
msgid "unable to read %s"
msgstr ""
@@ -5916,72 +5870,70 @@ msgstr ""
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
+#. 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:418
#, c-format
msgid "%s%s Git repository in %s%s\n"
msgstr ""
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Reinitialized existing"
msgstr ""
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Initialized empty"
msgstr ""
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
msgid " shared"
msgstr ""
-#: builtin/init-db.c:441
+#: builtin/init-db.c:439
msgid "cannot tell cwd"
msgstr ""
-#: builtin/init-db.c:467
+#: builtin/init-db.c:465
msgid ""
"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
"shared[=<permissions>]] [directory]"
msgstr ""
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
msgid "permissions"
msgstr ""
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
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
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
msgid "be quiet"
msgstr ""
-#: builtin/init-db.c:525 builtin/init-db.c:530
+#: builtin/init-db.c:523 builtin/init-db.c:528
#, c-format
msgid "cannot mkdir %s"
msgstr ""
-#: builtin/init-db.c:534
+#: builtin/init-db.c:532
#, c-format
msgid "cannot chdir to %s"
msgstr ""
-#: builtin/init-db.c:556
+#: builtin/init-db.c:554
#, c-format
msgid ""
"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
"dir=<directory>)"
msgstr ""
-#: builtin/init-db.c:580
+#: builtin/init-db.c:578
msgid "Cannot access current working directory"
msgstr ""
-#: builtin/init-db.c:587
+#: builtin/init-db.c:585
#, c-format
msgid "Cannot access work tree '%s'"
msgstr ""
@@ -6244,95 +6196,95 @@ msgstr ""
msgid "Unknown commit %s"
msgstr ""
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
msgid "git ls-files [options] [<file>...]"
msgstr ""
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
msgid "identify the file status with tags"
msgstr ""
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
msgid "use lowercase letters for 'assume unchanged' files"
msgstr ""
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
msgid "show cached files in the output (default)"
msgstr ""
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
msgid "show deleted files in the output"
msgstr ""
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
msgid "show modified files in the output"
msgstr ""
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
msgid "show other files in the output"
msgstr ""
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
msgid "show ignored files in the output"
msgstr ""
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
msgid "show staged contents' object name in the output"
msgstr ""
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
msgid "show files on the filesystem that need to be removed"
msgstr ""
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
msgid "show 'other' directories' name only"
msgstr ""
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
msgid "don't show empty directories"
msgstr ""
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
msgid "show unmerged files in the output"
msgstr ""
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
msgid "show resolve-undo information"
msgstr ""
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
msgid "skip files matching pattern"
msgstr ""
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
msgid "exclude patterns are read from <file>"
msgstr ""
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
msgid "read additional per-directory exclude patterns in <file>"
msgstr ""
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
msgid "add the standard git exclusions"
msgstr ""
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
msgid "make the output relative to the project top directory"
msgstr ""
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
msgid "if any <file> is not in the index, treat this as an error"
msgstr ""
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
msgid "tree-ish"
msgstr ""
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
msgid "pretend that paths removed since <tree-ish> are still present"
msgstr ""
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
msgid "show debugging data"
msgstr ""
@@ -6443,7 +6395,7 @@ msgstr ""
msgid "Verify that the named commit has a valid GPG signature"
msgstr ""
-#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
msgid "strategy"
msgstr ""
@@ -6516,35 +6468,35 @@ msgstr ""
msgid "Bad branch.%s.mergeoptions string: %s"
msgstr ""
-#: builtin/merge.c:650
+#: builtin/merge.c:653
msgid "git write-tree failed to write a tree"
msgstr ""
-#: builtin/merge.c:678
+#: builtin/merge.c:681
msgid "Not handling anything other than two heads merge."
msgstr ""
-#: builtin/merge.c:692
+#: builtin/merge.c:695
#, c-format
msgid "Unknown option for merge-recursive: -X%s"
msgstr ""
-#: builtin/merge.c:706
+#: builtin/merge.c:709
#, c-format
msgid "unable to write %s"
msgstr ""
-#: builtin/merge.c:795
+#: builtin/merge.c:798
#, c-format
msgid "Could not read from '%s'"
msgstr ""
-#: builtin/merge.c:804
+#: builtin/merge.c:807
#, c-format
msgid "Not committing merge; use 'git commit' to complete the merge.\n"
msgstr ""
-#: builtin/merge.c:810
+#: builtin/merge.c:813
#, c-format
msgid ""
"Please enter a commit message to explain why this merge is necessary,\n"
@@ -6554,157 +6506,156 @@ msgid ""
"the commit.\n"
msgstr ""
-#: builtin/merge.c:834
+#: builtin/merge.c:837
msgid "Empty commit message."
msgstr ""
-#: builtin/merge.c:846
+#: builtin/merge.c:849
#, c-format
msgid "Wonderful.\n"
msgstr ""
-#: builtin/merge.c:911
+#: builtin/merge.c:914
#, c-format
msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
msgstr ""
-#: builtin/merge.c:927
+#: builtin/merge.c:930
#, c-format
msgid "'%s' is not a commit"
msgstr ""
-#: builtin/merge.c:968
+#: builtin/merge.c:971
msgid "No current branch."
msgstr ""
-#: builtin/merge.c:970
+#: builtin/merge.c:973
msgid "No remote for the current branch."
msgstr ""
-#: builtin/merge.c:972
+#: builtin/merge.c:975
msgid "No default upstream defined for the current branch."
msgstr ""
-#: builtin/merge.c:977
+#: builtin/merge.c:980
#, c-format
msgid "No remote-tracking branch for %s from %s"
msgstr ""
-#: builtin/merge.c:1133
+#: builtin/merge.c:1136
msgid "There is no merge to abort (MERGE_HEAD missing)."
msgstr ""
-#: builtin/merge.c:1149 git-pull.sh:31
+#: builtin/merge.c:1152 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
+#: builtin/merge.c:1155 git-pull.sh:34
msgid "You have not concluded your merge (MERGE_HEAD exists)."
msgstr ""
-#: builtin/merge.c:1156
+#: builtin/merge.c:1159
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
+#: builtin/merge.c:1162
msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
msgstr ""
-#: builtin/merge.c:1168
+#: builtin/merge.c:1171
msgid "You cannot combine --squash with --no-ff."
msgstr ""
-#: builtin/merge.c:1177
+#: builtin/merge.c:1180
msgid "No commit specified and merge.defaultToUpstream not set."
msgstr ""
-#: builtin/merge.c:1209
+#: builtin/merge.c:1212
msgid "Can merge only exactly one commit into empty head"
msgstr ""
-#: builtin/merge.c:1212
+#: builtin/merge.c:1215
msgid "Squash commit into empty head not supported yet"
msgstr ""
-#: builtin/merge.c:1214
+#: builtin/merge.c:1217
msgid "Non-fast-forward commit does not make sense into an empty head"
msgstr ""
-#: builtin/merge.c:1219
+#: builtin/merge.c:1222
#, c-format
msgid "%s - not something we can merge"
msgstr ""
-#: builtin/merge.c:1270
+#: builtin/merge.c:1273
#, c-format
msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
msgstr ""
-#: builtin/merge.c:1273
+#: builtin/merge.c:1276
#, c-format
msgid "Commit %s has a bad GPG signature allegedly by %s."
msgstr ""
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
#, c-format
msgid "Commit %s does not have a GPG signature."
msgstr ""
-#: builtin/merge.c:1279
+#: builtin/merge.c:1282
#, c-format
msgid "Commit %s has a good GPG signature by %s\n"
msgstr ""
-#: builtin/merge.c:1363
+#: builtin/merge.c:1366
#, c-format
msgid "Updating %s..%s\n"
msgstr ""
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
#, c-format
msgid "Trying really trivial in-index merge...\n"
msgstr ""
-#: builtin/merge.c:1409
+#: builtin/merge.c:1412
#, c-format
msgid "Nope.\n"
msgstr ""
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
msgid "Not possible to fast-forward, aborting."
msgstr ""
-#: builtin/merge.c:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
#, c-format
msgid "Rewinding the tree to pristine...\n"
msgstr ""
-#: builtin/merge.c:1468
+#: builtin/merge.c:1471
#, c-format
msgid "Trying merge strategy %s...\n"
msgstr ""
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
#, c-format
msgid "No merge strategy handled the merge.\n"
msgstr ""
-#: builtin/merge.c:1536
+#: builtin/merge.c:1539
#, c-format
msgid "Merge with strategy %s failed.\n"
msgstr ""
-#: builtin/merge.c:1545
+#: builtin/merge.c:1548
#, c-format
msgid "Using the %s to prepare resolving by hand.\n"
msgstr ""
-#: builtin/merge.c:1557
+#: builtin/merge.c:1560
#, c-format
msgid "Automatic merge went well; stopped before committing as requested\n"
msgstr ""
@@ -6787,19 +6738,19 @@ msgstr ""
msgid "set labels for file1/orig_file/file2"
msgstr ""
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
msgid "git mktree [-z] [--missing] [--batch]"
msgstr ""
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
msgid "input is NUL terminated"
msgstr ""
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
msgid "allow missing objects"
msgstr ""
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
msgid "allow creation of more than one tree"
msgstr ""
@@ -6846,46 +6797,46 @@ msgstr ""
msgid "Huh? %.*s is in index?"
msgstr ""
-#: builtin/mv.c:168
+#: builtin/mv.c:169
msgid "source directory is empty"
msgstr ""
-#: builtin/mv.c:200
+#: builtin/mv.c:205
msgid "not under version control"
msgstr ""
-#: builtin/mv.c:202
+#: builtin/mv.c:207
msgid "destination exists"
msgstr ""
-#: builtin/mv.c:210
+#: builtin/mv.c:215
#, c-format
msgid "overwriting '%s'"
msgstr ""
-#: builtin/mv.c:213
+#: builtin/mv.c:218
msgid "Cannot overwrite"
msgstr ""
-#: builtin/mv.c:216
+#: builtin/mv.c:221
msgid "multiple sources for the same target"
msgstr ""
-#: builtin/mv.c:218
+#: builtin/mv.c:223
msgid "destination directory does not exist"
msgstr ""
-#: builtin/mv.c:233
+#: builtin/mv.c:243
#, c-format
msgid "%s, source=%s, destination=%s"
msgstr ""
-#: builtin/mv.c:243
+#: builtin/mv.c:253
#, c-format
msgid "Renaming %s to %s\n"
msgstr ""
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
#, c-format
msgid "renaming '%s' failed"
msgstr ""
@@ -7049,7 +7000,7 @@ msgstr ""
msgid "failed to finish 'show' for object '%s'"
msgstr ""
-#: builtin/notes.c:167 builtin/tag.c:341
+#: builtin/notes.c:167 builtin/tag.c:373
#, c-format
msgid "could not create file '%s'"
msgstr ""
@@ -7058,7 +7009,7 @@ msgstr ""
msgid "Please supply the note contents using either -m or -F option"
msgstr ""
-#: builtin/notes.c:207 builtin/notes.c:844
+#: builtin/notes.c:207 builtin/notes.c:848
#, c-format
msgid "Removing note for object %s\n"
msgstr ""
@@ -7072,20 +7023,20 @@ msgstr ""
msgid "The note contents has been left in %s"
msgstr ""
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
#, c-format
msgid "cannot read '%s'"
msgstr ""
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
#, 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
+#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
+#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
+#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
+#: builtin/notes.c:843 builtin/tag.c:620
#, c-format
msgid "Failed to resolve '%s' as a valid ref."
msgstr ""
@@ -7095,304 +7046,333 @@ msgstr ""
msgid "Failed to read object '%s'."
msgstr ""
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr ""
+
+#: builtin/notes.c:316
#, c-format
msgid "Malformed input line: '%s'."
msgstr ""
-#: builtin/notes.c:327
+#: builtin/notes.c:331
#, 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
+#: builtin/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
+#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
+#: builtin/notes.c:908
msgid "too many parameters"
msgstr ""
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
#, c-format
msgid "No note found for object %s."
msgstr ""
-#: builtin/notes.c:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
msgid "note contents as a string"
msgstr ""
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
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
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
msgid "object"
msgstr ""
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
msgid "reuse and edit specified note object"
msgstr ""
-#: builtin/notes.c:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
msgid "reuse specified note object"
msgstr ""
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
msgid "replace existing notes"
msgstr ""
-#: builtin/notes.c:451
+#: builtin/notes.c:455
#, 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
+#: builtin/notes.c:460 builtin/notes.c:537
#, c-format
msgid "Overwriting existing notes for object %s\n"
msgstr ""
-#: builtin/notes.c:486
+#: builtin/notes.c:490
msgid "read objects from stdin"
msgstr ""
-#: builtin/notes.c:488
+#: builtin/notes.c:492
msgid "load rewriting config for <command> (implies --stdin)"
msgstr ""
-#: builtin/notes.c:506
+#: builtin/notes.c:510
msgid "too few parameters"
msgstr ""
-#: builtin/notes.c:527
+#: builtin/notes.c:531
#, c-format
msgid ""
"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
"existing notes"
msgstr ""
-#: builtin/notes.c:539
+#: builtin/notes.c:543
#, c-format
msgid "Missing notes on source object %s. Cannot copy."
msgstr ""
-#: builtin/notes.c:588
+#: builtin/notes.c:592
#, 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
+#: builtin/notes.c:739
msgid "General options"
msgstr ""
-#: builtin/notes.c:737
+#: builtin/notes.c:741
msgid "Merge options"
msgstr ""
-#: builtin/notes.c:739
+#: builtin/notes.c:743
msgid ""
"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
"cat_sort_uniq)"
msgstr ""
-#: builtin/notes.c:741
+#: builtin/notes.c:745
msgid "Committing unmerged notes"
msgstr ""
-#: builtin/notes.c:743
+#: builtin/notes.c:747
msgid "finalize notes merge by committing unmerged notes"
msgstr ""
-#: builtin/notes.c:745
+#: builtin/notes.c:749
msgid "Aborting notes merge resolution"
msgstr ""
-#: builtin/notes.c:747
+#: builtin/notes.c:751
msgid "abort notes merge"
msgstr ""
-#: builtin/notes.c:842
+#: builtin/notes.c:846
#, c-format
msgid "Object %s has no note\n"
msgstr ""
-#: builtin/notes.c:854
+#: builtin/notes.c:858
msgid "attempt to remove non-existent note is not an error"
msgstr ""
-#: builtin/notes.c:857
+#: builtin/notes.c:861
msgid "read object names from the standard input"
msgstr ""
-#: builtin/notes.c:938
-msgid "notes_ref"
+#: builtin/notes.c:942
+msgid "notes-ref"
msgstr ""
-#: builtin/notes.c:939
+#: builtin/notes.c:943
msgid "use notes from <notes_ref>"
msgstr ""
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
#, c-format
msgid "Unknown subcommand: %s"
msgstr ""
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
msgstr ""
-#: builtin/pack-objects.c:24
+#: builtin/pack-objects.c:26
msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
msgstr ""
-#: builtin/pack-objects.c:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
#, c-format
msgid "deflate error (%d)"
msgstr ""
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr ""
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr ""
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2530
#, c-format
msgid "unsupported index version %s"
msgstr ""
-#: builtin/pack-objects.c:2400
+#: builtin/pack-objects.c:2534
#, c-format
msgid "bad index version '%s'"
msgstr ""
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
#, c-format
msgid "option %s does not accept negative form"
msgstr ""
-#: builtin/pack-objects.c:2427
+#: builtin/pack-objects.c:2561
#, c-format
msgid "unable to parse value '%s' for option %s"
msgstr ""
-#: builtin/pack-objects.c:2446
+#: builtin/pack-objects.c:2580
msgid "do not show progress meter"
msgstr ""
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
msgid "show progress meter"
msgstr ""
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
msgid "show progress meter during object writing phase"
msgstr ""
-#: builtin/pack-objects.c:2453
+#: builtin/pack-objects.c:2587
msgid "similar to --all-progress when progress meter is shown"
msgstr ""
-#: builtin/pack-objects.c:2454
+#: builtin/pack-objects.c:2588
msgid "version[,offset]"
msgstr ""
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
msgid "write the pack index file in the specified idx format version"
msgstr ""
-#: builtin/pack-objects.c:2458
+#: builtin/pack-objects.c:2592
msgid "maximum size of each output pack file"
msgstr ""
-#: builtin/pack-objects.c:2460
+#: builtin/pack-objects.c:2594
msgid "ignore borrowed objects from alternate object store"
msgstr ""
-#: builtin/pack-objects.c:2462
+#: builtin/pack-objects.c:2596
msgid "ignore packed objects"
msgstr ""
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
msgid "limit pack window by objects"
msgstr ""
-#: builtin/pack-objects.c:2466
+#: builtin/pack-objects.c:2600
msgid "limit pack window by memory in addition to object limit"
msgstr ""
-#: builtin/pack-objects.c:2468
+#: builtin/pack-objects.c:2602
msgid "maximum length of delta chain allowed in the resulting pack"
msgstr ""
-#: builtin/pack-objects.c:2470
+#: builtin/pack-objects.c:2604
msgid "reuse existing deltas"
msgstr ""
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
msgid "reuse existing objects"
msgstr ""
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
msgid "use OFS_DELTA objects"
msgstr ""
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
msgid "use threads when searching for best delta matches"
msgstr ""
-#: builtin/pack-objects.c:2478
+#: builtin/pack-objects.c:2612
msgid "do not create an empty pack output"
msgstr ""
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
msgid "read revision arguments from standard input"
msgstr ""
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
msgid "limit the objects to those that are not yet packed"
msgstr ""
-#: builtin/pack-objects.c:2485
+#: builtin/pack-objects.c:2619
msgid "include objects reachable from any reference"
msgstr ""
-#: builtin/pack-objects.c:2488
+#: builtin/pack-objects.c:2622
msgid "include objects referred by reflog entries"
msgstr ""
-#: builtin/pack-objects.c:2491
+#: builtin/pack-objects.c:2625
msgid "output pack to stdout"
msgstr ""
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
msgid "include tag objects that refer to objects to be packed"
msgstr ""
-#: builtin/pack-objects.c:2495
+#: builtin/pack-objects.c:2629
msgid "keep unreachable objects"
msgstr ""
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
msgid "time"
msgstr ""
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
msgid "unpack unreachable objects newer than <time>"
msgstr ""
-#: builtin/pack-objects.c:2500
+#: builtin/pack-objects.c:2634
msgid "create thin packs"
msgstr ""
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
msgid "ignore packs that have companion .keep file"
msgstr ""
-#: builtin/pack-objects.c:2504
+#: builtin/pack-objects.c:2638
msgid "pack compression level"
msgstr ""
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
msgid "do not hide commits by grafts"
msgstr ""
+#: builtin/pack-objects.c:2642
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr ""
+
+#: builtin/pack-objects.c:2644
+msgid "write a bitmap index together with the pack index"
+msgstr ""
+
+#: builtin/pack-objects.c:2723
+msgid "Counting objects"
+msgstr ""
+
#: builtin/pack-refs.c:6
msgid "git pack-refs [options]"
msgstr ""
@@ -7409,6 +7389,10 @@ msgstr ""
msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
msgstr ""
+#: builtin/prune-packed.c:49
+msgid "Removing duplicate objects"
+msgstr ""
+
#: builtin/prune.c:12
msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
msgstr ""
@@ -7429,21 +7413,21 @@ msgstr ""
msgid "git push [<options>] [<repository> [<refspec>...]]"
msgstr ""
-#: builtin/push.c:86
+#: builtin/push.c:85
msgid "tag shorthand without <tag>"
msgstr ""
-#: builtin/push.c:96
+#: builtin/push.c:95
msgid "--delete only accepts plain target ref names"
msgstr ""
-#: builtin/push.c:141
+#: builtin/push.c:140
msgid ""
"\n"
"To choose either option permanently, see push.default in 'git help config'."
msgstr ""
-#: builtin/push.c:144
+#: builtin/push.c:143
#, c-format
msgid ""
"The upstream branch of your current branch does not match\n"
@@ -7458,7 +7442,7 @@ msgid ""
"%s"
msgstr ""
-#: builtin/push.c:159
+#: builtin/push.c:158
#, c-format
msgid ""
"You are not currently on a branch.\n"
@@ -7468,7 +7452,7 @@ msgid ""
" git push %s HEAD:<name-of-remote-branch>\n"
msgstr ""
-#: builtin/push.c:173
+#: builtin/push.c:172
#, c-format
msgid ""
"The current branch %s has no upstream branch.\n"
@@ -7477,12 +7461,12 @@ msgid ""
" git push --set-upstream %s %s\n"
msgstr ""
-#: builtin/push.c:181
+#: builtin/push.c:180
#, c-format
msgid "The current branch %s has multiple upstream branches, refusing to push."
msgstr ""
-#: builtin/push.c:184
+#: builtin/push.c:183
#, c-format
msgid ""
"You are pushing to remote '%s', which is not the upstream of\n"
@@ -7490,11 +7474,11 @@ msgid ""
"to update which remote branch."
msgstr ""
-#: builtin/push.c:207
+#: builtin/push.c:206
msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"push.default is unset; its implicit value has changed in\n"
"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
-"and maintain the current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
"\n"
" git config --global push.default matching\n"
"\n"
@@ -7505,7 +7489,7 @@ msgid ""
"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"
+"Since Git 2.0, Git defaults to the more conservative 'simple'\n"
"behavior, which only pushes the current branch to the corresponding\n"
"remote branch that 'git pull' uses to update the current branch.\n"
"\n"
@@ -7515,12 +7499,12 @@ msgid ""
"'current' instead of 'simple' if you sometimes use older versions of Git)"
msgstr ""
-#: builtin/push.c:274
+#: builtin/push.c:273
msgid ""
"You didn't specify any refspecs to push, and push.default is \"nothing\"."
msgstr ""
-#: builtin/push.c:281
+#: builtin/push.c:280
msgid ""
"Updates were rejected because the tip of your current branch is behind\n"
"its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -7528,15 +7512,7 @@ msgid ""
"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
+#: builtin/push.c:286
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"
@@ -7544,7 +7520,7 @@ msgid ""
"See the 'Note about fast-forwards' in 'git push --help' for details."
msgstr ""
-#: builtin/push.c:299
+#: builtin/push.c:292
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"
@@ -7553,33 +7529,33 @@ msgid ""
"See the 'Note about fast-forwards' in 'git push --help' for details."
msgstr ""
-#: builtin/push.c:306
+#: builtin/push.c:299
msgid "Updates were rejected because the tag already exists in the remote."
msgstr ""
-#: builtin/push.c:309
+#: builtin/push.c:302
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
+#: builtin/push.c:361
#, c-format
msgid "Pushing to %s\n"
msgstr ""
-#: builtin/push.c:379
+#: builtin/push.c:365
#, c-format
msgid "failed to push some refs to '%s'"
msgstr ""
-#: builtin/push.c:412
+#: builtin/push.c:395
#, c-format
msgid "bad repository '%s'"
msgstr ""
-#: builtin/push.c:413
+#: builtin/push.c:396
msgid ""
"No configured push destination.\n"
"Either specify the URL from the command-line or configure a remote "
@@ -7592,95 +7568,95 @@ msgid ""
" git push <name>\n"
msgstr ""
-#: builtin/push.c:428
+#: builtin/push.c:411
msgid "--all and --tags are incompatible"
msgstr ""
-#: builtin/push.c:429
+#: builtin/push.c:412
msgid "--all can't be combined with refspecs"
msgstr ""
-#: builtin/push.c:434
+#: builtin/push.c:417
msgid "--mirror and --tags are incompatible"
msgstr ""
-#: builtin/push.c:435
+#: builtin/push.c:418
msgid "--mirror can't be combined with refspecs"
msgstr ""
-#: builtin/push.c:440
+#: builtin/push.c:423
msgid "--all and --mirror are incompatible"
msgstr ""
-#: builtin/push.c:500
+#: builtin/push.c:483
msgid "repository"
msgstr ""
-#: builtin/push.c:501
+#: builtin/push.c:484
msgid "push all refs"
msgstr ""
-#: builtin/push.c:502
+#: builtin/push.c:485
msgid "mirror all refs"
msgstr ""
-#: builtin/push.c:504
+#: builtin/push.c:487
msgid "delete refs"
msgstr ""
-#: builtin/push.c:505
+#: builtin/push.c:488
msgid "push tags (can't be used with --all or --mirror)"
msgstr ""
-#: builtin/push.c:508
+#: builtin/push.c:491
msgid "force updates"
msgstr ""
-#: builtin/push.c:510
+#: builtin/push.c:493
msgid "refname>:<expect"
msgstr ""
-#: builtin/push.c:511
+#: builtin/push.c:494
msgid "require old value of ref to be at this value"
msgstr ""
-#: builtin/push.c:513
+#: builtin/push.c:496
msgid "check"
msgstr ""
-#: builtin/push.c:514
+#: builtin/push.c:497
msgid "control recursive pushing of submodules"
msgstr ""
-#: builtin/push.c:516
+#: builtin/push.c:499
msgid "use thin pack"
msgstr ""
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
msgid "receive pack program"
msgstr ""
-#: builtin/push.c:519
+#: builtin/push.c:502
msgid "set upstream for git pull/status"
msgstr ""
-#: builtin/push.c:522
+#: builtin/push.c:505
msgid "prune locally removed refs"
msgstr ""
-#: builtin/push.c:524
+#: builtin/push.c:507
msgid "bypass pre-push hook"
msgstr ""
-#: builtin/push.c:525
+#: builtin/push.c:508
msgid "push missing but relevant tags"
msgstr ""
-#: builtin/push.c:535
+#: builtin/push.c:518
msgid "--delete is incompatible with --all, --mirror and --tags"
msgstr ""
-#: builtin/push.c:537
+#: builtin/push.c:520
msgid "--delete doesn't make sense without any refs"
msgstr ""
@@ -8251,67 +8227,75 @@ msgstr ""
msgid "be verbose; must be placed before a subcommand"
msgstr ""
-#: builtin/repack.c:15
+#: builtin/repack.c:16
msgid "git repack [options]"
msgstr ""
-#: builtin/repack.c:143
+#: builtin/repack.c:156
msgid "pack everything in a single pack"
msgstr ""
-#: builtin/repack.c:145
+#: builtin/repack.c:158
msgid "same as -a, and turn unreachable objects loose"
msgstr ""
-#: builtin/repack.c:148
+#: builtin/repack.c:161
msgid "remove redundant packs, and run git-prune-packed"
msgstr ""
-#: builtin/repack.c:150
+#: builtin/repack.c:163
msgid "pass --no-reuse-delta to git-pack-objects"
msgstr ""
-#: builtin/repack.c:152
+#: builtin/repack.c:165
msgid "pass --no-reuse-object to git-pack-objects"
msgstr ""
-#: builtin/repack.c:154
+#: builtin/repack.c:167
msgid "do not run git-update-server-info"
msgstr ""
-#: builtin/repack.c:157
+#: builtin/repack.c:170
msgid "pass --local to git-pack-objects"
msgstr ""
-#: builtin/repack.c:158
+#: builtin/repack.c:172
+msgid "write bitmap index"
+msgstr ""
+
+#: builtin/repack.c:173
msgid "approxidate"
msgstr ""
-#: builtin/repack.c:159
+#: builtin/repack.c:174
msgid "with -A, do not loosen objects older than this"
msgstr ""
-#: builtin/repack.c:161
+#: builtin/repack.c:176
msgid "size of the window used for delta compression"
msgstr ""
-#: builtin/repack.c:162 builtin/repack.c:166
+#: builtin/repack.c:177 builtin/repack.c:181
msgid "bytes"
msgstr ""
-#: builtin/repack.c:163
+#: builtin/repack.c:178
msgid "same as the above, but limit memory size instead of entries count"
msgstr ""
-#: builtin/repack.c:165
+#: builtin/repack.c:180
msgid "limits the maximum delta depth"
msgstr ""
-#: builtin/repack.c:167
+#: builtin/repack.c:182
msgid "maximum size of each packfile"
msgstr ""
-#: builtin/repack.c:343
+#: builtin/repack.c:184
+msgid "repack objects in packs marked with .keep"
+msgstr ""
+
+#: builtin/repack.c:371
#, c-format
msgid "removing '%s' failed"
msgstr ""
@@ -8403,74 +8387,82 @@ msgstr ""
msgid "HEAD is now at %s"
msgstr ""
-#: builtin/reset.c:172
+#: builtin/reset.c:182
#, c-format
msgid "Cannot do a %s reset in the middle of a merge."
msgstr ""
-#: builtin/reset.c:262
+#: builtin/reset.c:273
msgid "be quiet, only report errors"
msgstr ""
-#: builtin/reset.c:264
+#: builtin/reset.c:275
msgid "reset HEAD and index"
msgstr ""
-#: builtin/reset.c:265
+#: builtin/reset.c:276
msgid "reset only HEAD"
msgstr ""
-#: builtin/reset.c:267 builtin/reset.c:269
+#: builtin/reset.c:278 builtin/reset.c:280
msgid "reset HEAD, index and working tree"
msgstr ""
-#: builtin/reset.c:271
+#: builtin/reset.c:282
msgid "reset HEAD but keep local changes"
msgstr ""
-#: builtin/reset.c:289
+#: builtin/reset.c:285
+msgid "record only the fact that removed paths will be added later"
+msgstr ""
+
+#: builtin/reset.c:302
#, c-format
msgid "Failed to resolve '%s' as a valid revision."
msgstr ""
-#: builtin/reset.c:292 builtin/reset.c:300
+#: builtin/reset.c:305 builtin/reset.c:313
#, c-format
msgid "Could not parse object '%s'."
msgstr ""
-#: builtin/reset.c:297
+#: builtin/reset.c:310
#, c-format
msgid "Failed to resolve '%s' as a valid tree."
msgstr ""
-#: builtin/reset.c:306
+#: builtin/reset.c:319
msgid "--patch is incompatible with --{hard,mixed,soft}"
msgstr ""
-#: builtin/reset.c:315
+#: builtin/reset.c:328
msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
msgstr ""
-#: builtin/reset.c:317
+#: builtin/reset.c:330
#, c-format
msgid "Cannot do %s reset with paths."
msgstr ""
-#: builtin/reset.c:327
+#: builtin/reset.c:340
#, c-format
msgid "%s reset is not allowed in a bare repository"
msgstr ""
#: builtin/reset.c:344
+msgid "-N can only be used with --mixed"
+msgstr ""
+
+#: builtin/reset.c:361
msgid "Unstaged changes after reset:"
msgstr ""
-#: builtin/reset.c:350
+#: builtin/reset.c:367
#, c-format
msgid "Could not reset index file to revision '%s'."
msgstr ""
-#: builtin/reset.c:355
+#: builtin/reset.c:372
msgid "Could not write new index file."
msgstr ""
@@ -8490,7 +8482,7 @@ msgstr ""
msgid "output in stuck long form"
msgstr ""
-#: builtin/rev-parse.c:486
+#: builtin/rev-parse.c:497
msgid ""
"git rev-parse --parseopt [options] -- [<args>...]\n"
" or: git rev-parse --sq-quote [<arg>...]\n"
@@ -8556,35 +8548,35 @@ msgstr ""
msgid "option for merge strategy"
msgstr ""
-#: builtin/revert.c:102
+#: builtin/revert.c:104
msgid "append commit name"
msgstr ""
-#: builtin/revert.c:103
+#: builtin/revert.c:105
msgid "allow fast-forward"
msgstr ""
-#: builtin/revert.c:104
+#: builtin/revert.c:106
msgid "preserve initially empty commits"
msgstr ""
-#: builtin/revert.c:105
+#: builtin/revert.c:107
msgid "allow commits with empty messages"
msgstr ""
-#: builtin/revert.c:106
+#: builtin/revert.c:108
msgid "keep redundant, empty commits"
msgstr ""
-#: builtin/revert.c:110
+#: builtin/revert.c:112
msgid "program error"
msgstr ""
-#: builtin/revert.c:195
+#: builtin/revert.c:197
msgid "revert failed"
msgstr ""
-#: builtin/revert.c:210
+#: builtin/revert.c:212
msgid "cherry-pick failed"
msgstr ""
@@ -8839,11 +8831,11 @@ msgstr ""
msgid "shorten ref output"
msgstr ""
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
msgid "reason"
msgstr ""
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
msgid "reason of the update"
msgstr ""
@@ -8866,32 +8858,32 @@ msgstr ""
msgid "git tag -v <tagname>..."
msgstr ""
-#: builtin/tag.c:60
+#: builtin/tag.c:67
#, c-format
msgid "malformed object at '%s'"
msgstr ""
-#: builtin/tag.c:207
+#: builtin/tag.c:239
#, c-format
msgid "tag name too long: %.*s..."
msgstr ""
-#: builtin/tag.c:212
+#: builtin/tag.c:244
#, c-format
msgid "tag '%s' not found."
msgstr ""
-#: builtin/tag.c:227
+#: builtin/tag.c:259
#, c-format
msgid "Deleted tag '%s' (was %s)\n"
msgstr ""
-#: builtin/tag.c:239
+#: builtin/tag.c:271
#, c-format
msgid "could not verify the tag '%s'"
msgstr ""
-#: builtin/tag.c:249
+#: builtin/tag.c:281
#, c-format
msgid ""
"\n"
@@ -8899,7 +8891,7 @@ msgid ""
"Lines starting with '%c' will be ignored.\n"
msgstr ""
-#: builtin/tag.c:253
+#: builtin/tag.c:285
#, c-format
msgid ""
"\n"
@@ -8908,254 +8900,271 @@ msgid ""
"want to.\n"
msgstr ""
-#: builtin/tag.c:292
+#: builtin/tag.c:324
msgid "unable to sign the tag"
msgstr ""
-#: builtin/tag.c:294
+#: builtin/tag.c:326
msgid "unable to write tag file"
msgstr ""
-#: builtin/tag.c:319
+#: builtin/tag.c:351
msgid "bad object type."
msgstr ""
-#: builtin/tag.c:332
+#: builtin/tag.c:364
msgid "tag header too big."
msgstr ""
-#: builtin/tag.c:368
+#: builtin/tag.c:400
msgid "no tag message?"
msgstr ""
-#: builtin/tag.c:374
+#: builtin/tag.c:406
#, c-format
msgid "The tag message has been left in %s\n"
msgstr ""
-#: builtin/tag.c:423
+#: builtin/tag.c:455
msgid "switch 'points-at' requires an object"
msgstr ""
-#: builtin/tag.c:425
+#: builtin/tag.c:457
#, c-format
msgid "malformed object name '%s'"
msgstr ""
-#: builtin/tag.c:445
+#: builtin/tag.c:480
+#, c-format
+msgid "unsupported sort specification %s"
+msgstr ""
+
+#: builtin/tag.c:500
msgid "list tag names"
msgstr ""
-#: builtin/tag.c:447
+#: builtin/tag.c:502
msgid "print <n> lines of each tag message"
msgstr ""
-#: builtin/tag.c:449
+#: builtin/tag.c:504
msgid "delete tags"
msgstr ""
-#: builtin/tag.c:450
+#: builtin/tag.c:505
msgid "verify tags"
msgstr ""
-#: builtin/tag.c:452
+#: builtin/tag.c:507
msgid "Tag creation options"
msgstr ""
-#: builtin/tag.c:454
+#: builtin/tag.c:509
msgid "annotated tag, needs a message"
msgstr ""
-#: builtin/tag.c:456
+#: builtin/tag.c:511
msgid "tag message"
msgstr ""
-#: builtin/tag.c:458
+#: builtin/tag.c:513
msgid "annotated and GPG-signed tag"
msgstr ""
-#: builtin/tag.c:462
+#: builtin/tag.c:517
msgid "use another key to sign the tag"
msgstr ""
-#: builtin/tag.c:463
+#: builtin/tag.c:518
msgid "replace the tag if exists"
msgstr ""
-#: builtin/tag.c:464
+#: builtin/tag.c:519
msgid "show tag list in columns"
msgstr ""
-#: builtin/tag.c:466
+#: builtin/tag.c:521
+msgid "sort tags"
+msgstr ""
+
+#: builtin/tag.c:525
msgid "Tag listing options"
msgstr ""
-#: builtin/tag.c:469
+#: builtin/tag.c:528 builtin/tag.c:534
msgid "print only tags that contain the commit"
msgstr ""
-#: builtin/tag.c:475
+#: builtin/tag.c:540
msgid "print only tags of the object"
msgstr ""
-#: builtin/tag.c:501
+#: builtin/tag.c:566
msgid "--column and -n are incompatible"
msgstr ""
-#: builtin/tag.c:518
+#: builtin/tag.c:578
+msgid "--sort and -n are incompatible"
+msgstr ""
+
+#: builtin/tag.c:585
msgid "-n option is only allowed with -l."
msgstr ""
-#: builtin/tag.c:520
+#: builtin/tag.c:587
msgid "--contains option is only allowed with -l."
msgstr ""
-#: builtin/tag.c:522
+#: builtin/tag.c:589
msgid "--points-at option is only allowed with -l."
msgstr ""
-#: builtin/tag.c:530
+#: builtin/tag.c:597
msgid "only one -F or -m option is allowed."
msgstr ""
-#: builtin/tag.c:550
+#: builtin/tag.c:617
msgid "too many params"
msgstr ""
-#: builtin/tag.c:556
+#: builtin/tag.c:623
#, c-format
msgid "'%s' is not a valid tag name."
msgstr ""
-#: builtin/tag.c:561
+#: builtin/tag.c:628
#, c-format
msgid "tag '%s' already exists"
msgstr ""
-#: builtin/tag.c:579
+#: builtin/tag.c:646
#, c-format
msgid "%s: cannot lock the ref"
msgstr ""
-#: builtin/tag.c:581
+#: builtin/tag.c:648
#, c-format
msgid "%s: cannot update the ref"
msgstr ""
-#: builtin/tag.c:583
+#: builtin/tag.c:650
#, c-format
msgid "Updated tag '%s' (was %s)\n"
msgstr ""
-#: builtin/update-index.c:402
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr ""
+
+#: builtin/update-index.c:399
msgid "git update-index [options] [--] [<file>...]"
msgstr ""
-#: builtin/update-index.c:720
+#: builtin/update-index.c:748
msgid "continue refresh even when index needs update"
msgstr ""
-#: builtin/update-index.c:723
+#: builtin/update-index.c:751
msgid "refresh: ignore submodules"
msgstr ""
-#: builtin/update-index.c:726
+#: builtin/update-index.c:754
msgid "do not ignore new files"
msgstr ""
-#: builtin/update-index.c:728
+#: builtin/update-index.c:756
msgid "let files replace directories and vice-versa"
msgstr ""
-#: builtin/update-index.c:730
+#: builtin/update-index.c:758
msgid "notice files missing from worktree"
msgstr ""
-#: builtin/update-index.c:732
+#: builtin/update-index.c:760
msgid "refresh even if index contains unmerged entries"
msgstr ""
-#: builtin/update-index.c:735
+#: builtin/update-index.c:763
msgid "refresh stat information"
msgstr ""
-#: builtin/update-index.c:739
+#: builtin/update-index.c:767
msgid "like --refresh, but ignore assume-unchanged setting"
msgstr ""
-#: builtin/update-index.c:743
-msgid "<mode> <object> <path>"
+#: builtin/update-index.c:771
+msgid "<mode>,<object>,<path>"
msgstr ""
-#: builtin/update-index.c:744
+#: builtin/update-index.c:772
msgid "add the specified entry to the index"
msgstr ""
-#: builtin/update-index.c:748
+#: builtin/update-index.c:776
msgid "(+/-)x"
msgstr ""
-#: builtin/update-index.c:749
+#: builtin/update-index.c:777
msgid "override the executable bit of the listed files"
msgstr ""
-#: builtin/update-index.c:753
+#: builtin/update-index.c:781
msgid "mark files as \"not changing\""
msgstr ""
-#: builtin/update-index.c:756
+#: builtin/update-index.c:784
msgid "clear assumed-unchanged bit"
msgstr ""
-#: builtin/update-index.c:759
+#: builtin/update-index.c:787
msgid "mark files as \"index-only\""
msgstr ""
-#: builtin/update-index.c:762
+#: builtin/update-index.c:790
msgid "clear skip-worktree bit"
msgstr ""
-#: builtin/update-index.c:765
+#: builtin/update-index.c:793
msgid "add to index only; do not add content to object database"
msgstr ""
-#: builtin/update-index.c:767
+#: builtin/update-index.c:795
msgid "remove named paths even if present in worktree"
msgstr ""
-#: builtin/update-index.c:769
+#: builtin/update-index.c:797
msgid "with --stdin: input lines are terminated by null bytes"
msgstr ""
-#: builtin/update-index.c:771
+#: builtin/update-index.c:799
msgid "read list of paths to be updated from standard input"
msgstr ""
-#: builtin/update-index.c:775
+#: builtin/update-index.c:803
msgid "add entries from standard input to the index"
msgstr ""
-#: builtin/update-index.c:779
+#: builtin/update-index.c:807
msgid "repopulate stages #2 and #3 for the listed paths"
msgstr ""
-#: builtin/update-index.c:783
+#: builtin/update-index.c:811
msgid "only update entries that differ from HEAD"
msgstr ""
-#: builtin/update-index.c:787
+#: builtin/update-index.c:815
msgid "ignore files missing from worktree"
msgstr ""
-#: builtin/update-index.c:790
+#: builtin/update-index.c:818
msgid "report actions to standard output"
msgstr ""
-#: builtin/update-index.c:792
+#: builtin/update-index.c:820
msgid "(for porcelains) forget saved unresolved conflicts"
msgstr ""
-#: builtin/update-index.c:796
+#: builtin/update-index.c:824
msgid "write index in this format"
msgstr ""
@@ -9171,19 +9180,19 @@ msgstr ""
msgid "git update-ref [options] --stdin [-z]"
msgstr ""
-#: builtin/update-ref.c:255
+#: builtin/update-ref.c:256
msgid "delete the reference"
msgstr ""
-#: builtin/update-ref.c:257
+#: builtin/update-ref.c:258
msgid "update <refname> not the one it points to"
msgstr ""
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:259
msgid "stdin has NUL-terminated arguments"
msgstr ""
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:260
msgid "read updates from stdin"
msgstr ""
@@ -9238,23 +9247,23 @@ msgid ""
"to read about a specific subcommand or concept."
msgstr ""
-#: parse-options.h:146
-msgid "expiry date"
+#: parse-options.h:143
+msgid "expiry-date"
msgstr ""
-#: parse-options.h:161
+#: parse-options.h:158
msgid "no-op (backward compatibility)"
msgstr ""
-#: parse-options.h:235
+#: parse-options.h:232
msgid "be more verbose"
msgstr ""
-#: parse-options.h:237
+#: parse-options.h:234
msgid "be more quiet"
msgstr ""
-#: parse-options.h:243
+#: parse-options.h:240
msgid "use <n> digits to display SHA-1s"
msgstr ""
@@ -9342,17 +9351,17 @@ msgstr ""
msgid "Create, list, delete or verify a tag object signed with GPG"
msgstr ""
-#: git-am.sh:50
+#: git-am.sh:52
msgid "You need to set your committer info first"
msgstr ""
-#: git-am.sh:95
+#: git-am.sh:97
msgid ""
"You seem to have moved HEAD since the last 'am' failure.\n"
"Not rewinding to ORIG_HEAD"
msgstr ""
-#: git-am.sh:105
+#: git-am.sh:107
#, sh-format
msgid ""
"When you have resolved this problem, run \"$cmdline --continue\".\n"
@@ -9360,77 +9369,77 @@ msgid ""
"To restore the original branch and stop patching, run \"$cmdline --abort\"."
msgstr ""
-#: git-am.sh:121
+#: git-am.sh:123
msgid "Cannot fall back to three-way merge."
msgstr ""
-#: git-am.sh:137
+#: git-am.sh:139
msgid "Repository lacks necessary blobs to fall back on 3-way merge."
msgstr ""
-#: git-am.sh:139
+#: git-am.sh:141
msgid "Using index info to reconstruct a base tree..."
msgstr ""
-#: git-am.sh:154
+#: git-am.sh:156
msgid ""
"Did you hand edit your patch?\n"
"It does not apply to blobs recorded in its index."
msgstr ""
-#: git-am.sh:163
+#: git-am.sh:165
msgid "Falling back to patching base and 3-way merge..."
msgstr ""
-#: git-am.sh:179
+#: git-am.sh:181
msgid "Failed to merge in the changes."
msgstr ""
-#: git-am.sh:274
+#: git-am.sh:276
msgid "Only one StGIT patch series can be applied at once"
msgstr ""
-#: git-am.sh:361
+#: git-am.sh:363
#, sh-format
msgid "Patch format $patch_format is not supported."
msgstr ""
-#: git-am.sh:363
+#: git-am.sh:365
msgid "Patch format detection failed."
msgstr ""
-#: git-am.sh:389
+#: git-am.sh:392
msgid ""
"The -b/--binary option has been a no-op for long time, and\n"
"it will be removed. Please do not use it anymore."
msgstr ""
-#: git-am.sh:479
+#: git-am.sh:486
#, sh-format
msgid "previous rebase directory $dotest still exists but mbox given."
msgstr ""
-#: git-am.sh:484
+#: git-am.sh:491
msgid "Please make up your mind. --skip or --abort?"
msgstr ""
-#: git-am.sh:520
+#: git-am.sh:527
#, sh-format
msgid ""
"Stray $dotest directory found.\n"
"Use \"git am --abort\" to remove it."
msgstr ""
-#: git-am.sh:528
+#: git-am.sh:535
msgid "Resolve operation not in progress, we are not resuming."
msgstr ""
-#: git-am.sh:594
+#: git-am.sh:601
#, sh-format
msgid "Dirty index: cannot apply patches (dirty: $files)"
msgstr ""
-#: git-am.sh:698
+#: git-am.sh:705
#, sh-format
msgid ""
"Patch is empty. Was it split wrong?\n"
@@ -9438,60 +9447,60 @@ msgid ""
"To restore the original branch and stop patching run \"$cmdline --abort\"."
msgstr ""
-#: git-am.sh:725
+#: git-am.sh:732
msgid "Patch does not have a valid e-mail address."
msgstr ""
-#: git-am.sh:772
+#: git-am.sh:779
msgid "cannot be interactive without stdin connected to a terminal."
msgstr ""
-#: git-am.sh:776
+#: git-am.sh:783
msgid "Commit Body is:"
msgstr ""
#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
#. in your translation. The program will only accept English
#. input at this point.
-#: git-am.sh:783
+#: git-am.sh:790
msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
msgstr ""
-#: git-am.sh:819
+#: git-am.sh:826
#, sh-format
msgid "Applying: $FIRSTLINE"
msgstr ""
-#: git-am.sh:840
+#: git-am.sh:847
msgid ""
"No changes - did you forget to use 'git add'?\n"
"If there is nothing left to stage, chances are that something else\n"
"already introduced the same changes; you might want to skip this patch."
msgstr ""
-#: git-am.sh:848
+#: git-am.sh:855
msgid ""
"You still have unmerged paths in your index\n"
"did you forget to use 'git add'?"
msgstr ""
-#: git-am.sh:864
+#: git-am.sh:871
msgid "No changes -- Patch already applied."
msgstr ""
-#: git-am.sh:874
+#: git-am.sh:881
#, sh-format
msgid "Patch failed at $msgnum $FIRSTLINE"
msgstr ""
-#: git-am.sh:877
+#: git-am.sh:884
#, sh-format
msgid ""
"The copy of the patch that failed is found in:\n"
" $dotest/patch"
msgstr ""
-#: git-am.sh:895
+#: git-am.sh:902
msgid "applying to an empty history"
msgstr ""
@@ -9557,8 +9566,6 @@ msgstr ""
msgid "'git bisect bad' can take only one argument."
msgstr ""
-#. have bad but not good. we could bisect although
-#. this is less optimum.
#: git-bisect.sh:273
msgid "Warning: bisecting only with a bad commit."
msgstr ""
@@ -9650,15 +9657,11 @@ msgstr ""
msgid "Pull is not possible because you have unmerged files."
msgstr ""
-#: git-pull.sh:223
+#: git-pull.sh:247
msgid "updating an unborn branch with changes added to the index"
msgstr ""
-#. The fetch involved updating the current branch.
-#. The working tree and the index file is still based on the
-#. $orig_head commit, but we are merging into $curr_head.
-#. First update the working tree to match $curr_head.
-#: git-pull.sh:247
+#: git-pull.sh:271
#, sh-format
msgid ""
"Warning: fetch updated the current branch head.\n"
@@ -9666,15 +9669,15 @@ msgid ""
"Warning: commit $orig_head."
msgstr ""
-#: git-pull.sh:272
+#: git-pull.sh:296
msgid "Cannot merge multiple branches into empty head"
msgstr ""
-#: git-pull.sh:276
+#: git-pull.sh:300
msgid "Cannot rebase onto multiple branches"
msgstr ""
-#: git-rebase.sh:55
+#: git-rebase.sh:57
msgid ""
"When you have resolved this problem, run \"git rebase --continue\".\n"
"If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
@@ -9682,58 +9685,58 @@ msgid ""
"\"."
msgstr ""
-#: git-rebase.sh:158
+#: git-rebase.sh:164
msgid "Applied autostash."
msgstr ""
-#: git-rebase.sh:161
+#: git-rebase.sh:167
#, sh-format
msgid "Cannot store $stash_sha1"
msgstr ""
-#: git-rebase.sh:162
+#: git-rebase.sh:168
msgid ""
"Applying autostash resulted in conflicts.\n"
"Your changes are safe in the stash.\n"
"You can run \"git stash pop\" or \"git stash drop\" at any time.\n"
msgstr ""
-#: git-rebase.sh:201
+#: git-rebase.sh:207
msgid "The pre-rebase hook refused to rebase."
msgstr ""
-#: git-rebase.sh:206
+#: git-rebase.sh:212
msgid "It looks like git-am is in progress. Cannot rebase."
msgstr ""
-#: git-rebase.sh:346
+#: git-rebase.sh:350
msgid "The --exec option must be used with the --interactive option"
msgstr ""
-#: git-rebase.sh:351
+#: git-rebase.sh:355
msgid "No rebase in progress?"
msgstr ""
-#: git-rebase.sh:362
+#: git-rebase.sh:366
msgid "The --edit-todo action can only be used during interactive rebase."
msgstr ""
-#: git-rebase.sh:369
+#: git-rebase.sh:373
msgid "Cannot read HEAD"
msgstr ""
-#: git-rebase.sh:372
+#: git-rebase.sh:376
msgid ""
"You must edit all merge conflicts and then\n"
"mark them as resolved using git add"
msgstr ""
-#: git-rebase.sh:390
+#: git-rebase.sh:394
#, sh-format
msgid "Could not move back to $head_name"
msgstr ""
-#: git-rebase.sh:409
+#: git-rebase.sh:413
#, sh-format
msgid ""
"It seems that there is already a $state_dir_base directory, and\n"
@@ -9746,65 +9749,64 @@ msgid ""
"valuable there."
msgstr ""
-#: git-rebase.sh:456
+#: git-rebase.sh:464
#, sh-format
msgid "invalid upstream $upstream_name"
msgstr ""
-#: git-rebase.sh:480
+#: git-rebase.sh:488
#, sh-format
msgid "$onto_name: there are more than one merge bases"
msgstr ""
-#: git-rebase.sh:483 git-rebase.sh:487
+#: git-rebase.sh:491 git-rebase.sh:495
#, sh-format
msgid "$onto_name: there is no merge base"
msgstr ""
-#: git-rebase.sh:492
+#: git-rebase.sh:500
#, sh-format
msgid "Does not point to a valid commit: $onto_name"
msgstr ""
-#: git-rebase.sh:515
+#: git-rebase.sh:523
#, sh-format
msgid "fatal: no such branch: $branch_name"
msgstr ""
-#: git-rebase.sh:548
+#: git-rebase.sh:556
msgid "Cannot autostash"
msgstr ""
-#: git-rebase.sh:553
+#: git-rebase.sh:561
#, sh-format
msgid "Created autostash: $stash_abbrev"
msgstr ""
-#: git-rebase.sh:557
+#: git-rebase.sh:565
msgid "Please commit or stash them."
msgstr ""
-#: git-rebase.sh:577
+#: git-rebase.sh:585
#, sh-format
msgid "Current branch $branch_name is up to date."
msgstr ""
-#: git-rebase.sh:581
+#: git-rebase.sh:589
#, sh-format
msgid "Current branch $branch_name is up to date, rebase forced."
msgstr ""
-#: git-rebase.sh:592
+#: git-rebase.sh:600
#, sh-format
msgid "Changes from $mb to $onto:"
msgstr ""
-#. Detach HEAD and reset the tree
-#: git-rebase.sh:601
+#: git-rebase.sh:609
msgid "First, rewinding head to replay your work on top of it..."
msgstr ""
-#: git-rebase.sh:611
+#: git-rebase.sh:619
#, sh-format
msgid "Fast-forwarded $branch_name to $onto_name."
msgstr ""
@@ -9923,21 +9925,21 @@ msgstr ""
msgid "Index was not unstashed."
msgstr ""
-#: git-stash.sh:523
+#: git-stash.sh:529
#, sh-format
msgid "Dropped ${REV} ($s)"
msgstr ""
-#: git-stash.sh:524
+#: git-stash.sh:530
#, sh-format
msgid "${REV}: Could not drop stash entry"
msgstr ""
-#: git-stash.sh:531
+#: git-stash.sh:537
msgid "No branch name specified"
msgstr ""
-#: git-stash.sh:603
+#: git-stash.sh:609
msgid "(To restore them type \"git stash apply\")"
msgstr ""
@@ -9951,31 +9953,31 @@ msgstr ""
msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
msgstr ""
-#: git-submodule.sh:281
+#: git-submodule.sh:287
#, sh-format
msgid "Clone of '$url' into submodule path '$sm_path' failed"
msgstr ""
-#: git-submodule.sh:293
+#: git-submodule.sh:299
#, sh-format
msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
msgstr ""
-#: git-submodule.sh:403
+#: git-submodule.sh:409
msgid "Relative path can only be used from the toplevel of the working tree"
msgstr ""
-#: git-submodule.sh:413
+#: git-submodule.sh:419
#, sh-format
msgid "repo URL: '$repo' must be absolute or begin with ./|../"
msgstr ""
-#: git-submodule.sh:430
+#: git-submodule.sh:436
#, sh-format
msgid "'$sm_path' already exists in the index"
msgstr ""
-#: git-submodule.sh:434
+#: git-submodule.sh:440
#, sh-format
msgid ""
"The following path is ignored by one of your .gitignore files:\n"
@@ -9983,236 +9985,235 @@ msgid ""
"Use -f if you really want to add it."
msgstr ""
-#: git-submodule.sh:452
+#: git-submodule.sh:458
#, sh-format
msgid "Adding existing repo at '$sm_path' to the index"
msgstr ""
-#: git-submodule.sh:454
+#: git-submodule.sh:460
#, sh-format
msgid "'$sm_path' already exists and is not a valid git repo"
msgstr ""
-#: git-submodule.sh:462
+#: git-submodule.sh:468
#, sh-format
msgid "A git directory for '$sm_name' is found locally with remote(s):"
msgstr ""
-#: git-submodule.sh:464
+#: git-submodule.sh:470
#, sh-format
msgid ""
"If you want to reuse this local git directory instead of cloning again from"
msgstr ""
-#: git-submodule.sh:466
+#: git-submodule.sh:472
#, sh-format
msgid ""
"use the '--force' option. If the local git directory is not the correct repo"
msgstr ""
-#: git-submodule.sh:467
+#: git-submodule.sh:473
#, sh-format
msgid ""
"or you are unsure what this means choose another name with the '--name' "
"option."
msgstr ""
-#: git-submodule.sh:469
+#: git-submodule.sh:475
#, sh-format
msgid "Reactivating local git directory for submodule '$sm_name'."
msgstr ""
-#: git-submodule.sh:481
+#: git-submodule.sh:487
#, sh-format
msgid "Unable to checkout submodule '$sm_path'"
msgstr ""
-#: git-submodule.sh:486
+#: git-submodule.sh:492
#, sh-format
msgid "Failed to add submodule '$sm_path'"
msgstr ""
-#: git-submodule.sh:495
+#: git-submodule.sh:501
#, sh-format
msgid "Failed to register submodule '$sm_path'"
msgstr ""
-#: git-submodule.sh:539
+#: git-submodule.sh:545
#, sh-format
msgid "Entering '$prefix$displaypath'"
msgstr ""
-#: git-submodule.sh:559
+#: git-submodule.sh:565
#, sh-format
msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
msgstr ""
-#: git-submodule.sh:605
+#: git-submodule.sh:611
#, sh-format
msgid "No url found for submodule path '$displaypath' in .gitmodules"
msgstr ""
-#: git-submodule.sh:614
+#: git-submodule.sh:620
#, sh-format
msgid "Failed to register url for submodule path '$displaypath'"
msgstr ""
-#: git-submodule.sh:616
+#: git-submodule.sh:622
#, sh-format
msgid "Submodule '$name' ($url) registered for path '$displaypath'"
msgstr ""
-#: git-submodule.sh:633
+#: git-submodule.sh:639
#, sh-format
msgid "Failed to register update mode for submodule path '$displaypath'"
msgstr ""
-#: git-submodule.sh:671
+#: git-submodule.sh:677
#, sh-format
msgid "Use '.' if you really want to deinitialize all submodules"
msgstr ""
-#: git-submodule.sh:688
+#: git-submodule.sh:694
#, sh-format
msgid "Submodule work tree '$displaypath' contains a .git directory"
msgstr ""
-#: git-submodule.sh:689
+#: git-submodule.sh:695
#, sh-format
msgid ""
"(use 'rm -rf' if you really want to remove it including all of its history)"
msgstr ""
-#: git-submodule.sh:695
+#: git-submodule.sh:701
#, sh-format
msgid ""
"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
"discard them"
msgstr ""
-#: git-submodule.sh:698
+#: git-submodule.sh:704
#, sh-format
msgid "Cleared directory '$displaypath'"
msgstr ""
-#: git-submodule.sh:699
+#: git-submodule.sh:705
#, sh-format
msgid "Could not remove submodule work tree '$displaypath'"
msgstr ""
-#: git-submodule.sh:702
+#: git-submodule.sh:708
#, sh-format
msgid "Could not create empty submodule directory '$displaypath'"
msgstr ""
-#: git-submodule.sh:711
+#: git-submodule.sh:717
#, sh-format
msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
msgstr ""
-#: git-submodule.sh:834
+#: git-submodule.sh:833
#, sh-format
msgid ""
"Submodule path '$displaypath' not initialized\n"
"Maybe you want to use 'update --init'?"
msgstr ""
-#: git-submodule.sh:847
+#: git-submodule.sh:846
#, sh-format
msgid "Unable to find current revision in submodule path '$displaypath'"
msgstr ""
-#: git-submodule.sh:856
+#: git-submodule.sh:855
#, sh-format
msgid "Unable to fetch in submodule path '$sm_path'"
msgstr ""
-#: git-submodule.sh:880
+#: git-submodule.sh:879
#, sh-format
msgid "Unable to fetch in submodule path '$displaypath'"
msgstr ""
+#: git-submodule.sh:893
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr ""
+
#: git-submodule.sh:894
#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr ""
+
+#: git-submodule.sh:898
+#, sh-format
msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
msgstr ""
-#: git-submodule.sh:895
+#: git-submodule.sh:899
#, sh-format
msgid "Submodule path '$displaypath': rebased into '$sha1'"
msgstr ""
-#: git-submodule.sh:900
+#: git-submodule.sh:904
#, sh-format
msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
msgstr ""
-#: git-submodule.sh:901
+#: git-submodule.sh:905
#, sh-format
msgid "Submodule path '$displaypath': merged in '$sha1'"
msgstr ""
-#: git-submodule.sh:906
+#: git-submodule.sh:910
#, sh-format
msgid ""
"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
msgstr ""
-#: git-submodule.sh:907
+#: git-submodule.sh:911
#, sh-format
msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
msgstr ""
-#: git-submodule.sh:912
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
-msgstr ""
-
-#: git-submodule.sh:913
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr ""
-
-#: git-submodule.sh:940
+#: git-submodule.sh:941
#, sh-format
msgid "Failed to recurse into submodule path '$displaypath'"
msgstr ""
-#: git-submodule.sh:1048
+#: git-submodule.sh:1049
msgid "The --cached option cannot be used with the --files option"
msgstr ""
-#. unexpected type
-#: git-submodule.sh:1096
+#: git-submodule.sh:1097
#, sh-format
msgid "unexpected mode $mod_dst"
msgstr ""
-#: git-submodule.sh:1116
+#: git-submodule.sh:1117
#, sh-format
msgid " Warn: $display_name doesn't contain commit $sha1_src"
msgstr ""
-#: git-submodule.sh:1119
+#: git-submodule.sh:1120
#, sh-format
msgid " Warn: $display_name doesn't contain commit $sha1_dst"
msgstr ""
-#: git-submodule.sh:1122
+#: git-submodule.sh:1123
#, sh-format
msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
msgstr ""
-#: git-submodule.sh:1147
+#: git-submodule.sh:1148
msgid "blob"
msgstr ""
-#: git-submodule.sh:1261
+#: git-submodule.sh:1262
#, sh-format
msgid "Failed to recurse into submodule path '$sm_path'"
msgstr ""
-#: git-submodule.sh:1325
+#: git-submodule.sh:1326
#, sh-format
msgid "Synchronizing submodule url for '$displaypath'"
msgstr ""
diff --git a/po/sv.po b/po/sv.po
index 8c3c59aa3b..f1658aad5e 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -5,10 +5,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: git 1.8.4\n"
+"Project-Id-Version: git 2.0.0\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-02-01 08:06+0800\n"
-"PO-Revision-Date: 2014-02-02 17:21+0100\n"
+"POT-Creation-Date: 2014-04-19 12:50+0800\n"
+"PO-Revision-Date: 2014-05-07 07:04+0100\n"
"Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
"Language: sv\n"
@@ -17,16 +17,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: advice.c:57
+#: advice.c:55
#, c-format
msgid "hint: %.*s\n"
msgstr "tips: %.*s\n"
-#.
-#. * Message used both when 'git commit' fails and when
-#. * other commands doing a merge do.
-#.
-#: advice.c:87
+#: advice.c:85
msgid ""
"Fix them up in the work tree,\n"
"and then use 'git add/rm <file>' as\n"
@@ -57,76 +53,76 @@ msgstr ""
msgid "git archive --remote <repo> [--exec <cmd>] --list"
msgstr "git archive --remote <arkiv> [--exec <kmd>] --list"
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
#, c-format
msgid "pathspec '%s' did not match any files"
msgstr "sökvägsangivelsen \"%s\" motsvarade inte några filer"
-#: archive.c:327
+#: archive.c:328
msgid "fmt"
msgstr "fmt"
-#: archive.c:327
+#: archive.c:328
msgid "archive format"
msgstr "arkivformat"
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
msgid "prefix"
msgstr "prefix"
-#: archive.c:329
+#: archive.c:330
msgid "prepend prefix to each pathname in the archive"
msgstr "lägg till prefix till varje sökväg i arkivet"
-#: 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
+#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2258
+#: builtin/blame.c:2259 builtin/config.c:57 builtin/fast-export.c:680
+#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
+#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
msgid "file"
msgstr "fil"
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 builtin/archive.c:89
msgid "write the archive to this file"
msgstr "skriv arkivet till filen"
-#: archive.c:333
+#: archive.c:334
msgid "read .gitattributes in working directory"
msgstr "läs .gitattributes i arbetskatalogen"
-#: archive.c:334
+#: archive.c:335
msgid "report archived files on stderr"
msgstr "rapportera arkiverade filer på standard fel"
-#: archive.c:335
+#: archive.c:336
msgid "store only"
msgstr "endast spara"
-#: archive.c:336
+#: archive.c:337
msgid "compress faster"
msgstr "komprimera snabbare"
-#: archive.c:344
+#: archive.c:345
msgid "compress better"
msgstr "komprimera bättre"
-#: archive.c:347
+#: archive.c:348
msgid "list supported archive formats"
msgstr "visa understödda arkivformat"
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
msgid "repo"
msgstr "arkiv"
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 builtin/archive.c:91
msgid "retrieve the archive from remote repository <repo>"
msgstr "hämta arkivet från fjärrarkivet <arkiv>"
-#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
msgid "command"
msgstr "kommando"
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
msgid "path to the remote git-upload-archive command"
msgstr "sökväg till kommandot git-upload-archive på fjärren"
@@ -143,83 +139,78 @@ msgstr ""
msgid "Not setting branch %s as its own upstream."
msgstr "Ställer inte in grenen %s som sin egen uppströmsgren."
-#: branch.c:82
+#: branch.c:83
#, c-format
msgid "Branch %s set up to track remote branch %s from %s by rebasing."
msgstr ""
"Grenen %s ställdes in att spåra fjärrgrenen %s från %s genom ombasering."
-#: branch.c:83
+#: branch.c:84
#, c-format
msgid "Branch %s set up to track remote branch %s from %s."
msgstr "Grenen %s ställdes in att spåra fjärrgrenen %s från %s."
-#: branch.c:87
+#: branch.c:88
#, c-format
msgid "Branch %s set up to track local branch %s by rebasing."
msgstr "Grenen %s ställdes in att spåra den lokala grenen %s genom ombasering."
-#: branch.c:88
+#: branch.c:89
#, c-format
msgid "Branch %s set up to track local branch %s."
msgstr "Grenen %s ställdes in att spåra den lokala grenen %s."
-#: branch.c:92
+#: branch.c:94
#, c-format
msgid "Branch %s set up to track remote ref %s by rebasing."
msgstr "Grenen %s ställdes in att spåra fjärreferensen %s genom ombasering."
-#: branch.c:93
+#: branch.c:95
#, c-format
msgid "Branch %s set up to track remote ref %s."
msgstr "Grenen %s ställdes in att spåra fjärreferensen %s."
-#: branch.c:97
+#: branch.c:99
#, c-format
msgid "Branch %s set up to track local ref %s by rebasing."
msgstr ""
"Grenen %s ställdes in att spåra den lokala referensen %s genom ombasering."
-#: branch.c:98
+#: branch.c:100
#, c-format
msgid "Branch %s set up to track local ref %s."
msgstr "Grenen %s ställdes in att spåra den lokala referensen %s."
-#: branch.c:118
-#, c-format
-msgid "Tracking not set up: name too long: %s"
-msgstr "Spårning har inte ställts in: namnet för långt: %s"
-
-#: branch.c:137
+#: branch.c:133
#, c-format
msgid "Not tracking: ambiguous information for ref %s"
msgstr "Spårar inte: tvetydig information för referensen %s"
-#: branch.c:182
+#: branch.c:178
#, c-format
msgid "'%s' is not a valid branch name."
msgstr "\"%s\" är inte ett giltigt grennamn."
-#: branch.c:187
+#: branch.c:183
#, c-format
msgid "A branch named '%s' already exists."
msgstr "Det finns redan en gren som heter \"%s\""
-#: branch.c:195
+#: branch.c:191
msgid "Cannot force update the current branch."
msgstr "Kan inte tvinga uppdatering av aktuell gren."
-#: branch.c:215
+#: branch.c:211
#, c-format
msgid "Cannot setup tracking information; starting point '%s' is not a branch."
msgstr "Kan inte ställa in spårning; startpunkten \"%s\" är inte en gren."
-#: branch.c:217
+#: branch.c:213
#, c-format
msgid "the requested upstream branch '%s' does not exist"
msgstr "den efterfrågade uppströmsgrenen \"%s\" finns inte"
-#: branch.c:219
+#: branch.c:215
msgid ""
"\n"
"If you are planning on basing your work on an upstream\n"
@@ -239,113 +230,113 @@ msgstr ""
"spåra dess fjärrmotsvarighet kan du använda \"git push -u\"\n"
"för att ställa in uppströmskonfigurationen när du sänder in."
-#: branch.c:264
+#: branch.c:260
#, c-format
msgid "Not a valid object name: '%s'."
msgstr "Objektnamnet är inte giltigt: \"%s\"."
-#: branch.c:284
+#: branch.c:280
#, c-format
msgid "Ambiguous object name: '%s'."
msgstr "Objektnamnet är tvetydigt: \"%s\"."
-#: branch.c:289
+#: branch.c:285
#, c-format
msgid "Not a valid branch point: '%s'."
msgstr "Avgreningspunkten är inte giltig: \"%s\""
-#: branch.c:295
+#: branch.c:291
msgid "Failed to lock ref for update"
msgstr "Misslyckades låsa referens för uppdatering"
-#: branch.c:313
+#: branch.c:309
msgid "Failed to write ref"
msgstr "Misslyckades skriva referens"
-#: bundle.c:37
+#: bundle.c:33
#, c-format
msgid "'%s' does not look like a v2 bundle file"
msgstr "'%s' ser inte ut som en v2-bundle-fil"
-#: bundle.c:64
+#: bundle.c:60
#, c-format
msgid "unrecognized header: %s%s (%d)"
msgstr "okänt huvud: %s%s (%d)"
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
#, c-format
msgid "could not open '%s'"
msgstr "kunde inte öppna \"%s\""
-#: bundle.c:141
+#: bundle.c:138
msgid "Repository lacks these prerequisite commits:"
msgstr "Arkivet saknar dessa nödvändiga incheckningar:"
-#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: bundle.c:162 sequencer.c:669 sequencer.c:1123 builtin/log.c:332
#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357
#: builtin/shortlog.c:158
msgid "revision walk setup failed"
msgstr "misslyckades skapa revisionstraversering"
-#: bundle.c:187
+#: bundle.c:184
#, c-format
msgid "The bundle contains this ref:"
msgid_plural "The bundle contains these %d refs:"
-msgstr[0] "Paketet (bundlen) denna referens:"
-msgstr[1] "Paketet (bundlen) dessa %d referenser:"
+msgstr[0] "Paketet (bundlen) innehåller denna referens:"
+msgstr[1] "Paketet (bundlen) innehåller dessa %d referenser:"
-#: bundle.c:194
+#: bundle.c:191
msgid "The bundle records a complete history."
msgstr "Paketet (bundlen) beskriver en komplett historik."
-#: bundle.c:196
+#: bundle.c:193
#, c-format
msgid "The bundle requires this ref:"
msgid_plural "The bundle requires these %d refs:"
msgstr[0] "Paketet (bundlen) kräver denna referens:"
msgstr[1] "Paketet (bundlen) kräver dessa %d referenser:"
-#: bundle.c:296
+#: bundle.c:293
msgid "rev-list died"
msgstr "rev-list dog"
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
#, c-format
msgid "unrecognized argument: %s"
msgstr "okänt argument: %s"
-#: bundle.c:337
+#: bundle.c:334
#, c-format
msgid "ref '%s' is excluded by the rev-list options"
msgstr "referensen \"%s\" exkluderas av argumenten till rev-list"
-#: bundle.c:382
+#: bundle.c:379
msgid "Refusing to create empty bundle."
msgstr "Vägrar skapa ett tomt paket (bundle)."
-#: bundle.c:398
+#: bundle.c:395
msgid "Could not spawn pack-objects"
msgstr "Kunde inte starta pack-objects"
-#: bundle.c:416
+#: bundle.c:413
msgid "pack-objects died"
msgstr "pack-objects misslyckades"
-#: bundle.c:419
+#: bundle.c:416
#, c-format
msgid "cannot create '%s'"
msgstr "kan inte skapa \"%s\""
-#: bundle.c:441
+#: bundle.c:438
msgid "index-pack died"
msgstr "index-pack dog"
-#: commit.c:53
+#: commit.c:54
#, c-format
msgid "could not parse %s"
msgstr "kunde inte tolka %s"
-#: commit.c:55
+#: commit.c:56
#, c-format
msgid "%s %s is not a commit!"
msgstr "%s %s är inte en incheckning!"
@@ -421,6 +412,7 @@ msgid_plural "%lu years"
msgstr[0] "%lu år"
msgstr[1] "%lu år"
+#. TRANSLATORS: "%s" is "<n> years"
#: date.c:149
#, c-format
msgid "%s, %lu month ago"
@@ -440,6 +432,10 @@ msgstr[1] "%lu år sedan"
msgid "failed to read orderfile '%s'"
msgstr "kunde inte läsa orderfilen \"%s\""
+#: diffcore-rename.c:517
+msgid "Performing inexact rename detection"
+msgstr "Utför onöjaktig namnbytesdetektering"
+
#: diff.c:113
#, c-format
msgid " Failed to parse dirstat cut-off percentage '%s'\n"
@@ -464,7 +460,7 @@ msgstr ""
"Hittade fel i konfigurationsvariabeln \"diff.dirstat\":\n"
"%s"
-#: diff.c:3509
+#: diff.c:3495
#, c-format
msgid ""
"Failed to parse --dirstat/-X option parameter:\n"
@@ -473,7 +469,7 @@ msgstr ""
"Misslyckades tolka argument till flaggan --dirstat/-X;\n"
"%s"
-#: diff.c:3523
+#: diff.c:3509
#, c-format
msgid "Failed to parse --submodule option parameter: '%s'"
msgstr "Misslyckades tolka argument till flaggan --submodule: \"%s\""
@@ -500,35 +496,35 @@ msgstr "kunde inte skapa temporära filen \"%s\": %s"
msgid "failed writing detached signature to '%s': %s"
msgstr "misslyckades skriva fristående signatur till \"%s\": %s"
-#: grep.c:1695
+#: grep.c:1698
#, c-format
msgid "'%s': unable to read %s"
msgstr "\"%s\" kunde inte läsa %s"
-#: grep.c:1712
+#: grep.c:1715
#, c-format
msgid "'%s': %s"
msgstr "\"%s\": %s"
-#: grep.c:1723
+#: grep.c:1726
#, c-format
msgid "'%s': short read %s"
msgstr "\"%s\": kort läsning %s"
-#: help.c:210
+#: help.c:209
#, c-format
msgid "available git commands in '%s'"
msgstr "git-kommandon tillgängliga i \"%s\""
-#: help.c:217
+#: help.c:216
msgid "git commands available from elsewhere on your $PATH"
msgstr "git-kommandon från andra platser i din $PATH"
-#: help.c:233
+#: help.c:232
msgid "The most commonly used git commands are:"
msgstr "De mest använda git-kommandona är:"
-#: help.c:290
+#: help.c:289
#, c-format
msgid ""
"'%s' appears to be a git command, but we were not\n"
@@ -537,11 +533,11 @@ msgstr ""
"\"%s\" verkar vara ett git-kommando, men vi kan inte\n"
"köra det. Kanske git-%s är trasigt?"
-#: help.c:347
+#: help.c:346
msgid "Uh oh. Your system reports no Git commands at all."
msgstr "Oj då. Ditt system rapporterar inga Git-kommandon alls."
-#: help.c:369
+#: help.c:368
#, c-format
msgid ""
"WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -550,17 +546,17 @@ msgstr ""
"VARNING: Du anropade ett Git-kommando vid namn \"%s\", som inte finns.\n"
"Fortsätter under förutsättningen att du menade \"%s\""
-#: help.c:374
+#: help.c:373
#, c-format
msgid "in %0.1f seconds automatically..."
msgstr "automatiskt om %0.1f sekunder..."
-#: help.c:381
+#: help.c:380
#, c-format
msgid "git: '%s' is not a git command. See 'git --help'."
msgstr "git: \"%s\" är inte ett git-kommando. Se \"git --help\"."
-#: help.c:385 help.c:444
+#: help.c:384 help.c:443
msgid ""
"\n"
"Did you mean this?"
@@ -574,7 +570,7 @@ msgstr[1] ""
"\n"
"Menade du ett av dessa?"
-#: help.c:440
+#: help.c:439
#, c-format
msgid "%s: %s - %s"
msgstr "%s: %s - %s"
@@ -583,7 +579,7 @@ msgstr "%s: %s - %s"
msgid "failed to read the cache"
msgstr "misslyckads läsa cachen"
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
#: builtin/clone.c:661
msgid "unable to write new index file"
msgstr "kunde inte skriva ny indexfil"
@@ -593,75 +589,73 @@ msgstr "kunde inte skriva ny indexfil"
msgid "(bad commit)\n"
msgstr "(felaktig incheckning)\n"
-#: merge-recursive.c:206
+#: merge-recursive.c:208
#, c-format
msgid "addinfo_cache failed for path '%s'"
msgstr "addinfo_cache misslyckades för sökvägen \"%s\""
-#: merge-recursive.c:269
+#: merge-recursive.c:271
msgid "error building trees"
msgstr "fel vid byggande av träd"
-#: merge-recursive.c:673
+#: merge-recursive.c:675
#, c-format
msgid "failed to create path '%s'%s"
msgstr "misslyckades skapa sökvägen \"%s\"%s"
-#: merge-recursive.c:684
+#: merge-recursive.c:686
#, c-format
msgid "Removing %s to make room for subdirectory\n"
msgstr "Tar bort %s för att göra plats för underkatalog\n"
-#. something else exists
-#. .. but not some other error (who really cares what?)
-#: merge-recursive.c:698 merge-recursive.c:719
+#: merge-recursive.c:700 merge-recursive.c:721
msgid ": perhaps a D/F conflict?"
msgstr ": kanske en K/F-konflikt?"
-#: merge-recursive.c:709
+#: merge-recursive.c:711
#, c-format
msgid "refusing to lose untracked file at '%s'"
msgstr "vägrar förlora ospårad fil vid \"%s\""
-#: merge-recursive.c:749
+#: merge-recursive.c:751
#, c-format
msgid "cannot read object %s '%s'"
msgstr "kan inte läsa objektet %s: \"%s\""
-#: merge-recursive.c:751
+#: merge-recursive.c:753
#, c-format
msgid "blob expected for %s '%s'"
msgstr "blob förväntades för %s \"%s\""
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
#, c-format
msgid "failed to open '%s'"
msgstr "misslyckades öppna \"%s\""
-#: merge-recursive.c:782
+#: merge-recursive.c:784
#, c-format
msgid "failed to symlink '%s'"
-msgstr "misslyckades ta skapa symboliska länken \"%s\""
+msgstr "misslyckades skapa symboliska länken \"%s\""
-#: merge-recursive.c:785
+#: merge-recursive.c:787
#, c-format
msgid "do not know what to do with %06o %s '%s'"
msgstr "vet inte hur %06o %s \"%s\" skall hanteras"
-#: merge-recursive.c:923
+#: merge-recursive.c:925
msgid "Failed to execute internal merge"
msgstr "Misslyckades exekvera intern sammanslagning"
-#: merge-recursive.c:927
+#: merge-recursive.c:929
#, c-format
msgid "Unable to add %s to database"
msgstr "Kunde inte lägga till %s till databasen"
-#: merge-recursive.c:943
+#: merge-recursive.c:945
msgid "unsupported object type in the tree"
msgstr "objekttyp som ej stöds upptäcktes i trädet"
-#: merge-recursive.c:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -670,7 +664,7 @@ msgstr ""
"KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
"i trädet."
-#: merge-recursive.c:1028 merge-recursive.c:1041
+#: merge-recursive.c:1030 merge-recursive.c:1043
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -679,20 +673,20 @@ msgstr ""
"KONFLIKT (%s/radera): %s raderad i %s och %s i %s. Versionen %s av %s lämnad "
"i trädet vid %s."
-#: merge-recursive.c:1082
+#: merge-recursive.c:1084
msgid "rename"
msgstr "namnbyte"
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
msgid "renamed"
msgstr "namnbytt"
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
#, c-format
msgid "%s is a directory in %s adding as %s instead"
msgstr "%s är en katalog i %s lägger till som %s istället"
-#: merge-recursive.c:1160
+#: merge-recursive.c:1162
#, c-format
msgid ""
"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -701,144 +695,144 @@ msgstr ""
"KONFLIKT (namnbyte/namnbyte): Namnbyte \"%s\"->\"%s\" på grenen \"%s\" "
"namnbyte \"%s\"->\"%s\" i \"%s\"%s"
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
msgid " (left unresolved)"
msgstr " (lämnad olöst)"
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
#, c-format
msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
msgstr ""
"KONFLIKT (namnbyte/namnbyte): Namnbyte %s->%s i %s. Namnbyte %s->%s i %s"
-#: merge-recursive.c:1249
+#: merge-recursive.c:1251
#, c-format
msgid "Renaming %s to %s and %s to %s instead"
msgstr "Byter namn på %s till %s och %s till %s istället"
-#: merge-recursive.c:1448
+#: merge-recursive.c:1450
#, c-format
msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
msgstr "KONFLIKT (namnbyte/tillägg): Namnbyte %s->%s i %s. %s tillagd i %s"
-#: merge-recursive.c:1458
+#: merge-recursive.c:1460
#, c-format
msgid "Adding merged %s"
msgstr "Lägger till sammanslagen %s"
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
#, c-format
msgid "Adding as %s instead"
msgstr "Lägger till som %s iställer"
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
#, c-format
msgid "cannot read object %s"
msgstr "kan inte läsa objektet %s"
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
#, c-format
msgid "object %s is not a blob"
msgstr "objektet %s är inte en blob"
-#: merge-recursive.c:1565
+#: merge-recursive.c:1567
msgid "modify"
msgstr "ändra"
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
msgid "modified"
msgstr "ändrad"
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
msgid "content"
msgstr "innehåll"
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
msgid "add/add"
msgstr "tillägg/tillägg"
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
#, c-format
msgid "Skipped %s (merged same as existing)"
msgstr "Hoppade över %s (sammanslagen samma som befintlig)"
-#: merge-recursive.c:1630
+#: merge-recursive.c:1632
#, c-format
msgid "Auto-merging %s"
msgstr "Slår ihop %s automatiskt"
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
msgid "submodule"
msgstr "undermodul"
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
#, c-format
msgid "CONFLICT (%s): Merge conflict in %s"
msgstr "KONFLIKT (%s): Sammanslagningskonflikt i %s"
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
#, c-format
msgid "Removing %s"
msgstr "Tar bort %s"
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
msgid "file/directory"
msgstr "fil/katalog"
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
msgid "directory/file"
msgstr "katalog/fil"
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
#, c-format
msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
msgstr ""
"KONFLIKT (%s): Det finns en katalog med namnet %s i %s. Lägger till %s som %s"
-#: merge-recursive.c:1771
+#: merge-recursive.c:1773
#, c-format
msgid "Adding %s"
msgstr "Lägger till %s"
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
msgid "Fatal merge failure, shouldn't happen."
msgstr "Ödesdigert sammanslagningsfel, borde inte inträffa."
-#: merge-recursive.c:1807
+#: merge-recursive.c:1809
msgid "Already up-to-date!"
msgstr "Redan à jour!"
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
#, c-format
msgid "merging of trees %s and %s failed"
msgstr "sammanslagning av träden %s och %s misslyckades"
-#: merge-recursive.c:1846
+#: merge-recursive.c:1848
#, c-format
msgid "Unprocessed path??? %s"
msgstr "Obehandlad sökväg??? %s"
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
msgid "Merging:"
msgstr "Slår ihop:"
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
#, c-format
msgid "found %u common ancestor:"
msgid_plural "found %u common ancestors:"
msgstr[0] "hittade %u gemensam förfader:"
msgstr[1] "hittade %u gemensamma förfäder:"
-#: merge-recursive.c:1941
+#: merge-recursive.c:1943
msgid "merge returned no commit"
msgstr "sammanslagningen returnerade ingen incheckning"
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
#, c-format
msgid "Could not parse object '%s'"
msgstr "Kunde inte tolka objektet \"%s\""
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
msgid "Unable to write index."
msgstr "Kunde inte skriva indexet."
@@ -863,33 +857,33 @@ msgstr "Vägrar skriva över anteckningar i %s (utanför refs/notes/)"
msgid "Bad %s value: '%s'"
msgstr "Felaktigt värde på %s: \"%s\""
-#: object.c:202
+#: object.c:229
#, c-format
msgid "unable to parse object: %s"
msgstr "kunde inte tolka objektet: %s"
-#: parse-options.c:537
+#: parse-options.c:532
msgid "..."
msgstr "..."
-#: parse-options.c:555
+#: parse-options.c:550
#, c-format
msgid "usage: %s"
msgstr "användning: %s"
#. TRANSLATORS: the colon here should align with the
#. one in "usage: %s" translation
-#: parse-options.c:559
+#: parse-options.c:554
#, c-format
msgid " or: %s"
msgstr " eller: %s"
-#: parse-options.c:562
+#: parse-options.c:557
#, c-format
msgid " %s"
msgstr " %s"
-#: parse-options.c:596
+#: parse-options.c:591
msgid "-NUM"
msgstr "-TAL"
@@ -940,11 +934,6 @@ msgstr "%s: \"%s\" är utanför arkivet"
msgid "Pathspec '%s' is in submodule '%.*s'"
msgstr "Sökvägsangivelsen \"%s\" är i undermodulen \"%.*s\""
-#.
-#. * We may want to substitute "this command" with a command
-#. * name. E.g. when add--interactive dies when running
-#. * "checkout -p"
-#.
#: pathspec.c:353
#, c-format
msgid "%s: pathspec magic not supported by this command: %s"
@@ -963,56 +952,73 @@ msgstr ""
"Ingenting att exkludera från med :(exkludera)-mönster.\n"
"Glömde du kanske att antingen lägga till \":/\" eller \".\"?"
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr "klart"
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"index.version satt, men värdet är ogiltigt.\n"
+"Använder version %i"
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"GIT_INDEX_VERSION satt, men värdet är ogiltigt.\n"
+"Använder version %i"
+
+#: remote.c:758
#, c-format
msgid "Cannot fetch both %s and %s to %s"
msgstr "Kan inte hämta både %s och %s till %s"
-#: remote.c:757
+#: remote.c:762
#, c-format
msgid "%s usually tracks %s, not %s"
msgstr "%s spårar vanligtvis %s, inte %s"
-#: remote.c:761
+#: remote.c:766
#, c-format
msgid "%s tracks both %s and %s"
msgstr "%s spårar både %s och %s"
-#.
-#. * This last possibility doesn't occur because
-#. * FETCH_HEAD_IGNORE entries always appear at
-#. * the end of the list.
-#.
-#: remote.c:769
+#: remote.c:774
msgid "Internal error"
msgstr "Internt fel"
-#: remote.c:1871
+#: remote.c:1948
#, c-format
msgid "Your branch is based on '%s', but the upstream is gone.\n"
msgstr "Din gren är baserad på \"%s\", men den har försvunnit uppströms.\n"
-#: remote.c:1875
+#: remote.c:1952
msgid " (use \"git branch --unset-upstream\" to fixup)\n"
msgstr " (använd \"git branch --unset-upstream\" för att rätta)\n"
-#: remote.c:1878
+#: remote.c:1955
#, c-format
msgid "Your branch is up-to-date with '%s'.\n"
msgstr "Din gren är à jour med \"%s\".\n"
-#: remote.c:1882
+#: remote.c:1959
#, c-format
msgid "Your branch is ahead of '%s' by %d commit.\n"
msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
msgstr[0] "Din gren ligger före \"%s\" med %d incheckning.\n"
msgstr[1] "Din gren ligger före \"%s\" med %d incheckningar.\n"
-#: remote.c:1888
+#: remote.c:1965
msgid " (use \"git push\" to publish your local commits)\n"
msgstr " (använd \"git push\" för att publicera dina lokala incheckningar)\n"
-#: remote.c:1891
+#: remote.c:1968
#, c-format
msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
msgid_plural ""
@@ -1022,11 +1028,11 @@ msgstr[0] ""
msgstr[1] ""
"Din gren ligger efter \"%s\" med %d incheckningar, och kan snabbspolas.\n"
-#: remote.c:1899
+#: remote.c:1976
msgid " (use \"git pull\" to update your local branch)\n"
msgstr " (använd \"git pull\" för att uppdatera din lokala gren)\n"
-#: remote.c:1902
+#: remote.c:1979
#, c-format
msgid ""
"Your branch and '%s' have diverged,\n"
@@ -1041,7 +1047,7 @@ msgstr[1] ""
"Din gren och \"%s\" har divergerat,\n"
"och har %d respektive %d olika incheckningar.\n"
-#: remote.c:1912
+#: remote.c:1989
msgid " (use \"git pull\" to merge the remote branch into yours)\n"
msgstr " (använd \"git pull\" för att slå ihop fjärrgrenen med din egen)\n"
@@ -1054,14 +1060,14 @@ msgstr "misslyckades öppna /dev/null"
msgid "dup2(%d,%d) failed"
msgstr "dup2(%d,%d) misslyckades"
-#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896
-#: builtin/merge.c:1006 builtin/merge.c:1016
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
#, c-format
msgid "Could not open '%s' for writing"
msgstr "Kunde inte öppna \"%s\" för skrivning"
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786
-#: builtin/merge.c:1008 builtin/merge.c:1021
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
#, c-format
msgid "Could not write to '%s'"
msgstr "Kunde inte skriva till \"%s\""
@@ -1084,7 +1090,7 @@ msgstr ""
"med \"git add <sökvägar>\" eller \"git rm <sökvägar>\"\n"
"och checka in resultatet med \"git commit\""
-#: sequencer.c:245 sequencer.c:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
#, c-format
msgid "Could not write to %s"
msgstr "Kunde inte skriva till %s"
@@ -1120,184 +1126,184 @@ msgstr "Kunde inte bestämma HEAD:s incheckning\n"
msgid "Unable to update cache tree\n"
msgstr "Kan inte uppdatera cacheträd\n"
-#: sequencer.c:423
+#: sequencer.c:430
#, c-format
msgid "Could not parse commit %s\n"
msgstr "Kunde inte tolka incheckningen %s\n"
-#: sequencer.c:428
+#: sequencer.c:435
#, c-format
msgid "Could not parse parent commit %s\n"
msgstr "Kunde inte tolka föräldraincheckningen %s\n"
-#: sequencer.c:494
+#: sequencer.c:501
msgid "Your index file is unmerged."
msgstr "Din indexfil har inte slagits ihop."
-#: sequencer.c:513
+#: sequencer.c:520
#, c-format
msgid "Commit %s is a merge but no -m option was given."
msgstr "Incheckning %s är en sammanslagning, men flaggan -m angavs inte."
-#: sequencer.c:521
+#: sequencer.c:528
#, c-format
msgid "Commit %s does not have parent %d"
msgstr "Incheckning %s har inte förälder %d"
-#: sequencer.c:525
+#: sequencer.c:532
#, c-format
msgid "Mainline was specified but commit %s is not a merge."
msgstr "Huvudlinje angavs, men incheckningen %s är inte en sammanslagning"
#. TRANSLATORS: The first %s will be "revert" or
#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:538
+#: sequencer.c:545
#, c-format
msgid "%s: cannot parse parent commit %s"
msgstr "%s: kan inte tolka föräldraincheckningen %s"
-#: sequencer.c:542
+#: sequencer.c:549
#, c-format
msgid "Cannot get commit message for %s"
msgstr "Kan inte hämta incheckningsmeddelande för %s"
-#: sequencer.c:628
+#: sequencer.c:635
#, c-format
msgid "could not revert %s... %s"
msgstr "kunde inte ångra %s... %s"
-#: sequencer.c:629
+#: sequencer.c:636
#, c-format
msgid "could not apply %s... %s"
msgstr "kunde inte tillämpa %s... %s"
-#: sequencer.c:665
+#: sequencer.c:672
msgid "empty commit set passed"
msgstr "den angivna uppsättningen incheckningar är tom"
-#: sequencer.c:673
+#: sequencer.c:680
#, c-format
msgid "git %s: failed to read the index"
msgstr "git %s: misslyckades läsa indexet"
-#: sequencer.c:678
+#: sequencer.c:685
#, c-format
msgid "git %s: failed to refresh the index"
msgstr "git %s: misslyckades uppdatera indexet"
-#: sequencer.c:736
+#: sequencer.c:743
#, c-format
msgid "Cannot %s during a %s"
msgstr "kan inte %s under en %s"
-#: sequencer.c:758
+#: sequencer.c:765
#, c-format
msgid "Could not parse line %d."
msgstr "Kan inte tolka rad %d."
-#: sequencer.c:763
+#: sequencer.c:770
msgid "No commits parsed."
msgstr "Inga incheckningar lästes."
-#: sequencer.c:776
+#: sequencer.c:783
#, c-format
msgid "Could not open %s"
msgstr "Kunde inte öppna %s"
-#: sequencer.c:780
+#: sequencer.c:787
#, c-format
msgid "Could not read %s."
msgstr "kunde inte läsa %s."
-#: sequencer.c:787
+#: sequencer.c:794
#, c-format
msgid "Unusable instruction sheet: %s"
msgstr "Oanvändbart manus: %s"
-#: sequencer.c:815
+#: sequencer.c:824
#, c-format
msgid "Invalid key: %s"
msgstr "Felaktig nyckel: %s"
-#: sequencer.c:818
+#: sequencer.c:827
#, c-format
msgid "Invalid value for %s: %s"
msgstr "Felaktigt värde för %s: %s"
-#: sequencer.c:830
+#: sequencer.c:839
#, c-format
msgid "Malformed options sheet: %s"
msgstr "Trasigt manus: %s"
-#: sequencer.c:851
+#: sequencer.c:860
msgid "a cherry-pick or revert is already in progress"
msgstr "en \"cherry-pick\" eller \"revert\" pågår redan"
-#: sequencer.c:852
+#: sequencer.c:861
msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
msgstr "testa \"git cherry-pick (--continue | --quit | --abort)\""
-#: sequencer.c:856
+#: sequencer.c:865
#, c-format
msgid "Could not create sequencer directory %s"
msgstr "Kunde inte skapa \"sequencer\"-katalogen \"%s\""
-#: sequencer.c:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
#, c-format
msgid "Error wrapping up %s."
msgstr "Fel vid ombrytning av %s."
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
msgid "no cherry-pick or revert in progress"
msgstr "ingen \"cherry-pick\" eller \"revert\" pågår"
-#: sequencer.c:893
+#: sequencer.c:902
msgid "cannot resolve HEAD"
msgstr "kan inte bestämma HEAD"
-#: sequencer.c:895
+#: sequencer.c:904
msgid "cannot abort from a branch yet to be born"
msgstr "kan inte avbryta från en gren som ännu inte är född"
-#: sequencer.c:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
#, c-format
msgid "cannot open %s: %s"
msgstr "kan inte öppna %s: %s"
-#: sequencer.c:920
+#: sequencer.c:929
#, c-format
msgid "cannot read %s: %s"
msgstr "kan inte läsa %s: %s"
-#: sequencer.c:921
+#: sequencer.c:930
msgid "unexpected end of file"
msgstr "oväntat filslut"
-#: sequencer.c:927
+#: sequencer.c:936
#, c-format
msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
msgstr "sparad HEAD-fil från före \"cherry-pick\", \"%s\", är trasig"
-#: sequencer.c:950
+#: sequencer.c:959
#, c-format
msgid "Could not format %s."
msgstr "Kunde inte formatera %s."
-#: sequencer.c:1093
+#: sequencer.c:1104
#, c-format
msgid "%s: can't cherry-pick a %s"
msgstr "%s: kan inte göra \"cherry-pick\" på typen \"%s\""
-#: sequencer.c:1096
+#: sequencer.c:1107
#, c-format
msgid "%s: bad revision"
msgstr "%s: felaktig revision"
-#: sequencer.c:1130
+#: sequencer.c:1141
msgid "Can't revert as initial commit"
msgstr "Kan inte ångra som första incheckning"
-#: sequencer.c:1131
+#: sequencer.c:1142
msgid "Can't cherry-pick into empty head"
msgstr "Kan inte göra \"cherry-pick\" i ett tomt huvud"
@@ -1323,21 +1329,21 @@ msgstr ""
"Undersök referenserna och ta kanske bort dem. Stäng av meddelandet\n"
"genom att köra \"git config advice.objectNameWarning false\""
-#: sha1_name.c:1070
+#: sha1_name.c:1072
msgid "HEAD does not point to a branch"
msgstr "HEAD pekar inte på en gren"
-#: sha1_name.c:1073
+#: sha1_name.c:1075
#, c-format
msgid "No such branch: '%s'"
msgstr "Okänd gren: \"%s\""
-#: sha1_name.c:1075
+#: sha1_name.c:1077
#, c-format
msgid "No upstream configured for branch '%s'"
msgstr "Ingen standarduppström angiven för grenen \"%s\""
-#: sha1_name.c:1079
+#: sha1_name.c:1081
#, c-format
msgid "Upstream branch '%s' not stored as a remote-tracking branch"
msgstr "Uppströmsgrenen \"%s\" är inte lagrad som en fjärrspårande gren"
@@ -1353,52 +1359,34 @@ msgstr ""
msgid "Could not find section in .gitmodules where path=%s"
msgstr "Hittade inte någon sektion i .gitmodules där sökväg=%s"
-#. Maybe the user already did that, don't error out here
#: submodule.c:76
#, c-format
msgid "Could not update .gitmodules entry %s"
msgstr "Kunde inte uppdatera .gitmodules-posten %s"
-#. Maybe the user already did that, don't error out here
#: submodule.c:109
#, c-format
msgid "Could not remove .gitmodules entry for %s"
msgstr "Kunde inte ta bort .gitmodules-posten för %s"
-#: submodule.c:127
-msgid "could not find .gitmodules in index"
-msgstr "kunde inte hitta .gitmodules i indexet"
-
-#: submodule.c:133
-msgid "reading updated .gitmodules failed"
-msgstr "misslyckades läsa uppdaterad .gitmodules"
-
-#: submodule.c:135
-msgid "unable to stat updated .gitmodules"
-msgstr "kan inte ta status på uppdaterad .gitmodules"
-
-#: submodule.c:139
-msgid "unable to remove .gitmodules from index"
-msgstr "kan inte ta bort .gitmodules från indexet"
-
-#: submodule.c:141
-msgid "adding updated .gitmodules failed"
-msgstr "misslyckades lägga till uppdaterad .gitmodules"
-
-#: submodule.c:143
+#: submodule.c:120
msgid "staging updated .gitmodules failed"
msgstr "misslyckades köa uppdaterad .gitmodules"
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 builtin/init-db.c:363
#, c-format
msgid "Could not create git link %s"
msgstr "Kunde inte skapa gitlänk %s"
-#: submodule.c:1155
+#: submodule.c:1132
#, c-format
msgid "Could not set core.worktree in %s"
msgstr "Kunde inte sätta core.worktree i %s"
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr "Checkar ut filer"
+
#: urlmatch.c:120
msgid "invalid URL scheme name or missing '://' suffix"
msgstr "ogiltig URL-schemanamn eller saknat \"://\"-suffix"
@@ -1508,88 +1496,97 @@ msgid " (use \"git %s <file>...\" to include in what will be committed)"
msgstr ""
" (använd \"git %s <fil>...\" för att ta med i det som skall checkas in)"
-#: wt-status.c:254
-msgid "bug"
-msgstr "programfel"
-
-#: wt-status.c:259
+#: wt-status.c:252
msgid "both deleted:"
msgstr "borttaget av bägge:"
-#: wt-status.c:260
+#: wt-status.c:254
msgid "added by us:"
msgstr "tillagt av oss:"
-#: wt-status.c:261
+#: wt-status.c:256
msgid "deleted by them:"
msgstr "borttaget av dem:"
-#: wt-status.c:262
+#: wt-status.c:258
msgid "added by them:"
msgstr "tillagt av dem:"
-#: wt-status.c:263
+#: wt-status.c:260
msgid "deleted by us:"
msgstr "borttaget av oss:"
-#: wt-status.c:264
+#: wt-status.c:262
msgid "both added:"
msgstr "tillagt av bägge:"
-#: wt-status.c:265
+#: wt-status.c:264
msgid "both modified:"
msgstr "ändrat av bägge:"
-#: wt-status.c:275
-msgid "new file"
-msgstr "ny fil"
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "programfel: ej hanterad \"unmerged\"-status %x"
-#: wt-status.c:277
-msgid "copied"
-msgstr "kopierad"
+#: wt-status.c:274
+msgid "new file:"
+msgstr "ny fil:"
-#: wt-status.c:279
-msgid "deleted"
-msgstr "borttagen"
+#: wt-status.c:276
+msgid "copied:"
+msgstr "kopierad:"
-#: wt-status.c:285
-msgid "typechange"
-msgstr "typbyte"
+#: wt-status.c:278
+msgid "deleted:"
+msgstr "borttagen:"
-#: wt-status.c:287
-msgid "unknown"
-msgstr "okänd"
+#: wt-status.c:280
+msgid "modified:"
+msgstr "ändrad:"
-#: wt-status.c:289
-msgid "unmerged"
-msgstr "osammanslagen"
+#: wt-status.c:282
+msgid "renamed:"
+msgstr "namnbytt:"
-#: wt-status.c:336
+#: wt-status.c:284
+msgid "typechange:"
+msgstr "typbyte:"
+
+#: wt-status.c:286
+msgid "unknown:"
+msgstr "okänd:"
+
+#: wt-status.c:288
+msgid "unmerged:"
+msgstr "osammanslagen:"
+
+#: wt-status.c:370
msgid "new commits, "
msgstr "nya incheckningar, "
-#: wt-status.c:338
+#: wt-status.c:372
msgid "modified content, "
msgstr "ändrat innehåll, "
-#: wt-status.c:340
+#: wt-status.c:374
msgid "untracked content, "
msgstr "ospårat innehåll, "
-#: wt-status.c:357
+#: wt-status.c:391
#, c-format
msgid "bug: unhandled diff status %c"
msgstr "programfel: diff-status %c ej hanterad"
-#: wt-status.c:732
+#: wt-status.c:765
msgid "Submodules changed but not updated:"
msgstr "Undermoduler ändrade men inte uppdaterade:"
-#: wt-status.c:734
+#: wt-status.c:767
msgid "Submodule changes to be committed:"
msgstr "Undermodulers ändringar att checka in:"
-#: wt-status.c:836
+#: wt-status.c:846
msgid ""
"Do not touch the line above.\n"
"Everything below will be removed."
@@ -1597,68 +1594,68 @@ msgstr ""
"Rör inte raden ovan.\n"
"Allt nedan kommer tas bort."
-#: wt-status.c:899
+#: wt-status.c:937
msgid "You have unmerged paths."
msgstr "Du har ej sammanslagna sökvägar."
-#: wt-status.c:902
+#: wt-status.c:940
msgid " (fix conflicts and run \"git commit\")"
msgstr " (rätta konflikter och kör \"git commit\")"
-#: wt-status.c:905
+#: wt-status.c:943
msgid "All conflicts fixed but you are still merging."
msgstr "Alla konflikter har rättats men du är fortfarande i en sammanslagning."
-#: wt-status.c:908
+#: wt-status.c:946
msgid " (use \"git commit\" to conclude merge)"
msgstr " (använd \"git commit\" för att slutföra sammanslagningen)"
-#: wt-status.c:918
+#: wt-status.c:956
msgid "You are in the middle of an am session."
msgstr "Du är i mitten av en körning av \"git am\"."
-#: wt-status.c:921
+#: wt-status.c:959
msgid "The current patch is empty."
msgstr "Aktuell patch är tom."
-#: wt-status.c:925
+#: wt-status.c:963
msgid " (fix conflicts and then run \"git am --continue\")"
msgstr " (rätta konflikter och kör sedan \"git am --continue\")"
-#: wt-status.c:927
+#: wt-status.c:965
msgid " (use \"git am --skip\" to skip this patch)"
msgstr " (använd \"git am --skip\" för att hoppa över patchen)"
-#: wt-status.c:929
+#: wt-status.c:967
msgid " (use \"git am --abort\" to restore the original branch)"
msgstr " (använd \"git am --abort\" för att återställa ursprungsgrenen)"
-#: wt-status.c:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
#, c-format
msgid "You are currently rebasing branch '%s' on '%s'."
msgstr "Du håller på att ombasera grenen \"%s\" ovanpå \"%s\"."
-#: wt-status.c:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
msgid "You are currently rebasing."
msgstr "Du håller på med en ombasering."
-#: wt-status.c:997
+#: wt-status.c:1035
msgid " (fix conflicts and then run \"git rebase --continue\")"
msgstr " (rätta konflikter och kör sedan \"git rebase --continue\")"
-#: wt-status.c:999
+#: wt-status.c:1037
msgid " (use \"git rebase --skip\" to skip this patch)"
msgstr " (använd \"git rebase --skip\" för att hoppa över patchen)"
-#: wt-status.c:1001
+#: wt-status.c:1039
msgid " (use \"git rebase --abort\" to check out the original branch)"
msgstr " (använd \"git rebase --abort\" för att checka ut ursprungsgrenen)"
-#: wt-status.c:1014
+#: wt-status.c:1052
msgid " (all conflicts fixed: run \"git rebase --continue\")"
msgstr " (alla konflikter rättade: kör \"git rebase --continue\")"
-#: wt-status.c:1018
+#: wt-status.c:1056
#, c-format
msgid ""
"You are currently splitting a commit while rebasing branch '%s' on '%s'."
@@ -1666,118 +1663,118 @@ msgstr ""
"Du håller på att dela upp en incheckning medan du ombaserar grenen \"%s\" "
"ovanpå \"%s\"."
-#: wt-status.c:1023
+#: wt-status.c:1061
msgid "You are currently splitting a commit during a rebase."
msgstr "Du håller på att dela upp en incheckning i en ombasering."
-#: wt-status.c:1026
+#: wt-status.c:1064
msgid " (Once your working directory is clean, run \"git rebase --continue\")"
msgstr " (Så fort din arbetskatalog är ren, kör \"git rebase --continue\")"
-#: wt-status.c:1030
+#: wt-status.c:1068
#, c-format
msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
msgstr ""
"Du håller på att redigera en incheckning medan du ombaserar grenen \"%s\" "
"ovanpå \"%s\"."
-#: wt-status.c:1035
+#: wt-status.c:1073
msgid "You are currently editing a commit during a rebase."
msgstr "Du håller på att redigera en incheckning under en ombasering."
-#: wt-status.c:1038
+#: wt-status.c:1076
msgid " (use \"git commit --amend\" to amend the current commit)"
msgstr ""
" (använd \"git commit --amend\" för att lägga till på aktuell incheckning)"
-#: wt-status.c:1040
+#: wt-status.c:1078
msgid ""
" (use \"git rebase --continue\" once you are satisfied with your changes)"
msgstr " (använd \"git rebase --continue\" när du är nöjd med dina ändringar)"
-#: wt-status.c:1050
+#: wt-status.c:1088
#, c-format
msgid "You are currently cherry-picking commit %s."
msgstr "Du håller på med en \"cherry-pick\" av incheckningen %s."
-#: wt-status.c:1055
+#: wt-status.c:1093
msgid " (fix conflicts and run \"git cherry-pick --continue\")"
msgstr " (rätta konflikter och kör sedan \"git cherry-pick --continue\")"
-#: wt-status.c:1058
+#: wt-status.c:1096
msgid " (all conflicts fixed: run \"git cherry-pick --continue\")"
msgstr " (alla konflikter rättade: kör \"git cherry-pick --continue\")"
-#: wt-status.c:1060
+#: wt-status.c:1098
msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
msgstr ""
" (använd \"git cherry-pick --abort\" för att avbryta \"cherry-pick\"-"
"operationen)"
-#: wt-status.c:1069
+#: wt-status.c:1107
#, c-format
msgid "You are currently reverting commit %s."
msgstr "Du håller på med att ångra incheckningen %s."
-#: wt-status.c:1074
+#: wt-status.c:1112
msgid " (fix conflicts and run \"git revert --continue\")"
msgstr " (rätta konflikter och kör sedan \"git revert --continue\")"
-#: wt-status.c:1077
+#: wt-status.c:1115
msgid " (all conflicts fixed: run \"git revert --continue\")"
msgstr " (alla konflikter rättade: kör \"git revert --continue\")"
-#: wt-status.c:1079
+#: wt-status.c:1117
msgid " (use \"git revert --abort\" to cancel the revert operation)"
msgstr " (använd \"git revert --abort\" för att avbryta ångrandet)"
-#: wt-status.c:1090
+#: wt-status.c:1128
#, c-format
msgid "You are currently bisecting, started from branch '%s'."
msgstr "Du håller på med en \"bisect\", startad från grenen \"%s\"."
-#: wt-status.c:1094
+#: wt-status.c:1132
msgid "You are currently bisecting."
msgstr "Du håller på med en \"bisect\"."
-#: wt-status.c:1097
+#: wt-status.c:1135
msgid " (use \"git bisect reset\" to get back to the original branch)"
msgstr ""
" (använd \"git bisect reset\" för att komma tillbaka till ursprungsgrenen)"
-#: wt-status.c:1272
+#: wt-status.c:1310
msgid "On branch "
msgstr "PÃ¥ grenen "
-#: wt-status.c:1279
+#: wt-status.c:1317
msgid "rebase in progress; onto "
msgstr "ombasering pågår; ovanpå"
-#: wt-status.c:1286
+#: wt-status.c:1324
msgid "HEAD detached at "
msgstr "HEAD frånkopplad vid "
-#: wt-status.c:1288
+#: wt-status.c:1326
msgid "HEAD detached from "
msgstr "HEAD frånkopplad från "
-#: wt-status.c:1291
+#: wt-status.c:1329
msgid "Not currently on any branch."
msgstr "Inte på någon gren för närvarande."
-#: wt-status.c:1308
+#: wt-status.c:1346
msgid "Initial commit"
msgstr "Första incheckning"
-#: wt-status.c:1322
+#: wt-status.c:1360
msgid "Untracked files"
msgstr "Ospårade filer"
-#: wt-status.c:1324
+#: wt-status.c:1362
msgid "Ignored files"
msgstr "Ignorerade filer"
-#: wt-status.c:1328
+#: wt-status.c:1366
#, c-format
msgid ""
"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1789,32 +1786,32 @@ msgstr ""
"lägga till nya filer själv (se \"git help status\")."
# %s är nästa sträng eller tom.
-#: wt-status.c:1334
+#: wt-status.c:1372
#, c-format
msgid "Untracked files not listed%s"
msgstr "Ospårade filer visas ej%s"
-#: wt-status.c:1336
+#: wt-status.c:1374
msgid " (use -u option to show untracked files)"
msgstr " (använd flaggan -u för att visa ospårade filer)"
-#: wt-status.c:1342
+#: wt-status.c:1380
msgid "No changes"
msgstr "Inga ändringar"
-#: wt-status.c:1347
+#: wt-status.c:1385
#, c-format
msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
msgstr ""
"inga ändringar att checka in (använd \"git add\" och/eller \"git commit -a"
"\")\n"
-#: wt-status.c:1350
+#: wt-status.c:1388
#, c-format
msgid "no changes added to commit\n"
msgstr "inga ändringar att checka in\n"
-#: wt-status.c:1353
+#: wt-status.c:1391
#, c-format
msgid ""
"nothing added to commit but untracked files present (use \"git add\" to "
@@ -1823,279 +1820,198 @@ msgstr ""
"inget köat för incheckning, men ospårade filer finns (spåra med \"git add"
"\")\n"
-#: wt-status.c:1356
+#: wt-status.c:1394
#, c-format
msgid "nothing added to commit but untracked files present\n"
msgstr "inget köat för incheckning, men ospårade filer finns\n"
-#: wt-status.c:1359
+#: wt-status.c:1397
#, c-format
msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
msgstr "inget att checka in (skapa/kopiera filer och spåra med \"git add\")\n"
-#: wt-status.c:1362 wt-status.c:1367
+#: wt-status.c:1400 wt-status.c:1405
#, c-format
msgid "nothing to commit\n"
msgstr "inget att checka in\n"
-#: wt-status.c:1365
+#: wt-status.c:1403
#, c-format
msgid "nothing to commit (use -u to show untracked files)\n"
msgstr "inget att checka in (använd -u för att visa ospårade filer)\n"
-#: wt-status.c:1369
+#: wt-status.c:1407
#, c-format
msgid "nothing to commit, working directory clean\n"
msgstr "inget att checka in, arbetskatalogen ren\n"
-#: wt-status.c:1478
+#: wt-status.c:1516
msgid "HEAD (no branch)"
msgstr "HEAD (ingen gren)"
-#: wt-status.c:1484
+#: wt-status.c:1522
msgid "Initial commit on "
msgstr "Första incheckning på "
-#: wt-status.c:1514
+#: wt-status.c:1554
msgid "gone"
msgstr "försvunnen"
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
msgid "behind "
msgstr "efter "
-#: wt-status.c:1519 wt-status.c:1522
-msgid "ahead "
-msgstr "före "
-
-#: wt-status.c:1524
-msgid ", behind "
-msgstr ", efter "
-
#: compat/precompose_utf8.c:55 builtin/clone.c:356
#, c-format
msgid "failed to unlink '%s'"
msgstr "misslyckades ta bort länken \"%s\""
-#: builtin/add.c:20
+#: builtin/add.c:21
msgid "git add [options] [--] <pathspec>..."
msgstr "git add [flaggor] [--] <sökväg>..."
-#.
-#. * 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 ""
-"Beteendet för \"git add %s (eller %s)\" utan sökvägsargument från en\n"
-"underkatalog i ett träd kommer ändras i Git 2.0 och bör inte längre "
-"användas.\n"
-"För att lägga till innehållet för hela trädet, använd:\n"
-"\n"
-" git add %s :/\n"
-" (eller git add %s :/)\n"
-"\n"
-"För att begränsa kommandot till aktuell katalog, använd:\n"
-"\n"
-" git add %s .\n"
-" (eller git add %s .)\n"
-"\n"
-"I nuvarande version av Git begränsas kommandot till aktuell katalog.\n"
-
-#: 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 ""
-"Du körde \"git add\" utan varken \"-A (--all)\" eller \"--ignore-removal\".\n"
-"Beteendet kommer ändras i Git 2.0 vad gäller sökvägar du tagit bort.\n"
-"Sökvägar som \"%s\", som har\n"
-"tagits bort från din arbetskatalog ignoreras i den här versionen av Git.\n"
-"\n"
-"* \"git add --ignore-removal <sökväg>\", som är förvalet just nu,\n"
-" ignorerar sökvägar du har tagit bort från arbetskatalogen.\n"
-"\n"
-"* \"git add --all <sökväg>\" låter dig även registrera borttagningarna.\n"
-"\n"
-"Kör \"git status\" för att kontrollera sökvägarna du tagit bort från\n"
-"arbetskatalogen.\n"
-
-#: builtin/add.c:144
+#: builtin/add.c:64
#, c-format
msgid "unexpected diff status %c"
msgstr "diff-status %c förväntades inte"
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
msgid "updating files failed"
msgstr "misslyckades uppdatera filer"
-#: builtin/add.c:163
+#: builtin/add.c:79
#, c-format
msgid "remove '%s'\n"
msgstr "ta bort \"%s\"\n"
-#: builtin/add.c:237
+#: builtin/add.c:133
msgid "Unstaged changes after refreshing the index:"
msgstr "Ospårade ändringar efter att ha uppdaterat indexet:"
-#: builtin/add.c:299
+#: builtin/add.c:193
msgid "Could not read the index"
msgstr "Kunde inte läsa indexet"
-#: builtin/add.c:310
+#: builtin/add.c:204
#, c-format
msgid "Could not open '%s' for writing."
msgstr "Kunde inte öppna \"%s\" för skrivning"
-#: builtin/add.c:314
+#: builtin/add.c:208
msgid "Could not write patch"
msgstr "Kunde inte skriva patch"
-#: builtin/add.c:319
+#: builtin/add.c:213
#, c-format
msgid "Could not stat '%s'"
msgstr "Kunde inte ta status på \"%s\""
-#: builtin/add.c:321
+#: builtin/add.c:215
msgid "Empty patch. Aborted."
msgstr "Tom patch. Avbryter."
-#: builtin/add.c:327
+#: builtin/add.c:221
#, c-format
msgid "Could not apply '%s'"
msgstr "Kunde inte tillämpa \"%s\""
-#: builtin/add.c:337
+#: builtin/add.c:231
msgid "The following paths are ignored by one of your .gitignore files:\n"
msgstr "Följande sökvägar ignoreras av en av dina .gitignore-filer:\n"
-#: builtin/add.c: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/add.c:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
+#: builtin/prune-packed.c:77 builtin/push.c:489 builtin/remote.c:1344
#: builtin/rm.c:269
msgid "dry run"
msgstr "testkörning"
-#: 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/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
+#: builtin/commit.c:1256 builtin/count-objects.c:95 builtin/fsck.c:612
#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113
msgid "be verbose"
msgstr "var pratsam"
-#: builtin/add.c:357
+#: builtin/add.c:251
msgid "interactive picking"
msgstr "plocka interaktivt"
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
msgid "select hunks interactively"
msgstr "välj stycken interaktivt"
-#: builtin/add.c:359
+#: builtin/add.c:253
msgid "edit current diff and apply"
msgstr "redigera aktuell diff och applicera"
-#: builtin/add.c:360
+#: builtin/add.c:254
msgid "allow adding otherwise ignored files"
msgstr "tillåt lägga till annars ignorerade filer"
-#: builtin/add.c:361
+#: builtin/add.c:255
msgid "update tracked files"
msgstr "uppdatera spårade filer"
-#: builtin/add.c:362
+#: builtin/add.c:256
msgid "record only the fact that the path will be added later"
msgstr "registrera endast att sökvägen kommer läggas till senare"
-#: builtin/add.c:363
+#: builtin/add.c:257
msgid "add changes from all tracked and untracked files"
msgstr "lägg till ändringar från alla spårade och ospårade filer"
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
msgid "ignore paths removed in the working tree (same as --no-all)"
msgstr "ignorera sökvägar borttagna i arbetskatalogen (samma som --no-all)"
-#: builtin/add.c:368
+#: builtin/add.c:262
msgid "don't add, only refresh the index"
msgstr "lägg inte till, uppdatera endast indexet"
-#: builtin/add.c:369
+#: builtin/add.c:263
msgid "just skip files which cannot be added because of errors"
msgstr "hoppa bara över filer som inte kan läggas till på grund av fel"
-#: builtin/add.c:370
+#: builtin/add.c:264
msgid "check if - even missing - files are ignored in dry run"
msgstr "se om - även saknade - filer ignoreras i testkörning"
-#: builtin/add.c:392
+#: builtin/add.c:286
#, c-format
msgid "Use -f if you really want to add them.\n"
msgstr "Använd -f om du verkligen vill lägga till dem.\n"
-#: builtin/add.c:393
+#: builtin/add.c:287
msgid "no files added"
msgstr "inga filer har lagts till"
-#: builtin/add.c:399
+#: builtin/add.c:293
msgid "adding files failed"
msgstr "misslyckades lägga till filer"
-#: builtin/add.c:438
+#: builtin/add.c:330
msgid "-A and -u are mutually incompatible"
msgstr "-A och -u är ömsesidigt inkompatibla"
-#: builtin/add.c:456
+#: builtin/add.c:337
msgid "Option --ignore-missing can only be used together with --dry-run"
msgstr "Flaggan --ignore-missing kan endast användas tillsammans med --dry-run"
-#: builtin/add.c:486
+#: builtin/add.c:358
#, c-format
msgid "Nothing specified, nothing added.\n"
msgstr "Inget angivet, inget tillagt.\n"
-#: builtin/add.c:487
+#: builtin/add.c:359
#, c-format
msgid "Maybe you wanted to say 'git add .'?\n"
msgstr "Kanske menade du att skriva \"git add .\"?\n"
-#: 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
+#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:920
+#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 builtin/rm.c:299
msgid "index file corrupt"
msgstr "indexfilen trasig"
-#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
msgid "Unable to write new index file"
msgstr "Kunde inte skriva ny indexfil"
@@ -2207,7 +2123,6 @@ msgstr "** varning: filen %s blir tom men har inte tagits bort"
msgid "corrupt binary patch at line %d: %.*s"
msgstr "trasig binärpatch på rad %d: %.*s"
-#. there has to be one hunk (forward hunk)
#: builtin/apply.c:1900
#, c-format
msgid "unrecognized binary patch at line %d"
@@ -2348,7 +2263,7 @@ msgstr "%s: patchen kan inte tillämpas"
msgid "Checking patch %s..."
msgstr "Kontrollerar patchen %s..."
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
#, c-format
msgid "make_cache_entry failed for path '%s'"
msgstr "make_cache_entry misslyckades för sökvägen \"%s\""
@@ -2397,7 +2312,6 @@ msgstr "Tillämpade patchen %s rent."
msgid "internal error"
msgstr "internt fel"
-#. Say this even without --verbose
#: builtin/apply.c:4043
#, c-format
msgid "Applying patch %%s with %d reject..."
@@ -2489,7 +2403,7 @@ msgstr "försök en trevägssammanslagning om patchen inte kan tillämpas"
msgid "build a temporary index based on embedded index information"
msgstr "bygg ett temporärt index baserat på inbyggd indexinformation"
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
msgid "paths are separated with NUL character"
msgstr "sökvägar avdelas med NUL-tecken"
@@ -2627,95 +2541,95 @@ msgstr "git blame [flaggor] [rev-flaggor] [rev] [--] fil"
msgid "[rev-opts] are documented in git-rev-list(1)"
msgstr "[rev-flaggor] dokumenteras i git-rev-list(1)"
-#: builtin/blame.c:2249
+#: builtin/blame.c:2242
msgid "Show blame entries as we find them, incrementally"
msgstr "Visa klandringsposter när vi hittar dem, interaktivt"
-#: builtin/blame.c:2250
+#: builtin/blame.c:2243
msgid "Show blank SHA-1 for boundary commits (Default: off)"
msgstr "Visa blank SHA-1 för gränsincheckningar (Standard: av)"
-#: builtin/blame.c:2251
+#: builtin/blame.c:2244
msgid "Do not treat root commits as boundaries (Default: off)"
msgstr "Behandla inte rotincheckningar som gränser (Standard: av)"
-#: builtin/blame.c:2252
+#: builtin/blame.c:2245
msgid "Show work cost statistics"
msgstr "Visa statistik över arbetskostnad"
-#: builtin/blame.c:2253
+#: builtin/blame.c:2246
msgid "Show output score for blame entries"
msgstr "Visa utdatapoäng för klandringsposter"
-#: builtin/blame.c:2254
+#: builtin/blame.c:2247
msgid "Show original filename (Default: auto)"
msgstr "Visa originalfilnamn (Standard: auto)"
-#: builtin/blame.c:2255
+#: builtin/blame.c:2248
msgid "Show original linenumber (Default: off)"
msgstr "Visa ursprungligt radnummer (Standard: av)"
-#: builtin/blame.c:2256
+#: builtin/blame.c:2249
msgid "Show in a format designed for machine consumption"
msgstr "Visa i ett format avsett för maskinkonsumtion"
-#: builtin/blame.c:2257
+#: builtin/blame.c:2250
msgid "Show porcelain format with per-line commit information"
msgstr "Visa porslinsformat med per-rad-incheckningsinformation"
-#: builtin/blame.c:2258
+#: builtin/blame.c:2251
msgid "Use the same output mode as git-annotate (Default: off)"
msgstr "Använd samma utdataläge som git-annotate (Standard: av)"
-#: builtin/blame.c:2259
+#: builtin/blame.c:2252
msgid "Show raw timestamp (Default: off)"
msgstr "Visa rå tidsstämpel (Standard: av)"
-#: builtin/blame.c:2260
+#: builtin/blame.c:2253
msgid "Show long commit SHA1 (Default: off)"
msgstr "Visa lång inchecknings-SHA1 (Standard: av)"
-#: builtin/blame.c:2261
+#: builtin/blame.c:2254
msgid "Suppress author name and timestamp (Default: off)"
msgstr "Undertryck författarnamn och tidsstämpel (Standard: av)"
-#: builtin/blame.c:2262
+#: builtin/blame.c:2255
msgid "Show author email instead of name (Default: off)"
msgstr "Visa författarens e-post istället för namn (Standard: av)"
-#: builtin/blame.c:2263
+#: builtin/blame.c:2256
msgid "Ignore whitespace differences"
msgstr "Ignorera ändringar i blanksteg"
-#: builtin/blame.c:2264
+#: builtin/blame.c:2257
msgid "Spend extra cycles to find better match"
msgstr "Slösa extra cykler med att hitta bättre träff"
-#: builtin/blame.c:2265
+#: builtin/blame.c:2258
msgid "Use revisions from <file> instead of calling git-rev-list"
msgstr "Använd revisioner från <fil> istället för att anropa git-rev-list"
-#: builtin/blame.c:2266
+#: builtin/blame.c:2259
msgid "Use <file>'s contents as the final image"
msgstr "Använd <fil>s innehåll som slutgiltig bild"
-#: builtin/blame.c:2267 builtin/blame.c:2268
+#: builtin/blame.c:2260 builtin/blame.c:2261
msgid "score"
msgstr "poäng"
-#: builtin/blame.c:2267
+#: builtin/blame.c:2260
msgid "Find line copies within and across files"
msgstr "Hitta kopierade rader inuti och mellan filer"
-#: builtin/blame.c:2268
+#: builtin/blame.c:2261
msgid "Find line movements within and across files"
msgstr "Hitta flyttade rader inuti och mellan filer"
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
msgid "n,m"
msgstr "n,m"
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
msgid "Process only line range n,m, counting from 1"
msgstr "Behandla endast radintervallet n,m, med början på 1"
@@ -2958,8 +2872,9 @@ msgid "act on remote-tracking branches"
msgstr "arbeta på fjärrspårande grenar"
#: 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
+#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
+#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
+#: builtin/tag.c:533
msgid "commit"
msgstr "incheckning"
@@ -3145,43 +3060,43 @@ msgstr "Behöver ett arkiv för att skapa ett paket (bundle)."
msgid "Need a repository to unbundle."
msgstr "Behöver ett arkiv för att packa upp ett paket (bundle)."
-#: builtin/cat-file.c:328
+#: builtin/cat-file.c:331
msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
msgstr "git cat-file (-t|-s|-e|-p|<typ>|--textconv) <objekt>"
-#: builtin/cat-file.c:329
+#: builtin/cat-file.c:332
msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
msgstr "git cat-file (--batch|--batch-check) < <objektlista>"
-#: builtin/cat-file.c:366
+#: builtin/cat-file.c:369
msgid "<type> can be one of: blob, tree, commit, tag"
msgstr "<typ> kan vara en av: blob, tree, commit, tag"
-#: builtin/cat-file.c:367
+#: builtin/cat-file.c:370
msgid "show object type"
msgstr "visa objekttyp"
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
msgid "show object size"
msgstr "visa objektstorlek"
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
msgid "exit with zero when there's no error"
msgstr "avsluta med noll när det inte uppstått något fel"
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:374
msgid "pretty-print object's content"
msgstr "visa objektets innehåll snyggt"
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
msgid "for blob objects, run textconv on object's content"
msgstr "för blob-objekt, kör textconv på objektets innehåll"
-#: builtin/cat-file.c:375
+#: builtin/cat-file.c:378
msgid "show info and content of objects fed from the standard input"
msgstr "visa information och innehåll för objekt som listas på standard in"
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:381
msgid "show info about objects fed from the standard input"
msgstr "visa information för objekt som listas på standard in"
@@ -3209,7 +3124,7 @@ msgstr "läs filnamn från standard in"
msgid "terminate input and output records by a NUL character"
msgstr "avsluta in- och utdataposter med NUL-tecken"
-#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
msgid "suppress progress reporting"
msgstr "undertryck förloppsrapportering"
@@ -3360,60 +3275,59 @@ msgstr "\"%s\" kan inte användas med %s"
msgid "Cannot update paths and switch to branch '%s' at the same time."
msgstr "Kan inte uppdatera sökvägar och växla till grenen \"%s\" samtidigt."
-#: builtin/checkout.c:261 builtin/checkout.c:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
msgid "corrupt index file"
msgstr "indexfilen är trasig"
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
#, c-format
msgid "path '%s' is unmerged"
msgstr "sökvägen \"%s\" har inte slagits ihop"
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
msgid "you need to resolve your current index first"
msgstr "du måste lösa ditt befintliga index först"
-#: builtin/checkout.c:594
+#: builtin/checkout.c:593
#, c-format
msgid "Can not do reflog for '%s'\n"
msgstr "Kan inte skapa referenslog för \"%s\"\n"
-#: builtin/checkout.c:632
+#: builtin/checkout.c:631
msgid "HEAD is now at"
msgstr "HEAD är nu på"
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
#, c-format
msgid "Reset branch '%s'\n"
msgstr "Återställ gren \"%s\"\n"
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
#, c-format
msgid "Already on '%s'\n"
msgstr "Redan på \"%s\"\n"
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
#, c-format
msgid "Switched to and reset branch '%s'\n"
msgstr "Växlade till och nollställde grenen \"%s\"\n"
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 builtin/checkout.c:1032
#, c-format
msgid "Switched to a new branch '%s'\n"
msgstr "Växlade till en ny gren \"%s\"\n"
-#: builtin/checkout.c:650
+#: builtin/checkout.c:649
#, c-format
msgid "Switched to branch '%s'\n"
msgstr "Växlade till grenen \"%s\"\n"
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
#, c-format
msgid " ... and %d more.\n"
msgstr " ... och %d till.\n"
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
#, c-format
msgid ""
"Warning: you are leaving %d commit behind, not connected to\n"
@@ -3436,7 +3350,7 @@ msgstr[1] ""
"\n"
"%s\n"
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
#, c-format
msgid ""
"If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3451,140 +3365,139 @@ msgstr ""
" git branch nytt_grennamn %s\n"
"\n"
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
msgid "internal error in revision walk"
msgstr "internt fel vid genomgång av revisioner (revision walk)"
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
msgid "Previous HEAD position was"
msgstr "Tidigare position för HEAD var"
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
msgid "You are on a branch yet to be born"
msgstr "Du är på en gren som ännu inte är född"
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
#, c-format
msgid "only one reference expected, %d given."
msgstr "endast en referens förväntades, %d gavs."
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
#, c-format
msgid "invalid reference: %s"
msgstr "felaktig referens: %s"
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
#, c-format
msgid "reference is not a tree: %s"
msgstr "referensen är inte ett träd: %s"
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
msgid "paths cannot be used with switching branches"
msgstr "sökvägar kan inte användas vid byte av gren"
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
#, c-format
msgid "'%s' cannot be used with switching branches"
msgstr "\"%s\" kan inte användas vid byte av gren"
-#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
#, c-format
msgid "'%s' cannot be used with '%s'"
msgstr "\"%s\" kan inte användas med \"%s\""
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
#, c-format
msgid "Cannot switch branch to a non-commit '%s'"
msgstr "Kan inte växla gren till icke-incheckningen \"%s\""
-#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
#: builtin/remote.c:159 builtin/remote.c:161
msgid "branch"
msgstr "gren"
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
msgid "create and checkout a new branch"
msgstr "skapa och checka ut en ny gren"
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
msgid "create/reset and checkout a branch"
msgstr "skapa/nollställ och checka ut en gren"
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
msgid "create reflog for new branch"
msgstr "skapa reflogg för ny gren"
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
msgid "detach the HEAD at named commit"
msgstr "koppla från HEAD vid namngiven incheckning"
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
msgid "set upstream info for new branch"
msgstr "sätt uppströmsinformation för ny gren"
-#: builtin/checkout.c:1099
-msgid "new branch"
-msgstr "ny gren"
+#: builtin/checkout.c:1098
+msgid "new-branch"
+msgstr "ny-gren"
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
msgid "new unparented branch"
msgstr "ny gren utan förälder"
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
msgid "checkout our version for unmerged files"
msgstr "checka ut vår version för ej sammanslagna filer"
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
msgid "checkout their version for unmerged files"
msgstr "checka ut deras version för ej sammanslagna filer"
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
msgid "force checkout (throw away local modifications)"
msgstr "tvinga utcheckning (kasta bort lokala ändringar)"
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
msgid "perform a 3-way merge with the new branch"
msgstr "utför en 3-vägssammanslagning för den nya grenen"
-#: builtin/checkout.c:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
msgid "update ignored files (default)"
msgstr "uppdatera ignorerade filer (standard)"
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
msgid "style"
msgstr "stil"
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
msgid "conflict style (merge or diff3)"
msgstr "konfliktstil (merge eller diff3)"
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
msgid "do not limit pathspecs to sparse entries only"
msgstr "begränsa inte sökvägar till endast glesa poster"
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
msgid "second guess 'git checkout no-such-branch'"
msgstr "förutspå \"git checkout gren-saknas\""
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
msgid "-b, -B and --orphan are mutually exclusive"
msgstr "-b, -B och --orphan är ömsesidigt uteslutande"
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
msgid "--track needs a branch name"
msgstr "--track behöver ett namn på en gren"
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
msgid "Missing branch name; try -b"
msgstr "Grennamn saknas; försök med -b"
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
msgid "invalid path specification"
msgstr "felaktig sökvägsangivelse"
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
#, c-format
msgid ""
"Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3593,12 +3506,12 @@ msgstr ""
"Kan inte uppdatera sökvägar och växla till grenen \"%s\" samtidigt.\n"
"Ville du checka ut \"%s\" som inte kan lösas som en utcheckning?"
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1208
#, c-format
msgid "git checkout: --detach does not take a path argument '%s'"
msgstr "git checkout: --detach tar inte en sökväg som argument \"%s\""
-#: builtin/checkout.c:1213
+#: builtin/checkout.c:1212
msgid ""
"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
"checking out of the index."
@@ -3638,7 +3551,7 @@ msgstr "Skulle hoppa över arkivet %s\n"
msgid "failed to remove %s"
msgstr "misslyckades ta bort %s"
-#: builtin/clean.c:294
+#: builtin/clean.c:295
msgid ""
"Prompt help:\n"
"1 - select a numbered item\n"
@@ -3650,7 +3563,7 @@ msgstr ""
"foo - markera post baserad på unikt prefix\n"
" - (tomt) markera ingenting"
-#: builtin/clean.c:298
+#: builtin/clean.c:299
msgid ""
"Prompt help:\n"
"1 - select a single item\n"
@@ -3670,35 +3583,35 @@ msgstr ""
"* - välj alla poster\n"
" - (tomt) avsluta markering"
-#: builtin/clean.c:516
+#: builtin/clean.c:517
#, c-format
msgid "Huh (%s)?"
msgstr "Vadå (%s)?"
-#: builtin/clean.c:659
+#: builtin/clean.c:660
#, c-format
msgid "Input ignore patterns>> "
msgstr "Ange ignoreringsmönster>>"
-#: builtin/clean.c:696
+#: builtin/clean.c:697
#, c-format
msgid "WARNING: Cannot find items matched by: %s"
msgstr "VARNING: Hittar inte poster som motsvarar: %s"
-#: builtin/clean.c:717
+#: builtin/clean.c:718
msgid "Select items to delete"
msgstr "Välj poster att ta bort"
-#: builtin/clean.c:757
+#: builtin/clean.c:758
#, c-format
msgid "remove %s? "
msgstr "ta bort %s?"
-#: builtin/clean.c:782
+#: builtin/clean.c:783
msgid "Bye."
msgstr "Hej då."
-#: builtin/clean.c:790
+#: builtin/clean.c:791
msgid ""
"clean - start cleaning\n"
"filter by pattern - exclude items from deletion\n"
@@ -3716,72 +3629,72 @@ msgstr ""
"help - denna skärm\n"
"? - hjälp för kommandoval"
-#: builtin/clean.c:817
+#: builtin/clean.c:818
msgid "*** Commands ***"
msgstr "*** Kommandon ***"
-#: builtin/clean.c:818
+#: builtin/clean.c:819
msgid "What now"
msgstr "Vad nu"
-#: builtin/clean.c:826
+#: builtin/clean.c:827
msgid "Would remove the following item:"
msgid_plural "Would remove the following items:"
msgstr[0] "Skulle ta bort följande post:"
msgstr[1] "Skulle ta bort följande poster:"
-#: builtin/clean.c:843
+#: builtin/clean.c:844
msgid "No more files to clean, exiting."
msgstr "Inga fler filer att städa, avslutar."
-#: builtin/clean.c:874
+#: builtin/clean.c:875
msgid "do not print names of files removed"
msgstr "skriv inte ut namn på borttagna filer"
-#: builtin/clean.c:876
+#: builtin/clean.c:877
msgid "force"
msgstr "tvinga"
-#: builtin/clean.c:877
+#: builtin/clean.c:878
msgid "interactive cleaning"
msgstr "städa interaktivt"
-#: builtin/clean.c:879
+#: builtin/clean.c:880
msgid "remove whole directories"
msgstr "ta bort hela kataloger"
-#: 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
+#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
+#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
msgid "pattern"
msgstr "mönster"
-#: builtin/clean.c:881
+#: builtin/clean.c:882
msgid "add <pattern> to ignore rules"
msgstr "lägg till <mönster> till ignoreringsregler"
-#: builtin/clean.c:882
+#: builtin/clean.c:883
msgid "remove ignored files, too"
msgstr "ta även bort ignorerade filer"
-#: builtin/clean.c:884
+#: builtin/clean.c:885
msgid "remove only ignored files"
msgstr "ta endast bort ignorerade filer"
-#: builtin/clean.c:902
+#: builtin/clean.c:903
msgid "-x and -X cannot be used together"
msgstr "-x och -X kan inte användas samtidigt"
-#: builtin/clean.c:906
+#: builtin/clean.c:907
msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
"clean"
msgstr ""
"clean.requireForce satt till true, men varken -i, -n eller -f angavs; vägrar "
"städa"
-#: builtin/clean.c:909
+#: builtin/clean.c:910
msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
"refusing to clean"
msgstr ""
"clean.requireForce har standardvärdet true och varken -i, -n eller -f "
@@ -3792,7 +3705,7 @@ msgid "git clone [options] [--] <repo> [<dir>]"
msgstr "git clone [flaggor] [--] <arkiv> [<kat>]"
#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:521
+#: builtin/push.c:504
msgid "force progress reporting"
msgstr "tvinga förloppsrapportering"
@@ -3800,7 +3713,7 @@ msgstr "tvinga förloppsrapportering"
msgid "don't create a checkout"
msgstr "skapa inte någon utcheckning"
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
msgid "create a bare repository"
msgstr "skapa ett naket (\"bare\") arkiv"
@@ -3824,11 +3737,11 @@ msgstr "skapa som ett delat arkiv"
msgid "initialize submodules in the clone"
msgstr "initiera undermoduler i klonen"
-#: builtin/clone.c:82 builtin/init-db.c:485
+#: builtin/clone.c:82 builtin/init-db.c:483
msgid "template-directory"
msgstr "mallkatalog"
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
msgid "directory from which templates will be used"
msgstr "katalog att använda mallar från"
@@ -3852,7 +3765,7 @@ msgstr "checka ut <gren> istället för fjärrens HEAD"
msgid "path to git-upload-pack on the remote"
msgstr "sökväg till git-upload-pack på fjärren"
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
msgid "depth"
msgstr "djup"
@@ -3864,11 +3777,11 @@ msgstr "skapa en grund klon på detta djup"
msgid "clone only one branch, HEAD or --branch"
msgstr "klona endast en gren, HEAD eller --branch"
-#: builtin/clone.c:96 builtin/init-db.c:494
+#: builtin/clone.c:96 builtin/init-db.c:492
msgid "gitdir"
msgstr "gitkat"
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
msgid "separate git dir from working tree"
msgstr "separera gitkatalogen från arbetskatalogen"
@@ -4155,67 +4068,67 @@ msgstr ""
"\"git cherry-pick --continue\" kommer därefter att återuppta\n"
"cherry-pick för återstående incheckningar.\n"
-#: builtin/commit.c:287
+#: builtin/commit.c:288
msgid "failed to unpack HEAD tree object"
msgstr "misslyckades packa upp HEAD:s trädobjekt"
-#: builtin/commit.c:329
+#: builtin/commit.c:330
msgid "unable to create temporary index"
msgstr "kunde inte skapa temporär indexfil"
-#: builtin/commit.c:335
+#: builtin/commit.c:336
msgid "interactive add failed"
msgstr "interaktiv tilläggning misslyckades"
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
msgid "unable to write new_index file"
msgstr "kunde inte skriva filen new_index"
-#: builtin/commit.c:420
+#: builtin/commit.c:421
msgid "cannot do a partial commit during a merge."
msgstr "kan inte utföra en delvis incheckning under en sammanslagning."
-#: builtin/commit.c:422
+#: builtin/commit.c:423
msgid "cannot do a partial commit during a cherry-pick."
msgstr "kan inte utföra en delvis incheckning under en cherry-pick."
-#: builtin/commit.c:432
+#: builtin/commit.c:433
msgid "cannot read the index"
msgstr "kan inte läsa indexet"
-#: builtin/commit.c:452
+#: builtin/commit.c:453
msgid "unable to write temporary index file"
msgstr "kunde inte skriva temporär indexfil"
-#: builtin/commit.c:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
#, c-format
msgid "invalid commit: %s"
msgstr "felaktig incheckning: %s"
-#: builtin/commit.c:571
+#: builtin/commit.c:572
msgid "malformed --author parameter"
msgstr "felformad \"--author\"-flagga"
-#: builtin/commit.c:591
+#: builtin/commit.c:592
#, c-format
msgid "Malformed ident string: '%s'"
msgstr "Felaktig indragningssträng: \"%s\""
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
#, c-format
msgid "could not lookup commit %s"
msgstr "kunde inte slå upp incheckningen %s"
-#: builtin/commit.c:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 builtin/shortlog.c:273
#, c-format
msgid "(reading log message from standard input)\n"
msgstr "(läser loggmeddelande från standard in)\n"
-#: builtin/commit.c:644
+#: builtin/commit.c:643
msgid "could not read log from standard input"
msgstr "kunde inte läsa logg från standard in"
-#: builtin/commit.c:648
+#: builtin/commit.c:647
#, c-format
msgid "could not read log file '%s'"
msgstr "kunde inte läsa loggfilen \"%s\""
@@ -4241,7 +4154,7 @@ msgstr "kunde inte läsa \"%s\""
msgid "could not write commit template"
msgstr "kunde inte skriva incheckningsmall"
-#: builtin/commit.c:760
+#: builtin/commit.c:764
#, c-format
msgid ""
"\n"
@@ -4256,7 +4169,7 @@ msgstr ""
"\t%s\n"
"och försöker igen.\n"
-#: builtin/commit.c:765
+#: builtin/commit.c:769
#, c-format
msgid ""
"\n"
@@ -4271,7 +4184,7 @@ msgstr ""
"\t%s\n"
"och försöker igen.\n"
-#: builtin/commit.c:777
+#: builtin/commit.c:782
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
@@ -4281,7 +4194,7 @@ msgstr ""
"med \"%c\" kommer ignoreras, och ett tomt meddelande avbryter "
"incheckningen.\n"
-#: builtin/commit.c:782
+#: builtin/commit.c:789
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
@@ -4292,139 +4205,139 @@ msgstr ""
"med \"%c\" kommer behållas; du kan själv ta bort dem om du vill.\n"
"Ett tomt meddelande avbryter incheckningen.\n"
-#: builtin/commit.c:795
+#: builtin/commit.c:802
#, c-format
msgid "%sAuthor: %s"
msgstr "%sFörfattare: %s"
-#: builtin/commit.c:802
+#: builtin/commit.c:809
#, c-format
msgid "%sCommitter: %s"
msgstr "%sIncheckare: %s"
-#: builtin/commit.c:822
+#: builtin/commit.c:829
msgid "Cannot read index"
msgstr "Kan inte läsa indexet"
-#: builtin/commit.c:865
+#: builtin/commit.c:872
msgid "Error building trees"
msgstr "Fel vid byggande av träd"
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
#, c-format
msgid "Please supply the message using either -m or -F option.\n"
msgstr "Ange meddelandet en av flaggorna -m eller -F.\n"
-#: builtin/commit.c:982
+#: builtin/commit.c:989
#, c-format
msgid "No existing author found with '%s'"
msgstr "Hittade ingen befintlig författare med \"%s\""
-#: builtin/commit.c:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
#, c-format
msgid "Invalid untracked files mode '%s'"
msgstr "Ogiltigt läge för ospårade filer: \"%s\""
-#: builtin/commit.c:1034
+#: builtin/commit.c:1041
msgid "--long and -z are incompatible"
msgstr "--long och -z är inkompatibla"
-#: builtin/commit.c:1064
+#: builtin/commit.c:1071
msgid "Using both --reset-author and --author does not make sense"
msgstr "Kan inte använda både --reset-author och --author"
-#: builtin/commit.c:1075
+#: builtin/commit.c:1080
msgid "You have nothing to amend."
msgstr "Du har inget att utöka."
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
msgid "You are in the middle of a merge -- cannot amend."
msgstr "Du är i mitten av en sammanslagning -- kan inte utöka."
-#: builtin/commit.c:1080
+#: builtin/commit.c:1085
msgid "You are in the middle of a cherry-pick -- cannot amend."
msgstr "Du är i mitten av en cherry-pick -- kan inte utöka."
-#: builtin/commit.c:1083
+#: builtin/commit.c:1088
msgid "Options --squash and --fixup cannot be used together"
msgstr "Flaggorna --squash och --fixup kan inte användas samtidigt"
-#: builtin/commit.c:1093
+#: builtin/commit.c:1098
msgid "Only one of -c/-C/-F/--fixup can be used."
msgstr "Endast en av -c/-C/-F/--fixup kan användas."
-#: builtin/commit.c:1095
+#: builtin/commit.c:1100
msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
msgstr "Flaggan -m kan inte kombineras med -c/-C/-F/--fixup."
-#: builtin/commit.c:1103
+#: builtin/commit.c:1108
msgid "--reset-author can be used only with -C, -c or --amend."
msgstr "--reset-author kan endast användas med -C, -c eller --amend."
-#: builtin/commit.c:1120
+#: builtin/commit.c:1125
msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
msgstr ""
"Endast en av --include/--only/--all/--interactive/--patch kan användas."
-#: builtin/commit.c:1122
+#: builtin/commit.c:1127
msgid "No paths with --include/--only does not make sense."
msgstr "Du måste ange sökvägar tillsammans med --include/--only."
-#: builtin/commit.c:1124
+#: builtin/commit.c:1129
msgid "Clever... amending the last one with dirty index."
msgstr "Smart... utöka den senaste med smutsigt index."
-#: builtin/commit.c:1126
-msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
+#: builtin/commit.c:1131
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
msgstr "Explicita sökvägar angavs utan -i eller -o; antar --only sökvägar..."
-#: builtin/commit.c:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
#, c-format
msgid "Invalid cleanup mode %s"
msgstr "Felaktigt städningsläge %s"
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
msgid "Paths with -a does not make sense."
msgstr "Kan inte ange sökvägar med -a."
-#: builtin/commit.c:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
msgid "show status concisely"
msgstr "visa koncis status"
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
msgid "show branch information"
msgstr "visa information om gren"
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
msgid "machine-readable output"
msgstr "maskinläsbar utdata"
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
msgid "show status in long format (default)"
msgstr "visa status i långt format (standard)"
-#: builtin/commit.c:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
msgid "terminate entries with NUL"
msgstr "terminera poster med NUL"
-#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:459
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
msgid "mode"
msgstr "läge"
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
msgstr "visa ospårade filer, valfria lägen: alla, normal, no. (Standard: all)"
-#: builtin/commit.c:1267
+#: builtin/commit.c:1274
msgid "show ignored files"
msgstr "visa ignorerade filer"
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
msgid "when"
msgstr "när"
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
msgid ""
"ignore changes to submodules, optional when: all, dirty, untracked. "
"(Default: all)"
@@ -4432,217 +4345,217 @@ msgstr ""
"ignorera ändringar i undermoduler, valfritt när: all, dirty, untracked. "
"(Default: all)"
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
msgid "list untracked files in columns"
msgstr "visa ospårade filer i spalter"
-#: builtin/commit.c:1340
+#: builtin/commit.c:1347
msgid "couldn't look up newly created commit"
msgstr "kunde inte slå upp en precis skapad incheckning"
-#: builtin/commit.c:1342
+#: builtin/commit.c:1349
msgid "could not parse newly created commit"
msgstr "kunde inte tolka en precis skapad incheckning"
-#: builtin/commit.c:1383
+#: builtin/commit.c:1390
msgid "detached HEAD"
msgstr "frånkopplad HEAD"
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
msgid " (root-commit)"
msgstr " (rotincheckning)"
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
msgid "suppress summary after successful commit"
msgstr "undertryck sammanfattning efter framgångsrik incheckning"
-#: builtin/commit.c:1453
+#: builtin/commit.c:1487
msgid "show diff in commit message template"
msgstr "visa diff i mallen för incheckningsmeddelandet"
-#: builtin/commit.c:1455
+#: builtin/commit.c:1489
msgid "Commit message options"
msgstr "Alternativ för incheckningsmeddelande"
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
msgid "read message from file"
msgstr "läs meddelande från fil"
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "author"
msgstr "författare"
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "override author for commit"
msgstr "överstyr författare för incheckningen"
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
msgid "date"
msgstr "datum"
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
msgid "override date for commit"
msgstr "överstyr datum för inchecknignen"
-#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405
-#: builtin/notes.c:562 builtin/tag.c:455
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
msgid "message"
msgstr "meddelande"
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
msgid "commit message"
msgstr "incheckningsmeddelande"
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
msgid "reuse and edit message from specified commit"
msgstr "återanvänd och redigera meddelande från angiven incheckning"
-#: builtin/commit.c:1461
+#: builtin/commit.c:1495
msgid "reuse message from specified commit"
msgstr "återanvänd meddelande från angiven incheckning"
-#: builtin/commit.c:1462
+#: builtin/commit.c:1496
msgid "use autosquash formatted message to fixup specified commit"
msgstr ""
"använd autosquash-formaterat meddelande för att fixa angiven incheckning"
-#: builtin/commit.c:1463
+#: builtin/commit.c:1497
msgid "use autosquash formatted message to squash specified commit"
msgstr ""
"använd autosquash-formaterat meddelande för att slå ihop med angiven "
"incheckning"
-#: builtin/commit.c:1464
+#: builtin/commit.c:1498
msgid "the commit is authored by me now (used with -C/-c/--amend)"
msgstr "jag är nu författare av incheckningen (används med -C/-c/--amend)"
-#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
msgid "add Signed-off-by:"
msgstr "lägg till Signed-off-by:"
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
msgid "use specified template file"
msgstr "använd angiven mallfil"
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
msgid "force edit of commit"
msgstr "tvinga redigering av incheckning"
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
msgid "default"
msgstr "standard"
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
msgid "how to strip spaces and #comments from message"
msgstr "hur blanksteg och #kommentarer skall tas bort från meddelande"
-#: builtin/commit.c:1469
+#: builtin/commit.c:1503
msgid "include status in commit message template"
msgstr "inkludera status i mallen för incheckningsmeddelandet"
-#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
msgstr "nyckel-id"
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
msgid "GPG sign commit"
msgstr "GPG-signera incheckning"
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
msgid "Commit contents options"
msgstr "Alternativ för incheckningens innehåll"
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
msgid "commit all changed files"
msgstr "checka in alla ändrade filer"
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
msgid "add specified files to index for commit"
msgstr "lägg till angivna filer till indexet för incheckning"
-#: builtin/commit.c:1477
+#: builtin/commit.c:1511
msgid "interactively add files"
msgstr "lägg till filer interaktivt"
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
msgid "interactively add changes"
msgstr "lägg till ändringar interaktivt"
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
msgid "commit only specified files"
msgstr "checka endast in angivna filer"
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
msgid "bypass pre-commit hook"
msgstr "förbigå pre-commit-krok"
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
msgid "show what would be committed"
msgstr "visa vad som skulle checkas in"
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
msgid "amend previous commit"
msgstr "lägg till föregående incheckning"
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
msgid "bypass post-rewrite hook"
msgstr "förbigå post-rewrite-krok"
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
msgid "ok to record an empty change"
msgstr "ok att registrera en tom ändring"
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
msgid "ok to record a change with an empty message"
msgstr "ok att registrera en ändring med tomt meddelande"
-#: builtin/commit.c:1529
+#: builtin/commit.c:1562
msgid "could not parse HEAD commit"
msgstr "kunde inte tolka HEAD:s incheckning"
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 builtin/merge.c:518
#, c-format
msgid "could not open '%s' for reading"
msgstr "kunde inte öppna \"%s\" för läsning"
-#: builtin/commit.c:1574
+#: builtin/commit.c:1608
#, c-format
msgid "Corrupt MERGE_HEAD file (%s)"
msgstr "Trasig MERGE_HEAD-fil (%s)"
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
msgid "could not read MERGE_MODE"
msgstr "kunde inte läsa MERGE_MODE"
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
#, c-format
msgid "could not read commit message: %s"
msgstr "kunde inte läsa incheckningsmeddelande: %s"
-#: builtin/commit.c:1611
+#: builtin/commit.c:1645
#, c-format
msgid "Aborting commit; you did not edit the message.\n"
msgstr "Avbryter incheckning; meddelandet inte redigerat.\n"
-#: builtin/commit.c:1616
+#: builtin/commit.c:1650
#, c-format
msgid "Aborting commit due to empty commit message.\n"
msgstr "Avbryter på grund av tomt incheckningsmeddelande.\n"
-#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
msgid "failed to write commit object"
msgstr "kunde inte skriva incheckningsobjekt"
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
msgid "cannot lock HEAD ref"
msgstr "kunde inte låsa HEAD-referens"
-#: builtin/commit.c:1656
+#: builtin/commit.c:1690
msgid "cannot update HEAD ref"
msgstr "kunde inte uppdatera HEAD-referens"
-#: builtin/commit.c:1667
+#: builtin/commit.c:1701
msgid ""
"Repository has been updated, but unable to write\n"
"new_index file. Check that disk is not full or quota is\n"
@@ -4657,127 +4570,127 @@ msgstr ""
msgid "git config [options]"
msgstr "git config [flaggor]"
-#: builtin/config.c:54
+#: builtin/config.c:53
msgid "Config file location"
msgstr "Konfigurationsfilens plats"
-#: builtin/config.c:55
+#: builtin/config.c:54
msgid "use global config file"
msgstr "använd global konfigurationsfil"
-#: builtin/config.c:56
+#: builtin/config.c:55
msgid "use system config file"
msgstr "använd systemets konfigurationsfil"
-#: builtin/config.c:57
+#: builtin/config.c:56
msgid "use repository config file"
msgstr "använd arkivets konfigurationsfil"
-#: builtin/config.c:58
+#: builtin/config.c:57
msgid "use given config file"
msgstr "använd angiven konfigurationsil"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "blob-id"
msgstr "blob-id"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "read config from given blob object"
msgstr "läs konfiguration från givet blob-objekt"
-#: builtin/config.c:60
+#: builtin/config.c:59
msgid "Action"
msgstr "Åtgärd"
-#: builtin/config.c:61
+#: builtin/config.c:60
msgid "get value: name [value-regex]"
msgstr "hämta värde: namn [värde-reguttr]"
-#: builtin/config.c:62
+#: builtin/config.c:61
msgid "get all values: key [value-regex]"
msgstr "hämta alla värden: nyckel [värde-reguttr]"
-#: builtin/config.c:63
+#: builtin/config.c:62
msgid "get values for regexp: name-regex [value-regex]"
msgstr "hämta värden för reguttr: namn-reguttr [värde-reguttr]"
-#: builtin/config.c:64
+#: builtin/config.c:63
msgid "get value specific for the URL: section[.var] URL"
msgstr "hämta värde specifikt URL:en: sektion[.var] URL"
-#: builtin/config.c:65
+#: builtin/config.c:64
msgid "replace all matching variables: name value [value_regex]"
msgstr "ersätt alla motsvarande variabler: namn värde [värde-reguttr]"
-#: builtin/config.c:66
+#: builtin/config.c:65
msgid "add a new variable: name value"
msgstr "lägg till en ny variabel: namn värde"
-#: builtin/config.c:67
+#: builtin/config.c:66
msgid "remove a variable: name [value-regex]"
msgstr "ta bort en variabel: namn [värde-reguttr]"
-#: builtin/config.c:68
+#: builtin/config.c:67
msgid "remove all matches: name [value-regex]"
msgstr "ta bort alla träffar: namn [värde-reguttr]"
-#: builtin/config.c:69
+#: builtin/config.c:68
msgid "rename section: old-name new-name"
msgstr "byt namn på sektion: gammalt-namn nytt-namn"
-#: builtin/config.c:70
+#: builtin/config.c:69
msgid "remove a section: name"
msgstr "ta bort en sektion: namn"
-#: builtin/config.c:71
+#: builtin/config.c:70
msgid "list all"
msgstr "visa alla"
-#: builtin/config.c:72
+#: builtin/config.c:71
msgid "open an editor"
msgstr "öppna textredigeringsprogram"
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
msgid "slot"
msgstr "plats"
-#: builtin/config.c:73
+#: builtin/config.c:72
msgid "find the color configured: [default]"
msgstr "hitta den inställda färgen: [default]"
-#: builtin/config.c:74
+#: builtin/config.c:73
msgid "find the color setting: [stdout-is-tty]"
msgstr "hitta färginställningen: [stdout-is-tty]"
-#: builtin/config.c:75
+#: builtin/config.c:74
msgid "Type"
msgstr "Typ"
-#: builtin/config.c:76
+#: builtin/config.c:75
msgid "value is \"true\" or \"false\""
msgstr "värdet är \"true\" eller \"false\""
-#: builtin/config.c:77
+#: builtin/config.c:76
msgid "value is decimal number"
msgstr "värdet är ett decimalt tal"
-#: builtin/config.c:78
+#: builtin/config.c:77
msgid "value is --bool or --int"
msgstr "värdet är --bool eller --int"
-#: builtin/config.c:79
+#: builtin/config.c:78
msgid "value is a path (file or directory name)"
msgstr "värdet är en sökväg (fil- eller katalognamn)"
-#: builtin/config.c:80
+#: builtin/config.c:79
msgid "Other"
msgstr "Andra"
-#: builtin/config.c:81
+#: builtin/config.c:80
msgid "terminate values with NUL byte"
msgstr "terminera värden med NUL-byte"
-#: builtin/config.c:82
+#: builtin/config.c:81
msgid "respect include directives on lookup"
msgstr "respektera inkluderingsdirektiv vid uppslag"
@@ -4797,47 +4710,47 @@ msgstr "git describe [flaggor] <incheckning-igt>*"
msgid "git describe [options] --dirty"
msgstr "git describe [flaggor] --dirty"
-#: builtin/describe.c:237
+#: builtin/describe.c:225
#, c-format
msgid "annotated tag %s not available"
msgstr "den annoterade taggen %s inte tillgänglig"
-#: builtin/describe.c:241
+#: builtin/describe.c:229
#, c-format
msgid "annotated tag %s has no embedded name"
msgstr "den annoterade taggen %s har inget inbäddat namn"
-#: builtin/describe.c:243
+#: builtin/describe.c:231
#, c-format
msgid "tag '%s' is really '%s' here"
msgstr "taggen \"%s\" är i verkligheten \"%s\" här"
-#: builtin/describe.c:270
+#: builtin/describe.c:258
#, c-format
msgid "Not a valid object name %s"
msgstr "Objektnamnet är inte giltigt: %s"
-#: builtin/describe.c:273
+#: builtin/describe.c:261
#, c-format
msgid "%s is not a valid '%s' object"
msgstr "%s är inte ett giltigt \"%s\"-objekt"
-#: builtin/describe.c:290
+#: builtin/describe.c:278
#, c-format
msgid "no tag exactly matches '%s'"
msgstr "ingen tagg motsvarar \"%s\" exakt"
-#: builtin/describe.c:292
+#: builtin/describe.c:280
#, c-format
msgid "searching to describe %s\n"
msgstr "söker för att beskriva %s\n"
-#: builtin/describe.c:332
+#: builtin/describe.c:327
#, c-format
msgid "finished search at %s\n"
msgstr "avslutade sökning på %s\n"
-#: builtin/describe.c:359
+#: builtin/describe.c:354
#, c-format
msgid ""
"No annotated tags can describe '%s'.\n"
@@ -4846,7 +4759,7 @@ msgstr ""
"Inga annoterade taggar kan beskriva \"%s\".\n"
"Det finns dock oannoterade taggar: testa --tags."
-#: builtin/describe.c:363
+#: builtin/describe.c:358
#, c-format
msgid ""
"No tags can describe '%s'.\n"
@@ -4855,12 +4768,12 @@ msgstr ""
"Inga taggar kan beskriva \"%s\".\n"
"Testa --always, eller skapa några taggar."
-#: builtin/describe.c:384
+#: builtin/describe.c:379
#, c-format
msgid "traversed %lu commits\n"
msgstr "traverserade %lu incheckningar\n"
-#: builtin/describe.c:387
+#: builtin/describe.c:382
#, c-format
msgid ""
"more than %i tags found; listed %i most recent\n"
@@ -4869,63 +4782,63 @@ msgstr ""
"mer än %i taggar hittades; listar de %i senaste\n"
"gav upp sökningen vid %s\n"
-#: builtin/describe.c:409
+#: builtin/describe.c:404
msgid "find the tag that comes after the commit"
msgstr "hitta taggen som kommer efter incheckningen"
-#: builtin/describe.c:410
+#: builtin/describe.c:405
msgid "debug search strategy on stderr"
msgstr "felsök sökstrategin på standard fel"
-#: builtin/describe.c:411
+#: builtin/describe.c:406
msgid "use any ref"
msgstr "använd alla referenser"
-#: builtin/describe.c:412
+#: builtin/describe.c:407
msgid "use any tag, even unannotated"
msgstr "använd alla taggar, även oannoterade"
-#: builtin/describe.c:413
+#: builtin/describe.c:408
msgid "always use long format"
msgstr "använd alltid långt format"
-#: builtin/describe.c:414
+#: builtin/describe.c:409
msgid "only follow first parent"
msgstr "följ endast första föräldern"
-#: builtin/describe.c:417
+#: builtin/describe.c:412
msgid "only output exact matches"
msgstr "skriv endast ut exakta träffar"
-#: builtin/describe.c:419
+#: builtin/describe.c:414
msgid "consider <n> most recent tags (default: 10)"
msgstr "överväg de <n> nyaste taggarna (standard: 10)"
-#: builtin/describe.c:421
+#: builtin/describe.c:416
msgid "only consider tags matching <pattern>"
msgstr "överväg endast taggar som motsvarar <mönster>"
-#: builtin/describe.c:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
msgid "show abbreviated commit object as fallback"
msgstr "visa förkortade incheckningsobjekt som standard"
-#: builtin/describe.c:424
+#: builtin/describe.c:419
msgid "mark"
msgstr "märke"
-#: builtin/describe.c:425
+#: builtin/describe.c:420
msgid "append <mark> on dirty working tree (default: \"-dirty\")"
msgstr "lägg till <märke> på lortigt arbetsträd (standard: \"-dirty\")"
-#: builtin/describe.c:443
+#: builtin/describe.c:438
msgid "--long is incompatible with --abbrev=0"
msgstr "--long är inkompatibel med --abbrev=0"
-#: builtin/describe.c:469
+#: builtin/describe.c:464
msgid "No names found, cannot describe anything."
msgstr "Inga namn hittades, kan inte beskriva något."
-#: builtin/describe.c:489
+#: builtin/describe.c:484
msgid "--dirty is incompatible with commit-ishes"
msgstr "--dirty är inkompatibelt med \"commit-ish\"-värden"
@@ -5217,7 +5130,7 @@ msgstr "Hämtar %s\n"
msgid "Could not fetch %s"
msgstr "Kunde inte hämta %s"
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
msgid ""
"No remote repository specified. Please, specify either a URL or a\n"
"remote name from which new revisions should be fetched."
@@ -5259,10 +5172,10 @@ msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
msgstr ""
"git fmt-merge-msg [-m <meddelande>] [--log[=<n>]|--no-log] [--file <fil>]"
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702
-#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446
-#: parse-options.h:135 parse-options.h:242
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
+#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: parse-options.h:132 parse-options.h:239
msgid "n"
msgstr "n"
@@ -5326,6 +5239,14 @@ msgstr "nyckel"
msgid "field name to sort on"
msgstr "fältnamn att sortera på"
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr "Kontrollerar konnektivitet"
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr "Kontrollerar objektkataloger"
+
#: builtin/fsck.c:607
msgid "git fsck [options] [<object>...]"
msgstr "git fsck [flaggor] [<objekt>...]"
@@ -5370,47 +5291,56 @@ msgstr "skriv dinglande objekt i .git/lost-found"
msgid "show progress"
msgstr "visa förlopp"
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr "Kontrollerar objekt"
+
#: builtin/gc.c:24
msgid "git gc [options]"
msgstr "git gc [flaggor]"
-#: builtin/gc.c:80
+#: builtin/gc.c:90
#, c-format
msgid "Invalid %s: '%s'"
msgstr "Felaktigt %s: \"%s\""
-#: builtin/gc.c:107
+#: builtin/gc.c:117
#, c-format
msgid "insanely long object directory %.*s"
msgstr "tokigt lång objektkatalog %.*s"
-#: builtin/gc.c:262
+#: builtin/gc.c:273
msgid "prune unreferenced objects"
msgstr "rensa ej refererade objekt"
-#: builtin/gc.c:264
+#: builtin/gc.c:275
msgid "be more thorough (increased runtime)"
msgstr "var mer grundlig (ökar körtiden)"
-#: builtin/gc.c:265
+#: builtin/gc.c:276
msgid "enable auto-gc mode"
msgstr "aktivera auto-gc-läge"
-#: builtin/gc.c:266
+#: builtin/gc.c:277
msgid "force running gc even if there may be another gc running"
msgstr "tvinga gc-körning även om en annan gc kanske körs"
-#: builtin/gc.c:306
+#: builtin/gc.c:318
#, 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 ""
-"Packar arkivet automatiskt för optimal prestanda. Du kan även\n"
-"köra \"git gc\" manuellt. Se \"git help gc\" för mer information.\n"
+msgid "Auto packing the repository in background for optimum performance.\n"
+msgstr "Packar arkivet automatiskt i bakgrunden för optimal prestanda.\n"
+
+#: builtin/gc.c:320
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr "Packar arkivet automatiskt för optimal prestanda.\n"
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:321
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
+msgstr "Se \"git help gc\" för manuell hushållning.\n"
+
+#: builtin/gc.c:336
#, c-format
msgid ""
"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5418,7 +5348,7 @@ msgstr ""
"gc körs redan på maskinen \"%s\" pid %<PRIuMAX> (använd --force om så inte "
"är fallet)"
-#: builtin/gc.c:341
+#: builtin/gc.c:361
msgid ""
"There are too many unreachable loose objects; run 'git prune' to remove them."
msgstr ""
@@ -5449,209 +5379,209 @@ msgstr "kunde inte läsa träd (%s)"
msgid "unable to grep from object of type %s"
msgstr "Kunde inte \"grep\" från objekt av typen %s"
-#: builtin/grep.c:551
+#: builtin/grep.c:549
#, c-format
msgid "switch `%c' expects a numerical value"
msgstr "flaggan \"%c\" antar ett numeriskt värde"
-#: builtin/grep.c:568
+#: builtin/grep.c:566
#, c-format
msgid "cannot open '%s'"
msgstr "kan inte öppna \"%s\""
-#: builtin/grep.c:642
+#: builtin/grep.c:640
msgid "search in index instead of in the work tree"
msgstr "sök i indexet istället för i arbetskatalogen"
-#: builtin/grep.c:644
+#: builtin/grep.c:642
msgid "find in contents not managed by git"
msgstr "sök i innehål som inte hanteras av git"
-#: builtin/grep.c:646
+#: builtin/grep.c:644
msgid "search in both tracked and untracked files"
msgstr "sök i både spårade och ospårade filer"
-#: builtin/grep.c:648
+#: builtin/grep.c:646
msgid "search also in ignored files"
msgstr "sök även i ignorerade filer"
-#: builtin/grep.c:651
+#: builtin/grep.c:649
msgid "show non-matching lines"
msgstr "visa rader som inte träffas"
-#: builtin/grep.c:653
+#: builtin/grep.c:651
msgid "case insensitive matching"
msgstr "skiftlägesokänslig sökning"
-#: builtin/grep.c:655
+#: builtin/grep.c:653
msgid "match patterns only at word boundaries"
msgstr "matcha endast mönster vid ordgränser"
-#: builtin/grep.c:657
+#: builtin/grep.c:655
msgid "process binary files as text"
msgstr "hantera binärfiler som text"
-#: builtin/grep.c:659
+#: builtin/grep.c:657
msgid "don't match patterns in binary files"
msgstr "träffa inte mönster i binärfiler"
-#: builtin/grep.c:662
+#: builtin/grep.c:660
msgid "process binary files with textconv filters"
msgstr "hantera binärfiler med textconv-filter"
-#: builtin/grep.c:664
+#: builtin/grep.c:662
msgid "descend at most <depth> levels"
msgstr "gå som mest ned <djup> nivåer"
-#: builtin/grep.c:668
+#: builtin/grep.c:666
msgid "use extended POSIX regular expressions"
msgstr "använd utökade POSIX-reguljära uttryck"
-#: builtin/grep.c:671
+#: builtin/grep.c:669
msgid "use basic POSIX regular expressions (default)"
msgstr "använd grundläggande POSIX-reguljära uttryck (standard)"
-#: builtin/grep.c:674
+#: builtin/grep.c:672
msgid "interpret patterns as fixed strings"
msgstr "tolka mönster som fixerade strängar"
-#: builtin/grep.c:677
+#: builtin/grep.c:675
msgid "use Perl-compatible regular expressions"
msgstr "använd Perlkompatibla reguljära uttryck"
-#: builtin/grep.c:680
+#: builtin/grep.c:678
msgid "show line numbers"
msgstr "visa radnummer"
-#: builtin/grep.c:681
+#: builtin/grep.c:679
msgid "don't show filenames"
msgstr "visa inte filnamn"
-#: builtin/grep.c:682
+#: builtin/grep.c:680
msgid "show filenames"
msgstr "visa filnamn"
-#: builtin/grep.c:684
+#: builtin/grep.c:682
msgid "show filenames relative to top directory"
msgstr "visa filnamn relativa till toppkatalogen"
-#: builtin/grep.c:686
+#: builtin/grep.c:684
msgid "show only filenames instead of matching lines"
msgstr "visa endast filnamn istället för träffade rader"
-#: builtin/grep.c:688
+#: builtin/grep.c:686
msgid "synonym for --files-with-matches"
msgstr "synonym för --files-with-matches"
-#: builtin/grep.c:691
+#: builtin/grep.c:689
msgid "show only the names of files without match"
msgstr "visa endast namn på filer utan träffar"
-#: builtin/grep.c:693
+#: builtin/grep.c:691
msgid "print NUL after filenames"
msgstr "skriv NUL efter filnamn"
-#: builtin/grep.c:695
+#: builtin/grep.c:693
msgid "show the number of matches instead of matching lines"
msgstr "visa antal träffar istället för träffade rader"
-#: builtin/grep.c:696
+#: builtin/grep.c:694
msgid "highlight matches"
msgstr "ljusmarkera träffar"
-#: builtin/grep.c:698
+#: builtin/grep.c:696
msgid "print empty line between matches from different files"
msgstr "skriv tomma rader mellan träffar från olika filer"
-#: builtin/grep.c:700
+#: builtin/grep.c:698
msgid "show filename only once above matches from same file"
msgstr "visa filnamn endast en gång ovanför träffar från samma fil"
-#: builtin/grep.c:703
+#: builtin/grep.c:701
msgid "show <n> context lines before and after matches"
msgstr "visa <n> rader sammanhang före och efter träffar"
-#: builtin/grep.c:706
+#: builtin/grep.c:704
msgid "show <n> context lines before matches"
msgstr "visa <n> rader sammanhang före träffar"
-#: builtin/grep.c:708
+#: builtin/grep.c:706
msgid "show <n> context lines after matches"
msgstr "visa <n> rader sammanhang efter träffar"
-#: builtin/grep.c:709
+#: builtin/grep.c:707
msgid "shortcut for -C NUM"
msgstr "genväg för -C NUM"
-#: builtin/grep.c:712
+#: builtin/grep.c:710
msgid "show a line with the function name before matches"
msgstr "visa en rad med funktionsnamnet före träffen"
-#: builtin/grep.c:714
+#: builtin/grep.c:712
msgid "show the surrounding function"
msgstr "visa den omkringliggande funktionen"
-#: builtin/grep.c:717
+#: builtin/grep.c:715
msgid "read patterns from file"
msgstr "läs mönster från fil"
-#: builtin/grep.c:719
+#: builtin/grep.c:717
msgid "match <pattern>"
msgstr "träffa <mönster>"
-#: builtin/grep.c:721
+#: builtin/grep.c:719
msgid "combine patterns specified with -e"
msgstr "kombinera mönster som anges med -e"
-#: builtin/grep.c:733
+#: builtin/grep.c:731
msgid "indicate hit with exit status without output"
msgstr "ange träff med slutstatuskod utan utdata"
-#: builtin/grep.c:735
+#: builtin/grep.c:733
msgid "show only matches from files that match all patterns"
msgstr "visa endast träffar från filer som träffar alla mönster"
-#: builtin/grep.c:737
+#: builtin/grep.c:735
msgid "show parse tree for grep expression"
msgstr "visa analysträd för grep-uttryck"
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "pager"
msgstr "bläddrare"
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "show matching files in the pager"
msgstr "visa träffade filer i filbläddraren"
-#: builtin/grep.c:744
+#: builtin/grep.c:742
msgid "allow calling of grep(1) (ignored by this build)"
msgstr "tillåt anropa grep(1) (ignoreras av detta bygge)"
-#: builtin/grep.c:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
msgid "show usage"
msgstr "visa användning"
-#: builtin/grep.c:812
+#: builtin/grep.c:810
msgid "no pattern given."
msgstr "inget mönster angavs."
-#: builtin/grep.c:870
+#: builtin/grep.c:868
msgid "--open-files-in-pager only works on the worktree"
msgstr "--open-files-in-pager fungerar endast i arbetskatalogen"
-#: builtin/grep.c:893
+#: builtin/grep.c:891
msgid "--cached or --untracked cannot be used with --no-index."
msgstr "--cached och --untracked kan inte användas med --no-index."
-#: builtin/grep.c:898
+#: builtin/grep.c:896
msgid "--no-index or --untracked cannot be used with revs."
msgstr "--no-index och --untracked kan inte användas med revisioner."
-#: builtin/grep.c:901
+#: builtin/grep.c:899
msgid "--[no-]exclude-standard cannot be used for tracked contents."
msgstr "--[no-]exclude-standard kan inte användas för spårat innehåll."
-#: builtin/grep.c:909
+#: builtin/grep.c:907
msgid "both --cached and trees are given."
msgstr "både --cached och träd angavs."
@@ -5667,7 +5597,7 @@ msgstr ""
msgid "git hash-object --stdin-paths < <list-of-paths>"
msgstr "git hash-object --stdin-paths < <sökvägslista>"
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:72 builtin/tag.c:521
msgid "type"
msgstr "typ"
@@ -5906,8 +5836,8 @@ msgstr "allvarlig inflate-inkonsekvens"
msgid "SHA1 COLLISION FOUND WITH %s !"
msgstr "SHA1-KOLLISION UPPTÄCKT VID %s !"
-#: builtin/index-pack.c:669 builtin/pack-objects.c:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
#, c-format
msgid "unable to read %s"
msgstr "kunde inte läsa %s"
@@ -6173,33 +6103,31 @@ msgstr "kan inte hantera filtyp %d"
msgid "unable to move %s to %s"
msgstr "kan inte flytta %s till %s"
-#.
-#. * 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
+#. 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:418
#, c-format
msgid "%s%s Git repository in %s%s\n"
msgstr "%s%s Git-arkiv i %s%s\n"
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Reinitialized existing"
msgstr "Ominitierade befintligt"
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Initialized empty"
msgstr "Initierade tomt"
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
msgid " shared"
msgstr " delat"
-#: builtin/init-db.c:441
+#: builtin/init-db.c:439
msgid "cannot tell cwd"
msgstr "kan inte läsa aktuell katalog (cwd)"
-#: builtin/init-db.c:467
+#: builtin/init-db.c:465
msgid ""
"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared"
"[=<permissions>]] [directory]"
@@ -6207,29 +6135,29 @@ msgstr ""
"git init [-q | --quiet] [--bare] [--template=<mallkatalog>] [--shared"
"[=<behörigheter>]] [katalog]"
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
msgid "permissions"
msgstr "behörigheter"
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
msgid "specify that the git repository is to be shared amongst several users"
msgstr "ange att git-arkivet skall delas bland flera användare"
-#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
msgid "be quiet"
msgstr "var tyst"
-#: builtin/init-db.c:525 builtin/init-db.c:530
+#: builtin/init-db.c:523 builtin/init-db.c:528
#, c-format
msgid "cannot mkdir %s"
msgstr "kan inte skapa katalogen (mkdir) %s"
-#: builtin/init-db.c:534
+#: builtin/init-db.c:532
#, c-format
msgid "cannot chdir to %s"
msgstr "kan inte byta katalog (chdir) till %s"
-#: builtin/init-db.c:556
+#: builtin/init-db.c:554
#, c-format
msgid ""
"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6238,11 +6166,11 @@ msgstr ""
"%s (eller --work-tree=<katalog>) inte tillåtet utan att ange %s (eller --git-"
"dir=<katalog>)"
-#: builtin/init-db.c:580
+#: builtin/init-db.c:578
msgid "Cannot access current working directory"
msgstr "Kan inte komma åt aktuell arbetskatalog"
-#: builtin/init-db.c:587
+#: builtin/init-db.c:585
#, c-format
msgid "Cannot access work tree '%s'"
msgstr "Kan inte komma åt arbetskatalogen \"%s\""
@@ -6505,95 +6433,95 @@ msgstr "Kunde inte hitta en spårad fjärrgren, ange <uppström> manuellt.\n"
msgid "Unknown commit %s"
msgstr "Okänd incheckning %s"
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
msgid "git ls-files [options] [<file>...]"
msgstr "git ls-files [flaggor] [<fil>...]"
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
msgid "identify the file status with tags"
msgstr "identifiera filstatus med taggar"
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
msgid "use lowercase letters for 'assume unchanged' files"
msgstr "använd små bokstäver för \"anta oförändrade\"-filer"
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
msgid "show cached files in the output (default)"
msgstr "visa cachade filer i utdata (standard)"
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
msgid "show deleted files in the output"
msgstr "visa borttagna filer i utdata"
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
msgid "show modified files in the output"
msgstr "visa modifierade filer i utdata"
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
msgid "show other files in the output"
msgstr "visa andra filer i utdata"
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
msgid "show ignored files in the output"
msgstr "visa ignorerade filer i utdata"
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
msgid "show staged contents' object name in the output"
msgstr "visa köat innehålls objektnamn i utdata"
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
msgid "show files on the filesystem that need to be removed"
msgstr "visa filer i filsystemet som behöver tas bort"
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
msgid "show 'other' directories' name only"
msgstr "visa endast namn för \"andra\" kataloger"
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
msgid "don't show empty directories"
msgstr "visa inte tomma kataloger"
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
msgid "show unmerged files in the output"
msgstr "visa ej sammanslagna filer i utdata"
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
msgid "show resolve-undo information"
msgstr "visa \"resolve-undo\"-information"
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
msgid "skip files matching pattern"
msgstr "hoppa över filer som motsvarar mönster"
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
msgid "exclude patterns are read from <file>"
msgstr "exkludera mönster som läses från <fil>"
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
msgid "read additional per-directory exclude patterns in <file>"
msgstr "läs ytterligare per-katalog-exkluderingsmönster från <fil>"
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
msgid "add the standard git exclusions"
msgstr "lägg till git:s standardexkluderingar"
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
msgid "make the output relative to the project top directory"
msgstr "gör utdata relativ till projektets toppkatalog"
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
msgid "if any <file> is not in the index, treat this as an error"
msgstr "om en <fil> inte är indexet, betrakta det som ett fel"
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
msgid "tree-ish"
msgstr "träd-igt"
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
msgid "pretend that paths removed since <tree-ish> are still present"
msgstr "låtsas att sökvägar borttagna sedan <träd-igt> fortfarande finns"
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
msgid "show debugging data"
msgstr "visa felsökningsutdata"
@@ -6705,7 +6633,7 @@ msgstr "avbryt om snabbspolning inte är möjlig"
msgid "Verify that the named commit has a valid GPG signature"
msgstr "Bekräfta att den namngivna incheckningen har en giltig GPG-signatur"
-#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
msgid "strategy"
msgstr "strategi"
@@ -6778,37 +6706,37 @@ msgstr "\"%s\" verkar inte peka på en incheckning"
msgid "Bad branch.%s.mergeoptions string: %s"
msgstr "Felaktig branch.%s.mergeoptions-sträng: %s"
-#: builtin/merge.c:650
+#: builtin/merge.c:653
msgid "git write-tree failed to write a tree"
msgstr "git write-tree misslyckades skriva ett träd"
-#: builtin/merge.c:678
+#: builtin/merge.c:681
msgid "Not handling anything other than two heads merge."
msgstr "Hanterar inte något annat än en sammanslagning av två huvuden."
-#: builtin/merge.c:692
+#: builtin/merge.c:695
#, c-format
msgid "Unknown option for merge-recursive: -X%s"
msgstr "Felaktig flagga för merge-recursive: -X%s"
-#: builtin/merge.c:706
+#: builtin/merge.c:709
#, c-format
msgid "unable to write %s"
msgstr "kunde inte skriva %s"
-#: builtin/merge.c:795
+#: builtin/merge.c:798
#, c-format
msgid "Could not read from '%s'"
msgstr "Kunde inte läsa från \"%s\""
-#: builtin/merge.c:804
+#: builtin/merge.c:807
#, c-format
msgid "Not committing merge; use 'git commit' to complete the merge.\n"
msgstr ""
"Checkar inte in sammanslagningen; använd \"git commit\" för att slutföra "
"den.\n"
-#: builtin/merge.c:810
+#: builtin/merge.c:813
#, c-format
msgid ""
"Please enter a commit message to explain why this merge is necessary,\n"
@@ -6824,48 +6752,48 @@ msgstr ""
"Rader som inleds med \"%c\" kommer ignoreras, och ett tomt meddelande\n"
"avbryter incheckningen.\n"
-#: builtin/merge.c:834
+#: builtin/merge.c:837
msgid "Empty commit message."
msgstr "Tomt incheckningsmeddelande."
-#: builtin/merge.c:846
+#: builtin/merge.c:849
#, c-format
msgid "Wonderful.\n"
msgstr "Underbart.\n"
-#: builtin/merge.c:911
+#: builtin/merge.c:914
#, c-format
msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
msgstr ""
"Kunde inte slå ihop automatiskt; fixa konflikter och checka in resultatet.\n"
-#: builtin/merge.c:927
+#: builtin/merge.c:930
#, c-format
msgid "'%s' is not a commit"
msgstr "\"%s\" är inte en incheckning"
-#: builtin/merge.c:968
+#: builtin/merge.c:971
msgid "No current branch."
msgstr "Inte på någon gren."
-#: builtin/merge.c:970
+#: builtin/merge.c:973
msgid "No remote for the current branch."
msgstr "Ingen fjärr för aktuell gren."
-#: builtin/merge.c:972
+#: builtin/merge.c:975
msgid "No default upstream defined for the current branch."
msgstr "Ingen standarduppström angiven för aktuell gren."
-#: builtin/merge.c:977
+#: builtin/merge.c:980
#, c-format
msgid "No remote-tracking branch for %s from %s"
msgstr "Ingen fjärrspårande gren för %s från %s"
-#: builtin/merge.c:1133
+#: builtin/merge.c:1136
msgid "There is no merge to abort (MERGE_HEAD missing)."
msgstr "Det finns ingen sammanslagning att avbryta (MERGE_HEAD saknas)."
-#: builtin/merge.c:1149 git-pull.sh:31
+#: builtin/merge.c:1152 git-pull.sh:31
msgid ""
"You have not concluded your merge (MERGE_HEAD exists).\n"
"Please, commit your changes before you can merge."
@@ -6873,11 +6801,11 @@ msgstr ""
"Du har inte avslutat sammanslagningen (MERGE_HEAD finns).\n"
"Checka in dina ändringar innan du kan slå ihop."
-#: builtin/merge.c:1152 git-pull.sh:34
+#: builtin/merge.c:1155 git-pull.sh:34
msgid "You have not concluded your merge (MERGE_HEAD exists)."
msgstr "Du har inte avslutat sammanslagningen (MERGE_HEAD finns)."
-#: builtin/merge.c:1156
+#: builtin/merge.c:1159
msgid ""
"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
"Please, commit your changes before you can merge."
@@ -6885,103 +6813,102 @@ msgstr ""
"Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns).\n"
"Checka in dina ändringar innan du kan slå ihop."
-#: builtin/merge.c:1159
+#: builtin/merge.c:1162
msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
msgstr "Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns)."
-#: builtin/merge.c:1168
+#: builtin/merge.c:1171
msgid "You cannot combine --squash with --no-ff."
msgstr "Du kan inte kombinera --squash med --no-ff."
-#: builtin/merge.c:1177
+#: builtin/merge.c:1180
msgid "No commit specified and merge.defaultToUpstream not set."
msgstr "Ingen incheckning angiven och merge.defaultToUpstream är ej satt."
-#: builtin/merge.c:1209
+#: builtin/merge.c:1212
msgid "Can merge only exactly one commit into empty head"
msgstr "Kan endast slå ihop en enda incheckning i ett tomt huvud."
-#: builtin/merge.c:1212
+#: builtin/merge.c:1215
msgid "Squash commit into empty head not supported yet"
msgstr "Stöder inte en tillplattningsincheckning på ett tomt huvud ännu"
-#: builtin/merge.c:1214
+#: builtin/merge.c:1217
msgid "Non-fast-forward commit does not make sense into an empty head"
msgstr "Icke-snabbspolad incheckning kan inte användas med ett tomt huvud"
-#: builtin/merge.c:1219
+#: builtin/merge.c:1222
#, c-format
msgid "%s - not something we can merge"
msgstr "%s - inte något vi kan slå ihop"
-#: builtin/merge.c:1270
+#: builtin/merge.c:1273
#, c-format
msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
msgstr ""
"Incheckningen %s har en obetrodd GPG-signatur som påstås vara gjord av %s."
-#: builtin/merge.c:1273
+#: builtin/merge.c:1276
#, c-format
msgid "Commit %s has a bad GPG signature allegedly by %s."
msgstr ""
"Incheckningen %s har en felaktig GPG-signatur som påstås vara gjord av %s."
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
#, c-format
msgid "Commit %s does not have a GPG signature."
msgstr "Incheckning %s har inte någon GPG-signatur."
-#: builtin/merge.c:1279
+#: builtin/merge.c:1282
#, c-format
msgid "Commit %s has a good GPG signature by %s\n"
msgstr "Incheckningen %s har en korrekt GPG-signatur av %s\n"
-#: builtin/merge.c:1363
+#: builtin/merge.c:1366
#, c-format
msgid "Updating %s..%s\n"
msgstr "Uppdaterar %s..%s\n"
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
#, c-format
msgid "Trying really trivial in-index merge...\n"
msgstr "Försöker riktigt enkel sammanslagning i indexet...\n"
-#: builtin/merge.c:1409
+#: builtin/merge.c:1412
#, c-format
msgid "Nope.\n"
msgstr "Nej.\n"
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
msgid "Not possible to fast-forward, aborting."
msgstr "Kan inte snabbspola, avbryter."
-#: builtin/merge.c:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
#, c-format
msgid "Rewinding the tree to pristine...\n"
msgstr "Återspolar trädet till orört...\n"
-#: builtin/merge.c:1468
+#: builtin/merge.c:1471
#, c-format
msgid "Trying merge strategy %s...\n"
msgstr "Försöker sammanslagninsstrategin %s...\n"
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
#, c-format
msgid "No merge strategy handled the merge.\n"
msgstr "Ingen sammanslagningsstrategi hanterade sammanslagningen.\n"
-#: builtin/merge.c:1536
+#: builtin/merge.c:1539
#, c-format
msgid "Merge with strategy %s failed.\n"
msgstr "Sammanslagning med strategin %s misslyckades.\n"
-#: builtin/merge.c:1545
+#: builtin/merge.c:1548
#, c-format
msgid "Using the %s to prepare resolving by hand.\n"
msgstr "Använder %s för att förbereda lösning för hand.\n"
-#: builtin/merge.c:1557
+#: builtin/merge.c:1560
#, c-format
msgid "Automatic merge went well; stopped before committing as requested\n"
msgstr ""
@@ -7066,19 +6993,19 @@ msgstr "varna inte om konflikter"
msgid "set labels for file1/orig_file/file2"
msgstr "sätt etiketter för fil1/origfil/fil2"
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
msgid "git mktree [-z] [--missing] [--batch]"
msgstr "git mktree [-z] [--missing] [--batch]"
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
msgid "input is NUL terminated"
msgstr "indata är NUL-terminerad"
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
msgid "allow missing objects"
msgstr "tillåt saknade objekt"
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
msgid "allow creation of more than one tree"
msgstr "tillåt skapa mer än ett träd"
@@ -7126,46 +7053,46 @@ msgstr ""
msgid "Huh? %.*s is in index?"
msgstr "Vad? %.*s är i indexet?"
-#: builtin/mv.c:168
+#: builtin/mv.c:169
msgid "source directory is empty"
msgstr "källkatalogen är tom"
-#: builtin/mv.c:200
+#: builtin/mv.c:205
msgid "not under version control"
msgstr "inte versionshanterad"
-#: builtin/mv.c:202
+#: builtin/mv.c:207
msgid "destination exists"
msgstr "destinationen finns"
-#: builtin/mv.c:210
+#: builtin/mv.c:215
#, c-format
msgid "overwriting '%s'"
msgstr "skriver över \"%s\""
-#: builtin/mv.c:213
+#: builtin/mv.c:218
msgid "Cannot overwrite"
msgstr "Kan inte skriva över"
-#: builtin/mv.c:216
+#: builtin/mv.c:221
msgid "multiple sources for the same target"
msgstr "flera källor för samma mål"
-#: builtin/mv.c:218
+#: builtin/mv.c:223
msgid "destination directory does not exist"
msgstr "destinationskatalogen finns inte"
-#: builtin/mv.c:233
+#: builtin/mv.c:243
#, c-format
msgid "%s, source=%s, destination=%s"
msgstr "%s, källa=%s, mål=%s"
-#: builtin/mv.c:243
+#: builtin/mv.c:253
#, c-format
msgid "Renaming %s to %s\n"
msgstr "Byter namn på %s till %s\n"
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
#, c-format
msgid "renaming '%s' failed"
msgstr "misslyckades byta namn på \"%s\""
@@ -7336,7 +7263,7 @@ msgstr "kunde inte läsa utdata från \"show\""
msgid "failed to finish 'show' for object '%s'"
msgstr "kunde inte avsluta \"show\" för objektet \"%s\""
-#: builtin/notes.c:167 builtin/tag.c:341
+#: builtin/notes.c:167 builtin/tag.c:373
#, c-format
msgid "could not create file '%s'"
msgstr "kunde inte skapa filen \"%s\""
@@ -7345,7 +7272,7 @@ msgstr "kunde inte skapa filen \"%s\""
msgid "Please supply the note contents using either -m or -F option"
msgstr "Ange innehåll för anteckningen med antingen -m eller -F"
-#: builtin/notes.c:207 builtin/notes.c:844
+#: builtin/notes.c:207 builtin/notes.c:848
#, c-format
msgid "Removing note for object %s\n"
msgstr "Tar bort anteckning för objektet %s\n"
@@ -7359,20 +7286,20 @@ msgstr "kunde inte skriva anteckningsobjekt"
msgid "The note contents has been left in %s"
msgstr "Anteckningens innehåll har lämnats kvar i %s"
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
#, c-format
msgid "cannot read '%s'"
msgstr "kunde inte läsa \"%s\""
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
#, c-format
msgid "could not open or read '%s'"
msgstr "kunde inte öppna eller läsa \"%s\""
-#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318
-#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515
-#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637
-#: builtin/notes.c:839 builtin/tag.c:553
+#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
+#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
+#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
+#: builtin/notes.c:843 builtin/tag.c:620
#, c-format
msgid "Failed to resolve '%s' as a valid ref."
msgstr "Kunde inte slå upp \"%s\" som en giltig referens."
@@ -7382,53 +7309,58 @@ msgstr "Kunde inte slå upp \"%s\" som en giltig referens."
msgid "Failed to read object '%s'."
msgstr "Kunde inte läsa objektet \"%s\"."
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr "kan inte läsa anteckningsdata från icke-blob-objektet \"%s\"."
+
+#: builtin/notes.c:316
#, c-format
msgid "Malformed input line: '%s'."
msgstr "Felaktig indatarad: \"%s\"."
-#: builtin/notes.c:327
+#: builtin/notes.c:331
#, c-format
msgid "Failed to copy notes from '%s' to '%s'"
msgstr "Misslyckades kopiera anteckningar från \"%s\" till \"%s\""
-#: 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
+#: builtin/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
+#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
+#: builtin/notes.c:908
msgid "too many parameters"
msgstr "för många parametrar"
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
#, c-format
msgid "No note found for object %s."
msgstr "Inga anteckningar hittades för objektet %s."
-#: builtin/notes.c:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
msgid "note contents as a string"
msgstr "anteckningsinnehåll som sträng"
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
msgid "note contents in a file"
msgstr "anteckningsinnehåll i en fil"
-#: builtin/notes.c:411 builtin/notes.c:414 builtin/notes.c:568
-#: builtin/notes.c:571 builtin/tag.c:474
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
msgid "object"
msgstr "objekt"
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
msgid "reuse and edit specified note object"
msgstr "återanvänd och redigera angivet anteckningsobjekt"
-#: builtin/notes.c:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
msgid "reuse specified note object"
msgstr "återanvänd angivet anteckningsobjekt"
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
msgid "replace existing notes"
msgstr "ersätt befintliga anteckningar"
-#: builtin/notes.c:451
+#: builtin/notes.c:455
#, c-format
msgid ""
"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7437,24 +7369,24 @@ msgstr ""
"Kan inte lägga till anteckningar. Hittade befintliga anteckningar för "
"objektet %s. Använd \"-f\" för att skriva över befintliga anteckningar"
-#: builtin/notes.c:456 builtin/notes.c:533
+#: builtin/notes.c:460 builtin/notes.c:537
#, c-format
msgid "Overwriting existing notes for object %s\n"
msgstr "Skriver över befintliga anteckningar för objektet %s\n"
-#: builtin/notes.c:486
+#: builtin/notes.c:490
msgid "read objects from stdin"
msgstr "läs objekt från standard in"
-#: builtin/notes.c:488
+#: builtin/notes.c:492
msgid "load rewriting config for <command> (implies --stdin)"
msgstr "läs omskrivningsinställning för <kommando> (implicerar --stdin)"
-#: builtin/notes.c:506
+#: builtin/notes.c:510
msgid "too few parameters"
msgstr "för få parametrar"
-#: builtin/notes.c:527
+#: builtin/notes.c:531
#, c-format
msgid ""
"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7463,12 +7395,12 @@ msgstr ""
"Kan inte kopiera anteckningar. Hittade befintliga anteckningar för objektet "
"%s. Använd \"-f\" för att skriva över befintliga anteckningar"
-#: builtin/notes.c:539
+#: builtin/notes.c:543
#, c-format
msgid "Missing notes on source object %s. Cannot copy."
msgstr "Anteckningar på källobjektet %s saknas. Kan inte kopiera."
-#: builtin/notes.c:588
+#: builtin/notes.c:592
#, c-format
msgid ""
"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -7477,15 +7409,15 @@ msgstr ""
"Flaggorna -m/-F/-c/-C rekommenderas inte för underkommandot \"edit\".\n"
"Använd \"git notes add -f -m/-F/-c/-C\" istället.\n"
-#: builtin/notes.c:735
+#: builtin/notes.c:739
msgid "General options"
msgstr "Allmänna flaggor"
-#: builtin/notes.c:737
+#: builtin/notes.c:741
msgid "Merge options"
msgstr "Flaggor för sammanslagning"
-#: builtin/notes.c:739
+#: builtin/notes.c:743
msgid ""
"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
"cat_sort_uniq)"
@@ -7493,203 +7425,227 @@ msgstr ""
"läs konflikter i anteckningar med angiven strategi (manual/ours/theirs/union/"
"cat_sort_uniq)"
-#: builtin/notes.c:741
+#: builtin/notes.c:745
msgid "Committing unmerged notes"
msgstr "Checkar in ej sammanslagna anteckningar"
-#: builtin/notes.c:743
+#: builtin/notes.c:747
msgid "finalize notes merge by committing unmerged notes"
msgstr ""
"färdigställ sammanslagning av anteckningar genom att checka in ej "
"sammanslagna anteckningar"
-#: builtin/notes.c:745
+#: builtin/notes.c:749
msgid "Aborting notes merge resolution"
msgstr "Avbryt lösning av sammanslagning av anteckningar"
-#: builtin/notes.c:747
+#: builtin/notes.c:751
msgid "abort notes merge"
msgstr "avbryt sammanslagning av anteckningar"
-#: builtin/notes.c:842
+#: builtin/notes.c:846
#, c-format
msgid "Object %s has no note\n"
msgstr "Objektet %s har ingen anteckning\n"
-#: builtin/notes.c:854
+#: builtin/notes.c:858
msgid "attempt to remove non-existent note is not an error"
msgstr "försök att ta bort icke-existerande anteckningar är inte ett fel"
-#: builtin/notes.c:857
+#: builtin/notes.c:861
msgid "read object names from the standard input"
msgstr "läs objektnamn från standard in"
-#: builtin/notes.c:938
-msgid "notes_ref"
+#: builtin/notes.c:942
+msgid "notes-ref"
msgstr "anteckningar-ref"
-#: builtin/notes.c:939
+#: builtin/notes.c:943
msgid "use notes from <notes_ref>"
msgstr "använd anteckningar från <anteckningsref>"
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
#, c-format
msgid "Unknown subcommand: %s"
msgstr "Okänt underkommando: %s"
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
msgstr "git pack-objects --stdout [flaggor...] [< reflista | < objektlista]"
-#: builtin/pack-objects.c:24
+#: builtin/pack-objects.c:26
msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
msgstr "git pack-objects [flaggor...] basnamn [< reflista | < objektlista]"
-#: builtin/pack-objects.c:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
#, c-format
msgid "deflate error (%d)"
msgstr "fel i deflate (%d)"
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "Skriver objekt"
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr "inaktiverar skrivning av bitkarta då några objekt inte packas"
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr "Komprimerar objekt"
+
+#: builtin/pack-objects.c:2530
#, c-format
msgid "unsupported index version %s"
msgstr "indexversionen %s stöds ej"
-#: builtin/pack-objects.c:2400
+#: builtin/pack-objects.c:2534
#, c-format
msgid "bad index version '%s'"
msgstr "felaktig indexversion \"%s\""
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
#, c-format
msgid "option %s does not accept negative form"
msgstr "flaggan %s godtar inte negativ form"
-#: builtin/pack-objects.c:2427
+#: builtin/pack-objects.c:2561
#, c-format
msgid "unable to parse value '%s' for option %s"
msgstr "kunde inte tolka värdet \"%s\" för flaggan %s"
-#: builtin/pack-objects.c:2446
+#: builtin/pack-objects.c:2580
msgid "do not show progress meter"
msgstr "visa inte förloppsindikator"
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
msgid "show progress meter"
msgstr "visa förloppsindikator"
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
msgid "show progress meter during object writing phase"
msgstr "visa förloppsindikator under objektskrivningsfasen"
-#: builtin/pack-objects.c:2453
+#: builtin/pack-objects.c:2587
msgid "similar to --all-progress when progress meter is shown"
msgstr "som --all-progress när förloppsmätaren visas"
-#: builtin/pack-objects.c:2454
+#: builtin/pack-objects.c:2588
msgid "version[,offset]"
msgstr "version[,offset]"
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
msgid "write the pack index file in the specified idx format version"
msgstr "skriv paketindexfilen i angiven indexformatversion"
-#: builtin/pack-objects.c:2458
+#: builtin/pack-objects.c:2592
msgid "maximum size of each output pack file"
msgstr "maximal storlek på varje utdatapaketfil"
-#: builtin/pack-objects.c:2460
+#: builtin/pack-objects.c:2594
msgid "ignore borrowed objects from alternate object store"
msgstr "ignorera lånade objekt från alternativa objektlager"
-#: builtin/pack-objects.c:2462
+#: builtin/pack-objects.c:2596
msgid "ignore packed objects"
msgstr "ignorera packade objekt"
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
msgid "limit pack window by objects"
msgstr "begränsa paketfönster efter objekt"
-#: builtin/pack-objects.c:2466
+#: builtin/pack-objects.c:2600
msgid "limit pack window by memory in addition to object limit"
msgstr "begränsa paketfönster efter minne förutom objektgräns"
-#: builtin/pack-objects.c:2468
+#: builtin/pack-objects.c:2602
msgid "maximum length of delta chain allowed in the resulting pack"
msgstr "maximal längd på deltakedja tillåten i slutligt paket"
-#: builtin/pack-objects.c:2470
+#: builtin/pack-objects.c:2604
msgid "reuse existing deltas"
msgstr "återanvänd befintliga delta"
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
msgid "reuse existing objects"
msgstr "återanvänd befintliga objekt"
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
msgid "use OFS_DELTA objects"
msgstr "använd OFS_DELTA-objekt"
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
msgid "use threads when searching for best delta matches"
msgstr "använd trådar vid sökning efter bästa deltaträffar"
-#: builtin/pack-objects.c:2478
+#: builtin/pack-objects.c:2612
msgid "do not create an empty pack output"
msgstr "försök inte skapa tom paketutdata"
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
msgid "read revision arguments from standard input"
msgstr "läs revisionsargument från standard in"
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
msgid "limit the objects to those that are not yet packed"
msgstr "begränsa objekt till de som ännu inte packats"
-#: builtin/pack-objects.c:2485
+#: builtin/pack-objects.c:2619
msgid "include objects reachable from any reference"
msgstr "inkludera objekt som kan nås från någon referens"
-#: builtin/pack-objects.c:2488
+#: builtin/pack-objects.c:2622
msgid "include objects referred by reflog entries"
msgstr "inkludera objekt som refereras från referensloggposter"
-#: builtin/pack-objects.c:2491
+#: builtin/pack-objects.c:2625
msgid "output pack to stdout"
msgstr "skriv paket på standard ut"
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
msgid "include tag objects that refer to objects to be packed"
msgstr "inkludera taggobjekt som refererar objekt som skall packas"
-#: builtin/pack-objects.c:2495
+#: builtin/pack-objects.c:2629
msgid "keep unreachable objects"
msgstr "behåll onåbara objekt"
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
msgid "time"
msgstr "tid"
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
msgid "unpack unreachable objects newer than <time>"
msgstr "packa upp onåbara objekt nyare än <tid>"
-#: builtin/pack-objects.c:2500
+#: builtin/pack-objects.c:2634
msgid "create thin packs"
msgstr "skapa tunna paket"
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
msgid "ignore packs that have companion .keep file"
msgstr "ignorera paket som har tillhörande .keep-fil"
-#: builtin/pack-objects.c:2504
+#: builtin/pack-objects.c:2638
msgid "pack compression level"
msgstr "komprimeringsgrad för paket"
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
msgid "do not hide commits by grafts"
msgstr "göm inte incheckningar med ympningar (\"grafts\")"
+#: builtin/pack-objects.c:2642
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr "använd bitkartindex om tillgängligt för att räkna objekt snabbare"
+
+#: builtin/pack-objects.c:2644
+msgid "write a bitmap index together with the pack index"
+msgstr "använd bitkartindex tillsammans med packindexet"
+
+#: builtin/pack-objects.c:2723
+msgid "Counting objects"
+msgstr "Räknar objekt"
+
#: builtin/pack-refs.c:6
msgid "git pack-refs [options]"
msgstr "git pack-refs [flaggor]"
@@ -7706,6 +7662,10 @@ msgstr "ta bort lösa referenser (standard)"
msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]"
+#: builtin/prune-packed.c:49
+msgid "Removing duplicate objects"
+msgstr "Tar bort duplicerade objekt"
+
#: builtin/prune.c:12
msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
msgstr "git prune [-n] [-v] [--expire <tid>] [--] [<huvud>...]"
@@ -7726,15 +7686,15 @@ msgstr "låt tid gå ut för objekt äldre än <tid>"
msgid "git push [<options>] [<repository> [<refspec>...]]"
msgstr "git push [<flaggor>] [<arkiv> [<refspec>...]]"
-#: builtin/push.c:86
+#: builtin/push.c:85
msgid "tag shorthand without <tag>"
msgstr "taggförkortning utan <tagg>"
-#: builtin/push.c:96
+#: builtin/push.c:95
msgid "--delete only accepts plain target ref names"
msgstr "--delete godtar endast enkla målreferensnamn"
-#: builtin/push.c:141
+#: builtin/push.c:140
msgid ""
"\n"
"To choose either option permanently, see push.default in 'git help config'."
@@ -7743,7 +7703,7 @@ msgstr ""
"För att välja ett av alternativen permanent, se push.default i \"git help "
"config\"."
-#: builtin/push.c:144
+#: builtin/push.c:143
#, c-format
msgid ""
"The upstream branch of your current branch does not match\n"
@@ -7768,7 +7728,7 @@ msgstr ""
" git push %s %s\n"
"%s"
-#: builtin/push.c:159
+#: builtin/push.c:158
#, c-format
msgid ""
"You are not currently on a branch.\n"
@@ -7783,7 +7743,7 @@ msgstr ""
"\n"
" git push %s HEAD:<namn-på-fjärrgren>\n"
-#: builtin/push.c:173
+#: builtin/push.c:172
#, c-format
msgid ""
"The current branch %s has no upstream branch.\n"
@@ -7796,12 +7756,12 @@ msgstr ""
"\n"
" git push --set-upstream %s %s\n"
-#: builtin/push.c:181
+#: builtin/push.c:180
#, c-format
msgid "The current branch %s has multiple upstream branches, refusing to push."
msgstr "Den aktuella grenen %s har flera uppströmsgrenar, vägrar sända."
-#: builtin/push.c:184
+#: builtin/push.c:183
#, c-format
msgid ""
"You are pushing to remote '%s', which is not the upstream of\n"
@@ -7812,11 +7772,11 @@ msgstr ""
"aktuella grenen \"%s\", utan att tala om för mig vad som\n"
"skall sändas för att uppdatera fjärrgrenen."
-#: builtin/push.c:207
+#: builtin/push.c:206
msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"push.default is unset; its implicit value has changed in\n"
"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
-"and maintain the current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
"\n"
" git config --global push.default matching\n"
"\n"
@@ -7827,7 +7787,7 @@ msgid ""
"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"
+"Since Git 2.0, Git defaults to the more conservative 'simple'\n"
"behavior, which only pushes the current branch to the corresponding\n"
"remote branch that 'git pull' uses to update the current branch.\n"
"\n"
@@ -7838,8 +7798,7 @@ msgid ""
msgstr ""
"push.default har inte ställts in; dess underförstådda värde\n"
"ändras i Git 2.0 från \"matching\" till \"simple\". För att\n"
-"undertrycka det här meddelandet och behålla nuvarande beteende\n"
-"efter att förvalet ändras,\n"
+"undertrycka det här meddelandet och behålla traditionellt beteende\n"
"skriver du:\n"
"\n"
" git config --global push.default matching\n"
@@ -7861,14 +7820,14 @@ msgstr ""
"liknande läget \"current\" istället för \"simple\" om du ibland använder\n"
"äldre versioner av Git.)"
-#: builtin/push.c:274
+#: builtin/push.c:273
msgid ""
"You didn't specify any refspecs to push, and push.default is \"nothing\"."
msgstr ""
"Du angav inga referensspecifikationer att sända, och push.default är "
"\"nothing\"."
-#: builtin/push.c:281
+#: builtin/push.c:280
msgid ""
"Updates were rejected because the tip of your current branch is behind\n"
"its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -7880,21 +7839,7 @@ msgstr ""
"\"git pull ....\") innan du sänder igen.\n"
"Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer."
-#: builtin/push.c: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 ""
-"Uppdateringar avvisades då änden på en insänd gren är bakom dess\n"
-"fjärrmotsvarighet. Om det inte var meningen att sända in grenen, bör\n"
-"du specificera grenar att sända, eller ändra inställningsvariabeln\n"
-"\"push-default\" till \"simple\", \"current\" eller \"upstream\" för att "
-"endast\n"
-"sända aktuell gren."
-
-#: builtin/push.c:293
+#: builtin/push.c:286
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"
@@ -7906,7 +7851,7 @@ msgstr ""
"\"git pull ...\") innan du sänder igen.\n"
"Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer."
-#: builtin/push.c:299
+#: builtin/push.c:292
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"
@@ -7920,11 +7865,11 @@ msgstr ""
"(t.ex. \"git pull ...\") innan du sänder igen.\n"
"Se avsnittet \"Note about fast-forwards\" i \"git push --help\" för detaljer."
-#: builtin/push.c:306
+#: builtin/push.c:299
msgid "Updates were rejected because the tag already exists in the remote."
msgstr "Uppdateringarna avvisades eftersom taggen redan finns på fjärren."
-#: builtin/push.c:309
+#: builtin/push.c:302
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"
@@ -7935,22 +7880,22 @@ msgstr ""
"pekar på något som inte är en incheckning, utan att använda flaggan\n"
"\"--force\".\n"
-#: builtin/push.c:375
+#: builtin/push.c:361
#, c-format
msgid "Pushing to %s\n"
msgstr "Sänder till %s\n"
-#: builtin/push.c:379
+#: builtin/push.c:365
#, c-format
msgid "failed to push some refs to '%s'"
msgstr "misslyckades sända vissa referenser till \"%s\""
-#: builtin/push.c:412
+#: builtin/push.c:395
#, c-format
msgid "bad repository '%s'"
msgstr "felaktigt arkiv \"%s\""
-#: builtin/push.c:413
+#: builtin/push.c:396
msgid ""
"No configured push destination.\n"
"Either specify the URL from the command-line or configure a remote "
@@ -7971,95 +7916,95 @@ msgstr ""
"\n"
" git push <namn>\n"
-#: builtin/push.c:428
+#: builtin/push.c:411
msgid "--all and --tags are incompatible"
msgstr "--all och --tags är inkompatibla"
-#: builtin/push.c:429
+#: builtin/push.c:412
msgid "--all can't be combined with refspecs"
msgstr "--all kan inte kombineras med referensspecifikationer"
-#: builtin/push.c:434
+#: builtin/push.c:417
msgid "--mirror and --tags are incompatible"
msgstr "--mirror och --tags är inkompatibla"
-#: builtin/push.c:435
+#: builtin/push.c:418
msgid "--mirror can't be combined with refspecs"
msgstr "--mirror kan inte kombineras med referensspecifikationer"
-#: builtin/push.c:440
+#: builtin/push.c:423
msgid "--all and --mirror are incompatible"
msgstr "--all och --mirror är inkompatibla"
-#: builtin/push.c:500
+#: builtin/push.c:483
msgid "repository"
msgstr "arkiv"
-#: builtin/push.c:501
+#: builtin/push.c:484
msgid "push all refs"
msgstr "sänd alla referenser"
-#: builtin/push.c:502
+#: builtin/push.c:485
msgid "mirror all refs"
msgstr "spegla alla referenser"
-#: builtin/push.c:504
+#: builtin/push.c:487
msgid "delete refs"
msgstr "ta bort referenser"
-#: builtin/push.c:505
+#: builtin/push.c:488
msgid "push tags (can't be used with --all or --mirror)"
msgstr "sänd taggar (kan inte användas med --all eller --mirror)"
-#: builtin/push.c:508
+#: builtin/push.c:491
msgid "force updates"
msgstr "tvinga uppdateringar"
-#: builtin/push.c:510
+#: builtin/push.c:493
msgid "refname>:<expect"
msgstr "refnamn>:<förvänta"
-#: builtin/push.c:511
+#: builtin/push.c:494
msgid "require old value of ref to be at this value"
msgstr "kräv att ref:s tidigare värde är detta"
-#: builtin/push.c:513
+#: builtin/push.c:496
msgid "check"
msgstr "kontrollera"
-#: builtin/push.c:514
+#: builtin/push.c:497
msgid "control recursive pushing of submodules"
msgstr "styr rekursiv insändning av undermoduler"
-#: builtin/push.c:516
+#: builtin/push.c:499
msgid "use thin pack"
msgstr "använd tunna paket"
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
msgid "receive pack program"
msgstr "program för att ta emot paket"
-#: builtin/push.c:519
+#: builtin/push.c:502
msgid "set upstream for git pull/status"
msgstr "ställ in uppström för git pull/status"
-#: builtin/push.c:522
+#: builtin/push.c:505
msgid "prune locally removed refs"
msgstr "ta bort lokalt borttagna referenser"
-#: builtin/push.c:524
+#: builtin/push.c:507
msgid "bypass pre-push hook"
msgstr "förbigå pre-push-krok"
-#: builtin/push.c:525
+#: builtin/push.c:508
msgid "push missing but relevant tags"
msgstr "sänd in saknade men relevanta taggar"
-#: builtin/push.c:535
+#: builtin/push.c:518
msgid "--delete is incompatible with --all, --mirror and --tags"
msgstr "--delete är imkompatibel med --all, --mirror och --tags"
-#: builtin/push.c:537
+#: builtin/push.c:520
msgid "--delete doesn't make sense without any refs"
msgstr "--delete kan inte användas utan referenser"
@@ -8645,67 +8590,75 @@ msgstr "Kommer inte ta bort alla icke-sänd-URL:er"
msgid "be verbose; must be placed before a subcommand"
msgstr "var pratsam; måste skrivas före ett underkommando"
-#: builtin/repack.c:15
+#: builtin/repack.c:16
msgid "git repack [options]"
msgstr "git repack [flaggor]"
-#: builtin/repack.c:143
+#: builtin/repack.c:156
msgid "pack everything in a single pack"
msgstr "packa allt i ett enda paket"
-#: builtin/repack.c:145
+#: builtin/repack.c:158
msgid "same as -a, and turn unreachable objects loose"
msgstr "samma som -a, och gör onåbara objekt lösa"
-#: builtin/repack.c:148
+#: builtin/repack.c:161
msgid "remove redundant packs, and run git-prune-packed"
msgstr "ta bort överflödiga paket, och kör git-prune-packed"
-#: builtin/repack.c:150
+#: builtin/repack.c:163
msgid "pass --no-reuse-delta to git-pack-objects"
msgstr "sänd --no-reuse-delta till git-pack-objects"
-#: builtin/repack.c:152
+#: builtin/repack.c:165
msgid "pass --no-reuse-object to git-pack-objects"
msgstr "sänd --no-reuse-object till git-pack-objects"
-#: builtin/repack.c:154
+#: builtin/repack.c:167
msgid "do not run git-update-server-info"
msgstr "kör inte git-update-server-info"
-#: builtin/repack.c:157
+#: builtin/repack.c:170
msgid "pass --local to git-pack-objects"
msgstr "sänd --local till git-pack-objects"
-#: builtin/repack.c:158
+#: builtin/repack.c:172
+msgid "write bitmap index"
+msgstr "skriv bitkartindex"
+
+#: builtin/repack.c:173
msgid "approxidate"
msgstr "cirkadatum"
-#: builtin/repack.c:159
+#: builtin/repack.c:174
msgid "with -A, do not loosen objects older than this"
msgstr "med -A, lös inte upp objekt äldre än detta"
-#: builtin/repack.c:161
+#: builtin/repack.c:176
msgid "size of the window used for delta compression"
msgstr "storlek på fönster använt för deltakomprimering"
-#: builtin/repack.c:162 builtin/repack.c:166
+#: builtin/repack.c:177 builtin/repack.c:181
msgid "bytes"
msgstr "byte"
-#: builtin/repack.c:163
+#: builtin/repack.c:178
msgid "same as the above, but limit memory size instead of entries count"
msgstr "samma som ovan, men begränsa minnesstorleken istället för postantal"
-#: builtin/repack.c:165
+#: builtin/repack.c:180
msgid "limits the maximum delta depth"
msgstr "begränsa maximalt deltadjup"
-#: builtin/repack.c:167
+#: builtin/repack.c:182
msgid "maximum size of each packfile"
msgstr "maximal storlek på varje paketfil"
-#: builtin/repack.c:343
+#: builtin/repack.c:184
+msgid "repack objects in packs marked with .keep"
+msgstr "packa om objekt i paket märkta med .keep"
+
+#: builtin/repack.c:371
#, c-format
msgid "removing '%s' failed"
msgstr "misslyckades ta bort \"%s\""
@@ -8798,75 +8751,83 @@ msgstr "Kunde inte hitta träder för %s."
msgid "HEAD is now at %s"
msgstr "HEAD är nu på %s"
-#: builtin/reset.c:172
+#: builtin/reset.c:182
#, c-format
msgid "Cannot do a %s reset in the middle of a merge."
msgstr "Kan inte utföra en %s återställning mitt i en sammanslagning."
-#: builtin/reset.c:262
+#: builtin/reset.c:273
msgid "be quiet, only report errors"
msgstr "var tyst, rapportera endast fel"
-#: builtin/reset.c:264
+#: builtin/reset.c:275
msgid "reset HEAD and index"
msgstr "återställ HEAD och index"
-#: builtin/reset.c:265
+#: builtin/reset.c:276
msgid "reset only HEAD"
msgstr "återställ endast HEAD"
-#: builtin/reset.c:267 builtin/reset.c:269
+#: builtin/reset.c:278 builtin/reset.c:280
msgid "reset HEAD, index and working tree"
msgstr "återställ HEAD, index och arbetskatalog"
-#: builtin/reset.c:271
+#: builtin/reset.c:282
msgid "reset HEAD but keep local changes"
msgstr "återställ HEAD men behåll lokala ändringar"
-#: builtin/reset.c:289
+#: builtin/reset.c:285
+msgid "record only the fact that removed paths will be added later"
+msgstr "registrera endast att borttagna sökvägar kommer läggas till senare"
+
+#: builtin/reset.c:302
#, c-format
msgid "Failed to resolve '%s' as a valid revision."
msgstr "Kunde inte slå upp \"%s\" som en giltig revision."
-#: builtin/reset.c:292 builtin/reset.c:300
+#: builtin/reset.c:305 builtin/reset.c:313
#, c-format
msgid "Could not parse object '%s'."
msgstr "Kan inte tolka objektet \"%s\""
-#: builtin/reset.c:297
+#: builtin/reset.c:310
#, c-format
msgid "Failed to resolve '%s' as a valid tree."
msgstr "Kunde inte slå upp \"%s\" som ett giltigt träd."
-#: builtin/reset.c:306
+#: builtin/reset.c:319
msgid "--patch is incompatible with --{hard,mixed,soft}"
msgstr "--patch är inkompatibel med --{hard,mixed,soft}"
-#: builtin/reset.c:315
+#: builtin/reset.c:328
msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
msgstr ""
"--mixed rekommenderas inte med sökvägar; använd \"git reset -- <sökvägar>\"."
-#: builtin/reset.c:317
+#: builtin/reset.c:330
#, c-format
msgid "Cannot do %s reset with paths."
msgstr "Kan inte göra %s återställning med sökvägar."
-#: builtin/reset.c:327
+#: builtin/reset.c:340
#, c-format
msgid "%s reset is not allowed in a bare repository"
msgstr "%s återställning tillåts inte i ett naket arkiv"
#: builtin/reset.c:344
+msgid "-N can only be used with --mixed"
+msgstr "-N kan endast användas med --mixed"
+
+#: builtin/reset.c:361
msgid "Unstaged changes after reset:"
msgstr "Oköade ändringar efter återställning:"
-#: builtin/reset.c:350
+#: builtin/reset.c:367
#, c-format
msgid "Could not reset index file to revision '%s'."
msgstr "Kunde inte återställa indexfilen till versionen \"%s\"."
-#: builtin/reset.c:355
+#: builtin/reset.c:372
msgid "Could not write new index file."
msgstr "Kunde inte skriva ny indexfil."
@@ -8886,7 +8847,7 @@ msgstr "sluta tolka efter första argument som inte är flagga"
msgid "output in stuck long form"
msgstr "utdata fast i lång form"
-#: builtin/rev-parse.c:486
+#: builtin/rev-parse.c:497
msgid ""
"git rev-parse --parseopt [options] -- [<args>...]\n"
" or: git rev-parse --sq-quote [<arg>...]\n"
@@ -8958,35 +8919,35 @@ msgstr "alternativ"
msgid "option for merge strategy"
msgstr "alternativ för sammanslagningsstrategi"
-#: builtin/revert.c:102
+#: builtin/revert.c:104
msgid "append commit name"
msgstr "lägg till incheckningsnamn"
-#: builtin/revert.c:103
+#: builtin/revert.c:105
msgid "allow fast-forward"
msgstr "tillåt snabbspolning"
-#: builtin/revert.c:104
+#: builtin/revert.c:106
msgid "preserve initially empty commits"
msgstr "behåll incheckningar som börjar som tomma"
-#: builtin/revert.c:105
+#: builtin/revert.c:107
msgid "allow commits with empty messages"
msgstr "tillåt incheckningar med tomt meddelande"
-#: builtin/revert.c:106
+#: builtin/revert.c:108
msgid "keep redundant, empty commits"
msgstr "behåll redundanta, tomma incheckningar"
-#: builtin/revert.c:110
+#: builtin/revert.c:112
msgid "program error"
msgstr "programfel"
-#: builtin/revert.c:195
+#: builtin/revert.c:197
msgid "revert failed"
msgstr "\"revert\" misslyckades"
-#: builtin/revert.c:210
+#: builtin/revert.c:212
msgid "cherry-pick failed"
msgstr "\"cherry-pick\" misslyckades"
@@ -9260,11 +9221,11 @@ msgstr "ta bort symbolisk referens"
msgid "shorten ref output"
msgstr "förkorta ref-utdata"
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
msgid "reason"
msgstr "skäl"
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
msgid "reason of the update"
msgstr "skäl till uppdateringen"
@@ -9290,32 +9251,32 @@ msgstr ""
msgid "git tag -v <tagname>..."
msgstr "git tag -v <taggnamn>..."
-#: builtin/tag.c:60
+#: builtin/tag.c:67
#, c-format
msgid "malformed object at '%s'"
msgstr "felformat objekt vid \"%s\""
-#: builtin/tag.c:207
+#: builtin/tag.c:239
#, c-format
msgid "tag name too long: %.*s..."
msgstr "taggnamnet för långt: %.*s..."
-#: builtin/tag.c:212
+#: builtin/tag.c:244
#, c-format
msgid "tag '%s' not found."
msgstr "taggen \"%s\" hittades inte."
-#: builtin/tag.c:227
+#: builtin/tag.c:259
#, c-format
msgid "Deleted tag '%s' (was %s)\n"
msgstr "Tog bort tagg \"%s\" (var %s)\n"
-#: builtin/tag.c:239
+#: builtin/tag.c:271
#, c-format
msgid "could not verify the tag '%s'"
msgstr "kunde inte bekräfta taggen \"%s\""
-#: builtin/tag.c:249
+#: builtin/tag.c:281
#, c-format
msgid ""
"\n"
@@ -9326,7 +9287,7 @@ msgstr ""
"Skriv ett taggmeddelande\n"
"Rader som inleds med \"%c\" ignoreras.\n"
-#: builtin/tag.c:253
+#: builtin/tag.c:285
#, c-format
msgid ""
"\n"
@@ -9339,254 +9300,271 @@ msgstr ""
"Rader som inleds med \"%c\" kommer behållas; du kan själv ta bort dem om\n"
"du vill.\n"
-#: builtin/tag.c:292
+#: builtin/tag.c:324
msgid "unable to sign the tag"
msgstr "kunde inte signera taggen"
-#: builtin/tag.c:294
+#: builtin/tag.c:326
msgid "unable to write tag file"
msgstr "kunde inte skriva tagg-filen"
-#: builtin/tag.c:319
+#: builtin/tag.c:351
msgid "bad object type."
msgstr "felaktig objekttyp"
-#: builtin/tag.c:332
+#: builtin/tag.c:364
msgid "tag header too big."
msgstr "tagghuvud för stort."
-#: builtin/tag.c:368
+#: builtin/tag.c:400
msgid "no tag message?"
msgstr "inget taggmeddelande?"
-#: builtin/tag.c:374
+#: builtin/tag.c:406
#, c-format
msgid "The tag message has been left in %s\n"
msgstr "Taggmeddelandet har lämnats i %s\n"
-#: builtin/tag.c:423
+#: builtin/tag.c:455
msgid "switch 'points-at' requires an object"
msgstr "flaggan \"points-at\" behöver ett object"
-#: builtin/tag.c:425
+#: builtin/tag.c:457
#, c-format
msgid "malformed object name '%s'"
msgstr "felformat objektnamn \"%s\""
-#: builtin/tag.c:445
+#: builtin/tag.c:480
+#, c-format
+msgid "unsupported sort specification %s"
+msgstr "sorteringsangivelsen %s stöds ej"
+
+#: builtin/tag.c:500
msgid "list tag names"
msgstr "lista taggnamn"
-#: builtin/tag.c:447
+#: builtin/tag.c:502
msgid "print <n> lines of each tag message"
msgstr "visa <n> rader från varje taggmeddelande"
-#: builtin/tag.c:449
+#: builtin/tag.c:504
msgid "delete tags"
msgstr "ta bort taggar"
-#: builtin/tag.c:450
+#: builtin/tag.c:505
msgid "verify tags"
msgstr "verifiera taggar"
-#: builtin/tag.c:452
+#: builtin/tag.c:507
msgid "Tag creation options"
msgstr "Alternativ för att skapa taggar"
-#: builtin/tag.c:454
+#: builtin/tag.c:509
msgid "annotated tag, needs a message"
msgstr "annoterad tagg, behöver meddelande"
-#: builtin/tag.c:456
+#: builtin/tag.c:511
msgid "tag message"
msgstr "taggmeddelande"
-#: builtin/tag.c:458
+#: builtin/tag.c:513
msgid "annotated and GPG-signed tag"
msgstr "annoterad och GPG-signerad tagg"
-#: builtin/tag.c:462
+#: builtin/tag.c:517
msgid "use another key to sign the tag"
msgstr "använd annan nyckel för att signera taggen"
-#: builtin/tag.c:463
+#: builtin/tag.c:518
msgid "replace the tag if exists"
msgstr "ersätt taggen om den finns"
-#: builtin/tag.c:464
+#: builtin/tag.c:519
msgid "show tag list in columns"
msgstr "lista taggar i spalter"
-#: builtin/tag.c:466
+#: builtin/tag.c:521
+msgid "sort tags"
+msgstr "sortera taggar"
+
+#: builtin/tag.c:525
msgid "Tag listing options"
msgstr "Alternativ för listning av taggar"
-#: builtin/tag.c:469
+#: builtin/tag.c:528 builtin/tag.c:534
msgid "print only tags that contain the commit"
msgstr "visa endast taggar som innehåller incheckningen"
-#: builtin/tag.c:475
+#: builtin/tag.c:540
msgid "print only tags of the object"
msgstr "visa endast taggar för objektet"
-#: builtin/tag.c:501
+#: builtin/tag.c:566
msgid "--column and -n are incompatible"
msgstr "--column och -n är inkompatibla"
-#: builtin/tag.c:518
+#: builtin/tag.c:578
+msgid "--sort and -n are incompatible"
+msgstr "--sort och -n är inkompatibla"
+
+#: builtin/tag.c:585
msgid "-n option is only allowed with -l."
msgstr "Flaggan -n är endast tillåten tillsammans med -l."
-#: builtin/tag.c:520
+#: builtin/tag.c:587
msgid "--contains option is only allowed with -l."
msgstr "Flaggan --contains är endast tillåten tillsammans med -l"
-#: builtin/tag.c:522
+#: builtin/tag.c:589
msgid "--points-at option is only allowed with -l."
msgstr "Flaggan --points-at är endast tillåten tillsammans med -l."
-#: builtin/tag.c:530
+#: builtin/tag.c:597
msgid "only one -F or -m option is allowed."
msgstr "endast en av flaggorna -F eller -m tillåts."
-#: builtin/tag.c:550
+#: builtin/tag.c:617
msgid "too many params"
msgstr "för många parametrar"
-#: builtin/tag.c:556
+#: builtin/tag.c:623
#, c-format
msgid "'%s' is not a valid tag name."
msgstr "\"%s\" är inte ett giltigt taggnamn."
-#: builtin/tag.c:561
+#: builtin/tag.c:628
#, c-format
msgid "tag '%s' already exists"
msgstr "taggen \"%s\" finns redan"
-#: builtin/tag.c:579
+#: builtin/tag.c:646
#, c-format
msgid "%s: cannot lock the ref"
msgstr "%s: kan inte låsa referensen"
-#: builtin/tag.c:581
+#: builtin/tag.c:648
#, c-format
msgid "%s: cannot update the ref"
msgstr "%s: kan inte uppdatera referensen"
-#: builtin/tag.c:583
+#: builtin/tag.c:650
#, c-format
msgid "Updated tag '%s' (was %s)\n"
msgstr "Uppdaterad tagg \"%s\" (var %s)\n"
-#: builtin/update-index.c:402
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr "Packar upp objekt"
+
+#: builtin/update-index.c:399
msgid "git update-index [options] [--] [<file>...]"
msgstr "git update-index [flaggor] [--] [<fil>...]"
-#: builtin/update-index.c:720
+#: builtin/update-index.c:748
msgid "continue refresh even when index needs update"
msgstr "fortsätt uppdatera även när index inte är àjour"
-#: builtin/update-index.c:723
+#: builtin/update-index.c:751
msgid "refresh: ignore submodules"
msgstr "refresh: ignorera undermoduler"
-#: builtin/update-index.c:726
+#: builtin/update-index.c:754
msgid "do not ignore new files"
msgstr "ignorera inte nya filer"
-#: builtin/update-index.c:728
+#: builtin/update-index.c:756
msgid "let files replace directories and vice-versa"
msgstr "låt filer ersätta kataloger och omvänt"
-#: builtin/update-index.c:730
+#: builtin/update-index.c:758
msgid "notice files missing from worktree"
msgstr "lägg märke till filer som saknas i arbetskatalogen"
-#: builtin/update-index.c:732
+#: builtin/update-index.c:760
msgid "refresh even if index contains unmerged entries"
msgstr "uppdatera även om indexet innehåller ej sammanslagna poster"
-#: builtin/update-index.c:735
+#: builtin/update-index.c:763
msgid "refresh stat information"
msgstr "uppdatera statusinformation"
-#: builtin/update-index.c:739
+#: builtin/update-index.c:767
msgid "like --refresh, but ignore assume-unchanged setting"
msgstr "som --refresh, men ignorera assume-unchanged-inställning"
-#: builtin/update-index.c:743
-msgid "<mode> <object> <path>"
-msgstr "<läge> <objekt> <sökväg>"
+#: builtin/update-index.c:771
+msgid "<mode>,<object>,<path>"
+msgstr "<läge>,<objekt>,<sökväg>"
-#: builtin/update-index.c:744
+#: builtin/update-index.c:772
msgid "add the specified entry to the index"
msgstr "lägg till angiven post i indexet"
-#: builtin/update-index.c:748
+#: builtin/update-index.c:776
msgid "(+/-)x"
msgstr "(+/-)x"
-#: builtin/update-index.c:749
+#: builtin/update-index.c:777
msgid "override the executable bit of the listed files"
msgstr "överstyr exekveringsbiten för angivna filer"
-#: builtin/update-index.c:753
+#: builtin/update-index.c:781
msgid "mark files as \"not changing\""
msgstr "markera filer som \"ändras inte\""
-#: builtin/update-index.c:756
+#: builtin/update-index.c:784
msgid "clear assumed-unchanged bit"
msgstr "rensa \"assume-unchanged\"-biten"
-#: builtin/update-index.c:759
+#: builtin/update-index.c:787
msgid "mark files as \"index-only\""
msgstr "markera filer som \"endast index\""
-#: builtin/update-index.c:762
+#: builtin/update-index.c:790
msgid "clear skip-worktree bit"
msgstr "töm \"skip-worktree\"-biten"
-#: builtin/update-index.c:765
+#: builtin/update-index.c:793
msgid "add to index only; do not add content to object database"
msgstr "lägg endast till indexet; lägg inte till innehållet i objektdatabasen"
-#: builtin/update-index.c:767
+#: builtin/update-index.c:795
msgid "remove named paths even if present in worktree"
msgstr "ta bort namngivna sökvägar även om de finns i arbetskatalogen"
-#: builtin/update-index.c:769
+#: builtin/update-index.c:797
msgid "with --stdin: input lines are terminated by null bytes"
msgstr "med --stdin: indatarader termineras med null-byte"
-#: builtin/update-index.c:771
+#: builtin/update-index.c:799
msgid "read list of paths to be updated from standard input"
msgstr "läs lista över sökvägar att uppdatera från standard in"
-#: builtin/update-index.c:775
+#: builtin/update-index.c:803
msgid "add entries from standard input to the index"
-msgstr "lägg poster från från standard in till indexet"
+msgstr "lägg poster från standard in till indexet"
-#: builtin/update-index.c:779
+#: builtin/update-index.c:807
msgid "repopulate stages #2 and #3 for the listed paths"
msgstr "återfyll etapp 2 och 3 från angivna sökvägar"
-#: builtin/update-index.c:783
+#: builtin/update-index.c:811
msgid "only update entries that differ from HEAD"
msgstr "uppdatera endast poster som skiljer sig från HEAD"
-#: builtin/update-index.c:787
+#: builtin/update-index.c:815
msgid "ignore files missing from worktree"
msgstr "ignorera filer som saknas i arbetskatalogen"
-#: builtin/update-index.c:790
+#: builtin/update-index.c:818
msgid "report actions to standard output"
msgstr "raportera åtgärder på standard ut"
-#: builtin/update-index.c:792
+#: builtin/update-index.c:820
msgid "(for porcelains) forget saved unresolved conflicts"
msgstr "(för porslin) glöm sparade olösta konflikter"
-#: builtin/update-index.c:796
+#: builtin/update-index.c:824
msgid "write index in this format"
msgstr "skriv index i detta format"
@@ -9602,19 +9580,19 @@ msgstr "git update-ref [flaggor] <refnamn> <gammaltvärde> [<nyttvärde>]"
msgid "git update-ref [options] --stdin [-z]"
msgstr "git update-ref [flaggor] --stdin [-z]"
-#: builtin/update-ref.c:255
+#: builtin/update-ref.c:256
msgid "delete the reference"
msgstr "ta bort referensen"
-#: builtin/update-ref.c:257
+#: builtin/update-ref.c:258
msgid "update <refname> not the one it points to"
msgstr "uppdatera <refnamn> inte det den pekar på"
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:259
msgid "stdin has NUL-terminated arguments"
msgstr "standard in har NUL-terminerade argument"
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:260
msgid "read updates from stdin"
msgstr "läs uppdateringar från standard in"
@@ -9672,23 +9650,23 @@ msgstr ""
"några konceptvägledningar. Se \"git help <kommando>\" eller \"git help\n"
"<koncept>\" för att läsa mer om specifika underkommandon och koncept."
-#: parse-options.h:146
-msgid "expiry date"
-msgstr "giltig till"
+#: parse-options.h:143
+msgid "expiry-date"
+msgstr "giltig-till"
-#: parse-options.h:161
+#: parse-options.h:158
msgid "no-op (backward compatibility)"
msgstr "ingen funktion (bakåtkompatibilitet)"
-#: parse-options.h:235
+#: parse-options.h:232
msgid "be more verbose"
msgstr "var mer pratsam"
-#: parse-options.h:237
+#: parse-options.h:234
msgid "be more quiet"
msgstr "var mer tyst"
-#: parse-options.h:243
+#: parse-options.h:240
msgid "use <n> digits to display SHA-1s"
msgstr "använd <n> siffror för att visa SHA-1:or"
@@ -9776,11 +9754,11 @@ msgstr "Visa status för arbetskatalogen"
msgid "Create, list, delete or verify a tag object signed with GPG"
msgstr "Skapa, visa, ta bort eller verifiera GPG-signerat taggobjekt"
-#: git-am.sh:50
+#: git-am.sh:52
msgid "You need to set your committer info first"
msgstr "Du måste ställa in din incheckarinformation först"
-#: git-am.sh:95
+#: git-am.sh:97
msgid ""
"You seem to have moved HEAD since the last 'am' failure.\n"
"Not rewinding to ORIG_HEAD"
@@ -9788,7 +9766,7 @@ msgstr ""
"Du verkar ha flyttat HEAD sedan \"am\" sist misslyckades.\n"
"Återställer inte till ORIG_HEAD"
-#: git-am.sh:105
+#: git-am.sh:107
#, sh-format
msgid ""
"When you have resolved this problem, run \"$cmdline --continue\".\n"
@@ -9799,21 +9777,21 @@ msgstr ""
"Om du vill hoppa över patchen kör du istället \"$cmdline --skip\".\n"
"För att återställa originalgrenen och avbryta kör du \"$cmdline --abort\"."
-#: git-am.sh:121
+#: git-am.sh:123
msgid "Cannot fall back to three-way merge."
msgstr "Kan inte falla tillbaka på trevägssammanslagning."
-#: git-am.sh:137
+#: git-am.sh:139
msgid "Repository lacks necessary blobs to fall back on 3-way merge."
msgstr ""
"Arkivet saknar objekt som behövs för att falla tillbaka på 3-"
"vägssammanslagning."
-#: git-am.sh:139
+#: git-am.sh:141
msgid "Using index info to reconstruct a base tree..."
-msgstr "Använder indexinfo för att åteskapa ett basträd..."
+msgstr "Använder indexinfo för att återskapa ett basträd..."
-#: git-am.sh:154
+#: git-am.sh:156
msgid ""
"Did you hand edit your patch?\n"
"It does not apply to blobs recorded in its index."
@@ -9821,29 +9799,29 @@ msgstr ""
"Har du handredigerat din patch?\n"
"Den kan inte tillämpas på blobbar som antecknats i dess index."
-#: git-am.sh:163
+#: git-am.sh:165
msgid "Falling back to patching base and 3-way merge..."
msgstr ""
"Faller tillbaka på att patcha grundversionen och trevägssammanslagning..."
-#: git-am.sh:179
+#: git-am.sh:181
msgid "Failed to merge in the changes."
msgstr "Misslyckads slå ihop ändringarna."
-#: git-am.sh:274
+#: git-am.sh:276
msgid "Only one StGIT patch series can be applied at once"
msgstr "Endast en StGIT-patchserie kan tillämpas åt gången"
-#: git-am.sh:361
+#: git-am.sh:363
#, sh-format
msgid "Patch format $patch_format is not supported."
msgstr "Patchformatet $patch_format stöds inte."
-#: git-am.sh:363
+#: git-am.sh:365
msgid "Patch format detection failed."
msgstr "Misslyckades detektera patchformat."
-#: git-am.sh:389
+#: git-am.sh:392
msgid ""
"The -b/--binary option has been a no-op for long time, and\n"
"it will be removed. Please do not use it anymore."
@@ -9851,16 +9829,16 @@ msgstr ""
"Flaggan -b/--binary har varit utan funktion länge, och\n"
"kommer tas bort. Vi ber dig att inte använda den längre."
-#: git-am.sh:479
+#: git-am.sh:486
#, sh-format
msgid "previous rebase directory $dotest still exists but mbox given."
msgstr "tidigare rebase-katalog $dotest finns fortfarande, men mbox angavs."
-#: git-am.sh:484
+#: git-am.sh:491
msgid "Please make up your mind. --skip or --abort?"
msgstr "Bestäm dig. --skip eller --abort?"
-#: git-am.sh:520
+#: git-am.sh:527
#, sh-format
msgid ""
"Stray $dotest directory found.\n"
@@ -9869,16 +9847,16 @@ msgstr ""
"Kvarbliven katalog $dotest hittades.\n"
"Använd \"git am --abort\" för att ta bort den."
-#: git-am.sh:528
+#: git-am.sh:535
msgid "Resolve operation not in progress, we are not resuming."
msgstr "Lösningsoperation pågår inte, vi återupptar inte."
-#: git-am.sh:594
+#: git-am.sh:601
#, sh-format
msgid "Dirty index: cannot apply patches (dirty: $files)"
msgstr "Smutsigt index: kan inte tillämpa patchar (smutsiga: $files)"
-#: git-am.sh:698
+#: git-am.sh:705
#, sh-format
msgid ""
"Patch is empty. Was it split wrong?\n"
@@ -9889,32 +9867,32 @@ msgstr ""
"Om du vill hoppa över patchen kör du istället \"$cmdline --skip\".\n"
"För att återställa originalgrenen och avbryta kör du \"$cmdline --abort\"."
-#: git-am.sh:725
+#: git-am.sh:732
msgid "Patch does not have a valid e-mail address."
msgstr "Patchen har inte någon giltig e-postadress."
-#: git-am.sh:772
+#: git-am.sh:779
msgid "cannot be interactive without stdin connected to a terminal."
msgstr ""
"kan inte vara interaktiv om standard in inte är ansluten till en terminal."
-#: git-am.sh:776
+#: git-am.sh:783
msgid "Commit Body is:"
msgstr "Incheckningskroppen är:"
#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
#. in your translation. The program will only accept English
#. input at this point.
-#: git-am.sh:783
+#: git-am.sh:790
msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
msgstr "Tillämpa? Y=ja/N=nej/E=redigera/V=visa patch/A=godta alla "
-#: git-am.sh:819
+#: git-am.sh:826
#, sh-format
msgid "Applying: $FIRSTLINE"
msgstr "Tillämpar: $FIRSTLINE"
-#: git-am.sh:840
+#: git-am.sh:847
msgid ""
"No changes - did you forget to use 'git add'?\n"
"If there is nothing left to stage, chances are that something else\n"
@@ -9924,7 +9902,7 @@ msgstr ""
"Om det inte är något kvar att köa kan det hända att något annat redan\n"
"introducerat samma ändringar; kanske du bör hoppa över patchen."
-#: git-am.sh:848
+#: git-am.sh:855
msgid ""
"You still have unmerged paths in your index\n"
"did you forget to use 'git add'?"
@@ -9932,16 +9910,16 @@ msgstr ""
"Du har fortfarande sökvägar som inte slagits samman i ditt index\n"
"glömde du använda \"git add\"?"
-#: git-am.sh:864
+#: git-am.sh:871
msgid "No changes -- Patch already applied."
msgstr "Inga ändringar -- Patchen har redan tillämpats."
-#: git-am.sh:874
+#: git-am.sh:881
#, sh-format
msgid "Patch failed at $msgnum $FIRSTLINE"
msgstr "Patchen misslyckades vid $msgnum $FIRSTLINE"
-#: git-am.sh:877
+#: git-am.sh:884
#, sh-format
msgid ""
"The copy of the patch that failed is found in:\n"
@@ -9950,7 +9928,7 @@ msgstr ""
"En kopia av patchen som misslyckades finns i:\n"
" $dotest/patch"
-#: git-am.sh:895
+#: git-am.sh:902
msgid "applying to an empty history"
msgstr "tillämpar på en tom historik"
@@ -10019,8 +9997,6 @@ msgstr "Felaktig rev-indata: $rev"
msgid "'git bisect bad' can take only one argument."
msgstr "\"git bisect bad\" kan bara ta ett argument."
-#. have bad but not good. we could bisect although
-#. this is less optimum.
#: git-bisect.sh:273
msgid "Warning: bisecting only with a bad commit."
msgstr "Varning: utför \"bisect\" med endast en dålig incheckning"
@@ -10126,15 +10102,11 @@ msgstr ""
msgid "Pull is not possible because you have unmerged files."
msgstr "Du kan inte göra en \"pull\" då du har ändringar som inte checkats in."
-#: git-pull.sh:223
+#: git-pull.sh:247
msgid "updating an unborn branch with changes added to the index"
msgstr "uppdaterar en ofödd gren med ändringar som lagts till i indexet"
-#. The fetch involved updating the current branch.
-#. The working tree and the index file is still based on the
-#. $orig_head commit, but we are merging into $curr_head.
-#. First update the working tree to match $curr_head.
-#: git-pull.sh:247
+#: git-pull.sh:271
#, sh-format
msgid ""
"Warning: fetch updated the current branch head.\n"
@@ -10145,15 +10117,15 @@ msgstr ""
"Varning: snabbspolar din arbetskatalog från\n"
"Varning: incheckningen $orig_head."
-#: git-pull.sh:272
+#: git-pull.sh:296
msgid "Cannot merge multiple branches into empty head"
msgstr "Kan inte slå ihop flera grenar i ett tomt huvud."
-#: git-pull.sh:276
+#: git-pull.sh:300
msgid "Cannot rebase onto multiple branches"
msgstr "Kan inte utföra en \"rebase\" ovanpå flera grenar"
-#: git-rebase.sh:55
+#: git-rebase.sh:57
msgid ""
"When you have resolved this problem, run \"git rebase --continue\".\n"
"If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
@@ -10164,16 +10136,16 @@ msgstr ""
"Om du vill hoppa över patchen kör du istället \"git rebase --skip\".\n"
"För att återställa originalgrenen och avbryta kör du \"git rebase --abort\"."
-#: git-rebase.sh:158
+#: git-rebase.sh:164
msgid "Applied autostash."
msgstr "Tillämpade autostash."
-#: git-rebase.sh:161
+#: git-rebase.sh:167
#, sh-format
msgid "Cannot store $stash_sha1"
msgstr "Kan inte spara $stash_sha1"
-#: git-rebase.sh:162
+#: git-rebase.sh:168
msgid ""
"Applying autostash resulted in conflicts.\n"
"Your changes are safe in the stash.\n"
@@ -10183,31 +10155,31 @@ msgstr ""
"Dina ändringar är säkra i stashen.\n"
"Du kan när som helst använda \"git stash pop\" eller \"git stash drop\".\n"
-#: git-rebase.sh:201
+#: git-rebase.sh:207
msgid "The pre-rebase hook refused to rebase."
msgstr "Kroken pre-rebase vägrade ombaseringen."
-#: git-rebase.sh:206
+#: git-rebase.sh:212
msgid "It looks like git-am is in progress. Cannot rebase."
msgstr "Det verkar som en git-am körs. Kan inte ombasera."
-#: git-rebase.sh:346
+#: git-rebase.sh:350
msgid "The --exec option must be used with the --interactive option"
msgstr "Flaggan --exec måste användas tillsammans med flaggan --interactive"
-#: git-rebase.sh:351
+#: git-rebase.sh:355
msgid "No rebase in progress?"
msgstr "Ingen ombasering pågår?"
-#: git-rebase.sh:362
+#: git-rebase.sh:366
msgid "The --edit-todo action can only be used during interactive rebase."
msgstr "Åtgärden --edit-todo kan endast användas under interaktiv ombasering."
-#: git-rebase.sh:369
+#: git-rebase.sh:373
msgid "Cannot read HEAD"
msgstr "Kan inte läsa HEAD"
-#: git-rebase.sh:372
+#: git-rebase.sh:376
msgid ""
"You must edit all merge conflicts and then\n"
"mark them as resolved using git add"
@@ -10215,12 +10187,12 @@ msgstr ""
"Du måste redigera alla sammanslagningskonflikter och\n"
"därefter markera dem som lösta med git add"
-#: git-rebase.sh:390
+#: git-rebase.sh:394
#, sh-format
msgid "Could not move back to $head_name"
msgstr "Kunde inte flytta tillbaka till $head_name"
-#: git-rebase.sh:409
+#: git-rebase.sh:413
#, sh-format
msgid ""
"It seems that there is already a $state_dir_base directory, and\n"
@@ -10241,66 +10213,65 @@ msgstr ""
"och kör programmet igen. Jag avslutar ifall du fortfarande har\n"
"något av värde där."
-#: git-rebase.sh:456
+#: git-rebase.sh:464
#, sh-format
msgid "invalid upstream $upstream_name"
msgstr "ogiltig uppström $upstream_name"
-#: git-rebase.sh:480
+#: git-rebase.sh:488
#, sh-format
msgid "$onto_name: there are more than one merge bases"
msgstr "$onto_name: mer än en sammanslagningsbas finns"
-#: git-rebase.sh:483 git-rebase.sh:487
+#: git-rebase.sh:491 git-rebase.sh:495
#, sh-format
msgid "$onto_name: there is no merge base"
msgstr "$onto_name: ingen sammanslagningsbas finns"
-#: git-rebase.sh:492
+#: git-rebase.sh:500
#, sh-format
msgid "Does not point to a valid commit: $onto_name"
msgstr "Peka på en giltig incheckning: $onto_name"
-#: git-rebase.sh:515
+#: git-rebase.sh:523
#, sh-format
msgid "fatal: no such branch: $branch_name"
msgstr "ödesdigert: ingen sådan gren: $branch_name"
-#: git-rebase.sh:548
+#: git-rebase.sh:556
msgid "Cannot autostash"
msgstr "Kan inte utföra \"autostash\""
-#: git-rebase.sh:553
+#: git-rebase.sh:561
#, sh-format
msgid "Created autostash: $stash_abbrev"
msgstr "Skapade autostash: $stash_abbrev"
-#: git-rebase.sh:557
+#: git-rebase.sh:565
msgid "Please commit or stash them."
msgstr "Checka in eller använd \"stash\" på dem."
-#: git-rebase.sh:577
+#: git-rebase.sh:585
#, sh-format
msgid "Current branch $branch_name is up to date."
msgstr "Aktuell gren $branch_name är à jour."
-#: git-rebase.sh:581
+#: git-rebase.sh:589
#, sh-format
msgid "Current branch $branch_name is up to date, rebase forced."
msgstr "Aktuell gren $branch_name är à jour, ombasering framtvingad."
-#: git-rebase.sh:592
+#: git-rebase.sh:600
#, sh-format
msgid "Changes from $mb to $onto:"
msgstr "Ändringar från $mb till $onto:"
-#. Detach HEAD and reset the tree
-#: git-rebase.sh:601
+#: git-rebase.sh:609
msgid "First, rewinding head to replay your work on top of it..."
msgstr ""
"Först, spolar tillbaka huvudet för att spela av ditt arbete ovanpå det..."
-#: git-rebase.sh:611
+#: git-rebase.sh:619
#, sh-format
msgid "Fast-forwarded $branch_name to $onto_name."
msgstr "Snabbspolade $branch_name till $onto_name."
@@ -10421,21 +10392,21 @@ msgstr "Kan inte ta bort ändrade filer ur kön"
msgid "Index was not unstashed."
msgstr "Indexet har inte tagits ur kön."
-#: git-stash.sh:523
+#: git-stash.sh:529
#, sh-format
msgid "Dropped ${REV} ($s)"
msgstr "Kastade ${REV} ($s)"
-#: git-stash.sh:524
+#: git-stash.sh:530
#, sh-format
msgid "${REV}: Could not drop stash entry"
msgstr "${REV}: Kunde inte kasta \"stash\"-post"
-#: git-stash.sh:531
+#: git-stash.sh:537
msgid "No branch name specified"
msgstr "Inget grennamn angavs"
-#: git-stash.sh:603
+#: git-stash.sh:609
msgid "(To restore them type \"git stash apply\")"
msgstr "(För att återställa dem, skriv \"git stash apply\")"
@@ -10450,31 +10421,31 @@ msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
msgstr ""
"Hittade ingen undermodulmappning i .gitmodules för sökvägen \"$sm_path\""
-#: git-submodule.sh:281
+#: git-submodule.sh:287
#, sh-format
msgid "Clone of '$url' into submodule path '$sm_path' failed"
msgstr "Misslyckades klona \"$url\" till undermodulsökvägen \"$sm_path\""
-#: git-submodule.sh:293
+#: git-submodule.sh:299
#, sh-format
msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
msgstr "Gitkatalog \"$a\" ingår i undermodulsökvägen \"$b\" eller omvänt"
-#: git-submodule.sh:403
+#: git-submodule.sh:409
msgid "Relative path can only be used from the toplevel of the working tree"
msgstr "Relativ sökväg kan enfast användas från arbetskatalogens toppnivå"
-#: git-submodule.sh:413
+#: git-submodule.sh:419
#, sh-format
msgid "repo URL: '$repo' must be absolute or begin with ./|../"
msgstr "arkiv-URL: \"$repo\" måste vara absolut eller börja med ./|../"
-#: git-submodule.sh:430
+#: git-submodule.sh:436
#, sh-format
msgid "'$sm_path' already exists in the index"
msgstr "\"$sm_path\" finns redan i indexet"
-#: git-submodule.sh:434
+#: git-submodule.sh:440
#, sh-format
msgid ""
"The following path is ignored by one of your .gitignore files:\n"
@@ -10485,22 +10456,22 @@ msgstr ""
"$sm_path\n"
"Använd -f om du verkligen vill lägga till den"
-#: git-submodule.sh:452
+#: git-submodule.sh:458
#, sh-format
msgid "Adding existing repo at '$sm_path' to the index"
msgstr "Lägger till befintligt arkiv i \"$sm_path\" i indexet"
-#: git-submodule.sh:454
+#: git-submodule.sh:460
#, sh-format
msgid "'$sm_path' already exists and is not a valid git repo"
msgstr "\"$sm_path\" finns redan och är inte ett giltigt git-arkiv"
-#: git-submodule.sh:462
+#: git-submodule.sh:468
#, sh-format
msgid "A git directory for '$sm_name' is found locally with remote(s):"
msgstr "En git-katalog för \"$sm_name\" hittades lokalt med fjärr(ar):"
-#: git-submodule.sh:464
+#: git-submodule.sh:470
#, sh-format
msgid ""
"If you want to reuse this local git directory instead of cloning again from"
@@ -10508,14 +10479,14 @@ msgstr ""
"För att återanvända den lokala git-katalogen istället för att på nytt klona "
"från"
-#: git-submodule.sh:466
+#: git-submodule.sh:472
#, sh-format
msgid ""
"use the '--force' option. If the local git directory is not the correct repo"
msgstr ""
"använd flaggan \"--force\". Om den lokala git-katalogen inte är riktigt arkiv"
-#: git-submodule.sh:467
+#: git-submodule.sh:473
#, sh-format
msgid ""
"or you are unsure what this means choose another name with the '--name' "
@@ -10524,81 +10495,81 @@ msgstr ""
"eller om du är osäker på vad det innebär, välj nytt namn med flaggan \"--name"
"\"."
-#: git-submodule.sh:469
+#: git-submodule.sh:475
#, sh-format
msgid "Reactivating local git directory for submodule '$sm_name'."
msgstr "Aktiverar lokal git-katalog för undermodulen \"$sm_name\" på nytt."
-#: git-submodule.sh:481
+#: git-submodule.sh:487
#, sh-format
msgid "Unable to checkout submodule '$sm_path'"
msgstr "Kan inte checka ut undermodulen \"$sm_path\""
-#: git-submodule.sh:486
+#: git-submodule.sh:492
#, sh-format
msgid "Failed to add submodule '$sm_path'"
msgstr "Misslyckades lägga till undermodulen \"$sm_path\""
-#: git-submodule.sh:495
+#: git-submodule.sh:501
#, sh-format
msgid "Failed to register submodule '$sm_path'"
msgstr "Misslyckades registrera undermodulen \"$sm_path\""
-#: git-submodule.sh:539
+#: git-submodule.sh:545
#, sh-format
msgid "Entering '$prefix$displaypath'"
msgstr "GÃ¥r in i \"$prefix$displaypath\""
-#: git-submodule.sh:559
+#: git-submodule.sh:565
#, sh-format
msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
msgstr ""
"Stoppar på \"$prefix$displaypath\"; skriptet returnerade en status skild "
"från noll."
-#: git-submodule.sh:605
+#: git-submodule.sh:611
#, sh-format
msgid "No url found for submodule path '$displaypath' in .gitmodules"
msgstr ""
"Hittade ingen url för undermodulsökvägen \"$displaypath\" i .gitmodules"
-#: git-submodule.sh:614
+#: git-submodule.sh:620
#, sh-format
msgid "Failed to register url for submodule path '$displaypath'"
msgstr "Misslyckades registrera url för undermodulsökväg \"$displaypath\""
-#: git-submodule.sh:616
+#: git-submodule.sh:622
#, sh-format
msgid "Submodule '$name' ($url) registered for path '$displaypath'"
msgstr ""
"Undermodulen \"$name\" ($url) registrerad för sökvägen \"$displaypath\""
-#: git-submodule.sh:633
+#: git-submodule.sh:639
#, sh-format
msgid "Failed to register update mode for submodule path '$displaypath'"
msgstr ""
"Misslyckades registrera uppdateringsläge för undermodulsökväg \"$displaypath"
"\""
-#: git-submodule.sh:671
+#: git-submodule.sh:677
#, sh-format
msgid "Use '.' if you really want to deinitialize all submodules"
msgstr "Använd \".\" om du verkligen vill avinitiera alla undermoduler"
-#: git-submodule.sh:688
+#: git-submodule.sh:694
#, sh-format
msgid "Submodule work tree '$displaypath' contains a .git directory"
msgstr ""
"Undermodulens arbetskatalog \"$displaypath\" innehåller katalogen \".git\""
-#: git-submodule.sh:689
+#: git-submodule.sh:695
#, sh-format
msgid ""
"(use 'rm -rf' if you really want to remove it including all of its history)"
msgstr ""
"(använd \"rm -rf\" om du verkligen vill ta bort den och all dess historik)"
-#: git-submodule.sh:695
+#: git-submodule.sh:701
#, sh-format
msgid ""
"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -10607,28 +10578,28 @@ msgstr ""
"Undermodulens arbetskatalog \"$displaypath\" har lokala ändringar; \"-f\" "
"kastar bort dem"
-#: git-submodule.sh:698
+#: git-submodule.sh:704
#, sh-format
msgid "Cleared directory '$displaypath'"
msgstr "Rensade katalogen \"$displaypath\""
-#: git-submodule.sh:699
+#: git-submodule.sh:705
#, sh-format
msgid "Could not remove submodule work tree '$displaypath'"
msgstr "Kunde inte ta bort undermodulens arbetskatalog \"$displaypath\""
-#: git-submodule.sh:702
+#: git-submodule.sh:708
#, sh-format
msgid "Could not create empty submodule directory '$displaypath'"
msgstr "Kunde inte skapa tom undermodulskatalog \"$displaypath\""
-#: git-submodule.sh:711
+#: git-submodule.sh:717
#, sh-format
msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
msgstr ""
"Undermodulen \"$name\" ($url) avregistrerad för sökvägen \"$displaypath\""
-#: git-submodule.sh:834
+#: git-submodule.sh:833
#, sh-format
msgid ""
"Submodule path '$displaypath' not initialized\n"
@@ -10637,109 +10608,219 @@ msgstr ""
"Undermodulen \"$displaypath\" har inte initierats\n"
"Kanske du vill köra \"update --init\"?"
-#: git-submodule.sh:847
+#: git-submodule.sh:846
#, sh-format
msgid "Unable to find current revision in submodule path '$displaypath'"
msgstr "Kan inte hitta aktuell revision i undermodulsökvägen \"$displaypath\""
-#: git-submodule.sh:856
+#: git-submodule.sh:855
#, sh-format
msgid "Unable to fetch in submodule path '$sm_path'"
msgstr "Kan inte hämta i undermodulsökväg \"$sm_path\""
-#: git-submodule.sh:880
+#: git-submodule.sh:879
#, sh-format
msgid "Unable to fetch in submodule path '$displaypath'"
msgstr "Kan inte hämta i undermodulsökväg \"$displaypath\""
+#: git-submodule.sh:893
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr "Kan inte checka ut \"$sha1\" i undermodulsökvägen \"$displaypath\""
+
#: git-submodule.sh:894
#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "Undermodulsökvägen \"$displaypath\": checkade ut \"$sha1\""
+
+#: git-submodule.sh:898
+#, sh-format
msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
msgstr "Kan inte ombasera \"$sha1\" i undermodulsökvägen \"$displaypath\""
-#: git-submodule.sh:895
+#: git-submodule.sh:899
#, sh-format
msgid "Submodule path '$displaypath': rebased into '$sha1'"
msgstr "Undermodulsökvägen \"$displaypath\": ombaserade in i \"$sha1\""
-#: git-submodule.sh:900
+#: git-submodule.sh:904
#, sh-format
msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
msgstr "Kan inte slå ihop \"$sha1\" i undermodulsökvägen \"$displaypath\""
-#: git-submodule.sh:901
+#: git-submodule.sh:905
#, sh-format
msgid "Submodule path '$displaypath': merged in '$sha1'"
msgstr "Undermodulsökvägen \"$displaypath\": sammanslagen i \"$sha1\""
-#: git-submodule.sh:906
+#: git-submodule.sh:910
#, sh-format
msgid ""
"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
msgstr ""
"Misslyckades köra \"$command $sha1\" i undermodulsökvägen \"$prefix$sm_path\""
-#: git-submodule.sh:907
+#: git-submodule.sh:911
#, sh-format
msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
msgstr "Undermodulsökvägen \"$prefix$sm_path\": \"$command $sha1\""
-#: git-submodule.sh:912
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
-msgstr "Kan inte checka ut \"$sha1\" i undermodulsökvägen \"$displaypath\""
-
-#: git-submodule.sh:913
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "Undermodulsökvägen \"$displaypath\": checkade ut \"$sha1\""
-
-#: git-submodule.sh:940
+#: git-submodule.sh:941
#, sh-format
msgid "Failed to recurse into submodule path '$displaypath'"
msgstr "Misslyckades rekursera in i undermodulsökvägen \"$displaypath\""
-#: git-submodule.sh:1048
+#: git-submodule.sh:1049
msgid "The --cached option cannot be used with the --files option"
msgstr "Flaggan --cached kan inte användas med flaggan --files"
-#. unexpected type
-#: git-submodule.sh:1096
+#: git-submodule.sh:1097
#, sh-format
msgid "unexpected mode $mod_dst"
msgstr "oväntat läge $mod_dst"
-#: git-submodule.sh:1116
+#: git-submodule.sh:1117
#, sh-format
msgid " Warn: $display_name doesn't contain commit $sha1_src"
msgstr " Varning: $display_name innehåller inte incheckningen $sha1_src"
-#: git-submodule.sh:1119
+#: git-submodule.sh:1120
#, sh-format
msgid " Warn: $display_name doesn't contain commit $sha1_dst"
msgstr " Varning: $display_name innehåller inte incheckningen $sha1_dst"
-#: git-submodule.sh:1122
+#: git-submodule.sh:1123
#, sh-format
msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
msgstr ""
" Varning: $display_name innehåller inte incheckningarna $sha1_src och "
"$sha1_dst"
-#: git-submodule.sh:1147
+#: git-submodule.sh:1148
msgid "blob"
msgstr "blob"
-#: git-submodule.sh:1261
+#: git-submodule.sh:1262
#, sh-format
msgid "Failed to recurse into submodule path '$sm_path'"
msgstr "Misslyckades rekursera in i undermodulsökvägen \"$sm_path\""
-#: git-submodule.sh:1325
+#: git-submodule.sh:1326
#, sh-format
msgid "Synchronizing submodule url for '$displaypath'"
msgstr "Synkroniserar undermodul-url för \"$displaypath\""
+#~ msgid "Tracking not set up: name too long: %s"
+#~ msgstr "Spårning har inte ställts in: namnet för långt: %s"
+
+#~ msgid "could not find .gitmodules in index"
+#~ msgstr "kunde inte hitta .gitmodules i indexet"
+
+#~ msgid "reading updated .gitmodules failed"
+#~ msgstr "misslyckades läsa uppdaterad .gitmodules"
+
+#~ msgid "unable to stat updated .gitmodules"
+#~ msgstr "kan inte ta status på uppdaterad .gitmodules"
+
+#~ msgid "unable to remove .gitmodules from index"
+#~ msgstr "kan inte ta bort .gitmodules från indexet"
+
+#~ msgid "adding updated .gitmodules failed"
+#~ msgstr "misslyckades lägga till uppdaterad .gitmodules"
+
+#~ msgid "bug"
+#~ msgstr "programfel"
+
+#~ msgid "ahead "
+#~ msgstr "före "
+
+#~ msgid ", behind "
+#~ msgstr ", efter "
+
+#~ 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 ""
+#~ "Beteendet för \"git add %s (eller %s)\" utan sökvägsargument från en\n"
+#~ "underkatalog i ett träd kommer ändras i Git 2.0 och bör inte längre "
+#~ "användas.\n"
+#~ "För att lägga till innehållet för hela trädet, använd:\n"
+#~ "\n"
+#~ " git add %s :/\n"
+#~ " (eller git add %s :/)\n"
+#~ "\n"
+#~ "För att begränsa kommandot till aktuell katalog, använd:\n"
+#~ "\n"
+#~ " git add %s .\n"
+#~ " (eller git add %s .)\n"
+#~ "\n"
+#~ "I nuvarande version av Git begränsas kommandot till aktuell katalog.\n"
+
+#~ msgid ""
+#~ "You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
+#~ "whose behaviour will change in Git 2.0 with respect to paths you "
+#~ "removed.\n"
+#~ "Paths like '%s' that are\n"
+#~ "removed from your working tree are ignored with this version of Git.\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <pathspec>', which is the current default,\n"
+#~ " ignores paths you removed from your working tree.\n"
+#~ "\n"
+#~ "* 'git add --all <pathspec>' will let you also record the removals.\n"
+#~ "\n"
+#~ "Run 'git status' to check the paths you removed from your working tree.\n"
+#~ msgstr ""
+#~ "Du körde \"git add\" utan varken \"-A (--all)\" eller \"--ignore-removal"
+#~ "\".\n"
+#~ "Beteendet kommer ändras i Git 2.0 vad gäller sökvägar du tagit bort.\n"
+#~ "Sökvägar som \"%s\", som har\n"
+#~ "tagits bort från din arbetskatalog ignoreras i den här versionen av Git.\n"
+#~ "\n"
+#~ "* \"git add --ignore-removal <sökväg>\", som är förvalet just nu,\n"
+#~ " ignorerar sökvägar du har tagit bort från arbetskatalogen.\n"
+#~ "\n"
+#~ "* \"git add --all <sökväg>\" låter dig även registrera borttagningarna.\n"
+#~ "\n"
+#~ "Kör \"git status\" för att kontrollera sökvägarna du tagit bort från\n"
+#~ "arbetskatalogen.\n"
+
+#~ msgid "key id"
+#~ msgstr "nyckel-id"
+
+#~ 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 ""
+#~ "Packar arkivet automatiskt för optimal prestanda. Du kan även\n"
+#~ "köra \"git gc\" manuellt. Se \"git help gc\" för mer information.\n"
+
+#~ 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 ""
+#~ "Uppdateringar avvisades då änden på en insänd gren är bakom dess\n"
+#~ "fjärrmotsvarighet. Om det inte var meningen att sända in grenen, bör\n"
+#~ "du specificera grenar att sända, eller ändra inställningsvariabeln\n"
+#~ "\"push-default\" till \"simple\", \"current\" eller \"upstream\" för att "
+#~ "endast\n"
+#~ "sända aktuell gren."
+
#~ msgid "copied: %s -> %s"
#~ msgstr "kopierad: %s -> %s"
@@ -10758,9 +10839,6 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\""
#~ msgid "input paths are terminated by a null character"
#~ msgstr "sökvägar avdelas med null-tecken"
-#~ msgid "done\n"
-#~ msgstr "klart\n"
-
#~ msgid ""
#~ "The following untracked files would NOT be saved but need to be removed "
#~ "by stash save:"
@@ -10886,15 +10964,9 @@ msgstr "Synkroniserar undermodul-url för \"$displaypath\""
#~ msgstr[0] ", %d borttagning(-)"
#~ msgstr[1] ", %d borttagningar(-)"
-#~ msgid "Auto packing the repository for optimum performance.\n"
-#~ msgstr "Packar arkivet automatiskt för optimal prestanda.\n"
-
#~ msgid " (use \"git add\" to track)"
#~ msgstr " (spåra med \"git add\")"
-#~ msgid "-B cannot be used with -b"
-#~ msgstr "-B kan inte användas med -b"
-
#~ msgid "--detach cannot be used with -b/-B/--orphan"
#~ msgstr "--detcah kan inte användas med -b/-B/--orphan"
diff --git a/po/vi.po b/po/vi.po
index b9676a88e4..f05974f695 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -6,10 +6,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: git v1.9-pu\n"
+"Project-Id-Version: git v2.0.0-rc0\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-02-01 08:06+0800\n"
-"PO-Revision-Date: 2014-02-03 07:30+0700\n"
+"POT-Creation-Date: 2014-04-19 12:50+0800\n"
+"PO-Revision-Date: 2014-04-20 15:20+0700\n"
"Last-Translator: Trần Ngá»c Quân <vnwildman@gmail.com>\n"
"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
"Language: vi\n"
@@ -22,16 +22,12 @@ msgstr ""
"X-Poedit-Basepath: ../\n"
"X-Generator: Poedit 1.5.5\n"
-#: advice.c:57
+#: advice.c:55
#, c-format
msgid "hint: %.*s\n"
-msgstr "tìm thấy: %.*s\n"
+msgstr "gợi ý: %.*s\n"
-#.
-#. * Message used both when 'git commit' fails and when
-#. * other commands doing a merge do.
-#.
-#: advice.c:87
+#: advice.c:85
msgid ""
"Fix them up in the work tree,\n"
"and then use 'git add/rm <file>' as\n"
@@ -62,76 +58,76 @@ msgstr ""
msgid "git archive --remote <repo> [--exec <cmd>] --list"
msgstr "git archive --remote <kho> [--exec <lệnh>] --list"
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
#, c-format
msgid "pathspec '%s' did not match any files"
msgstr "đặc tả Ä‘Æ°á»ng dẫn “%s†không khá»›p vá»›i bất kỳ tập tin nào"
-#: archive.c:327
+#: archive.c:328
msgid "fmt"
-msgstr "fmt"
+msgstr "định_dạng"
-#: archive.c:327
+#: archive.c:328
msgid "archive format"
msgstr "định dạng lưu trữ"
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
msgid "prefix"
-msgstr "tiá»n tố"
+msgstr "tiá»n_tố"
-#: archive.c:329
+#: archive.c:330
msgid "prepend prefix to each pathname in the archive"
msgstr "nối thêm tiá»n tố vào từng Ä‘Æ°á»ng dẫn tập tin trong kho lÆ°u"
-#: archive.c: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
+#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2258
+#: builtin/blame.c:2259 builtin/config.c:57 builtin/fast-export.c:680
+#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
+#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
msgid "file"
msgstr "tập-tin"
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 builtin/archive.c:89
msgid "write the archive to this file"
msgstr "ghi kho lưu vào tập tin này"
-#: archive.c:333
+#: archive.c:334
msgid "read .gitattributes in working directory"
msgstr "Ä‘á»c .gitattributes trong thÆ° mục làm việc"
-#: archive.c:334
+#: archive.c:335
msgid "report archived files on stderr"
msgstr "liệt kê các tập tin được lưu trữ vào stderr (đầu ra lỗi tiêu chuẩn)"
-#: archive.c:335
+#: archive.c:336
msgid "store only"
msgstr "chỉ lưu (không nén)"
-#: archive.c:336
+#: archive.c:337
msgid "compress faster"
msgstr "nén nhanh hơn"
-#: archive.c:344
+#: archive.c:345
msgid "compress better"
msgstr "nén nhỠhơn"
-#: archive.c:347
+#: archive.c:348
msgid "list supported archive formats"
msgstr "liệt kê các kiểu nén được hỗ trợ"
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
msgid "repo"
msgstr "kho"
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 builtin/archive.c:91
msgid "retrieve the archive from remote repository <repo>"
-msgstr "nhận kho lưu từ kho chứa <kho> trên máy chủ"
+msgstr "nhận kho nén từ kho chứa <kho> trên máy chủ"
-#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
msgid "command"
msgstr "lệnh"
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
msgid "path to the remote git-upload-archive command"
msgstr "Ä‘Æ°á»ng dẫn đến lệnh git-upload-pack trên máy chủ"
@@ -148,84 +144,79 @@ msgstr ""
msgid "Not setting branch %s as its own upstream."
msgstr "Chưa cài đặt nhánh %s như là thượng nguồn của nó."
-#: branch.c:82
+#: branch.c:83
#, c-format
msgid "Branch %s set up to track remote branch %s from %s by rebasing."
msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s từ %s bằng cách rebase."
-#: branch.c:83
+#: branch.c:84
#, c-format
msgid "Branch %s set up to track remote branch %s from %s."
msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s từ %s."
-#: branch.c:87
+#: branch.c:88
#, c-format
msgid "Branch %s set up to track local branch %s by rebasing."
msgstr "Nhánh %s cài đặt để theo dõi nhánh nội bộ %s bằng cách rebase."
-#: branch.c:88
+#: branch.c:89
#, c-format
msgid "Branch %s set up to track local branch %s."
msgstr "Nhánh %s cài đặt để theo dõi nhánh nội bộ %s."
-#: branch.c:92
+#: branch.c:94
#, c-format
msgid "Branch %s set up to track remote ref %s by rebasing."
msgstr "Nhánh %s cài đặt để theo dõi nhánh máy chủ %s bằng cách rebase."
-#: branch.c:93
+#: branch.c:95
#, c-format
msgid "Branch %s set up to track remote ref %s."
msgstr "Nhánh %s cài đặt để theo dõi tham chiếu máy chủ %s."
-#: branch.c:97
+#: branch.c:99
#, c-format
msgid "Branch %s set up to track local ref %s by rebasing."
msgstr ""
"Nhánh %s cài đặt để theo dõi vết tham chiếu nội bộ %s bằng cách rebase."
-#: branch.c:98
+#: branch.c:100
#, c-format
msgid "Branch %s set up to track local ref %s."
msgstr "Nhánh %s cài đặt để theo dõi tham chiếu nội bộ %s."
-#: branch.c:118
-#, c-format
-msgid "Tracking not set up: name too long: %s"
-msgstr "Việc theo dõi chưa được cài đặt: tên quá dài: %s"
-
-#: branch.c:137
+#: branch.c:133
#, c-format
msgid "Not tracking: ambiguous information for ref %s"
msgstr "Không theo dõi: thông tin chưa rõ ràng cho tham chiếu %s"
-#: branch.c:182
+#: branch.c:178
#, c-format
msgid "'%s' is not a valid branch name."
msgstr "“%s†không phải là một tên nhánh hợp lệ."
-#: branch.c:187
+#: branch.c:183
#, c-format
msgid "A branch named '%s' already exists."
msgstr "Äã có nhánh mang tên “%sâ€."
-#: branch.c:195
+#: branch.c:191
msgid "Cannot force update the current branch."
msgstr "Không thể ép buộc cập nhật nhánh hiện hành."
-#: branch.c:215
+#: branch.c:211
#, c-format
msgid "Cannot setup tracking information; starting point '%s' is not a branch."
msgstr ""
"Không thể cài đặt thông tin theo dõi; điểm bắt đầu “%s†không phải là một "
"nhánh."
-#: branch.c:217
+#: branch.c:213
#, c-format
msgid "the requested upstream branch '%s' does not exist"
msgstr "nhánh thượng nguồn đã yêu cầu “%s†không tồn tại"
-#: branch.c:219
+#: branch.c:215
msgid ""
"\n"
"If you are planning on basing your work on an upstream\n"
@@ -245,113 +236,113 @@ msgstr ""
"sẽ theo dõi bản đối chiếu máy chủ của nó, bạn cần dùng lệnh\n"
"\"git push -u\" để đặt cấu hình thượng nguồn bạn muốn push."
-#: branch.c:264
+#: branch.c:260
#, c-format
msgid "Not a valid object name: '%s'."
msgstr "Không phải tên đối tượng hợp lệ: “%sâ€."
-#: branch.c:284
+#: branch.c:280
#, c-format
msgid "Ambiguous object name: '%s'."
msgstr "Tên đối tượng chÆ°a rõ ràng: “%sâ€."
-#: branch.c:289
+#: branch.c:285
#, c-format
msgid "Not a valid branch point: '%s'."
msgstr "Nhánh không hợp lệ: “%sâ€."
-#: branch.c:295
+#: branch.c:291
msgid "Failed to lock ref for update"
msgstr "Gặp lỗi khi khóa tham chiếu (ref) để cập nhật"
-#: branch.c:313
+#: branch.c:309
msgid "Failed to write ref"
msgstr "Gặp lỗi khi ghi tham chiếu (ref)"
-#: bundle.c:37
+#: bundle.c:33
#, c-format
msgid "'%s' does not look like a v2 bundle file"
msgstr "“%s†không giống như tập tin v2 bundle (định dạng dump của git)"
-#: bundle.c:64
+#: bundle.c:60
#, c-format
msgid "unrecognized header: %s%s (%d)"
msgstr "phần đầu không được thừa nhận: %s%s (%d)"
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
#, c-format
msgid "could not open '%s'"
msgstr "không thể mở “%sâ€"
-#: bundle.c:141
+#: bundle.c:138
msgid "Repository lacks these prerequisite commits:"
msgstr "Kho chứa thiếu những lần chuyển giao tiên quyết này:"
-#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: bundle.c:162 sequencer.c:669 sequencer.c:1123 builtin/log.c:332
#: builtin/log.c:821 builtin/log.c:1418 builtin/log.c:1644 builtin/merge.c:357
#: builtin/shortlog.c:158
msgid "revision walk setup failed"
msgstr "cài đặt việc di chuyển qua các điểm xét duyệt gặp lỗi"
-#: bundle.c:187
+#: bundle.c:184
#, c-format
msgid "The bundle contains this ref:"
msgid_plural "The bundle contains these %d refs:"
msgstr[0] "Bundle chứa tham chiếu (ref) này:"
msgstr[1] "Bundle chứa %d tham chiếu (ref):"
-#: bundle.c:194
+#: bundle.c:191
msgid "The bundle records a complete history."
msgstr "Lệnh bundle ghi lại toàn bộ lịch sử."
-#: bundle.c:196
+#: bundle.c:193
#, c-format
msgid "The bundle requires this ref:"
msgid_plural "The bundle requires these %d refs:"
msgstr[0] "Lệnh bundle yêu cầu tham chiếu này:"
msgstr[1] "Lệnh bundle yêu cầu %d tham chiếu (refs) này:"
-#: bundle.c:296
+#: bundle.c:293
msgid "rev-list died"
msgstr "rev-list đã chết"
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
#, c-format
msgid "unrecognized argument: %s"
msgstr "đối số không được thừa nhận: %s"
-#: bundle.c:337
+#: bundle.c:334
#, c-format
msgid "ref '%s' is excluded by the rev-list options"
msgstr "th.chiếu “%s†bị loại trừ bởi các tùy chá»n rev-list"
-#: bundle.c:382
+#: bundle.c:379
msgid "Refusing to create empty bundle."
msgstr "Từ chối tạo một bundle trống rỗng."
-#: bundle.c:398
+#: bundle.c:395
msgid "Could not spawn pack-objects"
msgstr "Không thể sản sinh đối tượng gói"
-#: bundle.c:416
+#: bundle.c:413
msgid "pack-objects died"
msgstr "pack-objects đã chết"
-#: bundle.c:419
+#: bundle.c:416
#, c-format
msgid "cannot create '%s'"
msgstr "không thể tạo “%sâ€"
-#: bundle.c:441
+#: bundle.c:438
msgid "index-pack died"
msgstr "index-pack đã chết"
-#: commit.c:53
+#: commit.c:54
#, c-format
msgid "could not parse %s"
msgstr "không thể phân tích cú pháp %s"
-#: commit.c:55
+#: commit.c:56
#, c-format
msgid "%s %s is not a commit!"
msgstr "%s %s không phải là một lần commit!"
@@ -427,6 +418,7 @@ msgid_plural "%lu years"
msgstr[0] "%lu năm"
msgstr[1] "%lu năm"
+#. TRANSLATORS: "%s" is "<n> years"
#: date.c:149
#, c-format
msgid "%s, %lu month ago"
@@ -446,6 +438,10 @@ msgstr[1] "%lu năm trước"
msgid "failed to read orderfile '%s'"
msgstr "gặp lá»—i khi Ä‘á»c tập-tin-thứ-tá»± “%sâ€"
+#: diffcore-rename.c:517
+msgid "Performing inexact rename detection"
+msgstr "Äang thá»±c hiện dò tìm đổi tên không chính xác"
+
#: diff.c:113
#, c-format
msgid " Failed to parse dirstat cut-off percentage '%s'\n"
@@ -470,7 +466,7 @@ msgstr ""
"Tìm thấy các lá»—i trong biến cấu hình “diff.dirstatâ€:\n"
"%s"
-#: diff.c:3509
+#: diff.c:3495
#, c-format
msgid ""
"Failed to parse --dirstat/-X option parameter:\n"
@@ -479,7 +475,7 @@ msgstr ""
"Gặp lá»—i khi phân tích đối số tùy chá»n --dirstat/-X:\n"
"%s"
-#: diff.c:3523
+#: diff.c:3509
#, c-format
msgid "Failed to parse --submodule option parameter: '%s'"
msgstr "Gặp lá»—i khi phân tích đối số tùy chá»n --submodule: “%sâ€"
@@ -506,35 +502,35 @@ msgstr "không thể tạo tập tin tạm thá»i “%sâ€: %s"
msgid "failed writing detached signature to '%s': %s"
msgstr "gặp lá»—i khi ghi chữ ký đính kèm vào “%sâ€: %s"
-#: grep.c:1695
+#: grep.c:1698
#, c-format
msgid "'%s': unable to read %s"
msgstr "“%sâ€: không thể Ä‘á»c %s"
-#: grep.c:1712
+#: grep.c:1715
#, c-format
msgid "'%s': %s"
msgstr "“%sâ€: %s"
-#: grep.c:1723
+#: grep.c:1726
#, c-format
msgid "'%s': short read %s"
msgstr "“%sâ€: Ä‘á»c ngắn %s"
-#: help.c:210
+#: help.c:209
#, c-format
msgid "available git commands in '%s'"
msgstr "các lệnh git sẵn có trong thÆ° mục “%sâ€:"
-#: help.c:217
+#: help.c:216
msgid "git commands available from elsewhere on your $PATH"
msgstr "các lệnh git sẵn có từ một nơi khác trong $PATH của bạn"
-#: help.c:233
+#: help.c:232
msgid "The most commonly used git commands are:"
msgstr "Những lệnh git hay được dùng nhất là:"
-#: help.c:290
+#: help.c:289
#, c-format
msgid ""
"'%s' appears to be a git command, but we were not\n"
@@ -543,11 +539,11 @@ msgstr ""
"“%s†trông như là một lệnh git, nhưng chúng tôi không\n"
"thể thá»±c thi nó. Có lẽ là lệnh git-%s đã bị há»ng?"
-#: help.c:347
+#: help.c:346
msgid "Uh oh. Your system reports no Git commands at all."
msgstr "á»i chà. Hệ thống của bạn báo rằng chẳng có lệnh Git nào cả."
-#: help.c:369
+#: help.c:368
#, c-format
msgid ""
"WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -556,17 +552,17 @@ msgstr ""
"CẢNH BÃO: Bạn đã gá»i lệnh Git có tên “%sâ€, mà nó lại không có sẵn.\n"
"Tiếp tục và coi rằng ý bạn là “%sâ€"
-#: help.c:374
+#: help.c:373
#, c-format
msgid "in %0.1f seconds automatically..."
msgstr "trong %0.1f giây một cách tự động..."
-#: help.c:381
+#: help.c:380
#, c-format
msgid "git: '%s' is not a git command. See 'git --help'."
msgstr "git: “%s†không phải là má»™t lệnh của git. Xem “git --helpâ€."
-#: help.c:385 help.c:444
+#: help.c:384 help.c:443
msgid ""
"\n"
"Did you mean this?"
@@ -580,7 +576,7 @@ msgstr[1] ""
"\n"
"Có phải ý bạn là một trong số những cái này không?"
-#: help.c:440
+#: help.c:439
#, c-format
msgid "%s: %s - %s"
msgstr "%s: %s - %s"
@@ -589,7 +585,7 @@ msgstr "%s: %s - %s"
msgid "failed to read the cache"
msgstr "gặp lá»—i khi Ä‘á»c bá»™ nhá»› đệm"
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
#: builtin/clone.c:661
msgid "unable to write new index file"
msgstr "không thể ghi tập tin lưu bảng mục lục mới"
@@ -599,75 +595,73 @@ msgstr "không thể ghi tập tin lưu bảng mục lục mới"
msgid "(bad commit)\n"
msgstr "(commit sai)\n"
-#: merge-recursive.c:206
+#: merge-recursive.c:208
#, c-format
msgid "addinfo_cache failed for path '%s'"
msgstr "addinfo_cache gặp lá»—i đối vá»›i Ä‘Æ°á»ng dẫn “%sâ€"
-#: merge-recursive.c:269
+#: merge-recursive.c:271
msgid "error building trees"
msgstr "gặp lỗi khi xây dựng cây"
-#: merge-recursive.c:673
+#: merge-recursive.c:675
#, c-format
msgid "failed to create path '%s'%s"
msgstr "gặp lá»—i khi tạo Ä‘Æ°á»ng dẫn “%sâ€%s"
-#: merge-recursive.c:684
+#: merge-recursive.c:686
#, c-format
msgid "Removing %s to make room for subdirectory\n"
msgstr "Gỡ bỠ%s để tạo chỗ (room) cho thư mục con\n"
-#. something else exists
-#. .. but not some other error (who really cares what?)
-#: merge-recursive.c:698 merge-recursive.c:719
+#: merge-recursive.c:700 merge-recursive.c:721
msgid ": perhaps a D/F conflict?"
msgstr ": có lẽ là một xung đột D/F?"
-#: merge-recursive.c:709
+#: merge-recursive.c:711
#, c-format
msgid "refusing to lose untracked file at '%s'"
msgstr "từ chối đóng tập tin không được theo dõi tại “%sâ€"
-#: merge-recursive.c:749
+#: merge-recursive.c:751
#, c-format
msgid "cannot read object %s '%s'"
msgstr "không thể Ä‘á»c đối tượng %s “%sâ€"
-#: merge-recursive.c:751
+#: merge-recursive.c:753
#, c-format
msgid "blob expected for %s '%s'"
msgstr "đối tượng blob được mong đợi cho %s “%sâ€"
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
#, c-format
msgid "failed to open '%s'"
msgstr "gặp lá»—i khi mở “%sâ€"
-#: merge-recursive.c:782
+#: merge-recursive.c:784
#, c-format
msgid "failed to symlink '%s'"
msgstr "gặp lá»—i khi tạo liên kết má»m (symlink) “%sâ€"
-#: merge-recursive.c:785
+#: merge-recursive.c:787
#, c-format
msgid "do not know what to do with %06o %s '%s'"
msgstr "không hiểu phải làm gì vá»›i %06o %s “%sâ€"
-#: merge-recursive.c:923
+#: merge-recursive.c:925
msgid "Failed to execute internal merge"
msgstr "Gặp lỗi khi thực hiện trộn nội bộ"
-#: merge-recursive.c:927
+#: merge-recursive.c:929
#, c-format
msgid "Unable to add %s to database"
msgstr "Không thể thêm %s vào cơ sở dữ liệu"
-#: merge-recursive.c:943
+#: merge-recursive.c:945
msgid "unsupported object type in the tree"
msgstr "kiểu đối tượng không được hỗ trợ trong cây (tree)"
-#: merge-recursive.c:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -676,7 +670,7 @@ msgstr ""
"XUNG ÄỘT (%s/xóa): %s bị xóa trong %s và %s trong %s. Phiên bản %s của %s "
"còn lại trong cây (tree)."
-#: merge-recursive.c:1028 merge-recursive.c:1041
+#: merge-recursive.c:1030 merge-recursive.c:1043
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -685,20 +679,20 @@ msgstr ""
"XUNG ÄỘT (%s/xóa): %s bị xóa trong %s và %s trong %s. Phiên bản %s của %s "
"còn lại trong cây (tree) tại %s."
-#: merge-recursive.c:1082
+#: merge-recursive.c:1084
msgid "rename"
msgstr "đổi tên"
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
msgid "renamed"
msgstr "đã đổi tên"
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
#, c-format
msgid "%s is a directory in %s adding as %s instead"
msgstr "%s là một thư mục trong %s thay vào đó thêm vào như là %s"
-#: merge-recursive.c:1160
+#: merge-recursive.c:1162
#, c-format
msgid ""
"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -707,146 +701,146 @@ msgstr ""
"XUNG ÄỘT (đổi-tên/đổi-tên): Äổi tên \"%s\"->\"%s\" trong nhánh \"%s\" đổi "
"tên \"%s\"->\"%s\" trong \"%s\"%s"
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
msgid " (left unresolved)"
msgstr " (cần giải quyết)"
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
#, c-format
msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
msgstr ""
"XUNG ÄỘT (đổi-tên/đổi-tên): Äổi tên %s->%s trong %s. Äổi tên %s->%s trong %s"
-#: merge-recursive.c:1249
+#: merge-recursive.c:1251
#, c-format
msgid "Renaming %s to %s and %s to %s instead"
msgstr "Äang đổi tên %s thành %s thay vì %s thành %s"
-#: merge-recursive.c:1448
+#: merge-recursive.c:1450
#, c-format
msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
msgstr ""
"XUNG ÄỘT (đổi-tên/thêm): Äổi tên %s->%s trong %s. %s được thêm vào trong %s"
-#: merge-recursive.c:1458
+#: merge-recursive.c:1460
#, c-format
msgid "Adding merged %s"
msgstr "Thêm hòa trộn %s"
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
#, c-format
msgid "Adding as %s instead"
msgstr "Thay vào đó thêm vào %s"
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
#, c-format
msgid "cannot read object %s"
msgstr "không thể Ä‘á»c đối tượng %s"
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
#, c-format
msgid "object %s is not a blob"
msgstr "đối tượng %s không phải là một blob"
-#: merge-recursive.c:1565
+#: merge-recursive.c:1567
msgid "modify"
msgstr "sửa đổi"
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
msgid "modified"
msgstr "đã sửa"
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
msgid "content"
msgstr "ná»™i dung"
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
msgid "add/add"
msgstr "thêm/thêm"
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
#, c-format
msgid "Skipped %s (merged same as existing)"
msgstr "Äã bá» qua %s (đã có sẵn lần hòa trá»™n này)"
-#: merge-recursive.c:1630
+#: merge-recursive.c:1632
#, c-format
msgid "Auto-merging %s"
msgstr "Tự-động-hòa-trộn %s"
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
msgid "submodule"
msgstr "mô-đun-con"
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
#, c-format
msgid "CONFLICT (%s): Merge conflict in %s"
msgstr "XUNG ÄỘT (%s): Xung Ä‘á»™t hòa trá»™n trong %s"
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
#, c-format
msgid "Removing %s"
msgstr "Äang xóa %s"
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
msgid "file/directory"
msgstr "tập-tin/thư-mục"
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
msgid "directory/file"
msgstr "thư-mục/tập tin"
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
#, c-format
msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
msgstr ""
"XUNG ÄỘT (%s): Ở đây không có thÆ° mục nào có tên %s trong %s. Thêm %s nhÆ° là "
"%s"
-#: merge-recursive.c:1771
+#: merge-recursive.c:1773
#, c-format
msgid "Adding %s"
msgstr "Thêm \"%s\""
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
msgid "Fatal merge failure, shouldn't happen."
msgstr "Việc hòa trá»™n há»ng nghiêm trá»ng, không nên để xảy ra."
-#: merge-recursive.c:1807
+#: merge-recursive.c:1809
msgid "Already up-to-date!"
msgstr "Äã cập nhật rồi!"
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
#, c-format
msgid "merging of trees %s and %s failed"
msgstr "hòa trộn cây (tree) %s và %s gặp lỗi"
-#: merge-recursive.c:1846
+#: merge-recursive.c:1848
#, c-format
msgid "Unprocessed path??? %s"
msgstr "ÄÆ°á»ng dẫn chÆ°a được xá»­ lý??? %s"
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
msgid "Merging:"
msgstr "Äang trá»™n:"
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
#, c-format
msgid "found %u common ancestor:"
msgid_plural "found %u common ancestors:"
msgstr[0] "tìm thấy %u tổ tiên chung:"
msgstr[1] "tìm thấy %u tổ tiên chung:"
-#: merge-recursive.c:1941
+#: merge-recursive.c:1943
msgid "merge returned no commit"
msgstr "hòa trộn không trả vỠlần chuyển giao nào"
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
#, c-format
msgid "Could not parse object '%s'"
msgstr "Không thể phân tích đối tượng “%sâ€"
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
msgid "Unable to write index."
msgstr "Không thể ghi bảng mục lục"
@@ -873,33 +867,33 @@ msgstr "Từ chối ghi đè ghi chú trong %s (nằm ngoài refs/notes/)"
msgid "Bad %s value: '%s'"
msgstr "Giá trị %s sai: “%sâ€"
-#: object.c:202
+#: object.c:229
#, c-format
msgid "unable to parse object: %s"
msgstr "không thể phân tích đối tượng: “%sâ€"
-#: parse-options.c:537
+#: parse-options.c:532
msgid "..."
msgstr "..."
-#: parse-options.c:555
+#: parse-options.c:550
#, c-format
msgid "usage: %s"
msgstr "cách dùng: %s"
#. TRANSLATORS: the colon here should align with the
#. one in "usage: %s" translation
-#: parse-options.c:559
+#: parse-options.c:554
#, c-format
msgid " or: %s"
msgstr " hoặc: %s"
-#: parse-options.c:562
+#: parse-options.c:557
#, c-format
msgid " %s"
msgstr " %s"
-#: parse-options.c:596
+#: parse-options.c:591
msgid "-NUM"
msgstr "-Sá»"
@@ -950,11 +944,6 @@ msgstr "%s: “%s†ngoài một kho chứa"
msgid "Pathspec '%s' is in submodule '%.*s'"
msgstr "Äặc tả Ä‘Æ°á»ng dẫn “%s†thì ở trong mô-Ä‘un-con “%.*sâ€"
-#.
-#. * We may want to substitute "this command" with a command
-#. * name. E.g. when add--interactive dies when running
-#. * "checkout -p"
-#.
#: pathspec.c:353
#, c-format
msgid "%s: pathspec magic not supported by this command: %s"
@@ -973,57 +962,74 @@ msgstr ""
"Ở đây không có gì bị loại trừ bởi: các mẫu (loại trừ).\n"
"Có lẽ bạn đã quên thêm hoặc là “:/†hoặc là “.�"
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr "xong"
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"index.version được đặt, nhưng giá trị của nó lại không hợp lệ.\n"
+"Dùng phiên bản %i"
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"GIT_INDEX_VERSION được đặt, nhưng giá trị của nó lại không hợp lệ.\n"
+"Dùng phiên bản %i"
+
+#: remote.c:758
#, c-format
msgid "Cannot fetch both %s and %s to %s"
msgstr "Không thể lấy vỠcả %s và %s cho %s"
-#: remote.c:757
+#: remote.c:762
#, c-format
msgid "%s usually tracks %s, not %s"
msgstr "%s thÆ°á»ng theo dõi %s, không phải %s"
-#: remote.c:761
+#: remote.c:766
#, c-format
msgid "%s tracks both %s and %s"
msgstr "%s theo dõi cả %s và %s"
-#.
-#. * This last possibility doesn't occur because
-#. * FETCH_HEAD_IGNORE entries always appear at
-#. * the end of the list.
-#.
-#: remote.c:769
+#: remote.c:774
msgid "Internal error"
msgstr "Lá»—i ná»™i bá»™"
-#: remote.c:1871
+#: remote.c:1948
#, c-format
msgid "Your branch is based on '%s', but the upstream is gone.\n"
msgstr ""
"Nhánh của bạn dá»±a trên cÆ¡ sở là “%sâ€, nhÆ°ng trên thượng nguồn không còn.\n"
-#: remote.c:1875
+#: remote.c:1952
msgid " (use \"git branch --unset-upstream\" to fixup)\n"
msgstr " (dùng \" git branch --unset-upstream\" để sửa)\n"
-#: remote.c:1878
+#: remote.c:1955
#, c-format
msgid "Your branch is up-to-date with '%s'.\n"
msgstr "Nhánh của bạn đã cập nhật vá»›i “%sâ€.\n"
-#: remote.c:1882
+#: remote.c:1959
#, c-format
msgid "Your branch is ahead of '%s' by %d commit.\n"
msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
msgstr[0] "Nhánh của bạn là đầu của “%s†bởi %d lần chuyển giao.\n"
msgstr[1] "Nhánh của bạn là đầu của “%s†bởi %d lần chuyển giao.\n"
-#: remote.c:1888
+#: remote.c:1965
msgid " (use \"git push\" to publish your local commits)\n"
msgstr " (dùng \"git push\" để xuất bản các lần chuyển giao nội bộ của bạn)\n"
-#: remote.c:1891
+#: remote.c:1968
#, c-format
msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
msgid_plural ""
@@ -1035,11 +1041,11 @@ msgstr[1] ""
"Nhánh của bạn ở đằng sau “%s†%d lần chuyển giao, và có thể được fast-"
"forward.\n"
-#: remote.c:1899
+#: remote.c:1976
msgid " (use \"git pull\" to update your local branch)\n"
msgstr " (dùng \"git pull\" để cập nhật nhánh nội bộ của bạn)\n"
-#: remote.c:1902
+#: remote.c:1979
#, c-format
msgid ""
"Your branch and '%s' have diverged,\n"
@@ -1055,7 +1061,7 @@ msgstr[1] ""
"Your branch and “%s†have diverged,\n"
"and have %d and %d different commit each, respectively.\n"
-#: remote.c:1912
+#: remote.c:1989
msgid " (use \"git pull\" to merge the remote branch into yours)\n"
msgstr ""
" (dùng \"git pull\" để hòa trộn nhánh trên máy chủ vào trong nhánh của "
@@ -1070,14 +1076,14 @@ msgstr "gặp lá»—i khi mở “/dev/nullâ€"
msgid "dup2(%d,%d) failed"
msgstr "dup2(%d,%d) gặp lỗi"
-#: sequencer.c:206 builtin/merge.c:783 builtin/merge.c:896
-#: builtin/merge.c:1006 builtin/merge.c:1016
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
#, c-format
msgid "Could not open '%s' for writing"
msgstr "Không thể mở “%s†để ghi"
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786
-#: builtin/merge.c:1008 builtin/merge.c:1021
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
#, c-format
msgid "Could not write to '%s'"
msgstr "Không thể ghi vào “%sâ€"
@@ -1100,7 +1106,7 @@ msgstr ""
"vá»›i lệnh “git add <Ä‘Æ°á»ng_dẫn>†hoặc “git rm <Ä‘Æ°á»ng_dẫn>â€\n"
"và chuyển giao kết quả bằng lệnh “git commitâ€"
-#: sequencer.c:245 sequencer.c:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
#, c-format
msgid "Could not write to %s"
msgstr "Không thể ghi vào %s"
@@ -1136,31 +1142,31 @@ msgstr "Không thể phân giải commit (lần chuyển giao) HEAD\n"
msgid "Unable to update cache tree\n"
msgstr "Không thể cập nhật cây bộ nhớ đệm\n"
-#: sequencer.c:423
+#: sequencer.c:430
#, c-format
msgid "Could not parse commit %s\n"
msgstr "Không thể phân tích commit (lần chuyển giao) %s\n"
-#: sequencer.c:428
+#: sequencer.c:435
#, c-format
msgid "Could not parse parent commit %s\n"
msgstr "Không thể phân tích lần chuyển giao cha mẹ “%sâ€\n"
-#: sequencer.c:494
+#: sequencer.c:501
msgid "Your index file is unmerged."
msgstr "Tập tin lưu mục lục của bạn không được hòa trộn."
-#: sequencer.c:513
+#: sequencer.c:520
#, c-format
msgid "Commit %s is a merge but no -m option was given."
msgstr "Lần chuyển giao %s là má»™t lần hòa trá»™n nhÆ°ng không Ä‘Æ°a ra tùy chá»n -m."
-#: sequencer.c:521
+#: sequencer.c:528
#, c-format
msgid "Commit %s does not have parent %d"
msgstr "Lần chuyển giao %s không có cha mẹ %d"
-#: sequencer.c:525
+#: sequencer.c:532
#, c-format
msgid "Mainline was specified but commit %s is not a merge."
msgstr ""
@@ -1169,153 +1175,153 @@ msgstr ""
#. TRANSLATORS: The first %s will be "revert" or
#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:538
+#: sequencer.c:545
#, c-format
msgid "%s: cannot parse parent commit %s"
msgstr "%s: không thể phân tích lần chuyển giao mẹ của %s"
-#: sequencer.c:542
+#: sequencer.c:549
#, c-format
msgid "Cannot get commit message for %s"
msgstr "Không thể lấy ghi chú lần chuyển giao cho %s"
-#: sequencer.c:628
+#: sequencer.c:635
#, c-format
msgid "could not revert %s... %s"
msgstr "không thể revert %s... %s"
-#: sequencer.c:629
+#: sequencer.c:636
#, c-format
msgid "could not apply %s... %s"
msgstr "không thể apply (áp dụng miếng vá) %s... %s"
-#: sequencer.c:665
+#: sequencer.c:672
msgid "empty commit set passed"
msgstr "lần chuyển giao trống rỗng đặt là hợp quy cách"
-#: sequencer.c:673
+#: sequencer.c:680
#, c-format
msgid "git %s: failed to read the index"
msgstr "git %s: gặp lá»—i Ä‘á»c bảng mục lục"
-#: sequencer.c:678
+#: sequencer.c:685
#, c-format
msgid "git %s: failed to refresh the index"
msgstr "git %s: gặp lỗi khi làm tươi mới bảng mục lục"
-#: sequencer.c:736
+#: sequencer.c:743
#, c-format
msgid "Cannot %s during a %s"
msgstr "Không thể %s trong khi %s"
-#: sequencer.c:758
+#: sequencer.c:765
#, c-format
msgid "Could not parse line %d."
msgstr "Không phân tích được dòng %d."
-#: sequencer.c:763
+#: sequencer.c:770
msgid "No commits parsed."
msgstr "Không có lần chuyển giao nào được phân tích."
-#: sequencer.c:776
+#: sequencer.c:783
#, c-format
msgid "Could not open %s"
msgstr "Không thể mở %s"
-#: sequencer.c:780
+#: sequencer.c:787
#, c-format
msgid "Could not read %s."
msgstr "Không thể Ä‘á»c %s."
-#: sequencer.c:787
+#: sequencer.c:794
#, c-format
msgid "Unusable instruction sheet: %s"
msgstr "Bảng chỉ thị không thể dùng được: %s"
-#: sequencer.c:815
+#: sequencer.c:824
#, c-format
msgid "Invalid key: %s"
msgstr "Khóa không đúng: %s"
-#: sequencer.c:818
+#: sequencer.c:827
#, c-format
msgid "Invalid value for %s: %s"
msgstr "Giá trị không hợp lệ %s: %s"
-#: sequencer.c:830
+#: sequencer.c:839
#, c-format
msgid "Malformed options sheet: %s"
msgstr "Bảng tùy chá»n dị hình: %s"
-#: sequencer.c:851
+#: sequencer.c:860
msgid "a cherry-pick or revert is already in progress"
msgstr "có một thao tác “cherry-pick†hoặc “revert†đang được thực hiện"
-#: sequencer.c:852
+#: sequencer.c:861
msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
msgstr "hãy thử \"git cherry-pick (--continue | --quit | --abort)\""
-#: sequencer.c:856
+#: sequencer.c:865
#, c-format
msgid "Could not create sequencer directory %s"
msgstr "Không thể tạo thư mục xếp dãy %s"
-#: sequencer.c:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
#, c-format
msgid "Error wrapping up %s."
msgstr "Lá»—i bao bá»c %s."
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
msgid "no cherry-pick or revert in progress"
msgstr "không cherry-pick hay revert trong tiến trình"
-#: sequencer.c:893
+#: sequencer.c:902
msgid "cannot resolve HEAD"
msgstr "không thể phân giải HEAD"
-#: sequencer.c:895
+#: sequencer.c:904
msgid "cannot abort from a branch yet to be born"
msgstr "không thể hủy bỠtừ một nhánh mà nó còn chưa được tạo ra"
-#: sequencer.c:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
#, c-format
msgid "cannot open %s: %s"
msgstr "không thể mở %s: %s"
-#: sequencer.c:920
+#: sequencer.c:929
#, c-format
msgid "cannot read %s: %s"
msgstr "không thể Ä‘á»c %s: %s"
-#: sequencer.c:921
+#: sequencer.c:930
msgid "unexpected end of file"
msgstr "gặp kết thúc tập tin đột xuất"
-#: sequencer.c:927
+#: sequencer.c:936
#, c-format
msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
msgstr "tập tin HEAD “pre-cherry-pick†đã lÆ°u “%s†bị há»ng"
-#: sequencer.c:950
+#: sequencer.c:959
#, c-format
msgid "Could not format %s."
msgstr "Không thể định dạng “%sâ€."
-#: sequencer.c:1093
+#: sequencer.c:1104
#, c-format
msgid "%s: can't cherry-pick a %s"
msgstr "%s: không thể cherry-pick một %s"
-#: sequencer.c:1096
+#: sequencer.c:1107
#, c-format
msgid "%s: bad revision"
msgstr "%s: điểm xét duyệt sai"
-#: sequencer.c:1130
+#: sequencer.c:1141
msgid "Can't revert as initial commit"
msgstr "Không thể revert một lần chuyển giao khởi tạo"
-#: sequencer.c:1131
+#: sequencer.c:1142
msgid "Can't cherry-pick into empty head"
msgstr "Không thể cherry-pick vào một đầu (head) trống rỗng"
@@ -1343,21 +1349,21 @@ msgstr ""
"này\n"
"bằng cách chạy lệnh \"git config advice.objectNameWarning false\""
-#: sha1_name.c:1070
+#: sha1_name.c:1072
msgid "HEAD does not point to a branch"
msgstr "HEAD không chỉ đến một nhánh nào cả"
-#: sha1_name.c:1073
+#: sha1_name.c:1075
#, c-format
msgid "No such branch: '%s'"
msgstr "Không có nhánh nào nhÆ° thế: “%sâ€"
-#: sha1_name.c:1075
+#: sha1_name.c:1077
#, c-format
msgid "No upstream configured for branch '%s'"
msgstr "Không có thượng nguồn được cấu hình cho nhánh “%sâ€"
-#: sha1_name.c:1079
+#: sha1_name.c:1081
#, c-format
msgid "Upstream branch '%s' not stored as a remote-tracking branch"
msgstr ""
@@ -1374,52 +1380,34 @@ msgstr ""
msgid "Could not find section in .gitmodules where path=%s"
msgstr "Không thể tìm thấy phần trong .gitmodules nÆ¡i mà Ä‘Æ°á»ng_dẫn=%s"
-#. Maybe the user already did that, don't error out here
#: submodule.c:76
#, c-format
msgid "Could not update .gitmodules entry %s"
msgstr "Không thể cập nhật mục .gitmodules %s"
-#. Maybe the user already did that, don't error out here
#: submodule.c:109
#, c-format
msgid "Could not remove .gitmodules entry for %s"
msgstr "Không thể gỡ bỠmục .gitmodules dành cho %s"
-#: submodule.c:127
-msgid "could not find .gitmodules in index"
-msgstr "không tìm thấy .gitmodules trong bảng mục lục"
-
-#: submodule.c:133
-msgid "reading updated .gitmodules failed"
-msgstr "gặp lá»—i khi Ä‘á»c cập nhật .gitmodules"
-
-#: submodule.c:135
-msgid "unable to stat updated .gitmodules"
-msgstr "không thể lấy thống kê .gitmodules đã cập nhật"
-
-#: submodule.c:139
-msgid "unable to remove .gitmodules from index"
-msgstr "không thể gỡ bỠ.gitmodules từ mục lục"
-
-#: submodule.c:141
-msgid "adding updated .gitmodules failed"
-msgstr "gặp lỗi khi thêm .gitmodules đã cập nhật"
-
-#: submodule.c:143
+#: submodule.c:120
msgid "staging updated .gitmodules failed"
msgstr "gặp lỗi khi tổ chức .gitmodules đã cập nhật"
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 builtin/init-db.c:363
#, c-format
msgid "Could not create git link %s"
msgstr "Không thể tạo liên kết git “%sâ€"
-#: submodule.c:1155
+#: submodule.c:1132
#, c-format
msgid "Could not set core.worktree in %s"
msgstr "Không thể đặt “core.worktree†trong “%sâ€."
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr "Äang lấy ra các tập tin"
+
#: urlmatch.c:120
msgid "invalid URL scheme name or missing '://' suffix"
msgstr "tên lược đồ URL không hợp lệ, hoặc thiếu hậu tố “://â€"
@@ -1531,88 +1519,97 @@ msgid " (use \"git %s <file>...\" to include in what will be committed)"
msgstr ""
" (dùng \"git %s <tập-tin>...\" để thêm vào những gì cần được chuyển giao)"
-#: wt-status.c:254
-msgid "bug"
-msgstr "lá»—i"
-
-#: wt-status.c:259
+#: wt-status.c:252
msgid "both deleted:"
msgstr "bị xóa bởi cả hai:"
-#: wt-status.c:260
+#: wt-status.c:254
msgid "added by us:"
msgstr "được thêm vào bởi chúng ta:"
-#: wt-status.c:261
+#: wt-status.c:256
msgid "deleted by them:"
msgstr "bị xóa Ä‘i bởi há»:"
-#: wt-status.c:262
+#: wt-status.c:258
msgid "added by them:"
msgstr "được thêm vào bởi há»:"
-#: wt-status.c:263
+#: wt-status.c:260
msgid "deleted by us:"
msgstr "bị xóa bởi chúng ta:"
-#: wt-status.c:264
+#: wt-status.c:262
msgid "both added:"
msgstr "được thêm vào bởi cả hai:"
-#: wt-status.c:265
+#: wt-status.c:264
msgid "both modified:"
msgstr "bị sửa bởi cả hai:"
-#: wt-status.c:275
-msgid "new file"
-msgstr "tập tin mới"
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "lỗi: không thể tiếp nhận trạng thái chưa hòa trộn %x"
+
+#: wt-status.c:274
+msgid "new file:"
+msgstr "tập tin mới:"
+
+#: wt-status.c:276
+msgid "copied:"
+msgstr "đã chép:"
-#: wt-status.c:277
-msgid "copied"
-msgstr "đã chép"
+#: wt-status.c:278
+msgid "deleted:"
+msgstr "đã xoá:"
-#: wt-status.c:279
-msgid "deleted"
-msgstr "bị xoá"
+#: wt-status.c:280
+msgid "modified:"
+msgstr "đã sửa:"
-#: wt-status.c:285
-msgid "typechange"
-msgstr "đổi-kiểu"
+#: wt-status.c:282
+msgid "renamed:"
+msgstr "đã đổi tên:"
-#: wt-status.c:287
-msgid "unknown"
-msgstr "không hiểu"
+#: wt-status.c:284
+msgid "typechange:"
+msgstr "đổi-kiểu:"
-#: wt-status.c:289
-msgid "unmerged"
-msgstr "chưa hòa trộn"
+#: wt-status.c:286
+msgid "unknown:"
+msgstr "không hiểu:"
-#: wt-status.c:336
+#: wt-status.c:288
+msgid "unmerged:"
+msgstr "chưa hòa trộn:"
+
+#: wt-status.c:370
msgid "new commits, "
msgstr "lần chuyển giao mới, "
-#: wt-status.c:338
+#: wt-status.c:372
msgid "modified content, "
msgstr "nội dung bị sửa đổi, "
-#: wt-status.c:340
+#: wt-status.c:374
msgid "untracked content, "
msgstr "nội dung chưa được theo dõi, "
-#: wt-status.c:357
+#: wt-status.c:391
#, c-format
msgid "bug: unhandled diff status %c"
msgstr "lỗi: không thể tiếp nhận trạng thái lệnh diff %c"
-#: wt-status.c:732
+#: wt-status.c:765
msgid "Submodules changed but not updated:"
msgstr "Những mô-đun-con đã bị thay đổi nhưng chưa được cập nhật:"
-#: wt-status.c:734
+#: wt-status.c:767
msgid "Submodule changes to be committed:"
msgstr "Những mô-đun-con thay đổi đã được chuyển giao:"
-#: wt-status.c:836
+#: wt-status.c:846
msgid ""
"Do not touch the line above.\n"
"Everything below will be removed."
@@ -1620,72 +1617,72 @@ msgstr ""
"Không Ä‘á»™ng đến Ä‘Æ°á»ng ở trên.\n"
"Má»i thứ phía dÆ°á»›i sẽ được xóa bá»."
-#: wt-status.c:899
+#: wt-status.c:937
msgid "You have unmerged paths."
msgstr "Bạn có những Ä‘Æ°á»ng dẫn chÆ°a được hòa trá»™n."
-#: wt-status.c:902
+#: wt-status.c:940
msgid " (fix conflicts and run \"git commit\")"
msgstr " (sửa các xung đột rồi chạy \"git commit\")"
-#: wt-status.c:905
+#: wt-status.c:943
msgid "All conflicts fixed but you are still merging."
msgstr "Tất cả các xung đột đã được giải quyết nhưng bạn vẫn đang hòa trộn."
-#: wt-status.c:908
+#: wt-status.c:946
msgid " (use \"git commit\" to conclude merge)"
msgstr " (dùng \"git commit\" để hoàn tất việc hòa trộn)"
-#: wt-status.c:918
+#: wt-status.c:956
msgid "You are in the middle of an am session."
msgstr "Bạn Ä‘ang ở giữa của má»™t phiên “amâ€."
-#: wt-status.c:921
+#: wt-status.c:959
msgid "The current patch is empty."
msgstr "Miếng vá hiện tại bị trống rỗng."
-#: wt-status.c:925
+#: wt-status.c:963
msgid " (fix conflicts and then run \"git am --continue\")"
msgstr " (sửa các xung đột và sau đó chạy lệnh \"git am --continue\")"
-#: wt-status.c:927
+#: wt-status.c:965
msgid " (use \"git am --skip\" to skip this patch)"
msgstr " (dùng \"git am --skip\" để bỠqua miếng vá này)"
-#: wt-status.c:929
+#: wt-status.c:967
msgid " (use \"git am --abort\" to restore the original branch)"
msgstr " (dùng \"git am --abort\" để phục hồi lại nhánh nguyên thủy)"
-#: wt-status.c:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
#, c-format
msgid "You are currently rebasing branch '%s' on '%s'."
msgstr "Bạn hiện nay Ä‘ang thá»±c hiện việc “rebase†nhánh “%s†trên “%sâ€."
-#: wt-status.c:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
msgid "You are currently rebasing."
msgstr "Bạn hiện nay Ä‘ang thá»±c hiện việc “rebase†(“cải tổâ€)."
-#: wt-status.c:997
+#: wt-status.c:1035
msgid " (fix conflicts and then run \"git rebase --continue\")"
msgstr ""
" (sửa các xung đột và sau đó chạy lệnh “cải tổ†\"git rebase --continue\")"
-#: wt-status.c:999
+#: wt-status.c:1037
msgid " (use \"git rebase --skip\" to skip this patch)"
msgstr " (dùng lệnh “cải tổ†\"git rebase --skip\" để bỠqua lần vá này)"
-#: wt-status.c:1001
+#: wt-status.c:1039
msgid " (use \"git rebase --abort\" to check out the original branch)"
msgstr ""
" (dùng lệnh “cải tổ†\"git rebase --abort\" để check-out nhánh nguyên thủy)"
-#: wt-status.c:1014
+#: wt-status.c:1052
msgid " (all conflicts fixed: run \"git rebase --continue\")"
msgstr ""
" (khi tất cả các xung đột đã sửa xong: chạy lệnh “cải tổ†\"git rebase --"
"continue\")"
-#: wt-status.c:1018
+#: wt-status.c:1056
#, c-format
msgid ""
"You are currently splitting a commit while rebasing branch '%s' on '%s'."
@@ -1693,126 +1690,126 @@ msgstr ""
"Bạn hiện nay đang thực hiện việc chia tách một lần chuyển giao trong khi "
"Ä‘ang “rebase†nhánh “%s†trên “%sâ€."
-#: wt-status.c:1023
+#: wt-status.c:1061
msgid "You are currently splitting a commit during a rebase."
msgstr ""
"Bạn hiện tại đang cắt đôi một lần chuyển giao trong khi đang thực hiện việc "
"rebase."
-#: wt-status.c:1026
+#: wt-status.c:1064
msgid " (Once your working directory is clean, run \"git rebase --continue\")"
msgstr ""
" (Má»™t khi thÆ° mục làm việc của bạn đã gá»n gàng, chạy lệnh “cải tổ†\"git "
"rebase --continue\")"
-#: wt-status.c:1030
+#: wt-status.c:1068
#, c-format
msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
msgstr ""
"Bạn hiện nay đang thực hiện việc sửa chữa một lần chuyển giao trong khi đang "
"rebase nhánh “%s†trên “%sâ€."
-#: wt-status.c:1035
+#: wt-status.c:1073
msgid "You are currently editing a commit during a rebase."
msgstr "Bạn hiện đang sửa một lần chuyển giao trong khi bạn thực hiện rebase."
-#: wt-status.c:1038
+#: wt-status.c:1076
msgid " (use \"git commit --amend\" to amend the current commit)"
msgstr " (dùng \"git commit --amend\" để “tu bổ†lần chuyển giao hiện tại)"
-#: wt-status.c:1040
+#: wt-status.c:1078
msgid ""
" (use \"git rebase --continue\" once you are satisfied with your changes)"
msgstr ""
" (chạy lệnh “cải tổ†\"git rebase --continue\" một khi bạn cảm thấy hài "
"lòng vỠnhững thay đổi của mình)"
-#: wt-status.c:1050
+#: wt-status.c:1088
#, c-format
msgid "You are currently cherry-picking commit %s."
msgstr "Bạn hiện nay đang thực hiện việc cherry-pick lần chuyển giao %s."
-#: wt-status.c:1055
+#: wt-status.c:1093
msgid " (fix conflicts and run \"git cherry-pick --continue\")"
msgstr ""
" (sửa các xung đột và sau đó chạy lệnh \"git cherry-pick --continue\")"
-#: wt-status.c:1058
+#: wt-status.c:1096
msgid " (all conflicts fixed: run \"git cherry-pick --continue\")"
msgstr ""
" (khi tất cả các xung đột đã sửa xong: chạy lệnh \"git cherry-pick --"
"continue\")"
-#: wt-status.c:1060
+#: wt-status.c:1098
msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
msgstr " (dùng \"git cherry-pick --abort\" để hủy bỠthao tác cherry-pick)"
-#: wt-status.c:1069
+#: wt-status.c:1107
#, c-format
msgid "You are currently reverting commit %s."
msgstr "Bạn hiện nay Ä‘ang thá»±c hiện thao tác revert lần chuyển giao “%sâ€."
-#: wt-status.c:1074
+#: wt-status.c:1112
msgid " (fix conflicts and run \"git revert --continue\")"
msgstr " (sửa các xung đột và sau đó chạy lệnh \"git revert --continue\")"
-#: wt-status.c:1077
+#: wt-status.c:1115
msgid " (all conflicts fixed: run \"git revert --continue\")"
msgstr ""
" (khi tất cả các xung đột đã sửa xong: chạy lệnh \"git revert --continue\")"
-#: wt-status.c:1079
+#: wt-status.c:1117
msgid " (use \"git revert --abort\" to cancel the revert operation)"
msgstr " (dùng \"git revert --abort\" để hủy bỠthao tác revert)"
-#: wt-status.c:1090
+#: wt-status.c:1128
#, c-format
msgid "You are currently bisecting, started from branch '%s'."
msgstr ""
"Bạn hiện nay đang thực hiện thao tác di chuyển nửa bước (bisect), bắt đầu từ "
"nhánh “%sâ€."
-#: wt-status.c:1094
+#: wt-status.c:1132
msgid "You are currently bisecting."
msgstr "Bạn hiện tại đang thực hiện việc bisect (di chuyển nửa bước)."
-#: wt-status.c:1097
+#: wt-status.c:1135
msgid " (use \"git bisect reset\" to get back to the original branch)"
msgstr " (dùng \"git bisect reset\" để quay trở lại nhánh nguyên thủy)"
-#: wt-status.c:1272
+#: wt-status.c:1310
msgid "On branch "
msgstr "Trên nhánh "
-#: wt-status.c:1279
+#: wt-status.c:1317
msgid "rebase in progress; onto "
msgstr "rebase đang được thực hiện: lên trên "
-#: wt-status.c:1286
+#: wt-status.c:1324
msgid "HEAD detached at "
msgstr "HEAD được tách rá»i tại "
-#: wt-status.c:1288
+#: wt-status.c:1326
msgid "HEAD detached from "
msgstr "HEAD được tách rá»i từ "
-#: wt-status.c:1291
+#: wt-status.c:1329
msgid "Not currently on any branch."
msgstr "Hiện tại chẳng ở nhánh nào cả."
-#: wt-status.c:1308
+#: wt-status.c:1346
msgid "Initial commit"
msgstr "Lần chuyển giao khởi tạo"
-#: wt-status.c:1322
+#: wt-status.c:1360
msgid "Untracked files"
msgstr "Những tập tin chưa được theo dõi"
-#: wt-status.c:1324
+#: wt-status.c:1362
msgid "Ignored files"
msgstr "Những tập tin bị lỠđi"
-#: wt-status.c:1328
+#: wt-status.c:1366
#, c-format
msgid ""
"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1824,32 +1821,32 @@ msgstr ""
"có lẽ làm nó nhanh hơn, nhưng bạn phải cẩn thận đừng quên mình phải\n"
"tá»± thêm các tập tin má»›i (xem “git help statusâ€.."
-#: wt-status.c:1334
+#: wt-status.c:1372
#, c-format
msgid "Untracked files not listed%s"
msgstr "Những tập tin chưa được theo dõi không được liệt kê ra %s"
-#: wt-status.c:1336
+#: wt-status.c:1374
msgid " (use -u option to show untracked files)"
msgstr " (dùng tùy chá»n -u để hiển thị các tập tin chÆ°a được theo dõi)"
-#: wt-status.c:1342
+#: wt-status.c:1380
msgid "No changes"
msgstr "Không có thay đổi nào"
-#: wt-status.c:1347
+#: wt-status.c:1385
#, c-format
msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
msgstr ""
"không có thay đổi nào được thêm vào để chuyển giao (dùng \"git add\" và/hoặc "
"\"git commit -a\")\n"
-#: wt-status.c:1350
+#: wt-status.c:1388
#, c-format
msgid "no changes added to commit\n"
msgstr "không có thay đổi nào được thêm vào để chuyển giao\n"
-#: wt-status.c:1353
+#: wt-status.c:1391
#, c-format
msgid ""
"nothing added to commit but untracked files present (use \"git add\" to "
@@ -1858,293 +1855,210 @@ msgstr ""
"không có gì được thêm vào lần chuyển giao nhưng có những tập tin chưa được "
"theo dõi hiện diện (dùng \"git add\" để đưa vào theo dõi)\n"
-#: wt-status.c:1356
+#: wt-status.c:1394
#, c-format
msgid "nothing added to commit but untracked files present\n"
msgstr ""
"không có gì được thêm vào lần chuyển giao nhưng có những tập tin chưa được "
"theo dõi hiện diện\n"
-#: wt-status.c:1359
+#: wt-status.c:1397
#, c-format
msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
msgstr ""
"không có gì để chuyển giao (tạo/sao-chép các tập tin và dùng \"git add\" để "
"đưa vào theo dõi)\n"
-#: wt-status.c:1362 wt-status.c:1367
+#: wt-status.c:1400 wt-status.c:1405
#, c-format
msgid "nothing to commit\n"
msgstr "không có gì để chuyển giao\n"
-#: wt-status.c:1365
+#: wt-status.c:1403
#, c-format
msgid "nothing to commit (use -u to show untracked files)\n"
msgstr ""
"không có gì để chuyển giao (dùng -u xem các tập tin chưa được theo dõi)\n"
-#: wt-status.c:1369
+#: wt-status.c:1407
#, c-format
msgid "nothing to commit, working directory clean\n"
msgstr "không có gì để chuyển giao, thư mục làm việc sạch sẽ\n"
-#: wt-status.c:1478
+#: wt-status.c:1516
msgid "HEAD (no branch)"
msgstr "HEAD (không nhánh)"
-#: wt-status.c:1484
+#: wt-status.c:1522
msgid "Initial commit on "
msgstr "Lần chuyển giao khởi tạo trên "
-#: wt-status.c:1514
+#: wt-status.c:1554
msgid "gone"
msgstr "đã ra đi"
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
msgid "behind "
msgstr "đằng sau "
-#: wt-status.c:1519 wt-status.c:1522
-msgid "ahead "
-msgstr "phía trước "
-
-#: wt-status.c:1524
-msgid ", behind "
-msgstr ", đằng sau "
-
#: compat/precompose_utf8.c:55 builtin/clone.c:356
#, c-format
msgid "failed to unlink '%s'"
msgstr "gặp lá»—i khi bá» liên kết (unlink) “%sâ€"
-#: builtin/add.c:20
+#: builtin/add.c:21
msgid "git add [options] [--] <pathspec>..."
msgstr "git add [các-tùy-chá»n] [--] <pathspec>..."
-#.
-#. * 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 ""
-"Cách ứng xá»­ của lệnh “git add %s (hay %s)†khi không có tham số Ä‘Æ°á»ng dẫn "
-"từ\n"
-"thư-mục con của cây sẽ thay đổi kể từ Git 2.0 và không thể sử dụng như thế "
-"nữa.\n"
-"Äể thêm ná»™i dung cho toàn bá»™ cây, chạy:\n"
-"\n"
-" git add %s :/\n"
-" (hoặc git add %s :/)\n"
-"\n"
-"Äể hạn chế lệnh cho thÆ°-mục hiện tại, chạy:\n"
-"\n"
-" git add %s .\n"
-" (hoặc git add %s .)\n"
-"\n"
-"Với phiên bản hiện tại của Git, lệnh bị hạn chế cho thư-mục hiện tại.\n"
-
-#: 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 ""
-"Bạn chạy “git add†mà không có “-A (--all)†cÅ©ng không “--ignore-removalâ€,\n"
-"cách ứng xá»­ của nó sẽ thay đổi kể từ Git 2.0: nó quan tâm đến các Ä‘Æ°á»ng dẫn "
-"mà\n"
-"bạn đã gỡ bá». Các Ä‘Æ°á»ng dẫn nhÆ° là “%s†cái mà\n"
-"bị gỡ bỠtừ cây làm việc của bạn thì bị bỠqua với phiên bản này của Git.\n"
-"\n"
-"* “git add --ignore-removal <pathspec>â€, cái hiện tại là mặc định,\n"
-" bá» qua các Ä‘Æ°á»ng dẫn bạn đã gỡ bá» từ cây làm việc của bạn.\n"
-"\n"
-"* “git add --all <pathspec>†sẽ đồng thá»i giúp bạn ghi lại việc dá»i Ä‘i.\n"
-"\n"
-"Chạy “git status†để kiểm tra các Ä‘Æ°á»ng dẫn bạn đã gỡ bá» từ cây làm việc của "
-"bạn.\n"
-
-#: builtin/add.c:144
+#: builtin/add.c:64
#, c-format
msgid "unexpected diff status %c"
msgstr "trạng thái lệnh diff không như mong đợi %c"
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
msgid "updating files failed"
msgstr "Cập nhật tập tin gặp lỗi"
-#: builtin/add.c:163
+#: builtin/add.c:79
#, c-format
msgid "remove '%s'\n"
msgstr "gỡ bỠ“%sâ€\n"
-#: builtin/add.c:237
+#: builtin/add.c:133
msgid "Unstaged changes after refreshing the index:"
msgstr ""
"ÄÆ°a ra khá»i bệ phóng các thay đổi sau khi làm tÆ°Æ¡i má»›i lại bảng mục lục:"
-#: builtin/add.c:299
+#: builtin/add.c:193
msgid "Could not read the index"
msgstr "Không thể Ä‘á»c bảng mục lục"
-#: builtin/add.c:310
+#: builtin/add.c:204
#, c-format
msgid "Could not open '%s' for writing."
msgstr "Không thể mở “%s†để ghi."
-#: builtin/add.c:314
+#: builtin/add.c:208
msgid "Could not write patch"
msgstr "Không thể ghi ra miếng vá"
-#: builtin/add.c:319
+#: builtin/add.c:213
#, c-format
msgid "Could not stat '%s'"
msgstr "không thể lấy thông tin thống kê vỠ“%sâ€"
-#: builtin/add.c:321
+#: builtin/add.c:215
msgid "Empty patch. Aborted."
msgstr "Miếng vá trống rỗng. Nên bỠqua."
-#: builtin/add.c:327
+#: builtin/add.c:221
#, c-format
msgid "Could not apply '%s'"
msgstr "Không thể áp dụng miếng vá “%sâ€"
-#: builtin/add.c:337
+#: builtin/add.c:231
msgid "The following paths are ignored by one of your .gitignore files:\n"
msgstr ""
"Các Ä‘Æ°á»ng dẫn theo sau đây sẽ bị lá» Ä‘i bởi má»™t trong các tập tin .gitignore "
"của bạn:\n"
-#: builtin/add.c: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/add.c:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
+#: builtin/prune-packed.c:77 builtin/push.c:489 builtin/remote.c:1344
#: builtin/rm.c:269
msgid "dry run"
msgstr "chạy thử"
-#: 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/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
+#: builtin/commit.c:1256 builtin/count-objects.c:95 builtin/fsck.c:612
#: builtin/log.c:1592 builtin/mv.c:69 builtin/read-tree.c:113
msgid "be verbose"
msgstr "chi tiết"
-#: builtin/add.c:357
+#: builtin/add.c:251
msgid "interactive picking"
msgstr "sửa bằng cách tương tác"
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
msgid "select hunks interactively"
msgstr "chá»n “hunks†theo kiểu tÆ°Æ¡ng tác"
-#: builtin/add.c:359
+#: builtin/add.c:253
msgid "edit current diff and apply"
msgstr "sửa diff hiện nay và áp dụng nó"
-#: builtin/add.c:360
+#: builtin/add.c:254
msgid "allow adding otherwise ignored files"
msgstr "cho phép thêm các tập tin bị bỠqua khác"
-#: builtin/add.c:361
+#: builtin/add.c:255
msgid "update tracked files"
msgstr "cập nhật các tập tin được theo dõi"
-#: builtin/add.c:362
+#: builtin/add.c:256
msgid "record only the fact that the path will be added later"
msgstr "chỉ ghi lại sá»± việc mà Ä‘Æ°á»ng dẫn sẽ được thêm vào sau"
-#: builtin/add.c:363
+#: builtin/add.c:257
msgid "add changes from all tracked and untracked files"
msgstr ""
"thêm các thay đổi từ tất cả các tập tin có cũng như không được theo dõi dấu "
"vết"
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
msgid "ignore paths removed in the working tree (same as --no-all)"
msgstr ""
"lá» Ä‘i các Ä‘Æ°á»ng dẫn bị gỡ bá» trong cây thÆ° mục làm việc (giống vá»›i --no-all)"
-#: builtin/add.c:368
+#: builtin/add.c:262
msgid "don't add, only refresh the index"
msgstr "không thêm, chỉ làm tươi mới bảng mục lục"
-#: builtin/add.c:369
+#: builtin/add.c:263
msgid "just skip files which cannot be added because of errors"
msgstr "chie bỠqua những tập tin mà nó không thể được thêm vào bởi vì gặp lỗi"
-#: builtin/add.c:370
+#: builtin/add.c:264
msgid "check if - even missing - files are ignored in dry run"
msgstr ""
"kiểm tra xem - thậm chí thiếu - tập tin bị bỠqua trong quá trình chạy thử"
-#: builtin/add.c:392
+#: builtin/add.c:286
#, c-format
msgid "Use -f if you really want to add them.\n"
msgstr "Sá»­ dụng tùy chá»n -f nếu bạn thá»±c sá»± muốn thêm chúng vào.\n"
-#: builtin/add.c:393
+#: builtin/add.c:287
msgid "no files added"
msgstr "chưa có tập tin nào được thêm vào"
-#: builtin/add.c:399
+#: builtin/add.c:293
msgid "adding files failed"
msgstr "thêm tập tin gặp lỗi"
-#: builtin/add.c:438
+#: builtin/add.c:330
msgid "-A and -u are mutually incompatible"
msgstr "-A và -u xung khắc nhau"
-#: builtin/add.c:456
+#: builtin/add.c:337
msgid "Option --ignore-missing can only be used together with --dry-run"
msgstr "Tùy chá»n --ignore-missing chỉ có thể được dùng cùng vá»›i --dry-run"
-#: builtin/add.c:486
+#: builtin/add.c:358
#, c-format
msgid "Nothing specified, nothing added.\n"
msgstr "Không có gì được chỉ ra, không có gì được thêm vào.\n"
-#: builtin/add.c:487
+#: builtin/add.c:359
#, c-format
msgid "Maybe you wanted to say 'git add .'?\n"
msgstr "Có lẽ ý bạn là “git add .†phải không?\n"
-#: 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
+#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:920
+#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 builtin/rm.c:299
msgid "index file corrupt"
msgstr "tập tin ghi bảng mục lục bị há»ng"
-#: builtin/add.c:592 builtin/apply.c:4506 builtin/mv.c:270 builtin/rm.c:432
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
msgid "Unable to write new index file"
msgstr "Không thể ghi tập tin lưu bảng mục lục mới"
@@ -2258,7 +2172,6 @@ msgstr "** cảnh báo: tập tin %s trở nên trống rá»—ng nhÆ°ng không bá»
msgid "corrupt binary patch at line %d: %.*s"
msgstr "miếng vá định dạng nhị phân sai há»ng tại dòng %d: %.*s"
-#. there has to be one hunk (forward hunk)
#: builtin/apply.c:1900
#, c-format
msgid "unrecognized binary patch at line %d"
@@ -2330,7 +2243,7 @@ msgstr "gặp lỗi khi vá: %s:%ld"
#: builtin/apply.c:3095
#, c-format
msgid "cannot checkout %s"
-msgstr "không thể \"checkout\" %s"
+msgstr "không thể lấy ra %s"
#: builtin/apply.c:3140 builtin/apply.c:3149 builtin/apply.c:3194
#, c-format
@@ -2401,7 +2314,7 @@ msgstr "%s: miếng vá không được áp dụng"
msgid "Checking patch %s..."
msgstr "Äang kiểm tra miếng vá %s..."
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
#, c-format
msgid "make_cache_entry failed for path '%s'"
msgstr "make_cache_entry gặp lá»—i đối vá»›i Ä‘Æ°á»ng dẫn “%sâ€"
@@ -2419,7 +2332,7 @@ msgstr "miếng vá sai há»ng cho mô-Ä‘un-con %s"
#: builtin/apply.c:3855
#, c-format
msgid "unable to stat newly created file '%s'"
-msgstr "không thể lấy trạng thái vỠtập tin %s mới hơn đã được tạo"
+msgstr "không thể lấy thống kỠvỠtập tin %s mới hơn đã được tạo"
#: builtin/apply.c:3860
#, c-format
@@ -2444,13 +2357,12 @@ msgstr "không thể ghi vào tập tin “%s†chế độ %o"
#: builtin/apply.c:4032
#, c-format
msgid "Applied patch %s cleanly."
-msgstr "Äã áp dụng miếng và %s má»™t cách sạch sẽ."
+msgstr "Äã áp dụng miếng vá %s má»™t cách sạch sẽ."
#: builtin/apply.c:4040
msgid "internal error"
msgstr "lá»—i ná»™i bá»™"
-#. Say this even without --verbose
#: builtin/apply.c:4043
#, c-format
msgid "Applying patch %%s with %d reject..."
@@ -2471,7 +2383,7 @@ msgstr "Khối nhá»› #%d được áp dụng gá»n gàng."
#: builtin/apply.c:4077
#, c-format
msgid "Rejected hunk #%d."
-msgstr "hunk #%d bị từ chối."
+msgstr "đoạn dữ liệu #%d bị từ chối."
#: builtin/apply.c:4227
msgid "unrecognized input"
@@ -2546,7 +2458,7 @@ msgid "build a temporary index based on embedded index information"
msgstr ""
"xây dá»±ng bảng mục lục tạm thá»i trên cÆ¡ sở thông tin bảng mục lục được nhúng"
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
msgid "paths are separated with NUL character"
msgstr "các Ä‘Æ°á»ng dẫn bị ngăn cách bởi ký tá»± NULL"
@@ -2686,97 +2598,97 @@ msgstr "git blame [các-tùy-chá»n] [rev-opts] [rev] [--] tập-tin"
msgid "[rev-opts] are documented in git-rev-list(1)"
msgstr "[rev-opts] được mô tả trong git-rev-list(1)"
-#: builtin/blame.c:2249
+#: builtin/blame.c:2242
msgid "Show blame entries as we find them, incrementally"
msgstr "Hiển thị các mục “blame†như là chúng ta thấy chúng, tăng dần"
-#: builtin/blame.c:2250
+#: builtin/blame.c:2243
msgid "Show blank SHA-1 for boundary commits (Default: off)"
msgstr ""
"Hiển thị SHA-1 trắng cho những lần chuyển giao biên giới (Mặc định: off)"
-#: builtin/blame.c:2251
+#: builtin/blame.c:2244
msgid "Do not treat root commits as boundaries (Default: off)"
msgstr "Không coi các lần chuyển giao gốc là giới hạn (Mặc định: off)"
-#: builtin/blame.c:2252
+#: builtin/blame.c:2245
msgid "Show work cost statistics"
msgstr "Hiển thị thống kê công sức làm việc"
-#: builtin/blame.c:2253
+#: builtin/blame.c:2246
msgid "Show output score for blame entries"
msgstr "Hiển thị kết xuất Ä‘iểm số có các mục tin “blameâ€"
-#: builtin/blame.c:2254
+#: builtin/blame.c:2247
msgid "Show original filename (Default: auto)"
msgstr "Hiển thị tên tập tin gốc (Mặc định: auto)"
-#: builtin/blame.c:2255
+#: builtin/blame.c:2248
msgid "Show original linenumber (Default: off)"
msgstr "Hiển thị số dòng gốc (Mặc định: off)"
-#: builtin/blame.c:2256
+#: builtin/blame.c:2249
msgid "Show in a format designed for machine consumption"
msgstr "Hiển thị ở định dạng đã thiết kế cho sự tiêu dùng bằng máy"
-#: builtin/blame.c:2257
+#: builtin/blame.c:2250
msgid "Show porcelain format with per-line commit information"
msgstr "Hiển thị định dạng “porcelain†với thông tin chuyển giao mỗi dòng"
-#: builtin/blame.c:2258
+#: builtin/blame.c:2251
msgid "Use the same output mode as git-annotate (Default: off)"
msgstr "Dùng cùng chế độ xuất ra vóigit-annotate (Mặc định: off)"
-#: builtin/blame.c:2259
+#: builtin/blame.c:2252
msgid "Show raw timestamp (Default: off)"
msgstr "Hiển thị dấu vết thá»i gian dạng thô (Mặc định: off)"
-#: builtin/blame.c:2260
+#: builtin/blame.c:2253
msgid "Show long commit SHA1 (Default: off)"
msgstr "Hiển thị SHA1 của lần chuyển giao dạng dài (Mặc định: off)"
-#: builtin/blame.c:2261
+#: builtin/blame.c:2254
msgid "Suppress author name and timestamp (Default: off)"
msgstr "Không hiển thị tên tác giả và dấu vết thá»i gian (Mặc định: off)"
-#: builtin/blame.c:2262
+#: builtin/blame.c:2255
msgid "Show author email instead of name (Default: off)"
msgstr "Hiển thị thư điện tử của tác giả thay vì tên (Mặc định: off)"
-#: builtin/blame.c:2263
+#: builtin/blame.c:2256
msgid "Ignore whitespace differences"
msgstr "BỠqua các khác biệt do khoảng trắng gây ra"
-#: builtin/blame.c:2264
+#: builtin/blame.c:2257
msgid "Spend extra cycles to find better match"
msgstr "Tiêu thụ thêm năng tài nguyên máy móc để tìm kiếm tốt hơn nữa"
-#: builtin/blame.c:2265
+#: builtin/blame.c:2258
msgid "Use revisions from <file> instead of calling git-rev-list"
msgstr ""
"Sá»­ dụng Ä‘iểm xét duyệt (revision) từ <tập tin> thay vì gá»i “git-rev-listâ€"
-#: builtin/blame.c:2266
+#: builtin/blame.c:2259
msgid "Use <file>'s contents as the final image"
msgstr "Sử dụng nội dung của <tập tin> như là ảnh cuối cùng"
-#: builtin/blame.c:2267 builtin/blame.c:2268
+#: builtin/blame.c:2260 builtin/blame.c:2261
msgid "score"
msgstr "điểm số"
-#: builtin/blame.c:2267
+#: builtin/blame.c:2260
msgid "Find line copies within and across files"
msgstr "Tìm các bản sao chép dòng trong và ngang qua tập tin"
-#: builtin/blame.c:2268
+#: builtin/blame.c:2261
msgid "Find line movements within and across files"
msgstr "Tìm các di chuyển dòng trong và ngang qua tập tin"
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
msgid "n,m"
msgstr "n,m"
-#: builtin/blame.c:2269
+#: builtin/blame.c:2262
msgid "Process only line range n,m, counting from 1"
msgstr "Xử lý chỉ dòng vùng n,m, tính từ 1"
@@ -2927,12 +2839,12 @@ msgstr " **** tham chiếu không hợp lệ ****"
#: builtin/branch.c:594
#, c-format
msgid "(no branch, rebasing %s)"
-msgstr "(không nhánh, đang rebase %s)"
+msgstr "(không nhánh, đang cải tổ %s)"
#: builtin/branch.c:597
#, c-format
msgid "(no branch, bisect started on %s)"
-msgstr "(không nhánh, bisect được bắt đầu tại %s)"
+msgstr "(không nhánh, di chuyển nửa bước được bắt đầu tại %s)"
#: builtin/branch.c:600
#, c-format
@@ -2999,7 +2911,7 @@ msgstr "hiển thị mã băm và chủ Ä‘á», Ä‘Æ°a ra hai lần cho nhánh thÆ
#: builtin/branch.c:806
msgid "suppress informational messages"
-msgstr "Thu hồi các thông điệp thông tin"
+msgstr "không xuất các thông tin"
#: builtin/branch.c:807
msgid "set up tracking mode (see git-pull(1))"
@@ -3011,17 +2923,18 @@ msgstr "thay đổi thông tin thượng nguồn"
#: builtin/branch.c:813
msgid "use colored output"
-msgstr "sử dụng kết xuất có tô màu"
+msgstr "tô màu kết xuất"
#: builtin/branch.c:814
msgid "act on remote-tracking branches"
msgstr "thao tác trên nhánh “remote-trackingâ€"
#: 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
+#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
+#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
+#: builtin/tag.c:533
msgid "commit"
-msgstr "commit"
+msgstr "lần_chuyển_giao"
#: builtin/branch.c:818 builtin/branch.c:824
msgid "print only branches that contain the commit"
@@ -3037,7 +2950,7 @@ msgstr "liệt kê cả nhánh “remote-tracking†và nội bộ"
#: builtin/branch.c:833
msgid "delete fully merged branch"
-msgstr "xóa một cách đầy đủ nhánh đã hòa trộn"
+msgstr "xóa một toàn bộ nhánh đã hòa trộn"
#: builtin/branch.c:834
msgid "delete branch (even if not merged)"
@@ -3073,7 +2986,7 @@ msgstr "chỉ hiển thị các nhánh chưa được hòa trộn"
#: builtin/branch.c:850
msgid "print only merged branches"
-msgstr "chỉ hiển thị các nhánh được hòa trộn"
+msgstr "chỉ hiển thị các nhánh đã hòa trộn"
#: builtin/branch.c:854
msgid "list branches in columns"
@@ -3093,7 +3006,7 @@ msgstr "tùy chá»n --column và --verbose xung khắc nhau"
#: builtin/branch.c:902 builtin/branch.c:941
msgid "branch name required"
-msgstr "cần tên nhánh"
+msgstr "cần chỉ ra tên nhánh"
#: builtin/branch.c:917
msgid "Cannot give description to detached HEAD"
@@ -3205,44 +3118,44 @@ msgstr "Cần một kho chứa để có thể tạo một bundle."
msgid "Need a repository to unbundle."
msgstr "Cần một kho chứa để có thể giải nén một bundle."
-#: builtin/cat-file.c:328
+#: builtin/cat-file.c:331
msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
-msgstr "git cat-file (-t|-s|-e|-p|<kiểu>|--textconv) <đối tượng>"
+msgstr "git cat-file (-t|-s|-e|-p|<kiểu>|--textconv) <đối_tượng>"
-#: builtin/cat-file.c:329
+#: builtin/cat-file.c:332
msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
msgstr "git cat-file (--batch|--batch-check) < <danh-sách-đối-tượng>"
-#: builtin/cat-file.c:366
+#: builtin/cat-file.c:369
msgid "<type> can be one of: blob, tree, commit, tag"
msgstr "<kiểu> là một trong số: blob, tree, commit hoặc tag"
-#: builtin/cat-file.c:367
+#: builtin/cat-file.c:370
msgid "show object type"
msgstr "hiển thị kiểu đối tượng"
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
msgid "show object size"
msgstr "hiển thị kích thước đối tượng"
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
msgid "exit with zero when there's no error"
msgstr "thoát với 0 khi không có lỗi"
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:374
msgid "pretty-print object's content"
msgstr "in ná»™i dung đối tượng dạng dá»… Ä‘á»c"
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
msgid "for blob objects, run textconv on object's content"
msgstr "với đối tượng blob, chạy lệnh textconv trên nội dung của đối tượng"
-#: builtin/cat-file.c:375
+#: builtin/cat-file.c:378
msgid "show info and content of objects fed from the standard input"
msgstr ""
"hiển thị thông tin và nội dung của các đối tượng lấy từ đầu vào tiêu chuẩn"
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:381
msgid "show info about objects fed from the standard input"
msgstr "hiển thị các thông tin vỠđối tượng fed từ đầu vào tiêu chuẩn"
@@ -3271,7 +3184,7 @@ msgstr "Ä‘á»c tên tập tin từ đầu vào tiêu chuẩn"
msgid "terminate input and output records by a NUL character"
msgstr "chấm dứt các bản ghi vào và ra bằng ký tự NULL"
-#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
msgid "suppress progress reporting"
msgstr "chặn các báo cáo tiến trình hoạt động"
@@ -3424,60 +3337,59 @@ msgid "Cannot update paths and switch to branch '%s' at the same time."
msgstr ""
"Không thể cập nhật các Ä‘Æ°á»ng dẫn và chuyển đến nhánh “%s†cùng má»™t lúc."
-#: builtin/checkout.c:261 builtin/checkout.c:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
msgid "corrupt index file"
msgstr "tập tin ghi bảng mục lục bị há»ng"
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
#, c-format
msgid "path '%s' is unmerged"
msgstr "Ä‘Æ°á»ng dẫn “%s†không được hòa trá»™n"
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
msgid "you need to resolve your current index first"
msgstr "bạn cần phải giải quyết bảng mục lục hiện tại của bạn trước đã"
-#: builtin/checkout.c:594
+#: builtin/checkout.c:593
#, c-format
msgid "Can not do reflog for '%s'\n"
msgstr "Không thể thá»±c hiện reflog cho “%sâ€\n"
-#: builtin/checkout.c:632
+#: builtin/checkout.c:631
msgid "HEAD is now at"
msgstr "HEAD hiện giỠtại"
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
#, c-format
msgid "Reset branch '%s'\n"
msgstr "Äặt lại nhánh “%sâ€\n"
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
#, c-format
msgid "Already on '%s'\n"
msgstr "Äã sẵn sàng trên “%sâ€\n"
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
#, c-format
msgid "Switched to and reset branch '%s'\n"
-msgstr "Äã chuyển tá»›i và reset nhánh “%sâ€\n"
+msgstr "Äã chuyển tá»›i và đặt lại nhánh “%sâ€\n"
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 builtin/checkout.c:1032
#, c-format
msgid "Switched to a new branch '%s'\n"
msgstr "Äã chuyển đến nhánh má»›i “%sâ€\n"
-#: builtin/checkout.c:650
+#: builtin/checkout.c:649
#, c-format
msgid "Switched to branch '%s'\n"
msgstr "Äã chuyển đến nhánh “%sâ€\n"
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
#, c-format
msgid " ... and %d more.\n"
msgstr " ... và nhiá»u hÆ¡n %d.\n"
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
#, c-format
msgid ""
"Warning: you are leaving %d commit behind, not connected to\n"
@@ -3502,7 +3414,7 @@ msgstr[1] ""
"\n"
"%s\n"
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
#, c-format
msgid ""
"If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3518,142 +3430,141 @@ msgstr ""
" git branch tên_nhánh_mới %s\n"
"\n"
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
msgid "internal error in revision walk"
msgstr "lỗi nội bộ trong khi di chuyển qua các điểm xét duyệt"
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
msgid "Previous HEAD position was"
msgstr "Vị trí trước kia của HEAD là"
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
msgid "You are on a branch yet to be born"
msgstr "Bạn tại nhánh mà nó chưa hỠđược sinh ra"
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
#, c-format
msgid "only one reference expected, %d given."
msgstr "chỉ cần một tham chiếu, nhưng lại đưa ra %d."
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
#, c-format
msgid "invalid reference: %s"
msgstr "tham chiếu không hợp lệ: %s"
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
#, c-format
msgid "reference is not a tree: %s"
msgstr "tham chiếu không phải là một cây:%s"
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
msgid "paths cannot be used with switching branches"
msgstr "các Ä‘Æ°á»ng dẫn không thể dùng cùng vá»›i các nhánh chuyển"
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
#, c-format
msgid "'%s' cannot be used with switching branches"
msgstr "“%s†không thể được sử dụng với các nhánh chuyển"
-#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
#, c-format
msgid "'%s' cannot be used with '%s'"
msgstr "“%s†không thể được dùng vá»›i “%sâ€"
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
#, c-format
msgid "Cannot switch branch to a non-commit '%s'"
msgstr "Không thể chuyển nhánh đến má»™t non-commit “%sâ€"
-#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
#: builtin/remote.c:159 builtin/remote.c:161
msgid "branch"
msgstr "nhánh"
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
msgid "create and checkout a new branch"
msgstr "tạo và checkout một nhánh mới"
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
msgid "create/reset and checkout a branch"
msgstr "tạo/đặt_lại và checkout một nhánh"
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
msgid "create reflog for new branch"
msgstr "tạo reflog cho nhánh mới"
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
msgid "detach the HEAD at named commit"
msgstr "rá»i bá» HEAD tại lần chuyển giao danh nghÄ©a"
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
msgid "set upstream info for new branch"
msgstr "đặt thông tin thượng nguồn cho nhánh mới"
-#: builtin/checkout.c:1099
-msgid "new branch"
-msgstr "nhánh mới"
+#: builtin/checkout.c:1098
+msgid "new-branch"
+msgstr "nhánh-mới"
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
msgid "new unparented branch"
msgstr "nhánh không cha mới"
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
msgid "checkout our version for unmerged files"
msgstr ""
"lấy ra (checkout) phiên bản của chúng ta cho các tập tin chưa được hòa trộn"
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
msgid "checkout their version for unmerged files"
msgstr ""
"lấy ra (checkout) phiên bản của chúng hỠcho các tập tin chưa được hòa trộn"
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
msgid "force checkout (throw away local modifications)"
-msgstr "ép buộc lấy ra (checkout) (bỠđi những thay đổi nội bộ)"
+msgstr "ép buộc lấy ra (bỠđi những thay đổi nội bộ)"
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
msgid "perform a 3-way merge with the new branch"
msgstr "thực hiện hòa trộn kiểu 3-way với nhánh mới"
-#: builtin/checkout.c:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
msgid "update ignored files (default)"
msgstr "cập nhật các tập tin bị bỠqua (mặc định)"
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
msgid "style"
msgstr "kiểu"
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
msgid "conflict style (merge or diff3)"
msgstr "xung đột kiểu (hòa trộn hoặc diff3)"
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
msgid "do not limit pathspecs to sparse entries only"
msgstr "không giá»›i hạn đặc tả Ä‘Æ°á»ng dẫn thành chỉ các mục thÆ°a thá»›t"
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
msgid "second guess 'git checkout no-such-branch'"
msgstr "gợi ý thứ hai “git checkout không-nhánh-nào-nhÆ°-vậyâ€"
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
msgid "-b, -B and --orphan are mutually exclusive"
msgstr "Các tùy chá»n -b, -B và --orphan loại từ lẫn nhau"
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
msgid "--track needs a branch name"
msgstr "--track cần tên một nhánh"
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
msgid "Missing branch name; try -b"
msgstr "Thiếu tên nhánh; hãy thử -b"
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
msgid "invalid path specification"
msgstr "Ä‘Æ°á»ng dẫn đã cho không hợp lệ"
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
#, c-format
msgid ""
"Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3663,12 +3574,12 @@ msgstr ""
"Bạn đã có ý định checkout “%s†cái mà không thể được phân giải như là lần "
"chuyển giao?"
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1208
#, c-format
msgid "git checkout: --detach does not take a path argument '%s'"
msgstr "git checkout: --detach không nhận má»™t đối số Ä‘Æ°á»ng dẫn “%sâ€"
-#: builtin/checkout.c:1213
+#: builtin/checkout.c:1212
msgid ""
"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
"checking out of the index."
@@ -3707,7 +3618,7 @@ msgstr "Nên bỠqua kho chứa %s\n"
msgid "failed to remove %s"
msgstr "gặp lỗi khi gỡ bỠ%s"
-#: builtin/clean.c:294
+#: builtin/clean.c:295
msgid ""
"Prompt help:\n"
"1 - select a numbered item\n"
@@ -3719,7 +3630,7 @@ msgstr ""
"foo - chá»n mục trên cÆ¡ sở tiá»n tố duy nhất\n"
" - (trống rá»—ng) không chá»n gì cả"
-#: builtin/clean.c:298
+#: builtin/clean.c:299
msgid ""
"Prompt help:\n"
"1 - select a single item\n"
@@ -3737,37 +3648,37 @@ msgstr ""
"foo - chá»n mục dá»±a trên tiá»n tố duy nhất\n"
"-... - không chá»n các mục đã chỉ ra\n"
"* - chá»n tất\n"
-" - (trống rá»—ng) kết thúc việc chá»n"
+" - (để trống) kết thúc việc chá»n"
-#: builtin/clean.c:516
+#: builtin/clean.c:517
#, c-format
msgid "Huh (%s)?"
msgstr "Hả (%s)?"
-#: builtin/clean.c:659
+#: builtin/clean.c:660
#, c-format
msgid "Input ignore patterns>> "
msgstr "Mẫu để lá»c các tập tin đầu vào cần lá» Ä‘i>> "
-#: builtin/clean.c:696
+#: builtin/clean.c:697
#, c-format
msgid "WARNING: Cannot find items matched by: %s"
msgstr "CẢNH BÃO: Không tìm thấy các mục được khá»›p bởi: %s"
-#: builtin/clean.c:717
+#: builtin/clean.c:718
msgid "Select items to delete"
msgstr "Chá»n mục muốn xóa"
-#: builtin/clean.c:757
+#: builtin/clean.c:758
#, c-format
msgid "remove %s? "
msgstr "gỡ bỠ“%s� "
-#: builtin/clean.c:782
+#: builtin/clean.c:783
msgid "Bye."
msgstr "Tạm biệt."
-#: builtin/clean.c:790
+#: builtin/clean.c:791
msgid ""
"clean - start cleaning\n"
"filter by pattern - exclude items from deletion\n"
@@ -3785,83 +3696,83 @@ msgstr ""
"help - hiển thị chính trợ giúp này\n"
"? - trợ giúp dành cho chá»n bằng cách nhắc"
-#: builtin/clean.c:817
+#: builtin/clean.c:818
msgid "*** Commands ***"
msgstr "*** Lệnh ***"
-#: builtin/clean.c:818
+#: builtin/clean.c:819
msgid "What now"
msgstr "GiỠthì sao"
-#: builtin/clean.c:826
+#: builtin/clean.c:827
msgid "Would remove the following item:"
msgid_plural "Would remove the following items:"
msgstr[0] "Có muốn gỡ bỠmục sau đây không:"
msgstr[1] "Có muốn gỡ bỠcác mục sau đây không:"
-#: builtin/clean.c:843
+#: builtin/clean.c:844
msgid "No more files to clean, exiting."
msgstr "Không còn tập-tin nào để dá»n dẹp, Ä‘ang thoát ra."
-#: builtin/clean.c:874
+#: builtin/clean.c:875
msgid "do not print names of files removed"
msgstr "không hiển thị tên của các tập tin đã gỡ bá»"
-#: builtin/clean.c:876
+#: builtin/clean.c:877
msgid "force"
msgstr "ép buộc"
-#: builtin/clean.c:877
+#: builtin/clean.c:878
msgid "interactive cleaning"
msgstr "dá»n bằng kiểu tÆ°Æ¡ng tác"
-#: builtin/clean.c:879
+#: builtin/clean.c:880
msgid "remove whole directories"
msgstr "gỡ bỠtoàn bộ thư mục"
-#: 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
+#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
+#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
msgid "pattern"
msgstr "mẫu"
-#: builtin/clean.c:881
+#: builtin/clean.c:882
msgid "add <pattern> to ignore rules"
msgstr "thêm <mẫu> vào trong qui tắc bỠqua"
-#: builtin/clean.c:882
+#: builtin/clean.c:883
msgid "remove ignored files, too"
msgstr "đồng thá»i gỡ bá» cả các tập tin bị bá» qua"
-#: builtin/clean.c:884
+#: builtin/clean.c:885
msgid "remove only ignored files"
msgstr "chỉ gỡ bỠnhững tập tin bị bỠqua"
-#: builtin/clean.c:902
+#: builtin/clean.c:903
msgid "-x and -X cannot be used together"
-msgstr "-x và -X không thể dùng cùng một lúc với nhau"
+msgstr "-x và -X không thể dùng cùng nhau"
-#: builtin/clean.c:906
+#: builtin/clean.c:907
msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
"clean"
msgstr ""
-"clean.requireForce được đặt thành true và không Ä‘Æ°a ra tùy chá»n -n mà cÅ©ng "
-"không -f; từ chối lệnh dá»n dẹp (clean)"
+"clean.requireForce được đặt thành true và không Ä‘Æ°a ra tùy chá»n -i, -n mà "
+"cÅ©ng không -f; từ chối lệnh dá»n dẹp (clean)"
-#: builtin/clean.c:909
+#: builtin/clean.c:910
msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
"refusing to clean"
msgstr ""
-"clean.requireForce mặc định được đặt là true và không Ä‘Æ°a ra tùy chá»n -n mà "
-"cÅ©ng không -f; từ chối lệnh dá»n dẹp (clean)"
+"clean.requireForce mặc định được đặt là true và không Ä‘Æ°a ra tùy chá»n -i, -n "
+"mà cÅ©ng không -f; từ chối lệnh dá»n dẹp (clean)"
#: builtin/clone.c:36
msgid "git clone [options] [--] <repo> [<dir>]"
msgstr "git clone [các-tùy-chá»n] [--] <kho> [<t.mục>]"
#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:521
+#: builtin/push.c:504
msgid "force progress reporting"
msgstr "ép buộc báo cáo tiến triển công việc"
@@ -3869,7 +3780,7 @@ msgstr "ép buộc báo cáo tiến triển công việc"
msgid "don't create a checkout"
msgstr "không tạo một checkout"
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
msgid "create a bare repository"
msgstr "tạo kho thuần"
@@ -3893,11 +3804,11 @@ msgstr "cài đặt đây là kho chia sẻ"
msgid "initialize submodules in the clone"
msgstr "khởi tạo mô-đun-con trong bản sao"
-#: builtin/clone.c:82 builtin/init-db.c:485
+#: builtin/clone.c:82 builtin/init-db.c:483
msgid "template-directory"
msgstr "thư-mục-mẫu"
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
msgid "directory from which templates will be used"
msgstr "thư mục mà tại đó các mẫu sẽ được dùng"
@@ -3921,7 +3832,7 @@ msgstr "lấy ra <nhánh> thay cho HEAD của máy chủ"
msgid "path to git-upload-pack on the remote"
msgstr "Ä‘Æ°á»ng dẫn đến git-upload-pack trên máy chủ"
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
msgid "depth"
msgstr "độ-sâu"
@@ -3933,11 +3844,11 @@ msgstr "tạo bản sao không đầy đủ cho mức sâu đã cho"
msgid "clone only one branch, HEAD or --branch"
msgstr "chỉ nhân bản một nhánh, HEAD hoặc --branch"
-#: builtin/clone.c:96 builtin/init-db.c:494
+#: builtin/clone.c:96 builtin/init-db.c:492
msgid "gitdir"
msgstr "gitdir"
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
msgid "separate git dir from working tree"
msgstr "không dùng chung thư mục dành riêng cho git và thư mục làm việc"
@@ -3972,7 +3883,7 @@ msgstr "tạo thư mục \"%s\" gặp lỗi"
#: builtin/clone.c:323 builtin/diff.c:83
#, c-format
msgid "failed to stat '%s'"
-msgstr "gặp lá»—i stat (lấy trạng thái vá») “%sâ€"
+msgstr "gặp lá»—i khi lấy thống kê vỠ“%sâ€"
#: builtin/clone.c:325
#, c-format
@@ -4025,7 +3936,7 @@ msgstr "máy chủ đã không gá»­i tất cả các đối tượng cần thiáº
#: builtin/clone.c:626
msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n"
-msgstr "refers HEAD máy chủ chỉ đến ref không tồn tại, không thể checkout.\n"
+msgstr "refers HEAD máy chủ chỉ đến ref không tồn tại, không thể lấy ra.\n"
#: builtin/clone.c:657
msgid "unable to checkout working tree"
@@ -4230,69 +4141,69 @@ msgstr ""
"Thế thì \"git cherry-pick --continue\" sẽ phục hồi lại việc cherry-pick\n"
"những lần chuyển giao còn lại.\n"
-#: builtin/commit.c:287
+#: builtin/commit.c:288
msgid "failed to unpack HEAD tree object"
msgstr "gặp lỗi khi tháo dỡ HEAD đối tượng cây"
-#: builtin/commit.c:329
+#: builtin/commit.c:330
msgid "unable to create temporary index"
msgstr "không thể tạo bảng mục lục tạm thá»i"
-#: builtin/commit.c:335
+#: builtin/commit.c:336
msgid "interactive add failed"
msgstr "gặp lỗi khi thêm bằng cách tương"
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
msgid "unable to write new_index file"
msgstr "không thể ghi tập tin lưu bảng mục lục mới (new_index)"
-#: builtin/commit.c:420
+#: builtin/commit.c:421
msgid "cannot do a partial commit during a merge."
msgstr ""
"không thể thực hiện việc chuyển giao cục bộ trong khi đang được hòa trộn."
-#: builtin/commit.c:422
+#: builtin/commit.c:423
msgid "cannot do a partial commit during a cherry-pick."
msgstr ""
"không thể thực hiện việc chuyển giao bộ phận trong khi đang cherry-pick."
-#: builtin/commit.c:432
+#: builtin/commit.c:433
msgid "cannot read the index"
msgstr "không Ä‘á»c được bảng mục lục"
-#: builtin/commit.c:452
+#: builtin/commit.c:453
msgid "unable to write temporary index file"
msgstr "không thể ghi tập tin lÆ°u bảng mục lục tạm thá»i"
-#: builtin/commit.c:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
#, c-format
msgid "invalid commit: %s"
msgstr "lần chuyển giao không hợp lệ: %s"
-#: builtin/commit.c:571
+#: builtin/commit.c:572
msgid "malformed --author parameter"
msgstr "đối số cho --author bị dị hình"
-#: builtin/commit.c:591
+#: builtin/commit.c:592
#, c-format
msgid "Malformed ident string: '%s'"
msgstr "Chuá»—i thụt lỠđầu dòng dị hình: “%sâ€"
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
#, c-format
msgid "could not lookup commit %s"
msgstr "không thể tìm kiếm commit (lần chuyển giao) %s"
-#: builtin/commit.c:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 builtin/shortlog.c:273
#, c-format
msgid "(reading log message from standard input)\n"
msgstr "(Ä‘ang Ä‘á»c thông Ä‘iệp nhật ký từ đầu vào tiêu chuẩn)\n"
-#: builtin/commit.c:644
+#: builtin/commit.c:643
msgid "could not read log from standard input"
msgstr "không thể Ä‘á»c nhật ký từ đầu vào tiêu chuẩn"
-#: builtin/commit.c:648
+#: builtin/commit.c:647
#, c-format
msgid "could not read log file '%s'"
msgstr "không Ä‘á»c được tệp nhật ký “%sâ€"
@@ -4318,7 +4229,7 @@ msgstr "Không thể Ä‘á»c “%sâ€."
msgid "could not write commit template"
msgstr "không thể ghi mẫu chuyển giao"
-#: builtin/commit.c:760
+#: builtin/commit.c:764
#, c-format
msgid ""
"\n"
@@ -4333,7 +4244,7 @@ msgstr ""
"\t%s\n"
"và thử lại.\n"
-#: builtin/commit.c:765
+#: builtin/commit.c:769
#, c-format
msgid ""
"\n"
@@ -4348,7 +4259,7 @@ msgstr ""
"\t%s\n"
"và thử lại.\n"
-#: builtin/commit.c:777
+#: builtin/commit.c:782
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
@@ -4359,7 +4270,7 @@ msgstr ""
"bắt đầu bằng “%c†sẽ được bỠqua, nếu phần chú thích rỗng sẽ hủy bỠlần "
"chuyển giao.\n"
-#: builtin/commit.c:782
+#: builtin/commit.c:789
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
@@ -4371,149 +4282,149 @@ msgstr ""
"bắt đầu bằng “%c†sẽ được bỠqua; bạn có thể xóa chúng đi nếu muốn thế.\n"
"Phần chú thích này nếu trống rỗng sẽ hủy bỠlần chuyển giao.\n"
-#: builtin/commit.c:795
+#: builtin/commit.c:802
#, c-format
msgid "%sAuthor: %s"
msgstr "%sTác giả: %s"
-#: builtin/commit.c:802
+#: builtin/commit.c:809
#, c-format
msgid "%sCommitter: %s"
msgstr "%sNgÆ°á»i chuyển giao: %s"
-#: builtin/commit.c:822
+#: builtin/commit.c:829
msgid "Cannot read index"
msgstr "Không Ä‘á»c được bảng mục lục"
-#: builtin/commit.c:865
+#: builtin/commit.c:872
msgid "Error building trees"
msgstr "Gặp lỗi khi xây dựng cây"
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
#, c-format
msgid "Please supply the message using either -m or -F option.\n"
msgstr "Xin hãy cung cấp lá»i chú giải hoặc là dùng tùy chá»n -m hoặc là -F.\n"
-#: builtin/commit.c:982
+#: builtin/commit.c:989
#, c-format
msgid "No existing author found with '%s'"
msgstr "Không tìm thấy tác giả có sẵn vá»›i “%sâ€"
-#: builtin/commit.c:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
#, c-format
msgid "Invalid untracked files mode '%s'"
msgstr "Chế Ä‘á»™ cho các tập tin chÆ°a được theo dõi không hợp lệ “%sâ€"
-#: builtin/commit.c:1034
+#: builtin/commit.c:1041
msgid "--long and -z are incompatible"
msgstr "hai tùy chá»n -long và -z không tÆ°Æ¡ng thích vá»›i nhau"
-#: builtin/commit.c:1064
+#: builtin/commit.c:1071
msgid "Using both --reset-author and --author does not make sense"
msgstr "Sá»­ dụng cả hai tùy chá»n --reset-author và --author không hợp lý"
-#: builtin/commit.c:1075
+#: builtin/commit.c:1080
msgid "You have nothing to amend."
msgstr "Không có gì để mà “tu bổ†cả."
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
msgid "You are in the middle of a merge -- cannot amend."
msgstr ""
"Bạn Ä‘ang ở giữa của quá trình hòa trá»™n -- không thể thá»±c hiện việc “tu bổâ€."
-#: builtin/commit.c:1080
+#: builtin/commit.c:1085
msgid "You are in the middle of a cherry-pick -- cannot amend."
msgstr ""
"Bạn đang ở giữa của quá trình cherry-pick -- không thể thực hiện việc “tu "
"bổâ€."
-#: builtin/commit.c:1083
+#: builtin/commit.c:1088
msgid "Options --squash and --fixup cannot be used together"
msgstr "Các tùy chá»n --squash và --fixup không thể sá»­ dụng cùng vá»›i nhau"
-#: builtin/commit.c:1093
+#: builtin/commit.c:1098
msgid "Only one of -c/-C/-F/--fixup can be used."
msgstr ""
"Chỉ được dùng má»™t trong số tùy chá»n trong số các tùy chá»n -c/-C/-F/--fixup"
-#: builtin/commit.c:1095
+#: builtin/commit.c:1100
msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
msgstr "Tùy chá»n -m không thể được tổ hợp cùng vá»›i -c/-C/-F/--fixup."
-#: builtin/commit.c:1103
+#: builtin/commit.c:1108
msgid "--reset-author can be used only with -C, -c or --amend."
msgstr ""
"--reset-author chỉ có thể được sá»­ dụng vá»›i tùy chá»n -C, -c hay --amend."
-#: builtin/commit.c:1120
+#: builtin/commit.c:1125
msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
msgstr ""
"Chỉ má»™t trong các tùy chá»n --include/--only/--all/--interactive/--patch được "
"sử dụng."
-#: builtin/commit.c:1122
+#: builtin/commit.c:1127
msgid "No paths with --include/--only does not make sense."
msgstr "Không Ä‘Æ°á»ng dẫn vá»›i các tùy chá»n --include/--only không hợp lý."
-#: builtin/commit.c:1124
+#: builtin/commit.c:1129
msgid "Clever... amending the last one with dirty index."
msgstr "Giá»i... “tu bổ†cái cuối vá»›i bảng mục lục bẩn."
-#: builtin/commit.c:1126
-msgid "Explicit paths specified without -i nor -o; assuming --only paths..."
+#: builtin/commit.c:1131
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
msgstr ""
-"Những Ä‘Æ°á»ng dẫn rõ ràng được chỉ ra không có tùy chá»n -i cÅ©ng không -o; Ä‘ang "
-"giả định --only những-Ä‘Æ°á»ng-dẫn..."
+"Những Ä‘Æ°á»ng dẫn rõ ràng được chỉ ra không có tùy chá»n -i cÅ©ng không -o; coi "
+"là --only những Ä‘Æ°á»ng dẫn"
-#: builtin/commit.c:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
#, c-format
msgid "Invalid cleanup mode %s"
msgstr "Chế Ä‘á»™ dá»n dẹp không hợp lệ %s"
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
msgid "Paths with -a does not make sense."
msgstr "Các Ä‘Æ°á»ng dẫn vá»›i tùy chá»n -a không hợp lý."
-#: builtin/commit.c:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
msgid "show status concisely"
msgstr "hiển thị trạng thái ở dạng súc tích"
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
msgid "show branch information"
msgstr "hiển thị thông tin nhánh"
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
msgid "machine-readable output"
msgstr "kết xuất dạng máy-có-thể-Ä‘á»c"
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
msgid "show status in long format (default)"
msgstr "hiển thị trạng thái ở định dạng dài (mặc định)"
-#: builtin/commit.c:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
msgid "terminate entries with NUL"
msgstr "chấm dứt các mục bằng NUL"
-#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:459
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
msgid "mode"
msgstr "chế độ"
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
msgstr ""
"hiển thị các tập tin chÆ°a được theo dõi dấu vết, các chế Ä‘á»™ tùy chá»n: all, "
"normal, no. (Mặc định: all)"
-#: builtin/commit.c:1267
+#: builtin/commit.c:1274
msgid "show ignored files"
msgstr "hiển thị các tập tin ẩn"
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
msgid "when"
msgstr "khi"
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
msgid ""
"ignore changes to submodules, optional when: all, dirty, untracked. "
"(Default: all)"
@@ -4521,221 +4432,221 @@ msgstr ""
"bá» qua các thay đổi trong mô-Ä‘un-con, tùy chá»n khi: all, dirty, untracked. "
"(Mặc định: all)"
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
msgid "list untracked files in columns"
msgstr "hiển thị danh sách các tập-tin chưa được theo dõi trong các cột"
-#: builtin/commit.c:1340
+#: builtin/commit.c:1347
msgid "couldn't look up newly created commit"
msgstr "không thể tìm thấy lần chuyển giao mới hơn đã được tạo"
-#: builtin/commit.c:1342
+#: builtin/commit.c:1349
msgid "could not parse newly created commit"
msgstr ""
"không thể phân tích cú pháp của đối tượng chuyển giao mới hơn đã được tạo"
-#: builtin/commit.c:1383
+#: builtin/commit.c:1390
msgid "detached HEAD"
msgstr "đã rá»i khá»i HEAD"
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
msgid " (root-commit)"
msgstr " (root-commit)"
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
msgid "suppress summary after successful commit"
msgstr "không hiển thị tổng kết sau khi chuyển giao thành công"
-#: builtin/commit.c:1453
+#: builtin/commit.c:1487
msgid "show diff in commit message template"
msgstr "hiển thị sự khác biệt trong mẫu tin nhắn chuyển giao"
-#: builtin/commit.c:1455
+#: builtin/commit.c:1489
msgid "Commit message options"
msgstr "Các tùy chá»n ghi chú commit"
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
msgid "read message from file"
msgstr "Ä‘á»c chú thích từ tập tin"
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "author"
msgstr "tác giả"
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "override author for commit"
msgstr "ghi đè tác giả cho commit"
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
msgid "date"
msgstr "ngày tháng"
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
msgid "override date for commit"
msgstr "ghi đè ngày tháng cho lần chuyển giao"
-#: builtin/commit.c:1459 builtin/merge.c:216 builtin/notes.c:405
-#: builtin/notes.c:562 builtin/tag.c:455
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
msgid "message"
msgstr "chú thích"
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
msgid "commit message"
msgstr "chú thích của lần chuyển giao"
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
msgid "reuse and edit message from specified commit"
msgstr "dùng lại các ghi chú từ lần chuyển giao đã cho nhưng có cho sửa chữa"
-#: builtin/commit.c:1461
+#: builtin/commit.c:1495
msgid "reuse message from specified commit"
msgstr "dùng lại các ghi chú từ lần chuyển giao đã cho"
-#: builtin/commit.c:1462
+#: builtin/commit.c:1496
msgid "use autosquash formatted message to fixup specified commit"
msgstr ""
"dùng ghi chú có định dạng autosquash để sửa chữa lần chuyển giao đã chỉ ra"
-#: builtin/commit.c:1463
+#: builtin/commit.c:1497
msgid "use autosquash formatted message to squash specified commit"
msgstr ""
"dùng lá»i nhắn có định dạng tá»± Ä‘á»™ng nén để nén lại các lần chuyển giao đã chỉ "
"ra"
-#: builtin/commit.c:1464
+#: builtin/commit.c:1498
msgid "the commit is authored by me now (used with -C/-c/--amend)"
msgstr ""
"lần chuyển giao nhận tôi là tác giả (được dùng vá»›i tùy chá»n -C/-c/--amend)"
-#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
msgid "add Signed-off-by:"
msgstr "(nên dùng) thêm dòng Signed-off-by:"
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
msgid "use specified template file"
msgstr "sử dụng tập tin mẫu đã cho"
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
msgid "force edit of commit"
msgstr "ép buộc sửa lần commit"
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
msgid "default"
msgstr "mặc định"
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
msgid "how to strip spaces and #comments from message"
msgstr "làm thế nào để cắt bỠkhoảng trắng và #ghichú từ mẩu tin nhắn"
-#: builtin/commit.c:1469
+#: builtin/commit.c:1503
msgid "include status in commit message template"
msgstr "bao gồm các trạng thái trong mẫu ghi chú chuyển giao"
-#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
-msgstr "id của khóa"
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
+msgstr "mã-số-khóa"
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
msgid "GPG sign commit"
msgstr "ký lần chuyển giao dùng GPG"
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
msgid "Commit contents options"
msgstr "Các tùy nội dung ghi chú commit"
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
msgid "commit all changed files"
msgstr "chuyển giao tất cả các tập tin có thay đổi"
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
msgid "add specified files to index for commit"
msgstr "thêm các tập tin đã chỉ ra vào bảng mục lục để chuyển giao"
-#: builtin/commit.c:1477
+#: builtin/commit.c:1511
msgid "interactively add files"
msgstr "thêm các tập-tin bằng tương tác"
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
msgid "interactively add changes"
msgstr "thêm các thay đổi bằng tương tác"
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
msgid "commit only specified files"
msgstr "chỉ chuyển giao các tập tin đã chỉ ra"
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
msgid "bypass pre-commit hook"
msgstr "vòng qua móc (hook) pre-commit"
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
msgid "show what would be committed"
msgstr "hiển thị xem cái gì có thể được chuyển giao"
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
msgid "amend previous commit"
msgstr "“tu bổ†(amend) lần commit trước"
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
msgid "bypass post-rewrite hook"
msgstr "vòng qua móc (hook) post-rewrite"
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
msgid "ok to record an empty change"
msgstr "ok để ghi lại một thay đổi trống rỗng"
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
msgid "ok to record a change with an empty message"
msgstr "ok để ghi các thay đổi vá»›i lá»i nhắn trống rá»—ng"
-#: builtin/commit.c:1529
+#: builtin/commit.c:1562
msgid "could not parse HEAD commit"
msgstr "không thể phân tích commit (lần chuyển giao) HEAD"
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 builtin/merge.c:518
#, c-format
msgid "could not open '%s' for reading"
msgstr "không thể mở “%s†để Ä‘á»c"
-#: builtin/commit.c:1574
+#: builtin/commit.c:1608
#, c-format
msgid "Corrupt MERGE_HEAD file (%s)"
msgstr "Tập tin MERGE_HEAD sai há»ng (%s)"
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
msgid "could not read MERGE_MODE"
msgstr "không thể Ä‘á»c MERGE_MODE"
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
#, c-format
msgid "could not read commit message: %s"
msgstr "không thể Ä‘á»c phần chú thích (message) commit (lần chuyển giao): %s"
-#: builtin/commit.c:1611
+#: builtin/commit.c:1645
#, c-format
msgid "Aborting commit; you did not edit the message.\n"
msgstr ""
"Äang bá» qua việc chuyển giao; bạn đã không biên soạn phần chú thích "
"(message).\n"
-#: builtin/commit.c:1616
+#: builtin/commit.c:1650
#, c-format
msgid "Aborting commit due to empty commit message.\n"
msgstr "Bãi bỠviệc chuyển giao bởi vì phần chú thích của nó trống rỗng.\n"
-#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
msgid "failed to write commit object"
msgstr "gặp lỗi khi ghi đối tượng chuyển giao"
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
msgid "cannot lock HEAD ref"
msgstr "không thể khóa HEAD ref (tham chiếu)"
-#: builtin/commit.c:1656
+#: builtin/commit.c:1690
msgid "cannot update HEAD ref"
msgstr "không thể cập nhật ref (tham chiếu) HEAD"
-#: builtin/commit.c:1667
+#: builtin/commit.c:1701
msgid ""
"Repository has been updated, but unable to write\n"
"new_index file. Check that disk is not full or quota is\n"
@@ -4750,127 +4661,127 @@ msgstr ""
msgid "git config [options]"
msgstr "git config [các-tùy-chá»n]"
-#: builtin/config.c:54
+#: builtin/config.c:53
msgid "Config file location"
msgstr "Vị trí tập tin cấu hình"
-#: builtin/config.c:55
+#: builtin/config.c:54
msgid "use global config file"
msgstr "dùng tập tin cấu hình toàn cục"
-#: builtin/config.c:56
+#: builtin/config.c:55
msgid "use system config file"
msgstr "sử dụng tập tin cấu hình hệ thống"
-#: builtin/config.c:57
+#: builtin/config.c:56
msgid "use repository config file"
msgstr "dùng tập tin cấu hình của kho"
-#: builtin/config.c:58
+#: builtin/config.c:57
msgid "use given config file"
msgstr "sử dụng tập tin cấu hình đã cho"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "blob-id"
msgstr "blob-id"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "read config from given blob object"
msgstr "Ä‘á»c cấu hình từ đối tượng blob đã cho"
-#: builtin/config.c:60
+#: builtin/config.c:59
msgid "Action"
msgstr "Hành động"
-#: builtin/config.c:61
+#: builtin/config.c:60
msgid "get value: name [value-regex]"
msgstr "lấy giá-trị: tên [value-regex]"
-#: builtin/config.c:62
+#: builtin/config.c:61
msgid "get all values: key [value-regex]"
msgstr "lấy tất cả giá-trị: khóa [value-regex]"
-#: builtin/config.c:63
+#: builtin/config.c:62
msgid "get values for regexp: name-regex [value-regex]"
msgstr "lấy giá trị cho regexp: name-regex [value-regex]"
-#: builtin/config.c:64
+#: builtin/config.c:63
msgid "get value specific for the URL: section[.var] URL"
msgstr "lấy đặc tả giá trị cho URL: phần[.biến] URL"
-#: builtin/config.c:65
+#: builtin/config.c:64
msgid "replace all matching variables: name value [value_regex]"
msgstr "thay thế tất cả các biến khớp mẫu: tên giá-trị [value_regex]"
-#: builtin/config.c:66
+#: builtin/config.c:65
msgid "add a new variable: name value"
msgstr "thêm biến mới: tên giá-trị"
-#: builtin/config.c:67
+#: builtin/config.c:66
msgid "remove a variable: name [value-regex]"
msgstr "gỡ bỠbiến: tên [value-regex]"
-#: builtin/config.c:68
+#: builtin/config.c:67
msgid "remove all matches: name [value-regex]"
msgstr "gỡ bá» má»i cái khá»›p: tên [value-regex]"
-#: builtin/config.c:69
+#: builtin/config.c:68
msgid "rename section: old-name new-name"
msgstr "đổi tên phần: tên-cũ tên-mới"
-#: builtin/config.c:70
+#: builtin/config.c:69
msgid "remove a section: name"
msgstr "gỡ bỠphần: tên"
-#: builtin/config.c:71
+#: builtin/config.c:70
msgid "list all"
msgstr "liệt kê tất"
-#: builtin/config.c:72
+#: builtin/config.c:71
msgid "open an editor"
msgstr "mở một trình biên soạn"
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
msgid "slot"
msgstr "khe"
-#: builtin/config.c:73
+#: builtin/config.c:72
msgid "find the color configured: [default]"
msgstr "tìm cấu hình màu sắc: [mặc định]"
-#: builtin/config.c:74
+#: builtin/config.c:73
msgid "find the color setting: [stdout-is-tty]"
msgstr "tìm các cài đặt vỠmàu sắc: [stdout-là-tty]"
-#: builtin/config.c:75
+#: builtin/config.c:74
msgid "Type"
msgstr "Kiểu"
-#: builtin/config.c:76
+#: builtin/config.c:75
msgid "value is \"true\" or \"false\""
msgstr "giá trị là \"true\" hoặc \"false\""
-#: builtin/config.c:77
+#: builtin/config.c:76
msgid "value is decimal number"
msgstr "giá trị ở dạng số thập phân"
-#: builtin/config.c:78
+#: builtin/config.c:77
msgid "value is --bool or --int"
msgstr "giá trị là --bool hoặc --int"
-#: builtin/config.c:79
+#: builtin/config.c:78
msgid "value is a path (file or directory name)"
msgstr "giá trị là Ä‘Æ°á»ng dẫn (tên tập tin hay thÆ° mục)"
-#: builtin/config.c:80
+#: builtin/config.c:79
msgid "Other"
msgstr "Khác"
-#: builtin/config.c:81
+#: builtin/config.c:80
msgid "terminate values with NUL byte"
msgstr "chấm dứt giá trị với byte NUL"
-#: builtin/config.c:82
+#: builtin/config.c:81
msgid "respect include directives on lookup"
msgstr "tôn trá»ng kể cà các hÆ°á»›ng trong tìm kiếm"
@@ -4890,47 +4801,47 @@ msgstr "git describe [các-tùy-chá»n] <commit-ish>*"
msgid "git describe [options] --dirty"
msgstr "git describe [các-tùy-chá»n] --dirty"
-#: builtin/describe.c:237
+#: builtin/describe.c:225
#, c-format
msgid "annotated tag %s not available"
msgstr "thẻ đã được ghi chú %s không sẵn để dùng"
-#: builtin/describe.c:241
+#: builtin/describe.c:229
#, c-format
msgid "annotated tag %s has no embedded name"
msgstr "thẻ được chú giải %s không có tên nhúng"
-#: builtin/describe.c:243
+#: builtin/describe.c:231
#, c-format
msgid "tag '%s' is really '%s' here"
msgstr "thẻ “%s†đã thực sự ở đây “%s†rồi"
-#: builtin/describe.c:270
+#: builtin/describe.c:258
#, c-format
msgid "Not a valid object name %s"
msgstr "Không phải tên đối tượng %s hợp lệ"
-#: builtin/describe.c:273
+#: builtin/describe.c:261
#, c-format
msgid "%s is not a valid '%s' object"
msgstr "%s không phải là một đối tượng “%s†hợp lệ"
-#: builtin/describe.c:290
+#: builtin/describe.c:278
#, c-format
msgid "no tag exactly matches '%s'"
msgstr "không có thẻ nào khá»›p chính xác vá»›i “%sâ€"
-#: builtin/describe.c:292
+#: builtin/describe.c:280
#, c-format
msgid "searching to describe %s\n"
msgstr "Äang tìm kiếm để mô tả %s\n"
-#: builtin/describe.c:332
+#: builtin/describe.c:327
#, c-format
msgid "finished search at %s\n"
msgstr "việc tìm kiếm đã kết thúc tại %s\n"
-#: builtin/describe.c:359
+#: builtin/describe.c:354
#, c-format
msgid ""
"No annotated tags can describe '%s'.\n"
@@ -4939,7 +4850,7 @@ msgstr ""
"Không có thẻ được chú giải nào được mô tả là “%sâ€.\n"
"Tuy nhiên, ở đây có những thẻ không được chú giải: hãy thử --tags."
-#: builtin/describe.c:363
+#: builtin/describe.c:358
#, c-format
msgid ""
"No tags can describe '%s'.\n"
@@ -4948,12 +4859,12 @@ msgstr ""
"Không có thẻ (tag) có thể mô tả “%sâ€.\n"
"Hãy thử --always, hoặt tạo một số thẻ."
-#: builtin/describe.c:384
+#: builtin/describe.c:379
#, c-format
msgid "traversed %lu commits\n"
msgstr "đã xuyên %lu qua lần chuyển giao\n"
-#: builtin/describe.c:387
+#: builtin/describe.c:382
#, c-format
msgid ""
"more than %i tags found; listed %i most recent\n"
@@ -4962,63 +4873,63 @@ msgstr ""
"tìm thấy nhiá»u hÆ¡n %i thẻ (tag); đã liệt kê %i gần đây nhất\n"
"bỠđi tìm kiếm tại %s\n"
-#: builtin/describe.c:409
+#: builtin/describe.c:404
msgid "find the tag that comes after the commit"
msgstr "tìm các thẻ mà nó đến trước lần chuyển giao"
-#: builtin/describe.c:410
+#: builtin/describe.c:405
msgid "debug search strategy on stderr"
msgstr "chiến lược tìm kiếm gỡ lỗi trên đầu ra lỗi chuẩn stderr"
-#: builtin/describe.c:411
+#: builtin/describe.c:406
msgid "use any ref"
msgstr "dùng ref bất kỳ"
-#: builtin/describe.c:412
+#: builtin/describe.c:407
msgid "use any tag, even unannotated"
msgstr "dùng thẻ bất kỳ, cả khi “unannotatedâ€"
-#: builtin/describe.c:413
+#: builtin/describe.c:408
msgid "always use long format"
msgstr "luôn dùng định dạng dài"
-#: builtin/describe.c:414
+#: builtin/describe.c:409
msgid "only follow first parent"
msgstr "chỉ theo cha mẹ đầu tiên"
-#: builtin/describe.c:417
+#: builtin/describe.c:412
msgid "only output exact matches"
msgstr "chỉ xuất những gì khớp chính xác"
-#: builtin/describe.c:419
+#: builtin/describe.c:414
msgid "consider <n> most recent tags (default: 10)"
msgstr "coi như <n> thẻ gần đây nhất (mặc định: 10)"
-#: builtin/describe.c:421
+#: builtin/describe.c:416
msgid "only consider tags matching <pattern>"
msgstr "chỉ cân nhắc đến những thẻ khớp với <mẫu>"
-#: builtin/describe.c:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
msgid "show abbreviated commit object as fallback"
msgstr "hiển thị đối tượng chuyển giao vắn tắt như là fallback"
-#: builtin/describe.c:424
+#: builtin/describe.c:419
msgid "mark"
msgstr "dấu"
-#: builtin/describe.c:425
+#: builtin/describe.c:420
msgid "append <mark> on dirty working tree (default: \"-dirty\")"
msgstr "thêm <dấu> trên cây thư mục làm việc bẩn (mặc định \"-dirty\")"
-#: builtin/describe.c:443
+#: builtin/describe.c:438
msgid "--long is incompatible with --abbrev=0"
msgstr "--long là xung khắc vá»›i tùy chá»n --abbrev=0"
-#: builtin/describe.c:469
+#: builtin/describe.c:464
msgid "No names found, cannot describe anything."
msgstr "Không tìm thấy các tên, không thể mô tả gì cả."
-#: builtin/describe.c:489
+#: builtin/describe.c:484
msgid "--dirty is incompatible with commit-ishes"
msgstr "--dirty là xung khắc vá»›i các tùy chá»n commit-ish"
@@ -5314,7 +5225,7 @@ msgstr "Äang lấy vá» %s\n"
msgid "Could not fetch %s"
msgstr "không thể lấy vỠ%s"
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
msgid ""
"No remote repository specified. Please, specify either a URL or a\n"
"remote name from which new revisions should be fetched."
@@ -5356,10 +5267,10 @@ msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
msgstr ""
"git fmt-merge-msg [-m <chú_thích>] [--log[=<n>]|--no-log] [--file <tập-tin>]"
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702
-#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446
-#: parse-options.h:135 parse-options.h:242
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
+#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: parse-options.h:132 parse-options.h:239
msgid "n"
msgstr "n"
@@ -5423,6 +5334,14 @@ msgstr "khóa"
msgid "field name to sort on"
msgstr "tên trÆ°á»ng cần sắp xếp"
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr "Äang kiểm tra kết nối"
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr "Äang kiểm tra các thÆ° mục đối tượng"
+
#: builtin/fsck.c:607
msgid "git fsck [options] [<object>...]"
msgstr "git fsck [các-tùy-chá»n] [<đối-tượng>...]"
@@ -5467,48 +5386,58 @@ msgstr "ghi các đối tượng không được quản lý trong .git/lost-foun
msgid "show progress"
msgstr "hiển thị quá trình"
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr "Äang kiểm tra các đối tượng"
+
#: builtin/gc.c:24
msgid "git gc [options]"
msgstr "git gc [các-tùy-chá»n]"
-#: builtin/gc.c:80
+#: builtin/gc.c:90
#, c-format
msgid "Invalid %s: '%s'"
msgstr "%s không hợp lệ: “%sâ€"
-#: builtin/gc.c:107
+#: builtin/gc.c:117
#, c-format
msgid "insanely long object directory %.*s"
msgstr "thư mục đối tượng dài một cách điên rồ %.*s"
-#: builtin/gc.c:262
+#: builtin/gc.c:273
msgid "prune unreferenced objects"
msgstr "xóa bỠcác đối tượng không được tham chiếu"
-#: builtin/gc.c:264
+#: builtin/gc.c:275
msgid "be more thorough (increased runtime)"
msgstr "cẩn thận hÆ¡n nữa (tăng thá»i gian chạy)"
-#: builtin/gc.c:265
+#: builtin/gc.c:276
msgid "enable auto-gc mode"
msgstr "bật chế độ auto-gc"
-#: builtin/gc.c:266
+#: builtin/gc.c:277
msgid "force running gc even if there may be another gc running"
msgstr "buộc gc chạy ngay cả khi có tiến trình gc khác đang chạy"
-#: builtin/gc.c:306
+#: builtin/gc.c:318
#, 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"
+msgid "Auto packing the repository in background for optimum performance.\n"
msgstr ""
-"Tự động đóng gói kho chứa để tối ưu hóa hiệu suất làm việc.\n"
-"chạy lệnh \"git gc\" một cách thủ công. Hãy xem \"git help gc\" để biết thêm "
-"chi tiết.\n"
+"Tá»± Ä‘á»™ng đóng gói kho chứa trên ná»n hệ thống để tối Æ°u hóa hiệu suất làm "
+"việc.\n"
+
+#: builtin/gc.c:320
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr "Tự động đóng gói kho chứa để tối ưu hóa hiệu suất làm việc.\n"
+
+#: builtin/gc.c:321
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
+msgstr "Xem \"git help gc\" để có hÆ°á»›ng dẫn cụ thể vá» cách dá»n dẹp kho git.\n"
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:336
#, c-format
msgid ""
"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
@@ -5516,7 +5445,7 @@ msgstr ""
"gc đang được thực hiện trên máy “%s†pid %<PRIuMAX> (dùng --force nếu không "
"phải thế)"
-#: builtin/gc.c:341
+#: builtin/gc.c:361
msgid ""
"There are too many unreachable loose objects; run 'git prune' to remove them."
msgstr ""
@@ -5547,212 +5476,212 @@ msgstr "không thể Ä‘á»c cây (%s)"
msgid "unable to grep from object of type %s"
msgstr "không thể thá»±c hiện lệnh grep (lá»c tìm) từ đối tượng thuá»™c kiểu %s"
-#: builtin/grep.c:551
+#: builtin/grep.c:549
#, c-format
msgid "switch `%c' expects a numerical value"
msgstr "chuyển đến “%c†cần một giá trị bằng số"
-#: builtin/grep.c:568
+#: builtin/grep.c:566
#, c-format
msgid "cannot open '%s'"
msgstr "không mở được “%sâ€"
-#: builtin/grep.c:642
+#: builtin/grep.c:640
msgid "search in index instead of in the work tree"
msgstr "tìm trong bảng mục lục thay vì trong cây làm việc"
-#: builtin/grep.c:644
+#: builtin/grep.c:642
msgid "find in contents not managed by git"
msgstr "tìm trong nội dung không được quản lý bởi git"
-#: builtin/grep.c:646
+#: builtin/grep.c:644
msgid "search in both tracked and untracked files"
msgstr "tìm kiếm các tập tin được và chưa được theo dõi dấu vết"
-#: builtin/grep.c:648
+#: builtin/grep.c:646
msgid "search also in ignored files"
msgstr "tìm cả trong các tập tin đã bị lỠđi"
-#: builtin/grep.c:651
+#: builtin/grep.c:649
msgid "show non-matching lines"
msgstr "hiển thị những dòng không khớp với mẫu"
-#: builtin/grep.c:653
+#: builtin/grep.c:651
msgid "case insensitive matching"
msgstr "phân biệt HOA/thÆ°á»ng"
-#: builtin/grep.c:655
+#: builtin/grep.c:653
msgid "match patterns only at word boundaries"
msgstr "chỉ khá»›p mẫu tại Ä‘Æ°á»ng ranh giá»›i từ"
-#: builtin/grep.c:657
+#: builtin/grep.c:655
msgid "process binary files as text"
msgstr "xá»­ lý tập tin nhị phân nhÆ° là dạng văn bản thÆ°á»ng"
-#: builtin/grep.c:659
+#: builtin/grep.c:657
msgid "don't match patterns in binary files"
msgstr "không khớp mẫu trong các tập tin nhị phân"
-#: builtin/grep.c:662
+#: builtin/grep.c:660
msgid "process binary files with textconv filters"
msgstr "xá»­ lý tập tin nhị phân vá»›i các bá»™ lá»c “textconvâ€"
-#: builtin/grep.c:664
+#: builtin/grep.c:662
msgid "descend at most <depth> levels"
msgstr "giảm xuống ít nhất mức <sâu>"
-#: builtin/grep.c:668
+#: builtin/grep.c:666
msgid "use extended POSIX regular expressions"
msgstr "dùng biểu thức chính qui POSIX có mở rộng"
-#: builtin/grep.c:671
+#: builtin/grep.c:669
msgid "use basic POSIX regular expressions (default)"
msgstr "sử dụng biểu thức chính quy kiểu POSIX (mặc định)"
-#: builtin/grep.c:674
+#: builtin/grep.c:672
msgid "interpret patterns as fixed strings"
msgstr "diễn dịch các mẫu như là chuỗi cố định"
-#: builtin/grep.c:677
+#: builtin/grep.c:675
msgid "use Perl-compatible regular expressions"
msgstr "sử dụng biểu thức chính quy tương thích Perl"
-#: builtin/grep.c:680
+#: builtin/grep.c:678
msgid "show line numbers"
msgstr "hiển thị số của dòng"
-#: builtin/grep.c:681
+#: builtin/grep.c:679
msgid "don't show filenames"
msgstr "không hiển thị tên tập tin"
-#: builtin/grep.c:682
+#: builtin/grep.c:680
msgid "show filenames"
msgstr "hiển thị các tên tập tin"
-#: builtin/grep.c:684
+#: builtin/grep.c:682
msgid "show filenames relative to top directory"
msgstr "hiển thị tên tập tin tương đối với thư mục đỉnh (top)"
-#: builtin/grep.c:686
+#: builtin/grep.c:684
msgid "show only filenames instead of matching lines"
msgstr "chỉ hiển thị tên tập tin thay vì những dòng khớp với mẫu"
-#: builtin/grep.c:688
+#: builtin/grep.c:686
msgid "synonym for --files-with-matches"
msgstr "đồng nghĩa với --files-with-matches"
-#: builtin/grep.c:691
+#: builtin/grep.c:689
msgid "show only the names of files without match"
msgstr "chỉ hiển thị tên cho những tập tin không khớp với mẫu"
-#: builtin/grep.c:693
+#: builtin/grep.c:691
msgid "print NUL after filenames"
msgstr "thêm NUL vào sau tên tập tin"
-#: builtin/grep.c:695
+#: builtin/grep.c:693
msgid "show the number of matches instead of matching lines"
msgstr "hiển thị số lượng khớp thay vì những dòng khớp với mẫu"
-#: builtin/grep.c:696
+#: builtin/grep.c:694
msgid "highlight matches"
msgstr "tô sáng cái khớp"
-#: builtin/grep.c:698
+#: builtin/grep.c:696
msgid "print empty line between matches from different files"
msgstr "hiển thị dòng trống giữa các lần khớp từ các tập tin khác biệt"
-#: builtin/grep.c:700
+#: builtin/grep.c:698
msgid "show filename only once above matches from same file"
msgstr ""
"hiển thị tên tập tin một lần phía trên các lần khớp từ cùng một tập tin"
-#: builtin/grep.c:703
+#: builtin/grep.c:701
msgid "show <n> context lines before and after matches"
msgstr "hiển thị <n> dòng nội dung phía trước và sau các lần khớp"
-#: builtin/grep.c:706
+#: builtin/grep.c:704
msgid "show <n> context lines before matches"
msgstr "hiển thị <n> dòng nội dung trước khớp"
-#: builtin/grep.c:708
+#: builtin/grep.c:706
msgid "show <n> context lines after matches"
msgstr "hiển thị <n> dòng nội dung sau khớp"
-#: builtin/grep.c:709
+#: builtin/grep.c:707
msgid "shortcut for -C NUM"
msgstr "dạng viết tắt của -C Sá»"
-#: builtin/grep.c:712
+#: builtin/grep.c:710
msgid "show a line with the function name before matches"
msgstr "hiển thị dòng vói tên hàm trước các lần khớp"
-#: builtin/grep.c:714
+#: builtin/grep.c:712
msgid "show the surrounding function"
msgstr "hiển thị hàm bao quanh"
-#: builtin/grep.c:717
+#: builtin/grep.c:715
msgid "read patterns from file"
msgstr "Ä‘á»c mẫu từ tập-tin"
-#: builtin/grep.c:719
+#: builtin/grep.c:717
msgid "match <pattern>"
msgstr "match <mẫu>"
-#: builtin/grep.c:721
+#: builtin/grep.c:719
msgid "combine patterns specified with -e"
msgstr "tổ hợp mẫu được chỉ ra vá»›i tùy chá»n -e"
-#: builtin/grep.c:733
+#: builtin/grep.c:731
msgid "indicate hit with exit status without output"
msgstr "đưa ra gợi ý với trạng thái thoát mà không có kết xuất"
-#: builtin/grep.c:735
+#: builtin/grep.c:733
msgid "show only matches from files that match all patterns"
msgstr "chỉ hiển thị những cái khớp từ tập tin mà nó khớp toàn bộ các mẫu"
-#: builtin/grep.c:737
+#: builtin/grep.c:735
msgid "show parse tree for grep expression"
msgstr "hiển thị cây phân tích cú pháp cho biểu thức “grep†(tìm kiếm)"
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "pager"
msgstr "giấy"
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "show matching files in the pager"
msgstr "hiển thị các tập tin khớp trong trang giấy"
-#: builtin/grep.c:744
+#: builtin/grep.c:742
msgid "allow calling of grep(1) (ignored by this build)"
msgstr "cho phép gá»i grep(1) (bị bá» qua bởi lần dịch này)"
-#: builtin/grep.c:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
msgid "show usage"
msgstr "hiển thị cách dùng"
-#: builtin/grep.c:812
+#: builtin/grep.c:810
msgid "no pattern given."
msgstr "chưa chỉ ra mẫu."
-#: builtin/grep.c:870
+#: builtin/grep.c:868
msgid "--open-files-in-pager only works on the worktree"
msgstr "--open-files-in-pager chỉ làm việc trên cây-làm-việc"
-#: builtin/grep.c:893
+#: builtin/grep.c:891
msgid "--cached or --untracked cannot be used with --no-index."
msgstr "--cached hay --untracked không được sử dụng với --no-index."
-#: builtin/grep.c:898
+#: builtin/grep.c:896
msgid "--no-index or --untracked cannot be used with revs."
msgstr ""
"--no-index hay --untracked không được sá»­ dụng cùng vá»›i các tùy chá»n liên "
"quan đến revs."
-#: builtin/grep.c:901
+#: builtin/grep.c:899
msgid "--[no-]exclude-standard cannot be used for tracked contents."
msgstr "--[no-]exclude-standard không thể sử dụng cho nội dung lưu dấu vết."
-#: builtin/grep.c:909
+#: builtin/grep.c:907
msgid "both --cached and trees are given."
msgstr "cả hai --cached và các cây phải được chỉ ra."
@@ -5768,7 +5697,7 @@ msgstr ""
msgid "git hash-object --stdin-paths < <list-of-paths>"
msgstr "git hash-object --stdin-paths < <danh-sách-Ä‘Æ°á»ng-dẫn>"
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:72 builtin/tag.c:521
msgid "type"
msgstr "kiểu"
@@ -6007,8 +5936,8 @@ msgstr "sá»± mâu thuẫn xả nén nghiêm trá»ng"
msgid "SHA1 COLLISION FOUND WITH %s !"
msgstr "Sá»° VA CHẠM SHA1 ÄÃ XẢY RA VỚI %s!"
-#: builtin/index-pack.c:669 builtin/pack-objects.c:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
#, c-format
msgid "unable to read %s"
msgstr "không thể Ä‘á»c %s"
@@ -6274,63 +6203,61 @@ msgstr "không thể xử lý (handle) tập tin kiểu %d"
msgid "unable to move %s to %s"
msgstr "không di chuyển được %s vào %s"
-#.
-#. * 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
+#. 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:418
#, c-format
msgid "%s%s Git repository in %s%s\n"
msgstr "%s%s kho Git trong %s%s\n"
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Reinitialized existing"
msgstr "Khởi tạo lại đã sẵn có rồi"
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Initialized empty"
msgstr "Khởi tạo trống rỗng"
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
msgid " shared"
msgstr " đã chia sẻ"
-#: builtin/init-db.c:441
+#: builtin/init-db.c:439
msgid "cannot tell cwd"
msgstr "không nói chuyện được với lệnh cwd"
-#: builtin/init-db.c:467
+#: builtin/init-db.c:465
msgid ""
-"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
-"shared[=<permissions>]] [directory]"
+"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared"
+"[=<permissions>]] [directory]"
msgstr ""
"git init [-q | --quiet] [--bare] [--template=<thư-mục-tạm>] [--shared[=<các-"
"quyá»n>]] [thÆ°-mục]"
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
msgid "permissions"
msgstr "các quyá»n"
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
msgid "specify that the git repository is to be shared amongst several users"
msgstr "chỉ ra cái mà kho git được chia sẻ giữa nhiá»u ngÆ°á»i dùng"
-#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
msgid "be quiet"
msgstr "im lặng"
-#: builtin/init-db.c:525 builtin/init-db.c:530
+#: builtin/init-db.c:523 builtin/init-db.c:528
#, c-format
msgid "cannot mkdir %s"
msgstr "không thể mkdir (tạo thư mục): %s"
-#: builtin/init-db.c:534
+#: builtin/init-db.c:532
#, c-format
msgid "cannot chdir to %s"
msgstr "không thể chdir (chuyển đổi thư mục) sang %s"
-#: builtin/init-db.c:556
+#: builtin/init-db.c:554
#, c-format
msgid ""
"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6339,11 +6266,11 @@ msgstr ""
"%s (hoặc --work-tree=<thư-mục>) không cho phép không chỉ định %s (hoặc --git-"
"dir=<thư-mục>)"
-#: builtin/init-db.c:580
+#: builtin/init-db.c:578
msgid "Cannot access current working directory"
msgstr "Không thể truy cập thư mục làm việc hiện hành"
-#: builtin/init-db.c:587
+#: builtin/init-db.c:585
#, c-format
msgid "Cannot access work tree '%s'"
msgstr "không thể truy cập cây (tree) làm việc “%sâ€"
@@ -6609,98 +6536,98 @@ msgstr ""
msgid "Unknown commit %s"
msgstr "Không hiểu lần chuyển giao %s"
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
msgid "git ls-files [options] [<file>...]"
msgstr "git ls-files [các-tùy-chá»n] [<tập-tin>...]"
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
msgid "identify the file status with tags"
msgstr "nhận dạng các trạng thái tập tin với thẻ"
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
msgid "use lowercase letters for 'assume unchanged' files"
msgstr ""
"dùng chữ cái viết thÆ°á»ng cho các tập tin “assume unchanged†(giả định không "
"thay đổi)"
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
msgid "show cached files in the output (default)"
msgstr "hiển thị các tập tin được nhớ tạm vào đầu ra (mặc định)"
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
msgid "show deleted files in the output"
msgstr "hiển thị các tập tin đã xóa trong kết xuất"
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
msgid "show modified files in the output"
msgstr "hiển thị các tập tin đã bị sửa đổi ra kết xuất"
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
msgid "show other files in the output"
msgstr "hiển thị các tập tin khác trong kết xuất"
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
msgid "show ignored files in the output"
msgstr "hiển thị các tập tin bị bỠqua trong kết xuất"
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
msgid "show staged contents' object name in the output"
msgstr "hiển thị tên đối tượng của nội dung được đặt lên bệ phóng ra kết xuất"
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
msgid "show files on the filesystem that need to be removed"
msgstr "hiển thị các tập tin trên hệ thống tập tin mà nó cần được gỡ bá»"
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
msgid "show 'other' directories' name only"
msgstr "chỉ hiển thị tên của các thÆ° mục “khácâ€"
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
msgid "don't show empty directories"
msgstr "không hiển thị thư mục rỗng"
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
msgid "show unmerged files in the output"
msgstr "hiển thị các tập tin chưa hòa trộn trong kết xuất"
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
msgid "show resolve-undo information"
msgstr "hiển thị thông tin resolve-undo"
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
msgid "skip files matching pattern"
msgstr "bỠqua những tập tin khớp với một mẫu"
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
msgid "exclude patterns are read from <file>"
msgstr "mẫu loại trừ được Ä‘á»c từ <tập tin>"
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
msgid "read additional per-directory exclude patterns in <file>"
msgstr "Ä‘á»c thêm các mẫu ngoại trừ má»—i thÆ° mục trong <tập tin>"
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
msgid "add the standard git exclusions"
msgstr "thêm loại trừ tiêu chuẩn kiểu git"
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
msgid "make the output relative to the project top directory"
msgstr "làm cho kết xuất liên quan đến thư mục ở mức cao nhất (gốc) của dự án"
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
msgid "if any <file> is not in the index, treat this as an error"
msgstr "nếu <tập tin> bất kỳ không ở trong bảng mục lục, xử lý nó như một lỗi"
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
msgid "tree-ish"
msgstr "tree-ish"
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
msgid "pretend that paths removed since <tree-ish> are still present"
msgstr ""
"giả định rằng các Ä‘Æ°á»ng dẫn đã bị gỡ bá» kể từ <tree-ish> nay vẫn hiện diện"
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
msgid "show debugging data"
msgstr "hiển thị dữ liệu gỡ lỗi"
@@ -6811,7 +6738,7 @@ msgstr "bỠqua nếu fast-forward không thể được"
msgid "Verify that the named commit has a valid GPG signature"
msgstr "Thẩm tra xem lần chuyển giao có tên đó có chữ ký GPG hợp lệ hay không"
-#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
msgid "strategy"
msgstr "chiến lược"
@@ -6885,37 +6812,37 @@ msgstr "“%s†không chỉ đến một lần chuyển giao nào cả"
msgid "Bad branch.%s.mergeoptions string: %s"
msgstr "Chuá»—i branch.%s.mergeoptions sai: %s"
-#: builtin/merge.c:650
+#: builtin/merge.c:653
msgid "git write-tree failed to write a tree"
msgstr "lệnh git write-tree gặp lỗi khi ghi một cây"
-#: builtin/merge.c:678
+#: builtin/merge.c:681
msgid "Not handling anything other than two heads merge."
msgstr "Không cầm nắm gì ngoài hai head hòa trộn"
-#: builtin/merge.c:692
+#: builtin/merge.c:695
#, c-format
msgid "Unknown option for merge-recursive: -X%s"
msgstr "Không hiểu tùy chá»n cho merge-recursive: -X%s"
-#: builtin/merge.c:706
+#: builtin/merge.c:709
#, c-format
msgid "unable to write %s"
msgstr "không thể ghi %s"
-#: builtin/merge.c:795
+#: builtin/merge.c:798
#, c-format
msgid "Could not read from '%s'"
msgstr "Không thể Ä‘á»c từ “%sâ€"
-#: builtin/merge.c:804
+#: builtin/merge.c:807
#, c-format
msgid "Not committing merge; use 'git commit' to complete the merge.\n"
msgstr ""
"Vẫn chưa hòa trộn các lần chuyển giao; sử dụng lệnh “git commit†để hoàn tất "
"việc hòa trộn.\n"
-#: builtin/merge.c:810
+#: builtin/merge.c:813
#, c-format
msgid ""
"Please enter a commit message to explain why this merge is necessary,\n"
@@ -6933,50 +6860,50 @@ msgstr ""
"rá»—ng\n"
"sẽ hủy bỠlần chuyển giao.\n"
-#: builtin/merge.c:834
+#: builtin/merge.c:837
msgid "Empty commit message."
msgstr "Chú thích của lần commit (chuyển giao) bị trống rỗng."
-#: builtin/merge.c:846
+#: builtin/merge.c:849
#, c-format
msgid "Wonderful.\n"
msgstr "Thần kỳ.\n"
-#: builtin/merge.c:911
+#: builtin/merge.c:914
#, c-format
msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
msgstr ""
"Việc tự động hòa trộn gặp lỗi; hãy sửa các xung đột sau đó chuyển giao kết "
"quả.\n"
-#: builtin/merge.c:927
+#: builtin/merge.c:930
#, c-format
msgid "'%s' is not a commit"
msgstr "%s không phải là một lần commit (chuyển giao)"
-#: builtin/merge.c:968
+#: builtin/merge.c:971
msgid "No current branch."
msgstr "không phải nhánh hiện hành"
-#: builtin/merge.c:970
+#: builtin/merge.c:973
msgid "No remote for the current branch."
msgstr "Không có máy chủ cho nhánh hiện hành."
-#: builtin/merge.c:972
+#: builtin/merge.c:975
msgid "No default upstream defined for the current branch."
msgstr "Không có thượng nguồn mặc định được định nghĩa cho nhánh hiện hành."
-#: builtin/merge.c:977
+#: builtin/merge.c:980
#, c-format
msgid "No remote-tracking branch for %s from %s"
msgstr "Không nhánh mạng theo dõi cho %s từ %s"
-#: builtin/merge.c:1133
+#: builtin/merge.c:1136
msgid "There is no merge to abort (MERGE_HEAD missing)."
msgstr ""
"Ở đây không có lần hòa trộn nào được hủy bỠgiữa chừng cả (thiếu MERGE_HEAD)."
-#: builtin/merge.c:1149 git-pull.sh:31
+#: builtin/merge.c:1152 git-pull.sh:31
msgid ""
"You have not concluded your merge (MERGE_HEAD exists).\n"
"Please, commit your changes before you can merge."
@@ -6984,11 +6911,11 @@ msgstr ""
"Bạn chưa kết thúc việc hòa trộng (MERGE_HEAD vẫn tồn tại).\n"
"Hãy chuyển giao các thay đổi trước khi bạn có thể hòa trộn."
-#: builtin/merge.c:1152 git-pull.sh:34
+#: builtin/merge.c:1155 git-pull.sh:34
msgid "You have not concluded your merge (MERGE_HEAD exists)."
msgstr "Bạn chưa kết thúc việc hòa trộng (MERGE_HEAD vẫn tồn tại)."
-#: builtin/merge.c:1156
+#: builtin/merge.c:1159
msgid ""
"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
"Please, commit your changes before you can merge."
@@ -6996,104 +6923,103 @@ msgstr ""
"Bạn chưa kết thúc việc cherry-pick (CHERRY_PICK_HEAD vẫn tồn tại).\n"
"Hãy chuyển giao các thay đổi trước khi bạn có thể hòa trộn."
-#: builtin/merge.c:1159
+#: builtin/merge.c:1162
msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
msgstr "Bạn chưa kết thúc việc cherry-pick (CHERRY_PICK_HEAD vẫn tồn tại)."
-#: builtin/merge.c:1168
+#: builtin/merge.c:1171
msgid "You cannot combine --squash with --no-ff."
msgstr "Bạn không thể kết hợp --squash với --no-ff."
-#: builtin/merge.c:1177
+#: builtin/merge.c:1180
msgid "No commit specified and merge.defaultToUpstream not set."
msgstr "Không chỉ ra lần chuyển giao và merge.defaultToUpstream chưa được đặt."
-#: builtin/merge.c:1209
+#: builtin/merge.c:1212
msgid "Can merge only exactly one commit into empty head"
msgstr ""
"Không thể hòa trộn một cách đúng đắn một lần chuyển giao vào một head rỗng"
-#: builtin/merge.c:1212
+#: builtin/merge.c:1215
msgid "Squash commit into empty head not supported yet"
msgstr "Squash commit vào một head trống rỗng vẫn chưa được hỗ trợ"
-#: builtin/merge.c:1214
+#: builtin/merge.c:1217
msgid "Non-fast-forward commit does not make sense into an empty head"
msgstr ""
"Chuyển giao không-fast-forward không hợp lý ở trong một head trống rỗng"
-#: builtin/merge.c:1219
+#: builtin/merge.c:1222
#, c-format
msgid "%s - not something we can merge"
msgstr "%s - không phải là một số thứ chúng tôi có thể hòa trộn"
-#: builtin/merge.c:1270
+#: builtin/merge.c:1273
#, c-format
msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
msgstr ""
"Lần chuyển giao %s có một chữ ký GPG không đáng tin, được cho là bởi %s."
-#: builtin/merge.c:1273
+#: builtin/merge.c:1276
#, c-format
msgid "Commit %s has a bad GPG signature allegedly by %s."
msgstr "Lần chuyển giao %s có một chữ ký GPG sai, được cho là bởi %s."
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
#, c-format
msgid "Commit %s does not have a GPG signature."
msgstr "Lần chuyển giao %s không có chữ ký GPG."
-#: builtin/merge.c:1279
+#: builtin/merge.c:1282
#, c-format
msgid "Commit %s has a good GPG signature by %s\n"
msgstr "Lần chuyển giao %s có một chữ ký GPG tốt bởi %s\n"
-#: builtin/merge.c:1363
+#: builtin/merge.c:1366
#, c-format
msgid "Updating %s..%s\n"
msgstr "Äang cập nhật %s..%s\n"
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
#, c-format
msgid "Trying really trivial in-index merge...\n"
msgstr "Äang thá»­ hòa trá»™n kiểu “trivial in-indexâ€...\n"
-#: builtin/merge.c:1409
+#: builtin/merge.c:1412
#, c-format
msgid "Nope.\n"
msgstr "Không.\n"
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
msgid "Not possible to fast-forward, aborting."
msgstr "Thực hiện lệnh fast-forward là không thể được, đang bỠqua."
-#: builtin/merge.c:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
#, c-format
msgid "Rewinding the tree to pristine...\n"
msgstr "Äang tua lại cây thành thá»i xa xÆ°a...\n"
-#: builtin/merge.c:1468
+#: builtin/merge.c:1471
#, c-format
msgid "Trying merge strategy %s...\n"
msgstr "Äang thá»­ chiến lược hòa trá»™n %s...\n"
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
#, c-format
msgid "No merge strategy handled the merge.\n"
msgstr "Không có chiến lược hòa trộn nào được nắm giữ (handle) sự hòa trộn.\n"
-#: builtin/merge.c:1536
+#: builtin/merge.c:1539
#, c-format
msgid "Merge with strategy %s failed.\n"
msgstr "Hòa trộn với chiến lược %s gặp lỗi.\n"
-#: builtin/merge.c:1545
+#: builtin/merge.c:1548
#, c-format
msgid "Using the %s to prepare resolving by hand.\n"
msgstr "Sử dụng %s để chuẩn bị giải quyết bằng tay.\n"
-#: builtin/merge.c:1557
+#: builtin/merge.c:1560
#, c-format
msgid "Automatic merge went well; stopped before committing as requested\n"
msgstr ""
@@ -7180,19 +7106,19 @@ msgstr "không cảnh báo vỠcác xung đột xảy ra"
msgid "set labels for file1/orig_file/file2"
msgstr "đặt nhãn cho tập-tin-1/tập-tin-gốc/tập-tin-2"
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
msgid "git mktree [-z] [--missing] [--batch]"
msgstr "git mktree [-z] [--missing] [--batch]"
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
msgid "input is NUL terminated"
msgstr "đầu vào được chấm dứt bởi NUL"
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
msgid "allow missing objects"
msgstr "cho phép thiếu đối tượng"
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
msgid "allow creation of more than one tree"
msgstr "cho phép tạo nhiá»u hÆ¡n má»™t cây"
@@ -7241,46 +7167,46 @@ msgstr ""
msgid "Huh? %.*s is in index?"
msgstr "Hả? %.*s trong bảng mục lục à?"
-#: builtin/mv.c:168
+#: builtin/mv.c:169
msgid "source directory is empty"
msgstr "thư mục nguồn là trống rỗng"
-#: builtin/mv.c:200
+#: builtin/mv.c:205
msgid "not under version control"
msgstr "không nằm dưới sự quản lý mã nguồn"
-#: builtin/mv.c:202
+#: builtin/mv.c:207
msgid "destination exists"
msgstr "đích đã tồn tại sẵn rồi"
-#: builtin/mv.c:210
+#: builtin/mv.c:215
#, c-format
msgid "overwriting '%s'"
msgstr "Ä‘ang ghi đè lên “%sâ€"
-#: builtin/mv.c:213
+#: builtin/mv.c:218
msgid "Cannot overwrite"
msgstr "Không thể ghi đè"
-#: builtin/mv.c:216
+#: builtin/mv.c:221
msgid "multiple sources for the same target"
msgstr "Nhiá»u nguồn cho cùng má»™t đích"
-#: builtin/mv.c:218
+#: builtin/mv.c:223
msgid "destination directory does not exist"
msgstr "thư mục đích không tồn tại"
-#: builtin/mv.c:233
+#: builtin/mv.c:243
#, c-format
msgid "%s, source=%s, destination=%s"
msgstr "%s, nguồn=%s, đích=%s"
-#: builtin/mv.c:243
+#: builtin/mv.c:253
#, c-format
msgid "Renaming %s to %s\n"
msgstr "Äổi tên %s thành %s\n"
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
#, c-format
msgid "renaming '%s' failed"
msgstr "gặp lá»—i khi đổi tên “%sâ€"
@@ -7450,7 +7376,7 @@ msgstr "không thể Ä‘á»c kết xuất “showâ€"
msgid "failed to finish 'show' for object '%s'"
msgstr "gặp lá»—i khi hoàn thành “show†cho đối tượng “%sâ€"
-#: builtin/notes.c:167 builtin/tag.c:341
+#: builtin/notes.c:167 builtin/tag.c:373
#, c-format
msgid "could not create file '%s'"
msgstr "không thể tạo tập tin “%sâ€"
@@ -7460,7 +7386,7 @@ msgid "Please supply the note contents using either -m or -F option"
msgstr ""
"Xin hãy áp dụng ná»™i dung của ghi chú sá»­ dụng hoặc là tùy chá»n -m hoặc là -F"
-#: builtin/notes.c:207 builtin/notes.c:844
+#: builtin/notes.c:207 builtin/notes.c:848
#, c-format
msgid "Removing note for object %s\n"
msgstr "Äang gỡ bá» ghi chú (note) cho đối tượng %s\n"
@@ -7474,20 +7400,20 @@ msgstr "không thể ghi đối tượng ghi chú (note)"
msgid "The note contents has been left in %s"
msgstr "Nội dung ghi chú còn lại %s"
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
#, c-format
msgid "cannot read '%s'"
msgstr "không thể Ä‘á»c “%sâ€"
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
#, c-format
msgid "could not open or read '%s'"
msgstr "không thể mở hay Ä‘á»c “%sâ€"
-#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318
-#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515
-#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637
-#: builtin/notes.c:839 builtin/tag.c:553
+#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
+#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
+#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
+#: builtin/notes.c:843 builtin/tag.c:620
#, c-format
msgid "Failed to resolve '%s' as a valid ref."
msgstr "Gặp lỗi khi phân giải “%s†như là một tham chiếu (ref) hợp lệ."
@@ -7497,53 +7423,58 @@ msgstr "Gặp lỗi khi phân giải “%s†như là một tham chiếu (ref)
msgid "Failed to read object '%s'."
msgstr "Gặp lá»—i khi Ä‘á»c đối tượng “%sâ€."
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr "không thể Ä‘á»c dữ liệu ghi chú từ đối tượng không-blob '%s'."
+
+#: builtin/notes.c:316
#, c-format
msgid "Malformed input line: '%s'."
msgstr "Dòng đầu vào dị hình: “%sâ€."
-#: builtin/notes.c:327
+#: builtin/notes.c:331
#, c-format
msgid "Failed to copy notes from '%s' to '%s'"
msgstr "Gặp lá»—i khi sao chép ghi chú (note) từ “%s†tá»›i “%sâ€"
-#: builtin/notes.c: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
+#: builtin/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
+#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
+#: builtin/notes.c:908
msgid "too many parameters"
msgstr "quá nhiá»u đối số"
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
#, c-format
msgid "No note found for object %s."
msgstr "không tìm thấy ghi chú cho đối tượng %s."
-#: builtin/notes.c:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
msgid "note contents as a string"
msgstr "nội dung ghi chú (note) nằm trong một chuỗi"
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
msgid "note contents in a file"
msgstr "nội dung ghi chú (note) nằm trong một tập tin"
-#: builtin/notes.c:411 builtin/notes.c:414 builtin/notes.c:568
-#: builtin/notes.c:571 builtin/tag.c:474
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
msgid "object"
msgstr "đối tượng"
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
msgid "reuse and edit specified note object"
msgstr "dùng lại nhưng có sửa chữa đối tượng note đã chỉ ra"
-#: builtin/notes.c:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
msgid "reuse specified note object"
msgstr "dùng lại đối tượng ghi chú (note) đã chỉ ra"
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
msgid "replace existing notes"
msgstr "thay thế ghi chú trước"
-#: builtin/notes.c:451
+#: builtin/notes.c:455
#, c-format
msgid ""
"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7552,24 +7483,24 @@ msgstr ""
"Không thể thêm các ghi chú. Äã tìm thấy các ghi chú đã có sẵn cho đối tượng "
"%s. Sá»­ dụng tùy chá»n “-f†để ghi đè lên các ghi chú cÅ©"
-#: builtin/notes.c:456 builtin/notes.c:533
+#: builtin/notes.c:460 builtin/notes.c:537
#, c-format
msgid "Overwriting existing notes for object %s\n"
msgstr "Äang ghi đè lên ghi chú cÅ© cho đối tượng %s\n"
-#: builtin/notes.c:486
+#: builtin/notes.c:490
msgid "read objects from stdin"
msgstr "Ä‘á»c các đối tượng từ đầu vào tiêu chuẩn"
-#: builtin/notes.c:488
+#: builtin/notes.c:492
msgid "load rewriting config for <command> (implies --stdin)"
msgstr "tải cấu hình chép lại cho <lệnh> (ngầm định là --stdin)"
-#: builtin/notes.c:506
+#: builtin/notes.c:510
msgid "too few parameters"
msgstr "quá ít đối số"
-#: builtin/notes.c:527
+#: builtin/notes.c:531
#, c-format
msgid ""
"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
@@ -7578,12 +7509,12 @@ msgstr ""
"Không thể sao chép các ghi chú. Äã tìm thấy các ghi chú đã có sẵn cho đối "
"tượng %s. Sá»­ dụng tùy chá»n “-f†để ghi đè lên các ghi chú cÅ©"
-#: builtin/notes.c:539
+#: builtin/notes.c:543
#, c-format
msgid "Missing notes on source object %s. Cannot copy."
msgstr "Thiếu ghi chú trên đối tượng nguồn %s. Không thể sao chép."
-#: builtin/notes.c:588
+#: builtin/notes.c:592
#, c-format
msgid ""
"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -7592,15 +7523,15 @@ msgstr ""
"Các tùy chá»n -m/-F/-c/-C đã cổ không còn dùng nữa cho lệnh con “editâ€.\n"
"Xin hãy sá»­ dụng lệnh sau để thay thế: “git notes add -f -m/-F/-c/-Câ€.\n"
-#: builtin/notes.c:735
+#: builtin/notes.c:739
msgid "General options"
msgstr "Tùy chá»n chung"
-#: builtin/notes.c:737
+#: builtin/notes.c:741
msgid "Merge options"
msgstr "Tùy chá»n vá» hòa trá»™n"
-#: builtin/notes.c:739
+#: builtin/notes.c:743
msgid ""
"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
"cat_sort_uniq)"
@@ -7608,208 +7539,232 @@ msgstr ""
"phân giải các xung đột “notes†sử dụng chiến lược đã đưa ra (manual/ours/"
"theirs/union/cat_sort_uniq)"
-#: builtin/notes.c:741
+#: builtin/notes.c:745
msgid "Committing unmerged notes"
msgstr "Chuyển giao các note chưa được hòa trộn"
-#: builtin/notes.c:743
+#: builtin/notes.c:747
msgid "finalize notes merge by committing unmerged notes"
msgstr ""
"các note cuối cùng được hòa trộn bởi các note chưa hòa trộn của lần chuyển "
"giao"
-#: builtin/notes.c:745
+#: builtin/notes.c:749
msgid "Aborting notes merge resolution"
msgstr "Hủy bỠphân giải ghi chú (note) hòa trộn"
-#: builtin/notes.c:747
+#: builtin/notes.c:751
msgid "abort notes merge"
msgstr "bỠqua hòa trộn các ghi chú (note)"
-#: builtin/notes.c:842
+#: builtin/notes.c:846
#, c-format
msgid "Object %s has no note\n"
msgstr "Äối tượng %s không có ghi chú (note)\n"
-#: builtin/notes.c:854
+#: builtin/notes.c:858
msgid "attempt to remove non-existent note is not an error"
msgstr "cố gắng gỡ bỠmột note chưa từng tồn tại không phải là một lỗi"
-#: builtin/notes.c:857
+#: builtin/notes.c:861
msgid "read object names from the standard input"
msgstr "Ä‘á»c tên đối tượng từ thiết bị nhập chuẩn"
-#: builtin/notes.c:938
-msgid "notes_ref"
-msgstr "notes_ref"
+#: builtin/notes.c:942
+msgid "notes-ref"
+msgstr "notes-ref"
-#: builtin/notes.c:939
+#: builtin/notes.c:943
msgid "use notes from <notes_ref>"
msgstr "dùng “notes†từ <notes_ref>"
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
#, c-format
msgid "Unknown subcommand: %s"
msgstr "Không hiểu câu lệnh con: %s"
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
msgstr ""
"git pack-objects --stdout [các-tùy-chá»n...] [< danh-sách-ref | < danh-sách-"
"đối-tượng]"
-#: builtin/pack-objects.c:24
+#: builtin/pack-objects.c:26
msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
msgstr ""
"git pack-objects [các-tùy-chá»n...] base-name [< danh-sách-ref | < danh-sách-"
"đối-tượng]"
-#: builtin/pack-objects.c:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
#, c-format
msgid "deflate error (%d)"
msgstr "lỗi giải nén (%d)"
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "Äang ghi lại các đối tượng"
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr "tắt ghi bitmap, như vậy một số đối tượng sẽ không được đóng gói"
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr "Äang nén các đối tượng"
+
+#: builtin/pack-objects.c:2530
#, c-format
msgid "unsupported index version %s"
msgstr "phiên bản mục lục không được hỗ trợ %s"
-#: builtin/pack-objects.c:2400
+#: builtin/pack-objects.c:2534
#, c-format
msgid "bad index version '%s'"
msgstr "phiên bản mục lục sai “%sâ€"
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
#, c-format
msgid "option %s does not accept negative form"
msgstr "tùy chá»n %s không chấp nhận dạng thức âm"
-#: builtin/pack-objects.c:2427
+#: builtin/pack-objects.c:2561
#, c-format
msgid "unable to parse value '%s' for option %s"
msgstr "không thể phân tích giá trị “%s†cho tùy chá»n %s"
-#: builtin/pack-objects.c:2446
+#: builtin/pack-objects.c:2580
msgid "do not show progress meter"
msgstr "không hiển thị bộ đo tiến trình"
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
msgid "show progress meter"
msgstr "hiển thị bộ đo tiến trình"
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
msgid "show progress meter during object writing phase"
msgstr "hiển thị bộ đo tiến triển trong suốt pha ghi đối tượng"
-#: builtin/pack-objects.c:2453
+#: builtin/pack-objects.c:2587
msgid "similar to --all-progress when progress meter is shown"
msgstr "tương tự --all-progress khi bộ đo tiến trình được xuất hiện"
-#: builtin/pack-objects.c:2454
+#: builtin/pack-objects.c:2588
msgid "version[,offset]"
msgstr "phiên bản[,offset]"
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
msgid "write the pack index file in the specified idx format version"
msgstr "ghi tập tin bảng mục lục gói (pack) ở phiên bản định dạng idx đã cho"
-#: builtin/pack-objects.c:2458
+#: builtin/pack-objects.c:2592
msgid "maximum size of each output pack file"
msgstr "kcíh thước tối đa cho tập tin gói được tạo"
-#: builtin/pack-objects.c:2460
+#: builtin/pack-objects.c:2594
msgid "ignore borrowed objects from alternate object store"
msgstr "bỠqua các đối tượng vay mượn từ kho đối tượng thay thế"
-#: builtin/pack-objects.c:2462
+#: builtin/pack-objects.c:2596
msgid "ignore packed objects"
msgstr "bỠqua các đối tượng đóng gói"
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
msgid "limit pack window by objects"
msgstr "giới hạn cửa sổ đóng gói theo đối tượng"
-#: builtin/pack-objects.c:2466
+#: builtin/pack-objects.c:2600
msgid "limit pack window by memory in addition to object limit"
msgstr "giới hạn cửa sổ đóng gói theo bộ nhớ cộng thêm với giới hạn đối tượng"
-#: builtin/pack-objects.c:2468
+#: builtin/pack-objects.c:2602
msgid "maximum length of delta chain allowed in the resulting pack"
msgstr "độ dài tối đa của chuỗi móc xích “delta†được phép trong gói kết quả"
-#: builtin/pack-objects.c:2470
+#: builtin/pack-objects.c:2604
msgid "reuse existing deltas"
msgstr "dùng lại các delta sẵn có"
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
msgid "reuse existing objects"
msgstr "dùng lại các đối tượng sẵn có"
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
msgid "use OFS_DELTA objects"
msgstr "dùng các đối tượng OFS_DELTA"
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
msgid "use threads when searching for best delta matches"
msgstr "sử dụng các tuyến trình khi tìm kiếm cho các mẫu khớp delta tốt nhất"
-#: builtin/pack-objects.c:2478
+#: builtin/pack-objects.c:2612
msgid "do not create an empty pack output"
msgstr "không thể tạo kết xuất gói (pack) trống rỗng"
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
msgid "read revision arguments from standard input"
msgstr " Ä‘á»c tham số “revision†từ thiết bị nhập chuẩn"
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
msgid "limit the objects to those that are not yet packed"
msgstr "giới hạn các đối tượng thành những cái mà chúng vẫn chưa được đóng gói"
-#: builtin/pack-objects.c:2485
+#: builtin/pack-objects.c:2619
msgid "include objects reachable from any reference"
msgstr "bao gồm các đối tượng có thể Ä‘á»c được từ bất kỳ tham chiếu nào"
-#: builtin/pack-objects.c:2488
+#: builtin/pack-objects.c:2622
msgid "include objects referred by reflog entries"
msgstr "bao gồm các đối tượng được tham chiếu bởi các mục reflog"
-#: builtin/pack-objects.c:2491
+#: builtin/pack-objects.c:2625
msgid "output pack to stdout"
msgstr "xuất gói ra đầu ra tiêu chuẩn"
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
msgid "include tag objects that refer to objects to be packed"
msgstr "bao gồm các đối tượng tham chiếu đến các đối tượng được đóng gói"
-#: builtin/pack-objects.c:2495
+#: builtin/pack-objects.c:2629
msgid "keep unreachable objects"
msgstr "giữ lại các đối tượng không thể Ä‘á»c được"
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
msgid "time"
msgstr "thá»i-gian"
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
msgid "unpack unreachable objects newer than <time>"
msgstr ""
"xả nén (gỡ khá»i gói) các đối tượng không thể Ä‘á»c được má»›i hÆ¡n <thá»i-gian>"
-#: builtin/pack-objects.c:2500
+#: builtin/pack-objects.c:2634
msgid "create thin packs"
msgstr "tạo gói nhẹ"
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
msgid "ignore packs that have companion .keep file"
msgstr "bỠqua các gói mà nó có tập tin .keep đi kèm"
-#: builtin/pack-objects.c:2504
+#: builtin/pack-objects.c:2638
msgid "pack compression level"
msgstr "mức nén gói"
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
msgid "do not hide commits by grafts"
msgstr "không ẩn các lần chuyển giao bởi “graftsâ€"
+#: builtin/pack-objects.c:2642
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr "dùng mục lục ánh xạ nếu có thể được để nâng cao tốc độ đếm đối tượng"
+
+#: builtin/pack-objects.c:2644
+msgid "write a bitmap index together with the pack index"
+msgstr "ghi một mục lục ánh xạ cùng với mục lục gói"
+
+#: builtin/pack-objects.c:2723
+msgid "Counting objects"
+msgstr "Äang đếm các đối tượng"
+
#: builtin/pack-refs.c:6
msgid "git pack-refs [options]"
msgstr "git pack-refs [các-tùy-chá»n]"
@@ -7826,6 +7781,10 @@ msgstr "prune (cắt cụt) những tham chiếu (refs) bị mất (mặc địn
msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]"
+#: builtin/prune-packed.c:49
+msgid "Removing duplicate objects"
+msgstr "Äang gỡ các đối tượng trùng lặp"
+
#: builtin/prune.c:12
msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
msgstr "git prune [-n] [-v] [--expire <thá»i-gian>] [--] [<head>...]"
@@ -7846,15 +7805,15 @@ msgstr "các đối tượng hết hạn cÅ© hÆ¡n khoảng <thá»i gian>"
msgid "git push [<options>] [<repository> [<refspec>...]]"
msgstr "git push [<các-tùy-chá»n>] [<kho-chứa> [<refspec>...]]"
-#: builtin/push.c:86
+#: builtin/push.c:85
msgid "tag shorthand without <tag>"
msgstr "dùng tốc ký tag không có <thẻ>"
-#: builtin/push.c:96
+#: builtin/push.c:95
msgid "--delete only accepts plain target ref names"
msgstr "--delete chỉ chấp nhận các tên tham chiếu (ref) dạng thÆ°á»ng"
-#: builtin/push.c:141
+#: builtin/push.c:140
msgid ""
"\n"
"To choose either option permanently, see push.default in 'git help config'."
@@ -7863,7 +7822,7 @@ msgstr ""
"Äể chá»n má»—i tùy chá»n má»™t cách cố định, xem push.default trong “git help "
"configâ€."
-#: builtin/push.c:144
+#: builtin/push.c:143
#, c-format
msgid ""
"The upstream branch of your current branch does not match\n"
@@ -7888,7 +7847,7 @@ msgstr ""
" git push %s %s\n"
"%s"
-#: builtin/push.c:159
+#: builtin/push.c:158
#, c-format
msgid ""
"You are not currently on a branch.\n"
@@ -7903,7 +7862,7 @@ msgstr ""
"\n"
" git push %s HEAD:<tên-của-nhánh-máy-chủ>\n"
-#: builtin/push.c:173
+#: builtin/push.c:172
#, c-format
msgid ""
"The current branch %s has no upstream branch.\n"
@@ -7917,12 +7876,12 @@ msgstr ""
"\n"
" git push --set-upstream %s %s\n"
-#: builtin/push.c:181
+#: builtin/push.c:180
#, c-format
msgid "The current branch %s has multiple upstream branches, refusing to push."
msgstr "Nhánh hiện tại %s có nhiá»u nhánh thượng nguồn, từ chối push."
-#: builtin/push.c:184
+#: builtin/push.c:183
#, c-format
msgid ""
"You are pushing to remote '%s', which is not the upstream of\n"
@@ -7934,11 +7893,11 @@ msgstr ""
"nhánh hiện tại “%s†của bạn, mà không báo cho tôi biết là cái gì được push\n"
"để cập nhật nhánh máy chủ nào."
-#: builtin/push.c:207
+#: builtin/push.c:206
msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"push.default is unset; its implicit value has changed in\n"
"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
-"and maintain the current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
"\n"
" git config --global push.default matching\n"
"\n"
@@ -7949,7 +7908,7 @@ msgid ""
"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"
+"Since Git 2.0, Git defaults to the more conservative 'simple'\n"
"behavior, which only pushes the current branch to the corresponding\n"
"remote branch that 'git pull' uses to update the current branch.\n"
"\n"
@@ -7960,9 +7919,7 @@ msgid ""
msgstr ""
"biến push.default chưa được đặt; giá trị ngầm định của nó\n"
"đã được thay đổi trong Git 2.0 từ “matching†thành “simpleâ€.\n"
-"Äể không hiển thị nhắc nhở này và duy trì cách xá»­ lý hiện nay sau thay đổi "
-"mặc định,\n"
-"hãy chạy lệnh:\n"
+"Äể không hiển thị nhắc nhở này và duy trì cách xá»­ lý cÅ©, hãy chạy lệnh:\n"
"\n"
" git config --global push.default matching\n"
"\n"
@@ -7971,7 +7928,7 @@ msgstr ""
" git config --global push.default simple\n"
"\n"
"Khi push.default được đặt thành “matchingâ€, git sẽ đẩy các nhánh ná»™i bá»™\n"
-"lên các nhánh trên máy chủ, cái mà có cùng tên.\n"
+"lên các nhánh trên máy chủ, cái mà đã sẵn có và cùng tên.\n"
"\n"
"Trong 2.0, Git sẽ mặc định duy trì các ứng xá»­ “simpleâ€,\n"
"cái này chỉ đẩy những nhánh hiện hành lên các nhánh tương ứng\n"
@@ -7982,57 +7939,40 @@ msgstr ""
"tá»±\n"
"“current†thay vì “simple†nếu bạn thỉnh thoảng phải sử dụng bản Git cũ)"
-#: builtin/push.c:274
+#: builtin/push.c:273
msgid ""
"You didn't specify any refspecs to push, and push.default is \"nothing\"."
msgstr ""
"Bạn đã không chỉ ra một refspecs nào để push, và push.default là \"không là "
"gì cả\"."
-#: builtin/push.c:281
+#: builtin/push.c:280
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 ""
-"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau bộ\n"
-"phận tương ứng của máy chủ. Hòa trộn với các thay đổi từ máy chủ (v.d. “git "
-"pull...â€)\n"
-"trước khi lại push lần nữa.\n"
-"Xem “Note about fast-forwards†từ lệnh “git push --help†để có thông tin chi "
+"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh hiện tại của bạn nằm đằng\n"
+"sau bộ phận tương ứng của máy chủ. Hòa trộn với các thay đổi từ máy chủ\n"
+"(v.d. \"git pull ...\") trước khi đẩy lên lần nữa.\n"
+"Xem “Note about fast-forwards†trong “git push --help†để có thông tin chi "
"tiết."
-#: 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 ""
-"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau bộ\n"
-"phận tương ứng của máy chủ. Nếu bạn không có ý định push nhánh đó, bạn có lẽ "
-"muốn\n"
-"chỉ định các nhánh để push hoặt là đặt nội dung cho biến cấu hình “push."
-"defaultâ€\n"
-"thành “simpleâ€, “current†hoặc “upstream†để chỉ push nhánh hiện hành mà "
-"thôi."
-
-#: builtin/push.c:293
+#: builtin/push.c:286
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 ""
-"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau bộ\n"
-"phận tương ứng của máy chủ. Checkou nhánh này và hòa trộn với các thay đổi "
-"từ máy chủ\n"
-"(v.d. “git pull ...â€) trÆ°á»›c khi lại push lần nữa.\n"
-"Xem “Note about fast-forwards†từ lệnh “git push --help†để có thông tin chi "
+"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh đã push nằm đằng sau bộ\n"
+"phận tương ứng của máy chủ. Checkou nhánh này và hòa trộn với các thay đổi\n"
+"từ máy chủ (v.d. “git pull ...â€) trÆ°á»›c khi lại push lần nữa.\n"
+"Xem “Note about fast-forwards†trong “git push --help†để có thông tin chi "
"tiết."
-#: builtin/push.c:299
+#: builtin/push.c:292
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"
@@ -8043,15 +7983,15 @@ msgstr ""
"Việc cập nhật bị từ chối bởi vì máy chủ có chứa công việc mà bạn không\n"
"có ở máy ná»™i bá»™ của mình. Lá»—i này thÆ°á»ng có nguyên nhân bởi kho khác đẩy\n"
"dữ liệu lên cùng một tham chiếu. Bạn có lẽ muốn hòa trộn với các thay đổi\n"
-"từ máy chủ(v.d. “git pull...â€) trÆ°á»›c khi lại push lần nữa.\n"
-"Xem “Note about fast-forwards†từ lệnh “git push --help†để có thông tin chi "
+"từ máy chủ (v.d. “git pull...â€) trÆ°á»›c khi lại push lần nữa.\n"
+"Xem “Note about fast-forwards†trong “git push --help†để có thông tin chi "
"tiết."
-#: builtin/push.c:306
+#: builtin/push.c:299
msgid "Updates were rejected because the tag already exists in the remote."
msgstr "Việc cập nhật bị từ chối bởi vì thẻ đã sẵn có từ trước trên máy chủ."
-#: builtin/push.c:309
+#: builtin/push.c:302
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"
@@ -8059,26 +7999,26 @@ msgid ""
msgstr ""
"Không thể cập nhật một tham chiếu trên máy chủ mà nó chỉ đến đối tượng "
"không\n"
-"phải chuyển giao, hoặc cập nhật một tham chiếu máy chủ để nó chỉ đến đối "
-"tượng\n"
+"phải là lần chuyển giao, hoặc cập nhật một tham chiếu máy chủ để nó chỉ đến "
+"đối tượng\n"
"không phải chuyển giao, mà không sá»­ dụng tùy chá»n “--forceâ€.\n"
-#: builtin/push.c:375
+#: builtin/push.c:361
#, c-format
msgid "Pushing to %s\n"
-msgstr "Äang push (đẩy) lên %s\n"
+msgstr "Äang đẩy lên %s\n"
-#: builtin/push.c:379
+#: builtin/push.c:365
#, c-format
msgid "failed to push some refs to '%s'"
-msgstr "gặp lá»—i khi push (đẩy lên) má»™t số tham chiếu (ref) đến “%sâ€"
+msgstr "gặp lá»—i khi đẩy tá»›i má»™t số tham chiếu (ref) đến “%sâ€"
-#: builtin/push.c:412
+#: builtin/push.c:395
#, c-format
msgid "bad repository '%s'"
msgstr "repository (kho) sai “%sâ€"
-#: builtin/push.c:413
+#: builtin/push.c:396
msgid ""
"No configured push destination.\n"
"Either specify the URL from the command-line or configure a remote "
@@ -8090,7 +8030,7 @@ msgid ""
"\n"
" git push <name>\n"
msgstr ""
-"Chưa cấu hình đích để push (đẩy lên).\n"
+"Chưa cấu hình đích để đẩy lên.\n"
"Hoặc là chỉ ra URL từ dòng lệnh hoặc là cấu hình một kho máy chủ sử dụng\n"
"\n"
" git remote add <tên> <url>\n"
@@ -8099,95 +8039,95 @@ msgstr ""
"\n"
" git push <tên>\n"
-#: builtin/push.c:428
+#: builtin/push.c:411
msgid "--all and --tags are incompatible"
msgstr "--all và --tags xung khắc nhau"
-#: builtin/push.c:429
+#: builtin/push.c:412
msgid "--all can't be combined with refspecs"
msgstr "--all không thể được tổ hợp cùng vá»›i đặc tả Ä‘Æ°á»ng dẫn"
-#: builtin/push.c:434
+#: builtin/push.c:417
msgid "--mirror and --tags are incompatible"
msgstr "--mirror và --tags xung khắc nhau"
-#: builtin/push.c:435
+#: builtin/push.c:418
msgid "--mirror can't be combined with refspecs"
msgstr "--mirror không thể được tổ hợp cùng vá»›i đặc tả Ä‘Æ°á»ng dẫn"
-#: builtin/push.c:440
+#: builtin/push.c:423
msgid "--all and --mirror are incompatible"
msgstr "--all và --mirror xung khắc nhau"
-#: builtin/push.c:500
+#: builtin/push.c:483
msgid "repository"
msgstr "kho"
-#: builtin/push.c:501
+#: builtin/push.c:484
msgid "push all refs"
-msgstr "push tất cả các tham chiếu"
+msgstr "đẩy tất cả các tham chiếu"
-#: builtin/push.c:502
+#: builtin/push.c:485
msgid "mirror all refs"
msgstr "mirror tất cả các tham chiếu"
-#: builtin/push.c:504
+#: builtin/push.c:487
msgid "delete refs"
msgstr "xóa các tham chiếu"
-#: builtin/push.c:505
+#: builtin/push.c:488
msgid "push tags (can't be used with --all or --mirror)"
-msgstr "push các thẻ (không dùng cùng với --all hay --mirror)"
+msgstr "đẩy các thẻ (không dùng cùng với --all hay --mirror)"
-#: builtin/push.c:508
+#: builtin/push.c:491
msgid "force updates"
msgstr "ép buộc cập nhật"
-#: builtin/push.c:510
+#: builtin/push.c:493
msgid "refname>:<expect"
msgstr "tên-tham-chiếu>:<cần"
-#: builtin/push.c:511
+#: builtin/push.c:494
msgid "require old value of ref to be at this value"
msgstr "yêu cầu giá-trị cũ của tham chiếu thì là giá-trị này"
-#: builtin/push.c:513
+#: builtin/push.c:496
msgid "check"
msgstr "kiểm tra"
-#: builtin/push.c:514
+#: builtin/push.c:497
msgid "control recursive pushing of submodules"
msgstr "Ä‘iá»u khiển việc đẩy lên (push) đệ qui của mô-Ä‘un-con"
-#: builtin/push.c:516
+#: builtin/push.c:499
msgid "use thin pack"
msgstr "tạo gói nhẹ"
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
msgid "receive pack program"
msgstr "chương trình nhận gói"
-#: builtin/push.c:519
+#: builtin/push.c:502
msgid "set upstream for git pull/status"
msgstr "đặt thượng nguồn cho git pull/status"
-#: builtin/push.c:522
+#: builtin/push.c:505
msgid "prune locally removed refs"
msgstr "xén tỉa những tham chiếu (refs) bị gỡ bá»"
-#: builtin/push.c:524
+#: builtin/push.c:507
msgid "bypass pre-push hook"
-msgstr "vòng qua móc tiá»n-đẩy “pre-pushâ€"
+msgstr "vòng qua móc tiá»n-đẩy (pre-push)"
-#: builtin/push.c:525
+#: builtin/push.c:508
msgid "push missing but relevant tags"
msgstr "push phần bị thiếu nhưng nhưng các thẻ lại thích hợp"
-#: builtin/push.c:535
+#: builtin/push.c:518
msgid "--delete is incompatible with --all, --mirror and --tags"
msgstr "--delete là xung khắc vá»›i các tùy chá»n --all, --mirror và --tags"
-#: builtin/push.c:537
+#: builtin/push.c:520
msgid "--delete doesn't make sense without any refs"
msgstr "--delete không hợp lý nếu không có bất kỳ tham chiếu (refs) nào"
@@ -8537,7 +8477,7 @@ msgstr " ???"
#: builtin/remote.c:986
#, c-format
msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
-msgstr "branch.%s.merge không hợp lệ; không thể rebase vỠphía > 1 nhánh"
+msgstr "branch.%s.merge không hợp lệ; không thể cải tổ vỠphía > 1 nhánh"
#: builtin/remote.c:993
#, c-format
@@ -8623,7 +8563,7 @@ msgstr "(không có URL)"
#: builtin/remote.c:1182 builtin/remote.c:1184
#, c-format
msgid " Push URL: %s"
-msgstr " URL để đẩy lên (push): %s"
+msgstr " URL để đẩy lên: %s"
#: builtin/remote.c:1186 builtin/remote.c:1188 builtin/remote.c:1190
#, c-format
@@ -8776,67 +8716,75 @@ msgstr "Sẽ không xóa những địa chỉ URL không-push"
msgid "be verbose; must be placed before a subcommand"
msgstr "chi tiết; phải được đặt trước một lệnh-con"
-#: builtin/repack.c:15
+#: builtin/repack.c:16
msgid "git repack [options]"
msgstr "git repack [các-tùy-chá»n]"
-#: builtin/repack.c:143
+#: builtin/repack.c:156
msgid "pack everything in a single pack"
msgstr "đóng gói má»i thứ trong má»™t gói Ä‘Æ¡n"
-#: builtin/repack.c:145
+#: builtin/repack.c:158
msgid "same as -a, and turn unreachable objects loose"
msgstr "giống vá»›i -a, và chỉnh sá»­a các đối tượng không Ä‘á»c được thiếu sót"
-#: builtin/repack.c:148
+#: builtin/repack.c:161
msgid "remove redundant packs, and run git-prune-packed"
msgstr "xóa bỠcác gói dư thừa, và chạy git-prune-packed"
-#: builtin/repack.c:150
+#: builtin/repack.c:163
msgid "pass --no-reuse-delta to git-pack-objects"
msgstr "chuyển --no-reuse-delta cho git-pack-objects"
-#: builtin/repack.c:152
+#: builtin/repack.c:165
msgid "pass --no-reuse-object to git-pack-objects"
msgstr "chuyển --no-reuse-object cho git-pack-objects"
-#: builtin/repack.c:154
+#: builtin/repack.c:167
msgid "do not run git-update-server-info"
msgstr "không chạy git-update-server-info"
-#: builtin/repack.c:157
+#: builtin/repack.c:170
msgid "pass --local to git-pack-objects"
msgstr "chuyển --local cho git-pack-objects"
-#: builtin/repack.c:158
+#: builtin/repack.c:172
+msgid "write bitmap index"
+msgstr "ghi mục lục ánh xạ"
+
+#: builtin/repack.c:173
msgid "approxidate"
msgstr "ngày ước tính"
-#: builtin/repack.c:159
+#: builtin/repack.c:174
msgid "with -A, do not loosen objects older than this"
msgstr "vá»›i -A, các đối tượng cÅ© hÆ¡n khoảng thá»i gian này thì không bị mất"
-#: builtin/repack.c:161
+#: builtin/repack.c:176
msgid "size of the window used for delta compression"
msgstr "kích thÆ°á»›c cá»­a sổ được dùng cho nén “deltaâ€"
-#: builtin/repack.c:162 builtin/repack.c:166
+#: builtin/repack.c:177 builtin/repack.c:181
msgid "bytes"
msgstr "byte"
-#: builtin/repack.c:163
+#: builtin/repack.c:178
msgid "same as the above, but limit memory size instead of entries count"
msgstr "giống như trên, nhưng giới hạn kích thước bộ nhớ hay vì số lượng"
-#: builtin/repack.c:165
+#: builtin/repack.c:180
msgid "limits the maximum delta depth"
msgstr "giá»›i hạn Ä‘á»™ sâu tối Ä‘a của “deltaâ€"
-#: builtin/repack.c:167
+#: builtin/repack.c:182
msgid "maximum size of each packfile"
msgstr "kcíh thước tối đa cho từng tập tin gói"
-#: builtin/repack.c:343
+#: builtin/repack.c:184
+msgid "repack objects in packs marked with .keep"
+msgstr "đóng gói lại các đối tượng trong các gói đã đánh dấu bằng .keep"
+
+#: builtin/repack.c:371
#, c-format
msgid "removing '%s' failed"
msgstr "gặp lá»—i khi xóa bỠ“%sâ€"
@@ -8929,76 +8877,84 @@ msgstr "Gặp lỗi khi tìm cây của %s."
msgid "HEAD is now at %s"
msgstr "HEAD hiện giỠtại %s"
-#: builtin/reset.c:172
+#: builtin/reset.c:182
#, c-format
msgid "Cannot do a %s reset in the middle of a merge."
msgstr "Không thể thực hiện một %s reset ở giữa của quá trình hòa trộn."
-#: builtin/reset.c:262
+#: builtin/reset.c:273
msgid "be quiet, only report errors"
msgstr "làm việc ở chế độ im lặng, chỉ hiển thị khi có lỗi"
-#: builtin/reset.c:264
+#: builtin/reset.c:275
msgid "reset HEAD and index"
msgstr "đặt lại (reset) HEAD và bảng mục lục"
-#: builtin/reset.c:265
+#: builtin/reset.c:276
msgid "reset only HEAD"
msgstr "chỉ đặt lại (reset) HEAD"
-#: builtin/reset.c:267 builtin/reset.c:269
+#: builtin/reset.c:278 builtin/reset.c:280
msgid "reset HEAD, index and working tree"
msgstr "đặt lại HEAD, bảng mục lục và cây làm việc"
-#: builtin/reset.c:271
+#: builtin/reset.c:282
msgid "reset HEAD but keep local changes"
msgstr "đặt lại HEAD nhưng giữ lại các thay đổi nội bộ"
-#: builtin/reset.c:289
+#: builtin/reset.c:285
+msgid "record only the fact that removed paths will be added later"
+msgstr "chỉ ghi lại những Ä‘Æ°á»ng dẫn thá»±c sá»± sẽ được thêm vào sau này"
+
+#: builtin/reset.c:302
#, c-format
msgid "Failed to resolve '%s' as a valid revision."
msgstr "Gặp lỗi khi phân giải “%s†như là điểm xét duyệt hợp lệ."
-#: builtin/reset.c:292 builtin/reset.c:300
+#: builtin/reset.c:305 builtin/reset.c:313
#, c-format
msgid "Could not parse object '%s'."
msgstr "không thể phân tích đối tượng “%sâ€."
-#: builtin/reset.c:297
+#: builtin/reset.c:310
#, c-format
msgid "Failed to resolve '%s' as a valid tree."
msgstr "Gặp lỗi khi phân giải “%s†như là một cây (tree) hợp lệ."
-#: builtin/reset.c:306
+#: builtin/reset.c:319
msgid "--patch is incompatible with --{hard,mixed,soft}"
msgstr "--patch xung khắc với --{hard,mixed,soft}"
-#: builtin/reset.c:315
+#: builtin/reset.c:328
msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
msgstr ""
"--mixed vá»›i các Ä‘Æ°á»ng dẫn không còn dùng nữa; hãy thay thế bằng lệnh “git "
"reset -- <Ä‘Æ°á»ng_dẫn>â€."
-#: builtin/reset.c:317
+#: builtin/reset.c:330
#, c-format
msgid "Cannot do %s reset with paths."
msgstr "Không thể thá»±c hiện lệnh %s reset vá»›i các Ä‘Æ°á»ng dẫn."
-#: builtin/reset.c:327
+#: builtin/reset.c:340
#, c-format
msgid "%s reset is not allowed in a bare repository"
msgstr "%s reset không được phép trên kho thuần"
#: builtin/reset.c:344
+msgid "-N can only be used with --mixed"
+msgstr "-N chỉ được dùng khi có --mixed"
+
+#: builtin/reset.c:361
msgid "Unstaged changes after reset:"
msgstr "Những thay đổi được Ä‘Æ°a ra khá»i bệ phóng sau khi reset:"
-#: builtin/reset.c:350
+#: builtin/reset.c:367
#, c-format
msgid "Could not reset index file to revision '%s'."
msgstr "Không thể đặt lại (reset) bảng mục lục thành Ä‘iểm xét duyệt “%sâ€."
-#: builtin/reset.c:355
+#: builtin/reset.c:372
msgid "Could not write new index file."
msgstr "Không thể ghi tập tin lưu bảng mục lục mới."
@@ -9018,7 +8974,7 @@ msgstr "dừng phân tích sau đối số đầu tiên không có tùy chá»n"
msgid "output in stuck long form"
msgstr "kết xuất trong định dạng gậy dài"
-#: builtin/rev-parse.c:486
+#: builtin/rev-parse.c:497
msgid ""
"git rev-parse --parseopt [options] -- [<args>...]\n"
" or: git rev-parse --sq-quote [<arg>...]\n"
@@ -9089,35 +9045,35 @@ msgstr "tùy chá»n"
msgid "option for merge strategy"
msgstr "tùy chá»n cho chiến lược hòa trá»™n"
-#: builtin/revert.c:102
+#: builtin/revert.c:104
msgid "append commit name"
msgstr "nối thêm tên lần chuyển giao"
-#: builtin/revert.c:103
+#: builtin/revert.c:105
msgid "allow fast-forward"
msgstr "cho phép fast-forward"
-#: builtin/revert.c:104
+#: builtin/revert.c:106
msgid "preserve initially empty commits"
msgstr "cấm khởi tạo lần chuyển giao trống rỗng"
-#: builtin/revert.c:105
+#: builtin/revert.c:107
msgid "allow commits with empty messages"
msgstr "chấp nhận chuyển giao mà không ghi chú gì"
-#: builtin/revert.c:106
+#: builtin/revert.c:108
msgid "keep redundant, empty commits"
msgstr "giữ lại các lần chuyển giao dư thừa, rỗng"
-#: builtin/revert.c:110
+#: builtin/revert.c:112
msgid "program error"
msgstr "lỗi chương trình"
-#: builtin/revert.c:195
+#: builtin/revert.c:197
msgid "revert failed"
msgstr "revert gặp lỗi"
-#: builtin/revert.c:210
+#: builtin/revert.c:212
msgid "cherry-pick failed"
msgstr "cherry-pick gặp lỗi"
@@ -9331,11 +9287,11 @@ msgstr "hiển thị <n> các mục “ref-log†gần nhất kể từ ná»n (
#: builtin/show-ref.c:10
msgid ""
-"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--"
-"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "
+"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash"
+"[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [pattern*] "
msgstr ""
-"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--"
-"hash[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [mẫu*] "
+"git show-ref [-q|--quiet] [--verify] [--head] [-d|--dereference] [-s|--hash"
+"[=<n>]] [--abbrev[=<n>]] [--tags] [--heads] [--] [mẫu*] "
#: builtin/show-ref.c:11
msgid "git show-ref --exclude-existing[=pattern] < ref-list"
@@ -9399,11 +9355,11 @@ msgstr "xóa tham chiếu (ref) tượng trưng"
msgid "shorten ref output"
msgstr "làm ngắn kết xuất ref (tham chiếu)"
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
msgid "reason"
msgstr "lý do"
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
msgid "reason of the update"
msgstr "lý do cập nhật"
@@ -9429,32 +9385,32 @@ msgstr ""
msgid "git tag -v <tagname>..."
msgstr "git tag -v <tên-thẻ>..."
-#: builtin/tag.c:60
+#: builtin/tag.c:67
#, c-format
msgid "malformed object at '%s'"
msgstr "đối tượng dị hình tại “%sâ€"
-#: builtin/tag.c:207
+#: builtin/tag.c:239
#, c-format
msgid "tag name too long: %.*s..."
msgstr "tên thẻ quá dài: %.*s..."
-#: builtin/tag.c:212
+#: builtin/tag.c:244
#, c-format
msgid "tag '%s' not found."
msgstr "không tìm thấy tìm thấy thẻ “%sâ€."
-#: builtin/tag.c:227
+#: builtin/tag.c:259
#, c-format
msgid "Deleted tag '%s' (was %s)\n"
msgstr "Thẻ đã bị xóa “%s†(trước là %s)\n"
-#: builtin/tag.c:239
+#: builtin/tag.c:271
#, c-format
msgid "could not verify the tag '%s'"
msgstr "không thể thẩm tra thẻ “%sâ€"
-#: builtin/tag.c:249
+#: builtin/tag.c:281
#, c-format
msgid ""
"\n"
@@ -9465,7 +9421,7 @@ msgstr ""
"Viết các ghi chú cho (thẻ) tag\n"
"Những dòng được bắt đầu bằng “%c†sẽ được bỠqua.\n"
-#: builtin/tag.c:253
+#: builtin/tag.c:285
#, c-format
msgid ""
"\n"
@@ -9478,258 +9434,275 @@ msgstr ""
"Những dòng được bắt đầu bằng “%c†sẽ được bỠqua; bạn có thể xóa chúng đi "
"nếu muốn.\n"
-#: builtin/tag.c:292
+#: builtin/tag.c:324
msgid "unable to sign the tag"
msgstr "không thể ký thẻ"
-#: builtin/tag.c:294
+#: builtin/tag.c:326
msgid "unable to write tag file"
msgstr "không thể ghi vào tập tin lưu thẻ"
-#: builtin/tag.c:319
+#: builtin/tag.c:351
msgid "bad object type."
msgstr "kiểu đối tượng sai."
-#: builtin/tag.c:332
+#: builtin/tag.c:364
msgid "tag header too big."
msgstr "đầu thẻ (tag) quá lớn."
-#: builtin/tag.c:368
+#: builtin/tag.c:400
msgid "no tag message?"
msgstr "không có chú thích gì cho cho thẻ à?"
-#: builtin/tag.c:374
+#: builtin/tag.c:406
#, c-format
msgid "The tag message has been left in %s\n"
msgstr "Nội dung ghi chú còn lại %s\n"
-#: builtin/tag.c:423
+#: builtin/tag.c:455
msgid "switch 'points-at' requires an object"
msgstr "chuyển đến “points-at†yêu cần một đối tượng"
-#: builtin/tag.c:425
+#: builtin/tag.c:457
#, c-format
msgid "malformed object name '%s'"
msgstr "tên đối tượng dị hình “%sâ€"
-#: builtin/tag.c:445
+#: builtin/tag.c:480
+#, c-format
+msgid "unsupported sort specification %s"
+msgstr "không hỗ trợ đặc tả sắp xếp %s"
+
+#: builtin/tag.c:500
msgid "list tag names"
msgstr "chỉ liệt kê tên các thẻ"
-#: builtin/tag.c:447
+#: builtin/tag.c:502
msgid "print <n> lines of each tag message"
msgstr "hiển thị <n> dòng cho mỗi ghi chú"
-#: builtin/tag.c:449
+#: builtin/tag.c:504
msgid "delete tags"
msgstr "xóa thẻ"
-#: builtin/tag.c:450
+#: builtin/tag.c:505
msgid "verify tags"
msgstr "thẩm tra thẻ"
-#: builtin/tag.c:452
+#: builtin/tag.c:507
msgid "Tag creation options"
msgstr "Tùy chá»n tạo tag"
-#: builtin/tag.c:454
+#: builtin/tag.c:509
msgid "annotated tag, needs a message"
msgstr "để chú giải cho thẻ, cần má»™t lá»i ghi chú"
-#: builtin/tag.c:456
+#: builtin/tag.c:511
msgid "tag message"
msgstr "tin nhắn cho thẻ (tag)"
-#: builtin/tag.c:458
+#: builtin/tag.c:513
msgid "annotated and GPG-signed tag"
msgstr "thẻ chú giải và ký kiểu GPG"
-#: builtin/tag.c:462
+#: builtin/tag.c:517
msgid "use another key to sign the tag"
msgstr "dùng kháo khác để ký thẻ"
-#: builtin/tag.c:463
+#: builtin/tag.c:518
msgid "replace the tag if exists"
msgstr "thay thế nếu tag đó đã có trước"
-#: builtin/tag.c:464
+#: builtin/tag.c:519
msgid "show tag list in columns"
msgstr "hiển thị danh sách thẻ trong các cột"
-#: builtin/tag.c:466
+#: builtin/tag.c:521
+msgid "sort tags"
+msgstr "sắp xếp các thẻ"
+
+#: builtin/tag.c:525
msgid "Tag listing options"
msgstr "Các tùy chá»n liệt kê thẻ"
-#: builtin/tag.c:469
+#: builtin/tag.c:528 builtin/tag.c:534
msgid "print only tags that contain the commit"
msgstr "chỉ hiển thị những nhánh mà nó chứa lần chuyển giao"
-#: builtin/tag.c:475
+#: builtin/tag.c:540
msgid "print only tags of the object"
msgstr "chỉ hiển thị các thẻ của đối tượng"
-#: builtin/tag.c:501
+#: builtin/tag.c:566
msgid "--column and -n are incompatible"
msgstr "--column và -n xung khắc nhau"
-#: builtin/tag.c:518
+#: builtin/tag.c:578
+msgid "--sort and -n are incompatible"
+msgstr "--sort và -n xung khắc nhau"
+
+#: builtin/tag.c:585
msgid "-n option is only allowed with -l."
msgstr "tùy chá»n -n chỉ cho phép dùng vá»›i -l."
-#: builtin/tag.c:520
+#: builtin/tag.c:587
msgid "--contains option is only allowed with -l."
msgstr "tùy chá»n --contains chỉ cho phép dùng vá»›i -l."
-#: builtin/tag.c:522
+#: builtin/tag.c:589
msgid "--points-at option is only allowed with -l."
msgstr "tùy chá»n --points-at chỉ cho phép dùng vá»›i -l."
-#: builtin/tag.c:530
+#: builtin/tag.c:597
msgid "only one -F or -m option is allowed."
msgstr "chỉ có má»™t tùy chá»n -F hoặc -m là được phép."
-#: builtin/tag.c:550
+#: builtin/tag.c:617
msgid "too many params"
msgstr "quá nhiá»u đối số"
-#: builtin/tag.c:556
+#: builtin/tag.c:623
#, c-format
msgid "'%s' is not a valid tag name."
msgstr "“%s†không phải thẻ hợp lệ."
-#: builtin/tag.c:561
+#: builtin/tag.c:628
#, c-format
msgid "tag '%s' already exists"
msgstr "Thẻ “%s†đã tồn tại rồi"
-#: builtin/tag.c:579
+#: builtin/tag.c:646
#, c-format
msgid "%s: cannot lock the ref"
msgstr "%s: không thể khóa ref (tham chiếu)"
-#: builtin/tag.c:581
+#: builtin/tag.c:648
#, c-format
msgid "%s: cannot update the ref"
msgstr "%s: không thể cập nhật ref (tham chiếu)"
-#: builtin/tag.c:583
+#: builtin/tag.c:650
#, c-format
msgid "Updated tag '%s' (was %s)\n"
msgstr "Äã cập nhật thẻ “%s†(trÆ°á»›c là %s)\n"
-#: builtin/update-index.c:402
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr "Äang giải nén các đối tượng"
+
+#: builtin/update-index.c:399
msgid "git update-index [options] [--] [<file>...]"
msgstr "git update-index [các-tùy-chá»n] [<tập-tin>...]"
-#: builtin/update-index.c:720
+#: builtin/update-index.c:748
msgid "continue refresh even when index needs update"
msgstr "tiếp tục làm mới ngay cả khi bảng mục lục cần được cập nhật"
-#: builtin/update-index.c:723
+#: builtin/update-index.c:751
msgid "refresh: ignore submodules"
msgstr "refresh: lỠđi mô-đun-con"
-#: builtin/update-index.c:726
+#: builtin/update-index.c:754
msgid "do not ignore new files"
msgstr "không bỠqua các tập tin mới tạo"
-#: builtin/update-index.c:728
+#: builtin/update-index.c:756
msgid "let files replace directories and vice-versa"
msgstr "để các tập tin thay thế các thÆ° mục và “vice-versaâ€"
-#: builtin/update-index.c:730
+#: builtin/update-index.c:758
msgid "notice files missing from worktree"
msgstr "thông báo các tập-tin thiếu trong thư-mục làm việc"
-#: builtin/update-index.c:732
+#: builtin/update-index.c:760
msgid "refresh even if index contains unmerged entries"
msgstr ""
"làm tươi mới thậm chí khi bảng mục lục chứa các mục tin chưa được hòa trộn"
-#: builtin/update-index.c:735
+#: builtin/update-index.c:763
msgid "refresh stat information"
msgstr "lấy lại thông tin thống kê"
-#: builtin/update-index.c:739
+#: builtin/update-index.c:767
msgid "like --refresh, but ignore assume-unchanged setting"
msgstr "giống --refresh, nhÆ°ng bá» qua các cài đặt “assume-unchangedâ€"
-#: builtin/update-index.c:743
-msgid "<mode> <object> <path>"
-msgstr "<mode> <đối tượng> <Ä‘Æ°á»ng dẫn>"
+#: builtin/update-index.c:771
+msgid "<mode>,<object>,<path>"
+msgstr "<chế_Ä‘á»™>,<đối_tượng>,<Ä‘Æ°á»ng_dẫn>"
-#: builtin/update-index.c:744
+#: builtin/update-index.c:772
msgid "add the specified entry to the index"
msgstr "thêm các tập tin đã chỉ ra vào bảng mục lục"
-#: builtin/update-index.c:748
+#: builtin/update-index.c:776
msgid "(+/-)x"
msgstr "(+/-)x"
-#: builtin/update-index.c:749
+#: builtin/update-index.c:777
msgid "override the executable bit of the listed files"
msgstr "ghi đè lên bít thi hành của các tập tin được liệt kê"
-#: builtin/update-index.c:753
+#: builtin/update-index.c:781
msgid "mark files as \"not changing\""
msgstr "Äánh dấu các tập tin là \"không thay đổi\""
-#: builtin/update-index.c:756
+#: builtin/update-index.c:784
msgid "clear assumed-unchanged bit"
msgstr "xóa bít assumed-unchanged"
-#: builtin/update-index.c:759
+#: builtin/update-index.c:787
msgid "mark files as \"index-only\""
msgstr "đánh dấu các tập tin là “chỉ-Ä‘á»câ€"
-#: builtin/update-index.c:762
+#: builtin/update-index.c:790
msgid "clear skip-worktree bit"
msgstr "xóa bít skip-worktree"
-#: builtin/update-index.c:765
+#: builtin/update-index.c:793
msgid "add to index only; do not add content to object database"
msgstr ""
"chỉ thêm vào bảng mục lục; không thêm nội dung vào cơ sở dữ liệu đối tượng"
-#: builtin/update-index.c:767
+#: builtin/update-index.c:795
msgid "remove named paths even if present in worktree"
msgstr ""
"gỡ bá» các Ä‘Æ°á»ng dẫn được đặt tên thậm chí cả khi nó hiện diện trong thÆ° mục "
"làm việc"
-#: builtin/update-index.c:769
+#: builtin/update-index.c:797
msgid "with --stdin: input lines are terminated by null bytes"
msgstr "vá»›i tùy chá»n --stdin: các dòng đầu vào được chấm dứt bởi ký tá»± null"
-#: builtin/update-index.c:771
+#: builtin/update-index.c:799
msgid "read list of paths to be updated from standard input"
msgstr "Ä‘á»c danh sách Ä‘Æ°á»ng dẫn cần cập nhật từ đầu vào tiêu chuẩn"
-#: builtin/update-index.c:775
+#: builtin/update-index.c:803
msgid "add entries from standard input to the index"
msgstr "không thể Ä‘á»c các mục từ đầu vào tiêu chuẩn vào bảng mục lục"
-#: builtin/update-index.c:779
+#: builtin/update-index.c:807
msgid "repopulate stages #2 and #3 for the listed paths"
msgstr "phục hồi các trạng thái #2 và #3 cho các Ä‘Æ°á»ng dẫn được liệt kê"
-#: builtin/update-index.c:783
+#: builtin/update-index.c:811
msgid "only update entries that differ from HEAD"
msgstr "chỉ cập nhật các mục tin mà nó khác biệt so với HEAD"
-#: builtin/update-index.c:787
+#: builtin/update-index.c:815
msgid "ignore files missing from worktree"
msgstr "bỠqua các tập-tin thiếu trong thư-mục làm việc"
-#: builtin/update-index.c:790
+#: builtin/update-index.c:818
msgid "report actions to standard output"
msgstr "báo cáo các thao tác ra thiết bị xuất chuẩn"
-#: builtin/update-index.c:792
+#: builtin/update-index.c:820
msgid "(for porcelains) forget saved unresolved conflicts"
msgstr "(cho “porcelainsâ€) quên các xung Ä‘á»™t chÆ°a được giải quyết đã ghi"
-#: builtin/update-index.c:796
+#: builtin/update-index.c:824
msgid "write index in this format"
msgstr "ghi mục lục ở định dạng này"
@@ -9745,19 +9718,19 @@ msgstr "git update-ref [các-tùy-chá»n] <refname> <biến-má»›i> [<biến-c
msgid "git update-ref [options] --stdin [-z]"
msgstr "git update-ref [các-tùy-chá»n] --stdin [-z]"
-#: builtin/update-ref.c:255
+#: builtin/update-ref.c:256
msgid "delete the reference"
msgstr "xóa tham chiếu"
-#: builtin/update-ref.c:257
+#: builtin/update-ref.c:258
msgid "update <refname> not the one it points to"
msgstr "cập nhật <tên-tham-chiếu> không phải cái nó chỉ tới"
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:259
msgid "stdin has NUL-terminated arguments"
msgstr "đầu vào tiêu chuẩn có các đối số được chấm dứt bởi NUL"
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:260
msgid "read updates from stdin"
msgstr "Ä‘á»c cập nhật từ đầu vào tiêu chuẩn"
@@ -9815,23 +9788,23 @@ msgstr ""
"hÆ°á»›ng dẫn vá» khái niệm. Xem “git help <lệnh>†hay “git help <khái-niệm>â€\n"
"để xem các đặc tả cho lệnh hay khái niệm cụ thể."
-#: parse-options.h:146
-msgid "expiry date"
+#: parse-options.h:143
+msgid "expiry-date"
msgstr "ngày hết hạn"
-#: parse-options.h:161
+#: parse-options.h:158
msgid "no-op (backward compatibility)"
msgstr "no-op (tương thích ngược)"
-#: parse-options.h:235
+#: parse-options.h:232
msgid "be more verbose"
msgstr "chi tiết hơn nữa"
-#: parse-options.h:237
+#: parse-options.h:234
msgid "be more quiet"
msgstr "im lặng hơn nữa"
-#: parse-options.h:243
+#: parse-options.h:240
msgid "use <n> digits to display SHA-1s"
msgstr "sử dụng <n> chữ số để hiển thị SHA-1s"
@@ -9923,11 +9896,11 @@ msgstr "Hiển thị trạng thái cây làm việc"
msgid "Create, list, delete or verify a tag object signed with GPG"
msgstr "Tạo, liệt kê, xóa hay xác thực một đối tượng thẻ được ký bằng GPG"
-#: git-am.sh:50
+#: git-am.sh:52
msgid "You need to set your committer info first"
msgstr "Bạn cần đặt thông tin vá» ngÆ°á»i chuyển giao mã nguồn trÆ°á»›c đã"
-#: git-am.sh:95
+#: git-am.sh:97
msgid ""
"You seem to have moved HEAD since the last 'am' failure.\n"
"Not rewinding to ORIG_HEAD"
@@ -9935,7 +9908,7 @@ msgstr ""
"Bạn có lẽ đã có HEAD đã bị di chuyển đi kể từ lần “am†thất bại cuối cùng.\n"
"Không thể chuyển tới ORIG_HEAD"
-#: git-am.sh:105
+#: git-am.sh:107
#, sh-format
msgid ""
"When you have resolved this problem, run \"$cmdline --continue\".\n"
@@ -9948,20 +9921,20 @@ msgstr ""
"Äể phục hồi lại thành nhánh nguyên thủy và dừng việc vá lại thì chạy "
"\"$cmdline --abort\"."
-#: git-am.sh:121
+#: git-am.sh:123
msgid "Cannot fall back to three-way merge."
msgstr "Äang trở lại để hòa trá»™n kiểu “three-wayâ€."
-#: git-am.sh:137
+#: git-am.sh:139
msgid "Repository lacks necessary blobs to fall back on 3-way merge."
msgstr "Kho thiếu đối tượng blob cần thiết để trở vá» trên “3-way mergeâ€."
-#: git-am.sh:139
+#: git-am.sh:141
msgid "Using index info to reconstruct a base tree..."
msgstr ""
"Sử dụng thông tin trong bảng mục lục để cấu trúc lại một cây (tree) cơ sở..."
-#: git-am.sh:154
+#: git-am.sh:156
msgid ""
"Did you hand edit your patch?\n"
"It does not apply to blobs recorded in its index."
@@ -9969,28 +9942,28 @@ msgstr ""
"Bạn đã sửa miếng vá của mình bằng cách thủ công à?\n"
"Nó không thể áp dụng các blob đã được ghi lại trong bảng mục lục của nó."
-#: git-am.sh:163
+#: git-am.sh:165
msgid "Falling back to patching base and 3-way merge..."
msgstr "Äang trở lại để vá cÆ¡ sở và “3-way mergeâ€..."
-#: git-am.sh:179
+#: git-am.sh:181
msgid "Failed to merge in the changes."
msgstr "Gặp lỗi khi trộn vào các thay đổi."
-#: git-am.sh:274
+#: git-am.sh:276
msgid "Only one StGIT patch series can be applied at once"
msgstr "Chỉ có một sê-ri miếng vá StGIT được áp dụng một lúc"
-#: git-am.sh:361
+#: git-am.sh:363
#, sh-format
msgid "Patch format $patch_format is not supported."
msgstr "Äịnh dạng miếng vá $patch_format không được há»— trợ."
-#: git-am.sh:363
+#: git-am.sh:365
msgid "Patch format detection failed."
msgstr "Dò tìm định dạng miếng vá gặp lỗi."
-#: git-am.sh:389
+#: git-am.sh:392
msgid ""
"The -b/--binary option has been a no-op for long time, and\n"
"it will be removed. Please do not use it anymore."
@@ -9998,16 +9971,16 @@ msgstr ""
"Tùy chá»n -b/--binary đã không dùng từ lâu rồi, và\n"
"nó sẽ được bỠđi. Xin đừng sử dụng nó thêm nữa."
-#: git-am.sh:479
+#: git-am.sh:486
#, sh-format
msgid "previous rebase directory $dotest still exists but mbox given."
msgstr "thư mục rebase trước $dotest vẫn chưa sẵn sàng nhưng mbox được đưa ra."
-#: git-am.sh:484
+#: git-am.sh:491
msgid "Please make up your mind. --skip or --abort?"
msgstr "Xin hãy rõ ràng. --skip hay --abort?"
-#: git-am.sh:520
+#: git-am.sh:527
#, sh-format
msgid ""
"Stray $dotest directory found.\n"
@@ -10016,16 +9989,16 @@ msgstr ""
"Tìm thấy thư mục lạc $dotest.\n"
"Dùng \"git am --abort\" để loại bỠnó đi."
-#: git-am.sh:528
+#: git-am.sh:535
msgid "Resolve operation not in progress, we are not resuming."
msgstr "Thao tác phân giải không được tiến hành, chúng ta không phục hồi lại."
-#: git-am.sh:594
+#: git-am.sh:601
#, sh-format
msgid "Dirty index: cannot apply patches (dirty: $files)"
msgstr "Bảng mục lục sai: không thể áp dụng các miếng vá (sai: $files)"
-#: git-am.sh:698
+#: git-am.sh:705
#, sh-format
msgid ""
"Patch is empty. Was it split wrong?\n"
@@ -10038,34 +10011,34 @@ msgstr ""
"Äể phục hồi lại nhánh nguyên thủy và dừng vá lại hãy chạy lệnh \"$cmdline --"
"abort\"."
-#: git-am.sh:725
+#: git-am.sh:732
msgid "Patch does not have a valid e-mail address."
msgstr "Miếng vá không có địa chỉ thư điện tử hợp lệ."
-#: git-am.sh:772
+#: git-am.sh:779
msgid "cannot be interactive without stdin connected to a terminal."
msgstr ""
"không thể được tương tác mà không có stdin kết nối với một thiết bị cuối"
-#: git-am.sh:776
+#: git-am.sh:783
msgid "Commit Body is:"
msgstr "Thân của lần chuyển giao là:"
#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
#. in your translation. The program will only accept English
#. input at this point.
-#: git-am.sh:783
+#: git-am.sh:790
msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
msgstr ""
"Ãp dụng? đồng ý [y]/khô[n]g/chỉnh sá»­a [e]/hiển thị miếng [v]á/đồng ý tất cả "
"[a] "
-#: git-am.sh:819
+#: git-am.sh:826
#, sh-format
msgid "Applying: $FIRSTLINE"
msgstr "Äang áp dụng (miếng vá): $FIRSTLINE"
-#: git-am.sh:840
+#: git-am.sh:847
msgid ""
"No changes - did you forget to use 'git add'?\n"
"If there is nothing left to stage, chances are that something else\n"
@@ -10076,7 +10049,7 @@ msgstr ""
"đã sẵn được đưa vào với cùng nội dung thay đổi; bạn có lẽ muốn bỠqua miếng "
"vá này."
-#: git-am.sh:848
+#: git-am.sh:855
msgid ""
"You still have unmerged paths in your index\n"
"did you forget to use 'git add'?"
@@ -10084,16 +10057,16 @@ msgstr ""
"Bạn vẫn có những Ä‘Æ°á»ng dẫn chÆ°a được hòa trá»™n trong bảng mục lục của mình\n"
"bạn đã quên sử dụng lệnh “git add†à?"
-#: git-am.sh:864
+#: git-am.sh:871
msgid "No changes -- Patch already applied."
msgstr "Không thay đổi gì cả -- Miếng vá đã được áp dụng rồi."
-#: git-am.sh:874
+#: git-am.sh:881
#, sh-format
msgid "Patch failed at $msgnum $FIRSTLINE"
msgstr "Gặp lỗi khi vá tại $msgnum $FIRSTLINE"
-#: git-am.sh:877
+#: git-am.sh:884
#, sh-format
msgid ""
"The copy of the patch that failed is found in:\n"
@@ -10102,7 +10075,7 @@ msgstr ""
"Bản sao chép của miếng vá mà nó gặp lỗi thì được tìm thấy trong:\n"
" $dotest/patch"
-#: git-am.sh:895
+#: git-am.sh:902
msgid "applying to an empty history"
msgstr "áp dụng vào một lịch sử trống rỗng"
@@ -10170,8 +10143,6 @@ msgstr "Äầu vào rev sai: $rev"
msgid "'git bisect bad' can take only one argument."
msgstr "“git bisect bad†có thể lấy chỉ một đối số."
-#. have bad but not good. we could bisect although
-#. this is less optimum.
#: git-bisect.sh:273
msgid "Warning: bisecting only with a bad commit."
msgstr "Cảnh báo: chỉ thực hiện việc bisect với một lần chuyển giao sai."
@@ -10280,17 +10251,13 @@ msgid "Pull is not possible because you have unmerged files."
msgstr ""
"Full là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa trộn."
-#: git-pull.sh:223
+#: git-pull.sh:247
msgid "updating an unborn branch with changes added to the index"
msgstr ""
"đang cập nhật một nhánh chưa được sinh ra với các thay đổi được thêm vào "
"bảng mục lục"
-#. The fetch involved updating the current branch.
-#. The working tree and the index file is still based on the
-#. $orig_head commit, but we are merging into $curr_head.
-#. First update the working tree to match $curr_head.
-#: git-pull.sh:247
+#: git-pull.sh:271
#, sh-format
msgid ""
"Warning: fetch updated the current branch head.\n"
@@ -10301,15 +10268,15 @@ msgstr ""
"Cảnh báo: đang fast-forward cây làm việc của bạn từ\n"
"Cảnh báo: commit $orig_head."
-#: git-pull.sh:272
+#: git-pull.sh:296
msgid "Cannot merge multiple branches into empty head"
msgstr "Không thể hòa trá»™n nhiá»u nhánh và trong má»™t head trống rá»—ng"
-#: git-pull.sh:276
+#: git-pull.sh:300
msgid "Cannot rebase onto multiple branches"
msgstr "Không thể thá»±c hiện lệnh rebase (cÆ¡ cấu lại) trên nhiá»u nhánh"
-#: git-rebase.sh:55
+#: git-rebase.sh:57
msgid ""
"When you have resolved this problem, run \"git rebase --continue\".\n"
"If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
@@ -10322,16 +10289,16 @@ msgstr ""
"Äể phục hồi lại thành nhánh nguyên thủy và dừng việc vá lại thì chạy \"git "
"rebase --abort\"."
-#: git-rebase.sh:158
+#: git-rebase.sh:164
msgid "Applied autostash."
msgstr "Äã áp dụng autostash."
-#: git-rebase.sh:161
+#: git-rebase.sh:167
#, sh-format
msgid "Cannot store $stash_sha1"
msgstr "Không thể lưu $stash_sha1"
-#: git-rebase.sh:162
+#: git-rebase.sh:168
msgid ""
"Applying autostash resulted in conflicts.\n"
"Your changes are safe in the stash.\n"
@@ -10342,35 +10309,35 @@ msgstr ""
"Bạn có thể chạy lệnh \"git stash pop\" hay \"git stash drop\" bất kỳ lúc "
"nào.\n"
-#: git-rebase.sh:201
+#: git-rebase.sh:207
msgid "The pre-rebase hook refused to rebase."
msgstr "Móc (hook) pre-rebase từ chối rebase."
-#: git-rebase.sh:206
+#: git-rebase.sh:212
msgid "It looks like git-am is in progress. Cannot rebase."
msgstr ""
"Hình như đang trong quá trình thực hiện lệnh git-am. Không thể chạy lệnh "
"rebase."
-#: git-rebase.sh:346
+#: git-rebase.sh:350
msgid "The --exec option must be used with the --interactive option"
msgstr "Tùy chá»n --exec phải được sá»­ dụng cùng vá»›i tùy chá»n --interactive"
-#: git-rebase.sh:351
+#: git-rebase.sh:355
msgid "No rebase in progress?"
msgstr "Không có tiến trình rebase nào phải không?"
-#: git-rebase.sh:362
+#: git-rebase.sh:366
msgid "The --edit-todo action can only be used during interactive rebase."
msgstr ""
"Hành động “--edit-todo†chỉ có thể dùng trong quá trình “rebase†(sửa lịch "
"sử) tương tác."
-#: git-rebase.sh:369
+#: git-rebase.sh:373
msgid "Cannot read HEAD"
msgstr "Không thể Ä‘á»c HEAD"
-#: git-rebase.sh:372
+#: git-rebase.sh:376
msgid ""
"You must edit all merge conflicts and then\n"
"mark them as resolved using git add"
@@ -10378,12 +10345,12 @@ msgstr ""
"Bạn phải sửa tất cả các lần hòa trộn xung đột và sau\n"
"đó đánh dấu chúng là cần xử lý sử dụng lệnh git add"
-#: git-rebase.sh:390
+#: git-rebase.sh:394
#, sh-format
msgid "Could not move back to $head_name"
msgstr "Không thể quay trở lại $head_name"
-#: git-rebase.sh:409
+#: git-rebase.sh:413
#, sh-format
msgid ""
"It seems that there is already a $state_dir_base directory, and\n"
@@ -10406,66 +10373,65 @@ msgstr ""
"\n"
"TÔI: là lệnh bạn vừa gá»i!"
-#: git-rebase.sh:456
+#: git-rebase.sh:464
#, sh-format
msgid "invalid upstream $upstream_name"
msgstr "thượng nguồn không hợp lệ $upstream_name"
-#: git-rebase.sh:480
+#: git-rebase.sh:488
#, sh-format
msgid "$onto_name: there are more than one merge bases"
msgstr "$onto_name: ở đây có nhiá»u hÆ¡n má»™t ná»n móng hòa trá»™n"
-#: git-rebase.sh:483 git-rebase.sh:487
+#: git-rebase.sh:491 git-rebase.sh:495
#, sh-format
msgid "$onto_name: there is no merge base"
msgstr "$onto_name: ở đây không có ná»n móng hòa trá»™n nào"
-#: git-rebase.sh:492
+#: git-rebase.sh:500
#, sh-format
msgid "Does not point to a valid commit: $onto_name"
msgstr "Không chỉ đến một lần chuyển giao không hợp lệ: $onto_name"
-#: git-rebase.sh:515
+#: git-rebase.sh:523
#, sh-format
msgid "fatal: no such branch: $branch_name"
msgstr "nghiêm trá»ng: không có nhánh nhÆ° thế: $branch_name"
-#: git-rebase.sh:548
+#: git-rebase.sh:556
msgid "Cannot autostash"
msgstr "Không thể autostash"
-#: git-rebase.sh:553
+#: git-rebase.sh:561
#, sh-format
msgid "Created autostash: $stash_abbrev"
msgstr "Äã tạo autostash: $stash_abbrev"
-#: git-rebase.sh:557
+#: git-rebase.sh:565
msgid "Please commit or stash them."
msgstr "Xin hãy commit hoặc tạm cất (stash) chúng."
-#: git-rebase.sh:577
+#: git-rebase.sh:585
#, sh-format
msgid "Current branch $branch_name is up to date."
msgstr "Nhánh hiện tại $branch_name đã được cập nhật rồi."
-#: git-rebase.sh:581
+#: git-rebase.sh:589
#, sh-format
msgid "Current branch $branch_name is up to date, rebase forced."
msgstr "Nhánh hiện tại $branch_name đã được cập nhật rồi, lệnh rebase ép buộc."
-#: git-rebase.sh:592
+#: git-rebase.sh:600
#, sh-format
msgid "Changes from $mb to $onto:"
msgstr "Thay đổi từ $mb thành $onto:"
-#. Detach HEAD and reset the tree
-#: git-rebase.sh:601
+#: git-rebase.sh:609
msgid "First, rewinding head to replay your work on top of it..."
msgstr ""
"Trước tiên, di chuyển head để xem lại các công việc trên đỉnh của nó..."
-#: git-rebase.sh:611
+#: git-rebase.sh:619
#, sh-format
msgid "Fast-forwarded $branch_name to $onto_name."
msgstr "Fast-forward $branch_name thành $onto_name."
@@ -10588,21 +10554,21 @@ msgstr "Không thể bá» ra khá»i bệ phóng các tập tin đã được sá»
msgid "Index was not unstashed."
msgstr "Bảng mục lục đã không được bỠstash."
-#: git-stash.sh:523
+#: git-stash.sh:529
#, sh-format
msgid "Dropped ${REV} ($s)"
msgstr "Äã xóa ${REV} ($s)"
-#: git-stash.sh:524
+#: git-stash.sh:530
#, sh-format
msgid "${REV}: Could not drop stash entry"
msgstr "${REV}: Không thể xóa bỠmục stash"
-#: git-stash.sh:531
+#: git-stash.sh:537
msgid "No branch name specified"
msgstr "Chưa chỉ ra tên của nhánh"
-#: git-stash.sh:603
+#: git-stash.sh:609
msgid "(To restore them type \"git stash apply\")"
msgstr "(Äể phục hồi lại chúng hãy gõ \"git stash apply\")"
@@ -10618,35 +10584,35 @@ msgstr ""
"Không tìm thấy ánh xạ (mapping) mô-Ä‘un-con trong .gitmodules cho Ä‘Æ°á»ng dẫn "
"“$sm_pathâ€"
-#: git-submodule.sh:281
+#: git-submodule.sh:287
#, sh-format
msgid "Clone of '$url' into submodule path '$sm_path' failed"
msgstr "Nhân bản “$url†vào Ä‘Æ°á»ng dẫn mô-Ä‘un-con “$sm_path†gặp lá»—i"
-#: git-submodule.sh:293
+#: git-submodule.sh:299
#, sh-format
msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
msgstr ""
"Gitdir “$a†là bá»™ phận của Ä‘Æ°á»ng dẫn mô-Ä‘un-con “$b†hoặc \"vice versa\""
-#: git-submodule.sh:403
+#: git-submodule.sh:409
msgid "Relative path can only be used from the toplevel of the working tree"
msgstr ""
"ÄÆ°á»ng dẫn tÆ°Æ¡ng đối chỉ có thể dùng từ thÆ° mục ở mức cao nhất của cây làm "
"việc"
-#: git-submodule.sh:413
+#: git-submodule.sh:419
#, sh-format
msgid "repo URL: '$repo' must be absolute or begin with ./|../"
msgstr ""
"repo URL: “$repo†phải là Ä‘Æ°á»ng dẫn tuyệt đối hoặc là bắt đầu bằng ./|../"
-#: git-submodule.sh:430
+#: git-submodule.sh:436
#, sh-format
msgid "'$sm_path' already exists in the index"
msgstr "â€$sm_path†thá»±c sá»± đã tồn tại ở bảng mục lục rồi"
-#: git-submodule.sh:434
+#: git-submodule.sh:440
#, sh-format
msgid ""
"The following path is ignored by one of your .gitignore files:\n"
@@ -10658,36 +10624,36 @@ msgstr ""
"$sm_path\n"
"Sử dụng -f nếu bạn thực sự muốn thêm nó vào."
-#: git-submodule.sh:452
+#: git-submodule.sh:458
#, sh-format
msgid "Adding existing repo at '$sm_path' to the index"
msgstr "Äang thêm repo có sẵn tại “$sm_path†vào bảng mục lục"
-#: git-submodule.sh:454
+#: git-submodule.sh:460
#, sh-format
msgid "'$sm_path' already exists and is not a valid git repo"
msgstr "â€$sm_path†đã tồn tại từ trÆ°á»›c và không phải là má»™t kho git hợp lệ"
-#: git-submodule.sh:462
+#: git-submodule.sh:468
#, sh-format
msgid "A git directory for '$sm_name' is found locally with remote(s):"
msgstr ""
"Thư mục git cho “$sm_name†được tìm thấy một cách cục bộ với các máy chủ:"
-#: git-submodule.sh:464
+#: git-submodule.sh:470
#, sh-format
msgid ""
"If you want to reuse this local git directory instead of cloning again from"
msgstr "Nếu bạn muốn dùng lại thư mục git nội bộ này thay vì nhân bản từ nó"
-#: git-submodule.sh:466
+#: git-submodule.sh:472
#, sh-format
msgid ""
"use the '--force' option. If the local git directory is not the correct repo"
msgstr ""
"dùng tùy chá»n “--forceâ€. Nếu thÆ° mục git ná»™i bá»™ không phải là repo (kho) đúng"
-#: git-submodule.sh:467
+#: git-submodule.sh:473
#, sh-format
msgid ""
"or you are unsure what this means choose another name with the '--name' "
@@ -10696,71 +10662,71 @@ msgstr ""
"hay bạn không chắc chắn Ä‘iá»u đó có nghÄ©a gì chá»n tên khác vá»›i tùy chá»n “--"
"nameâ€."
-#: git-submodule.sh:469
+#: git-submodule.sh:475
#, sh-format
msgid "Reactivating local git directory for submodule '$sm_name'."
msgstr ""
"Phục hồi sá»± hoạt Ä‘á»™ng của thÆ° mục git ná»™i bá»™ cho mô-Ä‘un-con “$sm_nameâ€."
-#: git-submodule.sh:481
+#: git-submodule.sh:487
#, sh-format
msgid "Unable to checkout submodule '$sm_path'"
-msgstr "Không thể checkout mô-Ä‘un-con “$sm_pathâ€"
+msgstr "Không thể lấy ra mô-Ä‘un-con “$sm_pathâ€"
-#: git-submodule.sh:486
+#: git-submodule.sh:492
#, sh-format
msgid "Failed to add submodule '$sm_path'"
msgstr "Gặp lá»—i khi thêm mô-Ä‘un-con “$sm_pathâ€"
-#: git-submodule.sh:495
+#: git-submodule.sh:501
#, sh-format
msgid "Failed to register submodule '$sm_path'"
msgstr "Gặp lá»—i khi đăng ký vá»›i hệ thống mô-Ä‘un-con “$sm_pathâ€"
-#: git-submodule.sh:539
+#: git-submodule.sh:545
#, sh-format
msgid "Entering '$prefix$displaypath'"
msgstr "Äang vào “$prefix$displaypathâ€"
-#: git-submodule.sh:559
+#: git-submodule.sh:565
#, sh-format
msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
msgstr ""
"Dừng lại tại “$prefix$displaypathâ€; script trả vá» trạng thái khác không."
-#: git-submodule.sh:605
+#: git-submodule.sh:611
#, sh-format
msgid "No url found for submodule path '$displaypath' in .gitmodules"
msgstr ""
"Không tìm thấy url cho Ä‘Æ°á»ng dẫn mô-Ä‘un-con “$displaypath†trong .gitmodules"
-#: git-submodule.sh:614
+#: git-submodule.sh:620
#, sh-format
msgid "Failed to register url for submodule path '$displaypath'"
msgstr "Gặp lá»—i khi đăng ký url cho Ä‘Æ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€"
-#: git-submodule.sh:616
+#: git-submodule.sh:622
#, sh-format
msgid "Submodule '$name' ($url) registered for path '$displaypath'"
msgstr "Mô-Ä‘un-con “$name†($url) được đăng ký cho Ä‘Æ°á»ng dẫn “$displaypathâ€"
-#: git-submodule.sh:633
+#: git-submodule.sh:639
#, sh-format
msgid "Failed to register update mode for submodule path '$displaypath'"
msgstr ""
"Gặp lá»—i khi đăng ký chế Ä‘á»™ cập nhật cho Ä‘Æ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€"
-#: git-submodule.sh:671
+#: git-submodule.sh:677
#, sh-format
msgid "Use '.' if you really want to deinitialize all submodules"
msgstr "Dùng “.†nếu bạn thá»±c sá»± muốn gỡ bá» má»i mô-Ä‘un-con"
-#: git-submodule.sh:688
+#: git-submodule.sh:694
#, sh-format
msgid "Submodule work tree '$displaypath' contains a .git directory"
msgstr "Cây làm việc mô-đun-con “$displaypath†có chứa thư mục .git"
-#: git-submodule.sh:689
+#: git-submodule.sh:695
#, sh-format
msgid ""
"(use 'rm -rf' if you really want to remove it including all of its history)"
@@ -10768,7 +10734,7 @@ msgstr ""
"(dùng “rm -rf†nếu bạn thực sự muốn gỡ bỠnó cùng với tất cả lịch sử của "
"chúng)"
-#: git-submodule.sh:695
+#: git-submodule.sh:701
#, sh-format
msgid ""
"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
@@ -10777,27 +10743,27 @@ msgstr ""
"Cây làm việc mô-đun-con “$displaypath†chứa các thay đổi nội bộ; hãy dùng “-"
"f†để loại bỠchúng đi"
-#: git-submodule.sh:698
+#: git-submodule.sh:704
#, sh-format
msgid "Cleared directory '$displaypath'"
msgstr "Äã tạo thÆ° mục “$displaypathâ€"
-#: git-submodule.sh:699
+#: git-submodule.sh:705
#, sh-format
msgid "Could not remove submodule work tree '$displaypath'"
msgstr "Không thể gỡ bá» cây làm việc mô-Ä‘un-con “$displaypathâ€"
-#: git-submodule.sh:702
+#: git-submodule.sh:708
#, sh-format
msgid "Could not create empty submodule directory '$displaypath'"
msgstr "Không thể tạo thÆ° mục mô-Ä‘un-con rá»—ng “$displaypathâ€"
-#: git-submodule.sh:711
+#: git-submodule.sh:717
#, sh-format
msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
msgstr "Mô-Ä‘un-con “$name†($url) được bỠđăng ký cho Ä‘Æ°á»ng dẫn “$displaypathâ€"
-#: git-submodule.sh:834
+#: git-submodule.sh:833
#, sh-format
msgid ""
"Submodule path '$displaypath' not initialized\n"
@@ -10806,45 +10772,55 @@ msgstr ""
"ÄÆ°á»ng dẫn mô-Ä‘un-con “$displaypath†chÆ°a được khởi tạo.\n"
"Có lẽ bạn muốn sử dụng lệnh “update --init�"
-#: git-submodule.sh:847
+#: git-submodule.sh:846
#, sh-format
msgid "Unable to find current revision in submodule path '$displaypath'"
msgstr ""
"Không tìm thấy Ä‘iểm xét duyệt hiện hành trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con "
"“$displaypathâ€"
-#: git-submodule.sh:856
+#: git-submodule.sh:855
#, sh-format
msgid "Unable to fetch in submodule path '$sm_path'"
msgstr "Không thể lấy vá» trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con “$sm_pathâ€"
-#: git-submodule.sh:880
+#: git-submodule.sh:879
#, sh-format
msgid "Unable to fetch in submodule path '$displaypath'"
msgstr "Không thể lấy vá» trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€"
+#: git-submodule.sh:893
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr "Không thể lấy ra “$sha1†trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€"
+
#: git-submodule.sh:894
#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "ÄÆ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€: đã checkout “$sha1â€"
+
+#: git-submodule.sh:898
+#, sh-format
msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
-msgstr "Không thể rebase “$sha1†trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€"
+msgstr "Không thể cải tổ “$sha1†trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€"
-#: git-submodule.sh:895
+#: git-submodule.sh:899
#, sh-format
msgid "Submodule path '$displaypath': rebased into '$sha1'"
msgstr "ÄÆ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€: được rebase vào trong “$sha1â€"
-#: git-submodule.sh:900
+#: git-submodule.sh:904
#, sh-format
msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
msgstr ""
"Không thể hòa trá»™n (merge) “$sha1†trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€"
-#: git-submodule.sh:901
+#: git-submodule.sh:905
#, sh-format
msgid "Submodule path '$displaypath': merged in '$sha1'"
msgstr "ÄÆ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€: được hòa trá»™n vào “$sha1â€"
-#: git-submodule.sh:906
+#: git-submodule.sh:910
#, sh-format
msgid ""
"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
@@ -10852,67 +10828,173 @@ msgstr ""
"Thá»±c hiện không thành công lệnh “$command $sha1†trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con "
"“$prefix$sm_pathâ€"
-#: git-submodule.sh:907
+#: git-submodule.sh:911
#, sh-format
msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
msgstr "ÄÆ°á»ng dẫn mô-Ä‘un-con “$prefix$sm_pathâ€: “$command $sha1â€"
-#: git-submodule.sh:912
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
-msgstr "Không thể checkout “$sha1†trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€"
-
-#: git-submodule.sh:913
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "ÄÆ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€: đã checkout “$sha1â€"
-
-#: git-submodule.sh:940
+#: git-submodule.sh:941
#, sh-format
msgid "Failed to recurse into submodule path '$displaypath'"
msgstr "Gặp lá»—i khi đệ quy vào trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con “$displaypathâ€"
-#: git-submodule.sh:1048
+#: git-submodule.sh:1049
msgid "The --cached option cannot be used with the --files option"
msgstr "Tùy chá»n --cached không thể dùng cùng vá»›i tùy chá»n --files"
-#. unexpected type
-#: git-submodule.sh:1096
+#: git-submodule.sh:1097
#, sh-format
msgid "unexpected mode $mod_dst"
msgstr "chế độ không như mong chỠ$mod_dst"
-#: git-submodule.sh:1116
+#: git-submodule.sh:1117
#, sh-format
msgid " Warn: $display_name doesn't contain commit $sha1_src"
msgstr " Cảnh báo: $display_name không chứa lần chuyển giao $sha1_src"
-#: git-submodule.sh:1119
+#: git-submodule.sh:1120
#, sh-format
msgid " Warn: $display_name doesn't contain commit $sha1_dst"
msgstr " Cảnh báo: $display_name không chứa lần chuyển giao $sha1_dst"
-#: git-submodule.sh:1122
+#: git-submodule.sh:1123
#, sh-format
msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
msgstr ""
" Cảnh báo: $display_name không chứa những lần chuyển giao $sha1_src và "
"$sha1_dst"
-#: git-submodule.sh:1147
+#: git-submodule.sh:1148
msgid "blob"
msgstr "blob"
-#: git-submodule.sh:1261
+#: git-submodule.sh:1262
#, sh-format
msgid "Failed to recurse into submodule path '$sm_path'"
msgstr "Gặp lá»—i khi đệ quy vào trong Ä‘Æ°á»ng dẫn mô-Ä‘un-con “$sm_pathâ€"
-#: git-submodule.sh:1325
+#: git-submodule.sh:1326
#, sh-format
msgid "Synchronizing submodule url for '$displaypath'"
msgstr "Url Mô-Ä‘un-con đồng bá»™ hóa cho “$displaypathâ€"
+#~ msgid "key id"
+#~ msgstr "id của khóa"
+
+#~ msgid "Tracking not set up: name too long: %s"
+#~ msgstr "Việc theo dõi chưa được cài đặt: tên quá dài: %s"
+
+#~ msgid "bug"
+#~ msgstr "lá»—i"
+
+#~ msgid "ahead "
+#~ msgstr "phía trước "
+
+#~ msgid ", behind "
+#~ msgstr ", đằng sau "
+
+#~ msgid "could not find .gitmodules in index"
+#~ msgstr "không tìm thấy .gitmodules trong bảng mục lục"
+
+#~ msgid "reading updated .gitmodules failed"
+#~ msgstr "gặp lá»—i khi Ä‘á»c cập nhật .gitmodules"
+
+#~ msgid "unable to stat updated .gitmodules"
+#~ msgstr "không thể lấy thống kê .gitmodules đã cập nhật"
+
+#~ msgid "unable to remove .gitmodules from index"
+#~ msgstr "không thể gỡ bỠ.gitmodules từ mục lục"
+
+#~ msgid "adding updated .gitmodules failed"
+#~ msgstr "gặp lỗi khi thêm .gitmodules đã cập nhật"
+
+#~ 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 ""
+#~ "Cách ứng xá»­ của lệnh “git add %s (hay %s)†khi không có tham số Ä‘Æ°á»ng dẫn "
+#~ "từ\n"
+#~ "thư-mục con của cây sẽ thay đổi kể từ Git 2.0 và không thể sử dụng như "
+#~ "thế nữa.\n"
+#~ "Äể thêm ná»™i dung cho toàn bá»™ cây, chạy:\n"
+#~ "\n"
+#~ " git add %s :/\n"
+#~ " (hoặc git add %s :/)\n"
+#~ "\n"
+#~ "Äể hạn chế lệnh cho thÆ°-mục hiện tại, chạy:\n"
+#~ "\n"
+#~ " git add %s .\n"
+#~ " (hoặc git add %s .)\n"
+#~ "\n"
+#~ "Với phiên bản hiện tại của Git, lệnh bị hạn chế cho thư-mục hiện tại.\n"
+
+#~ 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 ""
+#~ "Bạn chạy “git add†mà không có “-A (--all)†cũng không “--ignore-"
+#~ "removalâ€,\n"
+#~ "cách ứng xá»­ của nó sẽ thay đổi kể từ Git 2.0: nó quan tâm đến các Ä‘Æ°á»ng "
+#~ "dẫn mà\n"
+#~ "bạn đã gỡ bá». Các Ä‘Æ°á»ng dẫn nhÆ° là “%s†cái mà\n"
+#~ "bị gỡ bỠtừ cây làm việc của bạn thì bị bỠqua với phiên bản này của "
+#~ "Git.\n"
+#~ "\n"
+#~ "* “git add --ignore-removal <pathspec>â€, cái hiện tại là mặc định,\n"
+#~ " bá» qua các Ä‘Æ°á»ng dẫn bạn đã gỡ bá» từ cây làm việc của bạn.\n"
+#~ "\n"
+#~ "* “git add --all <pathspec>†sẽ đồng thá»i giúp bạn ghi lại việc dá»i Ä‘i.\n"
+#~ "\n"
+#~ "Chạy “git status†để kiểm tra các Ä‘Æ°á»ng dẫn bạn đã gỡ bá» từ cây làm việc "
+#~ "của bạn.\n"
+
+#~ msgid ""
+#~ "Auto packing the repository for optimum performance. You may also\n"
+#~ "run \"git gc\" manually. See \"git help gc\" for more information.\n"
+#~ msgstr ""
+#~ "Tự động đóng gói kho chứa để tối ưu hóa hiệu suất làm việc.\n"
+#~ "chạy lệnh \"git gc\" một cách thủ công. Hãy xem \"git help gc\" để biết "
+#~ "thêm chi tiết.\n"
+
+#~ 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 ""
+#~ "Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau "
+#~ "bá»™\n"
+#~ "phận tương ứng của máy chủ. Nếu bạn không có ý định push nhánh đó, bạn có "
+#~ "lẽ muốn\n"
+#~ "chỉ định các nhánh để push hoặt là đặt nội dung cho biến cấu hình “push."
+#~ "defaultâ€\n"
+#~ "thành “simpleâ€, “current†hoặc “upstream†để chỉ push nhánh hiện hành mà "
+#~ "thôi."
+
#~ msgid "copied: %s -> %s"
#~ msgstr "đã sao chép: %s -> %s"
@@ -10928,9 +11010,6 @@ msgstr "Url Mô-Ä‘un-con đồng bá»™ hóa cho “$displaypathâ€"
#~ msgid "unmerged: %s"
#~ msgstr "chưa hòa trộn: %s"
-#~ msgid "done\n"
-#~ msgstr "xong\n"
-
#~ msgid "input paths are terminated by a null character"
#~ msgstr "các Ä‘Æ°á»ng dẫn được ngăn cách bởi ký tá»± null"
@@ -11058,15 +11137,9 @@ msgstr "Url Mô-Ä‘un-con đồng bá»™ hóa cho “$displaypathâ€"
#~ msgstr[0] ", %d xóa(-)"
#~ msgstr[1] ", %d xóa(-)"
-#~ msgid "Auto packing the repository for optimum performance.\n"
-#~ msgstr "Tự động đóng gói kho chứa để tối ưu hóa hiệu suất làm việc.\n"
-
#~ msgid " (use \"git add\" to track)"
#~ msgstr " (dùng \"git add\" để theo dõi dấu vết)"
-#~ msgid "-B cannot be used with -b"
-#~ msgstr "tùy chá»n -B không thể dùng -b"
-
#~ msgid "--detach cannot be used with -b/-B/--orphan"
#~ msgstr "--detach không thể được sá»­ dụng vá»›i tùy chá»n -b/-B/--orphan"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 0942835711..06cc173aca 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -12,8 +12,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Git\n"
"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n"
-"POT-Creation-Date: 2014-02-01 08:06+0800\n"
-"PO-Revision-Date: 2014-02-03 10:53+0800\n"
+"POT-Creation-Date: 2014-04-23 12:50+0800\n"
+"PO-Revision-Date: 2014-04-23 12:53+0800\n"
"Last-Translator: Jiang Xin <worldhello.net@gmail.com>\n"
"Language-Team: GitHub <https://github.com/gotgit/git/>\n"
"Language: zh_CN\n"
@@ -22,16 +22,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: advice.c:57
+#: advice.c:55
#, 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
+#: advice.c:85
msgid ""
"Fix them up in the work tree,\n"
"and then use 'git add/rm <file>' as\n"
@@ -60,76 +56,76 @@ msgstr ""
msgid "git archive --remote <repo> [--exec <cmd>] --list"
msgstr "git archive --remote <版本库> [--exec <命令>] --list"
-#: archive.c:242 builtin/add.c:240 builtin/add.c:559 builtin/rm.c:328
+#: archive.c:243 builtin/add.c:136 builtin/add.c:428 builtin/rm.c:328
#, c-format
msgid "pathspec '%s' did not match any files"
msgstr "路径规则 '%s' 未匹é…任何文件"
-#: archive.c:327
+#: archive.c:328
msgid "fmt"
msgstr "æ ¼å¼"
-#: archive.c:327
+#: archive.c:328
msgid "archive format"
msgstr "归档格å¼"
-#: archive.c:328 builtin/log.c:1193
+#: archive.c:329 builtin/log.c:1193
msgid "prefix"
msgstr "å‰ç¼€"
-#: archive.c:329
+#: archive.c:330
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
+#: archive.c:331 builtin/archive.c:88 builtin/blame.c:2265
+#: builtin/blame.c:2266 builtin/config.c:57 builtin/fast-export.c:680
+#: builtin/fast-export.c:682 builtin/grep.c:714 builtin/hash-object.c:77
+#: builtin/ls-files.c:489 builtin/ls-files.c:492 builtin/notes.c:412
+#: builtin/notes.c:569 builtin/read-tree.c:108 parse-options.h:151
msgid "file"
msgstr "文件"
-#: archive.c:331 builtin/archive.c:89
+#: archive.c:332 builtin/archive.c:89
msgid "write the archive to this file"
msgstr "归档写入此文件"
-#: archive.c:333
+#: archive.c:334
msgid "read .gitattributes in working directory"
msgstr "读å–工作区中的 .gitattributes"
-#: archive.c:334
+#: archive.c:335
msgid "report archived files on stderr"
msgstr "在标准错误上报告归档文件"
-#: archive.c:335
+#: archive.c:336
msgid "store only"
msgstr "åªå­˜å‚¨"
-#: archive.c:336
+#: archive.c:337
msgid "compress faster"
msgstr "压缩速度更快"
-#: archive.c:344
+#: archive.c:345
msgid "compress better"
msgstr "压缩效果更好"
-#: archive.c:347
+#: archive.c:348
msgid "list supported archive formats"
msgstr "列出支æŒçš„归档格å¼"
-#: archive.c:349 builtin/archive.c:90 builtin/clone.c:84
+#: archive.c:350 builtin/archive.c:90 builtin/clone.c:84
msgid "repo"
msgstr "版本库"
-#: archive.c:350 builtin/archive.c:91
+#: archive.c:351 builtin/archive.c:91
msgid "retrieve the archive from remote repository <repo>"
msgstr "从远程版本库(<版本库>)æå–归档文件"
-#: archive.c:351 builtin/archive.c:92 builtin/notes.c:487
+#: archive.c:352 builtin/archive.c:92 builtin/notes.c:491
msgid "command"
msgstr "命令"
-#: archive.c:352 builtin/archive.c:93
+#: archive.c:353 builtin/archive.c:93
msgid "path to the remote git-upload-archive command"
msgstr "远程 git-upload-archive 命令的路径"
@@ -146,81 +142,76 @@ msgstr ""
msgid "Not setting branch %s as its own upstream."
msgstr "未设置分支 %s 作为它自己的上游。"
-#: branch.c:82
+#: branch.c:83
#, c-format
msgid "Branch %s set up to track remote branch %s from %s by rebasing."
msgstr "分支 %1$s 设置为使用å˜åŸºæ¥è·Ÿè¸ªæ¥è‡ª %3$s 的远程分支 %2$s。"
-#: branch.c:83
+#: branch.c:84
#, c-format
msgid "Branch %s set up to track remote branch %s from %s."
msgstr "分支 %1$s 设置为跟踪æ¥è‡ª %3$s 的远程分支 %2$s。"
-#: branch.c:87
+#: branch.c:88
#, c-format
msgid "Branch %s set up to track local branch %s by rebasing."
msgstr "分支 %s 设置为使用å˜åŸºæ¥è·Ÿè¸ªæœ¬åœ°åˆ†æ”¯ %s。"
-#: branch.c:88
+#: branch.c:89
#, c-format
msgid "Branch %s set up to track local branch %s."
msgstr "分支 %s 设置为跟踪本地分支 %s。"
-#: branch.c:92
+#: branch.c:94
#, c-format
msgid "Branch %s set up to track remote ref %s by rebasing."
msgstr "分支 %s 设置为使用å˜åŸºæ¥è·Ÿè¸ªè¿œç¨‹å¼•ç”¨ %s。"
-#: branch.c:93
+#: branch.c:95
#, c-format
msgid "Branch %s set up to track remote ref %s."
msgstr "分支 %s 设置为跟踪远程引用 %s。"
-#: branch.c:97
+#: branch.c:99
#, c-format
msgid "Branch %s set up to track local ref %s by rebasing."
msgstr "分支 %s 设置为使用å˜åŸºæ¥è·Ÿè¸ªæœ¬åœ°å¼•ç”¨ %s。"
-#: branch.c:98
+#: branch.c:100
#, c-format
msgid "Branch %s set up to track local ref %s."
msgstr "分支 %s 设置为跟踪本地引用 %s。"
-#: branch.c:118
-#, c-format
-msgid "Tracking not set up: name too long: %s"
-msgstr "跟踪未设置:å字太长:%s"
-
-#: branch.c:137
+#: branch.c:133
#, c-format
msgid "Not tracking: ambiguous information for ref %s"
msgstr "未跟踪:引用 %s 有歧义"
-#: branch.c:182
+#: branch.c:178
#, c-format
msgid "'%s' is not a valid branch name."
msgstr "'%s' ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„分支å称。"
-#: branch.c:187
+#: branch.c:183
#, c-format
msgid "A branch named '%s' already exists."
msgstr "一个分支å '%s' å·²ç»å­˜åœ¨ã€‚"
-#: branch.c:195
+#: branch.c:191
msgid "Cannot force update the current branch."
msgstr "无法强制更新当å‰åˆ†æ”¯ã€‚"
-#: branch.c:215
+#: branch.c:211
#, c-format
msgid "Cannot setup tracking information; starting point '%s' is not a branch."
msgstr "无法设置跟踪信æ¯ï¼›èµ·å§‹ç‚¹ '%s' ä¸æ˜¯ä¸€ä¸ªåˆ†æ”¯ã€‚"
-#: branch.c:217
+#: branch.c:213
#, c-format
msgid "the requested upstream branch '%s' does not exist"
msgstr "请求的上游分支 '%s' ä¸å­˜åœ¨"
-#: branch.c:219
+#: branch.c:215
msgid ""
"\n"
"If you are planning on basing your work on an upstream\n"
@@ -238,113 +229,113 @@ msgstr ""
"如果您正计划推é€ä¸€ä¸ªèƒ½ä¸Žå¯¹åº”远程分支建立跟踪的新的本地分支,\n"
"您å¯èƒ½éœ€è¦ä½¿ç”¨ \"git push -u\" 推é€åˆ†æ”¯å¹¶é…置和上游的关è”。"
-#: branch.c:264
+#: branch.c:260
#, c-format
msgid "Not a valid object name: '%s'."
msgstr "ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„对象å:'%s'。"
-#: branch.c:284
+#: branch.c:280
#, c-format
msgid "Ambiguous object name: '%s'."
msgstr "歧义的对象å:'%s'。"
-#: branch.c:289
+#: branch.c:285
#, c-format
msgid "Not a valid branch point: '%s'."
msgstr "无效的分支点:'%s'。"
-#: branch.c:295
+#: branch.c:291
msgid "Failed to lock ref for update"
msgstr "无法为更新é”定引用"
-#: branch.c:313
+#: branch.c:309
msgid "Failed to write ref"
msgstr "ä¸èƒ½å†™å¼•ç”¨"
-#: bundle.c:37
+#: bundle.c:33
#, c-format
msgid "'%s' does not look like a v2 bundle file"
msgstr "'%s' ä¸åƒæ˜¯ä¸€ä¸ª v2 版本的包文件"
-#: bundle.c:64
+#: bundle.c:60
#, c-format
msgid "unrecognized header: %s%s (%d)"
msgstr "未能识别的包头:%s%s (%d)"
-#: bundle.c:90 builtin/commit.c:706
+#: bundle.c:86 builtin/commit.c:706
#, c-format
msgid "could not open '%s'"
msgstr "ä¸èƒ½æ‰“å¼€ '%s'"
-#: bundle.c:141
+#: bundle.c:138
msgid "Repository lacks these prerequisite commits:"
msgstr "版本库缺少这些必备的æ交:"
-#: bundle.c:165 sequencer.c:662 sequencer.c:1112 builtin/log.c:332
+#: bundle.c:162 sequencer.c:669 sequencer.c:1123 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
+#: bundle.c:184
#, c-format
msgid "The bundle contains this ref:"
msgid_plural "The bundle contains these %d refs:"
msgstr[0] "这个包中å«æœ‰è¿™ä¸ªå¼•ç”¨ï¼š"
msgstr[1] "这个包中å«æœ‰ %d 个引用:"
-#: bundle.c:194
+#: bundle.c:191
msgid "The bundle records a complete history."
msgstr "这个包记录一个完整历å²ã€‚"
-#: bundle.c:196
+#: bundle.c:193
#, c-format
msgid "The bundle requires this ref:"
msgid_plural "The bundle requires these %d refs:"
msgstr[0] "这个包需è¦è¿™ä¸ªå¼•ç”¨ï¼š"
msgstr[1] "è¿™ä¸ªåŒ…éœ€è¦ %d 个引用:"
-#: bundle.c:296
+#: bundle.c:293
msgid "rev-list died"
msgstr "rev-list 终止"
-#: bundle.c:302 builtin/log.c:1329 builtin/shortlog.c:261
+#: bundle.c:299 builtin/log.c:1329 builtin/shortlog.c:261
#, c-format
msgid "unrecognized argument: %s"
msgstr "未能识别的å‚数:%s"
-#: bundle.c:337
+#: bundle.c:334
#, c-format
msgid "ref '%s' is excluded by the rev-list options"
msgstr "引用 '%s' 被 rev-list 选项排除"
-#: bundle.c:382
+#: bundle.c:379
msgid "Refusing to create empty bundle."
msgstr "ä¸èƒ½åˆ›å»ºç©ºåŒ…。"
-#: bundle.c:398
+#: bundle.c:395
msgid "Could not spawn pack-objects"
msgstr "ä¸èƒ½ç”Ÿæˆ pack-objects 进程"
-#: bundle.c:416
+#: bundle.c:413
msgid "pack-objects died"
msgstr "pack-objects 终止"
-#: bundle.c:419
+#: bundle.c:416
#, c-format
msgid "cannot create '%s'"
msgstr "ä¸èƒ½åˆ›å»º '%s'"
-#: bundle.c:441
+#: bundle.c:438
msgid "index-pack died"
msgstr "index-pack 终止"
-#: commit.c:53
+#: commit.c:54
#, c-format
msgid "could not parse %s"
msgstr "ä¸èƒ½è§£æž %s"
-#: commit.c:55
+#: commit.c:56
#, c-format
msgid "%s %s is not a commit!"
msgstr "%s %s ä¸æ˜¯ä¸€ä¸ªæ交!"
@@ -375,43 +366,43 @@ msgstr "在将æ¥"
#, c-format
msgid "%lu second ago"
msgid_plural "%lu seconds ago"
-msgstr[0] "%lu 秒钟之å‰"
-msgstr[1] "%lu 秒钟之å‰"
+msgstr[0] "%lu 秒钟å‰"
+msgstr[1] "%lu 秒钟å‰"
#: date.c:108
#, c-format
msgid "%lu minute ago"
msgid_plural "%lu minutes ago"
-msgstr[0] "%lu 分钟之å‰"
-msgstr[1] "%lu 分钟之å‰"
+msgstr[0] "%lu 分钟å‰"
+msgstr[1] "%lu 分钟å‰"
#: date.c:115
#, c-format
msgid "%lu hour ago"
msgid_plural "%lu hours ago"
-msgstr[0] "%lu å°æ—¶ä¹‹å‰"
-msgstr[1] "%lu å°æ—¶ä¹‹å‰"
+msgstr[0] "%lu å°æ—¶å‰"
+msgstr[1] "%lu å°æ—¶å‰"
#: date.c:122
#, c-format
msgid "%lu day ago"
msgid_plural "%lu days ago"
-msgstr[0] "%lu 天之å‰"
-msgstr[1] "%lu 天之å‰"
+msgstr[0] "%lu 天å‰"
+msgstr[1] "%lu 天å‰"
#: date.c:128
#, c-format
msgid "%lu week ago"
msgid_plural "%lu weeks ago"
-msgstr[0] "%lu 周之å‰"
-msgstr[1] "%lu 周之å‰"
+msgstr[0] "%lu 周å‰"
+msgstr[1] "%lu 周å‰"
#: date.c:135
#, c-format
msgid "%lu month ago"
msgid_plural "%lu months ago"
-msgstr[0] "%lu 个月之å‰"
-msgstr[1] "%lu 个月之å‰"
+msgstr[0] "%lu 个月å‰"
+msgstr[1] "%lu 个月å‰"
#: date.c:146
#, c-format
@@ -420,12 +411,13 @@ msgid_plural "%lu years"
msgstr[0] "%lu å¹´"
msgstr[1] "%lu å¹´"
+#. TRANSLATORS: "%s" is "<n> years"
#: date.c:149
#, c-format
msgid "%s, %lu month ago"
msgid_plural "%s, %lu months ago"
-msgstr[0] "%s,%lu 个月之å‰"
-msgstr[1] "%s,%lu 个月之å‰"
+msgstr[0] "%s %lu 个月å‰"
+msgstr[1] "%s %lu 个月å‰"
#: date.c:154 date.c:159
#, c-format
@@ -439,6 +431,10 @@ msgstr[1] "%lu å¹´å‰"
msgid "failed to read orderfile '%s'"
msgstr "无法读å–排åºæ–‡ä»¶ '%s'"
+#: diffcore-rename.c:517
+msgid "Performing inexact rename detection"
+msgstr "正在进行éžç²¾ç¡®çš„é‡å‘½å检测"
+
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
#: diff.c:113
#, c-format
@@ -465,7 +461,7 @@ msgstr ""
"å‘现é…ç½®å˜é‡ 'diff.dirstat' 中的错误:\n"
"%s"
-#: diff.c:3509
+#: diff.c:3495
#, c-format
msgid ""
"Failed to parse --dirstat/-X option parameter:\n"
@@ -474,7 +470,7 @@ msgstr ""
"æ— æ³•è§£æž --dirstat/-X 选项的å‚数:\n"
"%s"
-#: diff.c:3523
+#: diff.c:3509
#, c-format
msgid "Failed to parse --submodule option parameter: '%s'"
msgstr "æ— æ³•è§£æž --submodule 选项的å‚数:'%s'"
@@ -501,35 +497,35 @@ msgstr "ä¸èƒ½åˆ›å»ºä¸´æ—¶æ–‡ä»¶ '%s':%s"
msgid "failed writing detached signature to '%s': %s"
msgstr "无法将分离å¼ç­¾å写入 '%s':%s"
-#: grep.c:1695
+#: grep.c:1698
#, c-format
msgid "'%s': unable to read %s"
msgstr "'%s'ï¼šæ— æ³•è¯»å– %s"
-#: grep.c:1712
+#: grep.c:1715
#, c-format
msgid "'%s': %s"
msgstr "'%s':%s"
-#: grep.c:1723
+#: grep.c:1726
#, c-format
msgid "'%s': short read %s"
msgstr "'%s':读å–ä¸å®Œæ•´ %s"
-#: help.c:210
+#: help.c:209
#, c-format
msgid "available git commands in '%s'"
msgstr "在 '%s' 下å¯ç”¨çš„ git 命令"
-#: help.c:217
+#: help.c:216
msgid "git commands available from elsewhere on your $PATH"
msgstr "在 $PATH 路径中的其他地方å¯ç”¨çš„ git 命令"
-#: help.c:233
+#: help.c:232
msgid "The most commonly used git commands are:"
msgstr "最常用的 git 命令有:"
-#: help.c:290
+#: help.c:289
#, c-format
msgid ""
"'%s' appears to be a git command, but we were not\n"
@@ -538,11 +534,11 @@ msgstr ""
"'%s' åƒæ˜¯ä¸€ä¸ª git 命令,但å´æ— æ³•è¿è¡Œã€‚\n"
"å¯èƒ½æ˜¯ git-%s å—æŸï¼Ÿ"
-#: help.c:347
+#: help.c:346
msgid "Uh oh. Your system reports no Git commands at all."
msgstr "唉呀,您的系统中未å‘现 Git 命令。"
-#: help.c:369
+#: help.c:368
#, c-format
msgid ""
"WARNING: You called a Git command named '%s', which does not exist.\n"
@@ -551,17 +547,17 @@ msgstr ""
"警告:您è¿è¡Œä¸€ä¸ªä¸å­˜åœ¨çš„ Git 命令 '%s'。继续执行å‡å®šæ‚¨è¦è¦è¿è¡Œçš„\n"
"是 '%s'"
-#: help.c:374
+#: help.c:373
#, c-format
msgid "in %0.1f seconds automatically..."
msgstr "在 %0.1f 秒钟åŽè‡ªåŠ¨è¿è¡Œ..."
-#: help.c:381
+#: help.c:380
#, 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
+#: help.c:384 help.c:443
msgid ""
"\n"
"Did you mean this?"
@@ -575,7 +571,7 @@ msgstr[1] ""
"\n"
"您指的是这其中的æŸä¸€ä¸ªä¹ˆï¼Ÿ"
-#: help.c:440
+#: help.c:439
#, c-format
msgid "%s: %s - %s"
msgstr "%s:%s - %s"
@@ -584,7 +580,7 @@ msgstr "%s:%s - %s"
msgid "failed to read the cache"
msgstr "无法读å–缓存"
-#: merge.c:110 builtin/checkout.c:358 builtin/checkout.c:559
+#: merge.c:110 builtin/checkout.c:357 builtin/checkout.c:558
#: builtin/clone.c:661
msgid "unable to write new index file"
msgstr "无法写新的索引文件"
@@ -594,75 +590,73 @@ msgstr "无法写新的索引文件"
msgid "(bad commit)\n"
msgstr "(åæ交)\n"
-#: merge-recursive.c:206
+#: merge-recursive.c:208
#, c-format
msgid "addinfo_cache failed for path '%s'"
msgstr "为路径 '%s' addinfo_cache 失败"
-#: merge-recursive.c:269
+#: merge-recursive.c:271
msgid "error building trees"
msgstr "无法创建树"
-#: merge-recursive.c:673
+#: merge-recursive.c:675
#, c-format
msgid "failed to create path '%s'%s"
msgstr "无法创建路径 '%s'%s"
-#: merge-recursive.c:684
+#: merge-recursive.c:686
#, c-format
msgid "Removing %s to make room for subdirectory\n"
msgstr "删除 %s 以便为å­ç›®å½•ç•™å‡ºç©ºé—´\n"
-#. something else exists
-#. .. but not some other error (who really cares what?)
-#: merge-recursive.c:698 merge-recursive.c:719
+#: merge-recursive.c:700 merge-recursive.c:721
msgid ": perhaps a D/F conflict?"
msgstr ":å¯èƒ½æ˜¯ä¸€ä¸ªç›®å½•/文件冲çªï¼Ÿ"
-#: merge-recursive.c:709
+#: merge-recursive.c:711
#, c-format
msgid "refusing to lose untracked file at '%s'"
msgstr "æ‹’ç»ä¸¢å¼ƒ '%s' 中的未跟踪文件"
-#: merge-recursive.c:749
+#: merge-recursive.c:751
#, c-format
msgid "cannot read object %s '%s'"
msgstr "ä¸èƒ½è¯»å–对象 %s '%s'"
-#: merge-recursive.c:751
+#: merge-recursive.c:753
#, c-format
msgid "blob expected for %s '%s'"
msgstr "%s '%s' 应为数æ®ï¼ˆblob)对象"
-#: merge-recursive.c:774 builtin/clone.c:317
+#: merge-recursive.c:776 builtin/clone.c:317
#, c-format
msgid "failed to open '%s'"
msgstr "无法打开 '%s'"
-#: merge-recursive.c:782
+#: merge-recursive.c:784
#, c-format
msgid "failed to symlink '%s'"
msgstr "无法创建符å·é“¾æŽ¥ '%s'"
-#: merge-recursive.c:785
+#: merge-recursive.c:787
#, c-format
msgid "do not know what to do with %06o %s '%s'"
msgstr "ä¸çŸ¥é“å¦‚ä½•å¤„ç† %06o %s '%s'"
-#: merge-recursive.c:923
+#: merge-recursive.c:925
msgid "Failed to execute internal merge"
msgstr "无法执行内部åˆå¹¶"
-#: merge-recursive.c:927
+#: merge-recursive.c:929
#, c-format
msgid "Unable to add %s to database"
msgstr "ä¸èƒ½æ·»åŠ  %s 至对象库"
-#: merge-recursive.c:943
+#: merge-recursive.c:945
msgid "unsupported object type in the tree"
msgstr "在树中有ä¸æ”¯æŒçš„对象类型"
-#: merge-recursive.c:1022 merge-recursive.c:1036
+#: merge-recursive.c:1024 merge-recursive.c:1038
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -671,7 +665,7 @@ msgstr ""
"冲çªï¼ˆ%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 在 %6$s 中"
"的版本被ä¿ç•™ã€‚"
-#: merge-recursive.c:1028 merge-recursive.c:1041
+#: merge-recursive.c:1030 merge-recursive.c:1043
#, c-format
msgid ""
"CONFLICT (%s/delete): %s deleted in %s and %s in %s. Version %s of %s left "
@@ -680,20 +674,20 @@ msgstr ""
"冲çªï¼ˆ%1$s/删除):%2$s 在 %3$s 中被删除,在 %5$s 中被 %4$s。%7$s 在 %6$s 中"
"的版本ä¿ç•™äºŽ %8$s 中。"
-#: merge-recursive.c:1082
+#: merge-recursive.c:1084
msgid "rename"
msgstr "é‡å‘½å"
-#: merge-recursive.c:1082 wt-status.c:283
+#: merge-recursive.c:1084
msgid "renamed"
msgstr "é‡å‘½å"
-#: merge-recursive.c:1138
+#: merge-recursive.c:1140
#, c-format
msgid "%s is a directory in %s adding as %s instead"
msgstr "%s 是 %s 中的一个目录而以 %s 为å被添加"
-#: merge-recursive.c:1160
+#: merge-recursive.c:1162
#, c-format
msgid ""
"CONFLICT (rename/rename): Rename \"%s\"->\"%s\" in branch \"%s\" rename \"%s"
@@ -702,144 +696,144 @@ msgstr ""
"冲çªï¼ˆé‡å‘½å/é‡å‘½å):在分支 \"%3$s\" 中é‡å‘½å \"%1$s\"->\"%2$s\",在分支 "
"\"%6$s\" 中é‡å‘½å \"%4$s\"->\"%5$s\"%7$s"
-#: merge-recursive.c:1165
+#: merge-recursive.c:1167
msgid " (left unresolved)"
msgstr "(留下未解决)"
-#: merge-recursive.c:1219
+#: merge-recursive.c:1221
#, c-format
msgid "CONFLICT (rename/rename): Rename %s->%s in %s. Rename %s->%s in %s"
msgstr ""
"冲çªï¼ˆé‡å‘½å/é‡å‘½å):在 %3$s 中é‡å‘½å %1$s->%2$s,在 %6$s 中é‡å‘½å %4$s->"
"%5$s"
-#: merge-recursive.c:1249
+#: merge-recursive.c:1251
#, c-format
msgid "Renaming %s to %s and %s to %s instead"
msgstr "而是é‡å‘½å %s 至 %sï¼Œä»¥åŠ %s 至 %s"
-#: merge-recursive.c:1448
+#: merge-recursive.c:1450
#, c-format
msgid "CONFLICT (rename/add): Rename %s->%s in %s. %s added in %s"
msgstr "冲çªï¼ˆé‡å‘½å/添加):在 %3$s 中é‡å‘½å %1$s->%2$s。在 %5$s 中添加 %4$s"
-#: merge-recursive.c:1458
+#: merge-recursive.c:1460
#, c-format
msgid "Adding merged %s"
msgstr "添加åˆå¹¶åŽçš„ %s"
-#: merge-recursive.c:1463 merge-recursive.c:1661
+#: merge-recursive.c:1465 merge-recursive.c:1663
#, c-format
msgid "Adding as %s instead"
msgstr "而是以 %s 为å添加"
-#: merge-recursive.c:1514
+#: merge-recursive.c:1516
#, c-format
msgid "cannot read object %s"
msgstr "ä¸èƒ½è¯»å–对象 %s"
-#: merge-recursive.c:1517
+#: merge-recursive.c:1519
#, c-format
msgid "object %s is not a blob"
msgstr "对象 %s ä¸æ˜¯ä¸€ä¸ªæ•°æ®ï¼ˆblob)对象"
-#: merge-recursive.c:1565
+#: merge-recursive.c:1567
msgid "modify"
msgstr "修改"
-#: merge-recursive.c:1565 wt-status.c:281
+#: merge-recursive.c:1567
msgid "modified"
msgstr "修改"
-#: merge-recursive.c:1575
+#: merge-recursive.c:1577
msgid "content"
msgstr "内容"
-#: merge-recursive.c:1582
+#: merge-recursive.c:1584
msgid "add/add"
msgstr "添加/添加"
-#: merge-recursive.c:1616
+#: merge-recursive.c:1618
#, c-format
msgid "Skipped %s (merged same as existing)"
msgstr "略过 %s(已ç»åšè¿‡ç›¸åŒåˆå¹¶ï¼‰"
-#: merge-recursive.c:1630
+#: merge-recursive.c:1632
#, c-format
msgid "Auto-merging %s"
msgstr "自动åˆå¹¶ %s"
-#: merge-recursive.c:1634 git-submodule.sh:1148
+#: merge-recursive.c:1636 git-submodule.sh:1149
msgid "submodule"
msgstr "å­æ¨¡ç»„"
-#: merge-recursive.c:1635
+#: merge-recursive.c:1637
#, c-format
msgid "CONFLICT (%s): Merge conflict in %s"
msgstr "冲çªï¼ˆ%s):åˆå¹¶å†²çªäºŽ %s"
-#: merge-recursive.c:1725
+#: merge-recursive.c:1727
#, c-format
msgid "Removing %s"
msgstr "删除 %s"
-#: merge-recursive.c:1750
+#: merge-recursive.c:1752
msgid "file/directory"
msgstr "文件/目录"
-#: merge-recursive.c:1756
+#: merge-recursive.c:1758
msgid "directory/file"
msgstr "目录/文件"
-#: merge-recursive.c:1761
+#: merge-recursive.c:1763
#, c-format
msgid "CONFLICT (%s): There is a directory with name %s in %s. Adding %s as %s"
msgstr "冲çªï¼ˆ%1$s):在 %3$s 中有一个å为 %2$s 的目录。以 %5$s 为å添加 %4$s"
-#: merge-recursive.c:1771
+#: merge-recursive.c:1773
#, c-format
msgid "Adding %s"
msgstr "添加 %s"
-#: merge-recursive.c:1788
+#: merge-recursive.c:1790
msgid "Fatal merge failure, shouldn't happen."
msgstr "严é‡çš„åˆå¹¶é”™è¯¯ï¼Œä¸åº”å‘生。"
-#: merge-recursive.c:1807
+#: merge-recursive.c:1809
msgid "Already up-to-date!"
msgstr "å·²ç»æ˜¯æœ€æ–°çš„ï¼"
-#: merge-recursive.c:1816
+#: merge-recursive.c:1818
#, c-format
msgid "merging of trees %s and %s failed"
msgstr "无法åˆå¹¶æ ‘ %s å’Œ %s"
-#: merge-recursive.c:1846
+#: merge-recursive.c:1848
#, c-format
msgid "Unprocessed path??? %s"
msgstr "未处ç†çš„路径??? %s"
-#: merge-recursive.c:1891
+#: merge-recursive.c:1893
msgid "Merging:"
msgstr "åˆå¹¶ï¼š"
-#: merge-recursive.c:1904
+#: merge-recursive.c:1906
#, c-format
msgid "found %u common ancestor:"
msgid_plural "found %u common ancestors:"
msgstr[0] "å‘现 %u 个共åŒç¥–先:"
msgstr[1] "å‘现 %u 个共åŒç¥–先:"
-#: merge-recursive.c:1941
+#: merge-recursive.c:1943
msgid "merge returned no commit"
msgstr "åˆå¹¶æœªè¿”回æ交"
-#: merge-recursive.c:1998
+#: merge-recursive.c:2000
#, c-format
msgid "Could not parse object '%s'"
msgstr "ä¸èƒ½è§£æžå¯¹è±¡ '%s'"
-#: merge-recursive.c:2010 builtin/merge.c:665
+#: merge-recursive.c:2012 builtin/merge.c:668
msgid "Unable to write index."
msgstr "ä¸èƒ½å†™å…¥ç´¢å¼•ã€‚"
@@ -864,34 +858,34 @@ msgstr "æ‹’ç»å‘ %s(在 refs/notes/ 之外)写入注解"
msgid "Bad %s value: '%s'"
msgstr "åçš„ %s 值:'%s'"
-#: object.c:202
+#: object.c:229
#, c-format
msgid "unable to parse object: %s"
msgstr "ä¸èƒ½è§£æžå¯¹è±¡ï¼š%s"
-#: parse-options.c:537
+#: parse-options.c:532
msgid "..."
msgstr "..."
-#: parse-options.c:555
+#: parse-options.c:550
#, c-format
msgid "usage: %s"
msgstr "用法:%s"
#. TRANSLATORS: the colon here should align with the
#. one in "usage: %s" translation
-#: parse-options.c:559
+#: parse-options.c:554
#, c-format
msgid " or: %s"
msgstr " 或:%s"
# 译者:为ä¿è¯åœ¨è¾“出中对é½ï¼Œæ³¨æ„调整å¥ä¸­ç©ºæ ¼ï¼
-#: parse-options.c:562
+#: parse-options.c:557
#, c-format
msgid " %s"
msgstr " %s"
-#: parse-options.c:596
+#: parse-options.c:591
msgid "-NUM"
msgstr "-æ•°å­—"
@@ -939,11 +933,6 @@ msgstr "%s:'%s' 在版本库之外"
msgid "Pathspec '%s' is in submodule '%.*s'"
msgstr "路径规则 '%s' 在å­æ¨¡ç»„ '%.*s' 中"
-#.
-#. * We may want to substitute "this command" with a command
-#. * name. E.g. when add--interactive dies when running
-#. * "checkout -p"
-#.
#: pathspec.c:353
#, c-format
msgid "%s: pathspec magic not supported by this command: %s"
@@ -962,56 +951,73 @@ msgstr ""
"没有为 :(exclude) 模å¼æä¾›è¦å¿½ç•¥çš„内容。也许您忘记了\n"
"添加 ':/' 或 '.' ?"
-#: remote.c:753
+#: progress.c:224
+msgid "done"
+msgstr "完æˆ"
+
+#: read-cache.c:1238
+#, c-format
+msgid ""
+"index.version set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"设置了 index.version,但是å–值无效。\n"
+"使用版本 %i"
+
+#: read-cache.c:1248
+#, c-format
+msgid ""
+"GIT_INDEX_VERSION set, but the value is invalid.\n"
+"Using version %i"
+msgstr ""
+"设置了 GIT_INDEX_VERSION,但是å–值无效。\n"
+"使用版本 %i"
+
+#: remote.c:758
#, c-format
msgid "Cannot fetch both %s and %s to %s"
msgstr "ä¸èƒ½åŒæ—¶èŽ·å– %s å’Œ %s 至 %s"
-#: remote.c:757
+#: remote.c:762
#, c-format
msgid "%s usually tracks %s, not %s"
msgstr "%s 通常跟踪 %sï¼Œè€Œéž %s"
-#: remote.c:761
+#: remote.c:766
#, 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
+#: remote.c:774
msgid "Internal error"
msgstr "内部错误"
-#: remote.c:1871
+#: remote.c:1948
#, c-format
msgid "Your branch is based on '%s', but the upstream is gone.\n"
msgstr "您的分支基于 '%s',但此上游分支已ç»ä¸å­˜åœ¨ã€‚\n"
-#: remote.c:1875
+#: remote.c:1952
msgid " (use \"git branch --unset-upstream\" to fixup)\n"
msgstr " (使用 \"git branch --unset-upstream\" æ¥ä¿®å¤ï¼‰\n"
-#: remote.c:1878
+#: remote.c:1955
#, c-format
msgid "Your branch is up-to-date with '%s'.\n"
msgstr "您的分支与上游分支 '%s' 一致。\n"
-#: remote.c:1882
+#: remote.c:1959
#, c-format
msgid "Your branch is ahead of '%s' by %d commit.\n"
msgid_plural "Your branch is ahead of '%s' by %d commits.\n"
msgstr[0] "您的分支领先 '%s' å…± %d 个æ交。\n"
msgstr[1] "您的分支领先 '%s' å…± %d 个æ交。\n"
-#: remote.c:1888
+#: remote.c:1965
msgid " (use \"git push\" to publish your local commits)\n"
msgstr " (使用 \"git push\" æ¥å‘布您的本地æ交)\n"
-#: remote.c:1891
+#: remote.c:1968
#, c-format
msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n"
msgid_plural ""
@@ -1020,11 +1026,11 @@ msgstr[0] "您的分支è½åŽ '%s' å…± %d 个æ交,并且å¯ä»¥å¿«è¿›ã€‚\n"
msgstr[1] "您的分支è½åŽ '%s' å…± %d 个æ交,并且å¯ä»¥å¿«è¿›ã€‚\n"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: remote.c:1899
+#: remote.c:1976
msgid " (use \"git pull\" to update your local branch)\n"
msgstr " (使用 \"git pull\" æ¥æ›´æ–°æ‚¨çš„本地分支)\n"
-#: remote.c:1902
+#: remote.c:1979
#, c-format
msgid ""
"Your branch and '%s' have diverged,\n"
@@ -1040,7 +1046,7 @@ msgstr[1] ""
"并且分别有 %d å’Œ %d 处ä¸åŒçš„æ交。\n"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: remote.c:1912
+#: remote.c:1989
msgid " (use \"git pull\" to merge the remote branch into yours)\n"
msgstr " (使用 \"git pull\" æ¥åˆå¹¶è¿œç¨‹åˆ†æ”¯ï¼‰\n"
@@ -1053,14 +1059,14 @@ msgstr "ä¸èƒ½æ‰“å¼€ /dev/null"
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
+#: sequencer.c:206 builtin/merge.c:786 builtin/merge.c:899
+#: builtin/merge.c:1009 builtin/merge.c:1019
#, c-format
msgid "Could not open '%s' for writing"
msgstr "ä¸èƒ½ä¸ºå†™å…¥æ‰“å¼€ '%s'"
-#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:786
-#: builtin/merge.c:1008 builtin/merge.c:1021
+#: sequencer.c:208 builtin/merge.c:343 builtin/merge.c:789
+#: builtin/merge.c:1011 builtin/merge.c:1024
#, c-format
msgid "Could not write to '%s'"
msgstr "ä¸èƒ½å†™å…¥ '%s'"
@@ -1082,7 +1088,7 @@ msgstr ""
"冲çªè§£å†³å®Œæ¯•åŽï¼Œç”¨ 'git add <paths>' 或 'git rm <paths>'\n"
"对修正åŽçš„文件åšæ ‡è®°ï¼Œç„¶åŽç”¨ 'git commit' æ交"
-#: sequencer.c:245 sequencer.c:870 sequencer.c:953
+#: sequencer.c:245 sequencer.c:879 sequencer.c:962
#, c-format
msgid "Could not write to %s"
msgstr "ä¸èƒ½å†™å…¥ %s"
@@ -1118,184 +1124,184 @@ msgstr "ä¸èƒ½è§£æž HEAD æ交\n"
msgid "Unable to update cache tree\n"
msgstr "ä¸èƒ½æ›´æ–°ç¼“å­˜\n"
-#: sequencer.c:423
+#: sequencer.c:430
#, c-format
msgid "Could not parse commit %s\n"
msgstr "ä¸èƒ½è§£æžæ交 %s\n"
-#: sequencer.c:428
+#: sequencer.c:435
#, c-format
msgid "Could not parse parent commit %s\n"
msgstr "ä¸èƒ½è§£æžçˆ¶æ交 %s\n"
-#: sequencer.c:494
+#: sequencer.c:501
msgid "Your index file is unmerged."
msgstr "您的索引文件未完æˆåˆå¹¶ã€‚"
-#: sequencer.c:513
+#: sequencer.c:520
#, c-format
msgid "Commit %s is a merge but no -m option was given."
msgstr "æ交 %s 是一个åˆå¹¶æ交但未æä¾› -m 选项。"
-#: sequencer.c:521
+#: sequencer.c:528
#, c-format
msgid "Commit %s does not have parent %d"
msgstr "æ交 %s 没有父æ交 %d"
-#: sequencer.c:525
+#: sequencer.c:532
#, c-format
msgid "Mainline was specified but commit %s is not a merge."
msgstr "指定了主线但æ交 %s ä¸æ˜¯ä¸€ä¸ªåˆå¹¶ã€‚"
#. TRANSLATORS: The first %s will be "revert" or
#. "cherry-pick", the second %s a SHA1
-#: sequencer.c:538
+#: sequencer.c:545
#, c-format
msgid "%s: cannot parse parent commit %s"
msgstr "%s:ä¸èƒ½è§£æžçˆ¶æ交 %s"
-#: sequencer.c:542
+#: sequencer.c:549
#, c-format
msgid "Cannot get commit message for %s"
msgstr "ä¸èƒ½å¾—到 %s çš„æ交说明"
-#: sequencer.c:628
+#: sequencer.c:635
#, c-format
msgid "could not revert %s... %s"
msgstr "ä¸èƒ½è¿˜åŽŸ %s... %s"
-#: sequencer.c:629
+#: sequencer.c:636
#, c-format
msgid "could not apply %s... %s"
msgstr "ä¸èƒ½åº”用 %s... %s"
-#: sequencer.c:665
+#: sequencer.c:672
msgid "empty commit set passed"
msgstr "æ供了空的æ交集"
-#: sequencer.c:673
+#: sequencer.c:680
#, c-format
msgid "git %s: failed to read the index"
msgstr "git %s:无法读å–索引"
-#: sequencer.c:678
+#: sequencer.c:685
#, c-format
msgid "git %s: failed to refresh the index"
msgstr "git %s:无法刷新索引"
-#: sequencer.c:736
+#: sequencer.c:743
#, c-format
msgid "Cannot %s during a %s"
msgstr "无法 %s 在一个 %s 过程中"
-#: sequencer.c:758
+#: sequencer.c:765
#, c-format
msgid "Could not parse line %d."
msgstr "ä¸èƒ½è§£æžç¬¬ %d 行。"
-#: sequencer.c:763
+#: sequencer.c:770
msgid "No commits parsed."
msgstr "没有æ交被解æžã€‚"
-#: sequencer.c:776
+#: sequencer.c:783
#, c-format
msgid "Could not open %s"
msgstr "ä¸èƒ½æ‰“å¼€ %s"
-#: sequencer.c:780
+#: sequencer.c:787
#, c-format
msgid "Could not read %s."
msgstr "ä¸èƒ½è¯»å– %s。"
-#: sequencer.c:787
+#: sequencer.c:794
#, c-format
msgid "Unusable instruction sheet: %s"
msgstr "无用的指令表å•ï¼š%s"
-#: sequencer.c:815
+#: sequencer.c:824
#, c-format
msgid "Invalid key: %s"
msgstr "无效键å:%s"
-#: sequencer.c:818
+#: sequencer.c:827
#, c-format
msgid "Invalid value for %s: %s"
msgstr "%s 的值无效:%s"
-#: sequencer.c:830
+#: sequencer.c:839
#, c-format
msgid "Malformed options sheet: %s"
msgstr "éžæ³•çš„选项表å•ï¼š%s"
-#: sequencer.c:851
+#: sequencer.c:860
msgid "a cherry-pick or revert is already in progress"
msgstr "一个拣选或还原æ“作已在进行"
-#: sequencer.c:852
+#: sequencer.c:861
msgid "try \"git cherry-pick (--continue | --quit | --abort)\""
msgstr "å°è¯• \"git cherry-pick (--continue | --quit | --abort)\""
-#: sequencer.c:856
+#: sequencer.c:865
#, c-format
msgid "Could not create sequencer directory %s"
msgstr "ä¸èƒ½åˆ›å»ºåºåˆ—目录 %s"
-#: sequencer.c:872 sequencer.c:957
+#: sequencer.c:881 sequencer.c:966
#, c-format
msgid "Error wrapping up %s."
msgstr "错误收尾 %s。"
-#: sequencer.c:891 sequencer.c:1025
+#: sequencer.c:900 sequencer.c:1036
msgid "no cherry-pick or revert in progress"
msgstr "拣选或还原æ“作并未进行"
-#: sequencer.c:893
+#: sequencer.c:902
msgid "cannot resolve HEAD"
msgstr "ä¸èƒ½è§£æž HEAD"
-#: sequencer.c:895
+#: sequencer.c:904
msgid "cannot abort from a branch yet to be born"
msgstr "ä¸èƒ½ä»Žå°šæœªå»ºç«‹çš„分支终止"
-#: sequencer.c:917 builtin/apply.c:4061
+#: sequencer.c:926 builtin/apply.c:4061
#, c-format
msgid "cannot open %s: %s"
msgstr "ä¸èƒ½æ‰“å¼€ %s:%s"
-#: sequencer.c:920
+#: sequencer.c:929
#, c-format
msgid "cannot read %s: %s"
msgstr "ä¸èƒ½è¯»å– %s:%s"
-#: sequencer.c:921
+#: sequencer.c:930
msgid "unexpected end of file"
msgstr "æ„外的文件结æŸ"
-#: sequencer.c:927
+#: sequencer.c:936
#, c-format
msgid "stored pre-cherry-pick HEAD file '%s' is corrupt"
msgstr "ä¿å­˜æ‹£é€‰æ交å‰çš„ HEAD 文件 '%s' æŸå"
-#: sequencer.c:950
+#: sequencer.c:959
#, c-format
msgid "Could not format %s."
msgstr "ä¸èƒ½æ ¼å¼åŒ– %s。"
-#: sequencer.c:1093
+#: sequencer.c:1104
#, c-format
msgid "%s: can't cherry-pick a %s"
msgstr "%s:ä¸èƒ½æ‹£é€‰ä¸€ä¸ª%s"
-#: sequencer.c:1096
+#: sequencer.c:1107
#, c-format
msgid "%s: bad revision"
msgstr "%s:错误的版本"
-#: sequencer.c:1130
+#: sequencer.c:1141
msgid "Can't revert as initial commit"
msgstr "ä¸èƒ½ä½œä¸ºåˆå§‹æ交还原"
-#: sequencer.c:1131
+#: sequencer.c:1142
msgid "Can't cherry-pick into empty head"
msgstr "ä¸èƒ½æ‹£é€‰åˆ°ç©ºåˆ†æ”¯"
@@ -1320,21 +1326,21 @@ msgstr ""
"å¯èƒ½éœ€è¦åˆ é™¤å®ƒä»¬ã€‚用 \"git config advice.objectNameWarning false\"\n"
"命令关闭本消æ¯é€šçŸ¥ã€‚"
-#: sha1_name.c:1070
+#: sha1_name.c:1072
msgid "HEAD does not point to a branch"
msgstr "HEAD 没有指å‘一个分支"
-#: sha1_name.c:1073
+#: sha1_name.c:1075
#, c-format
msgid "No such branch: '%s'"
msgstr "没有此分支:'%s'"
-#: sha1_name.c:1075
+#: sha1_name.c:1077
#, c-format
msgid "No upstream configured for branch '%s'"
msgstr "尚未给分支 '%s' 设置上游"
-#: sha1_name.c:1079
+#: sha1_name.c:1081
#, c-format
msgid "Upstream branch '%s' not stored as a remote-tracking branch"
msgstr "上游分支 '%s' 没有存储为一个远程跟踪分支"
@@ -1348,52 +1354,34 @@ msgstr "无法修改未åˆå¹¶çš„ .gitmodules,先解决åˆå¹¶å†²çª"
msgid "Could not find section in .gitmodules where path=%s"
msgstr "无法在 .gitmodules 中找到 path=%s çš„å°èŠ‚"
-#. Maybe the user already did that, don't error out here
#: submodule.c:76
#, c-format
msgid "Could not update .gitmodules entry %s"
msgstr "ä¸èƒ½æ›´æ–° .gitmodules æ¡ç›® %s"
-#. Maybe the user already did that, don't error out here
#: submodule.c:109
#, c-format
msgid "Could not remove .gitmodules entry for %s"
msgstr "无法移除 %s çš„ .gitmodules æ¡ç›®"
-#: submodule.c:127
-msgid "could not find .gitmodules in index"
-msgstr "无法在索引中找到 .gitmodules"
-
-#: submodule.c:133
-msgid "reading updated .gitmodules failed"
-msgstr "读å–æ›´æ–°åŽçš„ .gitmodules 失败"
-
-#: submodule.c:135
-msgid "unable to stat updated .gitmodules"
-msgstr "ä¸èƒ½æžšä¸¾æ›´æ–°åŽçš„ .gitmodules"
-
-#: submodule.c:139
-msgid "unable to remove .gitmodules from index"
-msgstr "ä¸èƒ½ä»Žç´¢å¼•ä¸­ç§»é™¤ .gitmodules"
-
-#: submodule.c:141
-msgid "adding updated .gitmodules failed"
-msgstr "添加更新åŽçš„ .gitmodules 失败"
-
-#: submodule.c:143
+#: submodule.c:120
msgid "staging updated .gitmodules failed"
msgstr "å°†æ›´æ–°åŽ .gitmodules 添加暂存区失败"
-#: submodule.c:1144 builtin/init-db.c:363
+#: submodule.c:1121 builtin/init-db.c:363
#, c-format
msgid "Could not create git link %s"
msgstr "ä¸èƒ½åˆ›å»º git link %s"
-#: submodule.c:1155
+#: submodule.c:1132
#, c-format
msgid "Could not set core.worktree in %s"
msgstr "ä¸èƒ½åœ¨ %s 中设置 core.worktree"
+#: unpack-trees.c:206
+msgid "Checking out files"
+msgstr "正在检出文件"
+
#: urlmatch.c:120
msgid "invalid URL scheme name or missing '://' suffix"
msgstr "无效的 URL 方案å称或丢失 '://' åŽç¼€"
@@ -1507,94 +1495,100 @@ msgstr " (æ交或丢弃å­æ¨¡ç»„中未跟踪或修改的内容)"
msgid " (use \"git %s <file>...\" to include in what will be committed)"
msgstr " (使用 \"git %s <file>...\" 以包å«è¦æ交的内容)"
-#: wt-status.c:254
-msgid "bug"
-msgstr "bug"
-
-#: wt-status.c:259
+#: wt-status.c:252
msgid "both deleted:"
msgstr "åŒæ–¹åˆ é™¤ï¼š"
-#: wt-status.c:260
+#: wt-status.c:254
msgid "added by us:"
msgstr "由我们添加:"
-#: wt-status.c:261
+#: wt-status.c:256
msgid "deleted by them:"
msgstr "由他们删除:"
-#: wt-status.c:262
+#: wt-status.c:258
msgid "added by them:"
msgstr "由他们添加:"
-#: wt-status.c:263
+#: wt-status.c:260
msgid "deleted by us:"
msgstr "由我们删除:"
-#: wt-status.c:264
+#: wt-status.c:262
msgid "both added:"
msgstr "åŒæ–¹æ·»åŠ ï¼š"
-#: wt-status.c:265
+#: wt-status.c:264
msgid "both modified:"
msgstr "åŒæ–¹ä¿®æ”¹ï¼š"
-# 译者:为ä¿è¯åœ¨è¾“出中对é½ï¼Œæ³¨æ„调整å¥ä¸­ç©ºæ ¼ï¼
-#: wt-status.c:275
-msgid "new file"
-msgstr "新文件"
+#: wt-status.c:266
+#, c-format
+msgid "bug: unhandled unmerged status %x"
+msgstr "bug:无法处ç†çš„未åˆå¹¶çŠ¶æ€ %x"
-#: wt-status.c:277
-msgid "copied"
-msgstr "æ‹·è´"
+#: wt-status.c:274
+msgid "new file:"
+msgstr "新文件:"
-#: wt-status.c:279
-msgid "deleted"
-msgstr "删除"
+#: wt-status.c:276
+msgid "copied:"
+msgstr "æ‹·è´ï¼š"
-# 译者:为ä¿è¯åœ¨è¾“出中对é½ï¼Œæ³¨æ„调整å¥ä¸­ç©ºæ ¼ï¼
-#: wt-status.c:285
-msgid "typechange"
-msgstr "类型å˜æ›´"
+#: wt-status.c:278
+msgid "deleted:"
+msgstr "删除:"
-# 译者:为ä¿è¯åœ¨è¾“出中对é½ï¼Œæ³¨æ„调整å¥ä¸­ç©ºæ ¼ï¼
-#: wt-status.c:287
-msgid "unknown"
-msgstr "未知"
+#: wt-status.c:280
+msgid "modified:"
+msgstr "修改:"
+
+#: wt-status.c:282
+msgid "renamed:"
+msgstr "é‡å‘½å:"
+
+#: wt-status.c:284
+msgid "typechange:"
+msgstr "类型å˜æ›´ï¼š"
+
+#: wt-status.c:286
+msgid "unknown:"
+msgstr "未知:"
-#: wt-status.c:289
-msgid "unmerged"
-msgstr "未åˆå¹¶"
+#: wt-status.c:288
+msgid "unmerged:"
+msgstr "未åˆå¹¶ï¼š"
# 译者:末尾两个字节å¯èƒ½è¢«åˆ å‡ï¼Œå¦‚果翻译为中文标点会出现åŠä¸ªæ±‰å­—
-#: wt-status.c:336
+#: wt-status.c:370
msgid "new commits, "
msgstr "æ–°æ交, "
# 译者:末尾两个字节å¯èƒ½è¢«åˆ å‡ï¼Œå¦‚果翻译为中文标点会出现åŠä¸ªæ±‰å­—
-#: wt-status.c:338
+#: wt-status.c:372
msgid "modified content, "
msgstr "修改的内容, "
# 译者:末尾两个字节å¯èƒ½è¢«åˆ å‡ï¼Œå¦‚果翻译为中文标点会出现åŠä¸ªæ±‰å­—
-#: wt-status.c:340
+#: wt-status.c:374
msgid "untracked content, "
msgstr "未跟踪的内容, "
-#: wt-status.c:357
+#: wt-status.c:391
#, c-format
msgid "bug: unhandled diff status %c"
-msgstr "bug:未处ç†çš„å·®å¼‚çŠ¶æ€ %c"
+msgstr "bug:无法处ç†çš„å·®å¼‚çŠ¶æ€ %c"
-#: wt-status.c:732
+#: wt-status.c:765
msgid "Submodules changed but not updated:"
msgstr "å­æ¨¡ç»„已修改但尚未更新:"
-#: wt-status.c:734
+#: wt-status.c:767
msgid "Submodule changes to be committed:"
msgstr "è¦æ交的å­æ¨¡ç»„å˜æ›´ï¼š"
-#: wt-status.c:836
+#: wt-status.c:846
msgid ""
"Do not touch the line above.\n"
"Everything below will be removed."
@@ -1602,198 +1596,198 @@ msgstr ""
"ä¸è¦æ”¹åŠ¨ä¸Šé¢çš„一行。\n"
"下é¢çš„所有内容å‡å°†è¢«åˆ é™¤ã€‚"
-#: wt-status.c:899
+#: wt-status.c:937
msgid "You have unmerged paths."
msgstr "您有尚未åˆå¹¶çš„路径。"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:902
+#: wt-status.c:940
msgid " (fix conflicts and run \"git commit\")"
msgstr " (解决冲çªå¹¶è¿è¡Œ \"git commit\")"
-#: wt-status.c:905
+#: wt-status.c:943
msgid "All conflicts fixed but you are still merging."
msgstr "所有冲çªå·²è§£å†³ä½†æ‚¨ä»å¤„于åˆå¹¶ä¸­ã€‚"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:908
+#: wt-status.c:946
msgid " (use \"git commit\" to conclude merge)"
msgstr " (使用 \"git commit\" 结æŸåˆå¹¶ï¼‰"
-#: wt-status.c:918
+#: wt-status.c:956
msgid "You are in the middle of an am session."
msgstr "您正处于 am æ“作过程中。"
-#: wt-status.c:921
+#: wt-status.c:959
msgid "The current patch is empty."
msgstr "当å‰çš„è¡¥ä¸ä¸ºç©ºã€‚"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:925
+#: wt-status.c:963
msgid " (fix conflicts and then run \"git am --continue\")"
msgstr " (解决冲çªï¼Œç„¶åŽè¿è¡Œ \"git am --continue\")"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:927
+#: wt-status.c:965
msgid " (use \"git am --skip\" to skip this patch)"
msgstr " (使用 \"git am --skip\" 跳过此补ä¸ï¼‰"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:929
+#: wt-status.c:967
msgid " (use \"git am --abort\" to restore the original branch)"
msgstr " (使用 \"git am --abort\" æ¢å¤åŽŸæœ‰åˆ†æ”¯ï¼‰"
-#: wt-status.c:989 wt-status.c:1006
+#: wt-status.c:1027 wt-status.c:1044
#, c-format
msgid "You are currently rebasing branch '%s' on '%s'."
msgstr "您在执行将分支 '%s' å˜åŸºåˆ° '%s' çš„æ“作。"
-#: wt-status.c:994 wt-status.c:1011
+#: wt-status.c:1032 wt-status.c:1049
msgid "You are currently rebasing."
msgstr "您在执行å˜åŸºæ“作。"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:997
+#: wt-status.c:1035
msgid " (fix conflicts and then run \"git rebase --continue\")"
msgstr " (解决冲çªï¼Œç„¶åŽè¿è¡Œ \"git rebase --continue\")"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:999
+#: wt-status.c:1037
msgid " (use \"git rebase --skip\" to skip this patch)"
msgstr " (使用 \"git rebase --skip\" 跳过此补ä¸ï¼‰"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:1001
+#: wt-status.c:1039
msgid " (use \"git rebase --abort\" to check out the original branch)"
msgstr " (使用 \"git rebase --abort\" 以检出原有分支)"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:1014
+#: wt-status.c:1052
msgid " (all conflicts fixed: run \"git rebase --continue\")"
msgstr " (所有冲çªå·²è§£å†³ï¼šè¿è¡Œ \"git rebase --continue\")"
-#: wt-status.c:1018
+#: wt-status.c:1056
#, c-format
msgid ""
"You are currently splitting a commit while rebasing branch '%s' on '%s'."
msgstr "您在执行将分支 '%s' å˜åŸºåˆ° '%s' çš„æ“作时拆分æ交。"
-#: wt-status.c:1023
+#: wt-status.c:1061
msgid "You are currently splitting a commit during a rebase."
msgstr "您在执行å˜åŸºæ“作时拆分æ交。"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:1026
+#: wt-status.c:1064
msgid " (Once your working directory is clean, run \"git rebase --continue\")"
msgstr " (一旦您工作目录æ交干净åŽï¼Œè¿è¡Œ \"git rebase --continue\")"
-#: wt-status.c:1030
+#: wt-status.c:1068
#, c-format
msgid "You are currently editing a commit while rebasing branch '%s' on '%s'."
msgstr "您在执行将分支 '%s' å˜åŸºåˆ° '%s' çš„æ“作时编辑æ交。"
-#: wt-status.c:1035
+#: wt-status.c:1073
msgid "You are currently editing a commit during a rebase."
msgstr "您在执行å˜åŸºæ“作时编辑æ交。"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:1038
+#: wt-status.c:1076
msgid " (use \"git commit --amend\" to amend the current commit)"
msgstr " (使用 \"git commit --amend\" 修补当å‰æ交)"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:1040
+#: wt-status.c:1078
msgid ""
" (use \"git rebase --continue\" once you are satisfied with your changes)"
msgstr " (当您对您的修改满æ„åŽæ‰§è¡Œ \"git rebase --continue\")"
-#: wt-status.c:1050
+#: wt-status.c:1088
#, c-format
msgid "You are currently cherry-picking commit %s."
msgstr "您在执行拣选æ交 %s çš„æ“作。"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:1055
+#: wt-status.c:1093
msgid " (fix conflicts and run \"git cherry-pick --continue\")"
msgstr " (解决冲çªå¹¶è¿è¡Œ \"git cherry-pick --continue\")"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:1058
+#: wt-status.c:1096
msgid " (all conflicts fixed: run \"git cherry-pick --continue\")"
msgstr " (所有冲çªå·²è§£å†³ï¼šè¿è¡Œ \"git cherry-pick --continue\")"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:1060
+#: wt-status.c:1098
msgid " (use \"git cherry-pick --abort\" to cancel the cherry-pick operation)"
msgstr " (使用 \"git cherry-pick --abort\" 以å–消拣选æ“作)"
-#: wt-status.c:1069
+#: wt-status.c:1107
#, c-format
msgid "You are currently reverting commit %s."
msgstr "您在执行å转æ交 %s çš„æ“作。"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:1074
+#: wt-status.c:1112
msgid " (fix conflicts and run \"git revert --continue\")"
msgstr " (解决冲çªå¹¶è¿è¡Œ \"git revert --continue\")"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:1077
+#: wt-status.c:1115
msgid " (all conflicts fixed: run \"git revert --continue\")"
msgstr " (所有冲çªå·²è§£å†³ï¼šè¿è¡Œ \"git revert --continue\")"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:1079
+#: wt-status.c:1117
msgid " (use \"git revert --abort\" to cancel the revert operation)"
msgstr " (使用 \"git revert --abort\" 以å–消å转æ交æ“作)"
-#: wt-status.c:1090
+#: wt-status.c:1128
#, c-format
msgid "You are currently bisecting, started from branch '%s'."
msgstr "您在执行从分支 '%s' 开始的二分查找æ“作。"
-#: wt-status.c:1094
+#: wt-status.c:1132
msgid "You are currently bisecting."
msgstr "您在执行二分查找æ“作。"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: wt-status.c:1097
+#: wt-status.c:1135
msgid " (use \"git bisect reset\" to get back to the original branch)"
msgstr " (使用 \"git bisect reset\" 以回到原有分支)"
-#: wt-status.c:1272
+#: wt-status.c:1310
msgid "On branch "
msgstr "ä½äºŽåˆ†æ”¯ "
-#: wt-status.c:1279
+#: wt-status.c:1317
msgid "rebase in progress; onto "
msgstr "å˜åŸºæ“作正在进行中;至 "
-#: wt-status.c:1286
+#: wt-status.c:1324
msgid "HEAD detached at "
msgstr "头指针分离于 "
-#: wt-status.c:1288
+#: wt-status.c:1326
msgid "HEAD detached from "
msgstr "头指针分离自 "
-#: wt-status.c:1291
+#: wt-status.c:1329
msgid "Not currently on any branch."
msgstr "当å‰ä¸åœ¨ä»»ä½•åˆ†æ”¯ä¸Šã€‚"
-#: wt-status.c:1308
+#: wt-status.c:1346
msgid "Initial commit"
msgstr "åˆå§‹æ交"
-#: wt-status.c:1322
+#: wt-status.c:1360
msgid "Untracked files"
msgstr "未跟踪的文件"
-#: wt-status.c:1324
+#: wt-status.c:1362
msgid "Ignored files"
msgstr "忽略的文件"
-#: wt-status.c:1328
+#: wt-status.c:1366
#, c-format
msgid ""
"It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
@@ -1803,316 +1797,234 @@ msgstr ""
"耗费了 %.2f 秒以枚举未跟踪的文件。'status -uno' 也许能æ高速度,\n"
"但您需è¦å°å¿ƒä¸è¦å¿˜äº†æ·»åŠ æ–°æ–‡ä»¶ï¼ˆå‚è§ 'git help status')。"
-#: wt-status.c:1334
+#: wt-status.c:1372
#, c-format
msgid "Untracked files not listed%s"
msgstr "未跟踪的文件没有列出%s"
# 译者:中文字符串拼接,å¯åˆ é™¤å‰å¯¼ç©ºæ ¼
-#: wt-status.c:1336
+#: wt-status.c:1374
msgid " (use -u option to show untracked files)"
msgstr "(使用 -u å‚数显示未跟踪的文件)"
-#: wt-status.c:1342
+#: wt-status.c:1380
msgid "No changes"
msgstr "没有修改"
-#: wt-status.c:1347
+#: wt-status.c:1385
#, c-format
msgid "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n"
msgstr "修改尚未加入æ交(使用 \"git add\" å’Œ/或 \"git commit -a\")\n"
-#: wt-status.c:1350
+#: wt-status.c:1388
#, c-format
msgid "no changes added to commit\n"
msgstr "修改尚未加入æ交\n"
-#: wt-status.c:1353
+#: wt-status.c:1391
#, c-format
msgid ""
"nothing added to commit but untracked files present (use \"git add\" to "
"track)\n"
msgstr "æ交为空,但是存在尚未跟踪的文件(使用 \"git add\" 建立跟踪)\n"
-#: wt-status.c:1356
+#: wt-status.c:1394
#, c-format
msgid "nothing added to commit but untracked files present\n"
msgstr "æ交为空,但是存在尚未跟踪的文件\n"
# 译者:中文字符串拼接,å¯åˆ é™¤å‰å¯¼ç©ºæ ¼
-#: wt-status.c:1359
+#: wt-status.c:1397
#, c-format
msgid "nothing to commit (create/copy files and use \"git add\" to track)\n"
msgstr "无文件è¦æ交(创建/æ‹·è´æ–‡ä»¶å¹¶ä½¿ç”¨ \"git add\" 建立跟踪)\n"
-#: wt-status.c:1362 wt-status.c:1367
+#: wt-status.c:1400 wt-status.c:1405
#, c-format
msgid "nothing to commit\n"
msgstr "无文件è¦æ交\n"
# 译者:中文字符串拼接,å¯åˆ é™¤å‰å¯¼ç©ºæ ¼
-#: wt-status.c:1365
+#: wt-status.c:1403
#, c-format
msgid "nothing to commit (use -u to show untracked files)\n"
msgstr "无文件è¦æ交(使用 -u 显示未跟踪的文件)\n"
# 译者:中文字符串拼接,å¯åˆ é™¤å‰å¯¼ç©ºæ ¼
-#: wt-status.c:1369
+#: wt-status.c:1407
#, c-format
msgid "nothing to commit, working directory clean\n"
msgstr "无文件è¦æ交,干净的工作区\n"
-#: wt-status.c:1478
+#: wt-status.c:1516
msgid "HEAD (no branch)"
msgstr "HEAD(éžåˆ†æ”¯ï¼‰"
# 译者:注æ„ä¿æŒå¥å°¾ç©ºæ ¼
-#: wt-status.c:1484
+#: wt-status.c:1522
msgid "Initial commit on "
msgstr "åˆå§‹æ交于 "
-#: wt-status.c:1514
+#: wt-status.c:1554
msgid "gone"
msgstr "丢失"
# 译者:注æ„ä¿æŒå¥å°¾ç©ºæ ¼
-#: wt-status.c:1516
+#: wt-status.c:1556 wt-status.c:1564
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 "无法删除 '%s'"
-#: builtin/add.c:20
+#: builtin/add.c:21
msgid "git add [options] [--] <pathspec>..."
msgstr "git add [选项] [--] <路径规则>..."
-# 译者:字符串首行行首è¦æ·»åŠ â€œwarning: â€å­—串,故此首行è¦è¾ƒå…¶ä½™è¡ŒçŸ­
-#.
-#. * 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 ""
-"在 Git 2.0 版本,ä½äºŽä¸€ä¸ªå­ç›®å½•ä¸‹ä¸å¸¦ä»»ä½•è·¯å¾„å‚数地执行命令\n"
-"'git add %s (或 %s)' 的行为将被改å˜ï¼Œä¸è¦å†ç»§ç»­ä½¿ç”¨äº†ã€‚\n"
-"如果è¦æ·»åŠ æ•´ä¸ªç›®å½•æ ‘的内容,执行:\n"
-"\n"
-" git add %s :/\n"
-" (或 git add %s :/)\n"
-"\n"
-"如果è¦é™åˆ¶è¯¥å‘½ä»¤åªä½œç”¨äºŽå½“å‰ç›®å½•ï¼Œæ‰§è¡Œï¼š\n"
-"\n"
-" git add %s .\n"
-" (或 git add %s .)\n"
-"\n"
-"对于当å‰ç‰ˆæœ¬çš„ Git,这æ¡å‘½ä»¤åªä½œç”¨äºŽå½“å‰ç›®å½•ã€‚\n"
-
-#: 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 ""
-"您在è¿è¡Œ 'git add' 时没有指定 '-A (--all)' 或 '--ignore-removal',\n"
-"针对其中本地移除路径的行为将在 Git 2.0 版本库å‘生å˜åŒ–。\n"
-"åƒæœ¬åœ°å·¥ä½œåŒºç§»é™¤çš„路径 '%s'\n"
-"在此版本的 Git 中被忽略。\n"
-"\n"
-"* 'git add --ignore-removal <路径规则>',是当å‰ç‰ˆæœ¬çš„默认æ“作,\n"
-" 忽略您本地工作区中移除的文件。\n"
-"\n"
-"* 'git add --all <路径规则>' 将让您åŒæ—¶å¯¹åˆ é™¤æ“作进行记录。\n"
-"\n"
-"è¿è¡Œ 'git status' æ¥æ£€æŸ¥æ‚¨æœ¬åœ°å·¥ä½œåŒºä¸­ç§»é™¤çš„路径。\n"
-
-#: builtin/add.c:144
+#: builtin/add.c:64
#, c-format
msgid "unexpected diff status %c"
msgstr "æ„å¤–çš„å·®å¼‚çŠ¶æ€ %c"
-#: builtin/add.c:149 builtin/commit.c:260
+#: builtin/add.c:69 builtin/commit.c:261
msgid "updating files failed"
msgstr "更新文件失败"
-#: builtin/add.c:163
+#: builtin/add.c:79
#, c-format
msgid "remove '%s'\n"
msgstr "删除 '%s'\n"
-#: builtin/add.c:237
+#: builtin/add.c:133
msgid "Unstaged changes after refreshing the index:"
msgstr "刷新索引之åŽå°šæœªè¢«æš‚存的å˜æ›´ï¼š"
-#: builtin/add.c:299
+#: builtin/add.c:193
msgid "Could not read the index"
msgstr "ä¸èƒ½è¯»å–索引"
-#: builtin/add.c:310
+#: builtin/add.c:204
#, c-format
msgid "Could not open '%s' for writing."
msgstr "ä¸èƒ½æ‰“å¼€ '%s' 以写入。"
-#: builtin/add.c:314
+#: builtin/add.c:208
msgid "Could not write patch"
msgstr "ä¸èƒ½ç”Ÿæˆè¡¥ä¸"
-#: builtin/add.c:319
+#: builtin/add.c:213
#, c-format
msgid "Could not stat '%s'"
msgstr "ä¸èƒ½æŸ¥çœ‹æ–‡ä»¶çŠ¶æ€ '%s'"
-#: builtin/add.c:321
+#: builtin/add.c:215
msgid "Empty patch. Aborted."
msgstr "空补ä¸ã€‚异常终止。"
-#: builtin/add.c:327
+#: builtin/add.c:221
#, c-format
msgid "Could not apply '%s'"
msgstr "ä¸èƒ½åº”用 '%s'"
-#: builtin/add.c:337
+#: builtin/add.c:231
msgid "The following paths are ignored by one of your .gitignore files:\n"
msgstr "下列路径根æ®æ‚¨çš„一个 .gitignore 文件而被忽略:\n"
-#: 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/add.c:248 builtin/clean.c:876 builtin/fetch.c:93 builtin/mv.c:70
+#: builtin/prune-packed.c:77 builtin/push.c:489 builtin/remote.c:1344
#: builtin/rm.c:269
msgid "dry run"
msgstr "演习"
-#: 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/add.c:249 builtin/apply.c:4410 builtin/check-ignore.c:19
+#: builtin/commit.c:1256 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
+#: builtin/add.c:251
msgid "interactive picking"
msgstr "交互å¼æ‹£é€‰"
-#: builtin/add.c:358 builtin/checkout.c:1109 builtin/reset.c:272
+#: builtin/add.c:252 builtin/checkout.c:1108 builtin/reset.c:283
msgid "select hunks interactively"
msgstr "交互å¼æŒ‘选数æ®å—"
-#: builtin/add.c:359
+#: builtin/add.c:253
msgid "edit current diff and apply"
msgstr "编辑当å‰å·®å¼‚并应用"
-#: builtin/add.c:360
+#: builtin/add.c:254
msgid "allow adding otherwise ignored files"
msgstr "å…许添加忽略的文件"
-#: builtin/add.c:361
+#: builtin/add.c:255
msgid "update tracked files"
msgstr "更新已跟踪的文件"
-#: builtin/add.c:362
+#: builtin/add.c:256
msgid "record only the fact that the path will be added later"
msgstr "åªè®°å½•ï¼Œè¯¥è·¯å¾„ç¨åŽå†æ·»åŠ "
-#: builtin/add.c:363
+#: builtin/add.c:257
msgid "add changes from all tracked and untracked files"
msgstr "添加所有改å˜çš„已跟踪文件和未跟踪文件"
-#. takes no arguments
-#: builtin/add.c:366
+#: builtin/add.c:260
msgid "ignore paths removed in the working tree (same as --no-all)"
msgstr "忽略工作区中移除的路径(和 --no-all 相åŒï¼‰"
-#: builtin/add.c:368
+#: builtin/add.c:262
msgid "don't add, only refresh the index"
msgstr "ä¸æ·»åŠ ï¼Œåªåˆ·æ–°ç´¢å¼•"
-#: builtin/add.c:369
+#: builtin/add.c:263
msgid "just skip files which cannot be added because of errors"
msgstr "跳过因出错ä¸èƒ½æ·»åŠ çš„文件"
-#: builtin/add.c:370
+#: builtin/add.c:264
msgid "check if - even missing - files are ignored in dry run"
msgstr "检查在演习模å¼ä¸‹æ–‡ä»¶ï¼ˆå³ä½¿ä¸å­˜åœ¨ï¼‰æ˜¯å¦è¢«å¿½ç•¥"
-#: builtin/add.c:392
+#: builtin/add.c:286
#, c-format
msgid "Use -f if you really want to add them.\n"
msgstr "使用 -f å‚数如果您确实è¦æ·»åŠ å®ƒä»¬ã€‚\n"
-#: builtin/add.c:393
+#: builtin/add.c:287
msgid "no files added"
msgstr "没有文件被添加"
-#: builtin/add.c:399
+#: builtin/add.c:293
msgid "adding files failed"
msgstr "添加文件失败"
-#: builtin/add.c:438
+#: builtin/add.c:330
msgid "-A and -u are mutually incompatible"
msgstr "-A 和 -u 选项互斥"
-#: builtin/add.c:456
+#: builtin/add.c:337
msgid "Option --ignore-missing can only be used together with --dry-run"
msgstr "选项 --ignore-missing åªèƒ½å’Œ --dry-run åŒæ—¶ä½¿ç”¨"
-#: builtin/add.c:486
+#: builtin/add.c:358
#, c-format
msgid "Nothing specified, nothing added.\n"
msgstr "没有指定文件,也没有文件被添加。\n"
-#: builtin/add.c:487
+#: builtin/add.c:359
#, c-format
msgid "Maybe you wanted to say 'git add .'?\n"
msgstr "也许您想è¦æ‰§è¡Œ 'git add .'?\n"
-#: 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
+#: builtin/add.c:364 builtin/check-ignore.c:172 builtin/clean.c:920
+#: builtin/commit.c:320 builtin/mv.c:90 builtin/reset.c:234 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
+#: builtin/add.c:448 builtin/apply.c:4506 builtin/mv.c:280 builtin/rm.c:432
msgid "Unable to write new index file"
msgstr "无法写入新索引文件"
@@ -2219,7 +2131,6 @@ msgstr "** 警告:文件 %s æˆä¸ºç©ºæ–‡ä»¶ä½†å¹¶æœªåˆ é™¤"
msgid "corrupt binary patch at line %d: %.*s"
msgstr "二进制补ä¸åœ¨ç¬¬ %d è¡ŒæŸå:%.*s"
-#. there has to be one hunk (forward hunk)
#: builtin/apply.c:1900
#, c-format
msgid "unrecognized binary patch at line %d"
@@ -2360,7 +2271,7 @@ msgstr "%s:补ä¸æœªåº”用"
msgid "Checking patch %s..."
msgstr "æ£€æŸ¥è¡¥ä¸ %s..."
-#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:127
+#: builtin/apply.c:3680 builtin/checkout.c:213 builtin/reset.c:134
#, c-format
msgid "make_cache_entry failed for path '%s'"
msgstr "对路径 '%s' çš„ make_cache_entry æ“作失败"
@@ -2409,7 +2320,6 @@ msgstr "æˆåŠŸåº”ç”¨è¡¥ä¸ %s。"
msgid "internal error"
msgstr "内部错误"
-#. Say this even without --verbose
#: builtin/apply.c:4043
#, c-format
msgid "Applying patch %%s with %d reject..."
@@ -2501,7 +2411,7 @@ msgstr "如果一个补ä¸ä¸èƒ½åº”用则å°è¯•ä¸‰è·¯åˆå¹¶"
msgid "build a temporary index based on embedded index information"
msgstr "创建一个临时索引基于嵌入的索引信æ¯"
-#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:452
+#: builtin/apply.c:4389 builtin/checkout-index.c:197 builtin/ls-files.c:455
msgid "paths are separated with NUL character"
msgstr "路径以 NUL 字符分隔"
@@ -2731,6 +2641,16 @@ msgstr "n,m"
msgid "Process only line range n,m, counting from 1"
msgstr "åªå¤„ç†è¡ŒèŒƒå›´åœ¨ n å’Œ m 之间的,从 1 开始"
+#. TRANSLATORS: This string is used to tell us the maximum
+#. display width for a relative timestamp in "git blame"
+#. output. For C locale, "4 years, 11 months ago", which
+#. takes 22 places, is the longest among various forms of
+#. relative timestamps, but your language may need more or
+#. fewer display columns.
+#: builtin/blame.c:2347
+msgid "4 years, 11 months ago"
+msgstr "4 å¹´ 11 个月å‰"
+
#: builtin/branch.c:24
msgid "git branch [options] [-r | -a] [--merged | --no-merged]"
msgstr "git branch [选项] [-r | -a] [--merged | --no-merged]"
@@ -2971,8 +2891,9 @@ 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
+#: builtin/branch.c:850 builtin/commit.c:1494 builtin/commit.c:1495
+#: builtin/commit.c:1496 builtin/commit.c:1497 builtin/tag.c:527
+#: builtin/tag.c:533
msgid "commit"
msgstr "æ交"
@@ -3153,43 +3074,43 @@ msgstr "需è¦ä¸€ä¸ªç‰ˆæœ¬åº“æ¥åˆ›å»ºåŒ…。"
msgid "Need a repository to unbundle."
msgstr "需è¦ä¸€ä¸ªç‰ˆæœ¬åº“æ¥è§£åŒ…。"
-#: builtin/cat-file.c:328
+#: builtin/cat-file.c:331
msgid "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"
msgstr "git cat-file (-t|-s|-e|-p|<类型>|--textconv) <对象>"
-#: builtin/cat-file.c:329
+#: builtin/cat-file.c:332
msgid "git cat-file (--batch|--batch-check) < <list_of_objects>"
msgstr "git cat-file (--batch|--batch-check) < <对象列表>"
-#: builtin/cat-file.c:366
+#: builtin/cat-file.c:369
msgid "<type> can be one of: blob, tree, commit, tag"
msgstr "<类型> å¯ä»¥æ˜¯å…¶ä¸­ä¹‹ä¸€ï¼šblobã€treeã€commitã€tag"
-#: builtin/cat-file.c:367
+#: builtin/cat-file.c:370
msgid "show object type"
msgstr "显示对象类型"
-#: builtin/cat-file.c:368
+#: builtin/cat-file.c:371
msgid "show object size"
msgstr "显示对象大å°"
-#: builtin/cat-file.c:370
+#: builtin/cat-file.c:373
msgid "exit with zero when there's no error"
msgstr "当没有错误时退出并返回零"
-#: builtin/cat-file.c:371
+#: builtin/cat-file.c:374
msgid "pretty-print object's content"
msgstr "美观地打å°å¯¹è±¡çš„内容"
-#: builtin/cat-file.c:373
+#: builtin/cat-file.c:376
msgid "for blob objects, run textconv on object's content"
msgstr "对于数æ®ï¼ˆblob)对象,对其内容执行 textconv"
-#: builtin/cat-file.c:375
+#: builtin/cat-file.c:378
msgid "show info and content of objects fed from the standard input"
msgstr "显示从标准输入æ供的对象的信æ¯å’Œå†…容"
-#: builtin/cat-file.c:378
+#: builtin/cat-file.c:381
msgid "show info about objects fed from the standard input"
msgstr "显示从标准输入æ供的对象的信æ¯"
@@ -3217,7 +3138,7 @@ msgstr "从标准输入读出文件å"
msgid "terminate input and output records by a NUL character"
msgstr "输入和输出的记录使用 NUL 字符终结"
-#: builtin/check-ignore.c:18 builtin/checkout.c:1090 builtin/gc.c:260
+#: builtin/check-ignore.c:18 builtin/checkout.c:1089 builtin/gc.c:271
msgid "suppress progress reporting"
msgstr "ä¸æ˜¾ç¤ºè¿›åº¦æŠ¥å‘Š"
@@ -3368,61 +3289,60 @@ msgstr "'%s' ä¸èƒ½å’Œ %s åŒæ—¶ä½¿ç”¨"
msgid "Cannot update paths and switch to branch '%s' at the same time."
msgstr "ä¸èƒ½åŒæ—¶æ›´æ–°è·¯å¾„并切æ¢åˆ°åˆ†æ”¯'%s'。"
-#: builtin/checkout.c:261 builtin/checkout.c:451
+#: builtin/checkout.c:261 builtin/checkout.c:450
msgid "corrupt index file"
msgstr "æŸå的索引文件"
-#: builtin/checkout.c:322 builtin/checkout.c:329
+#: builtin/checkout.c:321 builtin/checkout.c:328
#, c-format
msgid "path '%s' is unmerged"
msgstr "路径 '%s' 未åˆå¹¶"
-#: builtin/checkout.c:473
+#: builtin/checkout.c:472
msgid "you need to resolve your current index first"
msgstr "您需è¦å…ˆè§£å†³å½“å‰ç´¢å¼•çš„冲çª"
-#: builtin/checkout.c:594
+#: builtin/checkout.c:593
#, c-format
msgid "Can not do reflog for '%s'\n"
msgstr "ä¸èƒ½å¯¹ '%s' 执行 reflog æ“作\n"
-#: builtin/checkout.c:632
+#: builtin/checkout.c:631
msgid "HEAD is now at"
msgstr "HEAD ç›®å‰ä½äºŽ"
-#: builtin/checkout.c:639
+#: builtin/checkout.c:638
#, c-format
msgid "Reset branch '%s'\n"
msgstr "é‡ç½®åˆ†æ”¯ '%s'\n"
-#: builtin/checkout.c:642
+#: builtin/checkout.c:641
#, c-format
msgid "Already on '%s'\n"
msgstr "å·²ç»ä½äºŽ '%s'\n"
-#: builtin/checkout.c:646
+#: builtin/checkout.c:645
#, c-format
msgid "Switched to and reset branch '%s'\n"
msgstr "切æ¢å¹¶é‡ç½®åˆ†æ”¯ '%s'\n"
-#: builtin/checkout.c:648 builtin/checkout.c:1033
+#: builtin/checkout.c:647 builtin/checkout.c:1032
#, c-format
msgid "Switched to a new branch '%s'\n"
msgstr "切æ¢åˆ°ä¸€ä¸ªæ–°åˆ†æ”¯ '%s'\n"
-#: builtin/checkout.c:650
+#: builtin/checkout.c:649
#, c-format
msgid "Switched to branch '%s'\n"
msgstr "切æ¢åˆ°åˆ†æ”¯ '%s'\n"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: builtin/checkout.c:706
+#: builtin/checkout.c:705
#, c-format
msgid " ... and %d more.\n"
msgstr " ... åŠå…¶å®ƒ %d 个。\n"
-#. The singular version
-#: builtin/checkout.c:712
+#: builtin/checkout.c:711
#, c-format
msgid ""
"Warning: you are leaving %d commit behind, not connected to\n"
@@ -3443,7 +3363,7 @@ msgstr[1] ""
"\n"
"%s\n"
-#: builtin/checkout.c:730
+#: builtin/checkout.c:729
#, c-format
msgid ""
"If you want to keep them by creating a new branch, this may be a good time\n"
@@ -3458,140 +3378,139 @@ msgstr ""
" git branch new_branch_name %s\n"
"\n"
-#: builtin/checkout.c:760
+#: builtin/checkout.c:759
msgid "internal error in revision walk"
msgstr "在版本é历时é‡åˆ°å†…部错误"
-#: builtin/checkout.c:764
+#: builtin/checkout.c:763
msgid "Previous HEAD position was"
msgstr "之å‰çš„ HEAD ä½ç½®æ˜¯"
-#: builtin/checkout.c:791 builtin/checkout.c:1028
+#: builtin/checkout.c:790 builtin/checkout.c:1027
msgid "You are on a branch yet to be born"
msgstr "您ä½äºŽä¸€ä¸ªå°šæœªåˆå§‹åŒ–的分支"
-#: builtin/checkout.c:935
+#: builtin/checkout.c:934
#, c-format
msgid "only one reference expected, %d given."
msgstr "åªè¦ä¸€ä¸ªå¼•ç”¨ï¼Œå´ç»™å‡ºäº† %d 个"
-#: builtin/checkout.c:974
+#: builtin/checkout.c:973
#, c-format
msgid "invalid reference: %s"
msgstr "无效引用:%s"
-#. case (1): want a tree
-#: builtin/checkout.c:1003
+#: builtin/checkout.c:1002
#, c-format
msgid "reference is not a tree: %s"
msgstr "引用ä¸æ˜¯ä¸€ä¸ªæ ‘:%s"
-#: builtin/checkout.c:1042
+#: builtin/checkout.c:1041
msgid "paths cannot be used with switching branches"
msgstr "路径ä¸èƒ½å’Œåˆ‡æ¢åˆ†æ”¯åŒæ—¶ä½¿ç”¨"
-#: builtin/checkout.c:1045 builtin/checkout.c:1049
+#: builtin/checkout.c:1044 builtin/checkout.c:1048
#, c-format
msgid "'%s' cannot be used with switching branches"
msgstr "'%s' ä¸èƒ½å’Œåˆ‡æ¢åˆ†æ”¯åŒæ—¶ä½¿ç”¨"
-#: builtin/checkout.c:1053 builtin/checkout.c:1056 builtin/checkout.c:1061
-#: builtin/checkout.c:1064
+#: builtin/checkout.c:1052 builtin/checkout.c:1055 builtin/checkout.c:1060
+#: builtin/checkout.c:1063
#, c-format
msgid "'%s' cannot be used with '%s'"
msgstr "'%s' ä¸èƒ½å’Œ '%s' åŒæ—¶ä½¿ç”¨"
-#: builtin/checkout.c:1069
+#: builtin/checkout.c:1068
#, c-format
msgid "Cannot switch branch to a non-commit '%s'"
msgstr "ä¸èƒ½åˆ‡æ¢åˆ†æ”¯åˆ°ä¸€ä¸ªéžæ交 '%s'"
-#: builtin/checkout.c:1091 builtin/checkout.c:1093 builtin/clone.c:88
+#: builtin/checkout.c:1090 builtin/checkout.c:1092 builtin/clone.c:88
#: builtin/remote.c:159 builtin/remote.c:161
msgid "branch"
msgstr "分支"
-#: builtin/checkout.c:1092
+#: builtin/checkout.c:1091
msgid "create and checkout a new branch"
msgstr "创建并检出一个新的分支"
-#: builtin/checkout.c:1094
+#: builtin/checkout.c:1093
msgid "create/reset and checkout a branch"
msgstr "创建/é‡ç½®å¹¶æ£€å‡ºä¸€ä¸ªåˆ†æ”¯"
-#: builtin/checkout.c:1095
+#: builtin/checkout.c:1094
msgid "create reflog for new branch"
msgstr "为新的分支创建引用日志"
-#: builtin/checkout.c:1096
+#: builtin/checkout.c:1095
msgid "detach the HEAD at named commit"
msgstr "æˆä¸ºæŒ‡å‘该æ交的分离头指针"
-#: builtin/checkout.c:1097
+#: builtin/checkout.c:1096
msgid "set upstream info for new branch"
msgstr "为新的分支设置上游信æ¯"
-#: builtin/checkout.c:1099
-msgid "new branch"
+#: builtin/checkout.c:1098
+msgid "new-branch"
msgstr "新分支"
-#: builtin/checkout.c:1099
+#: builtin/checkout.c:1098
msgid "new unparented branch"
msgstr "新的没有父æ交的分支"
-#: builtin/checkout.c:1100
+#: builtin/checkout.c:1099
msgid "checkout our version for unmerged files"
msgstr "对尚未åˆå¹¶çš„文件检出我们的版本"
-#: builtin/checkout.c:1102
+#: builtin/checkout.c:1101
msgid "checkout their version for unmerged files"
msgstr "对尚未åˆå¹¶çš„文件检出他们的版本"
-#: builtin/checkout.c:1104
+#: builtin/checkout.c:1103
msgid "force checkout (throw away local modifications)"
msgstr "强制检出(丢弃本地修改)"
-#: builtin/checkout.c:1105
+#: builtin/checkout.c:1104
msgid "perform a 3-way merge with the new branch"
msgstr "和新的分支执行三路åˆå¹¶"
-#: builtin/checkout.c:1106 builtin/merge.c:225
+#: builtin/checkout.c:1105 builtin/merge.c:225
msgid "update ignored files (default)"
msgstr "更新忽略的文件(默认)"
-#: builtin/checkout.c:1107 builtin/log.c:1228 parse-options.h:248
+#: builtin/checkout.c:1106 builtin/log.c:1228 parse-options.h:245
msgid "style"
msgstr "风格"
-#: builtin/checkout.c:1108
+#: builtin/checkout.c:1107
msgid "conflict style (merge or diff3)"
msgstr "冲çªè¾“出风格(merge 或 diff3)"
-#: builtin/checkout.c:1111
+#: builtin/checkout.c:1110
msgid "do not limit pathspecs to sparse entries only"
msgstr "对路径ä¸åšç¨€ç–检出的é™åˆ¶"
-#: builtin/checkout.c:1113
+#: builtin/checkout.c:1112
msgid "second guess 'git checkout no-such-branch'"
msgstr "å†è€…猜测'git checkout no-such-branch'"
-#: builtin/checkout.c:1136
+#: builtin/checkout.c:1135
msgid "-b, -B and --orphan are mutually exclusive"
msgstr "-bã€-B å’Œ --orphan 是互斥的"
-#: builtin/checkout.c:1153
+#: builtin/checkout.c:1152
msgid "--track needs a branch name"
msgstr "--track 需è¦ä¸€ä¸ªåˆ†æ”¯å"
-#: builtin/checkout.c:1160
+#: builtin/checkout.c:1159
msgid "Missing branch name; try -b"
msgstr "缺少分支åï¼›å°è¯• -b"
-#: builtin/checkout.c:1197
+#: builtin/checkout.c:1196
msgid "invalid path specification"
msgstr "无效的路径规格"
-#: builtin/checkout.c:1204
+#: builtin/checkout.c:1203
#, c-format
msgid ""
"Cannot update paths and switch to branch '%s' at the same time.\n"
@@ -3600,12 +3519,12 @@ msgstr ""
"ä¸èƒ½åŒæ—¶æ›´æ–°è·¯å¾„并切æ¢åˆ°åˆ†æ”¯'%s'。\n"
"您是想è¦æ£€å‡º '%s' 但其未能解æžä¸ºæ交么?"
-#: builtin/checkout.c:1209
+#: builtin/checkout.c:1208
#, c-format
msgid "git checkout: --detach does not take a path argument '%s'"
msgstr "git checkout:--detach ä¸èƒ½æŽ¥æ”¶è·¯å¾„å‚æ•° '%s'"
-#: builtin/checkout.c:1213
+#: builtin/checkout.c:1212
msgid ""
"git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
"checking out of the index."
@@ -3643,7 +3562,7 @@ msgstr "将忽略版本库 %s\n"
msgid "failed to remove %s"
msgstr "无法删除 %s"
-#: builtin/clean.c:294
+#: builtin/clean.c:295
msgid ""
"Prompt help:\n"
"1 - select a numbered item\n"
@@ -3655,7 +3574,7 @@ msgstr ""
"foo - 通过标题选择一个选项\n"
" - (空)什么也ä¸é€‰æ‹©"
-#: builtin/clean.c:298
+#: builtin/clean.c:299
msgid ""
"Prompt help:\n"
"1 - select a single item\n"
@@ -3675,35 +3594,35 @@ msgstr ""
"* - 选择所有选项\n"
" - (空)结æŸé€‰æ‹©"
-#: builtin/clean.c:516
+#: builtin/clean.c:517
#, c-format
msgid "Huh (%s)?"
msgstr "嗯(%s)?"
-#: builtin/clean.c:659
+#: builtin/clean.c:660
#, c-format
msgid "Input ignore patterns>> "
msgstr "输入模版以排除æ¡ç›®>> "
-#: builtin/clean.c:696
+#: builtin/clean.c:697
#, c-format
msgid "WARNING: Cannot find items matched by: %s"
msgstr "警告:无法找到和 %s 匹é…çš„æ¡ç›®"
-#: builtin/clean.c:717
+#: builtin/clean.c:718
msgid "Select items to delete"
msgstr "选择è¦åˆ é™¤çš„æ¡ç›®"
-#: builtin/clean.c:757
+#: builtin/clean.c:758
#, c-format
msgid "remove %s? "
msgstr "删除 %s?"
-#: builtin/clean.c:782
+#: builtin/clean.c:783
msgid "Bye."
msgstr "å†è§ã€‚"
-#: builtin/clean.c:790
+#: builtin/clean.c:791
msgid ""
"clean - start cleaning\n"
"filter by pattern - exclude items from deletion\n"
@@ -3721,71 +3640,71 @@ msgstr ""
"help - 显示本帮助\n"
"? - 显示如何在æ示符下选择的帮助"
-#: builtin/clean.c:817
+#: builtin/clean.c:818
msgid "*** Commands ***"
msgstr "*** 命令 ***"
-#: builtin/clean.c:818
+#: builtin/clean.c:819
msgid "What now"
msgstr "请选择"
-#: builtin/clean.c:826
+#: builtin/clean.c:827
msgid "Would remove the following item:"
msgid_plural "Would remove the following items:"
msgstr[0] "将删除如下æ¡ç›®ï¼š"
msgstr[1] "将删除如下æ¡ç›®ï¼š"
-#: builtin/clean.c:843
+#: builtin/clean.c:844
msgid "No more files to clean, exiting."
msgstr "没有è¦æ¸…ç†çš„文件,退出。"
-#: builtin/clean.c:874
+#: builtin/clean.c:875
msgid "do not print names of files removed"
msgstr "ä¸æ‰“å°åˆ é™¤æ–‡ä»¶çš„å称"
-#: builtin/clean.c:876
+#: builtin/clean.c:877
msgid "force"
msgstr "强制"
-#: builtin/clean.c:877
+#: builtin/clean.c:878
msgid "interactive cleaning"
msgstr "交互å¼æ¸…除"
-#: builtin/clean.c:879
+#: builtin/clean.c:880
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
+#: builtin/clean.c:881 builtin/describe.c:415 builtin/grep.c:716
+#: builtin/ls-files.c:486 builtin/name-rev.c:314 builtin/show-ref.c:185
msgid "pattern"
msgstr "模å¼"
-#: builtin/clean.c:881
+#: builtin/clean.c:882
msgid "add <pattern> to ignore rules"
msgstr "添加<模å¼>到忽略规则"
-#: builtin/clean.c:882
+#: builtin/clean.c:883
msgid "remove ignored files, too"
msgstr "也删除忽略的文件"
-#: builtin/clean.c:884
+#: builtin/clean.c:885
msgid "remove only ignored files"
msgstr "åªåˆ é™¤å¿½ç•¥çš„文件"
-#: builtin/clean.c:902
+#: builtin/clean.c:903
msgid "-x and -X cannot be used together"
msgstr "-x å’Œ -X ä¸èƒ½åŒæ—¶ä½¿ç”¨"
-#: builtin/clean.c:906
+#: builtin/clean.c:907
msgid ""
-"clean.requireForce set to true and neither -i, -n nor -f given; refusing to "
+"clean.requireForce set to true and neither -i, -n, nor -f given; refusing to "
"clean"
msgstr ""
"clean.requireForce 设置为 true 且未æä¾› -iã€-n 或 -f 选项,拒ç»æ‰§è¡Œæ¸…ç†åŠ¨ä½œ"
-#: builtin/clean.c:909
+#: builtin/clean.c:910
msgid ""
-"clean.requireForce defaults to true and neither -i, -n nor -f given; "
+"clean.requireForce defaults to true and neither -i, -n, nor -f given; "
"refusing to clean"
msgstr ""
"clean.requireForce 默认为 true 且未æä¾› -iã€-n 或 -f 选项,拒ç»æ‰§è¡Œæ¸…ç†åŠ¨ä½œ"
@@ -3795,7 +3714,7 @@ msgid "git clone [options] [--] <repo> [<dir>]"
msgstr "git clone [选项] [--] <版本库> [<路径>]"
#: builtin/clone.c:64 builtin/fetch.c:97 builtin/merge.c:222
-#: builtin/push.c:521
+#: builtin/push.c:504
msgid "force progress reporting"
msgstr "强制显示进度报告"
@@ -3803,7 +3722,7 @@ msgstr "强制显示进度报告"
msgid "don't create a checkout"
msgstr "ä¸åˆ›å»ºä¸€ä¸ªæ£€å‡º"
-#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:488
+#: builtin/clone.c:67 builtin/clone.c:69 builtin/init-db.c:486
msgid "create a bare repository"
msgstr "创建一个裸版本库"
@@ -3827,11 +3746,11 @@ msgstr "设置为共享版本库"
msgid "initialize submodules in the clone"
msgstr "在克隆时åˆå§‹åŒ–å­æ¨¡ç»„"
-#: builtin/clone.c:82 builtin/init-db.c:485
+#: builtin/clone.c:82 builtin/init-db.c:483
msgid "template-directory"
msgstr "模æ¿ç›®å½•"
-#: builtin/clone.c:83 builtin/init-db.c:486
+#: builtin/clone.c:83 builtin/init-db.c:484
msgid "directory from which templates will be used"
msgstr "模æ¿ç›®å½•å°†è¢«ä½¿ç”¨"
@@ -3855,7 +3774,7 @@ msgstr "检出<分支>而ä¸æ˜¯è¿œç¨‹HEAD"
msgid "path to git-upload-pack on the remote"
msgstr "远程 git-upload-pack 路径"
-#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:663
+#: builtin/clone.c:92 builtin/fetch.c:98 builtin/grep.c:661
msgid "depth"
msgstr "深度"
@@ -3867,11 +3786,11 @@ msgstr "创建一个指定深度的浅克隆"
msgid "clone only one branch, HEAD or --branch"
msgstr "åªå…‹éš†ä¸€ä¸ªåˆ†æ”¯ã€HEAD 或 --branch"
-#: builtin/clone.c:96 builtin/init-db.c:494
+#: builtin/clone.c:96 builtin/init-db.c:492
msgid "gitdir"
msgstr "git目录"
-#: builtin/clone.c:97 builtin/init-db.c:495
+#: builtin/clone.c:97 builtin/init-db.c:493
msgid "separate git dir from working tree"
msgstr "git目录和工作区分离"
@@ -4154,67 +4073,67 @@ msgstr ""
"然åŽæ‰§è¡Œ \"git cherry-pick --continue\" 继续对其余æ交执行拣选\n"
"æ“作。\n"
-#: builtin/commit.c:287
+#: builtin/commit.c:288
msgid "failed to unpack HEAD tree object"
msgstr "无法解包 HEAD 树对象"
-#: builtin/commit.c:329
+#: builtin/commit.c:330
msgid "unable to create temporary index"
msgstr "ä¸èƒ½åˆ›å»ºä¸´æ—¶ç´¢å¼•"
-#: builtin/commit.c:335
+#: builtin/commit.c:336
msgid "interactive add failed"
msgstr "交互å¼æ·»åŠ å¤±è´¥"
-#: builtin/commit.c:368 builtin/commit.c:389 builtin/commit.c:439
+#: builtin/commit.c:369 builtin/commit.c:390 builtin/commit.c:440
msgid "unable to write new_index file"
msgstr "无法写 new_index 文件"
-#: builtin/commit.c:420
+#: builtin/commit.c:421
msgid "cannot do a partial commit during a merge."
msgstr "在åˆå¹¶è¿‡ç¨‹ä¸­ä¸èƒ½åšéƒ¨åˆ†æ交。"
-#: builtin/commit.c:422
+#: builtin/commit.c:423
msgid "cannot do a partial commit during a cherry-pick."
msgstr "在拣选过程中ä¸èƒ½åšéƒ¨åˆ†æ交。"
-#: builtin/commit.c:432
+#: builtin/commit.c:433
msgid "cannot read the index"
msgstr "无法读å–索引"
-#: builtin/commit.c:452
+#: builtin/commit.c:453
msgid "unable to write temporary index file"
msgstr "无法写临时索引文件"
-#: builtin/commit.c:543 builtin/commit.c:549
+#: builtin/commit.c:544 builtin/commit.c:550
#, c-format
msgid "invalid commit: %s"
msgstr "无效的æ交:%s"
-#: builtin/commit.c:571
+#: builtin/commit.c:572
msgid "malformed --author parameter"
msgstr "éžæ³•çš„ --author å‚æ•°"
-#: builtin/commit.c:591
+#: builtin/commit.c:592
#, c-format
msgid "Malformed ident string: '%s'"
msgstr "éžæ³•çš„身份字符串:'%s'"
-#: builtin/commit.c:630 builtin/commit.c:663 builtin/commit.c:1007
+#: builtin/commit.c:629 builtin/commit.c:663 builtin/commit.c:1014
#, c-format
msgid "could not lookup commit %s"
msgstr "ä¸èƒ½æŸ¥è¯¢æ交 %s"
-#: builtin/commit.c:642 builtin/shortlog.c:273
+#: builtin/commit.c:641 builtin/shortlog.c:273
#, c-format
msgid "(reading log message from standard input)\n"
msgstr "(正从标准输入中读å–日志信æ¯ï¼‰\n"
-#: builtin/commit.c:644
+#: builtin/commit.c:643
msgid "could not read log from standard input"
msgstr "ä¸èƒ½ä»Žæ ‡å‡†è¾“入中读å–日志信æ¯"
-#: builtin/commit.c:648
+#: builtin/commit.c:647
#, c-format
msgid "could not read log file '%s'"
msgstr "ä¸èƒ½è¯»å–日志文件 '%s'"
@@ -4240,7 +4159,7 @@ msgstr "ä¸èƒ½è¯»å– '%s'"
msgid "could not write commit template"
msgstr "ä¸èƒ½å†™æ交模版"
-#: builtin/commit.c:760
+#: builtin/commit.c:764
#, c-format
msgid ""
"\n"
@@ -4254,7 +4173,7 @@ msgstr ""
"\t%s\n"
"然åŽé‡è¯•ã€‚\n"
-#: builtin/commit.c:765
+#: builtin/commit.c:769
#, c-format
msgid ""
"\n"
@@ -4268,7 +4187,7 @@ msgstr ""
"\t%s\n"
"然åŽé‡è¯•ã€‚\n"
-#: builtin/commit.c:777
+#: builtin/commit.c:782
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
@@ -4277,7 +4196,7 @@ msgstr ""
"请为您的å˜æ›´è¾“å…¥æ交说明。以 '%c' 开始的行将被忽略,而一个空的æ交\n"
"说明将会终止æ交。\n"
-#: builtin/commit.c:782
+#: builtin/commit.c:789
#, c-format
msgid ""
"Please enter the commit message for your changes. Lines starting\n"
@@ -4288,355 +4207,355 @@ msgstr ""
"也å¯ä»¥åˆ é™¤å®ƒä»¬ã€‚一个空的æ交说明将会终止æ交。\n"
# 译者:为ä¿è¯åœ¨è¾“出中对é½ï¼Œæ³¨æ„调整å¥ä¸­ç©ºæ ¼ï¼
-#: builtin/commit.c:795
+#: builtin/commit.c:802
#, c-format
msgid "%sAuthor: %s"
msgstr "%s作者: %s"
# 译者:为ä¿è¯åœ¨è¾“出中对é½ï¼Œæ³¨æ„调整å¥ä¸­ç©ºæ ¼ï¼
-#: builtin/commit.c:802
+#: builtin/commit.c:809
#, c-format
msgid "%sCommitter: %s"
msgstr "%sæ交者: %s"
-#: builtin/commit.c:822
+#: builtin/commit.c:829
msgid "Cannot read index"
msgstr "无法读å–索引"
-#: builtin/commit.c:865
+#: builtin/commit.c:872
msgid "Error building trees"
msgstr "无法创建树对象"
-#: builtin/commit.c:880 builtin/tag.c:359
+#: builtin/commit.c:887 builtin/tag.c:391
#, c-format
msgid "Please supply the message using either -m or -F option.\n"
msgstr "请使用 -m 或 -F 选项æä¾›æ交说明。\n"
-#: builtin/commit.c:982
+#: builtin/commit.c:989
#, c-format
msgid "No existing author found with '%s'"
msgstr "æ²¡æœ‰æ‰¾åˆ°åŒ¹é… '%s' 的作者"
-#: builtin/commit.c:997 builtin/commit.c:1237
+#: builtin/commit.c:1004 builtin/commit.c:1244
#, c-format
msgid "Invalid untracked files mode '%s'"
msgstr "无效的未追踪文件å‚æ•° '%s'"
-#: builtin/commit.c:1034
+#: builtin/commit.c:1041
msgid "--long and -z are incompatible"
msgstr "--long å’Œ -z 选项ä¸å…¼å®¹"
-#: builtin/commit.c:1064
+#: builtin/commit.c:1071
msgid "Using both --reset-author and --author does not make sense"
msgstr "åŒæ—¶ä½¿ç”¨ --reset-author å’Œ --author 没有æ„义"
-#: builtin/commit.c:1075
+#: builtin/commit.c:1080
msgid "You have nothing to amend."
msgstr "您没有å¯ä¿®è¡¥çš„æ交。"
-#: builtin/commit.c:1078
+#: builtin/commit.c:1083
msgid "You are in the middle of a merge -- cannot amend."
msgstr "您正处于一个åˆå¹¶è¿‡ç¨‹ä¸­ -- 无法修补æ交。"
-#: builtin/commit.c:1080
+#: builtin/commit.c:1085
msgid "You are in the middle of a cherry-pick -- cannot amend."
msgstr "您正处于一个拣选过程中 -- 无法修补æ交。"
-#: builtin/commit.c:1083
+#: builtin/commit.c:1088
msgid "Options --squash and --fixup cannot be used together"
msgstr "选项 --squash å’Œ --fixup ä¸èƒ½åŒæ—¶ä½¿ç”¨"
-#: builtin/commit.c:1093
+#: builtin/commit.c:1098
msgid "Only one of -c/-C/-F/--fixup can be used."
msgstr "åªèƒ½ç”¨ä¸€ä¸ª -c/-C/-F/--fixup 选项。"
-#: builtin/commit.c:1095
+#: builtin/commit.c:1100
msgid "Option -m cannot be combined with -c/-C/-F/--fixup."
msgstr "选项 -m ä¸èƒ½å’Œ -c/-C/-F/--fixup åŒæ—¶ä½¿ç”¨ã€‚"
-#: builtin/commit.c:1103
+#: builtin/commit.c:1108
msgid "--reset-author can be used only with -C, -c or --amend."
msgstr "--reset-author åªèƒ½å’Œ -Cã€-c 或 --amend åŒæ—¶ä½¿ç”¨ã€‚"
-#: builtin/commit.c:1120
+#: builtin/commit.c:1125
msgid "Only one of --include/--only/--all/--interactive/--patch can be used."
msgstr "åªèƒ½ç”¨ä¸€ä¸ª --include/--only/--all/--interactive/--patch 选项。"
-#: builtin/commit.c:1122
+#: builtin/commit.c:1127
msgid "No paths with --include/--only does not make sense."
msgstr "å‚æ•° --include/--only ä¸è·Ÿè·¯å¾„没有æ„义。"
-#: builtin/commit.c:1124
+#: builtin/commit.c:1129
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 "指定了明确的路径而没有使用 -i 或 -o 选项;认为是 --only paths..."
+#: builtin/commit.c:1131
+msgid "Explicit paths specified without -i or -o; assuming --only paths..."
+msgstr "指定了明确的路径而没有使用 -i 或 -o 选项,认为是 --only paths..."
-#: builtin/commit.c:1136 builtin/tag.c:572
+#: builtin/commit.c:1143 builtin/tag.c:639
#, c-format
msgid "Invalid cleanup mode %s"
msgstr "无效的清ç†æ¨¡å¼ %s"
-#: builtin/commit.c:1141
+#: builtin/commit.c:1148
msgid "Paths with -a does not make sense."
msgstr "路径和 -a 选项åŒæ—¶ä½¿ç”¨æ²¡æœ‰æ„义。"
-#: builtin/commit.c:1251 builtin/commit.c:1482
+#: builtin/commit.c:1258 builtin/commit.c:1516
msgid "show status concisely"
msgstr "以简æ´çš„æ ¼å¼æ˜¾ç¤ºçŠ¶æ€"
-#: builtin/commit.c:1253 builtin/commit.c:1484
+#: builtin/commit.c:1260 builtin/commit.c:1518
msgid "show branch information"
msgstr "显示分支信æ¯"
-#: builtin/commit.c:1255 builtin/commit.c:1486 builtin/push.c:507
+#: builtin/commit.c:1262 builtin/commit.c:1520 builtin/push.c:490
msgid "machine-readable output"
msgstr "机器å¯è¯»çš„输出"
-#: builtin/commit.c:1258 builtin/commit.c:1488
+#: builtin/commit.c:1265 builtin/commit.c:1522
msgid "show status in long format (default)"
msgstr "以长格å¼æ˜¾ç¤ºçŠ¶æ€ï¼ˆé»˜è®¤ï¼‰"
-#: builtin/commit.c:1261 builtin/commit.c:1491
+#: builtin/commit.c:1268 builtin/commit.c:1525
msgid "terminate entries with NUL"
msgstr "æ¡ç›®ä»¥NUL字符结尾"
-#: builtin/commit.c:1263 builtin/commit.c:1494 builtin/fast-export.c:674
-#: builtin/fast-export.c:677 builtin/tag.c:459
+#: builtin/commit.c:1270 builtin/commit.c:1528 builtin/fast-export.c:674
+#: builtin/fast-export.c:677 builtin/tag.c:514
msgid "mode"
msgstr "模å¼"
-#: builtin/commit.c:1264 builtin/commit.c:1494
+#: builtin/commit.c:1271 builtin/commit.c:1528
msgid "show untracked files, optional modes: all, normal, no. (Default: all)"
msgstr "显示未跟踪的文件,“模å¼â€çš„å¯é€‰å‚数:allã€normalã€no。(默认:all)"
-#: builtin/commit.c:1267
+#: builtin/commit.c:1274
msgid "show ignored files"
msgstr "显示忽略的文件"
-#: builtin/commit.c:1268 parse-options.h:156
+#: builtin/commit.c:1275 parse-options.h:153
msgid "when"
msgstr "何时"
-#: builtin/commit.c:1269
+#: builtin/commit.c:1276
msgid ""
"ignore changes to submodules, optional when: all, dirty, untracked. "
"(Default: all)"
msgstr ""
"忽略å­æ¨¡ç»„的更改,“何时â€çš„å¯é€‰å‚数:allã€dirtyã€untracked。(默认:all)"
-#: builtin/commit.c:1271
+#: builtin/commit.c:1278
msgid "list untracked files in columns"
msgstr "以列的方å¼æ˜¾ç¤ºæœªè·Ÿè¸ªçš„文件"
-#: builtin/commit.c:1340
+#: builtin/commit.c:1347
msgid "couldn't look up newly created commit"
msgstr "无法找到新创建的æ交"
-#: builtin/commit.c:1342
+#: builtin/commit.c:1349
msgid "could not parse newly created commit"
msgstr "ä¸èƒ½è§£æžæ–°åˆ›å»ºçš„æ交"
-#: builtin/commit.c:1383
+#: builtin/commit.c:1390
msgid "detached HEAD"
msgstr "分离头指针"
# 译者:中文字符串拼接,å¯åˆ é™¤å‰å¯¼ç©ºæ ¼
-#: builtin/commit.c:1385
+#: builtin/commit.c:1392
msgid " (root-commit)"
msgstr "(根æ交)"
-#: builtin/commit.c:1452
+#: builtin/commit.c:1486
msgid "suppress summary after successful commit"
msgstr "æ交æˆåŠŸåŽä¸æ˜¾ç¤ºæ¦‚è¿°ä¿¡æ¯"
-#: builtin/commit.c:1453
+#: builtin/commit.c:1487
msgid "show diff in commit message template"
msgstr "在æ交说明模æ¿é‡Œæ˜¾ç¤ºå·®å¼‚"
-#: builtin/commit.c:1455
+#: builtin/commit.c:1489
msgid "Commit message options"
msgstr "æ交说明选项"
-#: builtin/commit.c:1456 builtin/tag.c:457
+#: builtin/commit.c:1490 builtin/tag.c:512
msgid "read message from file"
msgstr "从文件中读å–æ交说明"
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "author"
msgstr "作者"
-#: builtin/commit.c:1457
+#: builtin/commit.c:1491
msgid "override author for commit"
msgstr "æ交时覆盖作者"
-#: builtin/commit.c:1458 builtin/gc.c:261
+#: builtin/commit.c:1492 builtin/gc.c:272
msgid "date"
msgstr "日期"
-#: builtin/commit.c:1458
+#: builtin/commit.c:1492
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
+#: builtin/commit.c:1493 builtin/merge.c:216 builtin/notes.c:409
+#: builtin/notes.c:566 builtin/tag.c:510
msgid "message"
msgstr "说明"
-#: builtin/commit.c:1459
+#: builtin/commit.c:1493
msgid "commit message"
msgstr "æ交说明"
-#: builtin/commit.c:1460
+#: builtin/commit.c:1494
msgid "reuse and edit message from specified commit"
msgstr "é‡ç”¨å¹¶ç¼–辑指定æ交的æ交说明"
-#: builtin/commit.c:1461
+#: builtin/commit.c:1495
msgid "reuse message from specified commit"
msgstr "é‡ç”¨æŒ‡å®šæ交的æ交说明"
-#: builtin/commit.c:1462
+#: builtin/commit.c:1496
msgid "use autosquash formatted message to fixup specified commit"
msgstr "使用 autosquash æ ¼å¼çš„æ交说明用以修正指定的æ交"
-#: builtin/commit.c:1463
+#: builtin/commit.c:1497
msgid "use autosquash formatted message to squash specified commit"
msgstr "使用 autosquash æ ¼å¼çš„æ交说明用以压缩至指定的æ交"
-#: builtin/commit.c:1464
+#: builtin/commit.c:1498
msgid "the commit is authored by me now (used with -C/-c/--amend)"
msgstr "现在将该æ交的作者改为我(和 -C/-c/--amend å‚数共用)"
-#: builtin/commit.c:1465 builtin/log.c:1180 builtin/revert.c:86
+#: builtin/commit.c:1499 builtin/log.c:1180 builtin/revert.c:86
msgid "add Signed-off-by:"
msgstr "添加 Signed-off-by: ç­¾å"
-#: builtin/commit.c:1466
+#: builtin/commit.c:1500
msgid "use specified template file"
msgstr "使用指定的模æ¿æ–‡ä»¶"
-#: builtin/commit.c:1467
+#: builtin/commit.c:1501
msgid "force edit of commit"
msgstr "强制编辑æ交"
# 译者:å¯é€‰å€¼ï¼Œä¸èƒ½ç¿»è¯‘(或是原文中笔误,应为 mode)
-#: builtin/commit.c:1468
+#: builtin/commit.c:1502
msgid "default"
msgstr "default"
-#: builtin/commit.c:1468 builtin/tag.c:460
+#: builtin/commit.c:1502 builtin/tag.c:515
msgid "how to strip spaces and #comments from message"
msgstr "设置如何删除æ交说明里的空格和#注释"
-#: builtin/commit.c:1469
+#: builtin/commit.c:1503
msgid "include status in commit message template"
msgstr "在æ交说明模æ¿é‡ŒåŒ…å«çŠ¶æ€ä¿¡æ¯"
-#: builtin/commit.c:1470 builtin/merge.c:223 builtin/tag.c:461
-msgid "key id"
-msgstr "key id"
+#: builtin/commit.c:1504 builtin/merge.c:223 builtin/revert.c:92
+#: builtin/tag.c:516
+msgid "key-id"
+msgstr "key-id"
-#: builtin/commit.c:1471 builtin/merge.c:224
+#: builtin/commit.c:1505 builtin/merge.c:224 builtin/revert.c:93
msgid "GPG sign commit"
msgstr "GPG æ交签å"
-#. end commit message options
-#: builtin/commit.c:1474
+#: builtin/commit.c:1508
msgid "Commit contents options"
msgstr "æ交内容选项"
-#: builtin/commit.c:1475
+#: builtin/commit.c:1509
msgid "commit all changed files"
msgstr "æ交所有改动的文件"
-#: builtin/commit.c:1476
+#: builtin/commit.c:1510
msgid "add specified files to index for commit"
msgstr "添加指定的文件到索引区等待æ交"
-#: builtin/commit.c:1477
+#: builtin/commit.c:1511
msgid "interactively add files"
msgstr "交互å¼æ·»åŠ æ–‡ä»¶"
-#: builtin/commit.c:1478
+#: builtin/commit.c:1512
msgid "interactively add changes"
msgstr "交互å¼æ·»åŠ å˜æ›´"
-#: builtin/commit.c:1479
+#: builtin/commit.c:1513
msgid "commit only specified files"
msgstr "åªæ交指定的文件"
-#: builtin/commit.c:1480
+#: builtin/commit.c:1514
msgid "bypass pre-commit hook"
msgstr "绕过 pre-commit é’©å­"
-#: builtin/commit.c:1481
+#: builtin/commit.c:1515
msgid "show what would be committed"
msgstr "显示将è¦æ交的内容"
-#: builtin/commit.c:1492
+#: builtin/commit.c:1526
msgid "amend previous commit"
msgstr "修改先å‰çš„æ交"
-#: builtin/commit.c:1493
+#: builtin/commit.c:1527
msgid "bypass post-rewrite hook"
msgstr "绕过 post-rewrite é’©å­"
-#: builtin/commit.c:1498
+#: builtin/commit.c:1532
msgid "ok to record an empty change"
msgstr "å…许一个空æ交"
-#: builtin/commit.c:1500
+#: builtin/commit.c:1534
msgid "ok to record a change with an empty message"
msgstr "å…许空的æ交说明"
-#: builtin/commit.c:1529
+#: builtin/commit.c:1562
msgid "could not parse HEAD commit"
msgstr "ä¸èƒ½è§£æž HEAD æ交"
-#: builtin/commit.c:1567 builtin/merge.c:518
+#: builtin/commit.c:1601 builtin/merge.c:518
#, c-format
msgid "could not open '%s' for reading"
msgstr "ä¸èƒ½ä¸ºè¯»å…¥æ‰“å¼€ '%s'"
-#: builtin/commit.c:1574
+#: builtin/commit.c:1608
#, c-format
msgid "Corrupt MERGE_HEAD file (%s)"
msgstr "æŸåçš„ MERGE_HEAD 文件(%s)"
-#: builtin/commit.c:1581
+#: builtin/commit.c:1615
msgid "could not read MERGE_MODE"
msgstr "ä¸èƒ½è¯»å– MERGE_MODE"
-#: builtin/commit.c:1600
+#: builtin/commit.c:1634
#, c-format
msgid "could not read commit message: %s"
msgstr "ä¸èƒ½è¯»å–æ交说明:%s"
-#: builtin/commit.c:1611
+#: builtin/commit.c:1645
#, c-format
msgid "Aborting commit; you did not edit the message.\n"
msgstr "终止æ交;您未更改æ¥è‡ªæ¨¡ç‰ˆçš„æ交说明。\n"
-#: builtin/commit.c:1616
+#: builtin/commit.c:1650
#, c-format
msgid "Aborting commit due to empty commit message.\n"
msgstr "终止æ交因为æ交说明为空。\n"
-#: builtin/commit.c:1631 builtin/merge.c:854 builtin/merge.c:879
+#: builtin/commit.c:1665 builtin/merge.c:857 builtin/merge.c:882
msgid "failed to write commit object"
msgstr "无法写æ交对象"
-#: builtin/commit.c:1652
+#: builtin/commit.c:1686
msgid "cannot lock HEAD ref"
msgstr "无法é”定 HEAD 引用"
-#: builtin/commit.c:1656
+#: builtin/commit.c:1690
msgid "cannot update HEAD ref"
msgstr "无法更新 HEAD 引用"
-#: builtin/commit.c:1667
+#: builtin/commit.c:1701
msgid ""
"Repository has been updated, but unable to write\n"
"new_index file. Check that disk is not full or quota is\n"
@@ -4649,127 +4568,127 @@ msgstr ""
msgid "git config [options]"
msgstr "git config [选项]"
-#: builtin/config.c:54
+#: builtin/config.c:53
msgid "Config file location"
msgstr "é…置文件ä½ç½®"
-#: builtin/config.c:55
+#: builtin/config.c:54
msgid "use global config file"
msgstr "使用全局é…置文件"
-#: builtin/config.c:56
+#: builtin/config.c:55
msgid "use system config file"
msgstr "使用系统级é…置文件"
-#: builtin/config.c:57
+#: builtin/config.c:56
msgid "use repository config file"
msgstr "使用版本库级é…置文件"
-#: builtin/config.c:58
+#: builtin/config.c:57
msgid "use given config file"
msgstr "使用指定的é…置文件"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "blob-id"
msgstr "æ•°æ®å¯¹è±¡ID"
-#: builtin/config.c:59
+#: builtin/config.c:58
msgid "read config from given blob object"
msgstr "从给定的数æ®å¯¹è±¡è¯»å–é…ç½®"
-#: builtin/config.c:60
+#: builtin/config.c:59
msgid "Action"
msgstr "æ“作"
-#: builtin/config.c:61
+#: builtin/config.c:60
msgid "get value: name [value-regex]"
msgstr "获å–值:name [value-regex]"
-#: builtin/config.c:62
+#: builtin/config.c:61
msgid "get all values: key [value-regex]"
msgstr "获得所有的值:key [value-regex]"
-#: builtin/config.c:63
+#: builtin/config.c:62
msgid "get values for regexp: name-regex [value-regex]"
msgstr "æ ¹æ®æ­£åˆ™è¡¨è¾¾å¼èŽ·å¾—值:name-regex [value-regex]"
-#: builtin/config.c:64
+#: builtin/config.c:63
msgid "get value specific for the URL: section[.var] URL"
msgstr "获得 URL å–值:section[.var] URL"
-#: builtin/config.c:65
+#: builtin/config.c:64
msgid "replace all matching variables: name value [value_regex]"
msgstr "替æ¢æ‰€æœ‰åŒ¹é…çš„å˜é‡ï¼šname value [value_regex]"
-#: builtin/config.c:66
+#: builtin/config.c:65
msgid "add a new variable: name value"
msgstr "添加一个新的å˜é‡ï¼šname value"
-#: builtin/config.c:67
+#: builtin/config.c:66
msgid "remove a variable: name [value-regex]"
msgstr "删除一个å˜é‡ï¼šname [value-regex]"
-#: builtin/config.c:68
+#: builtin/config.c:67
msgid "remove all matches: name [value-regex]"
msgstr "删除所有匹é…项:name [value-regex]"
-#: builtin/config.c:69
+#: builtin/config.c:68
msgid "rename section: old-name new-name"
msgstr "é‡å‘½åå°èŠ‚:old-name new-name"
-#: builtin/config.c:70
+#: builtin/config.c:69
msgid "remove a section: name"
msgstr "删除一个å°èŠ‚:name"
-#: builtin/config.c:71
+#: builtin/config.c:70
msgid "list all"
msgstr "列出所有"
-#: builtin/config.c:72
+#: builtin/config.c:71
msgid "open an editor"
msgstr "打开一个编辑器"
-#: builtin/config.c:73 builtin/config.c:74
+#: builtin/config.c:72 builtin/config.c:73
msgid "slot"
msgstr "slot"
-#: builtin/config.c:73
+#: builtin/config.c:72
msgid "find the color configured: [default]"
msgstr "找到é…置的颜色:[默认]"
-#: builtin/config.c:74
+#: builtin/config.c:73
msgid "find the color setting: [stdout-is-tty]"
msgstr "找到颜色设置:[stdout-is-tty]"
-#: builtin/config.c:75
+#: builtin/config.c:74
msgid "Type"
msgstr "类型"
-#: builtin/config.c:76
+#: builtin/config.c:75
msgid "value is \"true\" or \"false\""
msgstr "值是 \"true\" 或 \"false\""
-#: builtin/config.c:77
+#: builtin/config.c:76
msgid "value is decimal number"
msgstr "值是å进制数"
-#: builtin/config.c:78
+#: builtin/config.c:77
msgid "value is --bool or --int"
msgstr "值是 --bool or --int"
-#: builtin/config.c:79
+#: builtin/config.c:78
msgid "value is a path (file or directory name)"
msgstr "值是一个路径(文件或目录å)"
-#: builtin/config.c:80
+#: builtin/config.c:79
msgid "Other"
msgstr "其它"
-#: builtin/config.c:81
+#: builtin/config.c:80
msgid "terminate values with NUL byte"
msgstr "终止值是NUL字节"
-#: builtin/config.c:82
+#: builtin/config.c:81
msgid "respect include directives on lookup"
msgstr "查询时å‚ç…§ include 指令递归查找"
@@ -4789,47 +4708,47 @@ msgstr "git describe [选项] <æ交å·>*"
msgid "git describe [options] --dirty"
msgstr "git describe [选项] --dirty"
-#: builtin/describe.c:237
+#: builtin/describe.c:225
#, c-format
msgid "annotated tag %s not available"
msgstr "注释 tag %s 无效"
-#: builtin/describe.c:241
+#: builtin/describe.c:229
#, c-format
msgid "annotated tag %s has no embedded name"
msgstr "注释 tag %s 没有嵌入å称"
-#: builtin/describe.c:243
+#: builtin/describe.c:231
#, c-format
msgid "tag '%s' is really '%s' here"
msgstr "tag '%s' 的确是在 '%s'"
-#: builtin/describe.c:270
+#: builtin/describe.c:258
#, c-format
msgid "Not a valid object name %s"
msgstr "ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„对象å %s"
-#: builtin/describe.c:273
+#: builtin/describe.c:261
#, c-format
msgid "%s is not a valid '%s' object"
msgstr "%s ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„ '%s' 对象"
-#: builtin/describe.c:290
+#: builtin/describe.c:278
#, c-format
msgid "no tag exactly matches '%s'"
msgstr "没有 tag å‡†ç¡®åŒ¹é… '%s'"
-#: builtin/describe.c:292
+#: builtin/describe.c:280
#, c-format
msgid "searching to describe %s\n"
msgstr "æœç´¢æè¿° %s\n"
-#: builtin/describe.c:332
+#: builtin/describe.c:327
#, c-format
msgid "finished search at %s\n"
msgstr "完æˆæœç´¢ %s\n"
-#: builtin/describe.c:359
+#: builtin/describe.c:354
#, c-format
msgid ""
"No annotated tags can describe '%s'.\n"
@@ -4838,7 +4757,7 @@ msgstr ""
"没有注释 tag 能æè¿° '%s'。\n"
"然而,有éžæ³¨é‡Š tag:å°è¯• --tags。"
-#: builtin/describe.c:363
+#: builtin/describe.c:358
#, c-format
msgid ""
"No tags can describe '%s'.\n"
@@ -4847,12 +4766,12 @@ msgstr ""
"没有注释 tag 能æè¿° '%s'。\n"
"å°è¯• --always,或者创建一些 tag。"
-#: builtin/describe.c:384
+#: builtin/describe.c:379
#, c-format
msgid "traversed %lu commits\n"
msgstr "å·²é历 %lu 个æ交\n"
-#: builtin/describe.c:387
+#: builtin/describe.c:382
#, c-format
msgid ""
"more than %i tags found; listed %i most recent\n"
@@ -4861,63 +4780,63 @@ msgstr ""
"å‘现多于 %i 个 tag,列出最近的 %i 个\n"
"在 %s 放弃æœç´¢\n"
-#: builtin/describe.c:409
+#: builtin/describe.c:404
msgid "find the tag that comes after the commit"
msgstr "寻找æ交之åŽçš„ tag(用于æè¿°æ交)"
-#: builtin/describe.c:410
+#: builtin/describe.c:405
msgid "debug search strategy on stderr"
msgstr "在标准错误上调试æœç´¢ç­–ç•¥"
-#: builtin/describe.c:411
+#: builtin/describe.c:406
msgid "use any ref"
msgstr "使用任æ„引用"
-#: builtin/describe.c:412
+#: builtin/describe.c:407
msgid "use any tag, even unannotated"
msgstr "ä½¿ç”¨ä»»æ„ tag,å³ä½¿æœªå¸¦æ³¨è§£"
-#: builtin/describe.c:413
+#: builtin/describe.c:408
msgid "always use long format"
msgstr "始终使用长æ交å·æ ¼å¼"
-#: builtin/describe.c:414
+#: builtin/describe.c:409
msgid "only follow first parent"
msgstr "åªè·Ÿéšç¬¬ä¸€ä¸ªçˆ¶æ交"
-#: builtin/describe.c:417
+#: builtin/describe.c:412
msgid "only output exact matches"
msgstr "åªè¾“出精确匹é…"
-#: builtin/describe.c:419
+#: builtin/describe.c:414
msgid "consider <n> most recent tags (default: 10)"
msgstr "考虑最近 <n> 个 tags(默认:10)"
-#: builtin/describe.c:421
+#: builtin/describe.c:416
msgid "only consider tags matching <pattern>"
msgstr "åªè€ƒè™‘åŒ¹é… <模å¼> çš„ tags"
-#: builtin/describe.c:423 builtin/name-rev.c:321
+#: builtin/describe.c:418 builtin/name-rev.c:321
msgid "show abbreviated commit object as fallback"
msgstr "显示简写的æ交å·ä½œä¸ºåŽå¤‡"
-#: builtin/describe.c:424
+#: builtin/describe.c:419
msgid "mark"
msgstr "标记"
-#: builtin/describe.c:425
+#: builtin/describe.c:420
msgid "append <mark> on dirty working tree (default: \"-dirty\")"
msgstr "若工作区è„(有å˜æ›´ï¼‰åœ¨ç»“尾添加 <标记>(默认:\"-dirty\")"
-#: builtin/describe.c:443
+#: builtin/describe.c:438
msgid "--long is incompatible with --abbrev=0"
msgstr "--long 与 --abbrev=0 ä¸å…¼å®¹"
-#: builtin/describe.c:469
+#: builtin/describe.c:464
msgid "No names found, cannot describe anything."
msgstr "没有å‘现å称,无法æ述任何东西。"
-#: builtin/describe.c:489
+#: builtin/describe.c:484
msgid "--dirty is incompatible with commit-ishes"
msgstr "--dirty ä¸èƒ½ä¸Žæ交åŒæ—¶ä½¿ç”¨"
@@ -4948,7 +4867,7 @@ msgstr "æ供了超过两个数æ®ï¼ˆblob)对象:'%s'"
#: builtin/diff.c:416
#, c-format
msgid "unhandled object '%s' given."
-msgstr "æ供了无法处ç†çš„对象 '%s'。"
+msgstr "无法处ç†çš„对象 '%s'。"
#: builtin/fast-export.c:22
msgid "git fast-export [rev-list-opts]"
@@ -5213,7 +5132,7 @@ msgstr "æ­£åœ¨èŽ·å– %s\n"
msgid "Could not fetch %s"
msgstr "ä¸èƒ½èŽ·å– %s"
-#: builtin/fetch.c:1036
+#: builtin/fetch.c:1035
msgid ""
"No remote repository specified. Please, specify either a URL or a\n"
"remote name from which new revisions should be fetched."
@@ -5253,10 +5172,10 @@ msgid "git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
msgstr ""
"git fmt-merge-msg [-m <message>] [--log[=<n>]|--no-log] [--file <file>]"
-#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:702
-#: builtin/merge.c:196 builtin/repack.c:160 builtin/repack.c:164
-#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:446
-#: parse-options.h:135 parse-options.h:242
+#: builtin/fmt-merge-msg.c:663 builtin/fmt-merge-msg.c:666 builtin/grep.c:700
+#: builtin/merge.c:196 builtin/repack.c:175 builtin/repack.c:179
+#: builtin/show-branch.c:654 builtin/show-ref.c:178 builtin/tag.c:501
+#: parse-options.h:132 parse-options.h:239
msgid "n"
msgstr "n"
@@ -5320,6 +5239,14 @@ msgstr "key"
msgid "field name to sort on"
msgstr "排åºçš„字段å"
+#: builtin/fsck.c:147 builtin/prune.c:172
+msgid "Checking connectivity"
+msgstr "检查连接中"
+
+#: builtin/fsck.c:544
+msgid "Checking object directories"
+msgstr "检查对象目录中"
+
#: builtin/fsck.c:607
msgid "git fsck [options] [<object>...]"
msgstr "git fsck [选项] [<对象>...]"
@@ -5364,54 +5291,63 @@ msgstr "将摇摆对象写入 .git/lost-found 中"
msgid "show progress"
msgstr "显示进度"
+#: builtin/fsck.c:673
+msgid "Checking objects"
+msgstr "检查对象中"
+
#: builtin/gc.c:24
msgid "git gc [options]"
msgstr "git gc [选项]"
-#: builtin/gc.c:80
+#: builtin/gc.c:90
#, c-format
msgid "Invalid %s: '%s'"
msgstr "无效的 %s:'%s'"
-#: builtin/gc.c:107
+#: builtin/gc.c:117
#, c-format
msgid "insanely long object directory %.*s"
msgstr "ä¸æ­£å¸¸çš„长对象目录 %.*s"
-#: builtin/gc.c:262
+#: builtin/gc.c:273
msgid "prune unreferenced objects"
msgstr "清除未引用的对象"
-#: builtin/gc.c:264
+#: builtin/gc.c:275
msgid "be more thorough (increased runtime)"
msgstr "更彻底(增加è¿è¡Œæ—¶é—´ï¼‰"
-#: builtin/gc.c:265
+#: builtin/gc.c:276
msgid "enable auto-gc mode"
msgstr "å¯ç”¨è‡ªåŠ¨åžƒåœ¾å›žæ”¶æ¨¡å¼"
-#: builtin/gc.c:266
+#: builtin/gc.c:277
msgid "force running gc even if there may be another gc running"
msgstr "强制执行 gc å³ä½¿å¦å¤–一个 gc 正在执行"
-#: builtin/gc.c:306
+#: builtin/gc.c:318
#, 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 ""
-"自动打包版本库以求最佳性能。您还å¯ä»¥æ‰‹åŠ¨è¿è¡Œ \"git gc\"。\n"
-"å‚è§ \"git help gc\" 以获å–更多信æ¯ã€‚\n"
+msgid "Auto packing the repository in background for optimum performance.\n"
+msgstr "自动在åŽå°æ‰§è¡Œç‰ˆæœ¬åº“打包以求最佳性能。\n"
+
+#: builtin/gc.c:320
+#, c-format
+msgid "Auto packing the repository for optimum performance.\n"
+msgstr "自动打包版本库以求最佳性能。\n"
+
+#: builtin/gc.c:321
+#, c-format
+msgid "See \"git help gc\" for manual housekeeping.\n"
+msgstr "手工维护å‚è§ \"git help gc\"。\n"
-#. be quiet on --auto
-#: builtin/gc.c:316
+#: builtin/gc.c:336
#, c-format
msgid ""
"gc is already running on machine '%s' pid %<PRIuMAX> (use --force if not)"
msgstr ""
"å·²ç»æœ‰ä¸€ä¸ª gc æ­£è¿è¡Œåœ¨æœºå™¨ '%s' pid %<PRIuMAX> (如果ä¸æ˜¯ï¼Œä½¿ç”¨ --force)"
-#: builtin/gc.c:341
+#: builtin/gc.c:361
msgid ""
"There are too many unreachable loose objects; run 'git prune' to remove them."
msgstr "有太多ä¸å¯è¾¾çš„æ¾æ•£å¯¹è±¡ï¼Œè¿è¡Œ 'git prune' 删除它们。"
@@ -5440,210 +5376,210 @@ msgstr "无法读å–树(%s)"
msgid "unable to grep from object of type %s"
msgstr "无法抓å–æ¥è‡ªäºŽ %s 类型的对象"
-#: builtin/grep.c:551
+#: builtin/grep.c:549
#, c-format
msgid "switch `%c' expects a numerical value"
msgstr "开关 `%c' 期望一个数字值"
-#: builtin/grep.c:568
+#: builtin/grep.c:566
#, c-format
msgid "cannot open '%s'"
msgstr "ä¸èƒ½æ‰“å¼€ '%s'"
-#: builtin/grep.c:642
+#: builtin/grep.c:640
msgid "search in index instead of in the work tree"
msgstr "在索引区æœç´¢è€Œä¸æ˜¯åœ¨å·¥ä½œåŒº"
-#: builtin/grep.c:644
+#: builtin/grep.c:642
msgid "find in contents not managed by git"
msgstr "在未被 git 管ç†çš„内容中查找"
# 译者:中文字符串拼接,å¯åˆ é™¤å‰å¯¼ç©ºæ ¼
-#: builtin/grep.c:646
+#: builtin/grep.c:644
msgid "search in both tracked and untracked files"
msgstr "在跟踪和未跟踪的文件中æœç´¢"
-#: builtin/grep.c:648
+#: builtin/grep.c:646
msgid "search also in ignored files"
msgstr "也在忽略的文件中æœç´¢"
-#: builtin/grep.c:651
+#: builtin/grep.c:649
msgid "show non-matching lines"
msgstr "显示未匹é…çš„è¡Œ"
-#: builtin/grep.c:653
+#: builtin/grep.c:651
msgid "case insensitive matching"
msgstr "ä¸åŒºåˆ†å¤§å°å†™åŒ¹é…"
-#: builtin/grep.c:655
+#: builtin/grep.c:653
msgid "match patterns only at word boundaries"
msgstr "åªåœ¨å•è¯è¾¹ç•ŒåŒ¹é…模å¼"
-#: builtin/grep.c:657
+#: builtin/grep.c:655
msgid "process binary files as text"
msgstr "把二进制文件当åšæ–‡æœ¬å¤„ç†"
-#: builtin/grep.c:659
+#: builtin/grep.c:657
msgid "don't match patterns in binary files"
msgstr "ä¸åœ¨äºŒè¿›åˆ¶æ–‡ä»¶ä¸­åŒ¹é…模å¼"
-#: builtin/grep.c:662
+#: builtin/grep.c:660
msgid "process binary files with textconv filters"
msgstr "用 textconv 过滤器处ç†äºŒè¿›åˆ¶æ–‡ä»¶"
-#: builtin/grep.c:664
+#: builtin/grep.c:662
msgid "descend at most <depth> levels"
msgstr "最多以指定的深度å‘下寻找"
-#: builtin/grep.c:668
+#: builtin/grep.c:666
msgid "use extended POSIX regular expressions"
msgstr "使用扩展的 POSIX 正则表达å¼"
-#: builtin/grep.c:671
+#: builtin/grep.c:669
msgid "use basic POSIX regular expressions (default)"
msgstr "使用基本的 POSIX 正则表达å¼ï¼ˆé»˜è®¤ï¼‰"
-#: builtin/grep.c:674
+#: builtin/grep.c:672
msgid "interpret patterns as fixed strings"
msgstr "把模å¼è§£æžä¸ºå›ºå®šçš„字符串"
-#: builtin/grep.c:677
+#: builtin/grep.c:675
msgid "use Perl-compatible regular expressions"
msgstr "使用 Perl 兼容的正则表达å¼"
-#: builtin/grep.c:680
+#: builtin/grep.c:678
msgid "show line numbers"
msgstr "显示行å·"
-#: builtin/grep.c:681
+#: builtin/grep.c:679
msgid "don't show filenames"
msgstr "ä¸æ˜¾ç¤ºæ–‡ä»¶å"
-#: builtin/grep.c:682
+#: builtin/grep.c:680
msgid "show filenames"
msgstr "显示文件å"
-#: builtin/grep.c:684
+#: builtin/grep.c:682
msgid "show filenames relative to top directory"
msgstr "显示相对于顶级目录的文件å"
-#: builtin/grep.c:686
+#: builtin/grep.c:684
msgid "show only filenames instead of matching lines"
msgstr "åªæ˜¾ç¤ºæ–‡ä»¶å而ä¸æ˜¾ç¤ºåŒ¹é…çš„è¡Œ"
-#: builtin/grep.c:688
+#: builtin/grep.c:686
msgid "synonym for --files-with-matches"
msgstr "å’Œ --files-with-matches åŒä¹‰"
-#: builtin/grep.c:691
+#: builtin/grep.c:689
msgid "show only the names of files without match"
msgstr "åªæ˜¾ç¤ºæœªåŒ¹é…的文件å"
-#: builtin/grep.c:693
+#: builtin/grep.c:691
msgid "print NUL after filenames"
msgstr "在文件ååŽè¾“出 NUL 字符"
-#: builtin/grep.c:695
+#: builtin/grep.c:693
msgid "show the number of matches instead of matching lines"
msgstr "显示总匹é…行数,而ä¸æ˜¾ç¤ºåŒ¹é…çš„è¡Œ"
-#: builtin/grep.c:696
+#: builtin/grep.c:694
msgid "highlight matches"
msgstr "高亮显示匹é…项"
-#: builtin/grep.c:698
+#: builtin/grep.c:696
msgid "print empty line between matches from different files"
msgstr "在ä¸åŒæ–‡ä»¶çš„匹é…项之间打å°ç©ºè¡Œ"
-#: builtin/grep.c:700
+#: builtin/grep.c:698
msgid "show filename only once above matches from same file"
msgstr "åªåœ¨åŒä¸€æ–‡ä»¶çš„匹é…项的上é¢æ˜¾ç¤ºä¸€æ¬¡æ–‡ä»¶å"
-#: builtin/grep.c:703
+#: builtin/grep.c:701
msgid "show <n> context lines before and after matches"
msgstr "显示匹é…项å‰åŽçš„ <n> 行上下文"
-#: builtin/grep.c:706
+#: builtin/grep.c:704
msgid "show <n> context lines before matches"
msgstr "显示匹é…é¡¹å‰ <n> 行上下文"
-#: builtin/grep.c:708
+#: builtin/grep.c:706
msgid "show <n> context lines after matches"
msgstr "显示匹é…é¡¹åŽ <n> 行上下文"
-#: builtin/grep.c:709
+#: builtin/grep.c:707
msgid "shortcut for -C NUM"
msgstr "å¿«æ·é”® -C æ•°å­—"
-#: builtin/grep.c:712
+#: builtin/grep.c:710
msgid "show a line with the function name before matches"
msgstr "在匹é…çš„å‰é¢æ˜¾ç¤ºä¸€è¡Œå‡½æ•°å"
-#: builtin/grep.c:714
+#: builtin/grep.c:712
msgid "show the surrounding function"
msgstr "显示所在函数的å‰åŽå†…容"
-#: builtin/grep.c:717
+#: builtin/grep.c:715
msgid "read patterns from file"
msgstr "从文件读å–模å¼"
-#: builtin/grep.c:719
+#: builtin/grep.c:717
msgid "match <pattern>"
msgstr "åŒ¹é… <模å¼>"
-#: builtin/grep.c:721
+#: builtin/grep.c:719
msgid "combine patterns specified with -e"
msgstr "组åˆç”¨ -e å‚数设定的模å¼"
-#: builtin/grep.c:733
+#: builtin/grep.c:731
msgid "indicate hit with exit status without output"
msgstr "ä¸è¾“出,而用退出ç æ ‡è¯†å‘½ä¸­çŠ¶æ€"
-#: builtin/grep.c:735
+#: builtin/grep.c:733
msgid "show only matches from files that match all patterns"
msgstr "åªæ˜¾ç¤ºåŒ¹é…所有模å¼çš„文件中的匹é…"
-#: builtin/grep.c:737
+#: builtin/grep.c:735
msgid "show parse tree for grep expression"
msgstr "显示 grep 表达å¼çš„解æžæ ‘"
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "pager"
msgstr "分页"
-#: builtin/grep.c:741
+#: builtin/grep.c:739
msgid "show matching files in the pager"
msgstr "分页显示匹é…的文件"
-#: builtin/grep.c:744
+#: builtin/grep.c:742
msgid "allow calling of grep(1) (ignored by this build)"
msgstr "å…许调用 grep(1)(本次构建忽略)"
-#: builtin/grep.c:745 builtin/show-ref.c:187
+#: builtin/grep.c:743 builtin/show-ref.c:187
msgid "show usage"
msgstr "显示用法"
-#: builtin/grep.c:812
+#: builtin/grep.c:810
msgid "no pattern given."
msgstr "未æ供模å¼åŒ¹é…。"
-#: builtin/grep.c:870
+#: builtin/grep.c:868
msgid "--open-files-in-pager only works on the worktree"
msgstr "--open-files-in-pager 仅用于工作区"
-#: builtin/grep.c:893
+#: builtin/grep.c:891
msgid "--cached or --untracked cannot be used with --no-index."
msgstr "--cached 或 --untracked ä¸èƒ½ä¸Ž --no-index åŒæ—¶ä½¿ç”¨ã€‚"
-#: builtin/grep.c:898
+#: builtin/grep.c:896
msgid "--no-index or --untracked cannot be used with revs."
msgstr "--no-index 或 --untracked ä¸èƒ½å’Œç‰ˆæœ¬åŒæ—¶ä½¿ç”¨ã€‚"
-#: builtin/grep.c:901
+#: builtin/grep.c:899
msgid "--[no-]exclude-standard cannot be used for tracked contents."
msgstr "--[no-]exclude-standard ä¸èƒ½ç”¨äºŽå·²è·Ÿè¸ªå†…容。"
-#: builtin/grep.c:909
+#: builtin/grep.c:907
msgid "both --cached and trees are given."
msgstr "åŒæ—¶ç»™å‡ºäº† --cached 和树对象。"
@@ -5659,7 +5595,7 @@ msgstr ""
msgid "git hash-object --stdin-paths < <list-of-paths>"
msgstr "git hash-object --stdin-paths < <路径列表>"
-#: builtin/hash-object.c:72
+#: builtin/hash-object.c:72 builtin/tag.c:521
msgid "type"
msgstr "类型"
@@ -5898,8 +5834,8 @@ msgstr "解压缩严é‡çš„ä¸ä¸€è‡´"
msgid "SHA1 COLLISION FOUND WITH %s !"
msgstr "å‘现 %s 出现 SHA1 冲çªï¼"
-#: builtin/index-pack.c:669 builtin/pack-objects.c:171
-#: builtin/pack-objects.c:263
+#: builtin/index-pack.c:669 builtin/pack-objects.c:162
+#: builtin/pack-objects.c:254
#, c-format
msgid "unable to read %s"
msgstr "ä¸èƒ½è¯» %s"
@@ -6165,34 +6101,32 @@ msgstr "ä¸èƒ½å¤„ç† %d 类型的文件"
msgid "unable to move %s to %s"
msgstr "ä¸èƒ½ç§»åŠ¨ %s 至 %s"
-#.
-#. * 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
+#. 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:418
#, c-format
msgid "%s%s Git repository in %s%s\n"
msgstr "%s%s Git 版本库于 %s%s\n"
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Reinitialized existing"
msgstr "é‡æ–°åˆå§‹åŒ–现存的"
-#: builtin/init-db.c:421
+#: builtin/init-db.c:419
msgid "Initialized empty"
msgstr "åˆå§‹åŒ–空的"
# 译者:中文字符串拼接,å¯åˆ é™¤å‰å¯¼ç©ºæ ¼
-#: builtin/init-db.c:422
+#: builtin/init-db.c:420
msgid " shared"
msgstr "共享"
-#: builtin/init-db.c:441
+#: builtin/init-db.c:439
msgid "cannot tell cwd"
msgstr "无法获知当å‰è·¯å¾„"
-#: builtin/init-db.c:467
+#: builtin/init-db.c:465
msgid ""
"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
"shared[=<permissions>]] [directory]"
@@ -6200,29 +6134,29 @@ msgstr ""
"git init [-q | --quiet] [--bare] [--template=<模æ¿ç›®å½•>] [--shared[=<æƒé™>]] "
"[目录]"
-#: builtin/init-db.c:490
+#: builtin/init-db.c:488
msgid "permissions"
msgstr "æƒé™"
-#: builtin/init-db.c:491
+#: builtin/init-db.c:489
msgid "specify that the git repository is to be shared amongst several users"
msgstr "指定 git 版本库是多个用户之间共享的"
-#: builtin/init-db.c:493 builtin/prune-packed.c:79 builtin/repack.c:155
+#: builtin/init-db.c:491 builtin/prune-packed.c:79 builtin/repack.c:168
msgid "be quiet"
msgstr "ä¿æŒå®‰é™"
-#: builtin/init-db.c:525 builtin/init-db.c:530
+#: builtin/init-db.c:523 builtin/init-db.c:528
#, c-format
msgid "cannot mkdir %s"
msgstr "ä¸èƒ½åˆ›å»ºç›®å½• %s"
-#: builtin/init-db.c:534
+#: builtin/init-db.c:532
#, c-format
msgid "cannot chdir to %s"
msgstr "ä¸èƒ½åˆ‡æ¢ç›®å½•åˆ° %s"
-#: builtin/init-db.c:556
+#: builtin/init-db.c:554
#, c-format
msgid ""
"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-"
@@ -6231,11 +6165,11 @@ msgstr ""
"ä¸å…许 %s(或 --work-tree=<directory>)而没有指定 %s(或 --git-"
"dir=<directory>)"
-#: builtin/init-db.c:580
+#: builtin/init-db.c:578
msgid "Cannot access current working directory"
msgstr "ä¸èƒ½è®¿é—®å½“å‰å·¥ä½œç›®å½•"
-#: builtin/init-db.c:587
+#: builtin/init-db.c:585
#, c-format
msgid "Cannot access work tree '%s'"
msgstr "ä¸èƒ½è®¿é—®å·¥ä½œåŒº '%s'"
@@ -6498,95 +6432,95 @@ msgstr "ä¸èƒ½æ‰¾åˆ°è·Ÿè¸ªçš„远程分支,请手工指定 <upstream>。\n"
msgid "Unknown commit %s"
msgstr "未知æ交 %s"
-#: builtin/ls-files.c:398
+#: builtin/ls-files.c:401
msgid "git ls-files [options] [<file>...]"
msgstr "git ls-files [选项] [<文件>...]"
-#: builtin/ls-files.c:455
+#: builtin/ls-files.c:458
msgid "identify the file status with tags"
msgstr "用标签标识文件的状æ€"
-#: builtin/ls-files.c:457
+#: builtin/ls-files.c:460
msgid "use lowercase letters for 'assume unchanged' files"
msgstr "使用å°å†™å­—æ¯è¡¨ç¤º 'å‡è®¾æœªæ”¹å˜çš„' 文件"
-#: builtin/ls-files.c:459
+#: builtin/ls-files.c:462
msgid "show cached files in the output (default)"
msgstr "显示缓存的文件(默认)"
-#: builtin/ls-files.c:461
+#: builtin/ls-files.c:464
msgid "show deleted files in the output"
msgstr "显示已删除的文件"
-#: builtin/ls-files.c:463
+#: builtin/ls-files.c:466
msgid "show modified files in the output"
msgstr "显示已修改的文件"
-#: builtin/ls-files.c:465
+#: builtin/ls-files.c:468
msgid "show other files in the output"
msgstr "显示其它文件"
-#: builtin/ls-files.c:467
+#: builtin/ls-files.c:470
msgid "show ignored files in the output"
msgstr "显示忽略的文件"
-#: builtin/ls-files.c:470
+#: builtin/ls-files.c:473
msgid "show staged contents' object name in the output"
msgstr "显示暂存区内容的对象å称"
-#: builtin/ls-files.c:472
+#: builtin/ls-files.c:475
msgid "show files on the filesystem that need to be removed"
msgstr "显示文件系统需è¦åˆ é™¤çš„文件"
-#: builtin/ls-files.c:474
+#: builtin/ls-files.c:477
msgid "show 'other' directories' name only"
msgstr "åªæ˜¾ç¤ºâ€œå…¶ä»–â€ç›®å½•çš„å称"
-#: builtin/ls-files.c:477
+#: builtin/ls-files.c:480
msgid "don't show empty directories"
msgstr "ä¸æ˜¾ç¤ºç©ºç›®å½•"
-#: builtin/ls-files.c:480
+#: builtin/ls-files.c:483
msgid "show unmerged files in the output"
msgstr "显示未åˆå¹¶çš„文件"
-#: builtin/ls-files.c:482
+#: builtin/ls-files.c:485
msgid "show resolve-undo information"
msgstr "显示 resolve-undo ä¿¡æ¯"
-#: builtin/ls-files.c:484
+#: builtin/ls-files.c:487
msgid "skip files matching pattern"
msgstr "匹é…排除文件的模å¼"
-#: builtin/ls-files.c:487
+#: builtin/ls-files.c:490
msgid "exclude patterns are read from <file>"
msgstr "从 <文件> 中读å–排除模å¼"
-#: builtin/ls-files.c:490
+#: builtin/ls-files.c:493
msgid "read additional per-directory exclude patterns in <file>"
msgstr "从 <文件> 读å–é¢å¤–çš„æ¯ä¸ªç›®å½•çš„排除模å¼"
-#: builtin/ls-files.c:492
+#: builtin/ls-files.c:495
msgid "add the standard git exclusions"
msgstr "添加标准的 git 排除"
-#: builtin/ls-files.c:495
+#: builtin/ls-files.c:498
msgid "make the output relative to the project top directory"
msgstr "显示相对于顶级目录的文件å"
-#: builtin/ls-files.c:498
+#: builtin/ls-files.c:501
msgid "if any <file> is not in the index, treat this as an error"
msgstr "如果任何 <文件> 都ä¸åœ¨ç´¢å¼•åŒºï¼Œè§†ä¸ºé”™è¯¯"
-#: builtin/ls-files.c:499
+#: builtin/ls-files.c:502
msgid "tree-ish"
msgstr "树或æ交"
-#: builtin/ls-files.c:500
+#: builtin/ls-files.c:503
msgid "pretend that paths removed since <tree-ish> are still present"
msgstr "å‡è£…自从 <树或æ交> 之åŽåˆ é™¤çš„路径ä»ç„¶å­˜åœ¨"
-#: builtin/ls-files.c:502
+#: builtin/ls-files.c:505
msgid "show debugging data"
msgstr "显示调试数æ®"
@@ -6697,7 +6631,7 @@ msgstr "如果ä¸èƒ½å¿«è¿›å°±æ”¾å¼ƒåˆå¹¶"
msgid "Verify that the named commit has a valid GPG signature"
msgstr "验è¯æŒ‡å®šçš„æ交是å¦åŒ…å«ä¸€ä¸ªæœ‰æ•ˆçš„ GPG ç­¾å"
-#: builtin/merge.c:212 builtin/notes.c:738 builtin/revert.c:89
+#: builtin/merge.c:212 builtin/notes.c:742 builtin/revert.c:89
msgid "strategy"
msgstr "ç­–ç•¥"
@@ -6771,35 +6705,35 @@ msgstr "'%s' 没有指å‘一个æ交"
msgid "Bad branch.%s.mergeoptions string: %s"
msgstr "åçš„ branch.%s.mergeoptions 字符串:%s"
-#: builtin/merge.c:650
+#: builtin/merge.c:653
msgid "git write-tree failed to write a tree"
msgstr "git write-tree 无法写入一树对象"
-#: builtin/merge.c:678
+#: builtin/merge.c:681
msgid "Not handling anything other than two heads merge."
msgstr "ä¸èƒ½å¤„ç†ä¸¤ä¸ªå¤´åˆå¹¶ä¹‹å¤–的任何æ“作。"
-#: builtin/merge.c:692
+#: builtin/merge.c:695
#, c-format
msgid "Unknown option for merge-recursive: -X%s"
msgstr "merge-recursive 的未知选项:-X%s"
-#: builtin/merge.c:706
+#: builtin/merge.c:709
#, c-format
msgid "unable to write %s"
msgstr "ä¸èƒ½å†™ %s"
-#: builtin/merge.c:795
+#: builtin/merge.c:798
#, c-format
msgid "Could not read from '%s'"
msgstr "ä¸èƒ½ä»Ž '%s' 读å–"
-#: builtin/merge.c:804
+#: builtin/merge.c:807
#, c-format
msgid "Not committing merge; use 'git commit' to complete the merge.\n"
msgstr "未æ交åˆå¹¶ï¼Œä½¿ç”¨ 'git commit' 完æˆæ­¤æ¬¡åˆå¹¶ã€‚\n"
-#: builtin/merge.c:810
+#: builtin/merge.c:813
#, c-format
msgid ""
"Please enter a commit message to explain why this merge is necessary,\n"
@@ -6813,47 +6747,47 @@ msgstr ""
"\n"
"以 '%c' 开头的行将被忽略,而且空æ交说明将会终止æ交。\n"
-#: builtin/merge.c:834
+#: builtin/merge.c:837
msgid "Empty commit message."
msgstr "空æ交信æ¯ã€‚"
-#: builtin/merge.c:846
+#: builtin/merge.c:849
#, c-format
msgid "Wonderful.\n"
msgstr "太棒了。\n"
-#: builtin/merge.c:911
+#: builtin/merge.c:914
#, c-format
msgid "Automatic merge failed; fix conflicts and then commit the result.\n"
msgstr "自动åˆå¹¶å¤±è´¥ï¼Œä¿®æ­£å†²çªç„¶åŽæ交修正的结果。\n"
-#: builtin/merge.c:927
+#: builtin/merge.c:930
#, c-format
msgid "'%s' is not a commit"
msgstr "'%s' ä¸æ˜¯ä¸€ä¸ªæ交"
-#: builtin/merge.c:968
+#: builtin/merge.c:971
msgid "No current branch."
msgstr "没有当å‰åˆ†æ”¯ã€‚"
-#: builtin/merge.c:970
+#: builtin/merge.c:973
msgid "No remote for the current branch."
msgstr "当å‰åˆ†æ”¯æ²¡æœ‰å¯¹åº”的远程版本库。"
-#: builtin/merge.c:972
+#: builtin/merge.c:975
msgid "No default upstream defined for the current branch."
msgstr "当å‰åˆ†æ”¯æ²¡æœ‰å®šä¹‰é»˜è®¤çš„上游分支。"
-#: builtin/merge.c:977
+#: builtin/merge.c:980
#, c-format
msgid "No remote-tracking branch for %s from %s"
msgstr "对于 %s 没有æ¥è‡ª %s 的远程跟踪分支"
-#: builtin/merge.c:1133
+#: builtin/merge.c:1136
msgid "There is no merge to abort (MERGE_HEAD missing)."
msgstr "没有è¦ç»ˆæ­¢çš„åˆå¹¶ï¼ˆMERGE_HEAD 丢失)。"
-#: builtin/merge.c:1149 git-pull.sh:31
+#: builtin/merge.c:1152 git-pull.sh:31
msgid ""
"You have not concluded your merge (MERGE_HEAD exists).\n"
"Please, commit your changes before you can merge."
@@ -6861,11 +6795,11 @@ msgstr ""
"您尚未结æŸæ‚¨çš„åˆå¹¶ï¼ˆå­˜åœ¨ MERGE_HEAD)。\n"
"请在åˆå¹¶å‰å…ˆæ交您的修改。"
-#: builtin/merge.c:1152 git-pull.sh:34
+#: builtin/merge.c:1155 git-pull.sh:34
msgid "You have not concluded your merge (MERGE_HEAD exists)."
msgstr "您尚未结æŸæ‚¨çš„åˆå¹¶ï¼ˆå­˜åœ¨ MERGE_HEAD)。"
-#: builtin/merge.c:1156
+#: builtin/merge.c:1159
msgid ""
"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n"
"Please, commit your changes before you can merge."
@@ -6873,101 +6807,100 @@ msgstr ""
"您尚未结æŸæ‚¨çš„拣选(存在 CHERRY_PICK_HEAD)。\n"
"请在åˆå¹¶å‰å…ˆæ交您的修改。"
-#: builtin/merge.c:1159
+#: builtin/merge.c:1162
msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)."
msgstr "您尚未结æŸæ‚¨çš„拣选(存在 CHERRY_PICK_HEAD)。"
-#: builtin/merge.c:1168
+#: builtin/merge.c:1171
msgid "You cannot combine --squash with --no-ff."
msgstr "您ä¸èƒ½å°† --squash 与 --no-ff åŒæ—¶ä½¿ç”¨ã€‚"
-#: builtin/merge.c:1177
+#: builtin/merge.c:1180
msgid "No commit specified and merge.defaultToUpstream not set."
msgstr "未指定æ交并且 merge.defaultToUpstream 未设置。"
-#: builtin/merge.c:1209
+#: builtin/merge.c:1212
msgid "Can merge only exactly one commit into empty head"
msgstr "åªèƒ½å°†ä¸€ä¸ªæ交åˆå¹¶åˆ°ç©ºåˆ†æ”¯ä¸Š"
-#: builtin/merge.c:1212
+#: builtin/merge.c:1215
msgid "Squash commit into empty head not supported yet"
msgstr "å°šä¸æ”¯æŒåˆ°ç©ºåˆ†æ”¯çš„压缩æ交"
-#: builtin/merge.c:1214
+#: builtin/merge.c:1217
msgid "Non-fast-forward commit does not make sense into an empty head"
msgstr "到空分支的éžå¿«è¿›å¼æ交没有æ„义"
-#: builtin/merge.c:1219
+#: builtin/merge.c:1222
#, c-format
msgid "%s - not something we can merge"
msgstr "%s - ä¸èƒ½è¢«åˆå¹¶"
-#: builtin/merge.c:1270
+#: builtin/merge.c:1273
#, c-format
msgid "Commit %s has an untrusted GPG signature, allegedly by %s."
msgstr "æ交 %s 有一个éžå¯ä¿¡çš„声称æ¥è‡ª %s çš„ GPG ç­¾å。"
-#: builtin/merge.c:1273
+#: builtin/merge.c:1276
#, c-format
msgid "Commit %s has a bad GPG signature allegedly by %s."
msgstr "æ交 %s 有一个错误的声称æ¥è‡ª %s çš„ GPG ç­¾å。"
-#. 'N'
-#: builtin/merge.c:1276
+#: builtin/merge.c:1279
#, c-format
msgid "Commit %s does not have a GPG signature."
msgstr "æ交 %s 没有一个 GPG ç­¾å。"
-#: builtin/merge.c:1279
+#: builtin/merge.c:1282
#, c-format
msgid "Commit %s has a good GPG signature by %s\n"
msgstr "æ交 %s 有一个æ¥è‡ª %s 的好的 GPG ç­¾å。\n"
-#: builtin/merge.c:1363
+#: builtin/merge.c:1366
#, c-format
msgid "Updating %s..%s\n"
msgstr "æ›´æ–° %s..%s\n"
-#: builtin/merge.c:1402
+#: builtin/merge.c:1405
#, c-format
msgid "Trying really trivial in-index merge...\n"
msgstr "å°è¯•éžå¸¸å°çš„索引内åˆå¹¶...\n"
-#: builtin/merge.c:1409
+#: builtin/merge.c:1412
#, c-format
msgid "Nope.\n"
msgstr "无。\n"
-#: builtin/merge.c:1441
+#: builtin/merge.c:1444
msgid "Not possible to fast-forward, aborting."
msgstr "无法快进,终止。"
-#: builtin/merge.c:1464 builtin/merge.c:1543
+#: builtin/merge.c:1467 builtin/merge.c:1546
#, c-format
msgid "Rewinding the tree to pristine...\n"
msgstr "将树回滚至原始状æ€...\n"
-#: builtin/merge.c:1468
+#: builtin/merge.c:1471
#, c-format
msgid "Trying merge strategy %s...\n"
msgstr "å°è¯•åˆå¹¶ç­–ç•¥ %s...\n"
-#: builtin/merge.c:1534
+#: builtin/merge.c:1537
#, c-format
msgid "No merge strategy handled the merge.\n"
msgstr "没有åˆå¹¶ç­–略处ç†æ­¤åˆå¹¶ã€‚\n"
-#: builtin/merge.c:1536
+#: builtin/merge.c:1539
#, c-format
msgid "Merge with strategy %s failed.\n"
msgstr "使用策略 %s åˆå¹¶å¤±è´¥ã€‚\n"
-#: builtin/merge.c:1545
+#: builtin/merge.c:1548
#, c-format
msgid "Using the %s to prepare resolving by hand.\n"
msgstr "使用 %s 以准备手工解决。\n"
-#: builtin/merge.c:1557
+#: builtin/merge.c:1560
#, c-format
msgid "Automatic merge went well; stopped before committing as requested\n"
msgstr "自动åˆå¹¶è¿›å±•é¡ºåˆ©ï¼ŒæŒ‰è¦æ±‚在æ交å‰åœæ­¢\n"
@@ -7051,19 +6984,19 @@ msgstr "ä¸è¦è­¦å‘Šå†²çª"
msgid "set labels for file1/orig_file/file2"
msgstr "为 file1/orig_file/file2 设置标签"
-#: builtin/mktree.c:67
+#: builtin/mktree.c:64
msgid "git mktree [-z] [--missing] [--batch]"
msgstr "git mktree [-z] [--missing] [--batch]"
-#: builtin/mktree.c:153
+#: builtin/mktree.c:150
msgid "input is NUL terminated"
msgstr "输入以 NUL 字符终止"
-#: builtin/mktree.c:154 builtin/write-tree.c:24
+#: builtin/mktree.c:151 builtin/write-tree.c:24
msgid "allow missing objects"
msgstr "å…许丢失的对象"
-#: builtin/mktree.c:155
+#: builtin/mktree.c:152
msgid "allow creation of more than one tree"
msgstr "å…许创建一个以上的树"
@@ -7110,46 +7043,46 @@ msgstr "请将您的修改缓存到 .gitmodules 中或ä¿å­˜è¿›åº¦åŽå†ç»§ç»­"
msgid "Huh? %.*s is in index?"
msgstr "嗯?%.*s 在索引中?"
-#: builtin/mv.c:168
+#: builtin/mv.c:169
msgid "source directory is empty"
msgstr "æºç›®å½•ä¸ºç©º"
-#: builtin/mv.c:200
+#: builtin/mv.c:205
msgid "not under version control"
msgstr "ä¸åœ¨ç‰ˆæœ¬æŽ§åˆ¶ä¹‹ä¸‹"
-#: builtin/mv.c:202
+#: builtin/mv.c:207
msgid "destination exists"
msgstr "目标已存在"
-#: builtin/mv.c:210
+#: builtin/mv.c:215
#, c-format
msgid "overwriting '%s'"
msgstr "覆盖 '%s'"
-#: builtin/mv.c:213
+#: builtin/mv.c:218
msgid "Cannot overwrite"
msgstr "ä¸èƒ½è¦†ç›–"
-#: builtin/mv.c:216
+#: builtin/mv.c:221
msgid "multiple sources for the same target"
msgstr "åŒä¸€ç›®æ ‡å…·æœ‰å¤šä¸ªæº"
-#: builtin/mv.c:218
+#: builtin/mv.c:223
msgid "destination directory does not exist"
msgstr "目标目录ä¸å­˜åœ¨"
-#: builtin/mv.c:233
+#: builtin/mv.c:243
#, c-format
msgid "%s, source=%s, destination=%s"
msgstr "%s,æº=%s,目标=%s"
-#: builtin/mv.c:243
+#: builtin/mv.c:253
#, c-format
msgid "Renaming %s to %s\n"
msgstr "é‡å‘½å %s 至 %s\n"
-#: builtin/mv.c:246 builtin/remote.c:726 builtin/repack.c:328
+#: builtin/mv.c:256 builtin/remote.c:726 builtin/repack.c:355
#, c-format
msgid "renaming '%s' failed"
msgstr "é‡å‘½å '%s' 失败"
@@ -7317,7 +7250,7 @@ msgstr "ä¸èƒ½è¯»å– 'show' 的输出"
msgid "failed to finish 'show' for object '%s'"
msgstr "无法为对象 '%s' å®Œæˆ 'show'"
-#: builtin/notes.c:167 builtin/tag.c:341
+#: builtin/notes.c:167 builtin/tag.c:373
#, c-format
msgid "could not create file '%s'"
msgstr "ä¸èƒ½åˆ›å»ºæ–‡ä»¶ '%s'"
@@ -7326,7 +7259,7 @@ msgstr "ä¸èƒ½åˆ›å»ºæ–‡ä»¶ '%s'"
msgid "Please supply the note contents using either -m or -F option"
msgstr "请通过 -m 或 -F 选项为注解æ供内容"
-#: builtin/notes.c:207 builtin/notes.c:844
+#: builtin/notes.c:207 builtin/notes.c:848
#, c-format
msgid "Removing note for object %s\n"
msgstr "删除对象 %s 的注解\n"
@@ -7340,20 +7273,20 @@ msgstr "ä¸èƒ½å†™æ³¨è§£å¯¹è±¡"
msgid "The note contents has been left in %s"
msgstr "注解内容被留在文件 %s 中"
-#: builtin/notes.c:248 builtin/tag.c:537
+#: builtin/notes.c:248 builtin/tag.c:604
#, c-format
msgid "cannot read '%s'"
msgstr "ä¸èƒ½è¯»å– '%s'"
-#: builtin/notes.c:250 builtin/tag.c:540
+#: builtin/notes.c:250 builtin/tag.c:607
#, c-format
msgid "could not open or read '%s'"
msgstr "ä¸èƒ½æ‰“å¼€æˆ–è¯»å– '%s'"
-#: builtin/notes.c:269 builtin/notes.c:316 builtin/notes.c:318
-#: builtin/notes.c:378 builtin/notes.c:432 builtin/notes.c:515
-#: builtin/notes.c:520 builtin/notes.c:595 builtin/notes.c:637
-#: builtin/notes.c:839 builtin/tag.c:553
+#: builtin/notes.c:269 builtin/notes.c:320 builtin/notes.c:322
+#: builtin/notes.c:382 builtin/notes.c:436 builtin/notes.c:519
+#: builtin/notes.c:524 builtin/notes.c:599 builtin/notes.c:641
+#: builtin/notes.c:843 builtin/tag.c:620
#, c-format
msgid "Failed to resolve '%s' as a valid ref."
msgstr "æ— æ³•è§£æž '%s' 为一个有效引用。"
@@ -7363,89 +7296,94 @@ msgstr "æ— æ³•è§£æž '%s' 为一个有效引用。"
msgid "Failed to read object '%s'."
msgstr "无法读å–对象 '%s'。"
-#: builtin/notes.c:312
+#: builtin/notes.c:276
+#, c-format
+msgid "Cannot read note data from non-blob object '%s'."
+msgstr "ä¸èƒ½ä»Žéžæ•°æ®å¯¹è±¡ '%s' 中读å–注解数æ®"
+
+#: builtin/notes.c:316
#, c-format
msgid "Malformed input line: '%s'."
msgstr "éžæ³•çš„输入行:'%s'。"
-#: builtin/notes.c:327
+#: builtin/notes.c:331
#, c-format
msgid "Failed to copy notes from '%s' to '%s'"
msgstr "无法从 '%s' 到 '%s' æ‹·è´æ³¨è§£"
-#: 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
+#: builtin/notes.c:375 builtin/notes.c:429 builtin/notes.c:502
+#: builtin/notes.c:514 builtin/notes.c:587 builtin/notes.c:634
+#: builtin/notes.c:908
msgid "too many parameters"
msgstr "å‚数太多"
-#: builtin/notes.c:384 builtin/notes.c:643
+#: builtin/notes.c:388 builtin/notes.c:647
#, c-format
msgid "No note found for object %s."
msgstr "未å‘现对象 %s 的注解。"
-#: builtin/notes.c:406 builtin/notes.c:563
+#: builtin/notes.c:410 builtin/notes.c:567
msgid "note contents as a string"
msgstr "注解内容作为一个字符串"
-#: builtin/notes.c:409 builtin/notes.c:566
+#: builtin/notes.c:413 builtin/notes.c:570
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
+#: builtin/notes.c:415 builtin/notes.c:418 builtin/notes.c:572
+#: builtin/notes.c:575 builtin/tag.c:539
msgid "object"
msgstr "对象"
-#: builtin/notes.c:412 builtin/notes.c:569
+#: builtin/notes.c:416 builtin/notes.c:573
msgid "reuse and edit specified note object"
msgstr "é‡ç”¨å’Œç¼–辑指定的注解对象"
-#: builtin/notes.c:415 builtin/notes.c:572
+#: builtin/notes.c:419 builtin/notes.c:576
msgid "reuse specified note object"
msgstr "é‡ç”¨æŒ‡å®šçš„注解对象"
-#: builtin/notes.c:417 builtin/notes.c:485
+#: builtin/notes.c:421 builtin/notes.c:489
msgid "replace existing notes"
msgstr "替æ¢å·²å­˜åœ¨çš„注解"
-#: builtin/notes.c:451
+#: builtin/notes.c:455
#, c-format
msgid ""
"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite "
"existing notes"
msgstr "ä¸èƒ½æ·»åŠ æ³¨è§£ã€‚å‘现对象 %s 已存在注解。使用 '-f' 覆盖现存注解"
-#: builtin/notes.c:456 builtin/notes.c:533
+#: builtin/notes.c:460 builtin/notes.c:537
#, c-format
msgid "Overwriting existing notes for object %s\n"
msgstr "覆盖对象 %s 现存注解\n"
-#: builtin/notes.c:486
+#: builtin/notes.c:490
msgid "read objects from stdin"
msgstr "从标准输入读å–对象"
-#: builtin/notes.c:488
+#: builtin/notes.c:492
msgid "load rewriting config for <command> (implies --stdin)"
msgstr "é‡æ–°åŠ è½½ <命令> çš„é…置(éšå« --stdin)"
-#: builtin/notes.c:506
+#: builtin/notes.c:510
msgid "too few parameters"
msgstr "å‚数太少"
-#: builtin/notes.c:527
+#: builtin/notes.c:531
#, c-format
msgid ""
"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite "
"existing notes"
msgstr "ä¸èƒ½æ‹·è´æ³¨è§£ã€‚å‘现对象 %s 已存在注解。使用 '-f' 覆盖现存注解"
-#: builtin/notes.c:539
+#: builtin/notes.c:543
#, c-format
msgid "Missing notes on source object %s. Cannot copy."
msgstr "æºå¯¹è±¡ %s 缺少注解。ä¸èƒ½æ‹·è´ã€‚"
-#: builtin/notes.c:588
+#: builtin/notes.c:592
#, c-format
msgid ""
"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n"
@@ -7454,215 +7392,239 @@ msgstr ""
"å­å‘½ä»¤ 'edit' 的选项 -m/-F/-c/-C 已弃用。\n"
"请æ¢ç”¨ 'git notes add -f -m/-F/-c/-C'。\n"
-#: builtin/notes.c:735
+#: builtin/notes.c:739
msgid "General options"
msgstr "通用选项"
-#: builtin/notes.c:737
+#: builtin/notes.c:741
msgid "Merge options"
msgstr "åˆå¹¶é€‰é¡¹"
-#: builtin/notes.c:739
+#: builtin/notes.c:743
msgid ""
"resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
"cat_sort_uniq)"
msgstr "ä½¿ç”¨æŒ‡å®šçš„ç­–ç•¥è§£å†³æ³¨è§£å†²çª (manual/ours/theirs/union/cat_sort_uniq)"
-#: builtin/notes.c:741
+#: builtin/notes.c:745
msgid "Committing unmerged notes"
msgstr "æ交未åˆå¹¶çš„注解"
-#: builtin/notes.c:743
+#: builtin/notes.c:747
msgid "finalize notes merge by committing unmerged notes"
msgstr "通过æ交未åˆå¹¶çš„注解æ¥å®Œæˆæ³¨è§£åˆå¹¶"
-#: builtin/notes.c:745
+#: builtin/notes.c:749
msgid "Aborting notes merge resolution"
msgstr "中止注解åˆå¹¶çš„方案"
-#: builtin/notes.c:747
+#: builtin/notes.c:751
msgid "abort notes merge"
msgstr "中止注解åˆå¹¶"
-#: builtin/notes.c:842
+#: builtin/notes.c:846
#, c-format
msgid "Object %s has no note\n"
msgstr "对象 %s 没有注解\n"
-#: builtin/notes.c:854
+#: builtin/notes.c:858
msgid "attempt to remove non-existent note is not an error"
msgstr "å°è¯•åˆ é™¤ä¸å­˜åœ¨çš„注解ä¸æ˜¯ä¸€ä¸ªé”™è¯¯"
-#: builtin/notes.c:857
+#: builtin/notes.c:861
msgid "read object names from the standard input"
msgstr "从标准输入读å–对象å称"
-#: builtin/notes.c:938
-msgid "notes_ref"
+#: builtin/notes.c:942
+msgid "notes-ref"
msgstr "注解引用"
-#: builtin/notes.c:939
+#: builtin/notes.c:943
msgid "use notes from <notes_ref>"
msgstr "从 <注解引用> 使用注解"
-#: builtin/notes.c:974 builtin/remote.c:1593
+#: builtin/notes.c:978 builtin/remote.c:1593
#, c-format
msgid "Unknown subcommand: %s"
msgstr "未知å­å‘½ä»¤ï¼š%s"
-#: builtin/pack-objects.c:23
+#: builtin/pack-objects.c:25
msgid "git pack-objects --stdout [options...] [< ref-list | < object-list]"
msgstr "git pack-objects --stdout [选项...] [< 引用列表 | < 对象列表]"
-#: builtin/pack-objects.c:24
+#: builtin/pack-objects.c:26
msgid "git pack-objects [options...] base-name [< ref-list | < object-list]"
msgstr "git pack-objects [选项...] base-name [< 引用列表 | < 对象列表]"
-#: builtin/pack-objects.c:184 builtin/pack-objects.c:187
+#: builtin/pack-objects.c:175 builtin/pack-objects.c:178
#, c-format
msgid "deflate error (%d)"
msgstr "压缩错误 (%d)"
-#: builtin/pack-objects.c:2396
+#: builtin/pack-objects.c:771
+msgid "Writing objects"
+msgstr "写入对象中"
+
+#: builtin/pack-objects.c:1012
+msgid "disabling bitmap writing, as some objects are not being packed"
+msgstr "ç¦ç”¨ bitmap 写入,因为一些对象将ä¸ä¼šè¢«æ‰“包"
+
+#: builtin/pack-objects.c:2174
+msgid "Compressing objects"
+msgstr "压缩对象中"
+
+#: builtin/pack-objects.c:2530
#, c-format
msgid "unsupported index version %s"
msgstr "ä¸æ”¯æŒçš„索引版本 %s"
-#: builtin/pack-objects.c:2400
+#: builtin/pack-objects.c:2534
#, c-format
msgid "bad index version '%s'"
msgstr "å的索引版本 '%s'"
-#: builtin/pack-objects.c:2423
+#: builtin/pack-objects.c:2557
#, c-format
msgid "option %s does not accept negative form"
msgstr "选项 %s ä¸æŽ¥å—å¦å®šæ ¼å¼"
-#: builtin/pack-objects.c:2427
+#: builtin/pack-objects.c:2561
#, c-format
msgid "unable to parse value '%s' for option %s"
msgstr "ä¸èƒ½è§£æžé€‰é¡¹ %1$s 的值 '%2$s'"
-#: builtin/pack-objects.c:2446
+#: builtin/pack-objects.c:2580
msgid "do not show progress meter"
msgstr "ä¸æ˜¾ç¤ºè¿›åº¦è¡¨"
-#: builtin/pack-objects.c:2448
+#: builtin/pack-objects.c:2582
msgid "show progress meter"
msgstr "显示进度表"
-#: builtin/pack-objects.c:2450
+#: builtin/pack-objects.c:2584
msgid "show progress meter during object writing phase"
msgstr "在对象写入阶段显示进度表"
-#: builtin/pack-objects.c:2453
+#: builtin/pack-objects.c:2587
msgid "similar to --all-progress when progress meter is shown"
msgstr "当进度表显示时类似于 --all-progress"
-#: builtin/pack-objects.c:2454
+#: builtin/pack-objects.c:2588
msgid "version[,offset]"
msgstr "版本[,å移]"
-#: builtin/pack-objects.c:2455
+#: builtin/pack-objects.c:2589
msgid "write the pack index file in the specified idx format version"
msgstr "用指定的 idx æ ¼å¼ç‰ˆæœ¬æ¥å†™åŒ…索引文件"
-#: builtin/pack-objects.c:2458
+#: builtin/pack-objects.c:2592
msgid "maximum size of each output pack file"
msgstr "æ¯ä¸ªè¾“出包的最大尺寸"
-#: builtin/pack-objects.c:2460
+#: builtin/pack-objects.c:2594
msgid "ignore borrowed objects from alternate object store"
msgstr "忽略从替代对象存储里借用对象"
-#: builtin/pack-objects.c:2462
+#: builtin/pack-objects.c:2596
msgid "ignore packed objects"
msgstr "忽略包对象"
-#: builtin/pack-objects.c:2464
+#: builtin/pack-objects.c:2598
msgid "limit pack window by objects"
msgstr "é™åˆ¶æ‰“包窗å£çš„对象数"
-#: builtin/pack-objects.c:2466
+#: builtin/pack-objects.c:2600
msgid "limit pack window by memory in addition to object limit"
msgstr "除对象数é‡é™åˆ¶å¤–设置打包窗å£çš„内存é™åˆ¶"
-#: builtin/pack-objects.c:2468
+#: builtin/pack-objects.c:2602
msgid "maximum length of delta chain allowed in the resulting pack"
msgstr "打包å…许的 delta 链的最大长度"
-#: builtin/pack-objects.c:2470
+#: builtin/pack-objects.c:2604
msgid "reuse existing deltas"
msgstr "é‡ç”¨å·²å­˜åœ¨çš„ deltas"
-#: builtin/pack-objects.c:2472
+#: builtin/pack-objects.c:2606
msgid "reuse existing objects"
msgstr "é‡ç”¨å·²å­˜åœ¨çš„对象"
-#: builtin/pack-objects.c:2474
+#: builtin/pack-objects.c:2608
msgid "use OFS_DELTA objects"
msgstr "使用 OFS_DELTA 对象"
-#: builtin/pack-objects.c:2476
+#: builtin/pack-objects.c:2610
msgid "use threads when searching for best delta matches"
msgstr "使用线程查询最佳 delta 匹é…"
-#: builtin/pack-objects.c:2478
+#: builtin/pack-objects.c:2612
msgid "do not create an empty pack output"
msgstr "ä¸åˆ›å»ºç©ºçš„包输出"
-#: builtin/pack-objects.c:2480
+#: builtin/pack-objects.c:2614
msgid "read revision arguments from standard input"
msgstr "从标准输入读å–修订å·å‚æ•°"
-#: builtin/pack-objects.c:2482
+#: builtin/pack-objects.c:2616
msgid "limit the objects to those that are not yet packed"
msgstr "é™åˆ¶é‚£äº›å°šæœªæ‰“包的对象"
-#: builtin/pack-objects.c:2485
+#: builtin/pack-objects.c:2619
msgid "include objects reachable from any reference"
msgstr "包括å¯ä»¥ä»Žä»»ä½•å¼•ç”¨è®¿é—®åˆ°çš„对象"
-#: builtin/pack-objects.c:2488
+#: builtin/pack-objects.c:2622
msgid "include objects referred by reflog entries"
msgstr "包括被引用日志引用到的对象"
-#: builtin/pack-objects.c:2491
+#: builtin/pack-objects.c:2625
msgid "output pack to stdout"
msgstr "输出包到标准输出"
-#: builtin/pack-objects.c:2493
+#: builtin/pack-objects.c:2627
msgid "include tag objects that refer to objects to be packed"
msgstr "包括引用了打包对象的 tag"
-#: builtin/pack-objects.c:2495
+#: builtin/pack-objects.c:2629
msgid "keep unreachable objects"
msgstr "ç»´æŒä¸å¯è¾¾çš„对象"
-#: builtin/pack-objects.c:2496 parse-options.h:143
+#: builtin/pack-objects.c:2630 parse-options.h:140
msgid "time"
msgstr "时间"
-#: builtin/pack-objects.c:2497
+#: builtin/pack-objects.c:2631
msgid "unpack unreachable objects newer than <time>"
msgstr "将比给定 <时间> 新的无法访问的对象解包"
-#: builtin/pack-objects.c:2500
+#: builtin/pack-objects.c:2634
msgid "create thin packs"
msgstr "创建精简包"
-#: builtin/pack-objects.c:2502
+#: builtin/pack-objects.c:2636
msgid "ignore packs that have companion .keep file"
msgstr "忽略é…有 .keep 文件的包"
-#: builtin/pack-objects.c:2504
+#: builtin/pack-objects.c:2638
msgid "pack compression level"
msgstr "打包压缩级别"
-#: builtin/pack-objects.c:2506
+#: builtin/pack-objects.c:2640
msgid "do not hide commits by grafts"
msgstr "显示被å«æŽ¥éšè—çš„æ交"
+#: builtin/pack-objects.c:2642
+msgid "use a bitmap index if available to speed up counting objects"
+msgstr "使用 bitmap 索引(如果有的è¯ï¼‰ä»¥æ高对象计数时的速度"
+
+#: builtin/pack-objects.c:2644
+msgid "write a bitmap index together with the pack index"
+msgstr "在建立包索引的åŒæ—¶åˆ›å»º bitmap 索引"
+
+#: builtin/pack-objects.c:2723
+msgid "Counting objects"
+msgstr "对象计数中"
+
#: builtin/pack-refs.c:6
msgid "git pack-refs [options]"
msgstr "git pack-refs [选项]"
@@ -7679,6 +7641,10 @@ msgstr "清除æ¾æ•£çš„引用(默认)"
msgid "git prune-packed [-n|--dry-run] [-q|--quiet]"
msgstr "git prune-packed [-n|--dry-run] [-q|--quiet]"
+#: builtin/prune-packed.c:49
+msgid "Removing duplicate objects"
+msgstr "正在删除é‡å¤å¯¹è±¡"
+
#: builtin/prune.c:12
msgid "git prune [-n] [-v] [--expire <time>] [--] [<head>...]"
msgstr "git prune [-n] [-v] [--expire <时间>] [--] [<头>...]"
@@ -7699,15 +7665,15 @@ msgstr "使早于给定时间的对象过期"
msgid "git push [<options>] [<repository> [<refspec>...]]"
msgstr "git push [<选项>] [<版本库> [<引用规则>...]]"
-#: builtin/push.c:86
+#: builtin/push.c:85
msgid "tag shorthand without <tag>"
msgstr "tag 简写没有跟 <tag> å‚æ•°"
-#: builtin/push.c:96
+#: builtin/push.c:95
msgid "--delete only accepts plain target ref names"
msgstr "--delete åªæŽ¥å—简å•çš„目标引用å"
-#: builtin/push.c:141
+#: builtin/push.c:140
msgid ""
"\n"
"To choose either option permanently, see push.default in 'git help config'."
@@ -7715,7 +7681,7 @@ msgstr ""
"\n"
"为了永久地选择任一选项,å‚è§ 'git help config' 中的 push.default。"
-#: builtin/push.c:144
+#: builtin/push.c:143
#, c-format
msgid ""
"The upstream branch of your current branch does not match\n"
@@ -7739,7 +7705,7 @@ msgstr ""
" git push %s %s\n"
"%s"
-#: builtin/push.c:159
+#: builtin/push.c:158
#, c-format
msgid ""
"You are not currently on a branch.\n"
@@ -7753,7 +7719,7 @@ msgstr ""
"\n"
" git push %s HEAD:<name-of-remote-branch>\n"
-#: builtin/push.c:173
+#: builtin/push.c:172
#, c-format
msgid ""
"The current branch %s has no upstream branch.\n"
@@ -7766,12 +7732,12 @@ msgstr ""
"\n"
" git push --set-upstream %s %s\n"
-#: builtin/push.c:181
+#: builtin/push.c:180
#, c-format
msgid "The current branch %s has multiple upstream branches, refusing to push."
msgstr "当å‰åˆ†æ”¯ %s 有多个上游分支,拒ç»æŽ¨é€ã€‚"
-#: builtin/push.c:184
+#: builtin/push.c:183
#, c-format
msgid ""
"You are pushing to remote '%s', which is not the upstream of\n"
@@ -7782,11 +7748,11 @@ msgstr ""
"而没有告诉我è¦æŽ¨é€ä»€ä¹ˆã€æ›´æ–°å“ªä¸ªè¿œç¨‹åˆ†æ”¯ã€‚"
# 译者:字符串首行行首è¦æ·»åŠ â€œwarning: â€å­—串,故此首行è¦è¾ƒå…¶ä½™è¡ŒçŸ­
-#: builtin/push.c:207
+#: builtin/push.c:206
msgid ""
-"push.default is unset; its implicit value is changing in\n"
+"push.default is unset; its implicit value has changed in\n"
"Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
-"and maintain the current behavior after the default changes, use:\n"
+"and maintain the traditional behavior, use:\n"
"\n"
" git config --global push.default matching\n"
"\n"
@@ -7797,7 +7763,7 @@ msgid ""
"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"
+"Since Git 2.0, Git defaults to the more conservative 'simple'\n"
"behavior, which only pushes the current branch to the corresponding\n"
"remote branch that 'git pull' uses to update the current branch.\n"
"\n"
@@ -7806,7 +7772,7 @@ msgid ""
"(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
"'current' instead of 'simple' if you sometimes use older versions of Git)"
msgstr ""
-"push.default 尚未设置,它的默认值在 Git 2.0 从 'matching'\n"
+"push.default 尚未设置,它的默认值在 Git 2.0 已从 'matching'\n"
"å˜æ›´ä¸º 'simple'。若è¦ä¸å†æ˜¾ç¤ºæœ¬ä¿¡æ¯å¹¶ä¿æŒä¼ ç»Ÿä¹ æƒ¯ï¼Œè¿›è¡Œå¦‚下设置:\n"
"\n"
" git config --global push.default matching\n"
@@ -7825,12 +7791,12 @@ msgstr ""
"('simple' 模å¼ç”± Git 1.7.11 版本引入。如果您有时è¦ä½¿ç”¨è€ç‰ˆæœ¬çš„ Git,\n"
"为ä¿æŒå…¼å®¹ï¼Œè¯·ç”¨ 'current' 代替 'simple')"
-#: builtin/push.c:274
+#: builtin/push.c:273
msgid ""
"You didn't specify any refspecs to push, and push.default is \"nothing\"."
msgstr "您没有为推é€æŒ‡å®šä»»ä½•å¼•ç”¨è§„则,并且 push.default 为 \"nothing\"。"
-#: builtin/push.c:281
+#: builtin/push.c:280
msgid ""
"Updates were rejected because the tip of your current branch is behind\n"
"its remote counterpart. Integrate the remote changes (e.g.\n"
@@ -7841,19 +7807,7 @@ msgstr ""
"å†æ¬¡æŽ¨é€å‰ï¼Œå…ˆä¸Žè¿œç¨‹å˜æ›´åˆå¹¶ï¼ˆå¦‚ 'git pull ...')。详è§\n"
"'git push --help' 中的 'Note about fast-forwards' å°èŠ‚。"
-#: 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 ""
-"更新被拒ç»ï¼Œå› ä¸ºæŽ¨é€çš„一个分支的最新æ交è½åŽäºŽå…¶å¯¹åº”的远程分支。\n"
-"如果您并éžæœ‰æ„推é€è¯¥åˆ†æ”¯ï¼Œæ‚¨å¯ä»¥åœ¨æŽ¨é€æ—¶æŒ‡å®šè¦æŽ¨é€çš„分支,或者将\n"
-"é…ç½®å˜é‡ 'push.default' 设置为 'simple'ã€'current' 或 'upstream'\n"
-"以便åªæŽ¨é€å½“å‰åˆ†æ”¯ã€‚"
-
-#: builtin/push.c:293
+#: builtin/push.c:286
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"
@@ -7864,7 +7818,7 @@ msgstr ""
"检出该分支并整åˆè¿œç¨‹å˜æ›´ï¼ˆå¦‚ 'git pull ...'),然åŽå†æŽ¨é€ã€‚详è§\n"
"'git push --help' 中的 'Note about fast-forwards' å°èŠ‚。"
-#: builtin/push.c:299
+#: builtin/push.c:292
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"
@@ -7877,11 +7831,11 @@ msgstr ""
"(如 'git pull ...')。\n"
"è¯¦è§ 'git push --help' 中的 'Note about fast-forwards' å°èŠ‚。"
-#: builtin/push.c:306
+#: builtin/push.c:299
msgid "Updates were rejected because the tag already exists in the remote."
msgstr "更新被拒ç»å› ä¸º tag 在远程已ç»å­˜åœ¨ã€‚"
-#: builtin/push.c:309
+#: builtin/push.c:302
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"
@@ -7890,22 +7844,22 @@ msgstr ""
"如果ä¸ä½¿ç”¨ '--force' å‚数,您ä¸èƒ½æ›´æ–°ä¸€ä¸ªæŒ‡å‘éžæ交对象的远程引用,\n"
"也ä¸èƒ½æ›´æ–°è¿œç¨‹å¼•ç”¨è®©å…¶æŒ‡å‘一个éžæ交对象。\n"
-#: builtin/push.c:375
+#: builtin/push.c:361
#, c-format
msgid "Pushing to %s\n"
msgstr "推é€åˆ° %s\n"
-#: builtin/push.c:379
+#: builtin/push.c:365
#, c-format
msgid "failed to push some refs to '%s'"
msgstr "无法推é€ä¸€äº›å¼•ç”¨åˆ° '%s'"
-#: builtin/push.c:412
+#: builtin/push.c:395
#, c-format
msgid "bad repository '%s'"
msgstr "å的版本库 '%s'"
-#: builtin/push.c:413
+#: builtin/push.c:396
msgid ""
"No configured push destination.\n"
"Either specify the URL from the command-line or configure a remote "
@@ -7926,95 +7880,95 @@ msgstr ""
"\n"
" git push <name>\n"
-#: builtin/push.c:428
+#: builtin/push.c:411
msgid "--all and --tags are incompatible"
msgstr "--all å’Œ --tags ä¸å…¼å®¹"
-#: builtin/push.c:429
+#: builtin/push.c:412
msgid "--all can't be combined with refspecs"
msgstr "--all ä¸èƒ½å’Œå¼•ç”¨è§„则åŒæ—¶ä½¿ç”¨"
-#: builtin/push.c:434
+#: builtin/push.c:417
msgid "--mirror and --tags are incompatible"
msgstr "--mirror å’Œ --tags ä¸å…¼å®¹"
-#: builtin/push.c:435
+#: builtin/push.c:418
msgid "--mirror can't be combined with refspecs"
msgstr "--mirror ä¸èƒ½å’Œå¼•ç”¨è§„则åŒæ—¶ä½¿ç”¨"
-#: builtin/push.c:440
+#: builtin/push.c:423
msgid "--all and --mirror are incompatible"
msgstr "--all å’Œ --mirror ä¸å…¼å®¹"
-#: builtin/push.c:500
+#: builtin/push.c:483
msgid "repository"
msgstr "版本库"
-#: builtin/push.c:501
+#: builtin/push.c:484
msgid "push all refs"
msgstr "推é€æ‰€æœ‰å¼•ç”¨"
-#: builtin/push.c:502
+#: builtin/push.c:485
msgid "mirror all refs"
msgstr "é•œåƒæ‰€æœ‰å¼•ç”¨"
-#: builtin/push.c:504
+#: builtin/push.c:487
msgid "delete refs"
msgstr "删除引用"
-#: builtin/push.c:505
+#: builtin/push.c:488
msgid "push tags (can't be used with --all or --mirror)"
msgstr "æŽ¨é€ tags(ä¸èƒ½ä½¿ç”¨ --all or --mirror)"
-#: builtin/push.c:508
+#: builtin/push.c:491
msgid "force updates"
msgstr "强制更新"
-#: builtin/push.c:510
+#: builtin/push.c:493
msgid "refname>:<expect"
msgstr "引用å>:<期望值"
-#: builtin/push.c:511
+#: builtin/push.c:494
msgid "require old value of ref to be at this value"
msgstr "è¦æ±‚引用旧的å–值为设定值"
-#: builtin/push.c:513
+#: builtin/push.c:496
msgid "check"
msgstr "检查"
-#: builtin/push.c:514
+#: builtin/push.c:497
msgid "control recursive pushing of submodules"
msgstr "控制å­æ¨¡ç»„的递归推é€"
-#: builtin/push.c:516
+#: builtin/push.c:499
msgid "use thin pack"
msgstr "使用精简打包"
-#: builtin/push.c:517 builtin/push.c:518
+#: builtin/push.c:500 builtin/push.c:501
msgid "receive pack program"
msgstr "接收包程åº"
-#: builtin/push.c:519
+#: builtin/push.c:502
msgid "set upstream for git pull/status"
msgstr "设置 git pull/status 的上游"
-#: builtin/push.c:522
+#: builtin/push.c:505
msgid "prune locally removed refs"
msgstr "清除本地删除的引用"
-#: builtin/push.c:524
+#: builtin/push.c:507
msgid "bypass pre-push hook"
msgstr "绕过 pre-push é’©å­"
-#: builtin/push.c:525
+#: builtin/push.c:508
msgid "push missing but relevant tags"
msgstr "推é€ç¼ºå¤±çš„有关的 tags"
-#: builtin/push.c:535
+#: builtin/push.c:518
msgid "--delete is incompatible with --all, --mirror and --tags"
msgstr "--delete 与 --allã€--mirror åŠ --tags ä¸å…¼å®¹"
-#: builtin/push.c:537
+#: builtin/push.c:520
msgid "--delete doesn't make sense without any refs"
msgstr "--delete 未接任何引用没有æ„义"
@@ -8598,67 +8552,75 @@ msgstr "å°†ä¸ä¼šåˆ é™¤æ‰€æœ‰éžæŽ¨é€URL地å€"
msgid "be verbose; must be placed before a subcommand"
msgstr "冗长输出;必须置于å­å‘½ä»¤ä¹‹å‰"
-#: builtin/repack.c:15
+#: builtin/repack.c:16
msgid "git repack [options]"
msgstr "git repack [选项]"
-#: builtin/repack.c:143
+#: builtin/repack.c:156
msgid "pack everything in a single pack"
msgstr "所有内容打包到一个包文件中"
-#: builtin/repack.c:145
+#: builtin/repack.c:158
msgid "same as -a, and turn unreachable objects loose"
msgstr "å’Œ -a 相åŒï¼Œå¹¶å°†ä¸å¯è¾¾çš„对象设为æ¾æ•£å¯¹è±¡"
-#: builtin/repack.c:148
+#: builtin/repack.c:161
msgid "remove redundant packs, and run git-prune-packed"
msgstr "删除多余的包,è¿è¡Œ git-prune-packed"
-#: builtin/repack.c:150
+#: builtin/repack.c:163
msgid "pass --no-reuse-delta to git-pack-objects"
msgstr "å‘ git-pack-objects 传递å‚æ•° --no-reuse-delta"
-#: builtin/repack.c:152
+#: builtin/repack.c:165
msgid "pass --no-reuse-object to git-pack-objects"
msgstr "å‘ git-pack-objects 传递å‚æ•° --no-reuse-object"
-#: builtin/repack.c:154
+#: builtin/repack.c:167
msgid "do not run git-update-server-info"
msgstr "ä¸è¿è¡Œ git-update-server-info"
-#: builtin/repack.c:157
+#: builtin/repack.c:170
msgid "pass --local to git-pack-objects"
msgstr "å‘ git-pack-objects 传递å‚æ•° --local"
-#: builtin/repack.c:158
+#: builtin/repack.c:172
+msgid "write bitmap index"
+msgstr "写 bitmap 索引"
+
+#: builtin/repack.c:173
msgid "approxidate"
msgstr "近似日期"
-#: builtin/repack.c:159
+#: builtin/repack.c:174
msgid "with -A, do not loosen objects older than this"
msgstr "使用 -A,ä¸è¦å°†æ—©äºŽç»™å®šæ—¶é—´çš„对象过期"
-#: builtin/repack.c:161
+#: builtin/repack.c:176
msgid "size of the window used for delta compression"
msgstr "用于增é‡åŽ‹ç¼©çš„窗å£å€¼"
-#: builtin/repack.c:162 builtin/repack.c:166
+#: builtin/repack.c:177 builtin/repack.c:181
msgid "bytes"
msgstr "字节"
-#: builtin/repack.c:163
+#: builtin/repack.c:178
msgid "same as the above, but limit memory size instead of entries count"
msgstr "和上é¢çš„相似,但é™åˆ¶å†…存大å°è€Œéžæ¡ç›®æ•°"
-#: builtin/repack.c:165
+#: builtin/repack.c:180
msgid "limits the maximum delta depth"
msgstr "é™åˆ¶æœ€å¤§å¢žé‡æ·±åº¦"
-#: builtin/repack.c:167
+#: builtin/repack.c:182
msgid "maximum size of each packfile"
msgstr "æ¯ä¸ªåŒ…的最大尺寸"
-#: builtin/repack.c:343
+#: builtin/repack.c:184
+msgid "repack objects in packs marked with .keep"
+msgstr "对标记为 .keep 的包中的对象é‡æ–°æ‰“包"
+
+#: builtin/repack.c:371
#, c-format
msgid "removing '%s' failed"
msgstr "删除 '%s' 失败"
@@ -8751,76 +8713,84 @@ msgid "HEAD is now at %s"
msgstr "HEAD 现在ä½äºŽ %s"
# 译者:汉字之间无空格,故删除%så‰åŽç©ºæ ¼
-#: builtin/reset.c:172
+#: builtin/reset.c:182
#, c-format
msgid "Cannot do a %s reset in the middle of a merge."
msgstr "在åˆå¹¶è¿‡ç¨‹ä¸­ä¸èƒ½åš%sé‡ç½®æ“作。"
-#: builtin/reset.c:262
+#: builtin/reset.c:273
msgid "be quiet, only report errors"
msgstr "安é™æ¨¡å¼ï¼ŒåªæŠ¥å‘Šé”™è¯¯"
-#: builtin/reset.c:264
+#: builtin/reset.c:275
msgid "reset HEAD and index"
msgstr "é‡ç½® HEAD 和索引"
-#: builtin/reset.c:265
+#: builtin/reset.c:276
msgid "reset only HEAD"
msgstr "åªé‡ç½® HEAD"
-#: builtin/reset.c:267 builtin/reset.c:269
+#: builtin/reset.c:278 builtin/reset.c:280
msgid "reset HEAD, index and working tree"
msgstr "é‡ç½® HEADã€ç´¢å¼•å’Œå·¥ä½œåŒº"
-#: builtin/reset.c:271
+#: builtin/reset.c:282
msgid "reset HEAD but keep local changes"
msgstr "é‡ç½® HEAD 但ä¿å­˜æœ¬åœ°å˜æ›´"
-#: builtin/reset.c:289
+#: builtin/reset.c:285
+msgid "record only the fact that removed paths will be added later"
+msgstr "将删除的路径标记为ç¨åŽæ·»åŠ "
+
+#: builtin/reset.c:302
#, c-format
msgid "Failed to resolve '%s' as a valid revision."
msgstr "无法将 '%s' 解æžä¸ºä¸€ä¸ªæœ‰æ•ˆçš„版本。"
-#: builtin/reset.c:292 builtin/reset.c:300
+#: builtin/reset.c:305 builtin/reset.c:313
#, c-format
msgid "Could not parse object '%s'."
msgstr "ä¸èƒ½è§£æžå¯¹è±¡ '%s'。"
-#: builtin/reset.c:297
+#: builtin/reset.c:310
#, c-format
msgid "Failed to resolve '%s' as a valid tree."
msgstr "无法将 '%s' 解æžä¸ºä¸€ä¸ªæœ‰æ•ˆçš„树对象。"
-#: builtin/reset.c:306
+#: builtin/reset.c:319
msgid "--patch is incompatible with --{hard,mixed,soft}"
msgstr "--patch 与 --{hardã€mixedã€soft} 选项ä¸å…¼å®¹"
-#: builtin/reset.c:315
+#: builtin/reset.c:328
msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead."
msgstr "--mixed 带路径已弃用,而是用 'git reset -- <paths>'。"
# 译者:汉字之间无空格,故删除%så‰åŽç©ºæ ¼
-#: builtin/reset.c:317
+#: builtin/reset.c:330
#, c-format
msgid "Cannot do %s reset with paths."
msgstr "ä¸èƒ½å¸¦è·¯å¾„进行%sé‡ç½®ã€‚"
# 译者:汉字之间无空格,故删除%så‰åŽç©ºæ ¼
-#: builtin/reset.c:327
+#: builtin/reset.c:340
#, c-format
msgid "%s reset is not allowed in a bare repository"
msgstr "ä¸èƒ½å¯¹è£¸ç‰ˆæœ¬åº“进行%sé‡ç½®"
#: builtin/reset.c:344
+msgid "-N can only be used with --mixed"
+msgstr "-N åªèƒ½å’Œ --mixed åŒæ—¶ä½¿ç”¨"
+
+#: builtin/reset.c:361
msgid "Unstaged changes after reset:"
msgstr "é‡ç½®åŽæ’¤å‡ºæš‚存区的å˜æ›´ï¼š"
-#: builtin/reset.c:350
+#: builtin/reset.c:367
#, c-format
msgid "Could not reset index file to revision '%s'."
msgstr "ä¸èƒ½é‡ç½®ç´¢å¼•æ–‡ä»¶è‡³ç‰ˆæœ¬ '%s'。"
-#: builtin/reset.c:355
+#: builtin/reset.c:372
msgid "Could not write new index file."
msgstr "ä¸èƒ½å†™å…¥æ–°çš„索引文件。"
@@ -8840,7 +8810,7 @@ msgstr "é‡åˆ°ç¬¬ä¸€ä¸ªéžé€‰é¡¹å‚æ•°åŽåœæ­¢è§£æž"
msgid "output in stuck long form"
msgstr "以固定长格å¼è¾“出"
-#: builtin/rev-parse.c:486
+#: builtin/rev-parse.c:497
msgid ""
"git rev-parse --parseopt [options] -- [<args>...]\n"
" or: git rev-parse --sq-quote [<arg>...]\n"
@@ -8911,35 +8881,35 @@ msgstr "选项"
msgid "option for merge strategy"
msgstr "åˆå¹¶ç­–略的选项"
-#: builtin/revert.c:102
+#: builtin/revert.c:104
msgid "append commit name"
msgstr "追加æ交å称"
-#: builtin/revert.c:103
+#: builtin/revert.c:105
msgid "allow fast-forward"
msgstr "å…许快进å¼"
-#: builtin/revert.c:104
+#: builtin/revert.c:106
msgid "preserve initially empty commits"
msgstr "ä¿ç•™åˆå§‹åŒ–的空æ交"
-#: builtin/revert.c:105
+#: builtin/revert.c:107
msgid "allow commits with empty messages"
msgstr "å…许æ交说明为空"
-#: builtin/revert.c:106
+#: builtin/revert.c:108
msgid "keep redundant, empty commits"
msgstr "ä¿æŒå¤šä½™çš„ã€ç©ºçš„æ交"
-#: builtin/revert.c:110
+#: builtin/revert.c:112
msgid "program error"
msgstr "程åºé”™è¯¯"
-#: builtin/revert.c:195
+#: builtin/revert.c:197
msgid "revert failed"
msgstr "还原失败"
-#: builtin/revert.c:210
+#: builtin/revert.c:212
msgid "cherry-pick failed"
msgstr "拣选失败"
@@ -9206,11 +9176,11 @@ msgstr "删除符å·å¼•ç”¨"
msgid "shorten ref output"
msgstr "简短的引用输出"
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
msgid "reason"
msgstr "原因"
-#: builtin/symbolic-ref.c:43 builtin/update-ref.c:254
+#: builtin/symbolic-ref.c:43 builtin/update-ref.c:255
msgid "reason of the update"
msgstr "更新的原因"
@@ -9235,32 +9205,32 @@ msgstr ""
msgid "git tag -v <tagname>..."
msgstr "git tag -v <标签å>..."
-#: builtin/tag.c:60
+#: builtin/tag.c:67
#, c-format
msgid "malformed object at '%s'"
msgstr "éžæ³•çš„对象于 '%s'"
-#: builtin/tag.c:207
+#: builtin/tag.c:239
#, c-format
msgid "tag name too long: %.*s..."
msgstr "tag å字太长:%.*s..."
-#: builtin/tag.c:212
+#: builtin/tag.c:244
#, c-format
msgid "tag '%s' not found."
msgstr "tag '%s' 未å‘现。"
-#: builtin/tag.c:227
+#: builtin/tag.c:259
#, c-format
msgid "Deleted tag '%s' (was %s)\n"
msgstr "已删除 tag '%s'(曾为 %s)\n"
-#: builtin/tag.c:239
+#: builtin/tag.c:271
#, c-format
msgid "could not verify the tag '%s'"
msgstr "ä¸èƒ½æ ¡éªŒ tag '%s'"
-#: builtin/tag.c:249
+#: builtin/tag.c:281
#, c-format
msgid ""
"\n"
@@ -9271,7 +9241,7 @@ msgstr ""
"输入一个 tag 说明\n"
"以 '%c' 开头的行将被忽略。\n"
-#: builtin/tag.c:253
+#: builtin/tag.c:285
#, c-format
msgid ""
"\n"
@@ -9283,254 +9253,271 @@ msgstr ""
"输入一个 tag 说明\n"
"以 '%c' 开头的行将被ä¿ç•™ï¼Œå¦‚果您愿æ„也å¯ä»¥åˆ é™¤å®ƒä»¬ã€‚\n"
-#: builtin/tag.c:292
+#: builtin/tag.c:324
msgid "unable to sign the tag"
msgstr "无法签署 tag"
-#: builtin/tag.c:294
+#: builtin/tag.c:326
msgid "unable to write tag file"
msgstr "无法写 tag 文件"
-#: builtin/tag.c:319
+#: builtin/tag.c:351
msgid "bad object type."
msgstr "å的对象类型。"
-#: builtin/tag.c:332
+#: builtin/tag.c:364
msgid "tag header too big."
msgstr "tag 头信æ¯å¤ªå¤§ã€‚"
-#: builtin/tag.c:368
+#: builtin/tag.c:400
msgid "no tag message?"
msgstr "无 tag 说明?"
-#: builtin/tag.c:374
+#: builtin/tag.c:406
#, c-format
msgid "The tag message has been left in %s\n"
msgstr "tag 说明被ä¿ç•™åœ¨ %s\n"
-#: builtin/tag.c:423
+#: builtin/tag.c:455
msgid "switch 'points-at' requires an object"
msgstr "开关 'points-at' 需è¦ä¸€ä¸ªå¯¹è±¡"
-#: builtin/tag.c:425
+#: builtin/tag.c:457
#, c-format
msgid "malformed object name '%s'"
msgstr "éžæ³•çš„对象å '%s'"
-#: builtin/tag.c:445
+#: builtin/tag.c:480
+#, c-format
+msgid "unsupported sort specification %s"
+msgstr "ä¸æ”¯æŒçš„排åºè§„æ ¼ %s"
+
+#: builtin/tag.c:500
msgid "list tag names"
msgstr "列出tagå称"
-#: builtin/tag.c:447
+#: builtin/tag.c:502
msgid "print <n> lines of each tag message"
msgstr "æ¯ä¸ª tag ä¿¡æ¯æ‰“å° <n> è¡Œ"
-#: builtin/tag.c:449
+#: builtin/tag.c:504
msgid "delete tags"
msgstr "删除 tags"
-#: builtin/tag.c:450
+#: builtin/tag.c:505
msgid "verify tags"
msgstr "éªŒè¯ tags"
-#: builtin/tag.c:452
+#: builtin/tag.c:507
msgid "Tag creation options"
msgstr "Tag 创建选项"
-#: builtin/tag.c:454
+#: builtin/tag.c:509
msgid "annotated tag, needs a message"
msgstr "注解 tag,需è¦ä¸€ä¸ªè¯´æ˜Ž"
-#: builtin/tag.c:456
+#: builtin/tag.c:511
msgid "tag message"
msgstr "tag 说明"
-#: builtin/tag.c:458
+#: builtin/tag.c:513
msgid "annotated and GPG-signed tag"
msgstr "注解并 GPG ç­¾åçš„ tag"
-#: builtin/tag.c:462
+#: builtin/tag.c:517
msgid "use another key to sign the tag"
msgstr "使用å¦å¤–çš„ç§é’¥ç­¾å tag"
-#: builtin/tag.c:463
+#: builtin/tag.c:518
msgid "replace the tag if exists"
msgstr "如果存在,替æ¢çŽ°æœ‰çš„ tag"
-#: builtin/tag.c:464
+#: builtin/tag.c:519
msgid "show tag list in columns"
msgstr "以列的方å¼æ˜¾ç¤º tag"
-#: builtin/tag.c:466
+#: builtin/tag.c:521
+msgid "sort tags"
+msgstr "æŽ’åº tags"
+
+#: builtin/tag.c:525
msgid "Tag listing options"
msgstr "Tag 列表选项"
-#: builtin/tag.c:469
+#: builtin/tag.c:528 builtin/tag.c:534
msgid "print only tags that contain the commit"
msgstr "åªæ‰“å°åŒ…å«æ交的tags"
-#: builtin/tag.c:475
+#: builtin/tag.c:540
msgid "print only tags of the object"
msgstr "åªæ‰“å°tags对象"
-#: builtin/tag.c:501
+#: builtin/tag.c:566
msgid "--column and -n are incompatible"
msgstr "--column å’Œ -n ä¸å…¼å®¹"
-#: builtin/tag.c:518
+#: builtin/tag.c:578
+msgid "--sort and -n are incompatible"
+msgstr "--sort å’Œ -n ä¸å…¼å®¹"
+
+#: builtin/tag.c:585
msgid "-n option is only allowed with -l."
msgstr "-n 选项åªå…许和 -l åŒæ—¶ä½¿ç”¨ã€‚"
-#: builtin/tag.c:520
+#: builtin/tag.c:587
msgid "--contains option is only allowed with -l."
msgstr "--contains 选项åªå…许和 -l åŒæ—¶ä½¿ç”¨ã€‚"
-#: builtin/tag.c:522
+#: builtin/tag.c:589
msgid "--points-at option is only allowed with -l."
msgstr "--points-at 选项åªå…许和 -l åŒæ—¶ä½¿ç”¨ã€‚"
-#: builtin/tag.c:530
+#: builtin/tag.c:597
msgid "only one -F or -m option is allowed."
msgstr "åªå…许一个 -F 或 -m 选项。"
-#: builtin/tag.c:550
+#: builtin/tag.c:617
msgid "too many params"
msgstr "太多å‚æ•°"
-#: builtin/tag.c:556
+#: builtin/tag.c:623
#, c-format
msgid "'%s' is not a valid tag name."
msgstr "'%s' ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„tagå称。"
-#: builtin/tag.c:561
+#: builtin/tag.c:628
#, c-format
msgid "tag '%s' already exists"
msgstr "tag '%s' 已存在"
-#: builtin/tag.c:579
+#: builtin/tag.c:646
#, c-format
msgid "%s: cannot lock the ref"
msgstr "%s:ä¸èƒ½é”定引用"
-#: builtin/tag.c:581
+#: builtin/tag.c:648
#, c-format
msgid "%s: cannot update the ref"
msgstr "%s:ä¸èƒ½æ›´æ–°å¼•ç”¨"
-#: builtin/tag.c:583
+#: builtin/tag.c:650
#, c-format
msgid "Updated tag '%s' (was %s)\n"
msgstr "已更新tag '%s'(曾为 %s)\n"
-#: builtin/update-index.c:402
+#: builtin/unpack-objects.c:483
+msgid "Unpacking objects"
+msgstr "展开对象中"
+
+#: builtin/update-index.c:399
msgid "git update-index [options] [--] [<file>...]"
msgstr "git update-index [选项] [--] [<文件>...]"
-#: builtin/update-index.c:720
+#: builtin/update-index.c:748
msgid "continue refresh even when index needs update"
msgstr "当索引需è¦æ›´æ–°æ—¶ç»§ç»­åˆ·æ–°"
-#: builtin/update-index.c:723
+#: builtin/update-index.c:751
msgid "refresh: ignore submodules"
msgstr "刷新:忽略å­æ¨¡ç»„"
-#: builtin/update-index.c:726
+#: builtin/update-index.c:754
msgid "do not ignore new files"
msgstr "ä¸å¿½ç•¥æ–°çš„文件"
-#: builtin/update-index.c:728
+#: builtin/update-index.c:756
msgid "let files replace directories and vice-versa"
msgstr "让文件替æ¢ç›®å½•ï¼ˆå之亦然)"
-#: builtin/update-index.c:730
+#: builtin/update-index.c:758
msgid "notice files missing from worktree"
msgstr "通知文件从工作区丢失"
-#: builtin/update-index.c:732
+#: builtin/update-index.c:760
msgid "refresh even if index contains unmerged entries"
msgstr "å³ä½¿ç´¢å¼•åŒºåŒ…å«æœªåˆå¹¶çš„æ¡ç›®ä¹Ÿæ‰§è¡Œåˆ·æ–°"
-#: builtin/update-index.c:735
+#: builtin/update-index.c:763
msgid "refresh stat information"
msgstr "刷新统计信æ¯"
-#: builtin/update-index.c:739
+#: builtin/update-index.c:767
msgid "like --refresh, but ignore assume-unchanged setting"
msgstr "类似于 --refresh,但是忽略 assume-unchanged 设置"
-#: builtin/update-index.c:743
-msgid "<mode> <object> <path>"
-msgstr "<mode> <object> <path>"
+#: builtin/update-index.c:771
+msgid "<mode>,<object>,<path>"
+msgstr "<mode>,<object>,<path>"
-#: builtin/update-index.c:744
+#: builtin/update-index.c:772
msgid "add the specified entry to the index"
msgstr "添加指定的æ¡ç›®åˆ°ç´¢å¼•åŒº"
-#: builtin/update-index.c:748
+#: builtin/update-index.c:776
msgid "(+/-)x"
msgstr "(+/-)x"
-#: builtin/update-index.c:749
+#: builtin/update-index.c:777
msgid "override the executable bit of the listed files"
msgstr "覆盖列表里文件的å¯æ‰§è¡Œä½"
-#: builtin/update-index.c:753
+#: builtin/update-index.c:781
msgid "mark files as \"not changing\""
msgstr "把文件标记为 \"没有å˜æ›´\""
-#: builtin/update-index.c:756
+#: builtin/update-index.c:784
msgid "clear assumed-unchanged bit"
msgstr "清除 assumed-unchanged ä½"
-#: builtin/update-index.c:759
+#: builtin/update-index.c:787
msgid "mark files as \"index-only\""
msgstr "把文件标记为 \"仅索引\""
-#: builtin/update-index.c:762
+#: builtin/update-index.c:790
msgid "clear skip-worktree bit"
msgstr "清除 skip-worktree ä½"
-#: builtin/update-index.c:765
+#: builtin/update-index.c:793
msgid "add to index only; do not add content to object database"
msgstr "åªæ·»åŠ åˆ°ç´¢å¼•åŒºï¼›ä¸æ·»åŠ å¯¹è±¡åˆ°å¯¹è±¡åº“"
-#: builtin/update-index.c:767
+#: builtin/update-index.c:795
msgid "remove named paths even if present in worktree"
msgstr "å³ä½¿å­˜åœ¨å·¥ä½œåŒºé‡Œï¼Œä¹Ÿåˆ é™¤è·¯å¾„"
-#: builtin/update-index.c:769
+#: builtin/update-index.c:797
msgid "with --stdin: input lines are terminated by null bytes"
msgstr "æºå¸¦ --stdin:输入的行以 null 字符终止"
-#: builtin/update-index.c:771
+#: builtin/update-index.c:799
msgid "read list of paths to be updated from standard input"
msgstr "从标准输入中读å–需è¦æ›´æ–°çš„路径列表"
-#: builtin/update-index.c:775
+#: builtin/update-index.c:803
msgid "add entries from standard input to the index"
msgstr "从标准输入添加æ¡ç›®åˆ°ç´¢å¼•åŒº"
-#: builtin/update-index.c:779
+#: builtin/update-index.c:807
msgid "repopulate stages #2 and #3 for the listed paths"
msgstr "为指定文件é‡æ–°ç”Ÿæˆç¬¬2和第3暂存区"
-#: builtin/update-index.c:783
+#: builtin/update-index.c:811
msgid "only update entries that differ from HEAD"
msgstr "åªæ›´æ–°ä¸Ž HEAD ä¸åŒçš„æ¡ç›®"
-#: builtin/update-index.c:787
+#: builtin/update-index.c:815
msgid "ignore files missing from worktree"
msgstr "忽略工作区丢失的文件"
-#: builtin/update-index.c:790
+#: builtin/update-index.c:818
msgid "report actions to standard output"
msgstr "在标准输出显示æ“作"
-#: builtin/update-index.c:792
+#: builtin/update-index.c:820
msgid "(for porcelains) forget saved unresolved conflicts"
msgstr "(for porcelains) 忘记ä¿å­˜çš„未解决的冲çª"
-#: builtin/update-index.c:796
+#: builtin/update-index.c:824
msgid "write index in this format"
msgstr "以这ç§æ ¼å¼å†™å…¥ç´¢å¼•åŒº"
@@ -9546,19 +9533,19 @@ msgstr "git update-ref [选项] <引用å> <新值> [<旧值>]"
msgid "git update-ref [options] --stdin [-z]"
msgstr "git update-ref [选项] --stdin [-z]"
-#: builtin/update-ref.c:255
+#: builtin/update-ref.c:256
msgid "delete the reference"
msgstr "删除引用"
-#: builtin/update-ref.c:257
+#: builtin/update-ref.c:258
msgid "update <refname> not the one it points to"
msgstr "æ›´æ–° <引用å> 本身而ä¸æ˜¯å®ƒæŒ‡å‘的引用"
-#: builtin/update-ref.c:258
+#: builtin/update-ref.c:259
msgid "stdin has NUL-terminated arguments"
msgstr "标准输入有以 NUL 字符终止的å‚æ•°"
-#: builtin/update-ref.c:259
+#: builtin/update-ref.c:260
msgid "read updates from stdin"
msgstr "从标准输入读å–æ›´æ–°"
@@ -9615,23 +9602,23 @@ msgstr ""
"命令 'git help -a' å’Œ 'git help -g' 显示å¯ç”¨çš„å­å‘½ä»¤å’Œä¸€äº›æŒ‡å—。å‚è§\n"
"'git help <命令>' 或 'git help <指å—>' æ¥æŸ¥çœ‹ç»™å®šçš„å­å‘½ä»¤å¸®åŠ©æˆ–指å—。"
-#: parse-options.h:146
-msgid "expiry date"
+#: parse-options.h:143
+msgid "expiry-date"
msgstr "逾期日期"
-#: parse-options.h:161
+#: parse-options.h:158
msgid "no-op (backward compatibility)"
msgstr "空æ“作(å‘åŽå…¼å®¹ï¼‰"
-#: parse-options.h:235
+#: parse-options.h:232
msgid "be more verbose"
msgstr "更加详细"
-#: parse-options.h:237
+#: parse-options.h:234
msgid "be more quiet"
msgstr "更加安é™"
-#: parse-options.h:243
+#: parse-options.h:240
msgid "use <n> digits to display SHA-1s"
msgstr "用 <n> ä½æ•°å­—显示 SHA-1 哈希值"
@@ -9719,17 +9706,17 @@ msgstr "显示工作区状æ€"
msgid "Create, list, delete or verify a tag object signed with GPG"
msgstr "创建ã€åˆ—出ã€åˆ é™¤æˆ–校验一个GPGç­¾åçš„ tag 对象"
-#: git-am.sh:50
+#: git-am.sh:52
msgid "You need to set your committer info first"
msgstr "您需è¦å…ˆè®¾ç½®ä½ çš„æ交者信æ¯"
-#: git-am.sh:95
+#: git-am.sh:97
msgid ""
"You seem to have moved HEAD since the last 'am' failure.\n"
"Not rewinding to ORIG_HEAD"
msgstr "您好åƒåœ¨ä¸Šä¸€æ¬¡ 'am' 失败åŽç§»åŠ¨äº† HEAD。未回退至 ORIG_HEAD"
-#: git-am.sh:105
+#: git-am.sh:107
#, sh-format
msgid ""
"When you have resolved this problem, run \"$cmdline --continue\".\n"
@@ -9740,19 +9727,19 @@ msgstr ""
"如果您想跳过此补ä¸ï¼Œåˆ™æ‰§è¡Œ \"$cmdline --skip\"。\n"
"è¦æ¢å¤åŽŸåˆ†æ”¯å¹¶åœæ­¢æ‰“è¡¥ä¸ï¼Œæ‰§è¡Œ \"$cmdline --abort\"。"
-#: git-am.sh:121
+#: git-am.sh:123
msgid "Cannot fall back to three-way merge."
msgstr "无法求助于三路åˆå¹¶ã€‚"
-#: git-am.sh:137
+#: git-am.sh:139
msgid "Repository lacks necessary blobs to fall back on 3-way merge."
msgstr "版本库缺ä¹å¿…è¦çš„æ•°æ®ï¼ˆblob)对象以进行三路åˆå¹¶ã€‚"
-#: git-am.sh:139
+#: git-am.sh:141
msgid "Using index info to reconstruct a base tree..."
msgstr "使用索引æ¥é‡å»ºä¸€ä¸ªï¼ˆä¸‰è·¯åˆå¹¶çš„)基础目录树..."
-#: git-am.sh:154
+#: git-am.sh:156
msgid ""
"Did you hand edit your patch?\n"
"It does not apply to blobs recorded in its index."
@@ -9760,28 +9747,28 @@ msgstr ""
"您是å¦æ›¾æ‰‹åŠ¨ç¼–辑过您的补ä¸ï¼Ÿ\n"
"无法应用补ä¸åˆ°ç´¢å¼•ä¸­çš„æ•°æ®ï¼ˆblob)对象上。"
-#: git-am.sh:163
+#: git-am.sh:165
msgid "Falling back to patching base and 3-way merge..."
msgstr "转而在基础版本上打补ä¸åŠè¿›è¡Œä¸‰è·¯åˆå¹¶..."
-#: git-am.sh:179
+#: git-am.sh:181
msgid "Failed to merge in the changes."
msgstr "无法åˆå¹¶å˜æ›´ã€‚"
-#: git-am.sh:274
+#: git-am.sh:276
msgid "Only one StGIT patch series can be applied at once"
msgstr "一次åªèƒ½æœ‰ä¸€ä¸ª StGIT è¡¥ä¸é˜Ÿåˆ—被应用"
-#: git-am.sh:361
+#: git-am.sh:363
#, sh-format
msgid "Patch format $patch_format is not supported."
msgstr "ä¸æ”¯æŒ $patch_format è¡¥ä¸æ ¼å¼ã€‚"
-#: git-am.sh:363
+#: git-am.sh:365
msgid "Patch format detection failed."
msgstr "è¡¥ä¸æ ¼å¼æ£€æµ‹å¤±è´¥ã€‚"
-#: git-am.sh:389
+#: git-am.sh:392
msgid ""
"The -b/--binary option has been a no-op for long time, and\n"
"it will be removed. Please do not use it anymore."
@@ -9789,16 +9776,16 @@ msgstr ""
"å‚æ•° -b/--binary å·²ç»å¾ˆé•¿æ—¶é—´ä¸åšä»»ä½•å®žè´¨æ“作了,并且将被删除。\n"
"请ä¸è¦å†ä½¿ç”¨å®ƒäº†ã€‚"
-#: git-am.sh:479
+#: git-am.sh:486
#, sh-format
msgid "previous rebase directory $dotest still exists but mbox given."
msgstr "之å‰çš„å˜åŸºç›®å½• $dotest ä»ç„¶å­˜åœ¨ï¼Œä½†å´æ供了 mbox。"
-#: git-am.sh:484
+#: git-am.sh:491
msgid "Please make up your mind. --skip or --abort?"
msgstr "请下决心。--skip 或是 --abort ?"
-#: git-am.sh:520
+#: git-am.sh:527
#, sh-format
msgid ""
"Stray $dotest directory found.\n"
@@ -9807,16 +9794,16 @@ msgstr ""
"å‘现了错误的 $dotest 目录。\n"
"使用 \"git am --abort\" 删除它。"
-#: git-am.sh:528
+#: git-am.sh:535
msgid "Resolve operation not in progress, we are not resuming."
msgstr "解决æ“作未进行,我们ä¸ä¼šç»§ç»­ã€‚"
-#: git-am.sh:594
+#: git-am.sh:601
#, sh-format
msgid "Dirty index: cannot apply patches (dirty: $files)"
msgstr "è„的索引:ä¸èƒ½åº”用补ä¸ï¼ˆè„文件:$files)"
-#: git-am.sh:698
+#: git-am.sh:705
#, sh-format
msgid ""
"Patch is empty. Was it split wrong?\n"
@@ -9827,15 +9814,15 @@ msgstr ""
"如果您想è¦è·³è¿‡è¿™ä¸ªè¡¥ä¸ï¼Œæ‰§è¡Œ \"$cmdline --skip\"。\n"
"è¦æ¢å¤åŽŸåˆ†æ”¯å¹¶åœæ­¢æ‰“è¡¥ä¸ï¼Œæ‰§è¡Œ \"$cmdline --abort\"。"
-#: git-am.sh:725
+#: git-am.sh:732
msgid "Patch does not have a valid e-mail address."
msgstr "è¡¥ä¸ä¸­æ²¡æœ‰ä¸€ä¸ªæœ‰æ•ˆçš„邮件地å€ã€‚"
-#: git-am.sh:772
+#: git-am.sh:779
msgid "cannot be interactive without stdin connected to a terminal."
msgstr "标准输入没有和终端关è”,ä¸èƒ½è¿›è¡Œäº¤äº’å¼æ“作。"
-#: git-am.sh:776
+#: git-am.sh:783
msgid "Commit Body is:"
msgstr "æ交内容为:"
@@ -9843,16 +9830,16 @@ msgstr "æ交内容为:"
#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
#. in your translation. The program will only accept English
#. input at this point.
-#: git-am.sh:783
+#: git-am.sh:790
msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
msgstr "应用?[y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
-#: git-am.sh:819
+#: git-am.sh:826
#, sh-format
msgid "Applying: $FIRSTLINE"
msgstr "正应用:$FIRSTLINE"
-#: git-am.sh:840
+#: git-am.sh:847
msgid ""
"No changes - did you forget to use 'git add'?\n"
"If there is nothing left to stage, chances are that something else\n"
@@ -9862,22 +9849,22 @@ msgstr ""
"如果没有什么è¦æ·»åŠ åˆ°æš‚存区的,则很å¯èƒ½æ˜¯å…¶å®ƒæ交已ç»å¼•å…¥äº†ç›¸åŒçš„å˜æ›´ã€‚\n"
"您也许想è¦è·³è¿‡è¿™ä¸ªè¡¥ä¸ã€‚"
-#: git-am.sh:848
+#: git-am.sh:855
msgid ""
"You still have unmerged paths in your index\n"
"did you forget to use 'git add'?"
msgstr "您的索引中ä»æœ‰æœªåˆå¹¶çš„路径。您是å¦å¿˜äº†æ‰§è¡Œ 'git add'?"
-#: git-am.sh:864
+#: git-am.sh:871
msgid "No changes -- Patch already applied."
msgstr "没有å˜æ›´ —— è¡¥ä¸å·²ç»åº”用过。"
-#: git-am.sh:874
+#: git-am.sh:881
#, sh-format
msgid "Patch failed at $msgnum $FIRSTLINE"
msgstr "è¡¥ä¸å¤±è´¥äºŽ $msgnum $FIRSTLINE"
-#: git-am.sh:877
+#: git-am.sh:884
#, sh-format
msgid ""
"The copy of the patch that failed is found in:\n"
@@ -9886,7 +9873,7 @@ msgstr ""
"失败的补ä¸æ–‡ä»¶å‰¯æœ¬ä½äºŽï¼š\n"
" $dotest/patch"
-#: git-am.sh:895
+#: git-am.sh:902
msgid "applying to an empty history"
msgstr "正应用到一个空历å²ä¸Š"
@@ -9953,8 +9940,6 @@ msgstr "输入å的版本:$rev"
msgid "'git bisect bad' can take only one argument."
msgstr "'git bisect bad' åªèƒ½å¸¦ä¸€ä¸ªå‚数。"
-#. have bad but not good. we could bisect although
-#. this is less optimum.
#: git-bisect.sh:273
msgid "Warning: bisecting only with a bad commit."
msgstr "警告:在仅有一个åæ交下进行二分查找。"
@@ -10061,15 +10046,11 @@ msgstr ""
msgid "Pull is not possible because you have unmerged files."
msgstr "Pull ä¸å¯ç”¨ï¼Œå› ä¸ºæ‚¨å°šæœ‰æœªåˆå¹¶çš„文件。"
-#: git-pull.sh:223
+#: git-pull.sh:247
msgid "updating an unborn branch with changes added to the index"
msgstr "更新尚未诞生的分支,å˜æ›´æ·»åŠ è‡³ç´¢å¼•"
-#. The fetch involved updating the current branch.
-#. The working tree and the index file is still based on the
-#. $orig_head commit, but we are merging into $curr_head.
-#. First update the working tree to match $curr_head.
-#: git-pull.sh:247
+#: git-pull.sh:271
#, sh-format
msgid ""
"Warning: fetch updated the current branch head.\n"
@@ -10079,15 +10060,15 @@ msgstr ""
"警告:fetch 更新了当å‰çš„分支。您的工作区\n"
"警告:从原æ交 $orig_head 快进。"
-#: git-pull.sh:272
+#: git-pull.sh:296
msgid "Cannot merge multiple branches into empty head"
msgstr "无法将多个分支åˆå¹¶åˆ°ç©ºåˆ†æ”¯"
-#: git-pull.sh:276
+#: git-pull.sh:300
msgid "Cannot rebase onto multiple branches"
msgstr "无法å˜åŸºåˆ°å¤šä¸ªåˆ†æ”¯"
-#: git-rebase.sh:55
+#: git-rebase.sh:57
msgid ""
"When you have resolved this problem, run \"git rebase --continue\".\n"
"If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
@@ -10098,16 +10079,16 @@ msgstr ""
"如果您想跳过此补ä¸ï¼Œåˆ™æ‰§è¡Œ \"git rebase --skip\"。\n"
"è¦æ¢å¤åŽŸåˆ†æ”¯å¹¶åœæ­¢å˜åŸºï¼Œæ‰§è¡Œ \"git rebase --abort\"。"
-#: git-rebase.sh:158
+#: git-rebase.sh:164
msgid "Applied autostash."
msgstr "æˆåŠŸåº”用 autostash。"
-#: git-rebase.sh:161
+#: git-rebase.sh:167
#, sh-format
msgid "Cannot store $stash_sha1"
msgstr "无法ä¿å­˜ $stash_sha1"
-#: git-rebase.sh:162
+#: git-rebase.sh:168
msgid ""
"Applying autostash resulted in conflicts.\n"
"Your changes are safe in the stash.\n"
@@ -10117,31 +10098,31 @@ msgstr ""
"您的修改安全地ä¿å­˜åœ¨ stash 中。\n"
"您å¯ä»¥åœ¨ä»»ä½•æ—¶å€™è¿è¡Œ \"git stash pop\" 或 \"git stash drop\"。\n"
-#: git-rebase.sh:201
+#: git-rebase.sh:207
msgid "The pre-rebase hook refused to rebase."
msgstr "é’©å­ pre-rebase æ‹’ç»å˜åŸºæ“作。"
-#: git-rebase.sh:206
+#: git-rebase.sh:212
msgid "It looks like git-am is in progress. Cannot rebase."
msgstr "似乎正处于在 git-am 的执行过程中。无法å˜åŸºã€‚"
-#: git-rebase.sh:346
+#: git-rebase.sh:350
msgid "The --exec option must be used with the --interactive option"
msgstr "选项 --exec 必须和选项 --interactive åŒæ—¶ä½¿ç”¨"
-#: git-rebase.sh:351
+#: git-rebase.sh:355
msgid "No rebase in progress?"
msgstr "没有正在进行的å˜åŸºï¼Ÿ"
-#: git-rebase.sh:362
+#: git-rebase.sh:366
msgid "The --edit-todo action can only be used during interactive rebase."
msgstr "动作 --edit-todo åªèƒ½ç”¨åœ¨äº¤äº’å¼å˜åŸºè¿‡ç¨‹ä¸­ã€‚"
-#: git-rebase.sh:369
+#: git-rebase.sh:373
msgid "Cannot read HEAD"
msgstr "ä¸èƒ½è¯»å– HEAD"
-#: git-rebase.sh:372
+#: git-rebase.sh:376
msgid ""
"You must edit all merge conflicts and then\n"
"mark them as resolved using git add"
@@ -10149,12 +10130,12 @@ msgstr ""
"您必须编辑所有的åˆå¹¶å†²çªï¼Œç„¶åŽé€šè¿‡ git add\n"
"命令将它们标记为已解决"
-#: git-rebase.sh:390
+#: git-rebase.sh:394
#, sh-format
msgid "Could not move back to $head_name"
msgstr "无法移回 $head_name"
-#: git-rebase.sh:409
+#: git-rebase.sh:413
#, sh-format
msgid ""
"It seems that there is already a $state_dir_base directory, and\n"
@@ -10173,65 +10154,64 @@ msgstr ""
"\t$cmd_clear_stale_rebase\n"
"然åŽå†é‡æ–°æ‰§è¡Œå˜åŸºæ“作。 为é¿å…丢失é‡è¦æ•°æ®ï¼Œæˆ‘å·²ç»åœæ­¢å½“å‰æ“作。"
-#: git-rebase.sh:456
+#: git-rebase.sh:464
#, sh-format
msgid "invalid upstream $upstream_name"
msgstr "无效的上游 $upstream_name"
-#: git-rebase.sh:480
+#: git-rebase.sh:488
#, sh-format
msgid "$onto_name: there are more than one merge bases"
msgstr "$onto_name: 有一个以上的åˆå¹¶åŸºå‡†"
-#: git-rebase.sh:483 git-rebase.sh:487
+#: git-rebase.sh:491 git-rebase.sh:495
#, sh-format
msgid "$onto_name: there is no merge base"
msgstr "$onto_name: 没有åˆå¹¶åŸºå‡†"
-#: git-rebase.sh:492
+#: git-rebase.sh:500
#, sh-format
msgid "Does not point to a valid commit: $onto_name"
msgstr "没有指å‘一个有效的æ交:$onto_name"
-#: git-rebase.sh:515
+#: git-rebase.sh:523
#, sh-format
msgid "fatal: no such branch: $branch_name"
msgstr "严é‡é”™è¯¯ï¼šæ— æ­¤åˆ†æ”¯ï¼š$branch_name"
-#: git-rebase.sh:548
+#: git-rebase.sh:556
msgid "Cannot autostash"
msgstr "无法 autostash"
-#: git-rebase.sh:553
+#: git-rebase.sh:561
#, sh-format
msgid "Created autostash: $stash_abbrev"
msgstr "创建了 autostash: $stash_abbrev"
-#: git-rebase.sh:557
+#: git-rebase.sh:565
msgid "Please commit or stash them."
msgstr "请æ交或为它们ä¿å­˜è¿›åº¦ã€‚"
-#: git-rebase.sh:577
+#: git-rebase.sh:585
#, sh-format
msgid "Current branch $branch_name is up to date."
msgstr "当å‰åˆ†æ”¯ $branch_name 是最新的。"
-#: git-rebase.sh:581
+#: git-rebase.sh:589
#, sh-format
msgid "Current branch $branch_name is up to date, rebase forced."
msgstr "当å‰åˆ†æ”¯ $branch_name 是最新的,强制å˜åŸºã€‚"
-#: git-rebase.sh:592
+#: git-rebase.sh:600
#, sh-format
msgid "Changes from $mb to $onto:"
msgstr "å˜æ›´ä»Ž $mb 到 $onto:"
-#. Detach HEAD and reset the tree
-#: git-rebase.sh:601
+#: git-rebase.sh:609
msgid "First, rewinding head to replay your work on top of it..."
msgstr "首先,é‡ç½®å¤´æŒ‡é’ˆä»¥ä¾¿åœ¨ä¸Šé¢é‡æ”¾æ‚¨çš„工作..."
-#: git-rebase.sh:611
+#: git-rebase.sh:619
#, sh-format
msgid "Fast-forwarded $branch_name to $onto_name."
msgstr "快进 $branch_name 至 $onto_name。"
@@ -10352,21 +10332,21 @@ msgstr "无法还原修改的文件"
msgid "Index was not unstashed."
msgstr "索引的进度没有被æ¢å¤ã€‚"
-#: git-stash.sh:523
+#: git-stash.sh:529
#, sh-format
msgid "Dropped ${REV} ($s)"
msgstr "丢弃了 ${REV} ($s)"
-#: git-stash.sh:524
+#: git-stash.sh:530
#, sh-format
msgid "${REV}: Could not drop stash entry"
msgstr "${REV}:ä¸èƒ½ä¸¢å¼ƒè¿›åº¦æ¡ç›®"
-#: git-stash.sh:531
+#: git-stash.sh:537
msgid "No branch name specified"
msgstr "未指定分支å"
-#: git-stash.sh:603
+#: git-stash.sh:609
msgid "(To restore them type \"git stash apply\")"
msgstr "(为æ¢å¤æ•°æ®è¾“å…¥ \"git stash apply\")"
@@ -10380,31 +10360,31 @@ msgstr "无法从 url '$remoteurl' 剥离一个组件"
msgid "No submodule mapping found in .gitmodules for path '$sm_path'"
msgstr "未在 .gitmodules 中å‘现路径 '$sm_path' çš„å­æ¨¡ç»„映射"
-#: git-submodule.sh:281
+#: git-submodule.sh:287
#, sh-format
msgid "Clone of '$url' into submodule path '$sm_path' failed"
msgstr "无法克隆 '$url' 到å­æ¨¡ç»„路径 '$sm_path'"
-#: git-submodule.sh:293
+#: git-submodule.sh:299
#, sh-format
msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa"
msgstr "Gitdir '$a' 在å­æ¨¡ç»„路径 '$b' 之下或相å"
-#: git-submodule.sh:403
+#: git-submodule.sh:409
msgid "Relative path can only be used from the toplevel of the working tree"
msgstr "åªèƒ½åœ¨å·¥ä½œåŒºçš„顶级目录中使用相对路径"
-#: git-submodule.sh:413
+#: git-submodule.sh:419
#, sh-format
msgid "repo URL: '$repo' must be absolute or begin with ./|../"
msgstr "版本库URL:'$repo' 必须是ç»å¯¹è·¯å¾„或以 ./|../ 起始"
-#: git-submodule.sh:430
+#: git-submodule.sh:436
#, sh-format
msgid "'$sm_path' already exists in the index"
msgstr "'$sm_path' å·²ç»å­˜åœ¨äºŽç´¢å¼•ä¸­"
-#: git-submodule.sh:434
+#: git-submodule.sh:440
#, sh-format
msgid ""
"The following path is ignored by one of your .gitignore files:\n"
@@ -10415,134 +10395,134 @@ msgstr ""
"$sm_path\n"
"如果您确实想添加它,使用 -f å‚数。"
-#: git-submodule.sh:452
+#: git-submodule.sh:458
#, sh-format
msgid "Adding existing repo at '$sm_path' to the index"
msgstr "添加ä½äºŽ '$sm_path' 的现存版本库到索引"
-#: git-submodule.sh:454
+#: git-submodule.sh:460
#, sh-format
msgid "'$sm_path' already exists and is not a valid git repo"
msgstr "'$sm_path' 已存在且ä¸æ˜¯ä¸€ä¸ªæœ‰æ•ˆçš„ git 版本库"
-#: git-submodule.sh:462
+#: git-submodule.sh:468
#, sh-format
msgid "A git directory for '$sm_name' is found locally with remote(s):"
msgstr "本地å‘现 '$sm_name' 的一个 git 目录,与其对应的远程版本库:"
-#: git-submodule.sh:464
+#: git-submodule.sh:470
#, sh-format
msgid ""
"If you want to reuse this local git directory instead of cloning again from"
msgstr "如果您想é‡ç”¨æ­¤æœ¬åœ° git 目录而ä¸æ˜¯é‡æ–°å…‹éš†è‡ª"
-#: git-submodule.sh:466
+#: git-submodule.sh:472
#, sh-format
msgid ""
"use the '--force' option. If the local git directory is not the correct repo"
msgstr "使用 '--force' å‚数。如果本地 git 目录ä¸æ˜¯æ­£ç¡®çš„版本库"
-#: git-submodule.sh:467
+#: git-submodule.sh:473
#, sh-format
msgid ""
"or you are unsure what this means choose another name with the '--name' "
"option."
msgstr "或者您ä¸ç¡®å®šå…¶ä¸­å«ä¹‰ä½¿ç”¨ '--name' å‚数选择å¦å¤–一个å称。"
-#: git-submodule.sh:469
+#: git-submodule.sh:475
#, sh-format
msgid "Reactivating local git directory for submodule '$sm_name'."
msgstr "激活本地 git 目录到å­æ¨¡ç»„ '$sm_name'。"
-#: git-submodule.sh:481
+#: git-submodule.sh:487
#, sh-format
msgid "Unable to checkout submodule '$sm_path'"
msgstr "ä¸èƒ½æ£€å‡ºå­æ¨¡ç»„ '$sm_path'"
-#: git-submodule.sh:486
+#: git-submodule.sh:492
#, sh-format
msgid "Failed to add submodule '$sm_path'"
msgstr "无法添加å­æ¨¡ç»„ '$sm_path'"
-#: git-submodule.sh:495
+#: git-submodule.sh:501
#, sh-format
msgid "Failed to register submodule '$sm_path'"
msgstr "无法注册å­æ¨¡ç»„ '$sm_path'"
-#: git-submodule.sh:539
+#: git-submodule.sh:545
#, sh-format
msgid "Entering '$prefix$displaypath'"
msgstr "正在进入 '$prefix$displaypath'"
-#: git-submodule.sh:559
+#: git-submodule.sh:565
#, sh-format
msgid "Stopping at '$prefix$displaypath'; script returned non-zero status."
msgstr "åœæ­¢äºŽ '$prefix$displaypath',脚本返回éžé›¶å€¼ã€‚"
-#: git-submodule.sh:605
+#: git-submodule.sh:611
#, sh-format
msgid "No url found for submodule path '$displaypath' in .gitmodules"
msgstr "在 .gitmodules 中未找到å­æ¨¡ç»„路径 '$displaypath' çš„ url"
-#: git-submodule.sh:614
+#: git-submodule.sh:620
#, sh-format
msgid "Failed to register url for submodule path '$displaypath'"
msgstr "无法为å­æ¨¡ç»„路径 '$displaypath' 注册 url"
-#: git-submodule.sh:616
+#: git-submodule.sh:622
#, sh-format
msgid "Submodule '$name' ($url) registered for path '$displaypath'"
msgstr "å­æ¨¡ç»„ '$name' ($url) 未对路径 '$displaypath' 注册"
-#: git-submodule.sh:633
+#: git-submodule.sh:639
#, sh-format
msgid "Failed to register update mode for submodule path '$displaypath'"
msgstr "无法为å­æ¨¡ç»„路径 '$displaypath' 注册更新模å¼"
-#: git-submodule.sh:671
+#: git-submodule.sh:677
#, sh-format
msgid "Use '.' if you really want to deinitialize all submodules"
msgstr "使用 '.' 如果您真的想è¦å¯¹æ‰€æœ‰å­æ¨¡ç»„å–消åˆå§‹åŒ–"
-#: git-submodule.sh:688
+#: git-submodule.sh:694
#, sh-format
msgid "Submodule work tree '$displaypath' contains a .git directory"
msgstr "å­æ¨¡ç»„工作区 '$displaypath' 包å«ä¸€ä¸ª .git 目录"
-#: git-submodule.sh:689
+#: git-submodule.sh:695
#, sh-format
msgid ""
"(use 'rm -rf' if you really want to remove it including all of its history)"
msgstr "(使用 'rm -rf' 命令如果您真的想删除它åŠå…¶å…¨éƒ¨åŽ†å²ï¼‰"
-#: git-submodule.sh:695
+#: git-submodule.sh:701
#, sh-format
msgid ""
"Submodule work tree '$displaypath' contains local modifications; use '-f' to "
"discard them"
msgstr "å­æ¨¡ç»„工作区 '$displaypath' 包å«æœ¬åœ°ä¿®æ”¹ï¼›ä½¿ç”¨ '-f' 丢弃它们"
-#: git-submodule.sh:698
+#: git-submodule.sh:704
#, sh-format
msgid "Cleared directory '$displaypath'"
msgstr "已清除目录 '$displaypath'"
-#: git-submodule.sh:699
+#: git-submodule.sh:705
#, sh-format
msgid "Could not remove submodule work tree '$displaypath'"
msgstr "无法移除å­æ¨¡ç»„工作区 '$displaypath'"
-#: git-submodule.sh:702
+#: git-submodule.sh:708
#, sh-format
msgid "Could not create empty submodule directory '$displaypath'"
msgstr "ä¸èƒ½åˆ›å»ºç©ºçš„å­æ¨¡ç»„目录 '$displaypath'"
-#: git-submodule.sh:711
+#: git-submodule.sh:717
#, sh-format
msgid "Submodule '$name' ($url) unregistered for path '$displaypath'"
msgstr "å­æ¨¡ç»„ '$name' ($url) 未对路径 '$displaypath' 注册"
-#: git-submodule.sh:834
+#: git-submodule.sh:833
#, sh-format
msgid ""
"Submodule path '$displaypath' not initialized\n"
@@ -10551,109 +10531,217 @@ msgstr ""
"å­æ¨¡ç»„路径 '$displaypath' 没有åˆå§‹åŒ–\n"
"也许您想用 'update --init'?"
-#: git-submodule.sh:847
+#: git-submodule.sh:846
#, sh-format
msgid "Unable to find current revision in submodule path '$displaypath'"
msgstr "无法在å­æ¨¡ç»„路径 '$displaypath' 中找到当å‰ç‰ˆæœ¬"
-#: git-submodule.sh:856
+#: git-submodule.sh:855
#, sh-format
msgid "Unable to fetch in submodule path '$sm_path'"
msgstr "无法在å­æ¨¡ç»„路径 '$sm_path' 中获å–"
-#: git-submodule.sh:880
+#: git-submodule.sh:879
#, sh-format
msgid "Unable to fetch in submodule path '$displaypath'"
msgstr "无法在å­æ¨¡ç»„路径 '$displaypath' 中获å–"
+#: git-submodule.sh:893
+#, sh-format
+msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
+msgstr "无法在å­æ¨¡ç»„路径 '$displaypath' 中检出 '$sha1'"
+
#: git-submodule.sh:894
#, sh-format
+msgid "Submodule path '$displaypath': checked out '$sha1'"
+msgstr "å­æ¨¡ç»„路径 '$displaypath':检出 '$sha1'"
+
+#: git-submodule.sh:898
+#, sh-format
msgid "Unable to rebase '$sha1' in submodule path '$displaypath'"
msgstr "无法在å­æ¨¡ç»„路径 '$displaypath' 中å˜åŸº '$sha1'"
-#: git-submodule.sh:895
+#: git-submodule.sh:899
#, sh-format
msgid "Submodule path '$displaypath': rebased into '$sha1'"
msgstr "å­æ¨¡ç»„路径 '$displaypath':å˜åŸºè‡³ '$sha1'"
-#: git-submodule.sh:900
+#: git-submodule.sh:904
#, sh-format
msgid "Unable to merge '$sha1' in submodule path '$displaypath'"
msgstr "无法åˆå¹¶ '$sha1' 到å­æ¨¡ç»„路径 '$displaypath' 中"
-#: git-submodule.sh:901
+#: git-submodule.sh:905
#, sh-format
msgid "Submodule path '$displaypath': merged in '$sha1'"
msgstr "å­æ¨¡ç»„路径 '$displaypath':已åˆå¹¶å…¥ '$sha1'"
-#: git-submodule.sh:906
+#: git-submodule.sh:910
#, sh-format
msgid ""
"Execution of '$command $sha1' failed in submodule path '$prefix$sm_path'"
msgstr "在å­æ¨¡ç»„路径 '$prefix$sm_path' 中执行 '$command $sha1' 失败"
-#: git-submodule.sh:907
+#: git-submodule.sh:911
#, sh-format
msgid "Submodule path '$prefix$sm_path': '$command $sha1'"
msgstr "å­æ¨¡ç»„路径 '$prefix$sm_path': '$command $sha1'"
-#: git-submodule.sh:912
-#, sh-format
-msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
-msgstr "无法在å­æ¨¡ç»„路径 '$displaypath' 中检出 '$sha1'"
-
-#: git-submodule.sh:913
-#, sh-format
-msgid "Submodule path '$displaypath': checked out '$sha1'"
-msgstr "å­æ¨¡ç»„路径 '$displaypath':检出 '$sha1'"
-
-#: git-submodule.sh:940
+#: git-submodule.sh:941
#, sh-format
msgid "Failed to recurse into submodule path '$displaypath'"
msgstr "无法递归进å­æ¨¡ç»„路径 '$displaypath'"
-#: git-submodule.sh:1048
+#: git-submodule.sh:1049
msgid "The --cached option cannot be used with the --files option"
msgstr "选项 --cached ä¸èƒ½å’Œé€‰é¡¹ --files åŒæ—¶ä½¿ç”¨"
-#. unexpected type
-#: git-submodule.sh:1096
+#: git-submodule.sh:1097
#, sh-format
msgid "unexpected mode $mod_dst"
msgstr "æ„å¤–çš„æ¨¡å¼ $mod_dst"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: git-submodule.sh:1116
+#: git-submodule.sh:1117
#, sh-format
msgid " Warn: $display_name doesn't contain commit $sha1_src"
msgstr " 警告:$display_name 未包å«æ交 $sha1_src"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: git-submodule.sh:1119
+#: git-submodule.sh:1120
#, sh-format
msgid " Warn: $display_name doesn't contain commit $sha1_dst"
msgstr " 警告:$display_name 未包å«æ交 $sha1_dst"
# 译者:注æ„ä¿æŒå‰å¯¼ç©ºæ ¼
-#: git-submodule.sh:1122
+#: git-submodule.sh:1123
#, sh-format
msgid " Warn: $display_name doesn't contain commits $sha1_src and $sha1_dst"
msgstr " 警告:$display_name 未包å«æ交 $sha1_src å’Œ $sha1_dst"
-#: git-submodule.sh:1147
+#: git-submodule.sh:1148
msgid "blob"
msgstr "æ•°æ®å¯¹è±¡"
-#: git-submodule.sh:1261
+#: git-submodule.sh:1262
#, sh-format
msgid "Failed to recurse into submodule path '$sm_path'"
msgstr "无法递归进å­æ¨¡ç»„路径 '$sm_path'"
-#: git-submodule.sh:1325
+#: git-submodule.sh:1326
#, sh-format
msgid "Synchronizing submodule url for '$displaypath'"
msgstr "为 '$displaypath' åŒæ­¥å­æ¨¡ç»„ url"
+#~ msgid "key id"
+#~ msgstr "key id"
+
+#~ msgid "Tracking not set up: name too long: %s"
+#~ msgstr "跟踪未设置:å字太长:%s"
+
+#~ msgid "bug"
+#~ msgstr "bug"
+
+# 译者:注æ„ä¿æŒå¥å°¾ç©ºæ ¼
+#~ msgid "ahead "
+#~ msgstr "领先 "
+
+# 译者:注æ„ä¿æŒå¥å°¾ç©ºæ ¼
+#~ msgid ", behind "
+#~ msgstr ",è½åŽ "
+
+#~ msgid "could not find .gitmodules in index"
+#~ msgstr "无法在索引中找到 .gitmodules"
+
+#~ msgid "reading updated .gitmodules failed"
+#~ msgstr "读å–æ›´æ–°åŽçš„ .gitmodules 失败"
+
+#~ msgid "unable to stat updated .gitmodules"
+#~ msgstr "ä¸èƒ½æžšä¸¾æ›´æ–°åŽçš„ .gitmodules"
+
+#~ msgid "unable to remove .gitmodules from index"
+#~ msgstr "ä¸èƒ½ä»Žç´¢å¼•ä¸­ç§»é™¤ .gitmodules"
+
+#~ msgid "adding updated .gitmodules failed"
+#~ msgstr "添加更新åŽçš„ .gitmodules 失败"
+
+# 译者:字符串首行行首è¦æ·»åŠ â€œwarning: â€å­—串,故此首行è¦è¾ƒå…¶ä½™è¡ŒçŸ­
+#~ 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 ""
+#~ "在 Git 2.0 版本,ä½äºŽä¸€ä¸ªå­ç›®å½•ä¸‹ä¸å¸¦ä»»ä½•è·¯å¾„å‚数地执行命令\n"
+#~ "'git add %s (或 %s)' 的行为将被改å˜ï¼Œä¸è¦å†ç»§ç»­ä½¿ç”¨äº†ã€‚\n"
+#~ "如果è¦æ·»åŠ æ•´ä¸ªç›®å½•æ ‘的内容,执行:\n"
+#~ "\n"
+#~ " git add %s :/\n"
+#~ " (或 git add %s :/)\n"
+#~ "\n"
+#~ "如果è¦é™åˆ¶è¯¥å‘½ä»¤åªä½œç”¨äºŽå½“å‰ç›®å½•ï¼Œæ‰§è¡Œï¼š\n"
+#~ "\n"
+#~ " git add %s .\n"
+#~ " (或 git add %s .)\n"
+#~ "\n"
+#~ "对于当å‰ç‰ˆæœ¬çš„ Git,这æ¡å‘½ä»¤åªä½œç”¨äºŽå½“å‰ç›®å½•ã€‚\n"
+
+#~ msgid ""
+#~ "You ran 'git add' with neither '-A (--all)' or '--ignore-removal',\n"
+#~ "whose behaviour will change in Git 2.0 with respect to paths you "
+#~ "removed.\n"
+#~ "Paths like '%s' that are\n"
+#~ "removed from your working tree are ignored with this version of Git.\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <pathspec>', which is the current default,\n"
+#~ " ignores paths you removed from your working tree.\n"
+#~ "\n"
+#~ "* 'git add --all <pathspec>' will let you also record the removals.\n"
+#~ "\n"
+#~ "Run 'git status' to check the paths you removed from your working tree.\n"
+#~ msgstr ""
+#~ "您在è¿è¡Œ 'git add' 时没有指定 '-A (--all)' 或 '--ignore-removal',\n"
+#~ "针对其中本地移除路径的行为将在 Git 2.0 版本库å‘生å˜åŒ–。\n"
+#~ "åƒæœ¬åœ°å·¥ä½œåŒºç§»é™¤çš„路径 '%s'\n"
+#~ "在此版本的 Git 中被忽略。\n"
+#~ "\n"
+#~ "* 'git add --ignore-removal <路径规则>',是当å‰ç‰ˆæœ¬çš„默认æ“作,\n"
+#~ " 忽略您本地工作区中移除的文件。\n"
+#~ "\n"
+#~ "* 'git add --all <路径规则>' 将让您åŒæ—¶å¯¹åˆ é™¤æ“作进行记录。\n"
+#~ "\n"
+#~ "è¿è¡Œ 'git status' æ¥æ£€æŸ¥æ‚¨æœ¬åœ°å·¥ä½œåŒºä¸­ç§»é™¤çš„路径。\n"
+
+#~ msgid ""
+#~ "Auto packing the repository for optimum performance. You may also\n"
+#~ "run \"git gc\" manually. See \"git help gc\" for more information.\n"
+#~ msgstr ""
+#~ "自动打包版本库以求最佳性能。您还å¯ä»¥æ‰‹åŠ¨è¿è¡Œ \"git gc\"。\n"
+#~ "å‚è§ \"git help gc\" 以获å–更多信æ¯ã€‚\n"
+
+#~ msgid ""
+#~ "Updates were rejected because a pushed branch tip is behind its remote\n"
+#~ "counterpart. If you did not intend to push that branch, you may want to\n"
+#~ "specify branches to push or set the 'push.default' configuration "
+#~ "variable\n"
+#~ "to 'simple', 'current' or 'upstream' to push only the current branch."
+#~ msgstr ""
+#~ "更新被拒ç»ï¼Œå› ä¸ºæŽ¨é€çš„一个分支的最新æ交è½åŽäºŽå…¶å¯¹åº”的远程分支。\n"
+#~ "如果您并éžæœ‰æ„推é€è¯¥åˆ†æ”¯ï¼Œæ‚¨å¯ä»¥åœ¨æŽ¨é€æ—¶æŒ‡å®šè¦æŽ¨é€çš„分支,或者将\n"
+#~ "é…ç½®å˜é‡ 'push.default' 设置为 'simple'ã€'current' 或 'upstream'\n"
+#~ "以便åªæŽ¨é€å½“å‰åˆ†æ”¯ã€‚"
+
# 译者:为ä¿è¯åœ¨è¾“出中对é½ï¼Œæ³¨æ„调整å¥ä¸­ç©ºæ ¼ï¼
#~ msgid "copied: %s -> %s"
#~ msgstr "æ‹·è´ï¼š %s -> %s"
@@ -10704,9 +10792,6 @@ msgstr "为 '$displaypath' åŒæ­¥å­æ¨¡ç»„ url"
#~ "('simple' 模å¼ç”± Git 1.7.11 版本引入。如果您有时è¦ä½¿ç”¨è€ç‰ˆæœ¬çš„ Git,\n"
#~ "为ä¿æŒå…¼å®¹ï¼Œè¯·ç”¨ 'current' 代替 'simple')"
-#~ msgid "done\n"
-#~ msgstr "完æˆ\n"
-
#~ msgid "input paths are terminated by a null character"
#~ msgstr "输入路径以null字符终止"
@@ -10844,9 +10929,6 @@ msgstr "为 '$displaypath' åŒæ­¥å­æ¨¡ç»„ url"
#~ msgid "Not removing %s\n"
#~ msgstr "未删除 %s\n"
-#~ msgid "Auto packing the repository for optimum performance.\n"
-#~ msgstr "自动打包版本库以求最佳性能。\n"
-
#~ msgid "git remote set-head <name> (-a | -d | <branch>])"
#~ msgstr "git remote set-head <å称> (-a | -d | <分支>])"
@@ -10857,9 +10939,6 @@ msgstr "为 '$displaypath' åŒæ­¥å­æ¨¡ç»„ url"
#~ msgid " (use \"git add\" to track)"
#~ msgstr "(使用 \"git add\" 建立跟踪)"
-#~ msgid "-B cannot be used with -b"
-#~ msgstr "-B ä¸èƒ½å’Œ -b åŒæ—¶ä½¿ç”¨"
-
#~ msgid "--detach cannot be used with -b/-B/--orphan"
#~ msgstr "--detach ä¸èƒ½å’Œ -b/-B/--orphan åŒæ—¶ä½¿ç”¨"
diff --git a/pretty.c b/pretty.c
index f64ff9a10c..f3e8b6c5bc 100644
--- a/pretty.c
+++ b/pretty.c
@@ -555,14 +555,13 @@ static char *get_header(const struct commit *commit, const char *msg,
const char *line = msg;
while (line) {
- const char *eol = strchr(line, '\n'), *next;
+ const char *eol = strchrnul(line, '\n'), *next;
if (line == eol)
return NULL;
- if (!eol) {
+ if (!*eol) {
warning("malformed commit (header is missing newline): %s",
sha1_to_hex(commit->object.sha1));
- eol = line + strlen(line);
next = NULL;
} else
next = eol + 1;
@@ -607,29 +606,16 @@ static char *replace_encoding_header(char *buf, const char *encoding)
return strbuf_detach(&tmp, NULL);
}
-char *logmsg_reencode(const struct commit *commit,
- char **commit_encoding,
- const char *output_encoding)
+const char *logmsg_reencode(const struct commit *commit,
+ char **commit_encoding,
+ const char *output_encoding)
{
static const char *utf8 = "UTF-8";
const char *use_encoding;
char *encoding;
- char *msg = commit->buffer;
+ const char *msg = get_commit_buffer(commit, NULL);
char *out;
- if (!msg) {
- enum object_type type;
- unsigned long size;
-
- msg = read_sha1_file(commit->object.sha1, &type, &size);
- if (!msg)
- die("Cannot read commit object %s",
- sha1_to_hex(commit->object.sha1));
- if (type != OBJ_COMMIT)
- die("Expected commit for '%s', got %s",
- sha1_to_hex(commit->object.sha1), typename(type));
- }
-
if (!output_encoding || !*output_encoding) {
if (commit_encoding)
*commit_encoding =
@@ -653,12 +639,13 @@ char *logmsg_reencode(const struct commit *commit,
* Otherwise, we still want to munge the encoding header in the
* result, which will be done by modifying the buffer. If we
* are using a fresh copy, we can reuse it. But if we are using
- * the cached copy from commit->buffer, we need to duplicate it
- * to avoid munging commit->buffer.
+ * the cached copy from get_commit_buffer, we need to duplicate it
+ * to avoid munging the cached copy.
*/
- out = msg;
- if (out == commit->buffer)
- out = xstrdup(out);
+ if (msg == get_cached_commit_buffer(commit, NULL))
+ out = xstrdup(msg);
+ else
+ out = (char *)msg;
}
else {
/*
@@ -668,8 +655,8 @@ char *logmsg_reencode(const struct commit *commit,
* copy, we can free it.
*/
out = reencode_string(msg, output_encoding, use_encoding);
- if (out && msg != commit->buffer)
- free(msg);
+ if (out)
+ unuse_commit_buffer(commit, msg);
}
/*
@@ -688,12 +675,6 @@ char *logmsg_reencode(const struct commit *commit,
return out ? out : msg;
}
-void logmsg_free(char *msg, const struct commit *commit)
-{
- if (msg != commit->buffer)
- free(msg);
-}
-
static int mailmap_name(const char **email, size_t *email_len,
const char **name, size_t *name_len)
{
@@ -797,7 +778,7 @@ struct format_commit_context {
struct signature_check signature_check;
enum flush_type flush_type;
enum trunc_type truncate;
- char *message;
+ const char *message;
char *commit_encoding;
size_t width, indent1, indent2;
int auto_color;
@@ -1268,6 +1249,8 @@ static size_t format_commit_one(struct strbuf *sb, /* in UTF-8 */
if (c->signature_check.key)
strbuf_addstr(sb, c->signature_check.key);
break;
+ default:
+ return 0;
}
return 2;
}
@@ -1507,13 +1490,18 @@ void format_commit_message(const struct commit *commit,
context.commit = commit;
context.pretty_ctx = pretty_ctx;
context.wrap_start = sb->len;
+ /*
+ * convert a commit message to UTF-8 first
+ * as far as 'format_commit_item' assumes it in UTF-8
+ */
context.message = logmsg_reencode(commit,
&context.commit_encoding,
- output_enc);
+ utf8);
strbuf_expand(sb, format, format_commit_item, &context);
rewrap_message_tail(sb, &context, 0, 0, 0);
+ /* then convert a commit message to an actual output encoding */
if (output_enc) {
if (same_encoding(utf8, output_enc))
output_enc = NULL;
@@ -1532,7 +1520,7 @@ void format_commit_message(const struct commit *commit,
}
free(context.commit_encoding);
- logmsg_free(context.message, commit);
+ unuse_commit_buffer(commit, context.message);
free(context.signature_check.gpg_output);
free(context.signature_check.signer);
}
@@ -1701,7 +1689,7 @@ void pretty_print_commit(struct pretty_print_context *pp,
unsigned long beginning_of_body;
int indent = 4;
const char *msg;
- char *reencoded;
+ const char *reencoded;
const char *encoding;
int need_8bit_cte = pp->need_8bit_cte;
@@ -1768,7 +1756,7 @@ void pretty_print_commit(struct pretty_print_context *pp,
if (pp->fmt == CMIT_FMT_EMAIL && sb->len <= beginning_of_body)
strbuf_addch(sb, '\n');
- logmsg_free(reencoded, commit);
+ unuse_commit_buffer(commit, reencoded);
}
void pp_commit_easy(enum cmit_fmt fmt, const struct commit *commit,
diff --git a/progress.c b/progress.c
index 10652b174d..261314ef3c 100644
--- a/progress.c
+++ b/progress.c
@@ -9,6 +9,7 @@
*/
#include "git-compat-util.h"
+#include "gettext.h"
#include "progress.h"
#include "strbuf.h"
@@ -220,7 +221,7 @@ struct progress *start_progress(const char *title, unsigned total)
void stop_progress(struct progress **p_progress)
{
- stop_progress_msg(p_progress, "done");
+ stop_progress_msg(p_progress, _("done"));
}
void stop_progress_msg(struct progress **p_progress, const char *msg)
diff --git a/read-cache.c b/read-cache.c
index ee07cd610a..36a6f73fed 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -49,6 +49,7 @@ static void replace_index_entry(struct index_state *istate, int nr, struct cache
struct cache_entry *old = istate->cache[nr];
remove_name_hash(istate, old);
+ free(old);
set_index_entry(istate, nr, ce);
istate->cache_changed = 1;
}
@@ -60,7 +61,7 @@ void rename_index_entry_at(struct index_state *istate, int nr, const char *new_n
new = xmalloc(cache_entry_size(namelen));
copy_cache_entry(new, old);
- new->ce_flags &= ~CE_STATE_MASK;
+ new->ce_flags &= ~CE_HASHED;
new->ce_namelen = namelen;
memcpy(new->name, new_name, namelen + 1);
@@ -480,6 +481,7 @@ int remove_index_entry_at(struct index_state *istate, int pos)
record_resolve_undo(istate, ce);
remove_name_hash(istate, ce);
+ free(ce);
istate->cache_changed = 1;
istate->cache_nr--;
if (pos >= istate->cache_nr)
@@ -501,8 +503,10 @@ void remove_marked_cache_entries(struct index_state *istate)
unsigned int i, j;
for (i = j = 0; i < istate->cache_nr; i++) {
- if (ce_array[i]->ce_flags & CE_REMOVE)
+ if (ce_array[i]->ce_flags & CE_REMOVE) {
remove_name_hash(istate, ce_array[i]);
+ free(ce_array[i]);
+ }
else
ce_array[j++] = ce_array[i];
}
@@ -581,7 +585,7 @@ static struct cache_entry *create_alias_ce(struct cache_entry *ce, struct cache_
return new;
}
-static void record_intent_to_add(struct cache_entry *ce)
+void set_object_name_for_intent_to_add_entry(struct cache_entry *ce)
{
unsigned char sha1[20];
if (write_sha1_file("", 0, blob_type, sha1))
@@ -667,7 +671,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
if (index_path(ce->sha1, path, st, HASH_WRITE_OBJECT))
return error("unable to index file %s", path);
} else
- record_intent_to_add(ce);
+ set_object_name_for_intent_to_add_entry(ce);
if (ignore_case && alias && different_name(ce, alias))
ce = create_alias_ce(ce, alias);
@@ -992,11 +996,7 @@ int add_index_entry(struct index_state *istate, struct cache_entry *ce, int opti
}
/* Make sure the array is big enough .. */
- if (istate->cache_nr == istate->cache_alloc) {
- istate->cache_alloc = alloc_nr(istate->cache_alloc);
- istate->cache = xrealloc(istate->cache,
- istate->cache_alloc * sizeof(*istate->cache));
- }
+ ALLOC_GROW(istate->cache, istate->cache_nr + 1, istate->cache_alloc);
/* Add it in.. */
istate->cache_nr++;
@@ -1222,6 +1222,42 @@ static struct cache_entry *refresh_cache_entry(struct cache_entry *ce,
#define INDEX_FORMAT_DEFAULT 3
+static int index_format_config(const char *var, const char *value, void *cb)
+{
+ unsigned int *version = cb;
+ if (!strcmp(var, "index.version")) {
+ *version = git_config_int(var, value);
+ return 0;
+ }
+ return 1;
+}
+
+static unsigned int get_index_format_default(void)
+{
+ char *envversion = getenv("GIT_INDEX_VERSION");
+ char *endp;
+ unsigned int version = INDEX_FORMAT_DEFAULT;
+
+ if (!envversion) {
+ git_config(index_format_config, &version);
+ if (version < INDEX_FORMAT_LB || INDEX_FORMAT_UB < version) {
+ warning(_("index.version set, but the value is invalid.\n"
+ "Using version %i"), INDEX_FORMAT_DEFAULT);
+ return INDEX_FORMAT_DEFAULT;
+ }
+ return version;
+ }
+
+ version = strtoul(envversion, &endp, 10);
+ if (*endp ||
+ version < INDEX_FORMAT_LB || INDEX_FORMAT_UB < version) {
+ warning(_("GIT_INDEX_VERSION set, but the value is invalid.\n"
+ "Using version %i"), INDEX_FORMAT_DEFAULT);
+ version = INDEX_FORMAT_DEFAULT;
+ }
+ return version;
+}
+
/*
* dev/ino/uid/gid/size are also just tracked to the low 32 bits
* Again - this is just a (very strong in practice) heuristic that
@@ -1316,26 +1352,6 @@ int read_index(struct index_state *istate)
return read_index_from(istate, get_index_file());
}
-#ifndef NEEDS_ALIGNED_ACCESS
-#define ntoh_s(var) ntohs(var)
-#define ntoh_l(var) ntohl(var)
-#else
-static inline uint16_t ntoh_s_force_align(void *p)
-{
- uint16_t x;
- memcpy(&x, p, sizeof(x));
- return ntohs(x);
-}
-static inline uint32_t ntoh_l_force_align(void *p)
-{
- uint32_t x;
- memcpy(&x, p, sizeof(x));
- return ntohl(x);
-}
-#define ntoh_s(var) ntoh_s_force_align(&(var))
-#define ntoh_l(var) ntoh_l_force_align(&(var))
-#endif
-
static struct cache_entry *cache_entry_from_ondisk(struct ondisk_cache_entry *ondisk,
unsigned int flags,
const char *name,
@@ -1343,16 +1359,16 @@ static struct cache_entry *cache_entry_from_ondisk(struct ondisk_cache_entry *on
{
struct cache_entry *ce = xmalloc(cache_entry_size(len));
- ce->ce_stat_data.sd_ctime.sec = ntoh_l(ondisk->ctime.sec);
- ce->ce_stat_data.sd_mtime.sec = ntoh_l(ondisk->mtime.sec);
- ce->ce_stat_data.sd_ctime.nsec = ntoh_l(ondisk->ctime.nsec);
- ce->ce_stat_data.sd_mtime.nsec = ntoh_l(ondisk->mtime.nsec);
- ce->ce_stat_data.sd_dev = ntoh_l(ondisk->dev);
- ce->ce_stat_data.sd_ino = ntoh_l(ondisk->ino);
- ce->ce_mode = ntoh_l(ondisk->mode);
- ce->ce_stat_data.sd_uid = ntoh_l(ondisk->uid);
- ce->ce_stat_data.sd_gid = ntoh_l(ondisk->gid);
- ce->ce_stat_data.sd_size = ntoh_l(ondisk->size);
+ ce->ce_stat_data.sd_ctime.sec = get_be32(&ondisk->ctime.sec);
+ ce->ce_stat_data.sd_mtime.sec = get_be32(&ondisk->mtime.sec);
+ ce->ce_stat_data.sd_ctime.nsec = get_be32(&ondisk->ctime.nsec);
+ ce->ce_stat_data.sd_mtime.nsec = get_be32(&ondisk->mtime.nsec);
+ ce->ce_stat_data.sd_dev = get_be32(&ondisk->dev);
+ ce->ce_stat_data.sd_ino = get_be32(&ondisk->ino);
+ ce->ce_mode = get_be32(&ondisk->mode);
+ ce->ce_stat_data.sd_uid = get_be32(&ondisk->uid);
+ ce->ce_stat_data.sd_gid = get_be32(&ondisk->gid);
+ ce->ce_stat_data.sd_size = get_be32(&ondisk->size);
ce->ce_flags = flags & ~CE_NAMEMASK;
ce->ce_namelen = len;
hashcpy(ce->sha1, ondisk->sha1);
@@ -1392,14 +1408,14 @@ static struct cache_entry *create_from_disk(struct ondisk_cache_entry *ondisk,
unsigned int flags;
/* On-disk flags are just 16 bits */
- flags = ntoh_s(ondisk->flags);
+ flags = get_be16(&ondisk->flags);
len = flags & CE_NAMEMASK;
if (flags & CE_EXTENDED) {
struct ondisk_cache_entry_extended *ondisk2;
int extended_flags;
ondisk2 = (struct ondisk_cache_entry_extended *)ondisk;
- extended_flags = ntoh_s(ondisk2->flags2) << 16;
+ extended_flags = get_be16(&ondisk2->flags2) << 16;
/* We do not yet understand any bit out of CE_EXTENDED_FLAGS */
if (extended_flags & ~CE_EXTENDED_FLAGS)
die("Unknown index entry format %08x", extended_flags);
@@ -1467,6 +1483,7 @@ int read_index_from(struct index_state *istate, const char *path)
if (verify_hdr(hdr, mmap_size) < 0)
goto unmap;
+ hashcpy(istate->sha1, (unsigned char *)hdr + mmap_size - 20);
istate->version = ntohl(hdr->hdr_version);
istate->cache_nr = ntohl(hdr->hdr_entries);
istate->cache_alloc = alloc_nr(istate->cache_nr);
@@ -1750,6 +1767,50 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce,
return result;
}
+/*
+ * This function verifies if index_state has the correct sha1 of the
+ * index file. Don't die if we have any other failure, just return 0.
+ */
+static int verify_index_from(const struct index_state *istate, const char *path)
+{
+ int fd;
+ ssize_t n;
+ struct stat st;
+ unsigned char sha1[20];
+
+ if (!istate->initialized)
+ return 0;
+
+ fd = open(path, O_RDONLY);
+ if (fd < 0)
+ return 0;
+
+ if (fstat(fd, &st))
+ goto out;
+
+ if (st.st_size < sizeof(struct cache_header) + 20)
+ goto out;
+
+ n = pread_in_full(fd, sha1, 20, st.st_size - 20);
+ if (n != 20)
+ goto out;
+
+ if (hashcmp(istate->sha1, sha1))
+ goto out;
+
+ close(fd);
+ return 1;
+
+out:
+ close(fd);
+ return 0;
+}
+
+static int verify_index(const struct index_state *istate)
+{
+ return verify_index_from(istate, get_index_file());
+}
+
static int has_racy_timestamp(struct index_state *istate)
{
int entries = istate->cache_nr;
@@ -1769,7 +1830,7 @@ static int has_racy_timestamp(struct index_state *istate)
void update_index_if_able(struct index_state *istate, struct lock_file *lockfile)
{
if ((istate->cache_changed || has_racy_timestamp(istate)) &&
- !write_index(istate, lockfile->fd))
+ verify_index(istate) && !write_index(istate, lockfile->fd))
commit_locked_index(lockfile);
else
rollback_lock_file(lockfile);
@@ -1798,7 +1859,7 @@ int write_index(struct index_state *istate, int newfd)
}
if (!istate->version)
- istate->version = INDEX_FORMAT_DEFAULT;
+ istate->version = get_index_format_default();
/* demote version 3 to version 2 when the latter suffices */
if (istate->version == 3 || istate->version == 2)
@@ -1897,7 +1958,7 @@ int read_index_unmerged(struct index_state *istate)
new_ce->ce_mode = ce->ce_mode;
if (add_index_entry(istate, new_ce, 0))
return error("%s: cannot drop to stage #0",
- ce->name);
+ new_ce->name);
i = index_name_pos(istate, new_ce->name, len);
}
return unmerged;
diff --git a/reflog-walk.c b/reflog-walk.c
index b2fbdb2392..9ce8b53ccc 100644
--- a/reflog-walk.c
+++ b/reflog-walk.c
@@ -26,14 +26,10 @@ static int read_one_reflog(unsigned char *osha1, unsigned char *nsha1,
struct complete_reflogs *array = cb_data;
struct reflog_info *item;
- if (array->nr >= array->alloc) {
- array->alloc = alloc_nr(array->nr + 1);
- array->items = xrealloc(array->items, array->alloc *
- sizeof(struct reflog_info));
- }
+ ALLOC_GROW(array->items, array->nr + 1, array->alloc);
item = array->items + array->nr;
- memcpy(item->osha1, osha1, 20);
- memcpy(item->nsha1, nsha1, 20);
+ hashcpy(item->osha1, osha1);
+ hashcpy(item->nsha1, nsha1);
item->email = xstrdup(email);
item->timestamp = timestamp;
item->tz = tz;
@@ -45,7 +41,7 @@ static int read_one_reflog(unsigned char *osha1, unsigned char *nsha1,
static struct complete_reflogs *read_complete_reflog(const char *ref)
{
struct complete_reflogs *reflogs =
- xcalloc(sizeof(struct complete_reflogs), 1);
+ xcalloc(1, sizeof(struct complete_reflogs));
reflogs->ref = xstrdup(ref);
for_each_reflog_ent(ref, read_one_reflog, reflogs);
if (reflogs->nr == 0) {
@@ -114,11 +110,7 @@ static void add_commit_info(struct commit *commit, void *util,
struct commit_info_lifo *lifo)
{
struct commit_info *info;
- if (lifo->nr >= lifo->alloc) {
- lifo->alloc = alloc_nr(lifo->nr + 1);
- lifo->items = xrealloc(lifo->items,
- lifo->alloc * sizeof(struct commit_info));
- }
+ ALLOC_GROW(lifo->items, lifo->nr + 1, lifo->alloc);
info = lifo->items + lifo->nr;
info->commit = commit;
info->util = util;
@@ -143,7 +135,7 @@ struct reflog_walk_info {
void init_reflog_walk(struct reflog_walk_info** info)
{
- *info = xcalloc(sizeof(struct reflog_walk_info), 1);
+ *info = xcalloc(1, sizeof(struct reflog_walk_info));
}
int add_reflog_for_walk(struct reflog_walk_info *info,
@@ -207,7 +199,7 @@ int add_reflog_for_walk(struct reflog_walk_info *info,
= reflogs;
}
- commit_reflog = xcalloc(sizeof(struct commit_reflog), 1);
+ commit_reflog = xcalloc(1, sizeof(struct commit_reflog));
if (recno < 0) {
commit_reflog->recno = get_reflog_recno_by_time(reflogs, timestamp);
if (commit_reflog->recno < 0) {
@@ -250,7 +242,7 @@ void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit)
return;
}
- commit->parents = xcalloc(sizeof(struct commit_list), 1);
+ commit->parents = xcalloc(1, sizeof(struct commit_list));
commit->parents->item = commit_info->commit;
}
diff --git a/refs.c b/refs.c
index 89228e2373..f0bd7ac0e9 100644
--- a/refs.c
+++ b/refs.c
@@ -1222,7 +1222,7 @@ static int resolve_gitlink_packed_ref(struct ref_cache *refs,
if (ref == NULL)
return -1;
- memcpy(sha1, ref->u.value.sha1, 20);
+ hashcpy(sha1, ref->u.value.sha1);
return 0;
}
@@ -1477,7 +1477,7 @@ static int filter_refs(const char *refname, const unsigned char *sha1, int flags
void *data)
{
struct ref_filter *filter = (struct ref_filter *)data;
- if (fnmatch(filter->pattern, refname, 0))
+ if (wildmatch(filter->pattern, refname, 0, NULL))
return 0;
return filter->fn(refname, sha1, flags, filter->cb_data);
}
@@ -1520,9 +1520,8 @@ static enum peel_status peel_object(const unsigned char *name, unsigned char *sh
if (o->type == OBJ_NONE) {
int type = sha1_object_info(name, NULL);
- if (type < 0)
+ if (type < 0 || !object_as_type(o, type, 0))
return PEEL_INVALID;
- o->type = type;
}
if (o->type != OBJ_TAG)
@@ -1611,6 +1610,7 @@ int peel_ref(const char *refname, unsigned char *sha1)
struct warn_if_dangling_data {
FILE *fp;
const char *refname;
+ const struct string_list *refnames;
const char *msg_fmt;
};
@@ -1625,8 +1625,12 @@ static int warn_if_dangling_symref(const char *refname, const unsigned char *sha
return 0;
resolves_to = resolve_ref_unsafe(refname, junk, 0, NULL);
- if (!resolves_to || strcmp(resolves_to, d->refname))
+ if (!resolves_to
+ || (d->refname
+ ? strcmp(resolves_to, d->refname)
+ : !string_list_has_string(d->refnames, resolves_to))) {
return 0;
+ }
fprintf(d->fp, d->msg_fmt, refname);
fputc('\n', d->fp);
@@ -1639,6 +1643,18 @@ void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
data.fp = fp;
data.refname = refname;
+ data.refnames = NULL;
+ data.msg_fmt = msg_fmt;
+ for_each_rawref(warn_if_dangling_symref, &data);
+}
+
+void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
+{
+ struct warn_if_dangling_data data;
+
+ data.fp = fp;
+ data.refname = NULL;
+ data.refnames = refnames;
data.msg_fmt = msg_fmt;
for_each_rawref(warn_if_dangling_symref, &data);
}
@@ -2431,7 +2447,7 @@ static int curate_packed_ref_fn(struct ref_entry *entry, void *cb_data)
return 0;
}
-static int repack_without_refs(const char **refnames, int n)
+int repack_without_refs(const char **refnames, int n)
{
struct ref_dir *packed;
struct string_list refs_to_delete = STRING_LIST_INIT_DUP;
diff --git a/refs.h b/refs.h
index 87a1a79ad6..1440acc06c 100644
--- a/refs.h
+++ b/refs.h
@@ -89,6 +89,7 @@ static inline const char *has_glob_specials(const char *pattern)
extern int for_each_rawref(each_ref_fn, void *);
extern void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname);
+extern void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list* refnames);
/*
* Lock the packed-refs file for writing. Flags is passed to
@@ -132,6 +133,8 @@ extern void rollback_packed_refs(void);
*/
int pack_refs(unsigned int flags);
+extern int repack_without_refs(const char **refnames, int n);
+
extern int ref_exists(const char *);
/*
diff --git a/remote-curl.c b/remote-curl.c
index 10cb0114ea..52c2d96ce6 100644
--- a/remote-curl.c
+++ b/remote-curl.c
@@ -423,11 +423,8 @@ static int run_slot(struct active_request_slot *slot,
if (!results)
results = &results_buf;
- slot->results = results;
- slot->curl_result = curl_easy_perform(slot->curl);
- finish_active_slot(slot);
+ err = run_one_slot(slot, results);
- err = handle_curl_result(results);
if (err != HTTP_OK && err != HTTP_REAUTH) {
error("RPC failed; result=%d, HTTP code = %ld",
results->curl_result, results->http_code);
diff --git a/remote-testsvn.c b/remote-testsvn.c
index 078f1ffa41..6be55cbe9e 100644
--- a/remote-testsvn.c
+++ b/remote-testsvn.c
@@ -78,8 +78,8 @@ static int parse_rev_note(const char *msg, struct rev_note *res)
size_t len;
while (*msg) {
- end = strchr(msg, '\n');
- len = end ? end - msg : strlen(msg);
+ end = strchrnul(msg, '\n');
+ len = end - msg;
key = "Revision-number: ";
if (starts_with(msg, key)) {
diff --git a/remote.c b/remote.c
index ebed40dcb6..0e9459cc06 100644
--- a/remote.c
+++ b/remote.c
@@ -523,7 +523,7 @@ static void free_refspecs(struct refspec *refspec, int nr_refspec)
static struct refspec *parse_refspec_internal(int nr_refspec, const char **refspec, int fetch, int verify)
{
int i;
- struct refspec *rs = xcalloc(sizeof(*rs), nr_refspec);
+ struct refspec *rs = xcalloc(nr_refspec, sizeof(*rs));
for (i = 0; i < nr_refspec; i++) {
size_t llen;
@@ -1062,11 +1062,13 @@ int count_refspec_match(const char *pattern,
}
}
if (!matched) {
- *matched_ref = matched_weak;
+ if (matched_ref)
+ *matched_ref = matched_weak;
return weak_match;
}
else {
- *matched_ref = matched;
+ if (matched_ref)
+ *matched_ref = matched;
return match;
}
}
@@ -1086,18 +1088,25 @@ static struct ref *alloc_delete_ref(void)
return ref;
}
-static struct ref *try_explicit_object_name(const char *name)
+static int try_explicit_object_name(const char *name,
+ struct ref **match)
{
unsigned char sha1[20];
- struct ref *ref;
- if (!*name)
- return alloc_delete_ref();
+ if (!*name) {
+ if (match)
+ *match = alloc_delete_ref();
+ return 0;
+ }
+
if (get_sha1(name, sha1))
- return NULL;
- ref = alloc_ref(name);
- hashcpy(ref->new_sha1, sha1);
- return ref;
+ return -1;
+
+ if (match) {
+ *match = alloc_ref(name);
+ hashcpy((*match)->new_sha1, sha1);
+ }
+ return 0;
}
static struct ref *make_linked_ref(const char *name, struct ref ***tail)
@@ -1127,12 +1136,37 @@ static char *guess_ref(const char *name, struct ref *peer)
return strbuf_detach(&buf, NULL);
}
+static int match_explicit_lhs(struct ref *src,
+ struct refspec *rs,
+ struct ref **match,
+ int *allocated_match)
+{
+ switch (count_refspec_match(rs->src, src, match)) {
+ case 1:
+ if (allocated_match)
+ *allocated_match = 0;
+ return 0;
+ case 0:
+ /* The source could be in the get_sha1() format
+ * not a reference name. :refs/other is a
+ * way to delete 'other' ref at the remote end.
+ */
+ if (try_explicit_object_name(rs->src, match) < 0)
+ return error("src refspec %s does not match any.", rs->src);
+ if (allocated_match)
+ *allocated_match = 1;
+ return 0;
+ default:
+ return error("src refspec %s matches more than one.", rs->src);
+ }
+}
+
static int match_explicit(struct ref *src, struct ref *dst,
struct ref ***dst_tail,
struct refspec *rs)
{
struct ref *matched_src, *matched_dst;
- int copy_src;
+ int allocated_src;
const char *dst_value = rs->dst;
char *dst_guess;
@@ -1141,23 +1175,8 @@ static int match_explicit(struct ref *src, struct ref *dst,
return 0;
matched_src = matched_dst = NULL;
- switch (count_refspec_match(rs->src, src, &matched_src)) {
- case 1:
- copy_src = 1;
- break;
- case 0:
- /* The source could be in the get_sha1() format
- * not a reference name. :refs/other is a
- * way to delete 'other' ref at the remote end.
- */
- matched_src = try_explicit_object_name(rs->src);
- if (!matched_src)
- return error("src refspec %s does not match any.", rs->src);
- copy_src = 0;
- break;
- default:
- return error("src refspec %s matches more than one.", rs->src);
- }
+ if (match_explicit_lhs(src, rs, &matched_src, &allocated_src) < 0)
+ return -1;
if (!dst_value) {
unsigned char sha1[20];
@@ -1202,7 +1221,9 @@ static int match_explicit(struct ref *src, struct ref *dst,
return error("dst ref %s receives from more than one src.",
matched_dst->name);
else {
- matched_dst->peer_ref = copy_src ? copy_ref(matched_src) : matched_src;
+ matched_dst->peer_ref = allocated_src ?
+ matched_src :
+ copy_ref(matched_src);
matched_dst->force = rs->force;
}
return 0;
@@ -1384,6 +1405,31 @@ static void prepare_ref_index(struct string_list *ref_index, struct ref *ref)
}
/*
+ * Given only the set of local refs, sanity-check the set of push
+ * refspecs. We can't catch all errors that match_push_refs would,
+ * but we can catch some errors early before even talking to the
+ * remote side.
+ */
+int check_push_refs(struct ref *src, int nr_refspec, const char **refspec_names)
+{
+ struct refspec *refspec = parse_push_refspec(nr_refspec, refspec_names);
+ int ret = 0;
+ int i;
+
+ for (i = 0; i < nr_refspec; i++) {
+ struct refspec *rs = refspec + i;
+
+ if (rs->pattern || rs->matching)
+ continue;
+
+ ret |= match_explicit_lhs(src, rs, NULL, NULL);
+ }
+
+ free_refspec(nr_refspec, refspec);
+ return ret;
+}
+
+/*
* Given the set of refs the local repository has, the set of refs the
* remote repository has, and the refspec used for push, determine
* what remote refs we will update and with what value by setting
diff --git a/remote.h b/remote.h
index fb7647fab9..917d383a80 100644
--- a/remote.h
+++ b/remote.h
@@ -166,6 +166,7 @@ extern int query_refspecs(struct refspec *specs, int nr, struct refspec *query);
char *apply_refspecs(struct refspec *refspecs, int nr_refspec,
const char *name);
+int check_push_refs(struct ref *src, int nr_refspec, const char **refspec);
int match_push_refs(struct ref *src, struct ref **dst,
int nr_refspec, const char **refspec, int all);
void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
diff --git a/replace_object.c b/replace_object.c
index cdcaf8cbe2..0ab2dc1374 100644
--- a/replace_object.c
+++ b/replace_object.c
@@ -3,8 +3,13 @@
#include "refs.h"
#include "commit.h"
+/*
+ * An array of replacements. The array is kept sorted by the original
+ * sha1.
+ */
static struct replace_object {
- unsigned char sha1[2][20];
+ unsigned char original[20];
+ unsigned char replacement[20];
} **replace_object;
static int replace_object_alloc, replace_object_nr;
@@ -12,7 +17,7 @@ static int replace_object_alloc, replace_object_nr;
static const unsigned char *replace_sha1_access(size_t index, void *table)
{
struct replace_object **replace = table;
- return replace[index]->sha1[0];
+ return replace[index]->original;
}
static int replace_object_pos(const unsigned char *sha1)
@@ -24,7 +29,7 @@ static int replace_object_pos(const unsigned char *sha1)
static int register_replace_object(struct replace_object *replace,
int ignore_dups)
{
- int pos = replace_object_pos(replace->sha1[0]);
+ int pos = replace_object_pos(replace->original);
if (0 <= pos) {
if (ignore_dups)
@@ -36,12 +41,8 @@ static int register_replace_object(struct replace_object *replace,
return 1;
}
pos = -pos - 1;
- if (replace_object_alloc <= ++replace_object_nr) {
- replace_object_alloc = alloc_nr(replace_object_alloc);
- replace_object = xrealloc(replace_object,
- sizeof(*replace_object) *
- replace_object_alloc);
- }
+ ALLOC_GROW(replace_object, replace_object_nr + 1, replace_object_alloc);
+ replace_object_nr++;
if (pos < replace_object_nr)
memmove(replace_object + pos + 1,
replace_object + pos,
@@ -60,14 +61,14 @@ static int register_replace_ref(const char *refname,
const char *hash = slash ? slash + 1 : refname;
struct replace_object *repl_obj = xmalloc(sizeof(*repl_obj));
- if (strlen(hash) != 40 || get_sha1_hex(hash, repl_obj->sha1[0])) {
+ if (strlen(hash) != 40 || get_sha1_hex(hash, repl_obj->original)) {
free(repl_obj);
warning("bad replace ref name: %s", refname);
return 0;
}
/* Copy sha1 from the read ref */
- hashcpy(repl_obj->sha1[1], sha1);
+ hashcpy(repl_obj->replacement, sha1);
/* Register new object */
if (register_replace_object(repl_obj, 1))
@@ -86,12 +87,19 @@ static void prepare_replace_object(void)
for_each_replace_ref(register_replace_ref, NULL);
replace_object_prepared = 1;
if (!replace_object_nr)
- read_replace_refs = 0;
+ check_replace_refs = 0;
}
/* We allow "recursive" replacement. Only within reason, though */
#define MAXREPLACEDEPTH 5
+/*
+ * If a replacement for object sha1 has been set up, return the
+ * replacement object's name (replaced recursively, if necessary).
+ * The return value is either sha1 or a pointer to a
+ * permanently-allocated value. This function always respects replace
+ * references, regardless of the value of check_replace_refs.
+ */
const unsigned char *do_lookup_replace_object(const unsigned char *sha1)
{
int pos, depth = MAXREPLACEDEPTH;
@@ -107,7 +115,7 @@ const unsigned char *do_lookup_replace_object(const unsigned char *sha1)
pos = replace_object_pos(cur);
if (0 <= pos)
- cur = replace_object[pos]->sha1[1];
+ cur = replace_object[pos]->replacement;
} while (0 <= pos);
return cur;
diff --git a/resolve-undo.c b/resolve-undo.c
index 67d1543141..44c697c36d 100644
--- a/resolve-undo.c
+++ b/resolve-undo.c
@@ -119,6 +119,7 @@ int unmerge_index_entry_at(struct index_state *istate, int pos)
struct string_list_item *item;
struct resolve_undo_info *ru;
int i, err = 0, matched;
+ char *name;
if (!istate->resolve_undo)
return pos;
@@ -138,20 +139,22 @@ int unmerge_index_entry_at(struct index_state *istate, int pos)
if (!ru)
return pos;
matched = ce->ce_flags & CE_MATCHED;
+ name = xstrdup(ce->name);
remove_index_entry_at(istate, pos);
for (i = 0; i < 3; i++) {
struct cache_entry *nce;
if (!ru->mode[i])
continue;
nce = make_cache_entry(ru->mode[i], ru->sha1[i],
- ce->name, i + 1, 0);
+ name, i + 1, 0);
if (matched)
nce->ce_flags |= CE_MATCHED;
if (add_index_entry(istate, nce, ADD_CACHE_OK_TO_ADD)) {
err = 1;
- error("cannot unmerge '%s'", ce->name);
+ error("cannot unmerge '%s'", name);
}
}
+ free(name);
if (err)
return pos;
free(ru);
diff --git a/revision.c b/revision.c
index f40ccf1426..2571ada6bf 100644
--- a/revision.c
+++ b/revision.c
@@ -497,24 +497,14 @@ static int rev_compare_tree(struct rev_info *revs,
static int rev_same_tree_as_empty(struct rev_info *revs, struct commit *commit)
{
int retval;
- void *tree;
- unsigned long size;
- struct tree_desc empty, real;
struct tree *t1 = commit->tree;
if (!t1)
return 0;
- tree = read_object_with_reference(t1->object.sha1, tree_type, &size, NULL);
- if (!tree)
- return 0;
- init_tree_desc(&real, tree, size);
- init_tree_desc(&empty, "", 0);
-
tree_difference = REV_TREE_SAME;
DIFF_OPT_CLR(&revs->pruning, HAS_CHANGES);
- retval = diff_tree(&empty, &real, "", &revs->pruning);
- free(tree);
+ retval = diff_tree_sha1(NULL, t1->object.sha1, "", &revs->pruning);
return retval >= 0 && (tree_difference == REV_TREE_SAME);
}
@@ -784,6 +774,10 @@ static int add_parents_to_list(struct rev_info *revs, struct commit *commit,
return 0;
commit->object.flags |= ADDED;
+ if (revs->include_check &&
+ !revs->include_check(commit, revs->include_check_data))
+ return 0;
+
/*
* If the commit is uninteresting, don't try to
* prune parents - we want the maximal uninteresting
@@ -1192,7 +1186,7 @@ int ref_excluded(struct string_list *ref_excludes, const char *path)
if (!ref_excludes)
return 0;
for_each_string_list_item(item, ref_excludes) {
- if (!fnmatch(item->string, path, 0))
+ if (!wildmatch(item->string, path, 0, NULL))
return 1;
}
return 0;
@@ -1581,6 +1575,10 @@ static void read_revisions_from_stdin(struct rev_info *revs,
{
struct strbuf sb;
int seen_dashdash = 0;
+ int save_warning;
+
+ save_warning = warn_on_object_refname_ambiguity;
+ warn_on_object_refname_ambiguity = 0;
strbuf_init(&sb, 1000);
while (strbuf_getwholeline(&sb, stdin, '\n') != EOF) {
@@ -1602,7 +1600,9 @@ static void read_revisions_from_stdin(struct rev_info *revs,
}
if (seen_dashdash)
read_pathspec_from_stdin(revs, &sb, prune);
+
strbuf_release(&sb);
+ warn_on_object_refname_ambiguity = save_warning;
}
static void add_grep(struct rev_info *revs, const char *ptn, enum grep_pat_token what)
@@ -1633,6 +1633,7 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
!strcmp(arg, "--reflog") || !strcmp(arg, "--not") ||
!strcmp(arg, "--no-walk") || !strcmp(arg, "--do-walk") ||
!strcmp(arg, "--bisect") || starts_with(arg, "--glob=") ||
+ starts_with(arg, "--exclude=") ||
starts_with(arg, "--branches=") || starts_with(arg, "--tags=") ||
starts_with(arg, "--remotes=") || starts_with(arg, "--no-walk="))
{
@@ -1648,8 +1649,10 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
revs->skip_count = atoi(optarg);
return argcount;
} else if ((*arg == '-') && isdigit(arg[1])) {
- /* accept -<digit>, like traditional "head" */
- revs->max_count = atoi(arg + 1);
+ /* accept -<digit>, like traditional "head" */
+ if (strtol_i(arg + 1, 10, &revs->max_count) < 0 ||
+ revs->max_count < 0)
+ die("'%s': not a non-negative integer", arg + 1);
revs->no_walk = 0;
} else if (!strcmp(arg, "-n")) {
if (argc <= 1)
@@ -1837,6 +1840,14 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
revs->notes_opt.use_default_notes = 1;
} else if (!strcmp(arg, "--show-signature")) {
revs->show_signature = 1;
+ } else if (!strcmp(arg, "--show-linear-break") ||
+ starts_with(arg, "--show-linear-break=")) {
+ if (starts_with(arg, "--show-linear-break="))
+ revs->break_bar = xstrdup(arg + 20);
+ else
+ revs->break_bar = " ..........";
+ revs->track_linear = 1;
+ revs->track_first_time = 1;
} else if (starts_with(arg, "--show-notes=") ||
starts_with(arg, "--notes=")) {
struct strbuf buf = STRBUF_INIT;
@@ -1960,6 +1971,8 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
unkv[(*unkc)++] = arg;
return opts;
}
+ if (revs->graph && revs->track_linear)
+ die("--show-linear-break and --graph are incompatible");
return 1;
}
@@ -2778,7 +2791,7 @@ static int commit_match(struct commit *commit, struct rev_info *opt)
{
int retval;
const char *encoding;
- char *message;
+ const char *message;
struct strbuf buf = STRBUF_INIT;
if (!opt->grep_filter.pattern_list && !opt->grep_filter.header_list)
@@ -2820,14 +2833,21 @@ static int commit_match(struct commit *commit, struct rev_info *opt)
format_display_notes(commit->object.sha1, &buf, encoding, 1);
}
- /* Find either in the original commit message, or in the temporary */
+ /*
+ * Find either in the original commit message, or in the temporary.
+ * Note that we cast away the constness of "message" here. It is
+ * const because it may come from the cached commit buffer. That's OK,
+ * because we know that it is modifiable heap memory, and that while
+ * grep_buffer may modify it for speed, it will restore any
+ * changes before returning.
+ */
if (buf.len)
retval = grep_buffer(&opt->grep_filter, buf.buf, buf.len);
else
retval = grep_buffer(&opt->grep_filter,
- message, strlen(message));
+ (char *)message, strlen(message));
strbuf_release(&buf);
- logmsg_free(message, commit);
+ unuse_commit_buffer(commit, message);
return retval;
}
@@ -2902,6 +2922,27 @@ enum commit_action simplify_commit(struct rev_info *revs, struct commit *commit)
return action;
}
+static void track_linear(struct rev_info *revs, struct commit *commit)
+{
+ if (revs->track_first_time) {
+ revs->linear = 1;
+ revs->track_first_time = 0;
+ } else {
+ struct commit_list *p;
+ for (p = revs->previous_parents; p; p = p->next)
+ if (p->item == NULL || /* first commit */
+ !hashcmp(p->item->object.sha1, commit->object.sha1))
+ break;
+ revs->linear = p != NULL;
+ }
+ if (revs->reverse) {
+ if (revs->linear)
+ commit->object.flags |= TRACK_LINEAR;
+ }
+ free_commit_list(revs->previous_parents);
+ revs->previous_parents = copy_commit_list(commit->parents);
+}
+
static struct commit *get_revision_1(struct rev_info *revs)
{
if (!revs->commits)
@@ -2929,9 +2970,11 @@ static struct commit *get_revision_1(struct rev_info *revs)
if (revs->max_age != -1 &&
(commit->date < revs->max_age))
continue;
- if (add_parents_to_list(revs, commit, &revs->commits, NULL) < 0)
- die("Failed to traverse parents of commit %s",
- sha1_to_hex(commit->object.sha1));
+ if (add_parents_to_list(revs, commit, &revs->commits, NULL) < 0) {
+ if (!revs->ignore_missing_links)
+ die("Failed to traverse parents of commit %s",
+ sha1_to_hex(commit->object.sha1));
+ }
}
switch (simplify_commit(revs, commit)) {
@@ -2941,6 +2984,8 @@ static struct commit *get_revision_1(struct rev_info *revs)
die("Failed to simplify parents of commit %s",
sha1_to_hex(commit->object.sha1));
default:
+ if (revs->track_linear)
+ track_linear(revs, commit);
return commit;
}
} while (revs->commits);
@@ -3107,14 +3152,23 @@ struct commit *get_revision(struct rev_info *revs)
revs->reverse_output_stage = 1;
}
- if (revs->reverse_output_stage)
- return pop_commit(&revs->commits);
+ if (revs->reverse_output_stage) {
+ c = pop_commit(&revs->commits);
+ if (revs->track_linear)
+ revs->linear = !!(c && c->object.flags & TRACK_LINEAR);
+ return c;
+ }
c = get_revision_internal(revs);
if (c && revs->graph)
graph_update(revs->graph, c);
- if (!c)
+ if (!c) {
free_saved_parents(revs);
+ if (revs->previous_parents) {
+ free_commit_list(revs->previous_parents);
+ revs->previous_parents = NULL;
+ }
+ }
return c;
}
diff --git a/revision.h b/revision.h
index 88967d6a24..a6205307cf 100644
--- a/revision.h
+++ b/revision.h
@@ -7,6 +7,7 @@
#include "commit.h"
#include "diff.h"
+/* Remember to update object flag allocation in object.h */
#define SEEN (1u<<0)
#define UNINTERESTING (1u<<1)
#define TREESAME (1u<<2)
@@ -18,7 +19,8 @@
#define SYMMETRIC_LEFT (1u<<8)
#define PATCHSAME (1u<<9)
#define BOTTOM (1u<<10)
-#define ALL_REV_FLAGS ((1u<<11)-1)
+#define TRACK_LINEAR (1u<<26)
+#define ALL_REV_FLAGS (((1u<<11)-1) | TRACK_LINEAR)
#define DECORATE_SHORT_REFS 1
#define DECORATE_FULL_REFS 2
@@ -73,7 +75,8 @@ struct rev_info {
enum rev_sort_order sort_order;
unsigned int early_output:1,
- ignore_missing:1;
+ ignore_missing:1,
+ ignore_missing_links:1;
/* Traversal flags */
unsigned int dense:1,
@@ -137,6 +140,10 @@ struct rev_info {
preserve_subject:1;
unsigned int disable_stdin:1;
unsigned int leak_pending:1;
+ /* --show-linear-break */
+ unsigned int track_linear:1,
+ track_first_time:1,
+ linear:1;
enum date_mode date_mode;
@@ -172,6 +179,8 @@ struct rev_info {
unsigned long min_age;
int min_parents;
int max_parents;
+ int (*include_check)(struct commit *, void *);
+ void *include_check_data;
/* diff info for patches and for paths limiting */
struct diff_options diffopt;
@@ -195,6 +204,9 @@ struct rev_info {
/* copies of the parent lists, for --full-diff display */
struct saved_parents *saved_parents_slab;
+
+ struct commit_list *previous_parents;
+ const char *break_bar;
};
extern int ref_excluded(struct string_list *, const char *path);
diff --git a/sequencer.c b/sequencer.c
index 90cac7b02e..bbaddcb05a 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -116,39 +116,23 @@ static const char *action_name(const struct replay_opts *opts)
return opts->action == REPLAY_REVERT ? "revert" : "cherry-pick";
}
-static char *get_encoding(const char *message);
-
struct commit_message {
char *parent_label;
const char *label;
const char *subject;
- char *reencoded_message;
const char *message;
};
static int get_message(struct commit *commit, struct commit_message *out)
{
- const char *encoding;
const char *abbrev, *subject;
int abbrev_len, subject_len;
char *q;
- if (!commit->buffer)
- return -1;
- encoding = get_encoding(commit->buffer);
- if (!encoding)
- encoding = "UTF-8";
if (!git_commit_encoding)
git_commit_encoding = "UTF-8";
- out->reencoded_message = NULL;
- out->message = commit->buffer;
- if (same_encoding(encoding, git_commit_encoding))
- out->reencoded_message = reencode_string(commit->buffer,
- git_commit_encoding, encoding);
- if (out->reencoded_message)
- out->message = out->reencoded_message;
-
+ out->message = logmsg_reencode(commit, NULL, git_commit_encoding);
abbrev = find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV);
abbrev_len = strlen(abbrev);
@@ -167,29 +151,10 @@ static int get_message(struct commit *commit, struct commit_message *out)
return 0;
}
-static void free_message(struct commit_message *msg)
+static void free_message(struct commit *commit, struct commit_message *msg)
{
free(msg->parent_label);
- free(msg->reencoded_message);
-}
-
-static char *get_encoding(const char *message)
-{
- const char *p = message, *eol;
-
- while (*p && *p != '\n') {
- for (eol = p + 1; *eol && *eol != '\n'; eol++)
- ; /* do nothing */
- if (starts_with(p, "encoding ")) {
- char *result = xmalloc(eol - 8 - p);
- strlcpy(result, p + 9, eol - 8 - p);
- return result;
- }
- p = eol;
- if (*p == '\n')
- p++;
- }
- return NULL;
+ unuse_commit_buffer(commit, msg->message);
}
static void write_cherry_pick_head(struct commit *commit, const char *pseudoref)
@@ -392,11 +357,18 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts,
{
struct argv_array array;
int rc;
+ char *gpg_sign;
argv_array_init(&array);
argv_array_push(&array, "commit");
argv_array_push(&array, "-n");
+ if (opts->gpg_sign) {
+ gpg_sign = xmalloc(3 + strlen(opts->gpg_sign));
+ sprintf(gpg_sign, "-S%s", opts->gpg_sign);
+ argv_array_push(&array, gpg_sign);
+ free(gpg_sign);
+ }
if (opts->signoff)
argv_array_push(&array, "-s");
if (!opts->edit) {
@@ -478,7 +450,7 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
unsigned char head[20];
struct commit *base, *next, *parent;
const char *base_label, *next_label;
- struct commit_message msg = { NULL, NULL, NULL, NULL, NULL };
+ struct commit_message msg = { NULL, NULL, NULL, NULL };
char *defmsg = NULL;
struct strbuf msgbuf = STRBUF_INIT;
int res, unborn = 0, allow;
@@ -643,7 +615,7 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
res = run_git_commit(defmsg, opts, allow);
leave:
- free_message(&msg);
+ free_message(commit, &msg);
free(defmsg);
return res;
@@ -690,10 +662,12 @@ static int format_todo(struct strbuf *buf, struct commit_list *todo_list,
int subject_len;
for (cur = todo_list; cur; cur = cur->next) {
+ const char *commit_buffer = get_commit_buffer(cur->item, NULL);
sha1_abbrev = find_unique_abbrev(cur->item->object.sha1, DEFAULT_ABBREV);
- subject_len = find_commit_subject(cur->item->buffer, &subject);
+ subject_len = find_commit_subject(commit_buffer, &subject);
strbuf_addf(buf, "%s %s %.*s\n", action_str, sha1_abbrev,
subject_len, subject);
+ unuse_commit_buffer(cur->item, commit_buffer);
}
return 0;
}
@@ -808,6 +782,8 @@ static int populate_opts_cb(const char *key, const char *value, void *data)
opts->mainline = git_config_int(key, value);
else if (!strcmp(key, "options.strategy"))
git_config_string(&opts->strategy, key, value);
+ else if (!strcmp(key, "options.gpg-sign"))
+ git_config_string(&opts->gpg_sign, key, value);
else if (!strcmp(key, "options.strategy-option")) {
ALLOC_GROW(opts->xopts, opts->xopts_nr + 1, opts->xopts_alloc);
opts->xopts[opts->xopts_nr++] = xstrdup(value);
@@ -981,6 +957,8 @@ static void save_opts(struct replay_opts *opts)
}
if (opts->strategy)
git_config_set_in_file(opts_file, "options.strategy", opts->strategy);
+ if (opts->gpg_sign)
+ git_config_set_in_file(opts_file, "options.gpg-sign", opts->gpg_sign);
if (opts->xopts) {
int i;
for (i = 0; i < opts->xopts_nr; i++)
diff --git a/sequencer.h b/sequencer.h
index 1fc22dcabe..db43e9cf86 100644
--- a/sequencer.h
+++ b/sequencer.h
@@ -37,6 +37,8 @@ struct replay_opts {
int mainline;
+ const char *gpg_sign;
+
/* Merge strategy */
const char *strategy;
const char **xopts;
diff --git a/setup.c b/setup.c
index 5e55306083..0a22f8bd1d 100644
--- a/setup.c
+++ b/setup.c
@@ -841,3 +841,27 @@ void sanitize_stdfds(void)
if (fd > 2)
close(fd);
}
+
+int daemonize(void)
+{
+#ifdef NO_POSIX_GOODIES
+ errno = ENOSYS;
+ return -1;
+#else
+ switch (fork()) {
+ case 0:
+ break;
+ case -1:
+ die_errno("fork failed");
+ default:
+ exit(0);
+ }
+ if (setsid() == -1)
+ die_errno("setsid failed");
+ close(0);
+ close(1);
+ close(2);
+ sanitize_stdfds();
+ return 0;
+#endif
+}
diff --git a/sh-i18n--envsubst.c b/sh-i18n--envsubst.c
index 5ddd6886c8..6dd03a974a 100644
--- a/sh-i18n--envsubst.c
+++ b/sh-i18n--envsubst.c
@@ -237,18 +237,6 @@ string_list_sort (string_list_ty *slp)
qsort (slp->item, slp->nitems, sizeof (slp->item[0]), cmp_string);
}
-/* Test whether a string list contains a given string. */
-static inline int
-string_list_member (const string_list_ty *slp, const char *s)
-{
- size_t j;
-
- for (j = 0; j < slp->nitems; ++j)
- if (strcmp (slp->item[j], s) == 0)
- return 1;
- return 0;
-}
-
/* Test whether a sorted string list contains a given string. */
static int
sorted_string_list_member (const string_list_ty *slp, const char *s)
@@ -290,9 +278,7 @@ static string_list_ty variables_set;
static void
note_variable (const char *var_ptr, size_t var_len)
{
- char *string = xmalloc (var_len + 1);
- memcpy (string, var_ptr, var_len);
- string[var_len] = '\0';
+ char *string = xmemdupz (var_ptr, var_len);
string_list_append (&variables_set, string);
}
diff --git a/sha1_file.c b/sha1_file.c
index 77dbb56946..a38854ce55 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -60,6 +60,12 @@ static struct cached_object empty_tree = {
0
};
+/*
+ * A pointer to the last packed_git in which an object was found.
+ * When an object is sought, we look in this packfile first, because
+ * objects that are looked up at similar times are often in the same
+ * packfile as one another.
+ */
static struct packed_git *last_found_pack;
static struct cached_object *find_cached_object(const unsigned char *sha1)
@@ -178,17 +184,7 @@ static void fill_sha1_path(char *pathbuf, const unsigned char *sha1)
}
}
-/*
- * NOTE! This returns a statically allocated buffer, so you have to be
- * careful about using it. Do an "xstrdup()" if you need to save the
- * filename.
- *
- * Also note that this returns the location for creating. Reading
- * SHA1 file can happen from any alternate directory listed in the
- * DB_ENVIRONMENT environment variable if it is not found in
- * the primary object database.
- */
-char *sha1_file_name(const unsigned char *sha1)
+const char *sha1_file_name(const unsigned char *sha1)
{
static char buf[PATH_MAX];
const char *objdir;
@@ -208,6 +204,11 @@ char *sha1_file_name(const unsigned char *sha1)
return buf;
}
+/*
+ * Return the name of the pack or index file with the specified sha1
+ * in its filename. *base and *name are scratch space that must be
+ * provided by the caller. which should be "pack" or "idx".
+ */
static char *sha1_get_pack_name(const unsigned char *sha1,
char **name, char **base, const char *which)
{
@@ -252,8 +253,6 @@ char *sha1_pack_index_name(const unsigned char *sha1)
struct alternate_object_database *alt_odb_list;
static struct alternate_object_database **alt_odb_tail;
-static int git_open_noatime(const char *name);
-
/*
* Prepare alternate object database registry.
*
@@ -316,7 +315,8 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base, int
* thing twice, or object directory itself.
*/
for (alt = alt_odb_list; alt; alt = alt->next) {
- if (!memcmp(ent->base, alt->base, pfxlen)) {
+ if (pfxlen == alt->name - alt->base - 1 &&
+ !memcmp(ent->base, alt->base, pfxlen)) {
free(ent);
return -1;
}
@@ -438,8 +438,7 @@ void prepare_alt_odb(void)
static int has_loose_object_local(const unsigned char *sha1)
{
- char *name = sha1_file_name(sha1);
- return !access(name, F_OK);
+ return !access(sha1_file_name(sha1), F_OK);
}
int has_loose_object_nonlocal(const unsigned char *sha1)
@@ -491,7 +490,12 @@ void pack_report(void)
sz_fmt(pack_mapped), sz_fmt(peak_pack_mapped));
}
-static int check_packed_git_idx(const char *path, struct packed_git *p)
+/*
+ * Open and mmap the index file at path, perform a couple of
+ * consistency checks, then record its information to p. Return 0 on
+ * success.
+ */
+static int check_packed_git_idx(const char *path, struct packed_git *p)
{
void *idx_map;
struct pack_idx_header *hdr;
@@ -1232,6 +1236,7 @@ static void prepare_packed_git_one(char *objdir, int local)
if (has_extension(de->d_name, ".idx") ||
has_extension(de->d_name, ".pack") ||
+ has_extension(de->d_name, ".bitmap") ||
has_extension(de->d_name, ".keep"))
string_list_append(&garbage, path);
else
@@ -1316,7 +1321,6 @@ void prepare_packed_git(void)
void reprepare_packed_git(void)
{
- discard_revindex();
prepare_packed_git_run_once = 0;
prepare_packed_git();
}
@@ -1393,7 +1397,7 @@ int check_sha1_signature(const unsigned char *sha1, void *map,
return hashcmp(sha1, real_sha1) ? -1 : 0;
}
-static int git_open_noatime(const char *name)
+int git_open_noatime(const char *name)
{
static int sha1_file_open_flag = O_NOATIME;
@@ -1414,17 +1418,15 @@ static int git_open_noatime(const char *name)
static int stat_sha1_file(const unsigned char *sha1, struct stat *st)
{
- char *name = sha1_file_name(sha1);
struct alternate_object_database *alt;
- if (!lstat(name, st))
+ if (!lstat(sha1_file_name(sha1), st))
return 0;
prepare_alt_odb();
errno = ENOENT;
for (alt = alt_odb_list; alt; alt = alt->next) {
- name = alt->name;
- fill_sha1_path(name, sha1);
+ fill_sha1_path(alt->name, sha1);
if (!lstat(alt->base, st))
return 0;
}
@@ -1435,22 +1437,24 @@ static int stat_sha1_file(const unsigned char *sha1, struct stat *st)
static int open_sha1_file(const unsigned char *sha1)
{
int fd;
- char *name = sha1_file_name(sha1);
struct alternate_object_database *alt;
+ int most_interesting_errno;
- fd = git_open_noatime(name);
+ fd = git_open_noatime(sha1_file_name(sha1));
if (fd >= 0)
return fd;
+ most_interesting_errno = errno;
prepare_alt_odb();
- errno = ENOENT;
for (alt = alt_odb_list; alt; alt = alt->next) {
- name = alt->name;
- fill_sha1_path(name, sha1);
+ fill_sha1_path(alt->name, sha1);
fd = git_open_noatime(alt->base);
if (fd >= 0)
return fd;
+ if (most_interesting_errno == ENOENT)
+ most_interesting_errno = errno;
}
+ errno = most_interesting_errno;
return -1;
}
@@ -2289,6 +2293,10 @@ void *unpack_entry(struct packed_git *p, off_t obj_offset,
*final_size = size;
unuse_pack(&w_curs);
+
+ if (delta_stack != small_delta_stack)
+ free(delta_stack);
+
return data;
}
@@ -2448,6 +2456,10 @@ static int fill_pack_entry(const unsigned char *sha1,
return 1;
}
+/*
+ * Iff a pack file contains the object named by sha1, return true and
+ * store its location to e.
+ */
static int find_pack_entry(const unsigned char *sha1, struct pack_entry *e)
{
struct packed_git *p;
@@ -2460,11 +2472,13 @@ static int find_pack_entry(const unsigned char *sha1, struct pack_entry *e)
return 1;
for (p = packed_git; p; p = p->next) {
- if (p == last_found_pack || !fill_pack_entry(sha1, e, p))
- continue;
+ if (p == last_found_pack)
+ continue; /* we already checked this one */
- last_found_pack = p;
- return 1;
+ if (fill_pack_entry(sha1, e, p)) {
+ last_found_pack = p;
+ return 1;
+ }
}
return 0;
}
@@ -2626,12 +2640,7 @@ int pretend_sha1_file(void *buf, unsigned long len, enum object_type type,
hash_sha1_file(buf, len, typename(type), sha1);
if (has_sha1_file(sha1) || find_cached_object(sha1))
return 0;
- if (cached_object_alloc <= cached_object_nr) {
- cached_object_alloc = alloc_nr(cached_object_alloc);
- cached_objects = xrealloc(cached_objects,
- sizeof(*cached_objects) *
- cached_object_alloc);
- }
+ ALLOC_GROW(cached_objects, cached_object_nr + 1, cached_object_alloc);
co = &cached_objects[cached_object_nr++];
co->size = len;
co->type = type;
@@ -2679,7 +2688,6 @@ void *read_sha1_file_extended(const unsigned char *sha1,
unsigned flag)
{
void *data;
- char *path;
const struct packed_git *p;
const unsigned char *repl = lookup_replace_object_extended(sha1, flag);
@@ -2697,7 +2705,8 @@ void *read_sha1_file_extended(const unsigned char *sha1,
sha1_to_hex(repl), sha1_to_hex(sha1));
if (has_loose_object(repl)) {
- path = sha1_file_name(sha1);
+ const char *path = sha1_file_name(sha1);
+
die("loose object %s (stored in %s) is corrupt",
sha1_to_hex(repl), path);
}
@@ -2895,10 +2904,9 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen,
git_zstream stream;
git_SHA_CTX c;
unsigned char parano_sha1[20];
- char *filename;
static char tmp_file[PATH_MAX];
+ const char *filename = sha1_file_name(sha1);
- filename = sha1_file_name(sha1);
fd = create_tmpfile(tmp_file, sizeof(tmp_file), filename);
if (fd < 0) {
if (errno == EACCES)
diff --git a/sha1_name.c b/sha1_name.c
index 6fca8692d2..c2c938c4e1 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -819,6 +819,8 @@ static int get_sha1_1(const char *name, int len, unsigned char *sha1, unsigned l
* For future extension, ':/!' is reserved. If you want to match a message
* beginning with a '!', you have to repeat the exclamation mark.
*/
+
+/* Remember to update object flag allocation in object.h */
#define ONELINE_SEEN (1u<<20)
static int handle_one_ref(const char *path,
@@ -860,27 +862,17 @@ static int get_sha1_oneline(const char *prefix, unsigned char *sha1,
commit_list_insert(l->item, &backup);
}
while (list) {
- char *p, *to_free = NULL;
+ const char *p, *buf;
struct commit *commit;
- enum object_type type;
- unsigned long size;
int matches;
commit = pop_most_recent_commit(&list, ONELINE_SEEN);
if (!parse_object(commit->object.sha1))
continue;
- if (commit->buffer)
- p = commit->buffer;
- else {
- p = read_sha1_file(commit->object.sha1, &type, &size);
- if (!p)
- continue;
- to_free = p;
- }
-
- p = strstr(p, "\n\n");
+ buf = get_commit_buffer(commit, NULL);
+ p = strstr(buf, "\n\n");
matches = p && !regexec(&regex, p + 2, 0, NULL, 0);
- free(to_free);
+ unuse_commit_buffer(commit, buf);
if (matches) {
hashcpy(sha1, commit->object.sha1);
diff --git a/sideband.c b/sideband.c
index d1125f5c52..7f9dc229fb 100644
--- a/sideband.c
+++ b/sideband.c
@@ -30,7 +30,7 @@ int recv_sideband(const char *me, int in_stream, int out)
memcpy(buf, PREFIX, pf);
term = getenv("TERM");
- if (term && strcmp(term, "dumb"))
+ if (isatty(2) && term && strcmp(term, "dumb"))
suffix = ANSI_SUFFIX;
else
suffix = DUMB_SUFFIX;
diff --git a/strbuf.c b/strbuf.c
index 83caf4a914..ee96dcfb81 100644
--- a/strbuf.c
+++ b/strbuf.c
@@ -10,15 +10,6 @@ int starts_with(const char *str, const char *prefix)
return 0;
}
-int prefixcmp(const char *str, const char *prefix)
-{
- for (; ; str++, prefix++)
- if (!*prefix)
- return 0;
- else if (*str != *prefix)
- return (unsigned char)*prefix - (unsigned char)*str;
-}
-
int ends_with(const char *str, const char *suffix)
{
int len = strlen(str), suflen = strlen(suffix);
@@ -28,15 +19,6 @@ int ends_with(const char *str, const char *suffix)
return !strcmp(str + len - suflen, suffix);
}
-int suffixcmp(const char *str, const char *suffix)
-{
- int len = strlen(str), suflen = strlen(suffix);
- if (len < suflen)
- return -1;
- else
- return strcmp(str + len - suflen, suffix);
-}
-
/*
* Used as the default ->buf value, so that people can always assume
* buf is non NULL and ->buf is NUL terminated even for a freshly
diff --git a/strbuf.h b/strbuf.h
index 73e80cea69..39c14cfa38 100644
--- a/strbuf.h
+++ b/strbuf.h
@@ -17,20 +17,23 @@ extern void strbuf_init(struct strbuf *, size_t);
extern void strbuf_release(struct strbuf *);
extern char *strbuf_detach(struct strbuf *, size_t *);
extern void strbuf_attach(struct strbuf *, void *, size_t, size_t);
-static inline void strbuf_swap(struct strbuf *a, struct strbuf *b) {
+static inline void strbuf_swap(struct strbuf *a, struct strbuf *b)
+{
struct strbuf tmp = *a;
*a = *b;
*b = tmp;
}
/*----- strbuf size related -----*/
-static inline size_t strbuf_avail(const struct strbuf *sb) {
+static inline size_t strbuf_avail(const struct strbuf *sb)
+{
return sb->alloc ? sb->alloc - sb->len - 1 : 0;
}
extern void strbuf_grow(struct strbuf *, size_t);
-static inline void strbuf_setlen(struct strbuf *sb, size_t len) {
+static inline void strbuf_setlen(struct strbuf *sb, size_t len)
+{
if (len > (sb->alloc ? sb->alloc - 1 : 0))
die("BUG: strbuf_setlen() beyond buffer");
sb->len = len;
@@ -97,7 +100,8 @@ static inline struct strbuf **strbuf_split(const struct strbuf *sb,
extern void strbuf_list_free(struct strbuf **);
/*----- add data in your buffer -----*/
-static inline void strbuf_addch(struct strbuf *sb, int c) {
+static inline void strbuf_addch(struct strbuf *sb, int c)
+{
strbuf_grow(sb, 1);
sb->buf[sb->len++] = c;
sb->buf[sb->len] = '\0';
@@ -113,10 +117,12 @@ extern void strbuf_splice(struct strbuf *, size_t pos, size_t len,
extern void strbuf_add_commented_lines(struct strbuf *out, const char *buf, size_t size);
extern void strbuf_add(struct strbuf *, const void *, size_t);
-static inline void strbuf_addstr(struct strbuf *sb, const char *s) {
+static inline void strbuf_addstr(struct strbuf *sb, const char *s)
+{
strbuf_add(sb, s, strlen(s));
}
-static inline void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2) {
+static inline void strbuf_addbuf(struct strbuf *sb, const struct strbuf *sb2)
+{
strbuf_grow(sb, sb2->len);
strbuf_add(sb, sb2->buf, sb2->len);
}
diff --git a/streaming.c b/streaming.c
index d7c9f32f0c..2ff036a0fa 100644
--- a/streaming.c
+++ b/streaming.c
@@ -152,8 +152,10 @@ struct git_istream *open_istream(const unsigned char *sha1,
if (filter) {
/* Add "&& !is_null_stream_filter(filter)" for performance */
struct git_istream *nst = attach_stream_filter(st, filter);
- if (!nst)
+ if (!nst) {
close_istream(st);
+ return NULL;
+ }
st = nst;
}
diff --git a/submodule.c b/submodule.c
index 613857e400..b80ecacf60 100644
--- a/submodule.c
+++ b/submodule.c
@@ -116,30 +116,7 @@ int remove_path_from_gitmodules(const char *path)
void stage_updated_gitmodules(void)
{
- struct strbuf buf = STRBUF_INIT;
- struct stat st;
- int pos;
- struct cache_entry *ce;
- int namelen = strlen(".gitmodules");
-
- pos = cache_name_pos(".gitmodules", namelen);
- if (pos < 0) {
- warning(_("could not find .gitmodules in index"));
- return;
- }
- ce = active_cache[pos];
- ce->ce_flags = namelen;
- if (strbuf_read_file(&buf, ".gitmodules", 0) < 0)
- die(_("reading updated .gitmodules failed"));
- if (lstat(".gitmodules", &st) < 0)
- die_errno(_("unable to stat updated .gitmodules"));
- fill_stat_cache_info(ce, &st);
- ce->ce_mode = ce_mode_from_stat(ce, st.st_mode);
- if (remove_cache_entry_at(pos) < 0)
- die(_("unable to remove .gitmodules from index"));
- if (write_sha1_file(buf.buf, buf.len, blob_type, ce->sha1))
- die(_("adding updated .gitmodules failed"));
- if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE))
+ if (add_file_to_cache(".gitmodules", 0))
die(_("staging updated .gitmodules failed"));
}
diff --git a/t/Makefile b/t/Makefile
index 2373a04f7a..8fd1a72357 100644
--- a/t/Makefile
+++ b/t/Makefile
@@ -36,11 +36,11 @@ test: pre-clean $(TEST_LINT)
$(MAKE) aggregate-results-and-cleanup
prove: pre-clean $(TEST_LINT)
- @echo "*** prove ***"; GIT_CONFIG=.git/config $(PROVE) --exec '$(SHELL_PATH_SQ)' $(GIT_PROVE_OPTS) $(T) :: $(GIT_TEST_OPTS)
+ @echo "*** prove ***"; $(PROVE) --exec '$(SHELL_PATH_SQ)' $(GIT_PROVE_OPTS) $(T) :: $(GIT_TEST_OPTS)
$(MAKE) clean-except-prove-cache
$(T):
- @echo "*** $@ ***"; GIT_CONFIG=.git/config '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
+ @echo "*** $@ ***"; '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
pre-clean:
$(RM) -r '$(TEST_RESULTS_DIRECTORY_SQ)'
diff --git a/t/lib-git-daemon.sh b/t/lib-git-daemon.sh
index 394b06b32f..bc4b3412fb 100644
--- a/t/lib-git-daemon.sh
+++ b/t/lib-git-daemon.sh
@@ -16,13 +16,14 @@
# stop_git_daemon
# test_done
-if test -z "$GIT_TEST_GIT_DAEMON"
+test_tristate GIT_TEST_GIT_DAEMON
+if test "$GIT_TEST_GIT_DAEMON" = false
then
- skip_all="git-daemon testing disabled (define GIT_TEST_GIT_DAEMON to enable)"
+ skip_all="git-daemon testing disabled (unset GIT_TEST_GIT_DAEMON to enable)"
test_done
fi
-LIB_GIT_DAEMON_PORT=${LIB_GIT_DAEMON_PORT-'8121'}
+LIB_GIT_DAEMON_PORT=${LIB_GIT_DAEMON_PORT-${this_test#t}}
GIT_DAEMON_PID=
GIT_DAEMON_DOCUMENT_ROOT_PATH="$PWD"/repo
@@ -58,7 +59,8 @@ start_git_daemon() {
kill "$GIT_DAEMON_PID"
wait "$GIT_DAEMON_PID"
trap 'die' EXIT
- error "git daemon failed to start"
+ test_skip_or_die $GIT_TEST_GIT_DAEMON \
+ "git daemon failed to start"
fi
}
diff --git a/t/lib-httpd.sh b/t/lib-httpd.sh
index b43162ea2a..252cbf163b 100644
--- a/t/lib-httpd.sh
+++ b/t/lib-httpd.sh
@@ -30,9 +30,10 @@
# Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at>
#
-if test -z "$GIT_TEST_HTTPD"
+test_tristate GIT_TEST_HTTPD
+if test "$GIT_TEST_HTTPD" = false
then
- skip_all="Network testing disabled (define GIT_TEST_HTTPD to enable)"
+ skip_all="Network testing disabled (unset GIT_TEST_HTTPD to enable)"
test_done
fi
@@ -76,8 +77,7 @@ GIT_VALGRIND_OPTIONS=$GIT_VALGRIND_OPTIONS; export GIT_VALGRIND_OPTIONS
if ! test -x "$LIB_HTTPD_PATH"
then
- skip_all="skipping test, no web server found at '$LIB_HTTPD_PATH'"
- test_done
+ test_skip_or_die $GIT_TEST_HTTPD "no web server found at '$LIB_HTTPD_PATH'"
fi
HTTPD_VERSION=`$LIB_HTTPD_PATH -v | \
@@ -89,19 +89,20 @@ then
then
if ! test $HTTPD_VERSION -ge 2
then
- skip_all="skipping test, at least Apache version 2 is required"
- test_done
+ test_skip_or_die $GIT_TEST_HTTPD \
+ "at least Apache version 2 is required"
fi
if ! test -d "$DEFAULT_HTTPD_MODULE_PATH"
then
- skip_all="Apache module directory not found. Skipping tests."
- test_done
+ test_skip_or_die $GIT_TEST_HTTPD \
+ "Apache module directory not found"
fi
LIB_HTTPD_MODULE_PATH="$DEFAULT_HTTPD_MODULE_PATH"
fi
else
- error "Could not identify web server at '$LIB_HTTPD_PATH'"
+ test_skip_or_die $GIT_TEST_HTTPD \
+ "Could not identify web server at '$LIB_HTTPD_PATH'"
fi
prepare_httpd() {
@@ -155,9 +156,8 @@ start_httpd() {
>&3 2>&4
if test $? -ne 0
then
- skip_all="skipping test, web server setup failed"
trap 'die' EXIT
- test_done
+ test_skip_or_die $GIT_TEST_HTTPD "web server setup failed"
fi
}
diff --git a/t/perf/p5310-pack-bitmaps.sh b/t/perf/p5310-pack-bitmaps.sh
new file mode 100755
index 0000000000..685d46f8b7
--- /dev/null
+++ b/t/perf/p5310-pack-bitmaps.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+
+test_description='Tests pack performance using bitmaps'
+. ./perf-lib.sh
+
+test_perf_large_repo
+
+# note that we do everything through config,
+# since we want to be able to compare bitmap-aware
+# git versus non-bitmap git
+test_expect_success 'setup bitmap config' '
+ git config pack.writebitmaps true &&
+ git config pack.writebitmaphashcache true
+'
+
+test_perf 'repack to disk' '
+ git repack -ad
+'
+
+test_perf 'simulated clone' '
+ git pack-objects --stdout --all </dev/null >/dev/null
+'
+
+test_perf 'simulated fetch' '
+ have=$(git rev-list HEAD~100 -1) &&
+ {
+ echo HEAD &&
+ echo ^$have
+ } | git pack-objects --revs --stdout >/dev/null
+'
+
+test_expect_success 'create partial bitmap state' '
+ # pick a commit to represent the repo tip in the past
+ cutoff=$(git rev-list HEAD~100 -1) &&
+ orig_tip=$(git rev-parse HEAD) &&
+
+ # now kill off all of the refs and pretend we had
+ # just the one tip
+ rm -rf .git/logs .git/refs/* .git/packed-refs
+ git update-ref HEAD $cutoff
+
+ # and then repack, which will leave us with a nice
+ # big bitmap pack of the "old" history, and all of
+ # the new history will be loose, as if it had been pushed
+ # up incrementally and exploded via unpack-objects
+ git repack -Ad
+
+ # and now restore our original tip, as if the pushes
+ # had happened
+ git update-ref HEAD $orig_tip
+'
+
+test_perf 'partial bitmap' '
+ git pack-objects --stdout --all </dev/null >/dev/null
+'
+
+test_done
diff --git a/t/t0001-init.sh b/t/t0001-init.sh
index 9fb582b192..bbc9cb60dd 100755
--- a/t/t0001-init.sh
+++ b/t/t0001-init.sh
@@ -12,8 +12,8 @@ check_config () {
echo "expected a directory $1, a file $1/config and $1/refs"
return 1
fi
- bare=$(GIT_CONFIG="$1/config" git config --bool core.bare)
- worktree=$(GIT_CONFIG="$1/config" git config core.worktree) ||
+ bare=$(cd "$1" && git config --bool core.bare)
+ worktree=$(cd "$1" && git config core.worktree) ||
worktree=unset
test "$bare" = "$2" && test "$worktree" = "$3" || {
@@ -24,18 +24,12 @@ check_config () {
}
test_expect_success 'plain' '
- (
- sane_unset GIT_DIR GIT_WORK_TREE &&
- mkdir plain &&
- cd plain &&
- git init
- ) &&
+ git init plain &&
check_config plain/.git false unset
'
test_expect_success 'plain nested in bare' '
(
- sane_unset GIT_DIR GIT_WORK_TREE &&
git init --bare bare-ancestor.git &&
cd bare-ancestor.git &&
mkdir plain-nested &&
@@ -47,7 +41,6 @@ test_expect_success 'plain nested in bare' '
test_expect_success 'plain through aliased command, outside any git repo' '
(
- sane_unset GIT_DIR GIT_WORK_TREE &&
HOME=$(pwd)/alias-config &&
export HOME &&
mkdir alias-config &&
@@ -65,7 +58,6 @@ test_expect_success 'plain through aliased command, outside any git repo' '
test_expect_failure 'plain nested through aliased command' '
(
- sane_unset GIT_DIR GIT_WORK_TREE &&
git init plain-ancestor-aliased &&
cd plain-ancestor-aliased &&
echo "[alias] aliasedinit = init" >>.git/config &&
@@ -78,7 +70,6 @@ test_expect_failure 'plain nested through aliased command' '
test_expect_failure 'plain nested in bare through aliased command' '
(
- sane_unset GIT_DIR GIT_WORK_TREE &&
git init --bare bare-ancestor-aliased.git &&
cd bare-ancestor-aliased.git &&
echo "[alias] aliasedinit = init" >>config &&
@@ -90,66 +81,36 @@ test_expect_failure 'plain nested in bare through aliased command' '
'
test_expect_success 'plain with GIT_WORK_TREE' '
- if (
- sane_unset GIT_DIR &&
- mkdir plain-wt &&
- cd plain-wt &&
- GIT_WORK_TREE=$(pwd) git init
- )
- then
- echo Should have failed -- GIT_WORK_TREE should not be used
- false
- fi
+ mkdir plain-wt &&
+ test_must_fail env GIT_WORK_TREE="$(pwd)/plain-wt" git init plain-wt
'
test_expect_success 'plain bare' '
- (
- sane_unset GIT_DIR GIT_WORK_TREE GIT_CONFIG &&
- mkdir plain-bare-1 &&
- cd plain-bare-1 &&
- git --bare init
- ) &&
+ git --bare init plain-bare-1 &&
check_config plain-bare-1 true unset
'
test_expect_success 'plain bare with GIT_WORK_TREE' '
- if (
- sane_unset GIT_DIR GIT_CONFIG &&
- mkdir plain-bare-2 &&
- cd plain-bare-2 &&
- GIT_WORK_TREE=$(pwd) git --bare init
- )
- then
- echo Should have failed -- GIT_WORK_TREE should not be used
- false
- fi
+ mkdir plain-bare-2 &&
+ test_must_fail \
+ env GIT_WORK_TREE="$(pwd)/plain-bare-2" \
+ git --bare init plain-bare-2
'
test_expect_success 'GIT_DIR bare' '
-
- (
- sane_unset GIT_CONFIG &&
- mkdir git-dir-bare.git &&
- GIT_DIR=git-dir-bare.git git init
- ) &&
+ mkdir git-dir-bare.git &&
+ GIT_DIR=git-dir-bare.git git init &&
check_config git-dir-bare.git true unset
'
test_expect_success 'init --bare' '
-
- (
- sane_unset GIT_DIR GIT_WORK_TREE GIT_CONFIG &&
- mkdir init-bare.git &&
- cd init-bare.git &&
- git init --bare
- ) &&
+ git init --bare init-bare.git &&
check_config init-bare.git true unset
'
test_expect_success 'GIT_DIR non-bare' '
(
- sane_unset GIT_CONFIG &&
mkdir non-bare &&
cd non-bare &&
GIT_DIR=.git git init
@@ -160,7 +121,6 @@ test_expect_success 'GIT_DIR non-bare' '
test_expect_success 'GIT_DIR & GIT_WORK_TREE (1)' '
(
- sane_unset GIT_CONFIG &&
mkdir git-dir-wt-1.git &&
GIT_WORK_TREE=$(pwd) GIT_DIR=git-dir-wt-1.git git init
) &&
@@ -168,23 +128,16 @@ test_expect_success 'GIT_DIR & GIT_WORK_TREE (1)' '
'
test_expect_success 'GIT_DIR & GIT_WORK_TREE (2)' '
-
- if (
- sane_unset GIT_CONFIG &&
- mkdir git-dir-wt-2.git &&
- GIT_WORK_TREE=$(pwd) GIT_DIR=git-dir-wt-2.git git --bare init
- )
- then
- echo Should have failed -- --bare should not be used
- false
- fi
+ mkdir git-dir-wt-2.git &&
+ test_must_fail env \
+ GIT_WORK_TREE="$(pwd)" \
+ GIT_DIR=git-dir-wt-2.git \
+ git --bare init
'
test_expect_success 'reinit' '
(
- sane_unset GIT_CONFIG GIT_WORK_TREE GIT_CONFIG &&
-
mkdir again &&
cd again &&
git init >out1 2>err1 &&
@@ -200,35 +153,22 @@ test_expect_success 'reinit' '
test_expect_success 'init with --template' '
mkdir template-source &&
echo content >template-source/file &&
- (
- mkdir template-custom &&
- cd template-custom &&
- git init --template=../template-source
- ) &&
+ git init --template=../template-source template-custom &&
test_cmp template-source/file template-custom/.git/file
'
test_expect_success 'init with --template (blank)' '
- (
- mkdir template-plain &&
- cd template-plain &&
- git init
- ) &&
- test -f template-plain/.git/info/exclude &&
- (
- mkdir template-blank &&
- cd template-blank &&
- git init --template=
- ) &&
- ! test -f template-blank/.git/info/exclude
+ git init template-plain &&
+ test_path_is_file template-plain/.git/info/exclude &&
+ git init --template= template-blank &&
+ test_path_is_missing template-blank/.git/info/exclude
'
test_expect_success 'init with init.templatedir set' '
mkdir templatedir-source &&
echo Content >templatedir-source/file &&
+ test_config_global init.templatedir "${HOME}/templatedir-source" &&
(
- test_config="${HOME}/.gitconfig" &&
- git config -f "$test_config" init.templatedir "${HOME}/templatedir-source" &&
mkdir templatedir-set &&
cd templatedir-set &&
sane_unset GIT_TEMPLATE_DIR &&
@@ -240,78 +180,55 @@ test_expect_success 'init with init.templatedir set' '
'
test_expect_success 'init --bare/--shared overrides system/global config' '
- (
- test_config="$HOME"/.gitconfig &&
- git config -f "$test_config" core.bare false &&
- git config -f "$test_config" core.sharedRepository 0640 &&
- mkdir init-bare-shared-override &&
- cd init-bare-shared-override &&
- git init --bare --shared=0666
- ) &&
+ test_config_global core.bare false &&
+ test_config_global core.sharedRepository 0640 &&
+ git init --bare --shared=0666 init-bare-shared-override &&
check_config init-bare-shared-override true unset &&
test x0666 = \
x`git config -f init-bare-shared-override/config core.sharedRepository`
'
test_expect_success 'init honors global core.sharedRepository' '
- (
- test_config="$HOME"/.gitconfig &&
- git config -f "$test_config" core.sharedRepository 0666 &&
- mkdir shared-honor-global &&
- cd shared-honor-global &&
- git init
- ) &&
+ test_config_global core.sharedRepository 0666 &&
+ git init shared-honor-global &&
test x0666 = \
x`git config -f shared-honor-global/.git/config core.sharedRepository`
'
test_expect_success 'init rejects insanely long --template' '
- (
- insane=$(printf "x%09999dx" 1) &&
- mkdir test &&
- cd test &&
- test_must_fail git init --template=$insane
- )
+ test_must_fail git init --template=$(printf "x%09999dx" 1) test
'
test_expect_success 'init creates a new directory' '
rm -fr newdir &&
- (
- git init newdir &&
- test -d newdir/.git/refs
- )
+ git init newdir &&
+ test_path_is_dir newdir/.git/refs
'
test_expect_success 'init creates a new bare directory' '
rm -fr newdir &&
- (
- git init --bare newdir &&
- test -d newdir/refs
- )
+ git init --bare newdir &&
+ test_path_is_dir newdir/refs
'
test_expect_success 'init recreates a directory' '
rm -fr newdir &&
- (
- mkdir newdir &&
- git init newdir &&
- test -d newdir/.git/refs
- )
+ mkdir newdir &&
+ git init newdir &&
+ test_path_is_dir newdir/.git/refs
'
test_expect_success 'init recreates a new bare directory' '
rm -fr newdir &&
- (
- mkdir newdir &&
- git init --bare newdir &&
- test -d newdir/refs
- )
+ mkdir newdir &&
+ git init --bare newdir &&
+ test_path_is_dir newdir/refs
'
test_expect_success 'init creates a new deep directory' '
rm -fr newdir &&
git init newdir/a/b/c &&
- test -d newdir/a/b/c/.git/refs
+ test_path_is_dir newdir/a/b/c/.git/refs
'
test_expect_success POSIXPERM 'init creates a new deep directory (umask vs. shared)' '
@@ -321,7 +238,7 @@ test_expect_success POSIXPERM 'init creates a new deep directory (umask vs. shar
# the repository itself should follow "shared"
umask 002 &&
git init --bare --shared=0660 newdir/a/b/c &&
- test -d newdir/a/b/c/refs &&
+ test_path_is_dir newdir/a/b/c/refs &&
ls -ld newdir/a newdir/a/b > lsab.out &&
! grep -v "^drwxrw[sx]r-x" lsab.out &&
ls -ld newdir/a/b/c > lsc.out &&
@@ -331,44 +248,38 @@ test_expect_success POSIXPERM 'init creates a new deep directory (umask vs. shar
test_expect_success 'init notices EEXIST (1)' '
rm -fr newdir &&
- (
- >newdir &&
- test_must_fail git init newdir &&
- test -f newdir
- )
+ >newdir &&
+ test_must_fail git init newdir &&
+ test_path_is_file newdir
'
test_expect_success 'init notices EEXIST (2)' '
rm -fr newdir &&
- (
- mkdir newdir &&
- >newdir/a
- test_must_fail git init newdir/a/b &&
- test -f newdir/a
- )
+ mkdir newdir &&
+ >newdir/a &&
+ test_must_fail git init newdir/a/b &&
+ test_path_is_file newdir/a
'
test_expect_success POSIXPERM,SANITY 'init notices EPERM' '
rm -fr newdir &&
- (
- mkdir newdir &&
- chmod -w newdir &&
- test_must_fail git init newdir/a/b
- )
+ mkdir newdir &&
+ chmod -w newdir &&
+ test_must_fail git init newdir/a/b
'
test_expect_success 'init creates a new bare directory with global --bare' '
rm -rf newdir &&
git --bare init newdir &&
- test -d newdir/refs
+ test_path_is_dir newdir/refs
'
test_expect_success 'init prefers command line to GIT_DIR' '
rm -rf newdir &&
mkdir otherdir &&
GIT_DIR=otherdir git --bare init newdir &&
- test -d newdir/refs &&
- ! test -d otherdir/refs
+ test_path_is_dir newdir/refs &&
+ test_path_is_missing otherdir/refs
'
test_expect_success 'init with separate gitdir' '
@@ -376,7 +287,7 @@ test_expect_success 'init with separate gitdir' '
git init --separate-git-dir realgitdir newdir &&
echo "gitdir: `pwd`/realgitdir" >expected &&
test_cmp expected newdir/.git &&
- test -d realgitdir/refs
+ test_path_is_dir realgitdir/refs
'
test_expect_success 're-init on .git file' '
@@ -390,8 +301,8 @@ test_expect_success 're-init to update git link' '
) &&
echo "gitdir: `pwd`/surrealgitdir" >expected &&
test_cmp expected newdir/.git &&
- test -d surrealgitdir/refs &&
- ! test -d realgitdir/refs
+ test_path_is_dir surrealgitdir/refs &&
+ test_path_is_missing realgitdir/refs
'
test_expect_success 're-init to move gitdir' '
@@ -403,7 +314,7 @@ test_expect_success 're-init to move gitdir' '
) &&
echo "gitdir: `pwd`/realgitdir" >expected &&
test_cmp expected newdir/.git &&
- test -d realgitdir/refs
+ test_path_is_dir realgitdir/refs
'
test_expect_success SYMLINKS 're-init to move gitdir symlink' '
@@ -417,8 +328,8 @@ test_expect_success SYMLINKS 're-init to move gitdir symlink' '
) &&
echo "gitdir: `pwd`/realgitdir" >expected &&
test_cmp expected newdir/.git &&
- test -d realgitdir/refs &&
- ! test -d newdir/here
+ test_cmp expected newdir/here &&
+ test_path_is_dir realgitdir/refs
'
test_done
diff --git a/t/t0008-ignores.sh b/t/t0008-ignores.sh
index b4d98e602f..39e55a13c8 100755
--- a/t/t0008-ignores.sh
+++ b/t/t0008-ignores.sh
@@ -775,4 +775,60 @@ test_expect_success PIPE 'streaming support for --stdin' '
echo "$response" | grep "^:: two"
'
+############################################################################
+#
+# test whitespace handling
+
+test_expect_success 'trailing whitespace is ignored' '
+ mkdir whitespace &&
+ >whitespace/trailing &&
+ >whitespace/untracked &&
+ echo "whitespace/trailing " >ignore &&
+ cat >expect <<EOF &&
+whitespace/untracked
+EOF
+ : >err.expect &&
+ git ls-files -o -X ignore whitespace >actual 2>err &&
+ test_cmp expect actual &&
+ test_cmp err.expect err
+'
+
+test_expect_success !MINGW 'quoting allows trailing whitespace' '
+ rm -rf whitespace &&
+ mkdir whitespace &&
+ >"whitespace/trailing " &&
+ >whitespace/untracked &&
+ echo "whitespace/trailing\\ \\ " >ignore &&
+ echo whitespace/untracked >expect &&
+ : >err.expect &&
+ git ls-files -o -X ignore whitespace >actual 2>err &&
+ test_cmp expect actual &&
+ test_cmp err.expect err
+'
+
+test_expect_success NOT_MINGW,NOT_CYGWIN 'correct handling of backslashes' '
+ rm -rf whitespace &&
+ mkdir whitespace &&
+ >"whitespace/trailing 1 " &&
+ >"whitespace/trailing 2 \\\\" &&
+ >"whitespace/trailing 3 \\\\" &&
+ >"whitespace/trailing 4 \\ " &&
+ >"whitespace/trailing 5 \\ \\ " &&
+ >"whitespace/trailing 6 \\a\\" &&
+ >whitespace/untracked &&
+ sed -e "s/Z$//" >ignore <<-\EOF &&
+ whitespace/trailing 1 \ Z
+ whitespace/trailing 2 \\\\Z
+ whitespace/trailing 3 \\\\ Z
+ whitespace/trailing 4 \\\ Z
+ whitespace/trailing 5 \\ \\\ Z
+ whitespace/trailing 6 \\a\\Z
+ EOF
+ echo whitespace/untracked >expect &&
+ >err.expect &&
+ git ls-files -o -X ignore whitespace >actual 2>err &&
+ test_cmp expect actual &&
+ test_cmp err.expect err
+'
+
test_done
diff --git a/t/t0011-hashmap.sh b/t/t0011-hashmap.sh
new file mode 100755
index 0000000000..391e2b6492
--- /dev/null
+++ b/t/t0011-hashmap.sh
@@ -0,0 +1,240 @@
+#!/bin/sh
+
+test_description='test hashmap and string hash functions'
+. ./test-lib.sh
+
+test_hashmap() {
+ echo "$1" | test-hashmap $3 > actual &&
+ echo "$2" > expect &&
+ test_cmp expect actual
+}
+
+test_expect_success 'hash functions' '
+
+test_hashmap "hash key1" "2215982743 2215982743 116372151 116372151" &&
+test_hashmap "hash key2" "2215982740 2215982740 116372148 116372148" &&
+test_hashmap "hash fooBarFrotz" "1383912807 1383912807 3189766727 3189766727" &&
+test_hashmap "hash foobarfrotz" "2862305959 2862305959 3189766727 3189766727"
+
+'
+
+test_expect_success 'put' '
+
+test_hashmap "put key1 value1
+put key2 value2
+put fooBarFrotz value3
+put foobarfrotz value4
+size" "NULL
+NULL
+NULL
+NULL
+64 4"
+
+'
+
+test_expect_success 'put (case insensitive)' '
+
+test_hashmap "put key1 value1
+put key2 value2
+put fooBarFrotz value3
+size" "NULL
+NULL
+NULL
+64 3" ignorecase
+
+'
+
+test_expect_success 'replace' '
+
+test_hashmap "put key1 value1
+put key1 value2
+put fooBarFrotz value3
+put fooBarFrotz value4
+size" "NULL
+value1
+NULL
+value3
+64 2"
+
+'
+
+test_expect_success 'replace (case insensitive)' '
+
+test_hashmap "put key1 value1
+put Key1 value2
+put fooBarFrotz value3
+put foobarfrotz value4
+size" "NULL
+value1
+NULL
+value3
+64 2" ignorecase
+
+'
+
+test_expect_success 'get' '
+
+test_hashmap "put key1 value1
+put key2 value2
+put fooBarFrotz value3
+put foobarfrotz value4
+get key1
+get key2
+get fooBarFrotz
+get notInMap" "NULL
+NULL
+NULL
+NULL
+value1
+value2
+value3
+NULL"
+
+'
+
+test_expect_success 'get (case insensitive)' '
+
+test_hashmap "put key1 value1
+put key2 value2
+put fooBarFrotz value3
+get Key1
+get keY2
+get foobarfrotz
+get notInMap" "NULL
+NULL
+NULL
+value1
+value2
+value3
+NULL" ignorecase
+
+'
+
+test_expect_success 'add' '
+
+test_hashmap "add key1 value1
+add key1 value2
+add fooBarFrotz value3
+add fooBarFrotz value4
+get key1
+get fooBarFrotz
+get notInMap" "value2
+value1
+value4
+value3
+NULL"
+
+'
+
+test_expect_success 'add (case insensitive)' '
+
+test_hashmap "add key1 value1
+add Key1 value2
+add fooBarFrotz value3
+add foobarfrotz value4
+get key1
+get Foobarfrotz
+get notInMap" "value2
+value1
+value4
+value3
+NULL" ignorecase
+
+'
+
+test_expect_success 'remove' '
+
+test_hashmap "put key1 value1
+put key2 value2
+put fooBarFrotz value3
+remove key1
+remove key2
+remove notInMap
+size" "NULL
+NULL
+NULL
+value1
+value2
+NULL
+64 1"
+
+'
+
+test_expect_success 'remove (case insensitive)' '
+
+test_hashmap "put key1 value1
+put key2 value2
+put fooBarFrotz value3
+remove Key1
+remove keY2
+remove notInMap
+size" "NULL
+NULL
+NULL
+value1
+value2
+NULL
+64 1" ignorecase
+
+'
+
+test_expect_success 'iterate' '
+
+test_hashmap "put key1 value1
+put key2 value2
+put fooBarFrotz value3
+iterate" "NULL
+NULL
+NULL
+key2 value2
+key1 value1
+fooBarFrotz value3"
+
+'
+
+test_expect_success 'iterate (case insensitive)' '
+
+test_hashmap "put key1 value1
+put key2 value2
+put fooBarFrotz value3
+iterate" "NULL
+NULL
+NULL
+fooBarFrotz value3
+key2 value2
+key1 value1" ignorecase
+
+'
+
+test_expect_success 'grow / shrink' '
+
+ rm -f in &&
+ rm -f expect &&
+ for n in $(test_seq 51)
+ do
+ echo put key$n value$n >> in &&
+ echo NULL >> expect
+ done &&
+ echo size >> in &&
+ echo 64 51 >> expect &&
+ echo put key52 value52 >> in &&
+ echo NULL >> expect
+ echo size >> in &&
+ echo 256 52 >> expect &&
+ for n in $(test_seq 12)
+ do
+ echo remove key$n >> in &&
+ echo value$n >> expect
+ done &&
+ echo size >> in &&
+ echo 256 40 >> expect &&
+ echo remove key40 >> in &&
+ echo value40 >> expect &&
+ echo size >> in &&
+ echo 64 39 >> expect &&
+ cat in | test-hashmap > out &&
+ test_cmp expect out
+
+'
+
+test_done
diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh
index 65606df3ed..a90c86bfa3 100755
--- a/t/t0040-parse-options.sh
+++ b/t/t0040-parse-options.sh
@@ -30,7 +30,6 @@ String options
--string2 <str> get another string
--st <st> get another string (pervert ordering)
-o <str> get another string
- --default-string set string to default
--list <str> add str to list
Magic arguments
@@ -293,7 +292,7 @@ cat > expect <<EOF
boolean: 0
integer: 0
timestamp: 1
-string: default
+string: (not set)
abbrev: 7
verbose: 0
quiet: yes
@@ -302,8 +301,8 @@ file: (not set)
arg 00: foo
EOF
-test_expect_success 'OPT_DATE() and OPT_SET_PTR() work' '
- test-parse-options -t "1970-01-01 00:00:01 +0000" --default-string \
+test_expect_success 'OPT_DATE() works' '
+ test-parse-options -t "1970-01-01 00:00:01 +0000" \
foo -q > output 2> output.err &&
test_must_be_empty output.err &&
test_cmp expect output
diff --git a/t/t1020-subdirectory.sh b/t/t1020-subdirectory.sh
index 1e2945ec7e..6902320e81 100755
--- a/t/t1020-subdirectory.sh
+++ b/t/t1020-subdirectory.sh
@@ -148,7 +148,7 @@ test_expect_success 'GIT_PREFIX for built-ins' '
(
cd dir &&
printf "change" >two &&
- env GIT_EXTERNAL_DIFF=./diff git diff >../actual
+ GIT_EXTERNAL_DIFF=./diff git diff >../actual
git checkout -- two
) &&
test_cmp expect actual
diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh
index 967359344d..58cd5435be 100755
--- a/t/t1300-repo-config.sh
+++ b/t/t1300-repo-config.sh
@@ -461,7 +461,7 @@ test_expect_success 'new variable inserts into proper section' '
test_cmp expect .git/config
'
-test_expect_success 'alternative GIT_CONFIG (non-existing file should fail)' '
+test_expect_success 'alternative --file (non-existing file should fail)' '
test_must_fail git config --file non-existing-config -l
'
@@ -475,15 +475,28 @@ ein.bahn=strasse
EOF
test_expect_success 'alternative GIT_CONFIG' '
- GIT_CONFIG=other-config git config -l >output &&
+ GIT_CONFIG=other-config git config --list >output &&
test_cmp expect output
'
test_expect_success 'alternative GIT_CONFIG (--file)' '
- git config --file other-config -l > output &&
+ git config --file other-config --list >output &&
test_cmp expect output
'
+test_expect_success 'alternative GIT_CONFIG (--file=-)' '
+ git config --file - --list <other-config >output &&
+ test_cmp expect output
+'
+
+test_expect_success 'setting a value in stdin is an error' '
+ test_must_fail git config --file - some.value foo
+'
+
+test_expect_success 'editing stdin is an error' '
+ test_must_fail git config --file - --edit
+'
+
test_expect_success 'refer config from subdirectory' '
mkdir x &&
(
@@ -495,10 +508,10 @@ test_expect_success 'refer config from subdirectory' '
'
-test_expect_success 'refer config from subdirectory via GIT_CONFIG' '
+test_expect_success 'refer config from subdirectory via --file' '
(
cd x &&
- GIT_CONFIG=../other-config git config --get ein.bahn >actual &&
+ git config --file=../other-config --get ein.bahn >actual &&
test_cmp expect actual
)
'
@@ -510,8 +523,8 @@ cat > expect << EOF
park = ausweis
EOF
-test_expect_success '--set in alternative GIT_CONFIG' '
- GIT_CONFIG=other-config git config anwohner.park ausweis &&
+test_expect_success '--set in alternative file' '
+ git config --file=other-config anwohner.park ausweis &&
test_cmp expect other-config
'
@@ -942,11 +955,11 @@ test_expect_success 'inner whitespace kept verbatim' '
test_expect_success SYMLINKS 'symlinked configuration' '
ln -s notyet myconfig &&
- GIT_CONFIG=myconfig git config test.frotz nitfol &&
+ git config --file=myconfig test.frotz nitfol &&
test -h myconfig &&
test -f notyet &&
- test "z$(GIT_CONFIG=notyet git config test.frotz)" = znitfol &&
- GIT_CONFIG=myconfig git config test.xyzzy rezrov &&
+ test "z$(git config --file=notyet test.frotz)" = znitfol &&
+ git config --file=myconfig test.xyzzy rezrov &&
test -h myconfig &&
test -f notyet &&
cat >expect <<-\EOF &&
@@ -954,31 +967,22 @@ test_expect_success SYMLINKS 'symlinked configuration' '
rezrov
EOF
{
- GIT_CONFIG=notyet git config test.frotz &&
- GIT_CONFIG=notyet git config test.xyzzy
+ git config --file=notyet test.frotz &&
+ git config --file=notyet test.xyzzy
} >actual &&
test_cmp expect actual
'
test_expect_success 'nonexistent configuration' '
- (
- GIT_CONFIG=doesnotexist &&
- export GIT_CONFIG &&
- test_must_fail git config --list &&
- test_must_fail git config test.xyzzy
- )
+ test_must_fail git config --file=doesnotexist --list &&
+ test_must_fail git config --file=doesnotexist test.xyzzy
'
test_expect_success SYMLINKS 'symlink to nonexistent configuration' '
ln -s doesnotexist linktonada &&
ln -s linktonada linktolinktonada &&
- (
- GIT_CONFIG=linktonada &&
- export GIT_CONFIG &&
- test_must_fail git config --list &&
- GIT_CONFIG=linktolinktonada &&
- test_must_fail git config --list
- )
+ test_must_fail git config --file=linktonada --list &&
+ test_must_fail git config --file=linktolinktonada --list
'
test_expect_success 'check split_cmdline return' "
diff --git a/t/t1302-repo-version.sh b/t/t1302-repo-version.sh
index 0e47662406..0d9388afc4 100755
--- a/t/t1302-repo-version.sh
+++ b/t/t1302-repo-version.sh
@@ -19,7 +19,7 @@ test_expect_success 'setup' '
test_create_repo "test" &&
test_create_repo "test2" &&
- GIT_CONFIG=test2/.git/config git config core.repositoryformatversion 99
+ git config --file=test2/.git/config core.repositoryformatversion 99
'
test_expect_success 'gitdir selection on normal repos' '
diff --git a/t/t1305-config-include.sh b/t/t1305-config-include.sh
index a70707620f..9ba2ba11c3 100755
--- a/t/t1305-config-include.sh
+++ b/t/t1305-config-include.sh
@@ -113,7 +113,7 @@ test_expect_success 'missing include files are ignored' '
test_expect_success 'absolute includes from command line work' '
echo "[test]one = 1" >one &&
echo 1 >expect &&
- git -c include.path="$PWD/one" config test.one >actual &&
+ git -c include.path="$(pwd)/one" config test.one >actual &&
test_cmp expect actual
'
@@ -122,6 +122,36 @@ test_expect_success 'relative includes from command line fail' '
test_must_fail git -c include.path=one config test.one
'
+test_expect_success 'absolute includes from blobs work' '
+ echo "[test]one = 1" >one &&
+ echo "[include]path=$(pwd)/one" >blob &&
+ blob=$(git hash-object -w blob) &&
+ echo 1 >expect &&
+ git config --blob=$blob test.one >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'relative includes from blobs fail' '
+ echo "[test]one = 1" >one &&
+ echo "[include]path=one" >blob &&
+ blob=$(git hash-object -w blob) &&
+ test_must_fail git config --blob=$blob test.one
+'
+
+test_expect_success 'absolute includes from stdin work' '
+ echo "[test]one = 1" >one &&
+ echo 1 >expect &&
+ echo "[include]path=\"$(pwd)/one\"" |
+ git config --file - test.one >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'relative includes from stdin line fail' '
+ echo "[test]one = 1" >one &&
+ echo "[include]path=one" |
+ test_must_fail git config --file - test.one
+'
+
test_expect_success 'include cycles are detected' '
cat >.gitconfig <<-\EOF &&
[test]value = gitconfig
diff --git a/t/t1502-rev-parse-parseopt.sh b/t/t1502-rev-parse-parseopt.sh
index 83b1300cef..922423e7d0 100755
--- a/t/t1502-rev-parse-parseopt.sh
+++ b/t/t1502-rev-parse-parseopt.sh
@@ -3,44 +3,64 @@
test_description='test git rev-parse --parseopt'
. ./test-lib.sh
-cat > expect <<\END_EXPECT
-cat <<\EOF
-usage: some-command [options] <args>...
-
- some-command does foo and bar!
-
- -h, --help show the help
- --foo some nifty option --foo
- --bar ... some cool option --bar with an argument
- -b, --baz a short and long option
-
-An option group Header
- -C[...] option C with an optional argument
- -d, --data[=...] short and long option with an optional argument
-
-Extras
- --extra1 line above used to cause a segfault but no longer does
-
-EOF
+sed -e 's/^|//' >expect <<\END_EXPECT
+|cat <<\EOF
+|usage: some-command [options] <args>...
+|
+| some-command does foo and bar!
+|
+| -h, --help show the help
+| --foo some nifty option --foo
+| --bar ... some cool option --bar with an argument
+| -b, --baz a short and long option
+|
+|An option group Header
+| -C[...] option C with an optional argument
+| -d, --data[=...] short and long option with an optional argument
+|
+|Argument hints
+| -b <arg> short option required argument
+| --bar2 <arg> long option required argument
+| -e, --fuz <with-space>
+| short and long option required argument
+| -s[<some>] short option optional argument
+| --long[=<data>] long option optional argument
+| -g, --fluf[=<path>] short and long option optional argument
+| --longest <very-long-argument-hint>
+| a very long argument hint
+|
+|Extras
+| --extra1 line above used to cause a segfault but no longer does
+|
+|EOF
END_EXPECT
-cat > optionspec << EOF
-some-command [options] <args>...
-
-some-command does foo and bar!
---
-h,help show the help
-
-foo some nifty option --foo
-bar= some cool option --bar with an argument
-b,baz a short and long option
-
- An option group Header
-C? option C with an optional argument
-d,data? short and long option with an optional argument
-
-Extras
-extra1 line above used to cause a segfault but no longer does
+sed -e 's/^|//' >optionspec <<\EOF
+|some-command [options] <args>...
+|
+|some-command does foo and bar!
+|--
+|h,help show the help
+|
+|foo some nifty option --foo
+|bar= some cool option --bar with an argument
+|b,baz a short and long option
+|
+| An option group Header
+|C? option C with an optional argument
+|d,data? short and long option with an optional argument
+|
+| Argument hints
+|b=arg short option required argument
+|bar2=arg long option required argument
+|e,fuz=with-space short and long option required argument
+|s?some short option optional argument
+|long?data long option optional argument
+|g,fluf?path short and long option optional argument
+|longest=very-long-argument-hint a very long argument hint
+|
+|Extras
+|extra1 line above used to cause a segfault but no longer does
EOF
test_expect_success 'test --parseopt help output' '
diff --git a/t/t1507-rev-parse-upstream.sh b/t/t1507-rev-parse-upstream.sh
index 178694ee63..1978947c41 100755
--- a/t/t1507-rev-parse-upstream.sh
+++ b/t/t1507-rev-parse-upstream.sh
@@ -121,7 +121,7 @@ test_expect_success 'merge my-side@{u} records the correct name' '
git branch -D new ;# can fail but is ok
git branch -t new my-side@{u} &&
git merge -s ours new@{u} &&
- git show -s --pretty=format:%s >actual &&
+ git show -s --pretty=tformat:%s >actual &&
echo "Merge remote-tracking branch ${sq}origin/side${sq}" >expect &&
test_cmp expect actual
)
diff --git a/t/t1510-repo-setup.sh b/t/t1510-repo-setup.sh
index cf2ee7885a..e1b2a99f10 100755
--- a/t/t1510-repo-setup.sh
+++ b/t/t1510-repo-setup.sh
@@ -777,9 +777,7 @@ test_expect_success '#30: core.worktree and core.bare conflict (gitfile version)
setup_repo 30 "$here/30" gitfile true &&
(
cd 30 &&
- GIT_DIR=.git &&
- export GIT_DIR &&
- test_must_fail git symbolic-ref HEAD 2>result
+ test_must_fail env GIT_DIR=.git git symbolic-ref HEAD 2>result
) &&
grep "core.bare and core.worktree" 30/result
'
diff --git a/t/t1600-index.sh b/t/t1600-index.sh
new file mode 100755
index 0000000000..079d241145
--- /dev/null
+++ b/t/t1600-index.sh
@@ -0,0 +1,76 @@
+#!/bin/sh
+
+test_description='index file specific tests'
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+ echo 1 >a
+'
+
+test_expect_success 'bogus GIT_INDEX_VERSION issues warning' '
+ (
+ rm -f .git/index &&
+ GIT_INDEX_VERSION=2bogus &&
+ export GIT_INDEX_VERSION &&
+ git add a 2>&1 | sed "s/[0-9]//" >actual.err &&
+ sed -e "s/ Z$/ /" <<-\EOF >expect.err &&
+ warning: GIT_INDEX_VERSION set, but the value is invalid.
+ Using version Z
+ EOF
+ test_i18ncmp expect.err actual.err
+ )
+'
+
+test_expect_success 'out of bounds GIT_INDEX_VERSION issues warning' '
+ (
+ rm -f .git/index &&
+ GIT_INDEX_VERSION=1 &&
+ export GIT_INDEX_VERSION &&
+ git add a 2>&1 | sed "s/[0-9]//" >actual.err &&
+ sed -e "s/ Z$/ /" <<-\EOF >expect.err &&
+ warning: GIT_INDEX_VERSION set, but the value is invalid.
+ Using version Z
+ EOF
+ test_i18ncmp expect.err actual.err
+ )
+'
+
+test_expect_success 'no warning with bogus GIT_INDEX_VERSION and existing index' '
+ (
+ GIT_INDEX_VERSION=1 &&
+ export GIT_INDEX_VERSION &&
+ git add a 2>actual.err &&
+ >expect.err &&
+ test_i18ncmp expect.err actual.err
+ )
+'
+
+test_expect_success 'out of bounds index.version issues warning' '
+ (
+ sane_unset GIT_INDEX_VERSION &&
+ rm -f .git/index &&
+ git config --add index.version 1 &&
+ git add a 2>&1 | sed "s/[0-9]//" >actual.err &&
+ sed -e "s/ Z$/ /" <<-\EOF >expect.err &&
+ warning: index.version set, but the value is invalid.
+ Using version Z
+ EOF
+ test_i18ncmp expect.err actual.err
+ )
+'
+
+test_expect_success 'GIT_INDEX_VERSION takes precedence over config' '
+ (
+ rm -f .git/index &&
+ GIT_INDEX_VERSION=4 &&
+ export GIT_INDEX_VERSION &&
+ git config --add index.version 2 &&
+ git add a 2>&1 &&
+ echo 4 >expect &&
+ test-index-version <.git/index >actual &&
+ test_cmp expect actual
+ )
+'
+
+test_done
diff --git a/t/t2104-update-index-skip-worktree.sh b/t/t2104-update-index-skip-worktree.sh
index 1d0879be06..29c1fb10ca 100755
--- a/t/t2104-update-index-skip-worktree.sh
+++ b/t/t2104-update-index-skip-worktree.sh
@@ -7,6 +7,8 @@ test_description='skip-worktree bit test'
. ./test-lib.sh
+test_set_index_version 3
+
cat >expect.full <<EOF
H 1
H 2
diff --git a/t/t2107-update-index-basic.sh b/t/t2107-update-index-basic.sh
index a6405d318d..1bafb9098c 100755
--- a/t/t2107-update-index-basic.sh
+++ b/t/t2107-update-index-basic.sh
@@ -29,6 +29,10 @@ test_expect_success 'update-index -h with corrupt index' '
test_i18ngrep "[Uu]sage: git update-index" broken/usage
'
+test_expect_success '--cacheinfo complains of missing arguments' '
+ test_must_fail git update-index --cacheinfo
+'
+
test_expect_success '--cacheinfo does not accept blob null sha1' '
echo content >file &&
git add file &&
@@ -48,4 +52,17 @@ test_expect_success '--cacheinfo does not accept gitlink null sha1' '
test_cmp expect actual
'
+test_expect_success '--cacheinfo mode,sha1,path (new syntax)' '
+ echo content >file &&
+ git hash-object -w --stdin <file >expect &&
+
+ git update-index --add --cacheinfo 100644 "$(cat expect)" file &&
+ git rev-parse :file >actual &&
+ test_cmp expect actual &&
+
+ git update-index --add --cacheinfo "100644,$(cat expect),elif" &&
+ git rev-parse :elif >actual &&
+ test_cmp expect actual
+'
+
test_done
diff --git a/t/t2200-add-update.sh b/t/t2200-add-update.sh
index 9bf2bdffd2..e16b15d3e5 100755
--- a/t/t2200-add-update.sh
+++ b/t/t2200-add-update.sh
@@ -80,18 +80,13 @@ test_expect_success 'change gets noticed' '
'
-# Note that this is scheduled to change in Git 2.0, when
-# "git add -u" will become full-tree by default.
-test_expect_success 'non-limited update in subdir leaves root alone' '
+test_expect_success 'non-qualified update in subdir updates from the root' '
(
cd dir1 &&
echo even more >>sub2 &&
git add -u
) &&
- cat >expect <<-\EOF &&
- check
- top
- EOF
+ : >expect &&
git diff-files --name-only >actual &&
test_cmp expect actual
'
diff --git a/t/t3032-merge-recursive-options.sh b/t/t3032-merge-recursive-options.sh
index 5fd7bbb652..4029c9c8c0 100755
--- a/t/t3032-merge-recursive-options.sh
+++ b/t/t3032-merge-recursive-options.sh
@@ -14,7 +14,11 @@ test_description='merge-recursive options
. ./test-lib.sh
test_have_prereq SED_STRIPS_CR && SED_OPTIONS=-b
-test_have_prereq GREP_STRIPS_CR && export GREP_OPTIONS=-U
+if test_have_prereq GREP_STRIPS_CR
+then
+ GREP_OPTIONS=-U
+ export GREP_OPTIONS
+fi
test_expect_success 'setup' '
conflict_hunks () {
diff --git a/t/t3070-wildmatch.sh b/t/t3070-wildmatch.sh
index 38446a0e87..ef509df351 100755
--- a/t/t3070-wildmatch.sh
+++ b/t/t3070-wildmatch.sh
@@ -14,19 +14,6 @@ match() {
! test-wildmatch wildmatch '$3' '$4'
"
fi
- if [ $2 = 1 ]; then
- test_expect_success "fnmatch: match '$3' '$4'" "
- test-wildmatch fnmatch '$3' '$4'
- "
- elif [ $2 = 0 ]; then
- test_expect_success "fnmatch: no match '$3' '$4'" "
- ! test-wildmatch fnmatch '$3' '$4'
- "
-# else
-# test_expect_success BROKEN_FNMATCH "fnmatch: '$3' '$4'" "
-# ! test-wildmatch fnmatch '$3' '$4'
-# "
- fi
}
imatch() {
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh
index fcdb867748..ac31b711f2 100755
--- a/t/t3200-branch.sh
+++ b/t/t3200-branch.sh
@@ -507,6 +507,16 @@ EOF
test_cmp expected actual
'
+test_expect_success '--set-upstream-to notices an error to set branch as own upstream' '
+ git branch --set-upstream-to refs/heads/my13 my13 2>actual &&
+ cat >expected <<-\EOF &&
+ warning: Not setting branch my13 as its own upstream.
+ EOF
+ test_expect_code 1 git config branch.my13.remote &&
+ test_expect_code 1 git config branch.my13.merge &&
+ test_i18ncmp expected actual
+'
+
# Keep this test last, as it changes the current branch
cat >expect <<EOF
$_z40 $HEAD $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1117150200 +0000 branch: Created from master
@@ -849,11 +859,7 @@ test_expect_success 'detect typo in branch name when using --edit-description' '
write_script editor <<-\EOF &&
echo "New contents" >"$1"
EOF
- (
- EDITOR=./editor &&
- export EDITOR &&
- test_must_fail git branch --edit-description no-such-branch
- )
+ test_must_fail env EDITOR=./editor git branch --edit-description no-such-branch
'
test_expect_success 'refuse --edit-description on unborn branch for now' '
@@ -861,11 +867,7 @@ test_expect_success 'refuse --edit-description on unborn branch for now' '
echo "New contents" >"$1"
EOF
git checkout --orphan unborn &&
- (
- EDITOR=./editor &&
- export EDITOR &&
- test_must_fail git branch --edit-description
- )
+ test_must_fail env EDITOR=./editor git branch --edit-description
'
test_expect_success '--merged catches invalid object names' '
diff --git a/t/t3301-notes.sh b/t/t3301-notes.sh
index 16de05aff9..cfd67ff3df 100755
--- a/t/t3301-notes.sh
+++ b/t/t3301-notes.sh
@@ -17,7 +17,7 @@ GIT_EDITOR=./fake_editor.sh
export GIT_EDITOR
test_expect_success 'cannot annotate non-existing HEAD' '
- (MSG=3 && export MSG && test_must_fail git notes add)
+ test_must_fail env MSG=3 git notes add
'
test_expect_success setup '
@@ -32,22 +32,16 @@ test_expect_success setup '
'
test_expect_success 'need valid notes ref' '
- (MSG=1 GIT_NOTES_REF=/ && export MSG GIT_NOTES_REF &&
- test_must_fail git notes add) &&
- (MSG=2 GIT_NOTES_REF=/ && export MSG GIT_NOTES_REF &&
- test_must_fail git notes show)
+ test_must_fail env MSG=1 GIT_NOTES_REF=/ git notes show &&
+ test_must_fail env MSG=2 GIT_NOTES_REF=/ git notes show
'
test_expect_success 'refusing to add notes in refs/heads/' '
- (MSG=1 GIT_NOTES_REF=refs/heads/bogus &&
- export MSG GIT_NOTES_REF &&
- test_must_fail git notes add)
+ test_must_fail env MSG=1 GIT_NOTES_REF=refs/heads/bogus git notes add
'
test_expect_success 'refusing to edit notes in refs/remotes/' '
- (MSG=1 GIT_NOTES_REF=refs/remotes/bogus &&
- export MSG GIT_NOTES_REF &&
- test_must_fail git notes edit)
+ test_must_fail env MSG=1 GIT_NOTES_REF=refs/heads/bogus git notes edit
'
# 1 indicates caught gracefully by die, 128 means git-show barked
@@ -812,6 +806,33 @@ test_expect_success 'create note from non-existing note with "git notes add -C"
test_must_fail git notes list HEAD
'
+test_expect_success 'create note from non-blob with "git notes add -C" fails' '
+ commit=$(git rev-parse --verify HEAD) &&
+ tree=$(git rev-parse --verify HEAD:) &&
+ test_must_fail git notes add -C $commit &&
+ test_must_fail git notes add -C $tree &&
+ test_must_fail git notes list HEAD
+'
+
+cat > expect << EOF
+commit 80d796defacd5db327b7a4e50099663902fbdc5c
+Author: A U Thor <author@example.com>
+Date: Thu Apr 7 15:20:13 2005 -0700
+
+ 8th
+
+Notes (other):
+ This is a blob object
+EOF
+
+test_expect_success 'create note from blob with "git notes add -C" reuses blob id' '
+ blob=$(echo "This is a blob object" | git hash-object -w --stdin) &&
+ git notes add -C $blob &&
+ git log -1 > actual &&
+ test_cmp expect actual &&
+ test "$(git notes list HEAD)" = "$blob"
+'
+
cat > expect << EOF
commit 016e982bad97eacdbda0fcbd7ce5b0ba87c81f1b
Author: A U Thor <author@example.com>
@@ -838,11 +859,7 @@ test_expect_success 'create note from non-existing note with "git notes add -c"
git add a10 &&
test_tick &&
git commit -m 10th &&
- (
- MSG="yet another note" &&
- export MSG &&
- test_must_fail git notes add -c deadbeef
- ) &&
+ test_must_fail env MSG="yet another note" git notes add -c deadbeef &&
test_must_fail git notes list HEAD
'
diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh
index 6d94b1fcd9..80e0a951ea 100755
--- a/t/t3400-rebase.sh
+++ b/t/t3400-rebase.sh
@@ -88,6 +88,23 @@ test_expect_success 'rebase from ambiguous branch name' '
git rebase master
'
+test_expect_success 'rebase off of the previous branch using "-"' '
+ git checkout master &&
+ git checkout HEAD^ &&
+ git rebase @{-1} >expect.messages &&
+ git merge-base master HEAD >expect.forkpoint &&
+
+ git checkout master &&
+ git checkout HEAD^ &&
+ git rebase - >actual.messages &&
+ git merge-base master HEAD >actual.forkpoint &&
+
+ test_cmp expect.forkpoint actual.forkpoint &&
+ # the next one is dubious---we may want to say "-",
+ # instead of @{-1}, in the message
+ test_i18ncmp expect.messages actual.messages
+'
+
test_expect_success 'rebase a single mode change' '
git checkout master &&
git branch -D topic &&
diff --git a/t/t3402-rebase-merge.sh b/t/t3402-rebase-merge.sh
index be8c1d5ef9..5a27ec9b5e 100755
--- a/t/t3402-rebase-merge.sh
+++ b/t/t3402-rebase-merge.sh
@@ -33,6 +33,7 @@ test_expect_success setup '
tr "[a-z]" "[A-Z]" <original >newfile &&
git add newfile &&
git commit -a -m"side edits further." &&
+ git branch second-side &&
tr "[a-m]" "[A-M]" <original >newfile &&
rm -f original &&
@@ -41,6 +42,7 @@ test_expect_success setup '
git branch test-rebase side &&
git branch test-rebase-pick side &&
git branch test-reference-pick side &&
+ git branch test-conflicts side &&
git checkout -b test-merge side
'
@@ -138,4 +140,17 @@ test_expect_success 'rebase -s funny -Xopt' '
test -f funny.was.run
'
+test_expect_success 'rebase --skip works with two conflicts in a row' '
+ git checkout second-side &&
+ tr "[A-Z]" "[a-z]" <newfile >tmp &&
+ mv tmp newfile &&
+ git commit -a -m"edit conflicting with side" &&
+ tr "[d-f]" "[D-F]" <newfile >tmp &&
+ mv tmp newfile &&
+ git commit -a -m"another edit conflicting with side" &&
+ test_must_fail git rebase --merge test-conflicts &&
+ test_must_fail git rebase --skip &&
+ git rebase --skip
+'
+
test_done
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 50e22b1cad..c0023a5b4f 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -102,12 +102,8 @@ test_expect_success 'rebase -i with the exec command runs from tree root' '
test_expect_success 'rebase -i with the exec command checks tree cleanness' '
git checkout master &&
- (
set_fake_editor &&
- FAKE_LINES="exec_echo_foo_>file1 1" &&
- export FAKE_LINES &&
- test_must_fail git rebase -i HEAD^
- ) &&
+ test_must_fail env FAKE_LINES="exec_echo_foo_>file1 1" git rebase -i HEAD^ &&
test_cmp_rev master^ HEAD &&
git reset --hard &&
git rebase --continue
@@ -116,12 +112,9 @@ test_expect_success 'rebase -i with the exec command checks tree cleanness' '
test_expect_success 'rebase -i with exec of inexistent command' '
git checkout master &&
test_when_finished "git rebase --abort" &&
- (
set_fake_editor &&
- FAKE_LINES="exec_this-command-does-not-exist 1" &&
- export FAKE_LINES &&
- test_must_fail git rebase -i HEAD^ >actual 2>&1
- ) &&
+ test_must_fail env FAKE_LINES="exec_this-command-does-not-exist 1" \
+ git rebase -i HEAD^ >actual 2>&1 &&
! grep "Maybe git-rebase is broken" actual
'
@@ -375,11 +368,7 @@ test_expect_success 'commit message used after conflict' '
git checkout -b conflict-fixup conflict-branch &&
base=$(git rev-parse HEAD~4) &&
set_fake_editor &&
- (
- FAKE_LINES="1 fixup 3 fixup 4" &&
- export FAKE_LINES &&
- test_must_fail git rebase -i $base
- ) &&
+ test_must_fail env FAKE_LINES="1 fixup 3 fixup 4" git rebase -i $base &&
echo three > conflict &&
git add conflict &&
FAKE_COMMIT_AMEND="ONCE" EXPECT_HEADER_COUNT=2 \
@@ -394,11 +383,7 @@ test_expect_success 'commit message retained after conflict' '
git checkout -b conflict-squash conflict-branch &&
base=$(git rev-parse HEAD~4) &&
set_fake_editor &&
- (
- FAKE_LINES="1 fixup 3 squash 4" &&
- export FAKE_LINES &&
- test_must_fail git rebase -i $base
- ) &&
+ test_must_fail env FAKE_LINES="1 fixup 3 squash 4" git rebase -i $base &&
echo three > conflict &&
git add conflict &&
FAKE_COMMIT_AMEND="TWICE" EXPECT_HEADER_COUNT=2 \
@@ -469,11 +454,7 @@ test_expect_success 'interrupted squash works as expected' '
git checkout -b interrupted-squash conflict-branch &&
one=$(git rev-parse HEAD~3) &&
set_fake_editor &&
- (
- FAKE_LINES="1 squash 3 2" &&
- export FAKE_LINES &&
- test_must_fail git rebase -i HEAD~3
- ) &&
+ test_must_fail env FAKE_LINES="1 squash 3 2" git rebase -i HEAD~3 &&
(echo one; echo two; echo four) > conflict &&
git add conflict &&
test_must_fail git rebase --continue &&
@@ -487,11 +468,7 @@ test_expect_success 'interrupted squash works as expected (case 2)' '
git checkout -b interrupted-squash2 conflict-branch &&
one=$(git rev-parse HEAD~3) &&
set_fake_editor &&
- (
- FAKE_LINES="3 squash 1 2" &&
- export FAKE_LINES &&
- test_must_fail git rebase -i HEAD~3
- ) &&
+ test_must_fail env FAKE_LINES="3 squash 1 2" git rebase -i HEAD~3 &&
(echo one; echo four) > conflict &&
git add conflict &&
test_must_fail git rebase --continue &&
@@ -528,11 +505,7 @@ test_expect_success 'aborted --continue does not squash commits after "edit"' '
FAKE_LINES="edit 1" git rebase -i HEAD^ &&
echo "edited again" > file7 &&
git add file7 &&
- (
- FAKE_COMMIT_MESSAGE=" " &&
- export FAKE_COMMIT_MESSAGE &&
- test_must_fail git rebase --continue
- ) &&
+ test_must_fail env FAKE_COMMIT_MESSAGE=" " git rebase --continue &&
test $old = $(git rev-parse HEAD) &&
git rebase --abort
'
@@ -547,11 +520,7 @@ test_expect_success 'auto-amend only edited commits after "edit"' '
echo "and again" > file7 &&
git add file7 &&
test_tick &&
- (
- FAKE_COMMIT_MESSAGE="and again" &&
- export FAKE_COMMIT_MESSAGE &&
- test_must_fail git rebase --continue
- ) &&
+ test_must_fail env FAKE_COMMIT_MESSAGE="and again" git rebase --continue &&
git rebase --abort
'
@@ -559,11 +528,7 @@ test_expect_success 'clean error after failed "exec"' '
test_tick &&
test_when_finished "git rebase --abort || :" &&
set_fake_editor &&
- (
- FAKE_LINES="1 exec_false" &&
- export FAKE_LINES &&
- test_must_fail git rebase -i HEAD^
- ) &&
+ test_must_fail env FAKE_LINES="1 exec_false" git rebase -i HEAD^ &&
echo "edited again" > file7 &&
git add file7 &&
test_must_fail git rebase --continue 2>error &&
@@ -947,12 +912,8 @@ test_expect_success 'rebase -i --root retain root commit author and message' '
test_expect_success 'rebase -i --root temporary sentinel commit' '
git checkout B &&
- (
- set_fake_editor &&
- FAKE_LINES="2" &&
- export FAKE_LINES &&
- test_must_fail git rebase -i --root
- ) &&
+ set_fake_editor &&
+ test_must_fail env FAKE_LINES="2" git rebase -i --root &&
git cat-file commit HEAD | grep "^tree 4b825dc642cb" &&
git rebase --abort
'
@@ -1042,11 +1003,7 @@ test_expect_success 'rebase -i error on commits with \ in message' '
test_when_finished "git rebase --abort; git reset --hard $current_head; rm -f error" &&
test_commit TO-REMOVE will-conflict old-content &&
test_commit "\temp" will-conflict new-content dummy &&
- (
- EDITOR=true &&
- export EDITOR &&
- test_must_fail git rebase -i HEAD^ --onto HEAD^^ 2>error
- ) &&
+ test_must_fail env EDITOR=true git rebase -i HEAD^ --onto HEAD^^ 2>error &&
test_expect_code 1 grep " emp" error
'
diff --git a/t/t3413-rebase-hook.sh b/t/t3413-rebase-hook.sh
index 098b75507b..b6833e9a5f 100755
--- a/t/t3413-rebase-hook.sh
+++ b/t/t3413-rebase-hook.sh
@@ -118,11 +118,7 @@ test_expect_success 'pre-rebase hook stops rebase (1)' '
test_expect_success 'pre-rebase hook stops rebase (2)' '
git checkout test &&
git reset --hard side &&
- (
- EDITOR=:
- export EDITOR
- test_must_fail git rebase -i master
- ) &&
+ test_must_fail env EDITOR=: git rebase -i master &&
test "z$(git symbolic-ref HEAD)" = zrefs/heads/test &&
test 0 = $(git rev-list HEAD...side | wc -l)
'
diff --git a/t/t3420-rebase-autostash.sh b/t/t3420-rebase-autostash.sh
index 90eb26493c..d783f03d3f 100755
--- a/t/t3420-rebase-autostash.sh
+++ b/t/t3420-rebase-autostash.sh
@@ -167,4 +167,19 @@ testrebase "" .git/rebase-apply
testrebase " --merge" .git/rebase-merge
testrebase " --interactive" .git/rebase-merge
+test_expect_success 'abort rebase -i with --autostash' '
+ test_when_finished "git reset --hard" &&
+ echo uncommited-content >file0 &&
+ (
+ write_script abort-editor.sh <<-\EOF &&
+ echo >"$1"
+ EOF
+ test_set_editor "$(pwd)/abort-editor.sh" &&
+ test_must_fail git rebase -i --autostash HEAD^ &&
+ rm -f abort-editor.sh
+ ) &&
+ echo uncommited-content >expected &&
+ test_cmp expected file0
+'
+
test_done
diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
index 3d305814b9..e00d7d2b61 100755
--- a/t/t3600-rm.sh
+++ b/t/t3600-rm.sh
@@ -711,8 +711,7 @@ test_expect_success 'checking out a commit after submodule removal needs manual
git submodule update &&
git checkout -q HEAD^ 2>actual &&
git checkout -q master 2>actual &&
- echo "warning: unable to rmdir submod: Directory not empty" >expected &&
- test_i18ncmp expected actual &&
+ test_i18ngrep "^warning: unable to rmdir submod:" actual &&
git status -s submod >actual &&
echo "?? submod/" >expected &&
test_cmp expected actual &&
diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh
index e77c09c37e..f7a9af893b 100755
--- a/t/t4013-diff-various.sh
+++ b/t/t4013-diff-various.sh
@@ -324,4 +324,14 @@ test_expect_success 'diff --cached -- file on unborn branch' '
test_cmp "$TEST_DIRECTORY/t4013/diff.diff_--cached_--_file0" result
'
+test_expect_success 'diff-tree --stdin with log formatting' '
+ cat >expect <<-\EOF &&
+ Side
+ Third
+ Second
+ EOF
+ git rev-list master | git diff-tree --stdin --format=%s -s >actual &&
+ test_cmp expect actual
+'
+
test_done
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index 73194b2c3d..9c80633146 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -764,22 +764,14 @@ test_expect_success 'format-patch --signature="" suppresses signatures' '
test_expect_success TTY 'format-patch --stdout paginates' '
rm -f pager_used &&
- (
- GIT_PAGER="wc >pager_used" &&
- export GIT_PAGER &&
- test_terminal git format-patch --stdout --all
- ) &&
+ test_terminal env GIT_PAGER="wc >pager_used" git format-patch --stdout --all &&
test_path_is_file pager_used
'
test_expect_success TTY 'format-patch --stdout pagination can be disabled' '
rm -f pager_used &&
- (
- GIT_PAGER="wc >pager_used" &&
- export GIT_PAGER &&
- test_terminal git --no-pager format-patch --stdout --all &&
- test_terminal git -c "pager.format-patch=false" format-patch --stdout --all
- ) &&
+ test_terminal env GIT_PAGER="wc >pager_used" git --no-pager format-patch --stdout --all &&
+ test_terminal env GIT_PAGER="wc >pager_used" git -c "pager.format-patch=false" format-patch --stdout --all &&
test_path_is_missing pager_used &&
test_path_is_missing .git/pager_used
'
diff --git a/t/t4018-diff-funcname.sh b/t/t4018-diff-funcname.sh
index 38a092a0da..34591c23da 100755
--- a/t/t4018-diff-funcname.sh
+++ b/t/t4018-diff-funcname.sh
@@ -7,179 +7,103 @@ test_description='Test custom diff function name patterns'
. ./test-lib.sh
-LF='
-'
-cat >Beer.java <<\EOF
-public class Beer
-{
- int special;
- public static void main(String args[])
- {
- String s=" ";
- for(int x = 99; x > 0; x--)
- {
- System.out.print(x + " bottles of beer on the wall "
- + x + " bottles of beer\n"
- + "Take one down, pass it around, " + (x - 1)
- + " bottles of beer on the wall.\n");
- }
- System.out.print("Go to the store, buy some more,\n"
- + "99 bottles of beer on the wall.\n");
- }
-}
-EOF
-sed 's/beer\\/beer,\\/' <Beer.java >Beer-correct.java
-cat >Beer.perl <<\EOT
-package Beer;
-
-use strict;
-use warnings;
-use parent qw(Exporter);
-our @EXPORT_OK = qw(round finalround);
-
-sub other; # forward declaration
-
-# hello
-
-sub round {
- my ($n) = @_;
- print "$n bottles of beer on the wall ";
- print "$n bottles of beer\n";
- print "Take one down, pass it around, ";
- $n = $n - 1;
- print "$n bottles of beer on the wall.\n";
-}
-
-sub finalround
-{
- print "Go to the store, buy some more\n";
- print "99 bottles of beer on the wall.\n");
-}
-
-sub withheredocument {
- print <<"EOF"
-decoy here-doc
-EOF
- # some lines of context
- # to pad it out
- print "hello\n";
-}
-
-__END__
-
-=head1 NAME
-
-Beer - subroutine to output fragment of a drinking song
-
-=head1 SYNOPSIS
-
- use Beer qw(round finalround);
-
- sub song {
- for (my $i = 99; $i > 0; $i--) {
- round $i;
- }
- finalround;
- }
+test_expect_success 'setup' '
+ # a non-trivial custom pattern
+ git config diff.custom1.funcname "!static
+!String
+[^ ].*s.*" &&
- song;
+ # a custom pattern which matches to end of line
+ git config diff.custom2.funcname "......Beer\$" &&
-=cut
-EOT
-sed -e '
- s/hello/goodbye/
- s/beer\\/beer,\\/
- s/more\\/more,\\/
- s/song;/song();/
-' <Beer.perl >Beer-correct.perl
+ # alternation in pattern
+ git config diff.custom3.funcname "Beer$" &&
+ git config diff.custom3.xfuncname "^[ ]*((public|static).*)$" &&
-test_expect_funcname () {
- lang=${2-java}
- test_expect_code 1 git diff --no-index -U1 \
- "Beer.$lang" "Beer-correct.$lang" >diff &&
- grep "^@@.*@@ $1" diff
-}
+ # for regexp compilation tests
+ echo A >A.java &&
+ echo B >B.java
+'
-for p in ada bibtex cpp csharp fortran html java matlab objc pascal perl php python ruby tex
+diffpatterns="
+ ada
+ bibtex
+ cpp
+ csharp
+ fortran
+ html
+ java
+ matlab
+ objc
+ pascal
+ perl
+ php
+ python
+ ruby
+ tex
+ custom1
+ custom2
+ custom3
+"
+
+for p in $diffpatterns
do
test_expect_success "builtin $p pattern compiles" '
echo "*.java diff=$p" >.gitattributes &&
test_expect_code 1 git diff --no-index \
- Beer.java Beer-correct.java 2>msg &&
- ! grep fatal msg &&
- ! grep error msg
+ A.java B.java 2>msg &&
+ ! test_i18ngrep fatal msg &&
+ ! test_i18ngrep error msg
'
test_expect_success "builtin $p wordRegex pattern compiles" '
echo "*.java diff=$p" >.gitattributes &&
test_expect_code 1 git diff --no-index --word-diff \
- Beer.java Beer-correct.java 2>msg &&
- ! grep fatal msg &&
- ! grep error msg
+ A.java B.java 2>msg &&
+ ! test_i18ngrep fatal msg &&
+ ! test_i18ngrep error msg
'
done
-test_expect_success 'default behaviour' '
- rm -f .gitattributes &&
- test_expect_funcname "public class Beer\$"
-'
-
-test_expect_success 'set up .gitattributes declaring drivers to test' '
- cat >.gitattributes <<-\EOF
- *.java diff=java
- *.perl diff=perl
- EOF
-'
-
-test_expect_success 'preset java pattern' '
- test_expect_funcname "public static void main("
-'
-
-test_expect_success 'preset perl pattern' '
- test_expect_funcname "sub round {\$" perl
-'
-
-test_expect_success 'perl pattern accepts K&R style brace placement, too' '
- test_expect_funcname "sub finalround\$" perl
-'
-
-test_expect_success 'but is not distracted by end of <<here document' '
- test_expect_funcname "sub withheredocument {\$" perl
-'
-
-test_expect_success 'perl pattern is not distracted by sub within POD' '
- test_expect_funcname "=head" perl
-'
-
-test_expect_success 'perl pattern gets full line of POD header' '
- test_expect_funcname "=head1 SYNOPSIS\$" perl
-'
-
-test_expect_success 'perl pattern is not distracted by forward declaration' '
- test_expect_funcname "package Beer;\$" perl
-'
-
-test_expect_success 'custom pattern' '
- test_config diff.java.funcname "!static
-!String
-[^ ].*s.*" &&
- test_expect_funcname "int special;\$"
-'
-
test_expect_success 'last regexp must not be negated' '
+ echo "*.java diff=java" >.gitattributes &&
test_config diff.java.funcname "!static" &&
- test_expect_code 128 git diff --no-index Beer.java Beer-correct.java 2>msg &&
- grep ": Last expression must not be negated:" msg
+ test_expect_code 128 git diff --no-index A.java B.java 2>msg &&
+ test_i18ngrep ": Last expression must not be negated:" msg
'
-test_expect_success 'pattern which matches to end of line' '
- test_config diff.java.funcname "Beer\$" &&
- test_expect_funcname "Beer\$"
+test_expect_success 'setup hunk header tests' '
+ for i in $diffpatterns
+ do
+ echo "$i-* diff=$i"
+ done > .gitattributes &&
+
+ # add all test files to the index
+ (
+ cd "$TEST_DIRECTORY"/t4018 &&
+ git --git-dir="$TRASH_DIRECTORY/.git" add .
+ ) &&
+
+ # place modified files in the worktree
+ for i in $(git ls-files)
+ do
+ sed -e "s/ChangeMe/IWasChanged/" <"$TEST_DIRECTORY/t4018/$i" >"$i" || return 1
+ done
'
-test_expect_success 'alternation in pattern' '
- test_config diff.java.funcname "Beer$" &&
- test_config diff.java.xfuncname "^[ ]*((public|static).*)$" &&
- test_expect_funcname "public static void main("
-'
+# check each individual file
+for i in $(git ls-files)
+do
+ if grep broken "$i" >/dev/null 2>&1
+ then
+ result=failure
+ else
+ result=success
+ fi
+ test_expect_$result "hunk header: $i" "
+ test_when_finished 'cat actual' && # for debugging only
+ git diff -U1 $i >actual &&
+ grep '@@ .* @@.*RIGHT' actual
+ "
+done
test_done
diff --git a/t/t4018/README b/t/t4018/README
new file mode 100644
index 0000000000..283e01cca1
--- /dev/null
+++ b/t/t4018/README
@@ -0,0 +1,18 @@
+How to write RIGHT test cases
+=============================
+
+Insert the word "ChangeMe" (exactly this form) at a distance of
+at least two lines from the line that must appear in the hunk header.
+
+The text that must appear in the hunk header must contain the word
+"right", but in all upper-case, like in the title above.
+
+To mark a test case that highlights a malfunction, insert the word
+BROKEN in all lower-case somewhere in the file.
+
+This text is a bit twisted and out of order, but it is itself a
+test case for the default hunk header pattern. Know what you are doing
+if you change it.
+
+BTW, this tests that the head line goes to the hunk header, not the line
+of equal signs.
diff --git a/t/t4018/cpp-c++-function b/t/t4018/cpp-c++-function
new file mode 100644
index 0000000000..9ee6bbef55
--- /dev/null
+++ b/t/t4018/cpp-c++-function
@@ -0,0 +1,4 @@
+Item RIGHT::DoSomething( Args with_spaces )
+{
+ ChangeMe;
+}
diff --git a/t/t4018/cpp-class-constructor b/t/t4018/cpp-class-constructor
new file mode 100644
index 0000000000..ec4f115c25
--- /dev/null
+++ b/t/t4018/cpp-class-constructor
@@ -0,0 +1,4 @@
+Item::Item(int RIGHT)
+{
+ ChangeMe;
+}
diff --git a/t/t4018/cpp-class-constructor-mem-init b/t/t4018/cpp-class-constructor-mem-init
new file mode 100644
index 0000000000..49a69f37e1
--- /dev/null
+++ b/t/t4018/cpp-class-constructor-mem-init
@@ -0,0 +1,5 @@
+Item::Item(int RIGHT) :
+ member(0)
+{
+ ChangeMe;
+}
diff --git a/t/t4018/cpp-class-definition b/t/t4018/cpp-class-definition
new file mode 100644
index 0000000000..11b61da3b7
--- /dev/null
+++ b/t/t4018/cpp-class-definition
@@ -0,0 +1,4 @@
+class RIGHT
+{
+ int ChangeMe;
+};
diff --git a/t/t4018/cpp-class-definition-derived b/t/t4018/cpp-class-definition-derived
new file mode 100644
index 0000000000..3b98cd09ab
--- /dev/null
+++ b/t/t4018/cpp-class-definition-derived
@@ -0,0 +1,5 @@
+class RIGHT :
+ public Baseclass
+{
+ int ChangeMe;
+};
diff --git a/t/t4018/cpp-class-destructor b/t/t4018/cpp-class-destructor
new file mode 100644
index 0000000000..5487665096
--- /dev/null
+++ b/t/t4018/cpp-class-destructor
@@ -0,0 +1,4 @@
+RIGHT::~RIGHT()
+{
+ ChangeMe;
+}
diff --git a/t/t4018/cpp-function-returning-global-type b/t/t4018/cpp-function-returning-global-type
new file mode 100644
index 0000000000..1084d5990e
--- /dev/null
+++ b/t/t4018/cpp-function-returning-global-type
@@ -0,0 +1,4 @@
+::Item get::it::RIGHT()
+{
+ ChangeMe;
+}
diff --git a/t/t4018/cpp-function-returning-nested b/t/t4018/cpp-function-returning-nested
new file mode 100644
index 0000000000..d9750aa61a
--- /dev/null
+++ b/t/t4018/cpp-function-returning-nested
@@ -0,0 +1,5 @@
+get::Item get::it::RIGHT()
+{
+ ChangeMe;
+}
+
diff --git a/t/t4018/cpp-function-returning-pointer b/t/t4018/cpp-function-returning-pointer
new file mode 100644
index 0000000000..ef15657ea8
--- /dev/null
+++ b/t/t4018/cpp-function-returning-pointer
@@ -0,0 +1,4 @@
+const char *get_it_RIGHT(char *ptr)
+{
+ ChangeMe;
+}
diff --git a/t/t4018/cpp-function-returning-reference b/t/t4018/cpp-function-returning-reference
new file mode 100644
index 0000000000..01b051df70
--- /dev/null
+++ b/t/t4018/cpp-function-returning-reference
@@ -0,0 +1,4 @@
+string& get::it::RIGHT(char *ptr)
+{
+ ChangeMe;
+}
diff --git a/t/t4018/cpp-gnu-style-function b/t/t4018/cpp-gnu-style-function
new file mode 100644
index 0000000000..08c7c7565a
--- /dev/null
+++ b/t/t4018/cpp-gnu-style-function
@@ -0,0 +1,5 @@
+const char *
+RIGHT(int arg)
+{
+ ChangeMe;
+}
diff --git a/t/t4018/cpp-namespace-definition b/t/t4018/cpp-namespace-definition
new file mode 100644
index 0000000000..6749980241
--- /dev/null
+++ b/t/t4018/cpp-namespace-definition
@@ -0,0 +1,4 @@
+namespace RIGHT
+{
+ ChangeMe;
+}
diff --git a/t/t4018/cpp-operator-definition b/t/t4018/cpp-operator-definition
new file mode 100644
index 0000000000..1acd827159
--- /dev/null
+++ b/t/t4018/cpp-operator-definition
@@ -0,0 +1,4 @@
+Value operator+(Value LEFT, Value RIGHT)
+{
+ ChangeMe;
+}
diff --git a/t/t4018/cpp-skip-access-specifiers b/t/t4018/cpp-skip-access-specifiers
new file mode 100644
index 0000000000..4d4a9dbb9d
--- /dev/null
+++ b/t/t4018/cpp-skip-access-specifiers
@@ -0,0 +1,8 @@
+class RIGHT : public Baseclass
+{
+public:
+protected:
+private:
+ void DoSomething();
+ int ChangeMe;
+};
diff --git a/t/t4018/cpp-skip-comment-block b/t/t4018/cpp-skip-comment-block
new file mode 100644
index 0000000000..3800b9967a
--- /dev/null
+++ b/t/t4018/cpp-skip-comment-block
@@ -0,0 +1,9 @@
+struct item RIGHT(int i)
+// Do not
+// pick up
+/* these
+** comments.
+*/
+{
+ ChangeMe;
+}
diff --git a/t/t4018/cpp-skip-labels b/t/t4018/cpp-skip-labels
new file mode 100644
index 0000000000..b9c10aba22
--- /dev/null
+++ b/t/t4018/cpp-skip-labels
@@ -0,0 +1,8 @@
+void RIGHT (void)
+{
+repeat: // C++ comment
+next: /* C comment */
+ do_something();
+
+ ChangeMe;
+}
diff --git a/t/t4018/cpp-struct-definition b/t/t4018/cpp-struct-definition
new file mode 100644
index 0000000000..521c59fd15
--- /dev/null
+++ b/t/t4018/cpp-struct-definition
@@ -0,0 +1,9 @@
+struct RIGHT {
+ unsigned
+ /* this bit field looks like a label and should not be picked up */
+ decoy_bitfield: 2,
+ more : 1;
+ int filler;
+
+ int ChangeMe;
+};
diff --git a/t/t4018/cpp-struct-single-line b/t/t4018/cpp-struct-single-line
new file mode 100644
index 0000000000..a0de5fb800
--- /dev/null
+++ b/t/t4018/cpp-struct-single-line
@@ -0,0 +1,7 @@
+void wrong()
+{
+}
+
+struct RIGHT_iterator_tag {};
+
+int ChangeMe;
diff --git a/t/t4018/cpp-template-function-definition b/t/t4018/cpp-template-function-definition
new file mode 100644
index 0000000000..0cdf5ba5bd
--- /dev/null
+++ b/t/t4018/cpp-template-function-definition
@@ -0,0 +1,4 @@
+template<class T> int RIGHT(T arg)
+{
+ ChangeMe;
+}
diff --git a/t/t4018/cpp-union-definition b/t/t4018/cpp-union-definition
new file mode 100644
index 0000000000..7ec94df697
--- /dev/null
+++ b/t/t4018/cpp-union-definition
@@ -0,0 +1,4 @@
+union RIGHT {
+ double v;
+ int ChangeMe;
+};
diff --git a/t/t4018/cpp-void-c-function b/t/t4018/cpp-void-c-function
new file mode 100644
index 0000000000..153081e872
--- /dev/null
+++ b/t/t4018/cpp-void-c-function
@@ -0,0 +1,4 @@
+void RIGHT (void)
+{
+ ChangeMe;
+}
diff --git a/t/t4018/custom1-pattern b/t/t4018/custom1-pattern
new file mode 100644
index 0000000000..e8fd59f884
--- /dev/null
+++ b/t/t4018/custom1-pattern
@@ -0,0 +1,17 @@
+public class Beer
+{
+ int special, RIGHT;
+ public static void main(String args[])
+ {
+ String s=" ";
+ for(int x = 99; x > 0; x--)
+ {
+ System.out.print(x + " bottles of beer on the wall "
+ + x + " bottles of beer\n" // ChangeMe
+ + "Take one down, pass it around, " + (x - 1)
+ + " bottles of beer on the wall.\n");
+ }
+ System.out.print("Go to the store, buy some more,\n"
+ + "99 bottles of beer on the wall.\n");
+ }
+}
diff --git a/t/t4018/custom2-match-to-end-of-line b/t/t4018/custom2-match-to-end-of-line
new file mode 100644
index 0000000000..f88ac318b7
--- /dev/null
+++ b/t/t4018/custom2-match-to-end-of-line
@@ -0,0 +1,8 @@
+public class RIGHT_Beer
+{
+ int special;
+ public static void main(String args[])
+ {
+ System.out.print("ChangeMe");
+ }
+}
diff --git a/t/t4018/custom3-alternation-in-pattern b/t/t4018/custom3-alternation-in-pattern
new file mode 100644
index 0000000000..5f3769c64f
--- /dev/null
+++ b/t/t4018/custom3-alternation-in-pattern
@@ -0,0 +1,17 @@
+public class Beer
+{
+ int special;
+ public static void main(String RIGHT[])
+ {
+ String s=" ";
+ for(int x = 99; x > 0; x--)
+ {
+ System.out.print(x + " bottles of beer on the wall "
+ + x + " bottles of beer\n" // ChangeMe
+ + "Take one down, pass it around, " + (x - 1)
+ + " bottles of beer on the wall.\n");
+ }
+ System.out.print("Go to the store, buy some more,\n"
+ + "99 bottles of beer on the wall.\n");
+ }
+}
diff --git a/t/t4018/java-class-member-function b/t/t4018/java-class-member-function
new file mode 100644
index 0000000000..298bc7a71b
--- /dev/null
+++ b/t/t4018/java-class-member-function
@@ -0,0 +1,8 @@
+public class Beer
+{
+ int special;
+ public static void main(String RIGHT[])
+ {
+ System.out.print("ChangeMe");
+ }
+}
diff --git a/t/t4018/perl-skip-end-of-heredoc b/t/t4018/perl-skip-end-of-heredoc
new file mode 100644
index 0000000000..c22d39b256
--- /dev/null
+++ b/t/t4018/perl-skip-end-of-heredoc
@@ -0,0 +1,8 @@
+sub RIGHTwithheredocument {
+ print <<"EOF"
+decoy here-doc
+EOF
+ # some lines of context
+ # to pad it out
+ print "ChangeMe\n";
+}
diff --git a/t/t4018/perl-skip-forward-decl b/t/t4018/perl-skip-forward-decl
new file mode 100644
index 0000000000..a98cb8bdad
--- /dev/null
+++ b/t/t4018/perl-skip-forward-decl
@@ -0,0 +1,10 @@
+package RIGHT;
+
+use strict;
+use warnings;
+use parent qw(Exporter);
+our @EXPORT_OK = qw(round finalround);
+
+sub other; # forward declaration
+
+# ChangeMe
diff --git a/t/t4018/perl-skip-sub-in-pod b/t/t4018/perl-skip-sub-in-pod
new file mode 100644
index 0000000000..e39f02462e
--- /dev/null
+++ b/t/t4018/perl-skip-sub-in-pod
@@ -0,0 +1,18 @@
+=head1 NAME
+
+Beer - subroutine to output fragment of a drinking song
+
+=head1 SYNOPSIS_RIGHT
+
+ use Beer qw(round finalround);
+
+ sub song {
+ for (my $i = 99; $i > 0; $i--) {
+ round $i;
+ }
+ finalround;
+ }
+
+ ChangeMe;
+
+=cut
diff --git a/t/t4018/perl-sub-definition b/t/t4018/perl-sub-definition
new file mode 100644
index 0000000000..a507d1f645
--- /dev/null
+++ b/t/t4018/perl-sub-definition
@@ -0,0 +1,4 @@
+sub RIGHT {
+ my ($n) = @_;
+ print "ChangeMe";
+}
diff --git a/t/t4018/perl-sub-definition-kr-brace b/t/t4018/perl-sub-definition-kr-brace
new file mode 100644
index 0000000000..330b3df114
--- /dev/null
+++ b/t/t4018/perl-sub-definition-kr-brace
@@ -0,0 +1,4 @@
+sub RIGHT
+{
+ print "ChangeMe\n";
+}
diff --git a/t/t4039-diff-assume-unchanged.sh b/t/t4039-diff-assume-unchanged.sh
index 9d9498bd95..23c0e357a7 100755
--- a/t/t4039-diff-assume-unchanged.sh
+++ b/t/t4039-diff-assume-unchanged.sh
@@ -28,4 +28,15 @@ test_expect_success 'diff-files does not examine assume-unchanged entries' '
test -z "$(git diff-files -- one)"
'
+test_expect_success POSIXPERM 'find-copies-harder is not confused by mode bits' '
+ echo content >exec &&
+ chmod +x exec &&
+ git add exec &&
+ git commit -m exec &&
+ git update-index --assume-unchanged exec &&
+ >expect &&
+ git diff-files --find-copies-harder -- exec >actual &&
+ test_cmp expect actual
+'
+
test_done
diff --git a/t/t4041-diff-submodule-option.sh b/t/t4041-diff-submodule-option.sh
index 1751c83307..463d63bde0 100755
--- a/t/t4041-diff-submodule-option.sh
+++ b/t/t4041-diff-submodule-option.sh
@@ -11,6 +11,9 @@ This test tries to verify the sanity of the --submodule option of git diff.
. ./test-lib.sh
+# Tested non-UTF-8 encoding
+test_encoding="ISO8859-1"
+
# String "added" in German (translated with Google Translate), encoded in UTF-8,
# used in sample commit log messages in add_file() function below.
added=$(printf "hinzugef\303\274gt")
@@ -23,8 +26,8 @@ add_file () {
echo "$name" >"$name" &&
git add "$name" &&
test_tick &&
- msg_added_iso88591=$(echo "Add $name ($added $name)" | iconv -f utf-8 -t iso8859-1) &&
- git -c 'i18n.commitEncoding=iso8859-1' commit -m "$msg_added_iso88591"
+ msg_added_iso88591=$(echo "Add $name ($added $name)" | iconv -f utf-8 -t $test_encoding) &&
+ git -c "i18n.commitEncoding=$test_encoding" commit -m "$msg_added_iso88591"
done >/dev/null &&
git rev-parse --short --verify HEAD
)
diff --git a/t/t4056-diff-order.sh b/t/t4056-diff-order.sh
index 9e2b29ede5..c0460bb0e5 100755
--- a/t/t4056-diff-order.sh
+++ b/t/t4056-diff-order.sh
@@ -97,4 +97,25 @@ do
'
done
+test_expect_success 'setup for testing combine-diff order' '
+ git checkout -b tmp HEAD~ &&
+ create_files 3 &&
+ git checkout master &&
+ git merge --no-commit -s ours tmp &&
+ create_files 5
+'
+
+test_expect_success "combine-diff: no order (=tree object order)" '
+ git diff --name-only HEAD HEAD^ HEAD^2 >actual &&
+ test_cmp expect_none actual
+'
+
+for i in 1 2
+do
+ test_expect_success "combine-diff: orderfile using option ($i)" '
+ git diff -Oorder_file_$i --name-only HEAD HEAD^ HEAD^2 >actual &&
+ test_cmp expect_$i actual
+ '
+done
+
test_done
diff --git a/t/t4057-diff-combined-paths.sh b/t/t4057-diff-combined-paths.sh
new file mode 100755
index 0000000000..097e63215e
--- /dev/null
+++ b/t/t4057-diff-combined-paths.sh
@@ -0,0 +1,106 @@
+#!/bin/sh
+
+test_description='combined diff show only paths that are different to all parents'
+
+. ./test-lib.sh
+
+# verify that diffc.expect matches output of
+# `git diff -c --name-only HEAD HEAD^ HEAD^2`
+diffc_verify () {
+ git diff -c --name-only HEAD HEAD^ HEAD^2 >diffc.actual &&
+ test_cmp diffc.expect diffc.actual
+}
+
+test_expect_success 'trivial merge - combine-diff empty' '
+ for i in $(test_seq 1 9)
+ do
+ echo $i >$i.txt &&
+ git add $i.txt
+ done &&
+ git commit -m "init" &&
+ git checkout -b side &&
+ for i in $(test_seq 2 9)
+ do
+ echo $i/2 >>$i.txt
+ done &&
+ git commit -a -m "side 2-9" &&
+ git checkout master &&
+ echo 1/2 >1.txt &&
+ git commit -a -m "master 1" &&
+ git merge side &&
+ >diffc.expect &&
+ diffc_verify
+'
+
+
+test_expect_success 'only one trully conflicting path' '
+ git checkout side &&
+ for i in $(test_seq 2 9)
+ do
+ echo $i/3 >>$i.txt
+ done &&
+ echo "4side" >>4.txt &&
+ git commit -a -m "side 2-9 +4" &&
+ git checkout master &&
+ for i in $(test_seq 1 9)
+ do
+ echo $i/3 >>$i.txt
+ done &&
+ echo "4master" >>4.txt &&
+ git commit -a -m "master 1-9 +4" &&
+ test_must_fail git merge side &&
+ cat <<-\EOF >4.txt &&
+ 4
+ 4/2
+ 4/3
+ 4master
+ 4side
+ EOF
+ git add 4.txt &&
+ git commit -m "merge side (2)" &&
+ echo 4.txt >diffc.expect &&
+ diffc_verify
+'
+
+test_expect_success 'merge introduces new file' '
+ git checkout side &&
+ for i in $(test_seq 5 9)
+ do
+ echo $i/4 >>$i.txt
+ done &&
+ git commit -a -m "side 5-9" &&
+ git checkout master &&
+ for i in $(test_seq 1 3)
+ do
+ echo $i/4 >>$i.txt
+ done &&
+ git commit -a -m "master 1-3 +4hello" &&
+ git merge side &&
+ echo "Hello World" >4hello.txt &&
+ git add 4hello.txt &&
+ git commit --amend &&
+ echo 4hello.txt >diffc.expect &&
+ diffc_verify
+'
+
+test_expect_success 'merge removed a file' '
+ git checkout side &&
+ for i in $(test_seq 5 9)
+ do
+ echo $i/5 >>$i.txt
+ done &&
+ git commit -a -m "side 5-9" &&
+ git checkout master &&
+ for i in $(test_seq 1 3)
+ do
+ echo $i/4 >>$i.txt
+ done &&
+ git commit -a -m "master 1-3" &&
+ git merge side &&
+ git rm 4.txt &&
+ git commit --amend &&
+ echo 4.txt >diffc.expect &&
+ diffc_verify
+'
+
+test_done
diff --git a/t/t4107-apply-ignore-whitespace.sh b/t/t4107-apply-ignore-whitespace.sh
index b04fc8fc12..9e29b5262d 100755
--- a/t/t4107-apply-ignore-whitespace.sh
+++ b/t/t4107-apply-ignore-whitespace.sh
@@ -111,7 +111,6 @@ sed -e 's/T/ /g' > main.c.final <<\EOF
#include <stdio.h>
void print_int(int num);
-T/* a comment */
int func(int num);
int main() {
@@ -154,7 +153,8 @@ test_expect_success 'patch2 reverse applies with --ignore-space-change' '
git config apply.ignorewhitespace change
test_expect_success 'patch2 applies (apply.ignorewhitespace = change)' '
- git apply patch2.patch
+ git apply patch2.patch &&
+ test_cmp main.c.final main.c
'
test_expect_success 'patch3 fails (missing string at EOL)' '
@@ -165,12 +165,8 @@ test_expect_success 'patch4 fails (missing EOL at EOF)' '
test_must_fail git apply patch4.patch
'
-test_expect_success 'patch5 applies (leading whitespace)' '
- git apply patch5.patch
-'
-
-test_expect_success 'patches do not mangle whitespace' '
- test_cmp main.c main.c.final
+test_expect_success 'patch5 fails (leading whitespace differences matter)' '
+ test_must_fail git apply patch5.patch
'
test_expect_success 're-create file (with --ignore-whitespace)' '
diff --git a/t/t4201-shortlog.sh b/t/t4201-shortlog.sh
index 42866992cf..97fcb31d6e 100755
--- a/t/t4201-shortlog.sh
+++ b/t/t4201-shortlog.sh
@@ -188,4 +188,10 @@ test_expect_success 'shortlog ignores commits with missing authors' '
test_cmp expect actual
'
+test_expect_success 'shortlog with revision pseudo options' '
+ git shortlog --all &&
+ git shortlog --branches &&
+ git shortlog --exclude=refs/heads/m* --all
+'
+
test_done
diff --git a/t/t4202-log.sh b/t/t4202-log.sh
index cb03d28769..99ab7ca21f 100755
--- a/t/t4202-log.sh
+++ b/t/t4202-log.sh
@@ -3,6 +3,7 @@
test_description='git log'
. ./test-lib.sh
+. "$TEST_DIRECTORY/lib-gpg.sh"
test_expect_success setup '
@@ -841,4 +842,34 @@ test_expect_success 'dotdot is a parent directory' '
test_cmp expect actual
'
+test_expect_success GPG 'log --graph --show-signature' '
+ test_when_finished "git reset --hard && git checkout master" &&
+ git checkout -b signed master &&
+ echo foo >foo &&
+ git add foo &&
+ git commit -S -m signed_commit &&
+ git log --graph --show-signature -n1 signed >actual &&
+ grep "^| gpg: Signature made" actual &&
+ grep "^| gpg: Good signature" actual
+'
+
+test_expect_success GPG 'log --graph --show-signature for merged tag' '
+ test_when_finished "git reset --hard && git checkout master" &&
+ git checkout -b plain master &&
+ echo aaa >bar &&
+ git add bar &&
+ git commit -m bar_commit &&
+ git checkout -b tagged master &&
+ echo bbb >baz &&
+ git add baz &&
+ git commit -m baz_commit &&
+ git tag -s -m signed_tag_msg signed_tag &&
+ git checkout plain &&
+ git merge --no-ff -m msg signed_tag &&
+ git log --graph --show-signature -n1 plain >actual &&
+ grep "^|\\\ merged tag" actual &&
+ grep "^| | gpg: Signature made" actual &&
+ grep "^| | gpg: Good signature" actual
+'
+
test_done
diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh
index 2a6278bb33..c84ec9ae61 100755
--- a/t/t4205-log-pretty-formats.sh
+++ b/t/t4205-log-pretty-formats.sh
@@ -7,6 +7,9 @@
test_description='Test pretty formats'
. ./test-lib.sh
+# Tested non-UTF-8 encoding
+test_encoding="ISO8859-1"
+
sample_utf8_part=$(printf "f\303\244ng")
commit_msg () {
@@ -27,8 +30,8 @@ test_expect_success 'set up basic repos' '
>bar &&
git add foo &&
test_tick &&
- git config i18n.commitEncoding iso8859-1 &&
- git commit -m "$(commit_msg iso8859-1)" &&
+ git config i18n.commitEncoding $test_encoding &&
+ git commit -m "$(commit_msg $test_encoding)" &&
git add bar &&
test_tick &&
git commit -m "add bar" &&
@@ -56,8 +59,8 @@ test_expect_success 'alias user-defined format' '
test_cmp expected actual
'
-test_expect_success 'alias user-defined tformat with %s (iso8859-1 encoding)' '
- git config i18n.logOutputEncoding iso8859-1 &&
+test_expect_success 'alias user-defined tformat with %s (ISO8859-1 encoding)' '
+ git config i18n.logOutputEncoding $test_encoding &&
git log --oneline >expected-s &&
git log --pretty="tformat:%h %s" >actual-s &&
git config --unset i18n.logOutputEncoding &&
@@ -141,9 +144,7 @@ test_expect_success 'setup more commits' '
'
test_expect_success 'left alignment formatting' '
- git log --pretty="format:%<(40)%s" >actual &&
- # complete the incomplete line at the end
- echo >>actual &&
+ git log --pretty="tformat:%<(40)%s" >actual &&
qz_to_tab_space <<EOF >expected &&
message two Z
message one Z
@@ -153,10 +154,19 @@ EOF
test_cmp expected actual
'
+test_expect_success 'left alignment formatting. i18n.logOutputEncoding' '
+ git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(40)%s" >actual &&
+ qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
+message two Z
+message one Z
+add bar Z
+$(commit_msg) Z
+EOF
+ test_cmp expected actual
+'
+
test_expect_success 'left alignment formatting at the nth column' '
- git log --pretty="format:%h %<|(40)%s" >actual &&
- # complete the incomplete line at the end
- echo >>actual &&
+ git log --pretty="tformat:%h %<|(40)%s" >actual &&
qz_to_tab_space <<EOF >expected &&
$head1 message two Z
$head2 message one Z
@@ -166,10 +176,19 @@ EOF
test_cmp expected actual
'
+test_expect_success 'left alignment formatting at the nth column. i18n.logOutputEncoding' '
+ git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%h %<|(40)%s" >actual &&
+ qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
+$head1 message two Z
+$head2 message one Z
+$head3 add bar Z
+$head4 $(commit_msg) Z
+EOF
+ test_cmp expected actual
+'
+
test_expect_success 'left alignment formatting with no padding' '
- git log --pretty="format:%<(1)%s" >actual &&
- # complete the incomplete line at the end
- echo >>actual &&
+ git log --pretty="tformat:%<(1)%s" >actual &&
cat <<EOF >expected &&
message two
message one
@@ -179,10 +198,19 @@ EOF
test_cmp expected actual
'
+test_expect_success 'left alignment formatting with no padding. i18n.logOutputEncoding' '
+ git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(1)%s" >actual &&
+ cat <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
+message two
+message one
+add bar
+$(commit_msg)
+EOF
+ test_cmp expected actual
+'
+
test_expect_success 'left alignment formatting with trunc' '
- git log --pretty="format:%<(10,trunc)%s" >actual &&
- # complete the incomplete line at the end
- echo >>actual &&
+ git log --pretty="tformat:%<(10,trunc)%s" >actual &&
qz_to_tab_space <<EOF >expected &&
message ..
message ..
@@ -192,10 +220,19 @@ EOF
test_cmp expected actual
'
+test_expect_success 'left alignment formatting with trunc. i18n.logOutputEncoding' '
+ git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,trunc)%s" >actual &&
+ qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
+message ..
+message ..
+add bar Z
+initial...
+EOF
+ test_cmp expected actual
+'
+
test_expect_success 'left alignment formatting with ltrunc' '
- git log --pretty="format:%<(10,ltrunc)%s" >actual &&
- # complete the incomplete line at the end
- echo >>actual &&
+ git log --pretty="tformat:%<(10,ltrunc)%s" >actual &&
qz_to_tab_space <<EOF >expected &&
..sage two
..sage one
@@ -205,10 +242,19 @@ EOF
test_cmp expected actual
'
+test_expect_success 'left alignment formatting with ltrunc. i18n.logOutputEncoding' '
+ git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,ltrunc)%s" >actual &&
+ qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
+..sage two
+..sage one
+add bar Z
+..${sample_utf8_part}lich
+EOF
+ test_cmp expected actual
+'
+
test_expect_success 'left alignment formatting with mtrunc' '
- git log --pretty="format:%<(10,mtrunc)%s" >actual &&
- # complete the incomplete line at the end
- echo >>actual &&
+ git log --pretty="tformat:%<(10,mtrunc)%s" >actual &&
qz_to_tab_space <<EOF >expected &&
mess.. two
mess.. one
@@ -218,10 +264,19 @@ EOF
test_cmp expected actual
'
+test_expect_success 'left alignment formatting with mtrunc. i18n.logOutputEncoding' '
+ git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,mtrunc)%s" >actual &&
+ qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
+mess.. two
+mess.. one
+add bar Z
+init..lich
+EOF
+ test_cmp expected actual
+'
+
test_expect_success 'right alignment formatting' '
- git log --pretty="format:%>(40)%s" >actual &&
- # complete the incomplete line at the end
- echo >>actual &&
+ git log --pretty="tformat:%>(40)%s" >actual &&
qz_to_tab_space <<EOF >expected &&
Z message two
Z message one
@@ -231,10 +286,19 @@ EOF
test_cmp expected actual
'
+test_expect_success 'right alignment formatting. i18n.logOutputEncoding' '
+ git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%>(40)%s" >actual &&
+ qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
+Z message two
+Z message one
+Z add bar
+Z $(commit_msg)
+EOF
+ test_cmp expected actual
+'
+
test_expect_success 'right alignment formatting at the nth column' '
- git log --pretty="format:%h %>|(40)%s" >actual &&
- # complete the incomplete line at the end
- echo >>actual &&
+ git log --pretty="tformat:%h %>|(40)%s" >actual &&
qz_to_tab_space <<EOF >expected &&
$head1 message two
$head2 message one
@@ -244,10 +308,19 @@ EOF
test_cmp expected actual
'
+test_expect_success 'right alignment formatting at the nth column. i18n.logOutputEncoding' '
+ git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%h %>|(40)%s" >actual &&
+ qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
+$head1 message two
+$head2 message one
+$head3 add bar
+$head4 $(commit_msg)
+EOF
+ test_cmp expected actual
+'
+
test_expect_success 'right alignment formatting with no padding' '
- git log --pretty="format:%>(1)%s" >actual &&
- # complete the incomplete line at the end
- echo >>actual &&
+ git log --pretty="tformat:%>(1)%s" >actual &&
cat <<EOF >expected &&
message two
message one
@@ -257,10 +330,19 @@ EOF
test_cmp expected actual
'
+test_expect_success 'right alignment formatting with no padding. i18n.logOutputEncoding' '
+ git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%>(1)%s" >actual &&
+ cat <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
+message two
+message one
+add bar
+$(commit_msg)
+EOF
+ test_cmp expected actual
+'
+
test_expect_success 'center alignment formatting' '
- git log --pretty="format:%><(40)%s" >actual &&
- # complete the incomplete line at the end
- echo >>actual &&
+ git log --pretty="tformat:%><(40)%s" >actual &&
qz_to_tab_space <<EOF >expected &&
Z message two Z
Z message one Z
@@ -270,10 +352,18 @@ EOF
test_cmp expected actual
'
+test_expect_success 'center alignment formatting. i18n.logOutputEncoding' '
+ git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%><(40)%s" >actual &&
+ qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
+Z message two Z
+Z message one Z
+Z add bar Z
+Z $(commit_msg) Z
+EOF
+ test_cmp expected actual
+'
test_expect_success 'center alignment formatting at the nth column' '
- git log --pretty="format:%h %><|(40)%s" >actual &&
- # complete the incomplete line at the end
- echo >>actual &&
+ git log --pretty="tformat:%h %><|(40)%s" >actual &&
qz_to_tab_space <<EOF >expected &&
$head1 message two Z
$head2 message one Z
@@ -283,10 +373,19 @@ EOF
test_cmp expected actual
'
+test_expect_success 'center alignment formatting at the nth column. i18n.logOutputEncoding' '
+ git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%h %><|(40)%s" >actual &&
+ qz_to_tab_space <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
+$head1 message two Z
+$head2 message one Z
+$head3 add bar Z
+$head4 $(commit_msg) Z
+EOF
+ test_cmp expected actual
+'
+
test_expect_success 'center alignment formatting with no padding' '
- git log --pretty="format:%><(1)%s" >actual &&
- # complete the incomplete line at the end
- echo >>actual &&
+ git log --pretty="tformat:%><(1)%s" >actual &&
cat <<EOF >expected &&
message two
message one
@@ -296,11 +395,23 @@ EOF
test_cmp expected actual
'
+# save HEAD's SHA-1 digest (with no abbreviations) to use it below
+# as far as the next test amends HEAD
+old_head1=$(git rev-parse --verify HEAD~0)
+test_expect_success 'center alignment formatting with no padding. i18n.logOutputEncoding' '
+ git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%><(1)%s" >actual &&
+ cat <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
+message two
+message one
+add bar
+$(commit_msg)
+EOF
+ test_cmp expected actual
+'
+
test_expect_success 'left/right alignment formatting with stealing' '
git commit --amend -m short --author "long long long <long@me.com>" &&
- git log --pretty="format:%<(10,trunc)%s%>>(10,ltrunc)% an" >actual &&
- # complete the incomplete line at the end
- echo >>actual &&
+ git log --pretty="tformat:%<(10,trunc)%s%>>(10,ltrunc)% an" >actual &&
cat <<EOF >expected &&
short long long long
message .. A U Thor
@@ -309,6 +420,20 @@ initial... A U Thor
EOF
test_cmp expected actual
'
+test_expect_success 'left/right alignment formatting with stealing. i18n.logOutputEncoding' '
+ git -c i18n.logOutputEncoding=$test_encoding log --pretty="tformat:%<(10,trunc)%s%>>(10,ltrunc)% an" >actual &&
+ cat <<EOF | iconv -f utf-8 -t $test_encoding >expected &&
+short long long long
+message .. A U Thor
+add bar A U Thor
+initial... A U Thor
+EOF
+ test_cmp expected actual
+'
+
+# get new digests (with no abbreviations)
+head1=$(git rev-parse --verify HEAD~0) &&
+head2=$(git rev-parse --verify HEAD~1) &&
test_expect_success 'log decoration properly follows tag chain' '
git tag -a tag1 -m tag1 &&
@@ -317,9 +442,9 @@ test_expect_success 'log decoration properly follows tag chain' '
git commit --amend -m shorter &&
git log --no-walk --tags --pretty="%H %d" --decorate=full >actual &&
cat <<EOF >expected &&
-6a908c10688b2503073c39c9ba26322c73902bb5 (tag: refs/tags/tag2)
-9f716384d92283fb915a4eee5073f030638e05f9 (tag: refs/tags/message-one)
-b87e4cccdb77336ea79d89224737be7ea8e95367 (tag: refs/tags/message-two)
+$head1 (tag: refs/tags/tag2)
+$head2 (tag: refs/tags/message-one)
+$old_head1 (tag: refs/tags/message-two)
EOF
sort actual >actual1 &&
test_cmp expected actual1
diff --git a/t/t4209-log-pickaxe.sh b/t/t4209-log-pickaxe.sh
index 38fb80f643..844df760f7 100755
--- a/t/t4209-log-pickaxe.sh
+++ b/t/t4209-log-pickaxe.sh
@@ -3,82 +3,72 @@
test_description='log --grep/--author/--regexp-ignore-case/-S/-G'
. ./test-lib.sh
+test_log () {
+ expect=$1
+ kind=$2
+ needle=$3
+ shift 3
+ rest=$@
+
+ case $kind in
+ --*)
+ opt=$kind=$needle
+ ;;
+ *)
+ opt=$kind$needle
+ ;;
+ esac
+ case $expect in
+ expect_nomatch)
+ match=nomatch
+ ;;
+ *)
+ match=match
+ ;;
+ esac
+
+ test_expect_success "log $kind${rest:+ $rest} ($match)" "
+ git log $rest $opt --format=%H >actual &&
+ test_cmp $expect actual
+ "
+}
+
+# test -i and --regexp-ignore-case and expect both to behave the same way
+test_log_icase () {
+ test_log $@ --regexp-ignore-case
+ test_log $@ -i
+}
+
test_expect_success setup '
+ >expect_nomatch &&
+
>file &&
git add file &&
test_tick &&
git commit -m initial &&
+ git rev-parse --verify HEAD >expect_initial &&
echo Picked >file &&
+ git add file &&
test_tick &&
- git commit -a --author="Another Person <another@example.com>" -m second
-'
-
-test_expect_success 'log --grep' '
- git log --grep=initial --format=%H >actual &&
- git rev-parse --verify HEAD^ >expect &&
- test_cmp expect actual
-'
-
-test_expect_success 'log --grep --regexp-ignore-case' '
- git log --regexp-ignore-case --grep=InItial --format=%H >actual &&
- git rev-parse --verify HEAD^ >expect &&
- test_cmp expect actual
-'
-
-test_expect_success 'log --grep -i' '
- git log -i --grep=InItial --format=%H >actual &&
- git rev-parse --verify HEAD^ >expect &&
- test_cmp expect actual
-'
-
-test_expect_success 'log --author --regexp-ignore-case' '
- git log --regexp-ignore-case --author=person --format=%H >actual &&
- git rev-parse --verify HEAD >expect &&
- test_cmp expect actual
-'
-
-test_expect_success 'log --author -i' '
- git log -i --author=person --format=%H >actual &&
- git rev-parse --verify HEAD >expect &&
- test_cmp expect actual
-'
-
-test_expect_success 'log -G (nomatch)' '
- git log -Gpicked --format=%H >actual &&
- >expect &&
- test_cmp expect actual
-'
-
-test_expect_success 'log -G (match)' '
- git log -GPicked --format=%H >actual &&
- git rev-parse --verify HEAD >expect &&
- test_cmp expect actual
-'
-
-test_expect_success 'log -G --regexp-ignore-case (nomatch)' '
- git log --regexp-ignore-case -Gpickle --format=%H >actual &&
- >expect &&
- test_cmp expect actual
+ git commit --author="Another Person <another@example.com>" -m second &&
+ git rev-parse --verify HEAD >expect_second
'
-test_expect_success 'log -G -i (nomatch)' '
- git log -i -Gpickle --format=%H >actual &&
- >expect &&
- test_cmp expect actual
-'
+test_log expect_initial --grep initial
+test_log expect_nomatch --grep InItial
+test_log_icase expect_initial --grep InItial
+test_log_icase expect_nomatch --grep initail
-test_expect_success 'log -G --regexp-ignore-case (match)' '
- git log --regexp-ignore-case -Gpicked --format=%H >actual &&
- git rev-parse --verify HEAD >expect &&
- test_cmp expect actual
-'
+test_log expect_second --author Person
+test_log expect_nomatch --author person
+test_log_icase expect_second --author person
+test_log_icase expect_nomatch --author spreon
-test_expect_success 'log -G -i (match)' '
- git log -i -Gpicked --format=%H >actual &&
- git rev-parse --verify HEAD >expect &&
- test_cmp expect actual
-'
+test_log expect_nomatch -G picked
+test_log expect_second -G Picked
+test_log_icase expect_nomatch -G pickle
+test_log_icase expect_second -G picked
test_expect_success 'log -G --textconv (missing textconv tool)' '
echo "* diff=test" >.gitattributes &&
@@ -89,46 +79,19 @@ test_expect_success 'log -G --textconv (missing textconv tool)' '
test_expect_success 'log -G --no-textconv (missing textconv tool)' '
echo "* diff=test" >.gitattributes &&
git -c diff.test.textconv=missing log -Gfoo --no-textconv >actual &&
- >expect &&
- test_cmp expect actual &&
+ test_cmp expect_nomatch actual &&
rm .gitattributes
'
-test_expect_success 'log -S (nomatch)' '
- git log -Spicked --format=%H >actual &&
- >expect &&
- test_cmp expect actual
-'
-
-test_expect_success 'log -S (match)' '
- git log -SPicked --format=%H >actual &&
- git rev-parse --verify HEAD >expect &&
- test_cmp expect actual
-'
-
-test_expect_success 'log -S --regexp-ignore-case (match)' '
- git log --regexp-ignore-case -Spicked --format=%H >actual &&
- git rev-parse --verify HEAD >expect &&
- test_cmp expect actual
-'
-
-test_expect_success 'log -S -i (match)' '
- git log -i -Spicked --format=%H >actual &&
- git rev-parse --verify HEAD >expect &&
- test_cmp expect actual
-'
-
-test_expect_success 'log -S --regexp-ignore-case (nomatch)' '
- git log --regexp-ignore-case -Spickle --format=%H >actual &&
- >expect &&
- test_cmp expect actual
-'
+test_log expect_nomatch -S picked
+test_log expect_second -S Picked
+test_log_icase expect_second -S picked
+test_log_icase expect_nomatch -S pickle
-test_expect_success 'log -S -i (nomatch)' '
- git log -i -Spickle --format=%H >actual &&
- >expect &&
- test_cmp expect actual
-'
+test_log expect_nomatch -S p.cked --pickaxe-regex
+test_log expect_second -S P.cked --pickaxe-regex
+test_log_icase expect_second -S p.cked --pickaxe-regex
+test_log_icase expect_nomatch -S p.ckle --pickaxe-regex
test_expect_success 'log -S --textconv (missing textconv tool)' '
echo "* diff=test" >.gitattributes &&
@@ -139,8 +102,7 @@ test_expect_success 'log -S --textconv (missing textconv tool)' '
test_expect_success 'log -S --no-textconv (missing textconv tool)' '
echo "* diff=test" >.gitattributes &&
git -c diff.test.textconv=missing log -Sfoo --no-textconv >actual &&
- >expect &&
- test_cmp expect actual &&
+ test_cmp expect_nomatch actual &&
rm .gitattributes
'
diff --git a/t/t5000-tar-tree.sh b/t/t5000-tar-tree.sh
index 05f011d38e..4efaf8c58e 100755
--- a/t/t5000-tar-tree.sh
+++ b/t/t5000-tar-tree.sh
@@ -164,7 +164,7 @@ check_tar with_olde-prefix olde-
test_expect_success 'git archive on large files' '
test_config core.bigfilethreshold 1 &&
git archive HEAD >b3.tar &&
- test_cmp b.tar b3.tar
+ test_cmp_bin b.tar b3.tar
'
test_expect_success \
@@ -173,15 +173,15 @@ test_expect_success \
test_expect_success \
'git archive vs. the same in a bare repo' \
- 'test_cmp b.tar b3.tar'
+ 'test_cmp_bin b.tar b3.tar'
test_expect_success 'git archive with --output' \
'git archive --output=b4.tar HEAD &&
- test_cmp b.tar b4.tar'
+ test_cmp_bin b.tar b4.tar'
test_expect_success 'git archive --remote' \
'git archive --remote=. HEAD >b5.tar &&
- test_cmp b.tar b5.tar'
+ test_cmp_bin b.tar b5.tar'
test_expect_success \
'validate file modification time' \
@@ -198,7 +198,7 @@ test_expect_success \
test_expect_success 'git archive with --output, override inferred format' '
git archive --format=tar --output=d4.zip HEAD &&
- test_cmp b.tar d4.zip
+ test_cmp_bin b.tar d4.zip
'
test_expect_success \
@@ -213,6 +213,15 @@ test_expect_success 'clients cannot access unreachable commits' '
test_must_fail git archive --remote=. $sha1 >remote.tar
'
+test_expect_success 'upload-archive can allow unreachable commits' '
+ test_commit unreachable1 &&
+ sha1=`git rev-parse HEAD` &&
+ git reset --hard HEAD^ &&
+ git archive $sha1 >remote.tar &&
+ test_config uploadarchive.allowUnreachable true &&
+ git archive --remote=. $sha1 >remote.tar
+'
+
test_expect_success 'setup tar filters' '
git config tar.tar.foo.command "tr ab ba" &&
git config tar.bar.command "tr ab ba" &&
@@ -235,34 +244,34 @@ test_expect_success 'archive --list shows only enabled remote filters' '
test_expect_success 'invoke tar filter by format' '
git archive --format=tar.foo HEAD >config.tar.foo &&
tr ab ba <config.tar.foo >config.tar &&
- test_cmp b.tar config.tar &&
+ test_cmp_bin b.tar config.tar &&
git archive --format=bar HEAD >config.bar &&
tr ab ba <config.bar >config.tar &&
- test_cmp b.tar config.tar
+ test_cmp_bin b.tar config.tar
'
test_expect_success 'invoke tar filter by extension' '
git archive -o config-implicit.tar.foo HEAD &&
- test_cmp config.tar.foo config-implicit.tar.foo &&
+ test_cmp_bin config.tar.foo config-implicit.tar.foo &&
git archive -o config-implicit.bar HEAD &&
- test_cmp config.tar.foo config-implicit.bar
+ test_cmp_bin config.tar.foo config-implicit.bar
'
test_expect_success 'default output format remains tar' '
git archive -o config-implicit.baz HEAD &&
- test_cmp b.tar config-implicit.baz
+ test_cmp_bin b.tar config-implicit.baz
'
test_expect_success 'extension matching requires dot' '
git archive -o config-implicittar.foo HEAD &&
- test_cmp b.tar config-implicittar.foo
+ test_cmp_bin b.tar config-implicittar.foo
'
test_expect_success 'only enabled filters are available remotely' '
test_must_fail git archive --remote=. --format=tar.foo HEAD \
>remote.tar.foo &&
git archive --remote=. --format=bar >remote.bar HEAD &&
- test_cmp remote.bar config.bar
+ test_cmp_bin remote.bar config.bar
'
test_expect_success GZIP 'git archive --format=tgz' '
@@ -271,27 +280,27 @@ test_expect_success GZIP 'git archive --format=tgz' '
test_expect_success GZIP 'git archive --format=tar.gz' '
git archive --format=tar.gz HEAD >j1.tar.gz &&
- test_cmp j.tgz j1.tar.gz
+ test_cmp_bin j.tgz j1.tar.gz
'
test_expect_success GZIP 'infer tgz from .tgz filename' '
git archive --output=j2.tgz HEAD &&
- test_cmp j.tgz j2.tgz
+ test_cmp_bin j.tgz j2.tgz
'
test_expect_success GZIP 'infer tgz from .tar.gz filename' '
git archive --output=j3.tar.gz HEAD &&
- test_cmp j.tgz j3.tar.gz
+ test_cmp_bin j.tgz j3.tar.gz
'
test_expect_success GZIP 'extract tgz file' '
gzip -d -c <j.tgz >j.tar &&
- test_cmp b.tar j.tar
+ test_cmp_bin b.tar j.tar
'
test_expect_success GZIP 'remote tar.gz is allowed by default' '
git archive --remote=. --format=tar.gz HEAD >remote.tar.gz &&
- test_cmp j.tgz remote.tar.gz
+ test_cmp_bin j.tgz remote.tar.gz
'
test_expect_success GZIP 'remote tar.gz can be disabled' '
diff --git a/t/t5001-archive-attr.sh b/t/t5001-archive-attr.sh
index 51dedab29b..b04d955bfa 100755
--- a/t/t5001-archive-attr.sh
+++ b/t/t5001-archive-attr.sh
@@ -68,7 +68,7 @@ test_expect_missing worktree2/ignored-by-worktree
test_expect_success 'git archive vs. bare' '
(cd bare && git archive HEAD) >bare-archive.tar &&
- test_cmp archive.tar bare-archive.tar
+ test_cmp_bin archive.tar bare-archive.tar
'
test_expect_success 'git archive with worktree attributes, bare' '
diff --git a/t/t5003-archive-zip.sh b/t/t5003-archive-zip.sh
index c72f71eb18..21a5c93f41 100755
--- a/t/t5003-archive-zip.sh
+++ b/t/t5003-archive-zip.sh
@@ -97,15 +97,15 @@ test_expect_success \
test_expect_success \
'git archive --format=zip vs. the same in a bare repo' \
- 'test_cmp d.zip d1.zip'
+ 'test_cmp_bin d.zip d1.zip'
test_expect_success 'git archive --format=zip with --output' \
'git archive --format=zip --output=d2.zip HEAD &&
- test_cmp d.zip d2.zip'
+ test_cmp_bin d.zip d2.zip'
test_expect_success 'git archive with --output, inferring format' '
git archive --output=d3.zip HEAD &&
- test_cmp d.zip d3.zip
+ test_cmp_bin d.zip d3.zip
'
test_expect_success \
diff --git a/t/t5004-archive-corner-cases.sh b/t/t5004-archive-corner-cases.sh
index 67f3b54bed..305bcac6b7 100755
--- a/t/t5004-archive-corner-cases.sh
+++ b/t/t5004-archive-corner-cases.sh
@@ -45,7 +45,7 @@ test_expect_success HEADER_ONLY_TAR_OK 'tar archive of commit with empty tree' '
test_expect_success 'tar archive of empty tree is empty' '
git archive --format=tar HEAD: >empty.tar &&
perl -e "print \"\\0\" x 10240" >10knuls.tar &&
- test_cmp 10knuls.tar empty.tar
+ test_cmp_bin 10knuls.tar empty.tar
'
test_expect_success 'tar archive of empty tree with prefix' '
diff --git a/t/t5150-request-pull.sh b/t/t5150-request-pull.sh
index 1afa0d5c44..82c33b88e7 100755
--- a/t/t5150-request-pull.sh
+++ b/t/t5150-request-pull.sh
@@ -86,7 +86,7 @@ test_expect_success 'setup: two scripts for reading pull requests' '
s/[-0-9]\{10\} [:0-9]\{8\} [-+][0-9]\{4\}/DATE/g
s/ [^ ].*/ SUBJECT/g
s/ [^ ].* (DATE)/ SUBJECT (DATE)/g
- s/for-upstream/BRANCH/g
+ s|tags/full|BRANCH|g
s/mnemonic.txt/FILENAME/g
s/^version [0-9]/VERSION/
/^ FILENAME | *[0-9]* [-+]*\$/ b diffstat
@@ -127,7 +127,7 @@ test_expect_success 'pull request when forgot to push' '
test_must_fail git request-pull initial "$downstream_url" \
2>../err
) &&
- grep "No branch of.*is at:\$" err &&
+ grep "No match for commit .*" err &&
grep "Are you sure you pushed" err
'
@@ -141,7 +141,7 @@ test_expect_success 'pull request after push' '
git checkout initial &&
git merge --ff-only master &&
git push origin master:for-upstream &&
- git request-pull initial origin >../request
+ git request-pull initial origin master:for-upstream >../request
) &&
sed -nf read-request.sed <request >digest &&
cat digest &&
@@ -160,7 +160,7 @@ test_expect_success 'pull request after push' '
'
-test_expect_success 'request names an appropriate branch' '
+test_expect_success 'request asks HEAD to be pulled' '
rm -fr downstream.git &&
git init --bare downstream.git &&
@@ -179,7 +179,7 @@ test_expect_success 'request names an appropriate branch' '
read repository &&
read branch
} <digest &&
- test "$branch" = tags/full
+ test -z "$branch"
'
@@ -212,12 +212,24 @@ test_expect_success 'pull request format' '
cd local &&
git checkout initial &&
git merge --ff-only master &&
- git push origin master:for-upstream &&
- git request-pull initial "$downstream_url" >../request
+ git push origin tags/full &&
+ git request-pull initial "$downstream_url" tags/full >../request
) &&
<request sed -nf fuzz.sed >request.fuzzy &&
- test_i18ncmp expect request.fuzzy
+ test_i18ncmp expect request.fuzzy &&
+ (
+ cd local &&
+ git request-pull initial "$downstream_url" tags/full:refs/tags/full
+ ) >request &&
+ sed -nf fuzz.sed <request >request.fuzzy &&
+ test_i18ncmp expect request.fuzzy &&
+
+ (
+ cd local &&
+ git request-pull initial "$downstream_url" full
+ ) >request &&
+ grep " tags/full\$" request
'
test_expect_success 'request-pull ignores OPTIONS_KEEPDASHDASH poison' '
@@ -229,7 +241,7 @@ test_expect_success 'request-pull ignores OPTIONS_KEEPDASHDASH poison' '
git checkout initial &&
git merge --ff-only master &&
git push origin master:for-upstream &&
- git request-pull -- initial "$downstream_url" >../request
+ git request-pull -- initial "$downstream_url" master:for-upstream >../request
)
'
diff --git a/t/t5305-include-tag.sh b/t/t5305-include-tag.sh
index b061864a87..21517c70cd 100755
--- a/t/t5305-include-tag.sh
+++ b/t/t5305-include-tag.sh
@@ -45,9 +45,7 @@ test_expect_success 'unpack objects' '
test_expect_success 'check unpacked result (have commit, no tag)' '
git rev-list --objects $commit >list.expect &&
(
- GIT_DIR=clone.git &&
- export GIT_DIR &&
- test_must_fail git cat-file -e $tag &&
+ test_must_fail env GIT_DIR=clone.git git cat-file -e $tag &&
git rev-list --objects $commit
) >list.actual &&
test_cmp list.expect list.actual
diff --git a/t/t5310-pack-bitmaps.sh b/t/t5310-pack-bitmaps.sh
new file mode 100755
index 0000000000..f4f02ba918
--- /dev/null
+++ b/t/t5310-pack-bitmaps.sh
@@ -0,0 +1,173 @@
+#!/bin/sh
+
+test_description='exercise basic bitmap functionality'
+. ./test-lib.sh
+
+objpath () {
+ echo ".git/objects/$(echo "$1" | sed -e 's|\(..\)|\1/|')"
+}
+
+test_expect_success 'setup repo with moderate-sized history' '
+ for i in $(test_seq 1 10); do
+ test_commit $i
+ done &&
+ git checkout -b other HEAD~5 &&
+ for i in $(test_seq 1 10); do
+ test_commit side-$i
+ done &&
+ git checkout master &&
+ blob=$(echo tagged-blob | git hash-object -w --stdin) &&
+ git tag tagged-blob $blob &&
+ git config pack.writebitmaps true &&
+ git config pack.writebitmaphashcache true
+'
+
+test_expect_success 'full repack creates bitmaps' '
+ git repack -ad &&
+ ls .git/objects/pack/ | grep bitmap >output &&
+ test_line_count = 1 output
+'
+
+test_expect_success 'rev-list --test-bitmap verifies bitmaps' '
+ git rev-list --test-bitmap HEAD
+'
+
+rev_list_tests() {
+ state=$1
+
+ test_expect_success "counting commits via bitmap ($state)" '
+ git rev-list --count HEAD >expect &&
+ git rev-list --use-bitmap-index --count HEAD >actual &&
+ test_cmp expect actual
+ '
+
+ test_expect_success "counting partial commits via bitmap ($state)" '
+ git rev-list --count HEAD~5..HEAD >expect &&
+ git rev-list --use-bitmap-index --count HEAD~5..HEAD >actual &&
+ test_cmp expect actual
+ '
+
+ test_expect_success "counting non-linear history ($state)" '
+ git rev-list --count other...master >expect &&
+ git rev-list --use-bitmap-index --count other...master >actual &&
+ test_cmp expect actual
+ '
+
+ test_expect_success "enumerate --objects ($state)" '
+ git rev-list --objects --use-bitmap-index HEAD >tmp &&
+ cut -d" " -f1 <tmp >tmp2 &&
+ sort <tmp2 >actual &&
+ git rev-list --objects HEAD >tmp &&
+ cut -d" " -f1 <tmp >tmp2 &&
+ sort <tmp2 >expect &&
+ test_cmp expect actual
+ '
+
+ test_expect_success "bitmap --objects handles non-commit objects ($state)" '
+ git rev-list --objects --use-bitmap-index HEAD tagged-blob >actual &&
+ grep $blob actual
+ '
+}
+
+rev_list_tests 'full bitmap'
+
+test_expect_success 'clone from bitmapped repository' '
+ git clone --no-local --bare . clone.git &&
+ git rev-parse HEAD >expect &&
+ git --git-dir=clone.git rev-parse HEAD >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'setup further non-bitmapped commits' '
+ for i in $(test_seq 1 10); do
+ test_commit further-$i
+ done
+'
+
+rev_list_tests 'partial bitmap'
+
+test_expect_success 'fetch (partial bitmap)' '
+ git --git-dir=clone.git fetch origin master:master &&
+ git rev-parse HEAD >expect &&
+ git --git-dir=clone.git rev-parse HEAD >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'incremental repack cannot create bitmaps' '
+ test_commit more-1 &&
+ find .git/objects/pack -name "*.bitmap" >expect &&
+ git repack -d &&
+ find .git/objects/pack -name "*.bitmap" >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'incremental repack can disable bitmaps' '
+ test_commit more-2 &&
+ git repack -d --no-write-bitmap-index
+'
+
+test_expect_success 'full repack, reusing previous bitmaps' '
+ git repack -ad &&
+ ls .git/objects/pack/ | grep bitmap >output &&
+ test_line_count = 1 output
+'
+
+test_expect_success 'fetch (full bitmap)' '
+ git --git-dir=clone.git fetch origin master:master &&
+ git rev-parse HEAD >expect &&
+ git --git-dir=clone.git rev-parse HEAD >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success 'create objects for missing-HAVE tests' '
+ blob=$(echo "missing have" | git hash-object -w --stdin) &&
+ tree=$(printf "100644 blob $blob\tfile\n" | git mktree) &&
+ parent=$(echo parent | git commit-tree $tree) &&
+ commit=$(echo commit | git commit-tree $tree -p $parent) &&
+ cat >revs <<-EOF
+ HEAD
+ ^HEAD^
+ ^$commit
+ EOF
+'
+
+test_expect_success 'pack with missing blob' '
+ rm $(objpath $blob) &&
+ git pack-objects --stdout --revs <revs >/dev/null
+'
+
+test_expect_success 'pack with missing tree' '
+ rm $(objpath $tree) &&
+ git pack-objects --stdout --revs <revs >/dev/null
+'
+
+test_expect_success 'pack with missing parent' '
+ rm $(objpath $parent) &&
+ git pack-objects --stdout --revs <revs >/dev/null
+'
+
+test_lazy_prereq JGIT '
+ type jgit
+'
+
+test_expect_success JGIT 'we can read jgit bitmaps' '
+ git clone . compat-jgit &&
+ (
+ cd compat-jgit &&
+ rm -f .git/objects/pack/*.bitmap &&
+ jgit gc &&
+ git rev-list --test-bitmap HEAD
+ )
+'
+
+test_expect_success JGIT 'jgit can read our bitmaps' '
+ git clone . compat-us &&
+ (
+ cd compat-us &&
+ git repack -adb &&
+ # jgit gc will barf if it does not like our bitmaps
+ jgit gc
+ )
+'
+
+test_done
diff --git a/t/t5400-send-pack.sh b/t/t5400-send-pack.sh
index 129fc88bd2..0736bcbcd5 100755
--- a/t/t5400-send-pack.sh
+++ b/t/t5400-send-pack.sh
@@ -164,6 +164,7 @@ test_expect_success 'receive-pack runs auto-gc in remote repo' '
# Set the child to auto-pack if more than one pack exists
cd child &&
git config gc.autopacklimit 1 &&
+ git config gc.autodetach false &&
git branch test_auto_gc &&
# And create a file that follows the temporary object naming
# convention for the auto-gc to remove
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index b212f83db7..29d59ef9fa 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -321,7 +321,7 @@ test_expect_success 'fetch via rsync' '
mkdir rsynced &&
(cd rsynced &&
git init --bare &&
- git fetch "rsync:$(pwd)/../.git" master:refs/heads/master &&
+ git fetch "rsync:../.git" master:refs/heads/master &&
git gc --prune &&
test $(git rev-parse master) = $(cd .. && git rev-parse master) &&
git fsck --full)
@@ -332,7 +332,7 @@ test_expect_success 'push via rsync' '
(cd rsynced2 &&
git init) &&
(cd rsynced &&
- git push "rsync:$(pwd)/../rsynced2/.git" master) &&
+ git push "rsync:../rsynced2/.git" master) &&
(cd rsynced2 &&
git gc --prune &&
test $(git rev-parse master) = $(cd .. && git rev-parse master) &&
@@ -343,7 +343,7 @@ test_expect_success 'push via rsync' '
mkdir rsynced3 &&
(cd rsynced3 &&
git init) &&
- git push --all "rsync:$(pwd)/rsynced3/.git" &&
+ git push --all "rsync:rsynced3/.git" &&
(cd rsynced3 &&
test $(git rev-parse master) = $(cd .. && git rev-parse master) &&
git fsck --full)
diff --git a/t/t5529-push-errors.sh b/t/t5529-push-errors.sh
new file mode 100755
index 0000000000..9871307fd4
--- /dev/null
+++ b/t/t5529-push-errors.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+test_description='detect some push errors early (before contacting remote)'
+. ./test-lib.sh
+
+test_expect_success 'setup commits' '
+ test_commit one
+'
+
+test_expect_success 'setup remote' '
+ git init --bare remote.git &&
+ git remote add origin remote.git
+'
+
+test_expect_success 'setup fake receive-pack' '
+ FAKE_RP_ROOT=$(pwd) &&
+ export FAKE_RP_ROOT &&
+ write_script fake-rp <<-\EOF &&
+ echo yes >"$FAKE_RP_ROOT"/rp-ran
+ exit 1
+ EOF
+ git config remote.origin.receivepack "\"\$FAKE_RP_ROOT/fake-rp\""
+'
+
+test_expect_success 'detect missing branches early' '
+ echo no >rp-ran &&
+ echo no >expect &&
+ test_must_fail git push origin missing &&
+ test_cmp expect rp-ran
+'
+
+test_expect_success 'detect missing sha1 expressions early' '
+ echo no >rp-ran &&
+ echo no >expect &&
+ test_must_fail git push origin master~2:master &&
+ test_cmp expect rp-ran
+'
+
+test_expect_success 'detect ambiguous refs early' '
+ git branch foo &&
+ git tag foo &&
+ echo no >rp-ran &&
+ echo no >expect &&
+ test_must_fail git push origin foo &&
+ test_cmp expect rp-ran
+'
+
+test_done
diff --git a/t/t5537-fetch-shallow.sh b/t/t5537-fetch-shallow.sh
index 3ae9092f5c..a980574682 100755
--- a/t/t5537-fetch-shallow.sh
+++ b/t/t5537-fetch-shallow.sh
@@ -173,4 +173,17 @@ EOF
)
'
+test_expect_success POSIXPERM,SANITY 'shallow fetch from a read-only repo' '
+ cp -R .git read-only.git &&
+ find read-only.git -print | xargs chmod -w &&
+ test_when_finished "find read-only.git -type d -print | xargs chmod +w" &&
+ git clone --no-local --depth=2 read-only.git from-read-only &&
+ git --git-dir=from-read-only/.git log --format=%s >actual &&
+ cat >expect <<EOF &&
+add-1-back
+4
+EOF
+ test_cmp expect actual
+'
+
test_done
diff --git a/t/t5538-push-shallow.sh b/t/t5538-push-shallow.sh
index 8e54ac5746..ceee95b8a4 100755
--- a/t/t5538-push-shallow.sh
+++ b/t/t5538-push-shallow.sh
@@ -120,63 +120,4 @@ EOF
git cat-file blob `echo 1|git hash-object --stdin` >/dev/null
)
'
-
-if test -n "$NO_CURL" -o -z "$GIT_TEST_HTTPD"; then
- say 'skipping remaining tests, git built without http support'
- test_done
-fi
-
-. "$TEST_DIRECTORY"/lib-httpd.sh
-start_httpd
-
-test_expect_success 'push to shallow repo via http' '
- git clone --bare --no-local shallow "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
- (
- cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
- git config http.receivepack true
- ) &&
- (
- cd full &&
- commit 9 &&
- git push $HTTPD_URL/smart/repo.git +master:refs/remotes/top/master
- ) &&
- (
- cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
- git fsck &&
- git log --format=%s top/master >actual &&
- cat <<EOF >expect &&
-9
-4
-3
-EOF
- test_cmp expect actual
- )
-'
-
-test_expect_success 'push from shallow repo via http' '
- mv "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" shallow-upstream.git &&
- git clone --bare --no-local full "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
- (
- cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
- git config http.receivepack true
- ) &&
- commit 10 &&
- git push $HTTPD_URL/smart/repo.git +master:refs/remotes/top/master &&
- (
- cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
- git fsck &&
- git log --format=%s top/master >actual &&
- cat <<EOF >expect &&
-10
-1
-4
-3
-2
-1
-EOF
- test_cmp expect actual
- )
-'
-
-stop_httpd
test_done
diff --git a/t/t5542-push-http-shallow.sh b/t/t5542-push-http-shallow.sh
new file mode 100755
index 0000000000..2a691e09eb
--- /dev/null
+++ b/t/t5542-push-http-shallow.sh
@@ -0,0 +1,100 @@
+#!/bin/sh
+
+test_description='push from/to a shallow clone over http'
+
+. ./test-lib.sh
+
+if test -n "$NO_CURL"; then
+ say 'skipping test, git built without http support'
+ test_done
+fi
+
+. "$TEST_DIRECTORY"/lib-httpd.sh
+start_httpd
+
+commit() {
+ echo "$1" >tracked &&
+ git add tracked &&
+ git commit -m "$1"
+}
+
+test_expect_success 'setup' '
+ git config --global transfer.fsckObjects true &&
+ commit 1 &&
+ commit 2 &&
+ commit 3 &&
+ commit 4 &&
+ git clone . full &&
+ (
+ git init full-abc &&
+ cd full-abc &&
+ commit a &&
+ commit b &&
+ commit c
+ ) &&
+ git clone --no-local --depth=2 .git shallow &&
+ git --git-dir=shallow/.git log --format=%s >actual &&
+ cat <<EOF >expect &&
+4
+3
+EOF
+ test_cmp expect actual &&
+ git clone --no-local --depth=2 full-abc/.git shallow2 &&
+ git --git-dir=shallow2/.git log --format=%s >actual &&
+ cat <<EOF >expect &&
+c
+b
+EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'push to shallow repo via http' '
+ git clone --bare --no-local shallow "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
+ (
+ cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
+ git config http.receivepack true
+ ) &&
+ (
+ cd full &&
+ commit 9 &&
+ git push $HTTPD_URL/smart/repo.git +master:refs/remotes/top/master
+ ) &&
+ (
+ cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
+ git fsck &&
+ git log --format=%s top/master >actual &&
+ cat <<EOF >expect &&
+9
+4
+3
+EOF
+ test_cmp expect actual
+ )
+'
+
+test_expect_success 'push from shallow repo via http' '
+ mv "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" shallow-upstream.git &&
+ git clone --bare --no-local full "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
+ (
+ cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
+ git config http.receivepack true
+ ) &&
+ commit 10 &&
+ git push $HTTPD_URL/smart/repo.git +master:refs/remotes/top/master &&
+ (
+ cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
+ git fsck &&
+ git log --format=%s top/master >actual &&
+ cat <<EOF >expect &&
+10
+4
+3
+2
+1
+EOF
+ test_cmp expect actual
+ )
+'
+
+stop_httpd
+test_done
diff --git a/t/t5560-http-backend-noserver.sh b/t/t5560-http-backend-noserver.sh
index 5abd11a563..aa73eeaef8 100755
--- a/t/t5560-http-backend-noserver.sh
+++ b/t/t5560-http-backend-noserver.sh
@@ -5,7 +5,11 @@ test_description='test git-http-backend-noserver'
HTTPD_DOCUMENT_ROOT_PATH="$TRASH_DIRECTORY"
-test_have_prereq GREP_STRIPS_CR && export GREP_OPTIONS=-U
+if test_have_prereq GREP_STRIPS_CR
+then
+ GREP_OPTIONS=-U
+ export GREP_OPTIONS
+fi
run_backend() {
echo "$2" |
diff --git a/t/t5570-git-daemon.sh b/t/t5570-git-daemon.sh
index e06146835c..6b16379951 100755
--- a/t/t5570-git-daemon.sh
+++ b/t/t5570-git-daemon.sh
@@ -3,7 +3,6 @@
test_description='test fetching over git protocol'
. ./test-lib.sh
-LIB_GIT_DAEMON_PORT=${LIB_GIT_DAEMON_PORT-5570}
. "$TEST_DIRECTORY"/lib-git-daemon.sh
start_git_daemon
diff --git a/t/t5602-clone-remote-exec.sh b/t/t5602-clone-remote-exec.sh
index 3f353d99e8..cbcceab9d5 100755
--- a/t/t5602-clone-remote-exec.sh
+++ b/t/t5602-clone-remote-exec.sh
@@ -12,21 +12,14 @@ test_expect_success setup '
'
test_expect_success 'clone calls git upload-pack unqualified with no -u option' '
- (
- GIT_SSH=./not_ssh &&
- export GIT_SSH &&
- test_must_fail git clone localhost:/path/to/repo junk
- ) &&
+ test_must_fail env GIT_SSH=./not_ssh git clone localhost:/path/to/repo junk &&
echo "localhost git-upload-pack '\''/path/to/repo'\''" >expected &&
test_cmp expected not_ssh_output
'
test_expect_success 'clone calls specified git upload-pack with -u option' '
- (
- GIT_SSH=./not_ssh &&
- export GIT_SSH &&
- test_must_fail git clone -u ./something/bin/git-upload-pack localhost:/path/to/repo junk
- ) &&
+ test_must_fail env GIT_SSH=./not_ssh \
+ git clone -u ./something/bin/git-upload-pack localhost:/path/to/repo junk &&
echo "localhost ./something/bin/git-upload-pack '\''/path/to/repo'\''" >expected &&
test_cmp expected not_ssh_output
'
diff --git a/t/t5701-clone-local.sh b/t/t5701-clone-local.sh
index c4903687fb..3c087e907c 100755
--- a/t/t5701-clone-local.sh
+++ b/t/t5701-clone-local.sh
@@ -12,8 +12,8 @@ test_expect_success 'preparing origin repository' '
: >file && git add . && git commit -m1 &&
git clone --bare . a.git &&
git clone --bare . x &&
- test "$(GIT_CONFIG=a.git/config git config --bool core.bare)" = true &&
- test "$(GIT_CONFIG=x/config git config --bool core.bare)" = true &&
+ test "$(cd a.git && git config --bool core.bare)" = true &&
+ test "$(cd x && git config --bool core.bare)" = true &&
git bundle create b1.bundle --all &&
git bundle create b2.bundle master &&
mkdir dir &&
@@ -24,7 +24,7 @@ test_expect_success 'preparing origin repository' '
test_expect_success 'local clone without .git suffix' '
git clone -l -s a b &&
(cd b &&
- test "$(GIT_CONFIG=.git/config git config --bool core.bare)" = false &&
+ test "$(git config --bool core.bare)" = false &&
git fetch)
'
diff --git a/t/t5801-remote-helpers.sh b/t/t5801-remote-helpers.sh
index 613f69a254..a00a660763 100755
--- a/t/t5801-remote-helpers.sh
+++ b/t/t5801-remote-helpers.sh
@@ -94,6 +94,19 @@ test_expect_failure 'push new branch with old:new refspec' '
compare_refs local HEAD server refs/heads/new-refspec
'
+test_expect_success 'forced push' '
+ (cd local &&
+ git checkout -b force-test &&
+ echo content >> file &&
+ git commit -a -m eight &&
+ git push origin force-test &&
+ echo content >> file &&
+ git commit -a --amend -m eight-modified &&
+ git push --force origin force-test
+ ) &&
+ compare_refs local refs/heads/force-test server refs/heads/force-test
+'
+
test_expect_success 'cloning without refspec' '
GIT_REMOTE_TESTGIT_REFSPEC="" \
git clone "testgit::${PWD}/server" local2 2>error &&
@@ -199,29 +212,42 @@ test_expect_success 'push update refs failure' '
echo "update fail" >>file &&
git commit -a -m "update fail" &&
git rev-parse --verify testgit/origin/heads/update >expect &&
- GIT_REMOTE_TESTGIT_PUSH_ERROR="non-fast forward" &&
- export GIT_REMOTE_TESTGIT_PUSH_ERROR &&
- test_expect_code 1 git push origin update &&
+ test_expect_code 1 env GIT_REMOTE_TESTGIT_FAILURE="non-fast forward" \
+ git push origin update &&
git rev-parse --verify testgit/origin/heads/update >actual &&
test_cmp expect actual
)
'
+clean_mark () {
+ cut -f 2 -d ' ' "$1" |
+ git cat-file --batch-check |
+ grep commit |
+ sort >$(basename "$1")
+}
+
+cmp_marks () {
+ test_when_finished "rm -rf git.marks testgit.marks" &&
+ clean_mark ".git/testgit/$1/git.marks" &&
+ clean_mark ".git/testgit/$1/testgit.marks" &&
+ test_cmp git.marks testgit.marks
+}
+
test_expect_success 'proper failure checks for fetching' '
- (GIT_REMOTE_TESTGIT_FAILURE=1 &&
- export GIT_REMOTE_TESTGIT_FAILURE &&
- cd local &&
- test_must_fail git fetch 2> error &&
+ (cd local &&
+ test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git fetch 2>error &&
cat error &&
grep -q "Error while running fast-import" error
)
'
test_expect_success 'proper failure checks for pushing' '
- (GIT_REMOTE_TESTGIT_FAILURE=1 &&
- export GIT_REMOTE_TESTGIT_FAILURE &&
- cd local &&
- test_must_fail git push --all
+ (cd local &&
+ git checkout -b crash master &&
+ echo crash >>file &&
+ git commit -a -m crash &&
+ test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all &&
+ cmp_marks origin
)
'
diff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh
index 98744038ec..88ed3191e8 100755
--- a/t/t6006-rev-list-format.sh
+++ b/t/t6006-rev-list-format.sh
@@ -9,19 +9,32 @@ test_description='git rev-list --pretty=format test'
. "$TEST_DIRECTORY"/lib-terminal.sh
test_tick
+# Tested non-UTF-8 encoding
+test_encoding="ISO8859-1"
+
# String "added" in German
# (translated with Google Translate),
# encoded in UTF-8, used as a commit log message below.
-added=$(printf "added (hinzugef\303\274gt) foo")
-added_iso88591=$(echo "$added" | iconv -f utf-8 -t iso8859-1)
+added_utf8_part=$(printf "\303\274")
+added_utf8_part_iso88591=$(echo "$added_utf8_part" | iconv -f utf-8 -t $test_encoding)
+added=$(printf "added (hinzugef${added_utf8_part}gt) foo")
+added_iso88591=$(echo "$added" | iconv -f utf-8 -t $test_encoding)
# same but "changed"
-changed=$(printf "changed (ge\303\244ndert) foo")
-changed_iso88591=$(echo "$changed" | iconv -f utf-8 -t iso8859-1)
+changed_utf8_part=$(printf "\303\244")
+changed_utf8_part_iso88591=$(echo "$changed_utf8_part" | iconv -f utf-8 -t $test_encoding)
+changed=$(printf "changed (ge${changed_utf8_part}ndert) foo")
+changed_iso88591=$(echo "$changed" | iconv -f utf-8 -t $test_encoding)
+
+# Count of char to truncate
+# Number is chosen so, that non-ACSII characters
+# (see $added_utf8_part and $changed_utf8_part)
+# fall into truncated parts of appropriate words both from left and right
+truncate_count=20
test_expect_success 'setup' '
: >foo &&
git add foo &&
- git config i18n.commitEncoding iso8859-1 &&
+ git config i18n.commitEncoding $test_encoding &&
git commit -m "$added_iso88591" &&
head1=$(git rev-parse --verify HEAD) &&
head1_short=$(git rev-parse --verify --short $head1) &&
@@ -124,9 +137,9 @@ EOF
test_format encoding %e <<EOF
commit $head2
-iso8859-1
+$test_encoding
commit $head1
-iso8859-1
+$test_encoding
EOF
test_format subject %s <<EOF
@@ -136,6 +149,13 @@ commit $head1
$added
EOF
+test_format subject-truncated "%<($truncate_count,trunc)%s" <<EOF
+commit $head2
+changed (ge${changed_utf8_part}ndert)..
+commit $head1
+added (hinzugef${added_utf8_part}gt..
+EOF
+
test_format body %b <<EOF
commit $head2
commit $head1
@@ -190,12 +210,9 @@ test_expect_success '%C(auto) respects --no-color' '
'
test_expect_success TTY '%C(auto) respects --color=auto (stdout is tty)' '
- (
- TERM=vt100 && export TERM &&
- test_terminal \
- git log --format=$AUTO_COLOR -1 --color=auto >actual &&
- has_color actual
- )
+ test_terminal env TERM=vt100 \
+ git log --format=$AUTO_COLOR -1 --color=auto >actual &&
+ has_color actual
'
test_expect_success '%C(auto) respects --color=auto (stdout not tty)' '
@@ -206,16 +223,16 @@ test_expect_success '%C(auto) respects --color=auto (stdout not tty)' '
)
'
-iconv -f utf-8 -t iso8859-1 > commit-msg <<EOF
+iconv -f utf-8 -t $test_encoding > commit-msg <<EOF
Test printing of complex bodies
This commit message is much longer than the others,
-and it will be encoded in iso8859-1. We should therefore
-include an iso8859 character: ¡bueno!
+and it will be encoded in $test_encoding. We should therefore
+include an ISO8859 character: ¡bueno!
EOF
test_expect_success 'setup complex body' '
- git config i18n.commitencoding iso8859-1 &&
+ git config i18n.commitencoding $test_encoding &&
echo change2 >foo && git commit -a -F commit-msg &&
head3=$(git rev-parse --verify HEAD) &&
head3_short=$(git rev-parse --short $head3)
@@ -223,11 +240,11 @@ test_expect_success 'setup complex body' '
test_format complex-encoding %e <<EOF
commit $head3
-iso8859-1
+$test_encoding
commit $head2
-iso8859-1
+$test_encoding
commit $head1
-iso8859-1
+$test_encoding
EOF
test_format complex-subject %s <<EOF
@@ -239,20 +256,47 @@ commit $head1
$added_iso88591
EOF
+test_format complex-subject-trunc "%<($truncate_count,trunc)%s" <<EOF
+commit $head3
+Test printing of c..
+commit $head2
+changed (ge${changed_utf8_part_iso88591}ndert)..
+commit $head1
+added (hinzugef${added_utf8_part_iso88591}gt..
+EOF
+
+test_format complex-subject-mtrunc "%<($truncate_count,mtrunc)%s" <<EOF
+commit $head3
+Test prin..ex bodies
+commit $head2
+changed (..dert) foo
+commit $head1
+added (hi..f${added_utf8_part_iso88591}gt) foo
+EOF
+
+test_format complex-subject-ltrunc "%<($truncate_count,ltrunc)%s" <<EOF
+commit $head3
+.. of complex bodies
+commit $head2
+..ged (ge${changed_utf8_part_iso88591}ndert) foo
+commit $head1
+.. (hinzugef${added_utf8_part_iso88591}gt) foo
+EOF
+
test_expect_success 'prepare expected messages (for test %b)' '
cat <<-EOF >expected.utf-8 &&
commit $head3
This commit message is much longer than the others,
- and it will be encoded in iso8859-1. We should therefore
- include an iso8859 character: ¡bueno!
+ and it will be encoded in $test_encoding. We should therefore
+ include an ISO8859 character: ¡bueno!
commit $head2
commit $head1
EOF
- iconv -f utf-8 -t iso8859-1 expected.utf-8 >expected.iso8859-1
+ iconv -f utf-8 -t $test_encoding expected.utf-8 >expected.ISO8859-1
'
-test_format complex-body %b <expected.iso8859-1
+test_format complex-body %b <expected.ISO8859-1
# Git uses i18n.commitEncoding if no i18n.logOutputEncoding set
# so unset i18n.commitEncoding to test encoding conversion
@@ -267,6 +311,33 @@ commit $head1
$added
EOF
+test_format complex-subject-commitencoding-unset-trunc "%<($truncate_count,trunc)%s" <<EOF
+commit $head3
+Test printing of c..
+commit $head2
+changed (ge${changed_utf8_part}ndert)..
+commit $head1
+added (hinzugef${added_utf8_part}gt..
+EOF
+
+test_format complex-subject-commitencoding-unset-mtrunc "%<($truncate_count,mtrunc)%s" <<EOF
+commit $head3
+Test prin..ex bodies
+commit $head2
+changed (..dert) foo
+commit $head1
+added (hi..f${added_utf8_part}gt) foo
+EOF
+
+test_format complex-subject-commitencoding-unset-ltrunc "%<($truncate_count,ltrunc)%s" <<EOF
+commit $head3
+.. of complex bodies
+commit $head2
+..ged (ge${changed_utf8_part}ndert) foo
+commit $head1
+.. (hinzugef${added_utf8_part}gt) foo
+EOF
+
test_format complex-body-commitencoding-unset %b <expected.utf-8
test_expect_success '%x00 shows NUL' '
@@ -397,4 +468,10 @@ test_expect_success 'single-character name is parsed correctly' '
test_cmp expect actual
'
+test_expect_success 'unused %G placeholders are passed through' '
+ echo "%GX %G" >expect &&
+ git log -1 --format="%GX %G" >actual &&
+ test_cmp expect actual
+'
+
test_done
diff --git a/t/t6039-merge-ignorecase.sh b/t/t6039-merge-ignorecase.sh
new file mode 100755
index 0000000000..a977653147
--- /dev/null
+++ b/t/t6039-merge-ignorecase.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+test_description='git-merge with case-changing rename on case-insensitive file system'
+
+. ./test-lib.sh
+
+if ! test_have_prereq CASE_INSENSITIVE_FS
+then
+ skip_all='skipping case insensitive tests - case sensitive file system'
+ test_done
+fi
+
+test_expect_success 'merge with case-changing rename' '
+ test $(git config core.ignorecase) = true &&
+ >TestCase &&
+ git add TestCase &&
+ git commit -m "add TestCase" &&
+ git tag baseline
+ git checkout -b with-camel &&
+ >foo &&
+ git add foo &&
+ git commit -m "intervening commit" &&
+ git checkout master &&
+ git rm TestCase &&
+ >testcase &&
+ git add testcase &&
+ git commit -m "rename to testcase" &&
+ git checkout with-camel &&
+ git merge master -m "merge" &&
+ test_path_is_file testcase
+'
+
+test_expect_success 'merge with case-changing rename on both sides' '
+ git checkout master &&
+ git reset --hard baseline &&
+ git branch -D with-camel &&
+ git checkout -b with-camel &&
+ git mv TestCase testcase &&
+ git commit -m "recase on branch" &&
+ >foo &&
+ git add foo &&
+ git commit -m "intervening commit" &&
+ git checkout master &&
+ git rm TestCase &&
+ >testcase &&
+ git add testcase &&
+ git commit -m "rename to testcase" &&
+ git checkout with-camel &&
+ git merge master -m "merge" &&
+ test_path_is_file testcase
+'
+
+test_done
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index c8ff9115ec..54d78079e8 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -447,8 +447,7 @@ test_expect_success 'checking out a commit before submodule moved needs manual u
git mv sub sub2 &&
git commit -m "moved sub to sub2" &&
git checkout -q HEAD^ 2>actual &&
- echo "warning: unable to rmdir sub2: Directory not empty" >expected &&
- test_i18ncmp expected actual &&
+ test_i18ngrep "^warning: unable to rmdir sub2:" actual &&
git status -s sub2 >actual &&
echo "?? sub2/" >expected &&
test_cmp expected actual &&
diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh
index 9496736a89..66643e4bd7 100755
--- a/t/t7003-filter-branch.sh
+++ b/t/t7003-filter-branch.sh
@@ -308,6 +308,17 @@ test_expect_success 'Prune empty commits' '
test_cmp expect actual
'
+test_expect_success 'prune empty collapsed merges' '
+ test_config merge.ff false &&
+ git rev-list HEAD >expect &&
+ test_commit to_remove_2 &&
+ git reset --hard HEAD^ &&
+ test_merge non-ff to_remove_2 &&
+ git filter-branch -f --index-filter "git update-index --remove to_remove_2.t" --prune-empty HEAD &&
+ git rev-list HEAD >actual &&
+ test_cmp expect actual
+'
+
test_expect_success '--remap-to-ancestor with filename filters' '
git checkout master &&
git reset --hard A &&
diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
index c8d6e9f88c..143a8ea605 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh
@@ -1380,4 +1380,47 @@ test_expect_success 'multiple --points-at are OR-ed together' '
test_cmp expect actual
'
+test_expect_success 'lexical sort' '
+ git tag foo1.3 &&
+ git tag foo1.6 &&
+ git tag foo1.10 &&
+ git tag -l --sort=refname "foo*" >actual &&
+ cat >expect <<EOF &&
+foo1.10
+foo1.3
+foo1.6
+EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'version sort' '
+ git tag -l --sort=version:refname "foo*" >actual &&
+ cat >expect <<EOF &&
+foo1.3
+foo1.6
+foo1.10
+EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'reverse version sort' '
+ git tag -l --sort=-version:refname "foo*" >actual &&
+ cat >expect <<EOF &&
+foo1.10
+foo1.6
+foo1.3
+EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'reverse lexical sort' '
+ git tag -l --sort=-refname "foo*" >actual &&
+ cat >expect <<EOF &&
+foo1.6
+foo1.3
+foo1.10
+EOF
+ test_cmp expect actual
+'
+
test_done
diff --git a/t/t7006-pager.sh b/t/t7006-pager.sh
index b9365b431d..da958a8b56 100755
--- a/t/t7006-pager.sh
+++ b/t/t7006-pager.sh
@@ -146,11 +146,7 @@ test_expect_success 'no color when stdout is a regular file' '
test_expect_success TTY 'color when writing to a pager' '
rm -f paginated.out &&
test_config color.ui auto &&
- (
- TERM=vt100 &&
- export TERM &&
- test_terminal git log
- ) &&
+ test_terminal env TERM=vt100 git log &&
colorful paginated.out
'
@@ -158,11 +154,7 @@ test_expect_success TTY 'colors are suppressed by color.pager' '
rm -f paginated.out &&
test_config color.ui auto &&
test_config color.pager false &&
- (
- TERM=vt100 &&
- export TERM &&
- test_terminal git log
- ) &&
+ test_terminal env TERM=vt100 git log &&
! colorful paginated.out
'
@@ -181,11 +173,7 @@ test_expect_success 'color when writing to a file intended for a pager' '
test_expect_success TTY 'colors are sent to pager for external commands' '
test_config alias.externallog "!git log" &&
test_config color.ui auto &&
- (
- TERM=vt100 &&
- export TERM &&
- test_terminal git -p externallog
- ) &&
+ test_terminal env TERM=vt100 git -p externallog &&
colorful paginated.out
'
diff --git a/t/t7007-show.sh b/t/t7007-show.sh
index e41fa00b80..1b824fe5ed 100755
--- a/t/t7007-show.sh
+++ b/t/t7007-show.sh
@@ -24,7 +24,8 @@ test_expect_success 'set up a bit of history' '
git tag -m "annotated tag" annotated &&
git checkout -b side HEAD^^ &&
test_commit side2 &&
- test_commit side3
+ test_commit side3 &&
+ test_merge merge main3
'
test_expect_success 'showing two commits' '
@@ -109,8 +110,11 @@ test_expect_success 'showing range' '
'
test_expect_success '-s suppresses diff' '
- echo main3 >expect &&
- git show -s --format=%s main3 >actual &&
+ cat >expect <<-\EOF &&
+ merge
+ main3
+ EOF
+ git show -s --format=%s merge main3 >actual &&
test_cmp expect actual
'
diff --git a/t/t7101-reset.sh b/t/t7101-reset-empty-subdirs.sh
index 96e163f084..96e163f084 100755
--- a/t/t7101-reset.sh
+++ b/t/t7101-reset-empty-subdirs.sh
diff --git a/t/t7102-reset.sh b/t/t7102-reset.sh
index ee117e2e72..ee703bed64 100755
--- a/t/t7102-reset.sh
+++ b/t/t7102-reset.sh
@@ -22,6 +22,9 @@ commit_msg () {
fi
}
+# Tested non-UTF-8 encoding
+test_encoding="ISO8859-1"
+
test_expect_success 'creating initial files and commits' '
test_tick &&
echo "1st file" >first &&
@@ -41,7 +44,7 @@ test_expect_success 'creating initial files and commits' '
echo "1st line 2nd file" >secondfile &&
echo "2nd line 2nd file" >>secondfile &&
- git -c "i18n.commitEncoding=iso8859-1" commit -a -m "$(commit_msg iso8859-1)" &&
+ git -c "i18n.commitEncoding=$test_encoding" commit -a -m "$(commit_msg $test_encoding)" &&
head5=$(git rev-parse --verify HEAD)
'
# git log --pretty=oneline # to see those SHA1 involved
@@ -64,10 +67,10 @@ test_expect_success 'reset --hard message' '
test_cmp .expected .actual
'
-test_expect_success 'reset --hard message (iso8859-1 logoutputencoding)' '
+test_expect_success 'reset --hard message (ISO8859-1 logoutputencoding)' '
hex=$(git log -1 --format="%h") &&
- git -c "i18n.logOutputEncoding=iso8859-1" reset --hard > .actual &&
- echo HEAD is now at $hex $(commit_msg iso8859-1) > .expected &&
+ git -c "i18n.logOutputEncoding=$test_encoding" reset --hard > .actual &&
+ echo HEAD is now at $hex $(commit_msg $test_encoding) > .expected &&
test_cmp .expected .actual
'
@@ -331,7 +334,7 @@ test_expect_success 'redoing the last two commits should succeed' '
echo "1st line 2nd file" >secondfile &&
echo "2nd line 2nd file" >>secondfile &&
- git -c "i18n.commitEncoding=iso8859-1" commit -a -m "$(commit_msg iso8859-1)" &&
+ git -c "i18n.commitEncoding=$test_encoding" commit -a -m "$(commit_msg $test_encoding)" &&
check_changes $head5
'
@@ -535,6 +538,21 @@ test_expect_success 'reset with paths accepts tree' '
git diff HEAD --exit-code
'
+test_expect_success 'reset -N keeps removed files as intent-to-add' '
+ echo new-file >new-file &&
+ git add new-file &&
+ git reset -N HEAD &&
+
+ tree=$(git write-tree) &&
+ git ls-tree $tree new-file >actual &&
+ >expect &&
+ test_cmp expect actual &&
+
+ git diff --name-only >actual &&
+ echo new-file >expect &&
+ test_cmp expect actual
+'
+
test_expect_success 'reset --mixed sets up work tree' '
git init mixed_worktree &&
(
diff --git a/t/t7104-reset.sh b/t/t7104-reset-hard.sh
index 16faa07813..16faa07813 100755
--- a/t/t7104-reset.sh
+++ b/t/t7104-reset-hard.sh
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index c28e8d8ada..7c88245031 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -249,8 +249,7 @@ test_expect_success 'submodule add in subdirectory with relative path should fai
'
test_expect_success 'setup - add an example entry to .gitmodules' '
- GIT_CONFIG=.gitmodules \
- git config submodule.example.url git://example.com/init.git
+ git config --file=.gitmodules submodule.example.url git://example.com/init.git
'
test_expect_success 'status should fail for unmapped paths' '
@@ -264,7 +263,7 @@ test_expect_success 'setup - map path in .gitmodules' '
path = init
EOF
- GIT_CONFIG=.gitmodules git config submodule.example.path init &&
+ git config --file=.gitmodules submodule.example.path init &&
test_cmp expect .gitmodules
'
diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh
index 0246e80b1a..29d3d2cca0 100755
--- a/t/t7406-submodule-update.sh
+++ b/t/t7406-submodule-update.sh
@@ -774,5 +774,4 @@ test_expect_success 'submodule update --recursive drops module name before recur
test_i18ngrep "Submodule path .deeper/submodule/subsubmodule.: checked out" actual
)
'
-
test_done
diff --git a/t/t7500-commit.sh b/t/t7500-commit.sh
index bdc1f29503..116885a260 100755
--- a/t/t7500-commit.sh
+++ b/t/t7500-commit.sh
@@ -223,7 +223,8 @@ test_expect_success 'Commit without message is allowed with --allow-empty-messag
git add foo &&
>empty &&
git commit --allow-empty-message <empty &&
- commit_msg_is ""
+ commit_msg_is "" &&
+ git tag empty-message-commit
'
test_expect_success 'Commit without message is no-no without --allow-empty-message' '
@@ -240,6 +241,14 @@ test_expect_success 'Commit a message with --allow-empty-message' '
commit_msg_is "hello there"
'
+test_expect_success 'commit -C empty respects --allow-empty-message' '
+ echo more >>foo &&
+ git add foo &&
+ test_must_fail git commit -C empty-message-commit &&
+ git commit -C empty-message-commit --allow-empty-message &&
+ commit_msg_is ""
+'
+
commit_for_rebase_autosquash_setup () {
echo "first content line" >>foo &&
git add foo &&
diff --git a/t/t7501-commit.sh b/t/t7501-commit.sh
index 94eec83b37..d58b097ff3 100755
--- a/t/t7501-commit.sh
+++ b/t/t7501-commit.sh
@@ -61,11 +61,47 @@ test_expect_success 'nothing to commit' '
test_must_fail git commit -m initial
'
+test_expect_success '--dry-run fails with nothing to commit' '
+ test_must_fail git commit -m initial --dry-run
+'
+
+test_expect_success '--short fails with nothing to commit' '
+ test_must_fail git commit -m initial --short
+'
+
+test_expect_success '--porcelain fails with nothing to commit' '
+ test_must_fail git commit -m initial --porcelain
+'
+
+test_expect_success '--long fails with nothing to commit' '
+ test_must_fail git commit -m initial --long
+'
+
test_expect_success 'setup: non-initial commit' '
echo bongo bongo bongo >file &&
git commit -m next -a
'
+test_expect_success '--dry-run with stuff to commit returns ok' '
+ echo bongo bongo bongo >>file &&
+ git commit -m next -a --dry-run
+'
+
+test_expect_failure '--short with stuff to commit returns ok' '
+ echo bongo bongo bongo >>file &&
+ git commit -m next -a --short
+'
+
+test_expect_failure '--porcelain with stuff to commit returns ok' '
+ echo bongo bongo bongo >>file &&
+ git commit -m next -a --porcelain
+'
+
+test_expect_success '--long with stuff to commit returns ok' '
+ echo bongo bongo bongo >>file &&
+ git commit -m next -a --long
+'
+
test_expect_success 'commit message from non-existing file' '
echo more bongo: bongo bongo bongo bongo >file &&
test_must_fail git commit -F gah -a
diff --git a/t/t7502-commit.sh b/t/t7502-commit.sh
index 6313da2cdd..9a3f3a1b41 100755
--- a/t/t7502-commit.sh
+++ b/t/t7502-commit.sh
@@ -223,6 +223,22 @@ test_expect_success 'cleanup commit messages (whitespace option,-F)' '
'
+test_expect_success 'cleanup commit messages (scissors option,-F,-e)' '
+
+ echo >>negative &&
+ cat >text <<EOF &&
+
+# to be kept
+# ------------------------ >8 ------------------------
+to be removed
+EOF
+ echo "# to be kept" >expect &&
+ git commit --cleanup=scissors -e -F text -a &&
+ git cat-file -p HEAD |sed -e "1,/^\$/d">actual &&
+ test_cmp expect actual
+
+'
+
test_expect_success 'cleanup commit messages (strip option,-F)' '
echo >>negative &&
diff --git a/t/t7508-status.sh b/t/t7508-status.sh
index c987b5ed65..d48006960e 100755
--- a/t/t7508-status.sh
+++ b/t/t7508-status.sh
@@ -1380,7 +1380,32 @@ EOF
test_i18ncmp expect output
'
-test_expect_success '.gitmodules ignore=all suppresses submodule summary' '
+test_expect_success '.gitmodules ignore=all suppresses unstaged submodule summary' '
+ cat > expect << EOF &&
+On branch master
+Changes to be committed:
+ (use "git reset HEAD <file>..." to unstage)
+
+ modified: sm
+
+Changes not staged for commit:
+ (use "git add <file>..." to update what will be committed)
+ (use "git checkout -- <file>..." to discard changes in working directory)
+
+ modified: dir1/modified
+
+Untracked files:
+ (use "git add <file>..." to include in what will be committed)
+
+ .gitmodules
+ dir1/untracked
+ dir2/modified
+ dir2/untracked
+ expect
+ output
+ untracked
+
+EOF
git config --add -f .gitmodules submodule.subname.ignore all &&
git config --add -f .gitmodules submodule.subname.path sm &&
git status > output &&
@@ -1388,7 +1413,7 @@ test_expect_success '.gitmodules ignore=all suppresses submodule summary' '
git config -f .gitmodules --remove-section submodule.subname
'
-test_expect_success '.git/config ignore=all suppresses submodule summary' '
+test_expect_success '.git/config ignore=all suppresses unstaged submodule summary' '
git config --add -f .gitmodules submodule.subname.ignore none &&
git config --add -f .gitmodules submodule.subname.path sm &&
git config --add submodule.subname.ignore all &&
@@ -1461,4 +1486,49 @@ test_expect_success 'Restore default test environment' '
git config --unset status.showUntrackedFiles
'
+test_expect_success 'git commit will commit a staged but ignored submodule' '
+ git config --add -f .gitmodules submodule.subname.ignore all &&
+ git config --add -f .gitmodules submodule.subname.path sm &&
+ git config --add submodule.subname.ignore all &&
+ git status -s --ignore-submodules=dirty >output &&
+ test_i18ngrep "^M. sm" output &&
+ GIT_EDITOR="echo hello >>\"\$1\"" &&
+ export GIT_EDITOR &&
+ git commit -uno &&
+ git status -s --ignore-submodules=dirty >output &&
+ test_i18ngrep ! "^M. sm" output
+'
+
+test_expect_success 'git commit --dry-run will show a staged but ignored submodule' '
+ git reset HEAD^ &&
+ git add sm &&
+ cat >expect << EOF &&
+On branch master
+Changes to be committed:
+ (use "git reset HEAD <file>..." to unstage)
+
+ modified: sm
+
+Changes not staged for commit:
+ (use "git add <file>..." to update what will be committed)
+ (use "git checkout -- <file>..." to discard changes in working directory)
+
+ modified: dir1/modified
+
+Untracked files not listed (use -u option to show untracked files)
+EOF
+ git commit -uno --dry-run >output &&
+ test_i18ncmp expect output &&
+ git status -s --ignore-submodules=dirty >output &&
+ test_i18ngrep "^M. sm" output
+'
+
+test_expect_success 'git commit -m will commit a staged but ignored submodule' '
+ git commit -uno -m message &&
+ git status -s --ignore-submodules=dirty >output &&
+ test_i18ngrep ! "^M. sm" output &&
+ git config --remove-section submodule.subname &&
+ git config -f .gitmodules --remove-section submodule.subname
+'
+
test_done
diff --git a/t/t7509-commit.sh b/t/t7509-commit.sh
index b61fd3c3c4..9ac794052d 100755
--- a/t/t7509-commit.sh
+++ b/t/t7509-commit.sh
@@ -77,6 +77,7 @@ test_expect_success '--amend option copies authorship' '
git commit -a --amend -m "amend test" &&
author_header Initial >expect &&
author_header HEAD >actual &&
+ test_cmp expect actual &&
echo "amend test" >expect &&
message_body HEAD >actual &&
diff --git a/t/t7510-signed-commit.sh b/t/t7510-signed-commit.sh
index 1d3c56fe61..e97477a3b9 100755
--- a/t/t7510-signed-commit.sh
+++ b/t/t7510-signed-commit.sh
@@ -5,6 +5,8 @@ test_description='signed commit tests'
. "$TEST_DIRECTORY/lib-gpg.sh"
test_expect_success GPG 'create signed commits' '
+ test_when_finished "test_unconfig commit.gpgsign" &&
+
echo 1 >file && git add file &&
test_tick && git commit -S -m initial &&
git tag initial &&
@@ -25,34 +27,62 @@ test_expect_success GPG 'create signed commits' '
git tag fourth-unsigned &&
test_tick && git commit --amend -S -m "fourth signed" &&
- git tag fourth-signed
+ git tag fourth-signed &&
+
+ git config commit.gpgsign true &&
+ echo 5 >file && test_tick && git commit -a -m "fifth signed" &&
+ git tag fifth-signed &&
+
+ git config commit.gpgsign false &&
+ echo 6 >file && test_tick && git commit -a -m "sixth" &&
+ git tag sixth-unsigned &&
+
+ git config commit.gpgsign true &&
+ echo 7 >file && test_tick && git commit -a -m "seventh" --no-gpg-sign &&
+ git tag seventh-unsigned &&
+
+ test_tick && git rebase -f HEAD^^ && git tag sixth-signed HEAD^ &&
+ git tag seventh-signed
+
+ echo 8 >file && test_tick && git commit -a -m eighth -SB7227189 &&
+ git tag eighth-signed-alt
'
test_expect_success GPG 'show signatures' '
(
- for commit in initial second merge master
+ for commit in initial second merge fourth-signed fifth-signed sixth-signed seventh-signed
+ do
+ git show --pretty=short --show-signature $commit >actual &&
+ grep "Good signature from" actual &&
+ ! grep "BAD signature from" actual &&
+ echo $commit OK || exit 1
+ done
+ ) &&
+ (
+ for commit in merge^2 fourth-unsigned sixth-unsigned seventh-unsigned
do
git show --pretty=short --show-signature $commit >actual &&
- grep "Good signature from" actual || exit 1
- ! grep "BAD signature from" actual || exit 1
- echo $commit OK
+ ! grep "Good signature from" actual &&
+ ! grep "BAD signature from" actual &&
+ echo $commit OK || exit 1
done
) &&
(
- for commit in merge^2 fourth-unsigned
+ for commit in eighth-signed-alt
do
git show --pretty=short --show-signature $commit >actual &&
- grep "Good signature from" actual && exit 1
- ! grep "BAD signature from" actual || exit 1
- echo $commit OK
+ grep "Good signature from" actual &&
+ ! grep "BAD signature from" actual &&
+ grep "not certified" actual &&
+ echo $commit OK || exit 1
done
)
'
test_expect_success GPG 'detect fudged signature' '
- git cat-file commit master >raw &&
+ git cat-file commit seventh-signed >raw &&
- sed -e "s/fourth signed/4th forged/" raw >forged1 &&
+ sed -e "s/seventh/7th forged/" raw >forged1 &&
git hash-object -w -t commit forged1 >forged1.commit &&
git show --pretty=short --show-signature $(cat forged1.commit) >actual1 &&
grep "BAD signature from" actual1 &&
@@ -60,7 +90,7 @@ test_expect_success GPG 'detect fudged signature' '
'
test_expect_success GPG 'detect fudged signature with NUL' '
- git cat-file commit master >raw &&
+ git cat-file commit seventh-signed >raw &&
cat raw >forged2 &&
echo Qwik | tr "Q" "\000" >>forged2 &&
git hash-object -w -t commit forged2 >forged2.commit &&
@@ -77,4 +107,44 @@ test_expect_success GPG 'amending already signed commit' '
! grep "BAD signature from" actual
'
+test_expect_success GPG 'show good signature with custom format' '
+ cat >expect <<-\EOF &&
+ G
+ 13B6F51ECDDE430D
+ C O Mitter <committer@example.com>
+ EOF
+ git log -1 --format="%G?%n%GK%n%GS" sixth-signed >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success GPG 'show bad signature with custom format' '
+ cat >expect <<-\EOF &&
+ B
+ 13B6F51ECDDE430D
+ C O Mitter <committer@example.com>
+ EOF
+ git log -1 --format="%G?%n%GK%n%GS" $(cat forged1.commit) >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success GPG 'show unknown signature with custom format' '
+ cat >expect <<-\EOF &&
+ U
+ 61092E85B7227189
+ Eris Discordia <discord@example.net>
+ EOF
+ git log -1 --format="%G?%n%GK%n%GS" eighth-signed-alt >actual &&
+ test_cmp expect actual
+'
+
+test_expect_success GPG 'show lack of signature with custom format' '
+ cat >expect <<-\EOF &&
+ N
+
+
+ EOF
+ git log -1 --format="%G?%n%GK%n%GS" seventh-unsigned >actual &&
+ test_cmp expect actual
+'
+
test_done
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
index 10aa028017..b16462132f 100755
--- a/t/t7600-merge.sh
+++ b/t/t7600-merge.sh
@@ -57,11 +57,10 @@ create_merge_msgs () {
git log --no-merges ^HEAD c2 c3
} >squash.1-5-9 &&
: >msg.nologff &&
- echo >msg.nolognoff &&
+ : >msg.nolognoff &&
{
echo "* tag 'c3':" &&
- echo " commit 3" &&
- echo
+ echo " commit 3"
} >msg.log
}
@@ -71,7 +70,7 @@ verify_merge () {
git diff --exit-code &&
if test -n "$3"
then
- git show -s --pretty=format:%s HEAD >msg.act &&
+ git show -s --pretty=tformat:%s HEAD >msg.act &&
test_cmp "$3" msg.act
fi
}
@@ -620,10 +619,10 @@ test_expect_success 'merge early part of c2' '
git tag c6 &&
git branch -f c5-branch c5 &&
git merge c5-branch~1 &&
- git show -s --pretty=format:%s HEAD >actual.branch &&
+ git show -s --pretty=tformat:%s HEAD >actual.branch &&
git reset --keep HEAD^ &&
git merge c5~1 &&
- git show -s --pretty=format:%s HEAD >actual.tag &&
+ git show -s --pretty=tformat:%s HEAD >actual.tag &&
test_cmp expected.branch actual.branch &&
test_cmp expected.tag actual.tag
'
diff --git a/t/t7601-merge-pull-config.sh b/t/t7601-merge-pull-config.sh
index 830a4c3e9d..f768c900ab 100755
--- a/t/t7601-merge-pull-config.sh
+++ b/t/t7601-merge-pull-config.sh
@@ -38,6 +38,27 @@ test_expect_success 'merge c1 with c2' '
test -f c2.c
'
+test_expect_success 'fast-forward pull succeeds with "true" in pull.ff' '
+ git reset --hard c0 &&
+ test_config pull.ff true &&
+ git pull . c1 &&
+ test "$(git rev-parse HEAD)" = "$(git rev-parse c1)"
+'
+
+test_expect_success 'fast-forward pull creates merge with "false" in pull.ff' '
+ git reset --hard c0 &&
+ test_config pull.ff false &&
+ git pull . c1 &&
+ test "$(git rev-parse HEAD^1)" = "$(git rev-parse c0)" &&
+ test "$(git rev-parse HEAD^2)" = "$(git rev-parse c1)"
+'
+
+test_expect_success 'pull prevents non-fast-forward with "only" in pull.ff' '
+ git reset --hard c1 &&
+ test_config pull.ff only &&
+ test_must_fail git pull . c3
+'
+
test_expect_success 'merge c1 with c2 (ours in pull.twohead)' '
git reset --hard c1 &&
git config pull.twohead ours &&
diff --git a/t/t7700-repack.sh b/t/t7700-repack.sh
index b45bd1e76c..61e6ed37aa 100755
--- a/t/t7700-repack.sh
+++ b/t/t7700-repack.sh
@@ -21,7 +21,7 @@ test_expect_success 'objects in packs marked .keep are not repacked' '
objsha1=$(git verify-pack -v pack-$packsha1.idx | head -n 1 |
sed -e "s/^\([0-9a-f]\{40\}\).*/\1/") &&
mv pack-* .git/objects/pack/ &&
- git repack -A -d -l &&
+ git repack --no-pack-kept-objects -A -d -l &&
git prune-packed &&
for p in .git/objects/pack/*.idx; do
idx=$(basename $p)
@@ -35,6 +35,38 @@ test_expect_success 'objects in packs marked .keep are not repacked' '
test -z "$found_duplicate_object"
'
+test_expect_success 'writing bitmaps via command-line can duplicate .keep objects' '
+ # build on $objsha1, $packsha1, and .keep state from previous
+ git repack -Adbl &&
+ test_when_finished "found_duplicate_object=" &&
+ for p in .git/objects/pack/*.idx; do
+ idx=$(basename $p)
+ test "pack-$packsha1.idx" = "$idx" && continue
+ if git verify-pack -v $p | egrep "^$objsha1"; then
+ found_duplicate_object=1
+ echo "DUPLICATE OBJECT FOUND"
+ break
+ fi
+ done &&
+ test "$found_duplicate_object" = 1
+'
+
+test_expect_success 'writing bitmaps via config can duplicate .keep objects' '
+ # build on $objsha1, $packsha1, and .keep state from previous
+ git -c pack.writebitmaps=true repack -Adl &&
+ test_when_finished "found_duplicate_object=" &&
+ for p in .git/objects/pack/*.idx; do
+ idx=$(basename $p)
+ test "pack-$packsha1.idx" = "$idx" && continue
+ if git verify-pack -v $p | egrep "^$objsha1"; then
+ found_duplicate_object=1
+ echo "DUPLICATE OBJECT FOUND"
+ break
+ fi
+ done &&
+ test "$found_duplicate_object" = 1
+'
+
test_expect_success 'loose objects in alternate ODB are not repacked' '
mkdir alt_objects &&
echo `pwd`/alt_objects > .git/objects/info/alternates &&
diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh
index f698001c99..40615debc4 100755
--- a/t/t7810-grep.sh
+++ b/t/t7810-grep.sh
@@ -105,7 +105,7 @@ do
test_expect_success "grep -w $L (w)" '
: >expected &&
- test_must_fail git grep -n -w -e "^w" >actual &&
+ test_must_fail git grep -n -w -e "^w" $H >actual &&
test_cmp expected actual
'
@@ -240,92 +240,104 @@ do
test_cmp expected actual
'
test_expect_success "grep $L with grep.extendedRegexp=false" '
- echo "ab:a+bc" >expected &&
- git -c grep.extendedRegexp=false grep "a+b*c" ab >actual &&
+ echo "${HC}ab:a+bc" >expected &&
+ git -c grep.extendedRegexp=false grep "a+b*c" $H ab >actual &&
test_cmp expected actual
'
test_expect_success "grep $L with grep.extendedRegexp=true" '
- echo "ab:abc" >expected &&
- git -c grep.extendedRegexp=true grep "a+b*c" ab >actual &&
+ echo "${HC}ab:abc" >expected &&
+ git -c grep.extendedRegexp=true grep "a+b*c" $H ab >actual &&
test_cmp expected actual
'
test_expect_success "grep $L with grep.patterntype=basic" '
- echo "ab:a+bc" >expected &&
- git -c grep.patterntype=basic grep "a+b*c" ab >actual &&
+ echo "${HC}ab:a+bc" >expected &&
+ git -c grep.patterntype=basic grep "a+b*c" $H ab >actual &&
test_cmp expected actual
'
test_expect_success "grep $L with grep.patterntype=extended" '
- echo "ab:abc" >expected &&
- git -c grep.patterntype=extended grep "a+b*c" ab >actual &&
+ echo "${HC}ab:abc" >expected &&
+ git -c grep.patterntype=extended grep "a+b*c" $H ab >actual &&
test_cmp expected actual
'
test_expect_success "grep $L with grep.patterntype=fixed" '
- echo "ab:a+b*c" >expected &&
- git -c grep.patterntype=fixed grep "a+b*c" ab >actual &&
+ echo "${HC}ab:a+b*c" >expected &&
+ git -c grep.patterntype=fixed grep "a+b*c" $H ab >actual &&
test_cmp expected actual
'
test_expect_success LIBPCRE "grep $L with grep.patterntype=perl" '
- echo "ab:a+b*c" >expected &&
- git -c grep.patterntype=perl grep "a\x{2b}b\x{2a}c" ab >actual &&
+ echo "${HC}ab:a+b*c" >expected &&
+ git -c grep.patterntype=perl grep "a\x{2b}b\x{2a}c" $H ab >actual &&
test_cmp expected actual
'
test_expect_success "grep $L with grep.patternType=default and grep.extendedRegexp=true" '
- echo "ab:abc" >expected &&
+ echo "${HC}ab:abc" >expected &&
git \
-c grep.patternType=default \
-c grep.extendedRegexp=true \
- grep "a+b*c" ab >actual &&
+ grep "a+b*c" $H ab >actual &&
test_cmp expected actual
'
test_expect_success "grep $L with grep.extendedRegexp=true and grep.patternType=default" '
- echo "ab:abc" >expected &&
+ echo "${HC}ab:abc" >expected &&
git \
-c grep.extendedRegexp=true \
-c grep.patternType=default \
- grep "a+b*c" ab >actual &&
+ grep "a+b*c" $H ab >actual &&
test_cmp expected actual
'
- test_expect_success 'grep $L with grep.patternType=extended and grep.extendedRegexp=false' '
- echo "ab:abc" >expected &&
+ test_expect_success "grep $L with grep.patternType=extended and grep.extendedRegexp=false" '
+ echo "${HC}ab:abc" >expected &&
git \
-c grep.patternType=extended \
-c grep.extendedRegexp=false \
- grep "a+b*c" ab >actual &&
+ grep "a+b*c" $H ab >actual &&
test_cmp expected actual
'
- test_expect_success 'grep $L with grep.patternType=basic and grep.extendedRegexp=true' '
- echo "ab:a+bc" >expected &&
+ test_expect_success "grep $L with grep.patternType=basic and grep.extendedRegexp=true" '
+ echo "${HC}ab:a+bc" >expected &&
git \
-c grep.patternType=basic \
-c grep.extendedRegexp=true \
- grep "a+b*c" ab >actual &&
+ grep "a+b*c" $H ab >actual &&
test_cmp expected actual
'
- test_expect_success 'grep $L with grep.extendedRegexp=false and grep.patternType=extended' '
- echo "ab:abc" >expected &&
+ test_expect_success "grep $L with grep.extendedRegexp=false and grep.patternType=extended" '
+ echo "${HC}ab:abc" >expected &&
git \
-c grep.extendedRegexp=false \
-c grep.patternType=extended \
- grep "a+b*c" ab >actual &&
+ grep "a+b*c" $H ab >actual &&
test_cmp expected actual
'
- test_expect_success 'grep $L with grep.extendedRegexp=true and grep.patternType=basic' '
- echo "ab:a+bc" >expected &&
+ test_expect_success "grep $L with grep.extendedRegexp=true and grep.patternType=basic" '
+ echo "${HC}ab:a+bc" >expected &&
git \
-c grep.extendedRegexp=true \
-c grep.patternType=basic \
- grep "a+b*c" ab >actual &&
+ grep "a+b*c" $H ab >actual &&
+ test_cmp expected actual
+ '
+
+ test_expect_success "grep --count $L" '
+ echo ${HC}ab:3 >expected &&
+ git grep --count -e b $H -- ab >actual &&
+ test_cmp expected actual
+ '
+
+ test_expect_success "grep --count -h $L" '
+ echo 3 >expected &&
+ git grep --count -h -e b $H -- ab >actual &&
test_cmp expected actual
'
done
@@ -1084,11 +1096,6 @@ test_expect_success 'grep -E pattern with grep.patternType=fixed' '
test_cmp expected actual
'
-test_config() {
- git config "$1" "$2" &&
- test_when_finished "git config --unset $1"
-}
-
cat >expected <<EOF
hello.c<RED>:<RESET>int main(int argc, const char **argv)
hello.c<RED>-<RESET>{
diff --git a/t/t8003-blame-corner-cases.sh b/t/t8003-blame-corner-cases.sh
index e7cac1db55..2a3469bcbe 100755
--- a/t/t8003-blame-corner-cases.sh
+++ b/t/t8003-blame-corner-cases.sh
@@ -191,4 +191,13 @@ test_expect_success 'indent of line numbers, ten lines' '
test $(grep -c " " actual) = 9
'
+test_expect_success 'blaming files with CRLF newlines' '
+ git config core.autocrlf false &&
+ printf "testcase\r\n" >crlffile &&
+ git add crlffile &&
+ git commit -m testcase &&
+ git -c core.autocrlf=input blame crlffile >actual &&
+ grep "A U Thor" actual
+'
+
test_done
diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
index 3119c8c523..1ecdacb6fd 100755
--- a/t/t9001-send-email.sh
+++ b/t/t9001-send-email.sh
@@ -409,7 +409,7 @@ test_expect_success $PREREQ 'Valid In-Reply-To when prompting' '
(echo "From Example <from@example.com>"
echo "To Example <to@example.com>"
echo ""
- ) | env GIT_SEND_EMAIL_NOTTY=1 git send-email \
+ ) | GIT_SEND_EMAIL_NOTTY=1 git send-email \
--smtp-server="$(pwd)/fake.sendmail" \
$patches 2>errors &&
! grep "^In-Reply-To: < *>" msgtxt1
diff --git a/t/t9107-git-svn-migrate.sh b/t/t9107-git-svn-migrate.sh
index ee73013eed..6e69fc4c65 100755
--- a/t/t9107-git-svn-migrate.sh
+++ b/t/t9107-git-svn-migrate.sh
@@ -45,27 +45,27 @@ test_expect_success 'initialize old-style (v0) git svn layout' '
test_expect_success 'initialize a multi-repository repo' '
git svn init "$svnrepo" -T trunk -t tags -b branches &&
git config --get-all svn-remote.svn.fetch > fetch.out &&
- grep "^trunk:refs/remotes/trunk$" fetch.out &&
+ grep "^trunk:refs/remotes/origin/trunk$" fetch.out &&
test -n "`git config --get svn-remote.svn.branches \
- "^branches/\*:refs/remotes/\*$"`" &&
+ "^branches/\*:refs/remotes/origin/\*$"`" &&
test -n "`git config --get svn-remote.svn.tags \
- "^tags/\*:refs/remotes/tags/\*$"`" &&
+ "^tags/\*:refs/remotes/origin/tags/\*$"`" &&
git config --unset svn-remote.svn.branches \
- "^branches/\*:refs/remotes/\*$" &&
+ "^branches/\*:refs/remotes/origin/\*$" &&
git config --unset svn-remote.svn.tags \
- "^tags/\*:refs/remotes/tags/\*$" &&
- git config --add svn-remote.svn.fetch "branches/a:refs/remotes/a" &&
- git config --add svn-remote.svn.fetch "branches/b:refs/remotes/b" &&
+ "^tags/\*:refs/remotes/origin/tags/\*$" &&
+ git config --add svn-remote.svn.fetch "branches/a:refs/remotes/origin/a" &&
+ git config --add svn-remote.svn.fetch "branches/b:refs/remotes/origin/b" &&
for i in tags/0.1 tags/0.2 tags/0.3; do
git config --add svn-remote.svn.fetch \
- $i:refs/remotes/$i || exit 1; done &&
+ $i:refs/remotes/origin/$i || exit 1; done &&
git config --get-all svn-remote.svn.fetch > fetch.out &&
- grep "^trunk:refs/remotes/trunk$" fetch.out &&
- grep "^branches/a:refs/remotes/a$" fetch.out &&
- grep "^branches/b:refs/remotes/b$" fetch.out &&
- grep "^tags/0\.1:refs/remotes/tags/0\.1$" fetch.out &&
- grep "^tags/0\.2:refs/remotes/tags/0\.2$" fetch.out &&
- grep "^tags/0\.3:refs/remotes/tags/0\.3$" fetch.out &&
+ grep "^trunk:refs/remotes/origin/trunk$" fetch.out &&
+ grep "^branches/a:refs/remotes/origin/a$" fetch.out &&
+ grep "^branches/b:refs/remotes/origin/b$" fetch.out &&
+ grep "^tags/0\.1:refs/remotes/origin/tags/0\.1$" fetch.out &&
+ grep "^tags/0\.2:refs/remotes/origin/tags/0\.2$" fetch.out &&
+ grep "^tags/0\.3:refs/remotes/origin/tags/0\.3$" fetch.out &&
grep "^:refs/${remotes_git_svn}" fetch.out
'
@@ -73,14 +73,14 @@ test_expect_success 'initialize a multi-repository repo' '
test_expect_success 'multi-fetch works on partial urls + paths' "
git svn multi-fetch &&
for i in trunk a b tags/0.1 tags/0.2 tags/0.3; do
- git rev-parse --verify refs/remotes/\$i^0 >> refs.out || exit 1;
+ git rev-parse --verify refs/remotes/origin/\$i^0 >> refs.out || exit 1;
done &&
test -z \"\`sort < refs.out | uniq -d\`\" &&
for i in trunk a b tags/0.1 tags/0.2 tags/0.3; do
for j in trunk a b tags/0.1 tags/0.2 tags/0.3; do
if test \$j != \$i; then continue; fi
- test -z \"\`git diff refs/remotes/\$i \
- refs/remotes/\$j\`\" ||exit 1; done; done
+ test -z \"\`git diff refs/remotes/origin/\$i \
+ refs/remotes/origin/\$j\`\" ||exit 1; done; done
"
test_expect_success 'migrate --minimize on old inited layout' '
@@ -98,27 +98,27 @@ test_expect_success 'migrate --minimize on old inited layout' '
git svn migrate --minimize &&
test -z "`git config -l | grep "^svn-remote\.git-svn\."`" &&
git config --get-all svn-remote.svn.fetch > fetch.out &&
- grep "^trunk:refs/remotes/trunk$" fetch.out &&
- grep "^branches/a:refs/remotes/a$" fetch.out &&
- grep "^branches/b:refs/remotes/b$" fetch.out &&
- grep "^tags/0\.1:refs/remotes/tags/0\.1$" fetch.out &&
- grep "^tags/0\.2:refs/remotes/tags/0\.2$" fetch.out &&
- grep "^tags/0\.3:refs/remotes/tags/0\.3$" fetch.out &&
+ grep "^trunk:refs/remotes/origin/trunk$" fetch.out &&
+ grep "^branches/a:refs/remotes/origin/a$" fetch.out &&
+ grep "^branches/b:refs/remotes/origin/b$" fetch.out &&
+ grep "^tags/0\.1:refs/remotes/origin/tags/0\.1$" fetch.out &&
+ grep "^tags/0\.2:refs/remotes/origin/tags/0\.2$" fetch.out &&
+ grep "^tags/0\.3:refs/remotes/origin/tags/0\.3$" fetch.out &&
grep "^:refs/${remotes_git_svn}" fetch.out
'
test_expect_success ".rev_db auto-converted to .rev_map.UUID" '
git svn fetch -i trunk &&
- test -z "$(ls "$GIT_DIR"/svn/refs/remotes/trunk/.rev_db.* 2>/dev/null)" &&
- expect="$(ls "$GIT_DIR"/svn/refs/remotes/trunk/.rev_map.*)" &&
+ test -z "$(ls "$GIT_DIR"/svn/refs/remotes/origin/trunk/.rev_db.* 2>/dev/null)" &&
+ expect="$(ls "$GIT_DIR"/svn/refs/remotes/origin/trunk/.rev_map.*)" &&
test -n "$expect" &&
rev_db="$(echo $expect | sed -e "s,_map,_db,")" &&
convert_to_rev_db "$expect" "$rev_db" &&
rm -f "$expect" &&
test -f "$rev_db" &&
git svn fetch -i trunk &&
- test -z "$(ls "$GIT_DIR"/svn/refs/remotes/trunk/.rev_db.* 2>/dev/null)" &&
- test ! -e "$GIT_DIR"/svn/refs/remotes/trunk/.rev_db &&
+ test -z "$(ls "$GIT_DIR"/svn/refs/remotes/origin/trunk/.rev_db.* 2>/dev/null)" &&
+ test ! -e "$GIT_DIR"/svn/refs/remotes/origin/trunk/.rev_db &&
test -f "$expect"
'
diff --git a/t/t9114-git-svn-dcommit-merge.sh b/t/t9114-git-svn-dcommit-merge.sh
index d33d714006..fb41876677 100755
--- a/t/t9114-git-svn-dcommit-merge.sh
+++ b/t/t9114-git-svn-dcommit-merge.sh
@@ -48,7 +48,7 @@ test_expect_success 'setup svn repository' '
test_expect_success 'setup git mirror and merge' '
git svn init "$svnrepo" -t tags -T trunk -b branches &&
git svn fetch &&
- git checkout -b svn remotes/trunk &&
+ git checkout -b svn remotes/origin/trunk &&
git checkout -b merge &&
echo new file > new_file &&
git add new_file &&
@@ -81,7 +81,7 @@ test_debug 'gitk --all & sleep 1'
test_expect_success 'verify post-merge ancestry' "
test x\`git rev-parse --verify refs/heads/svn\` = \
- x\`git rev-parse --verify refs/remotes/trunk \` &&
+ x\`git rev-parse --verify refs/remotes/origin/trunk \` &&
test x\`git rev-parse --verify refs/heads/svn^2\` = \
x\`git rev-parse --verify refs/heads/merge\` &&
git cat-file commit refs/heads/svn^ | grep '^friend$'
diff --git a/t/t9116-git-svn-log.sh b/t/t9116-git-svn-log.sh
index cf4c05261b..45773ee560 100755
--- a/t/t9116-git-svn-log.sh
+++ b/t/t9116-git-svn-log.sh
@@ -20,20 +20,20 @@ test_expect_success 'setup repository and import' '
) &&
git svn init "$svnrepo" -T trunk -b branches -t tags &&
git svn fetch &&
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
echo bye >> README &&
git commit -a -m bye &&
git svn dcommit &&
- git reset --hard a &&
+ git reset --hard origin/a &&
echo why >> FEEDME &&
git update-index --add FEEDME &&
git commit -m feedme &&
git svn dcommit &&
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
echo aye >> README &&
git commit -a -m aye &&
git svn dcommit &&
- git reset --hard b &&
+ git reset --hard origin/b &&
echo spy >> README &&
git commit -a -m spy &&
echo try >> README &&
@@ -42,26 +42,26 @@ test_expect_success 'setup repository and import' '
'
test_expect_success 'run log' "
- git reset --hard a &&
- git svn log -r2 trunk | grep ^r2 &&
- git svn log -r4 trunk | grep ^r4 &&
+ git reset --hard origin/a &&
+ git svn log -r2 origin/trunk | grep ^r2 &&
+ git svn log -r4 origin/trunk | grep ^r4 &&
git svn log -r3 | grep ^r3
"
test_expect_success 'run log against a from trunk' "
- git reset --hard trunk &&
- git svn log -r3 a | grep ^r3
+ git reset --hard origin/trunk &&
+ git svn log -r3 origin/a | grep ^r3
"
printf 'r1 \nr2 \nr4 \n' > expected-range-r1-r2-r4
test_expect_success 'test ascending revision range' "
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn log -r 1:4 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r1-r2-r4 -
"
test_expect_success 'test ascending revision range with --show-commit' "
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn log --show-commit -r 1:4 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r1-r2-r4 -
"
@@ -69,7 +69,7 @@ test_expect_success 'test ascending revision range with --show-commit (sha1)' "
git svn find-rev r1 >expected-range-r1-r2-r4-sha1 &&
git svn find-rev r2 >>expected-range-r1-r2-r4-sha1 &&
git svn find-rev r4 >>expected-range-r1-r2-r4-sha1 &&
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn log --show-commit -r 1:4 | grep '^r[0-9]' | cut -d'|' -f2 >out &&
git rev-parse \$(cat out) >actual &&
test_cmp expected-range-r1-r2-r4-sha1 actual
@@ -78,67 +78,67 @@ test_expect_success 'test ascending revision range with --show-commit (sha1)' "
printf 'r4 \nr2 \nr1 \n' > expected-range-r4-r2-r1
test_expect_success 'test descending revision range' "
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn log -r 4:1 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r4-r2-r1 -
"
printf 'r1 \nr2 \n' > expected-range-r1-r2
test_expect_success 'test ascending revision range with unreachable revision' "
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn log -r 1:3 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r1-r2 -
"
printf 'r2 \nr1 \n' > expected-range-r2-r1
test_expect_success 'test descending revision range with unreachable revision' "
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn log -r 3:1 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r2-r1 -
"
printf 'r2 \n' > expected-range-r2
test_expect_success 'test ascending revision range with unreachable upper boundary revision and 1 commit' "
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn log -r 2:3 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r2 -
"
test_expect_success 'test descending revision range with unreachable upper boundary revision and 1 commit' "
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn log -r 3:2 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r2 -
"
printf 'r4 \n' > expected-range-r4
test_expect_success 'test ascending revision range with unreachable lower boundary revision and 1 commit' "
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn log -r 3:4 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r4 -
"
test_expect_success 'test descending revision range with unreachable lower boundary revision and 1 commit' "
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn log -r 4:3 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r4 -
"
printf -- '------------------------------------------------------------------------\n' > expected-separator
test_expect_success 'test ascending revision range with unreachable boundary revisions and no commits' "
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn log -r 5:6 | test_cmp expected-separator -
"
test_expect_success 'test descending revision range with unreachable boundary revisions and no commits' "
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn log -r 6:5 | test_cmp expected-separator -
"
test_expect_success 'test ascending revision range with unreachable boundary revisions and 1 commit' "
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn log -r 3:5 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r4 -
"
test_expect_success 'test descending revision range with unreachable boundary revisions and 1 commit' "
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn log -r 5:3 | grep '^r[0-9]' | cut -d'|' -f1 | test_cmp expected-range-r4 -
"
diff --git a/t/t9117-git-svn-init-clone.sh b/t/t9117-git-svn-init-clone.sh
index 69e9c0db5d..a66f43c6b1 100755
--- a/t/t9117-git-svn-init-clone.sh
+++ b/t/t9117-git-svn-init-clone.sh
@@ -83,36 +83,36 @@ EOF
rm -f expect actual
}
-test_expect_success 'init with -s/-T/-b/-t without --prefix warns' '
+test_expect_success 'init with -s/-T/-b/-t assumes --prefix=origin/' '
test ! -d project &&
git svn init -s "$svnrepo"/project project 2>warning &&
- grep -q prefix warning &&
- test_svn_configured_prefix "" &&
+ test_must_fail grep -q prefix warning &&
+ test_svn_configured_prefix "origin/" &&
rm -rf project &&
rm -f warning
'
-test_expect_success 'clone with -s/-T/-b/-t without --prefix warns' '
+test_expect_success 'clone with -s/-T/-b/-t assumes --prefix=origin/' '
test ! -d project &&
git svn clone -s "$svnrepo"/project 2>warning &&
- grep -q prefix warning &&
- test_svn_configured_prefix "" &&
+ test_must_fail grep -q prefix warning &&
+ test_svn_configured_prefix "origin/" &&
rm -rf project &&
rm -f warning
'
-test_expect_success 'init with -s/-T/-b/-t and --prefix does not warn' '
+test_expect_success 'init with -s/-T/-b/-t and --prefix "" still works' '
test ! -d project &&
- git svn init -s "$svnrepo"/project project --prefix="" 2>warning &&
+ git svn init -s "$svnrepo"/project project --prefix "" 2>warning &&
test_must_fail grep -q prefix warning &&
test_svn_configured_prefix "" &&
rm -rf project &&
rm -f warning
'
-test_expect_success 'clone with -s/-T/-b/-t and --prefix does not warn' '
+test_expect_success 'clone with -s/-T/-b/-t and --prefix "" still works' '
test ! -d project &&
- git svn clone -s "$svnrepo"/project --prefix="" 2>warning &&
+ git svn clone -s "$svnrepo"/project --prefix "" 2>warning &&
test_must_fail grep -q prefix warning &&
test_svn_configured_prefix "" &&
rm -rf project &&
diff --git a/t/t9118-git-svn-funky-branch-names.sh b/t/t9118-git-svn-funky-branch-names.sh
index 15f93b4c28..ed4d1369cc 100755
--- a/t/t9118-git-svn-funky-branch-names.sh
+++ b/t/t9118-git-svn-funky-branch-names.sh
@@ -41,20 +41,20 @@ test_expect_success 'test clone with funky branch names' '
git svn clone -s "$svnrepo/pr ject" project &&
(
cd project &&
- git rev-parse "refs/remotes/fun%20plugin" &&
- git rev-parse "refs/remotes/more%20fun%20plugin!" &&
- git rev-parse "refs/remotes/$scary_ref" &&
- git rev-parse "refs/remotes/%2Eleading_dot" &&
- git rev-parse "refs/remotes/trailing_dot%2E" &&
- git rev-parse "refs/remotes/trailing_dotlock%2Elock" &&
- git rev-parse "refs/remotes/$non_reflog"
+ git rev-parse "refs/remotes/origin/fun%20plugin" &&
+ git rev-parse "refs/remotes/origin/more%20fun%20plugin!" &&
+ git rev-parse "refs/remotes/origin/$scary_ref" &&
+ git rev-parse "refs/remotes/origin/%2Eleading_dot" &&
+ git rev-parse "refs/remotes/origin/trailing_dot%2E" &&
+ git rev-parse "refs/remotes/origin/trailing_dotlock%2Elock" &&
+ git rev-parse "refs/remotes/origin/$non_reflog"
)
'
test_expect_success 'test dcommit to funky branch' "
(
cd project &&
- git reset --hard 'refs/remotes/more%20fun%20plugin!' &&
+ git reset --hard 'refs/remotes/origin/more%20fun%20plugin!' &&
echo hello >> foo &&
git commit -m 'hello' -- foo &&
git svn dcommit
@@ -64,7 +64,7 @@ test_expect_success 'test dcommit to funky branch' "
test_expect_success 'test dcommit to scary branch' '
(
cd project &&
- git reset --hard "refs/remotes/$scary_ref" &&
+ git reset --hard "refs/remotes/origin/$scary_ref" &&
echo urls are scary >> foo &&
git commit -m "eep" -- foo &&
git svn dcommit
@@ -74,7 +74,7 @@ test_expect_success 'test dcommit to scary branch' '
test_expect_success 'test dcommit to trailing_dotlock branch' '
(
cd project &&
- git reset --hard "refs/remotes/trailing_dotlock%2Elock" &&
+ git reset --hard "refs/remotes/origin/trailing_dotlock%2Elock" &&
echo who names branches like this anyway? >> foo &&
git commit -m "bar" -- foo &&
git svn dcommit
diff --git a/t/t9120-git-svn-clone-with-percent-escapes.sh b/t/t9120-git-svn-clone-with-percent-escapes.sh
index 1d92c05035..1c84ce1023 100755
--- a/t/t9120-git-svn-clone-with-percent-escapes.sh
+++ b/t/t9120-git-svn-clone-with-percent-escapes.sh
@@ -58,19 +58,19 @@ test_expect_success 'test clone --stdlayout with percent escapes' '
git svn clone --stdlayout "$svnrepo/pr%20ject" percent &&
(
cd percent &&
- git rev-parse refs/remotes/trunk^0 &&
- git rev-parse refs/remotes/b^0 &&
- git rev-parse refs/remotes/tags/v1^0
+ git rev-parse refs/remotes/origin/trunk^0 &&
+ git rev-parse refs/remotes/origin/b^0 &&
+ git rev-parse refs/remotes/origin/tags/v1^0
)
'
test_expect_success 'test clone -s with unescaped space' '
- git svn clone -s "$svnrepo/pr ject" space &&
+ git svn clone -s "$svnrepo/pr ject" --prefix origin/ space &&
(
cd space &&
- git rev-parse refs/remotes/trunk^0 &&
- git rev-parse refs/remotes/b^0 &&
- git rev-parse refs/remotes/tags/v1^0
+ git rev-parse refs/remotes/origin/trunk^0 &&
+ git rev-parse refs/remotes/origin/b^0 &&
+ git rev-parse refs/remotes/origin/tags/v1^0
)
'
diff --git a/t/t9125-git-svn-multi-glob-branch-names.sh b/t/t9125-git-svn-multi-glob-branch-names.sh
index 096abd1fe5..0d53fc9014 100755
--- a/t/t9125-git-svn-multi-glob-branch-names.sh
+++ b/t/t9125-git-svn-multi-glob-branch-names.sh
@@ -20,14 +20,14 @@ test_expect_success 'test clone with multi-glob in branch names' '
git svn clone -T trunk -b branches/*/* -t tags \
"$svnrepo/project" project &&
(cd project &&
- git rev-parse "refs/remotes/v14.1/beta" &&
- git rev-parse "refs/remotes/v14.1/gold"
+ git rev-parse "refs/remotes/origin/v14.1/beta" &&
+ git rev-parse "refs/remotes/origin/v14.1/gold"
)
'
test_expect_success 'test dcommit to multi-globbed branch' "
(cd project &&
- git reset --hard 'refs/remotes/v14.1/gold' &&
+ git reset --hard 'refs/remotes/origin/v14.1/gold' &&
echo hello >> foo &&
git commit -m 'hello' -- foo &&
git svn dcommit
diff --git a/t/t9128-git-svn-cmd-branch.sh b/t/t9128-git-svn-cmd-branch.sh
index 4b034a67f3..4e95f791db 100755
--- a/t/t9128-git-svn-cmd-branch.sh
+++ b/t/t9128-git-svn-cmd-branch.sh
@@ -29,30 +29,30 @@ test_expect_success 'initialize svnrepo' '
test_expect_success 'import into git' '
git svn init --stdlayout "$svnrepo" &&
git svn fetch &&
- git checkout remotes/trunk
+ git checkout remotes/origin/trunk
'
test_expect_success 'git svn branch tests' '
git svn branch a &&
base=$(git rev-parse HEAD:) &&
- test $base = $(git rev-parse remotes/a:) &&
+ test $base = $(git rev-parse remotes/origin/a:) &&
git svn branch -m "created branch b blah" b &&
- test $base = $(git rev-parse remotes/b:) &&
+ test $base = $(git rev-parse remotes/origin/b:) &&
test_must_fail git branch -m "no branchname" &&
git svn branch -n c &&
- test_must_fail git rev-parse remotes/c &&
+ test_must_fail git rev-parse remotes/origin/c &&
test_must_fail git svn branch a &&
git svn branch -t tag1 &&
- test $base = $(git rev-parse remotes/tags/tag1:) &&
+ test $base = $(git rev-parse remotes/origin/tags/tag1:) &&
git svn branch --tag tag2 &&
- test $base = $(git rev-parse remotes/tags/tag2:) &&
+ test $base = $(git rev-parse remotes/origin/tags/tag2:) &&
git svn tag tag3 &&
- test $base = $(git rev-parse remotes/tags/tag3:) &&
+ test $base = $(git rev-parse remotes/origin/tags/tag3:) &&
git svn tag -m "created tag4 foo" tag4 &&
- test $base = $(git rev-parse remotes/tags/tag4:) &&
+ test $base = $(git rev-parse remotes/origin/tags/tag4:) &&
test_must_fail git svn tag -m "no tagname" &&
git svn tag -n tag5 &&
- test_must_fail git rev-parse remotes/tags/tag5 &&
+ test_must_fail git rev-parse remotes/origin/tags/tag5 &&
test_must_fail git svn tag tag1
'
diff --git a/t/t9130-git-svn-authors-file.sh b/t/t9130-git-svn-authors-file.sh
index c3443ceb25..c44de267a1 100755
--- a/t/t9130-git-svn-authors-file.sh
+++ b/t/t9130-git-svn-authors-file.sh
@@ -67,7 +67,7 @@ test_expect_success 'fetch fails on ee' '
'
tmp_config_get () {
- GIT_CONFIG=.git/svn/.metadata git config --get "$1"
+ git config --file=.git/svn/.metadata --get "$1"
}
test_expect_success 'failure happened without negative side effects' '
@@ -97,7 +97,6 @@ test_expect_success 'fresh clone with svn.authors-file in config' '
test x = x"$(git config svn.authorsfile)" &&
test_config="$HOME"/.gitconfig &&
sane_unset GIT_DIR &&
- sane_unset GIT_CONFIG &&
git config --global \
svn.authorsfile "$HOME"/svn-authors &&
test x"$HOME"/svn-authors = x"$(git config svn.authorsfile)" &&
diff --git a/t/t9135-git-svn-moved-branch-empty-file.sh b/t/t9135-git-svn-moved-branch-empty-file.sh
index 5280e5f1e4..93db45db7d 100755
--- a/t/t9135-git-svn-moved-branch-empty-file.sh
+++ b/t/t9135-git-svn-moved-branch-empty-file.sh
@@ -12,7 +12,7 @@ test_expect_success 'clone using git svn' 'git svn clone -s "$svnrepo" x'
test_expect_success 'test that b1 exists and is empty' '
(
cd x &&
- git reset --hard branch-c &&
+ git reset --hard origin/branch-c &&
test -f b1 &&
! test -s b1
)
diff --git a/t/t9141-git-svn-multiple-branches.sh b/t/t9141-git-svn-multiple-branches.sh
index 3cd06718eb..8e7f7d68b7 100755
--- a/t/t9141-git-svn-multiple-branches.sh
+++ b/t/t9141-git-svn-multiple-branches.sh
@@ -66,18 +66,18 @@ test_expect_success 'clone multiple branch and tag paths' '
-t tags_A/* --tags tags_B \
"$svnrepo/project" git_project &&
( cd git_project &&
- git rev-parse refs/remotes/first &&
- git rev-parse refs/remotes/second &&
- git rev-parse refs/remotes/1 &&
- git rev-parse refs/remotes/2 &&
- git rev-parse refs/remotes/tags/1.0 &&
- git rev-parse refs/remotes/tags/2.0 &&
- git rev-parse refs/remotes/tags/3.0 &&
- git rev-parse refs/remotes/tags/4.0 &&
- git rev-parse refs/remotes/tags/v5 &&
- git rev-parse refs/remotes/tags/v6 &&
- git rev-parse refs/remotes/tags/v7 &&
- git rev-parse refs/remotes/tags/v8
+ git rev-parse refs/remotes/origin/first &&
+ git rev-parse refs/remotes/origin/second &&
+ git rev-parse refs/remotes/origin/1 &&
+ git rev-parse refs/remotes/origin/2 &&
+ git rev-parse refs/remotes/origin/tags/1.0 &&
+ git rev-parse refs/remotes/origin/tags/2.0 &&
+ git rev-parse refs/remotes/origin/tags/3.0 &&
+ git rev-parse refs/remotes/origin/tags/4.0 &&
+ git rev-parse refs/remotes/origin/tags/v5 &&
+ git rev-parse refs/remotes/origin/tags/v6 &&
+ git rev-parse refs/remotes/origin/tags/v7 &&
+ git rev-parse refs/remotes/origin/tags/v8
)
'
@@ -85,8 +85,8 @@ test_expect_success 'Multiple branch or tag paths require -d' '
( cd git_project &&
test_must_fail git svn branch -m "No new branch" Nope &&
test_must_fail git svn tag -m "No new tag" Tagless &&
- test_must_fail git rev-parse refs/remotes/Nope &&
- test_must_fail git rev-parse refs/remotes/tags/Tagless
+ test_must_fail git rev-parse refs/remotes/origin/Nope &&
+ test_must_fail git rev-parse refs/remotes/origin/tags/Tagless
) &&
( cd svn_project &&
svn_cmd up &&
diff --git a/t/t9145-git-svn-master-branch.sh b/t/t9145-git-svn-master-branch.sh
index 16852d26ae..6559137493 100755
--- a/t/t9145-git-svn-master-branch.sh
+++ b/t/t9145-git-svn-master-branch.sh
@@ -17,7 +17,7 @@ test_expect_success 'git svn clone --stdlayout sets up trunk as master' '
git svn clone -s "$svnrepo" g &&
(
cd g &&
- test x`git rev-parse --verify refs/remotes/trunk^0` = \
+ test x`git rev-parse --verify refs/remotes/origin/trunk^0` = \
x`git rev-parse --verify refs/heads/master^0`
)
'
diff --git a/t/t9154-git-svn-fancy-glob.sh b/t/t9154-git-svn-fancy-glob.sh
index b780e0efe3..a0150f057d 100755
--- a/t/t9154-git-svn-fancy-glob.sh
+++ b/t/t9154-git-svn-fancy-glob.sh
@@ -22,7 +22,7 @@ test_expect_success 'add red branch' "
"
test_expect_success 'add gre branch' "
- GIT_CONFIG=.git/svn/.metadata git config --unset svn-remote.svn.branches-maxRev &&
+ git config --file=.git/svn/.metadata --unset svn-remote.svn.branches-maxRev &&
git config svn-remote.svn.branches 'branches/{red,gre}:refs/remotes/*' &&
git svn fetch &&
git rev-parse refs/remotes/red &&
@@ -31,7 +31,7 @@ test_expect_success 'add gre branch' "
"
test_expect_success 'add green branch' "
- GIT_CONFIG=.git/svn/.metadata git config --unset svn-remote.svn.branches-maxRev &&
+ git config --file=.git/svn/.metadata --unset svn-remote.svn.branches-maxRev &&
git config svn-remote.svn.branches 'branches/{red,green}:refs/remotes/*' &&
git svn fetch &&
git rev-parse refs/remotes/red &&
@@ -40,7 +40,7 @@ test_expect_success 'add green branch' "
"
test_expect_success 'add all branches' "
- GIT_CONFIG=.git/svn/.metadata git config --unset svn-remote.svn.branches-maxRev &&
+ git config --file=.git/svn/.metadata --unset svn-remote.svn.branches-maxRev &&
git config svn-remote.svn.branches 'branches/*:refs/remotes/*' &&
git svn fetch &&
git rev-parse refs/remotes/red &&
diff --git a/t/t9155-git-svn-fetch-deleted-tag.sh b/t/t9155-git-svn-fetch-deleted-tag.sh
index a486a98f84..184336f346 100755
--- a/t/t9155-git-svn-fetch-deleted-tag.sh
+++ b/t/t9155-git-svn-fetch-deleted-tag.sh
@@ -35,8 +35,8 @@ test_expect_success 'fetch deleted tags from same revision with checksum error'
cd git_project &&
git svn fetch &&
- git diff --exit-code mybranch:trunk/subdir/file tags/mytag:file &&
- git diff --exit-code master:subdir/file tags/mytag^:file
+ git diff --exit-code origin/mybranch:trunk/subdir/file origin/tags/mytag:file &&
+ git diff --exit-code master:subdir/file origin/tags/mytag^:file
'
test_done
diff --git a/t/t9156-git-svn-fetch-deleted-tag-2.sh b/t/t9156-git-svn-fetch-deleted-tag-2.sh
index 5ce7e2f3b0..7a6e33ba3c 100755
--- a/t/t9156-git-svn-fetch-deleted-tag-2.sh
+++ b/t/t9156-git-svn-fetch-deleted-tag-2.sh
@@ -36,9 +36,9 @@ test_expect_success 'fetch deleted tags from same revision with no checksum erro
cd git_project &&
git svn fetch &&
- git diff --exit-code master:subdir3/file tags/mytag:file &&
- git diff --exit-code master:subdir2/file tags/mytag^:file &&
- git diff --exit-code master:subdir1/file tags/mytag^^:file
+ git diff --exit-code master:subdir3/file origin/tags/mytag:file &&
+ git diff --exit-code master:subdir2/file origin/tags/mytag^:file &&
+ git diff --exit-code master:subdir1/file origin/tags/mytag^^:file
'
test_done
diff --git a/t/t9161-git-svn-mergeinfo-push.sh b/t/t9161-git-svn-mergeinfo-push.sh
index 1eab7015c7..6cb0909afe 100755
--- a/t/t9161-git-svn-mergeinfo-push.sh
+++ b/t/t9161-git-svn-mergeinfo-push.sh
@@ -18,8 +18,8 @@ test_expect_success 'load svn dump' "
test_expect_success 'propagate merge information' '
git config svn.pushmergeinfo yes &&
- git checkout svnb1 &&
- git merge --no-ff svnb2 &&
+ git checkout origin/svnb1 &&
+ git merge --no-ff origin/svnb2 &&
git svn dcommit
'
@@ -29,7 +29,7 @@ test_expect_success 'check svn:mergeinfo' '
'
test_expect_success 'merge another branch' '
- git merge --no-ff svnb3 &&
+ git merge --no-ff origin/svnb3 &&
git svn dcommit
'
@@ -40,7 +40,7 @@ test_expect_success 'check primary parent mergeinfo respected' '
'
test_expect_success 'merge existing merge' '
- git merge --no-ff svnb4 &&
+ git merge --no-ff origin/svnb4 &&
git svn dcommit
'
@@ -53,7 +53,7 @@ test_expect_success "check both parents' mergeinfo respected" '
'
test_expect_success 'make further commits to branch' '
- git checkout svnb2 &&
+ git checkout origin/svnb2 &&
touch newb2file &&
git add newb2file &&
git commit -m "later b2 commit" &&
@@ -64,8 +64,8 @@ test_expect_success 'make further commits to branch' '
'
test_expect_success 'second forward merge' '
- git checkout svnb1 &&
- git merge --no-ff svnb2 &&
+ git checkout origin/svnb1 &&
+ git merge --no-ff origin/svnb2 &&
git svn dcommit
'
@@ -78,8 +78,8 @@ test_expect_success 'check new mergeinfo added' '
'
test_expect_success 'reintegration merge' '
- git checkout svnb4 &&
- git merge --no-ff svnb1 &&
+ git checkout origin/svnb4 &&
+ git merge --no-ff origin/svnb1 &&
git svn dcommit
'
@@ -92,11 +92,11 @@ test_expect_success 'check reintegration mergeinfo' '
'
test_expect_success 'dcommit a merge at the top of a stack' '
- git checkout svnb1 &&
+ git checkout origin/svnb1 &&
touch anotherfile &&
git add anotherfile &&
git commit -m "a commit" &&
- git merge svnb4 &&
+ git merge origin/svnb4 &&
git svn dcommit
'
diff --git a/t/t9163-git-svn-reset-clears-caches.sh b/t/t9163-git-svn-reset-clears-caches.sh
index cd4c662ba2..d6245cee08 100755
--- a/t/t9163-git-svn-reset-clears-caches.sh
+++ b/t/t9163-git-svn-reset-clears-caches.sh
@@ -70,9 +70,9 @@ test_expect_success 'rebase looses SVN merge (m)' '
#
test_expect_success 'reset and fetch gets the SVN merge (m) correctly' '
git svn reset -r 3 &&
- git reset --hard trunk &&
+ git reset --hard origin/trunk &&
git svn fetch &&
- test 2 = $(git cat-file -p trunk|grep parent|wc -l)
+ test 2 = $(git cat-file -p origin/trunk|grep parent|wc -l)
'
test_done
diff --git a/t/t9165-git-svn-fetch-merge-branch-of-branch.sh b/t/t9165-git-svn-fetch-merge-branch-of-branch.sh
index 13ae7e33f9..fa3ef3b1f7 100755
--- a/t/t9165-git-svn-fetch-merge-branch-of-branch.sh
+++ b/t/t9165-git-svn-fetch-merge-branch-of-branch.sh
@@ -53,7 +53,7 @@ test_expect_success 'clone svn repo' '
'
test_expect_success 'verify merge commit' 'x=$(git rev-parse HEAD^2) &&
- y=$(git rev-parse branch2) &&
+ y=$(git rev-parse origin/branch2) &&
test "x$x" = "x$y"
'
diff --git a/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh b/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh
index af0ec0e2e3..52f2e46a5b 100755
--- a/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh
+++ b/t/t9166-git-svn-fetch-merge-branch-of-branch2.sh
@@ -46,7 +46,7 @@ test_expect_success 'clone svn repo' '
'
test_expect_success 'verify merge commit' 'x=$(git rev-parse HEAD^2) &&
- y=$(git rev-parse branch2) &&
+ y=$(git rev-parse origin/branch2) &&
test "x$x" = "x$y"
'
diff --git a/t/t9167-git-svn-cmd-branch-subproject.sh b/t/t9167-git-svn-cmd-branch-subproject.sh
index 53def876ed..ba35fc06fc 100755
--- a/t/t9167-git-svn-cmd-branch-subproject.sh
+++ b/t/t9167-git-svn-cmd-branch-subproject.sh
@@ -31,7 +31,7 @@ test_expect_success 'import into git' '
git svn init --trunk=trunk/project --branches=branches/*/project \
--tags=tags/*/project "$svnrepo" &&
git svn fetch &&
- git checkout remotes/trunk
+ git checkout remotes/origin/trunk
'
test_expect_success 'git svn branch tests' '
diff --git a/t/t9400-git-cvsserver-server.sh b/t/t9400-git-cvsserver-server.sh
index 1f06e25db6..6146c3fec2 100755
--- a/t/t9400-git-cvsserver-server.sh
+++ b/t/t9400-git-cvsserver-server.sh
@@ -25,7 +25,6 @@ perl -e 'use DBI; use DBD::SQLite' >/dev/null 2>&1 || {
test_done
}
-unset GIT_DIR GIT_CONFIG
WORKDIR=$(pwd)
SERVERDIR=$(pwd)/gitcvs.git
git_config="$SERVERDIR/config"
diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
index aeae3ca769..cf7b41f66d 100644
--- a/t/test-lib-functions.sh
+++ b/t/test-lib-functions.sh
@@ -32,6 +32,11 @@ test_set_editor () {
export EDITOR
}
+test_set_index_version () {
+ GIT_INDEX_VERSION="$1"
+ export GIT_INDEX_VERSION
+}
+
test_decode_color () {
awk '
function name(n) {
@@ -612,6 +617,12 @@ test_cmp() {
$GIT_TEST_CMP "$@"
}
+# test_cmp_bin - helper to compare binary files
+
+test_cmp_bin() {
+ cmp "$@"
+}
+
# Check if the file expected to be empty is indeed empty, and barfs
# otherwise.
@@ -716,6 +727,64 @@ perl () {
command "$PERL_PATH" "$@"
}
+# Is the value one of the various ways to spell a boolean true/false?
+test_normalize_bool () {
+ git -c magic.variable="$1" config --bool magic.variable 2>/dev/null
+}
+
+# Given a variable $1, normalize the value of it to one of "true",
+# "false", or "auto" and store the result to it.
+#
+# test_tristate GIT_TEST_HTTPD
+#
+# A variable set to an empty string is set to 'false'.
+# A variable set to 'false' or 'auto' keeps its value.
+# Anything else is set to 'true'.
+# An unset variable defaults to 'auto'.
+#
+# The last rule is to allow people to set the variable to an empty
+# string and export it to decline testing the particular feature
+# for versions both before and after this change. We used to treat
+# both unset and empty variable as a signal for "do not test" and
+# took any non-empty string as "please test".
+
+test_tristate () {
+ if eval "test x\"\${$1+isset}\" = xisset"
+ then
+ # explicitly set
+ eval "
+ case \"\$$1\" in
+ '') $1=false ;;
+ auto) ;;
+ *) $1=\$(test_normalize_bool \$$1 || echo true) ;;
+ esac
+ "
+ else
+ eval "$1=auto"
+ fi
+}
+
+# Exit the test suite, either by skipping all remaining tests or by
+# exiting with an error. If "$1" is "auto", we then we assume we were
+# opportunistically trying to set up some tests and we skip. If it is
+# "true", then we report a failure.
+#
+# The error/skip message should be given by $2.
+#
+test_skip_or_die () {
+ case "$1" in
+ auto)
+ skip_all=$2
+ test_done
+ ;;
+ true)
+ error "$2"
+ ;;
+ *)
+ error "BUG: test tristate is '$1' (real error: $2)"
+ esac
+}
+
# The following mingw_* functions obey POSIX shell syntax, but are actually
# bash scripts, and are meant to be used only with bash on Windows.
diff --git a/t/test-lib.sh b/t/test-lib.sh
index afa411e128..e0266f0357 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -108,6 +108,12 @@ export GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME
export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME
export EDITOR
+if test -n "${TEST_GIT_INDEX_VERSION:+isset}"
+then
+ GIT_INDEX_VERSION="$TEST_GIT_INDEX_VERSION"
+ export GIT_INDEX_VERSION
+fi
+
# Add libc MALLOC and MALLOC_PERTURB test
# only if we are not executing the test with valgrind
if expr " $GIT_TEST_OPTS " : ".* --valgrind " >/dev/null ||
@@ -653,7 +659,6 @@ else # normal case, use ../bin-wrappers only unless $with_dashes:
fi
fi
GIT_TEMPLATE_DIR="$GIT_BUILD_DIR"/templates/blt
-unset GIT_CONFIG
GIT_CONFIG_NOSYSTEM=1
GIT_ATTR_NOSYSTEM=1
export PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR GIT_CONFIG_NOSYSTEM GIT_ATTR_NOSYSTEM
diff --git a/tag.c b/tag.c
index 7b07921b30..82d841bf2d 100644
--- a/tag.c
+++ b/tag.c
@@ -40,15 +40,8 @@ struct tag *lookup_tag(const unsigned char *sha1)
{
struct object *obj = lookup_object(sha1);
if (!obj)
- return create_object(sha1, OBJ_TAG, alloc_tag_node());
- if (!obj->type)
- obj->type = OBJ_TAG;
- if (obj->type != OBJ_TAG) {
- error("Object %s is a %s, not a tag",
- sha1_to_hex(sha1), typename(obj->type));
- return NULL;
- }
- return (struct tag *) obj;
+ return create_object(sha1, alloc_tag_node());
+ return object_as_type(obj, OBJ_TAG, 0);
}
static unsigned long parse_tag_date(const char *buf, const char *tail)
diff --git a/test-hashmap.c b/test-hashmap.c
new file mode 100644
index 0000000000..f5183fb9e8
--- /dev/null
+++ b/test-hashmap.c
@@ -0,0 +1,255 @@
+#include "git-compat-util.h"
+#include "hashmap.h"
+
+struct test_entry
+{
+ struct hashmap_entry ent;
+ /* key and value as two \0-terminated strings */
+ char key[FLEX_ARRAY];
+};
+
+static const char *get_value(const struct test_entry *e)
+{
+ return e->key + strlen(e->key) + 1;
+}
+
+static int test_entry_cmp(const struct test_entry *e1,
+ const struct test_entry *e2, const char* key)
+{
+ return strcmp(e1->key, key ? key : e2->key);
+}
+
+static int test_entry_cmp_icase(const struct test_entry *e1,
+ const struct test_entry *e2, const char* key)
+{
+ return strcasecmp(e1->key, key ? key : e2->key);
+}
+
+static struct test_entry *alloc_test_entry(int hash, char *key, int klen,
+ char *value, int vlen)
+{
+ struct test_entry *entry = malloc(sizeof(struct test_entry) + klen
+ + vlen + 2);
+ hashmap_entry_init(entry, hash);
+ memcpy(entry->key, key, klen + 1);
+ memcpy(entry->key + klen + 1, value, vlen + 1);
+ return entry;
+}
+
+#define HASH_METHOD_FNV 0
+#define HASH_METHOD_I 1
+#define HASH_METHOD_IDIV10 2
+#define HASH_METHOD_0 3
+#define HASH_METHOD_X2 4
+#define TEST_SPARSE 8
+#define TEST_ADD 16
+#define TEST_SIZE 100000
+
+static unsigned int hash(unsigned int method, unsigned int i, const char *key)
+{
+ unsigned int hash;
+ switch (method & 3)
+ {
+ case HASH_METHOD_FNV:
+ hash = strhash(key);
+ break;
+ case HASH_METHOD_I:
+ hash = i;
+ break;
+ case HASH_METHOD_IDIV10:
+ hash = i / 10;
+ break;
+ case HASH_METHOD_0:
+ hash = 0;
+ break;
+ }
+
+ if (method & HASH_METHOD_X2)
+ hash = 2 * hash;
+ return hash;
+}
+
+/*
+ * Test performance of hashmap.[ch]
+ * Usage: time echo "perfhashmap method rounds" | test-hashmap
+ */
+static void perf_hashmap(unsigned int method, unsigned int rounds)
+{
+ struct hashmap map;
+ char buf[16];
+ struct test_entry **entries;
+ unsigned int *hashes;
+ unsigned int i, j;
+
+ entries = malloc(TEST_SIZE * sizeof(struct test_entry *));
+ hashes = malloc(TEST_SIZE * sizeof(int));
+ for (i = 0; i < TEST_SIZE; i++) {
+ snprintf(buf, sizeof(buf), "%i", i);
+ entries[i] = alloc_test_entry(0, buf, strlen(buf), "", 0);
+ hashes[i] = hash(method, i, entries[i]->key);
+ }
+
+ if (method & TEST_ADD) {
+ /* test adding to the map */
+ for (j = 0; j < rounds; j++) {
+ hashmap_init(&map, (hashmap_cmp_fn) test_entry_cmp, 0);
+
+ /* add entries */
+ for (i = 0; i < TEST_SIZE; i++) {
+ hashmap_entry_init(entries[i], hashes[i]);
+ hashmap_add(&map, entries[i]);
+ }
+
+ hashmap_free(&map, 0);
+ }
+ } else {
+ /* test map lookups */
+ hashmap_init(&map, (hashmap_cmp_fn) test_entry_cmp, 0);
+
+ /* fill the map (sparsely if specified) */
+ j = (method & TEST_SPARSE) ? TEST_SIZE / 10 : TEST_SIZE;
+ for (i = 0; i < j; i++) {
+ hashmap_entry_init(entries[i], hashes[i]);
+ hashmap_add(&map, entries[i]);
+ }
+
+ for (j = 0; j < rounds; j++) {
+ for (i = 0; i < TEST_SIZE; i++) {
+ struct hashmap_entry key;
+ hashmap_entry_init(&key, hashes[i]);
+ hashmap_get(&map, &key, entries[i]->key);
+ }
+ }
+
+ hashmap_free(&map, 0);
+ }
+}
+
+#define DELIM " \t\r\n"
+
+/*
+ * Read stdin line by line and print result of commands to stdout:
+ *
+ * hash key -> strhash(key) memhash(key) strihash(key) memihash(key)
+ * put key value -> NULL / old value
+ * get key -> NULL / value
+ * remove key -> NULL / old value
+ * iterate -> key1 value1\nkey2 value2\n...
+ * size -> tablesize numentries
+ *
+ * perfhashmap method rounds -> test hashmap.[ch] performance
+ */
+int main(int argc, char *argv[])
+{
+ char line[1024];
+ struct hashmap map;
+ int icase;
+
+ /* init hash map */
+ icase = argc > 1 && !strcmp("ignorecase", argv[1]);
+ hashmap_init(&map, (hashmap_cmp_fn) (icase ? test_entry_cmp_icase
+ : test_entry_cmp), 0);
+
+ /* process commands from stdin */
+ while (fgets(line, sizeof(line), stdin)) {
+ char *cmd, *p1 = NULL, *p2 = NULL;
+ int l1 = 0, l2 = 0, hash = 0;
+ struct test_entry *entry;
+
+ /* break line into command and up to two parameters */
+ cmd = strtok(line, DELIM);
+ /* ignore empty lines */
+ if (!cmd || *cmd == '#')
+ continue;
+
+ p1 = strtok(NULL, DELIM);
+ if (p1) {
+ l1 = strlen(p1);
+ hash = icase ? strihash(p1) : strhash(p1);
+ p2 = strtok(NULL, DELIM);
+ if (p2)
+ l2 = strlen(p2);
+ }
+
+ if (!strcmp("hash", cmd) && l1) {
+
+ /* print results of different hash functions */
+ printf("%u %u %u %u\n", strhash(p1), memhash(p1, l1),
+ strihash(p1), memihash(p1, l1));
+
+ } else if (!strcmp("add", cmd) && l1 && l2) {
+
+ /* create entry with key = p1, value = p2 */
+ entry = alloc_test_entry(hash, p1, l1, p2, l2);
+
+ /* add to hashmap */
+ hashmap_add(&map, entry);
+
+ } else if (!strcmp("put", cmd) && l1 && l2) {
+
+ /* create entry with key = p1, value = p2 */
+ entry = alloc_test_entry(hash, p1, l1, p2, l2);
+
+ /* add / replace entry */
+ entry = hashmap_put(&map, entry);
+
+ /* print and free replaced entry, if any */
+ puts(entry ? get_value(entry) : "NULL");
+ free(entry);
+
+ } else if (!strcmp("get", cmd) && l1) {
+
+ /* setup static key */
+ struct hashmap_entry key;
+ hashmap_entry_init(&key, hash);
+
+ /* lookup entry in hashmap */
+ entry = hashmap_get(&map, &key, p1);
+
+ /* print result */
+ if (!entry)
+ puts("NULL");
+ while (entry) {
+ puts(get_value(entry));
+ entry = hashmap_get_next(&map, entry);
+ }
+
+ } else if (!strcmp("remove", cmd) && l1) {
+
+ /* setup static key */
+ struct hashmap_entry key;
+ hashmap_entry_init(&key, hash);
+
+ /* remove entry from hashmap */
+ entry = hashmap_remove(&map, &key, p1);
+
+ /* print result and free entry*/
+ puts(entry ? get_value(entry) : "NULL");
+ free(entry);
+
+ } else if (!strcmp("iterate", cmd)) {
+
+ struct hashmap_iter iter;
+ hashmap_iter_init(&map, &iter);
+ while ((entry = hashmap_iter_next(&iter)))
+ printf("%s %s\n", entry->key, get_value(entry));
+
+ } else if (!strcmp("size", cmd)) {
+
+ /* print table sizes */
+ printf("%u %u\n", map.tablesize, map.size);
+
+ } else if (!strcmp("perfhashmap", cmd) && l1 && l2) {
+
+ perf_hashmap(atoi(p1), atoi(p2));
+
+ } else {
+
+ printf("Unknown command %s\n", cmd);
+
+ }
+ }
+
+ hashmap_free(&map, 1);
+ return 0;
+}
diff --git a/test-parse-options.c b/test-parse-options.c
index 434e8b8929..5dabce60f3 100644
--- a/test-parse-options.c
+++ b/test-parse-options.c
@@ -59,8 +59,6 @@ int main(int argc, char **argv)
OPT_STRING(0, "st", &string, "st", "get another string (pervert ordering)"),
OPT_STRING('o', NULL, &string, "str", "get another string"),
OPT_NOOP_NOARG(0, "obsolete"),
- OPT_SET_PTR(0, "default-string", &string,
- "set string to default", (unsigned long)"default"),
OPT_STRING_LIST(0, "list", &list, "str", "add str to list"),
OPT_GROUP("Magic arguments"),
OPT_ARGUMENT("quux", "means --quux"),
diff --git a/test-wildmatch.c b/test-wildmatch.c
index a3e2643fbc..578b164fe6 100644
--- a/test-wildmatch.c
+++ b/test-wildmatch.c
@@ -1,85 +1,8 @@
-#ifdef USE_WILDMATCH
-#undef USE_WILDMATCH /* We need real fnmatch implementation here */
-#endif
#include "cache.h"
-#include "wildmatch.h"
-
-static int perf(int ac, char **av)
-{
- struct timeval tv1, tv2;
- struct stat st;
- int fd, i, n, flags1 = 0, flags2 = 0;
- char *buffer, *p;
- uint32_t usec1, usec2;
- const char *lang;
- const char *file = av[0];
- const char *pattern = av[1];
-
- lang = getenv("LANG");
- if (lang && strcmp(lang, "C"))
- die("Please test it on C locale.");
-
- if ((fd = open(file, O_RDONLY)) == -1 || fstat(fd, &st))
- die_errno("file open");
-
- buffer = xmalloc(st.st_size + 2);
- if (read(fd, buffer, st.st_size) != st.st_size)
- die_errno("read");
-
- buffer[st.st_size] = '\0';
- buffer[st.st_size + 1] = '\0';
- for (i = 0; i < st.st_size; i++)
- if (buffer[i] == '\n')
- buffer[i] = '\0';
-
- n = atoi(av[2]);
- if (av[3] && !strcmp(av[3], "pathname")) {
- flags1 = WM_PATHNAME;
- flags2 = FNM_PATHNAME;
- }
-
- gettimeofday(&tv1, NULL);
- for (i = 0; i < n; i++) {
- for (p = buffer; *p; p += strlen(p) + 1)
- wildmatch(pattern, p, flags1, NULL);
- }
- gettimeofday(&tv2, NULL);
-
- usec1 = (uint32_t)tv2.tv_sec * 1000000 + tv2.tv_usec;
- usec1 -= (uint32_t)tv1.tv_sec * 1000000 + tv1.tv_usec;
- printf("wildmatch %ds %dus\n",
- (int)(usec1 / 1000000),
- (int)(usec1 % 1000000));
-
- gettimeofday(&tv1, NULL);
- for (i = 0; i < n; i++) {
- for (p = buffer; *p; p += strlen(p) + 1)
- fnmatch(pattern, p, flags2);
- }
- gettimeofday(&tv2, NULL);
-
- usec2 = (uint32_t)tv2.tv_sec * 1000000 + tv2.tv_usec;
- usec2 -= (uint32_t)tv1.tv_sec * 1000000 + tv1.tv_usec;
- if (usec2 > usec1)
- printf("fnmatch %ds %dus or %.2f%% slower\n",
- (int)((usec2 - usec1) / 1000000),
- (int)((usec2 - usec1) % 1000000),
- (float)(usec2 - usec1) / usec1 * 100);
- else
- printf("fnmatch %ds %dus or %.2f%% faster\n",
- (int)((usec1 - usec2) / 1000000),
- (int)((usec1 - usec2) % 1000000),
- (float)(usec1 - usec2) / usec1 * 100);
- return 0;
-}
int main(int argc, char **argv)
{
int i;
-
- if (!strcmp(argv[1], "perf"))
- return perf(argc - 2, argv + 2);
-
for (i = 2; i < argc; i++) {
if (argv[i][0] == '/')
die("Forward slash is not allowed at the beginning of the\n"
@@ -93,8 +16,6 @@ int main(int argc, char **argv)
return !!wildmatch(argv[3], argv[2], WM_PATHNAME | WM_CASEFOLD, NULL);
else if (!strcmp(argv[1], "pathmatch"))
return !!wildmatch(argv[3], argv[2], 0, NULL);
- else if (!strcmp(argv[1], "fnmatch"))
- return !!fnmatch(argv[3], argv[2], FNM_PATHNAME);
else
return 1;
}
diff --git a/transport-helper.c b/transport-helper.c
index ad72fbd53c..b9ba0416b2 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -58,7 +58,7 @@ static int recvline_fh(FILE *helper, struct strbuf *buffer, const char *name)
if (strbuf_getline(buffer, helper, '\n') == EOF) {
if (debug)
fprintf(stderr, "Debug: Remote helper quit.\n");
- exit(128);
+ return 1;
}
if (debug)
@@ -71,12 +71,6 @@ static int recvline(struct helper_data *helper, struct strbuf *buffer)
return recvline_fh(helper->out, buffer, helper->name);
}
-static void xchgline(struct helper_data *helper, struct strbuf *buffer)
-{
- sendline(helper, buffer);
- recvline(helper, buffer);
-}
-
static void write_constant(int fd, const char *str)
{
if (debug)
@@ -163,7 +157,8 @@ static struct child_process *get_helper(struct transport *transport)
while (1) {
const char *capname;
int mandatory = 0;
- recvline(data, &buf);
+ if (recvline(data, &buf))
+ exit(128);
if (!*buf.buf)
break;
@@ -200,15 +195,9 @@ static struct child_process *get_helper(struct transport *transport)
} else if (!strcmp(capname, "signed-tags")) {
data->signed_tags = 1;
} else if (starts_with(capname, "export-marks ")) {
- struct strbuf arg = STRBUF_INIT;
- strbuf_addstr(&arg, "--export-marks=");
- strbuf_addstr(&arg, capname + strlen("export-marks "));
- data->export_marks = strbuf_detach(&arg, NULL);
+ data->export_marks = xstrdup(capname + strlen("export-marks "));
} else if (starts_with(capname, "import-marks")) {
- struct strbuf arg = STRBUF_INIT;
- strbuf_addstr(&arg, "--import-marks=");
- strbuf_addstr(&arg, capname + strlen("import-marks "));
- data->import_marks = strbuf_detach(&arg, NULL);
+ data->import_marks = xstrdup(capname + strlen("import-marks "));
} else if (starts_with(capname, "no-private-update")) {
data->no_private_update = 1;
} else if (mandatory) {
@@ -307,7 +296,9 @@ static int set_helper_option(struct transport *transport,
quote_c_style(value, &buf, NULL, 0);
strbuf_addch(&buf, '\n');
- xchgline(data, &buf);
+ sendline(data, &buf);
+ if (recvline(data, &buf))
+ exit(128);
if (!strcmp(buf.buf, "ok"))
ret = 0;
@@ -379,7 +370,8 @@ static int fetch_with_fetch(struct transport *transport,
sendline(data, &buf);
while (1) {
- recvline(data, &buf);
+ if (recvline(data, &buf))
+ exit(128);
if (starts_with(buf.buf, "lock ")) {
const char *name = buf.buf + 5;
@@ -430,6 +422,8 @@ static int get_exporter(struct transport *transport,
struct helper_data *data = transport->data;
struct child_process *helper = get_helper(transport);
int argc = 0, i;
+ struct strbuf tmp = STRBUF_INIT;
+
memset(fastexport, 0, sizeof(*fastexport));
/* we need to duplicate helper->in because we want to use it after
@@ -440,10 +434,14 @@ static int get_exporter(struct transport *transport,
fastexport->argv[argc++] = "--use-done-feature";
fastexport->argv[argc++] = data->signed_tags ?
"--signed-tags=verbatim" : "--signed-tags=warn-strip";
- if (data->export_marks)
- fastexport->argv[argc++] = data->export_marks;
- if (data->import_marks)
- fastexport->argv[argc++] = data->import_marks;
+ if (data->export_marks) {
+ strbuf_addf(&tmp, "--export-marks=%s.tmp", data->export_marks);
+ fastexport->argv[argc++] = strbuf_detach(&tmp, NULL);
+ }
+ if (data->import_marks) {
+ strbuf_addf(&tmp, "--import-marks=%s", data->import_marks);
+ fastexport->argv[argc++] = strbuf_detach(&tmp, NULL);
+ }
for (i = 0; i < revlist_args->nr; i++)
fastexport->argv[argc++] = revlist_args->items[i].string;
@@ -563,7 +561,9 @@ static int process_connect_service(struct transport *transport,
goto exit;
sendline(data, &cmdbuf);
- recvline_fh(input, &cmdbuf, name);
+ if (recvline_fh(input, &cmdbuf, name))
+ exit(128);
+
if (!strcmp(cmdbuf.buf, "")) {
data->no_disconnect_req = 1;
if (debug)
@@ -650,7 +650,7 @@ static int push_update_ref_status(struct strbuf *buf,
struct ref *remote_refs)
{
char *refname, *msg;
- int status;
+ int status, forced = 0;
if (starts_with(buf->buf, "ok ")) {
status = REF_STATUS_OK;
@@ -708,6 +708,11 @@ static int push_update_ref_status(struct strbuf *buf,
free(msg);
msg = NULL;
}
+ else if (!strcmp(msg, "forced update")) {
+ forced = 1;
+ free(msg);
+ msg = NULL;
+ }
}
if (*ref)
@@ -729,26 +734,34 @@ static int push_update_ref_status(struct strbuf *buf,
}
(*ref)->status = status;
+ (*ref)->forced_update |= forced;
(*ref)->remote_status = msg;
return !(status == REF_STATUS_OK);
}
-static void push_update_refs_status(struct helper_data *data,
- struct ref *remote_refs)
+static int push_update_refs_status(struct helper_data *data,
+ struct ref *remote_refs,
+ int flags)
{
struct strbuf buf = STRBUF_INIT;
struct ref *ref = remote_refs;
+ int ret = 0;
+
for (;;) {
char *private;
- recvline(data, &buf);
+ if (recvline(data, &buf)) {
+ ret = 1;
+ break;
+ }
+
if (!buf.len)
break;
if (push_update_ref_status(&buf, &ref, remote_refs))
continue;
- if (!data->refspecs || data->no_private_update)
+ if (flags & TRANSPORT_PUSH_DRY_RUN || !data->refspecs || data->no_private_update)
continue;
/* propagate back the update to the remote namespace */
@@ -759,6 +772,7 @@ static void push_update_refs_status(struct helper_data *data,
free(private);
}
strbuf_release(&buf);
+ return ret;
}
static int push_refs_with_push(struct transport *transport,
@@ -839,8 +853,7 @@ static int push_refs_with_push(struct transport *transport,
sendline(data, &buf);
strbuf_release(&buf);
- push_update_refs_status(data, remote_refs);
- return 0;
+ return push_update_refs_status(data, remote_refs, flags);
}
static int push_refs_with_export(struct transport *transport,
@@ -860,6 +873,11 @@ static int push_refs_with_export(struct transport *transport,
die("helper %s does not support dry-run", data->name);
}
+ if (flags & TRANSPORT_PUSH_FORCE) {
+ if (set_helper_option(transport, "force", "true") != 0)
+ warning("helper %s does not support 'force'", data->name);
+ }
+
helper = get_helper(transport);
write_constant(helper->in, "export\n");
@@ -881,9 +899,6 @@ static int push_refs_with_export(struct transport *transport,
}
free(private);
- if (ref->deletion)
- die("remote-helpers do not support ref deletion");
-
if (ref->peer_ref) {
if (strcmp(ref->peer_ref->name, ref->name))
die("remote-helpers do not support old:new syntax");
@@ -896,7 +911,15 @@ static int push_refs_with_export(struct transport *transport,
if (finish_command(&exporter))
die("Error while running fast-export");
- push_update_refs_status(data, remote_refs);
+ if (push_update_refs_status(data, remote_refs, flags))
+ return 1;
+
+ if (data->export_marks) {
+ strbuf_addf(&buf, "%s.tmp", data->export_marks);
+ rename(buf.buf, data->export_marks);
+ strbuf_release(&buf);
+ }
+
return 0;
}
@@ -965,7 +988,8 @@ static struct ref *get_refs_list(struct transport *transport, int for_push)
while (1) {
char *eov, *eon;
- recvline(data, &buf);
+ if (recvline(data, &buf))
+ exit(128);
if (!*buf.buf)
break;
@@ -1002,7 +1026,7 @@ static struct ref *get_refs_list(struct transport *transport, int for_push)
int transport_helper_init(struct transport *transport, const char *name)
{
- struct helper_data *data = xcalloc(sizeof(*data), 1);
+ struct helper_data *data = xcalloc(1, sizeof(*data));
data->name = name;
if (getenv("GIT_TRANSPORT_HELPER_DEBUG"))
diff --git a/transport.c b/transport.c
index ca7bb441bf..325f03e1ee 100644
--- a/transport.c
+++ b/transport.c
@@ -1132,8 +1132,7 @@ int transport_push(struct transport *transport,
return transport->push(transport, refspec_nr, refspec, flags);
} else if (transport->push_refs) {
- struct ref *remote_refs =
- transport->get_refs_list(transport, 1);
+ struct ref *remote_refs;
struct ref *local_refs = get_local_heads();
int match_flags = MATCH_REFS_NONE;
int verbose = (transport->verbose > 0);
@@ -1142,6 +1141,11 @@ int transport_push(struct transport *transport,
int pretend = flags & TRANSPORT_PUSH_DRY_RUN;
int push_ret, ret, err;
+ if (check_push_refs(local_refs, refspec_nr, refspec) < 0)
+ return -1;
+
+ remote_refs = transport->get_refs_list(transport, 1);
+
if (flags & TRANSPORT_PUSH_ALL)
match_flags |= MATCH_REFS_ALL;
if (flags & TRANSPORT_PUSH_MIRROR)
diff --git a/tree-diff.c b/tree-diff.c
index 456660c7a2..11c3550177 100644
--- a/tree-diff.c
+++ b/tree-diff.c
@@ -294,14 +294,10 @@ int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const cha
unsigned long size1, size2;
int retval;
- tree1 = read_object_with_reference(old, tree_type, &size1, NULL);
- if (!tree1)
- die("unable to read source tree (%s)", sha1_to_hex(old));
- tree2 = read_object_with_reference(new, tree_type, &size2, NULL);
- if (!tree2)
- die("unable to read destination tree (%s)", sha1_to_hex(new));
- init_tree_desc(&t1, tree1, size1);
- init_tree_desc(&t2, tree2, size2);
+ tree1 = fill_tree_descriptor(&t1, old);
+ tree2 = fill_tree_descriptor(&t2, new);
+ size1 = t1.size;
+ size2 = t2.size;
retval = diff_tree(&t1, &t2, base, opt);
if (!*base && DIFF_OPT_TST(opt, FOLLOW_RENAMES) && diff_might_be_rename()) {
init_tree_desc(&t1, tree1, size1);
@@ -315,18 +311,5 @@ int diff_tree_sha1(const unsigned char *old, const unsigned char *new, const cha
int diff_root_tree_sha1(const unsigned char *new, const char *base, struct diff_options *opt)
{
- int retval;
- void *tree;
- unsigned long size;
- struct tree_desc empty, real;
-
- tree = read_object_with_reference(new, tree_type, &size, NULL);
- if (!tree)
- die("unable to read root tree (%s)", sha1_to_hex(new));
- init_tree_desc(&real, tree, size);
-
- init_tree_desc(&empty, "", 0);
- retval = diff_tree(&empty, &real, base, opt);
- free(tree);
- return retval;
+ return diff_tree_sha1(NULL, new, base, opt);
}
diff --git a/tree-walk.c b/tree-walk.c
index 79dba1d0f4..4dc86c7fe5 100644
--- a/tree-walk.c
+++ b/tree-walk.c
@@ -37,7 +37,7 @@ static void decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned
/* Initialize the descriptor entry */
desc->entry.path = path;
- desc->entry.mode = mode;
+ desc->entry.mode = canon_mode(mode);
desc->entry.sha1 = (const unsigned char *)(path + len);
}
diff --git a/tree-walk.h b/tree-walk.h
index ae04b6417d..ae7fb3a824 100644
--- a/tree-walk.h
+++ b/tree-walk.h
@@ -16,7 +16,7 @@ struct tree_desc {
static inline const unsigned char *tree_entry_extract(struct tree_desc *desc, const char **pathp, unsigned int *modep)
{
*pathp = desc->entry.path;
- *modep = canon_mode(desc->entry.mode);
+ *modep = desc->entry.mode;
return desc->entry.sha1;
}
diff --git a/tree.c b/tree.c
index c8c49d7b78..bb02c1caa4 100644
--- a/tree.c
+++ b/tree.c
@@ -183,15 +183,8 @@ struct tree *lookup_tree(const unsigned char *sha1)
{
struct object *obj = lookup_object(sha1);
if (!obj)
- return create_object(sha1, OBJ_TREE, alloc_tree_node());
- if (!obj->type)
- obj->type = OBJ_TREE;
- if (obj->type != OBJ_TREE) {
- error("Object %s is a %s, not a tree",
- sha1_to_hex(sha1), typename(obj->type));
- return NULL;
- }
- return (struct tree *) obj;
+ return create_object(sha1, alloc_tree_node());
+ return object_as_type(obj, OBJ_TREE, 0);
}
int parse_tree_buffer(struct tree *item, void *buffer, unsigned long size)
diff --git a/unpack-trees.c b/unpack-trees.c
index ca7dd0fa5f..02f69aeea3 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -105,12 +105,11 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
static int do_add_entry(struct unpack_trees_options *o, struct cache_entry *ce,
unsigned int set, unsigned int clear)
{
- clear |= CE_HASHED | CE_UNHASHED;
+ clear |= CE_HASHED;
if (set & CE_REMOVE)
set |= CE_WT_REMOVE;
- ce->next = NULL;
ce->ce_flags = (ce->ce_flags & ~clear) | set;
return add_index_entry(&o->result, ce,
ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE);
@@ -204,7 +203,7 @@ static int check_updates(struct unpack_trees_options *o)
total++;
}
- progress = start_progress_delay("Checking out files",
+ progress = start_progress_delay(_("Checking out files"),
total, 50, 1);
cnt = 0;
}
diff --git a/upload-pack.c b/upload-pack.c
index a3c52f691d..01de944a0a 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -17,7 +17,7 @@
static const char upload_pack_usage[] = "git upload-pack [--strict] [--timeout=<n>] <dir>";
-/* bits #0..7 in revision.h, #8..10 in commit.c */
+/* Remember to update object flag allocation in object.h */
#define THEY_HAVE (1u << 11)
#define OUR_REF (1u << 12)
#define WANTED (1u << 13)
@@ -70,6 +70,14 @@ static ssize_t send_client_data(int fd, const char *data, ssize_t sz)
return sz;
}
+static int write_one_shallow(const struct commit_graft *graft, void *cb_data)
+{
+ FILE *fp = cb_data;
+ if (graft->nr_parent == -1)
+ fprintf(fp, "--shallow %s\n", sha1_to_hex(graft->sha1));
+ return 0;
+}
+
static void create_pack_file(void)
{
struct child_process pack_objects;
@@ -81,12 +89,10 @@ static void create_pack_file(void)
const char *argv[12];
int i, arg = 0;
FILE *pipe_fd;
- const char *shallow_file = NULL;
if (shallow_nr) {
- shallow_file = setup_temporary_shallow(NULL);
argv[arg++] = "--shallow-file";
- argv[arg++] = shallow_file;
+ argv[arg++] = "";
}
argv[arg++] = "pack-objects";
argv[arg++] = "--revs";
@@ -114,6 +120,9 @@ static void create_pack_file(void)
pipe_fd = xfdopen(pack_objects.in, "w");
+ if (shallow_nr)
+ for_each_commit_graft(write_one_shallow, pipe_fd);
+
for (i = 0; i < want_obj.nr; i++)
fprintf(pipe_fd, "%s\n",
sha1_to_hex(want_obj.objects[i].item->sha1));
@@ -791,7 +800,7 @@ int main(int argc, char **argv)
packet_trace_identity("upload-pack");
git_extract_argv0_path(argv[0]);
- read_replace_refs = 0;
+ check_replace_refs = 0;
for (i = 1; i < argc; i++) {
char *arg = argv[i];
diff --git a/userdiff.c b/userdiff.c
index 10b61ec37d..fad52d6392 100644
--- a/userdiff.c
+++ b/userdiff.c
@@ -125,15 +125,13 @@ PATTERNS("tex", "^(\\\\((sub)*section|chapter|part)\\*{0,1}\\{.*)$",
"\\\\[a-zA-Z@]+|\\\\.|[a-zA-Z0-9\x80-\xff]+"),
PATTERNS("cpp",
/* Jump targets or access declarations */
- "!^[ \t]*[A-Za-z_][A-Za-z_0-9]*:.*$\n"
- /* C/++ functions/methods at top level */
- "^([A-Za-z_][A-Za-z_0-9]*([ \t*]+[A-Za-z_][A-Za-z_0-9]*([ \t]*::[ \t]*[^[:space:]]+)?){1,}[ \t]*\\([^;]*)$\n"
- /* compound type at top level */
- "^((struct|class|enum)[^;]*)$",
+ "!^[ \t]*[A-Za-z_][A-Za-z_0-9]*:[[:space:]]*($|/[/*])\n"
+ /* functions/methods, variables, and compounds at top level */
+ "^((::[[:space:]]*)?[A-Za-z_].*)$",
/* -- */
"[a-zA-Z_][a-zA-Z0-9_]*"
- "|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lL]?"
- "|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->"),
+ "|[-+0-9.e]+[fFlL]?|0[xXbB]?[0-9a-fA-F]+[lLuU]*"
+ "|[-+*/<>%&^|=!]=|--|\\+\\+|<<=?|>>=?|&&|\\|\\||::|->\\*?|\\.\\*"),
PATTERNS("csharp",
/* Keywords */
"!^[ \t]*(do|while|for|if|else|instanceof|new|return|switch|case|throw|catch|using)\n"
diff --git a/utf8.c b/utf8.c
index 015c8157ed..a89704017a 100644
--- a/utf8.c
+++ b/utf8.c
@@ -5,8 +5,8 @@
/* This code is originally from http://www.cl.cam.ac.uk/~mgk25/ucs/ */
struct interval {
- int first;
- int last;
+ ucs_char_t first;
+ ucs_char_t last;
};
size_t display_mode_esc_sequence_len(const char *s)
@@ -528,7 +528,7 @@ char *reencode_string_iconv(const char *in, size_t insz, iconv_t conv, int *outs
while (1) {
size_t cnt = iconv(conv, &cp, &insz, &outpos, &outsz);
- if (cnt == -1) {
+ if (cnt == (size_t) -1) {
size_t sofar;
if (errno != E2BIG) {
free(out);
diff --git a/versioncmp.c b/versioncmp.c
new file mode 100644
index 0000000000..7511e08271
--- /dev/null
+++ b/versioncmp.c
@@ -0,0 +1,93 @@
+#include "cache.h"
+
+/*
+ * versioncmp(): copied from string/strverscmp.c in glibc commit
+ * ee9247c38a8def24a59eb5cfb7196a98bef8cfdc, reformatted to Git coding
+ * style. The implementation is under LGPL-2.1 and Git relicenses it
+ * to GPLv2.
+ */
+
+/*
+ * states: S_N: normal, S_I: comparing integral part, S_F: comparing
+ * fractionnal parts, S_Z: idem but with leading Zeroes only
+ */
+#define S_N 0x0
+#define S_I 0x3
+#define S_F 0x6
+#define S_Z 0x9
+
+/* result_type: CMP: return diff; LEN: compare using len_diff/diff */
+#define CMP 2
+#define LEN 3
+
+
+/*
+ * Compare S1 and S2 as strings holding indices/version numbers,
+ * returning less than, equal to or greater than zero if S1 is less
+ * than, equal to or greater than S2 (for more info, see the texinfo
+ * doc).
+ */
+
+int versioncmp(const char *s1, const char *s2)
+{
+ const unsigned char *p1 = (const unsigned char *) s1;
+ const unsigned char *p2 = (const unsigned char *) s2;
+ unsigned char c1, c2;
+ int state, diff;
+
+ /*
+ * Symbol(s) 0 [1-9] others
+ * Transition (10) 0 (01) d (00) x
+ */
+ static const uint8_t next_state[] = {
+ /* state x d 0 */
+ /* S_N */ S_N, S_I, S_Z,
+ /* S_I */ S_N, S_I, S_I,
+ /* S_F */ S_N, S_F, S_F,
+ /* S_Z */ S_N, S_F, S_Z
+ };
+
+ static const int8_t result_type[] = {
+ /* state x/x x/d x/0 d/x d/d d/0 0/x 0/d 0/0 */
+
+ /* S_N */ CMP, CMP, CMP, CMP, LEN, CMP, CMP, CMP, CMP,
+ /* S_I */ CMP, -1, -1, +1, LEN, LEN, +1, LEN, LEN,
+ /* S_F */ CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
+ /* S_Z */ CMP, +1, +1, -1, CMP, CMP, -1, CMP, CMP
+ };
+
+ if (p1 == p2)
+ return 0;
+
+ c1 = *p1++;
+ c2 = *p2++;
+ /* Hint: '0' is a digit too. */
+ state = S_N + ((c1 == '0') + (isdigit (c1) != 0));
+
+ while ((diff = c1 - c2) == 0) {
+ if (c1 == '\0')
+ return diff;
+
+ state = next_state[state];
+ c1 = *p1++;
+ c2 = *p2++;
+ state += (c1 == '0') + (isdigit (c1) != 0);
+ }
+
+ state = result_type[state * 3 + (((c2 == '0') + (isdigit (c2) != 0)))];
+
+ switch (state) {
+ case CMP:
+ return diff;
+
+ case LEN:
+ while (isdigit (*p1++))
+ if (!isdigit (*p2++))
+ return 1;
+
+ return isdigit (*p2) ? -1 : diff;
+
+ default:
+ return state;
+ }
+}
diff --git a/walker.c b/walker.c
index 633596e06f..1dd86b8f33 100644
--- a/walker.c
+++ b/walker.c
@@ -60,6 +60,7 @@ static int process_tree(struct walker *walker, struct tree *tree)
return 0;
}
+/* Remember to update object flag allocation in object.h */
#define COMPLETE (1U << 0)
#define SEEN (1U << 1)
#define TO_SCAN (1U << 2)
diff --git a/wrapper.c b/wrapper.c
index 0cc56368bd..bc1bfb8600 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -174,6 +174,24 @@ ssize_t xwrite(int fd, const void *buf, size_t len)
}
}
+/*
+ * xpread() is the same as pread(), but it automatically restarts pread()
+ * operations with a recoverable error (EAGAIN and EINTR). xpread() DOES
+ * NOT GUARANTEE that "len" bytes is read even if the data is available.
+ */
+ssize_t xpread(int fd, void *buf, size_t len, off_t offset)
+{
+ ssize_t nr;
+ if (len > MAX_IO_SIZE)
+ len = MAX_IO_SIZE;
+ while (1) {
+ nr = pread(fd, buf, len, offset);
+ if ((nr < 0) && (errno == EAGAIN || errno == EINTR))
+ continue;
+ return nr;
+ }
+}
+
ssize_t read_in_full(int fd, void *buf, size_t count)
{
char *p = buf;
@@ -214,6 +232,26 @@ ssize_t write_in_full(int fd, const void *buf, size_t count)
return total;
}
+ssize_t pread_in_full(int fd, void *buf, size_t count, off_t offset)
+{
+ char *p = buf;
+ ssize_t total = 0;
+
+ while (count > 0) {
+ ssize_t loaded = xpread(fd, p, count, offset);
+ if (loaded < 0)
+ return -1;
+ if (loaded == 0)
+ return total;
+ count -= loaded;
+ p += loaded;
+ total += loaded;
+ offset += loaded;
+ }
+
+ return total;
+}
+
int xdup(int fd)
{
int ret = dup(fd);
diff --git a/ws.c b/ws.c
index b498d7599d..ea4b2b1dfd 100644
--- a/ws.c
+++ b/ws.c
@@ -33,11 +33,8 @@ unsigned parse_whitespace_rule(const char *string)
int negated = 0;
string = string + strspn(string, ", \t\n\r");
- ep = strchr(string, ',');
- if (!ep)
- len = strlen(string);
- else
- len = ep - string;
+ ep = strchrnul(string, ',');
+ len = ep - string;
if (*string == '-') {
negated = 1;
diff --git a/wt-status.c b/wt-status.c
index 9bf96c3af0..86fec8986f 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -17,7 +17,7 @@
#include "strbuf.h"
#include "utf8.h"
-static char cut_line[] =
+static const char cut_line[] =
"------------------------ >8 ------------------------\n";
static char default_wt_status_colors[][COLOR_MAXLEN] = {
@@ -519,9 +519,19 @@ static void wt_status_collect_changes_index(struct wt_status *s)
opt.def = s->is_initial ? EMPTY_TREE_SHA1_HEX : s->reference;
setup_revisions(0, NULL, &rev, &opt);
+ DIFF_OPT_SET(&rev.diffopt, OVERRIDE_SUBMODULE_CONFIG);
if (s->ignore_submodule_arg) {
- DIFF_OPT_SET(&rev.diffopt, OVERRIDE_SUBMODULE_CONFIG);
handle_ignore_submodules_arg(&rev.diffopt, s->ignore_submodule_arg);
+ } else {
+ /*
+ * Unless the user did explicitly request a submodule ignore
+ * mode by passing a command line option we do not ignore any
+ * changed submodule SHA-1s when comparing index and HEAD, no
+ * matter what is configured. Otherwise the user won't be
+ * shown any submodules she manually added (and which are
+ * staged to be committed), which would be really confusing.
+ */
+ handle_ignore_submodules_arg(&rev.diffopt, "dirty");
}
rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK;
@@ -841,6 +851,17 @@ void wt_status_truncate_message_at_cut_line(struct strbuf *buf)
strbuf_release(&pattern);
}
+void wt_status_add_cut_line(FILE *fp)
+{
+ const char *explanation = _("Do not touch the line above.\nEverything below will be removed.");
+ struct strbuf buf = STRBUF_INIT;
+
+ fprintf(fp, "%c %s", comment_line_char, cut_line);
+ strbuf_add_commented_lines(&buf, explanation, strlen(explanation));
+ fputs(buf.buf, fp);
+ strbuf_release(&buf);
+}
+
static void wt_status_print_verbose(struct wt_status *s)
{
struct rev_info rev;
@@ -866,14 +887,8 @@ static void wt_status_print_verbose(struct wt_status *s)
* diff before committing.
*/
if (s->fp != stdout) {
- const char *explanation = _("Do not touch the line above.\nEverything below will be removed.");
- struct strbuf buf = STRBUF_INIT;
-
rev.diffopt.use_color = 0;
- fprintf(s->fp, "%c %s", comment_line_char, cut_line);
- strbuf_add_commented_lines(&buf, explanation, strlen(explanation));
- fputs(buf.buf, s->fp);
- strbuf_release(&buf);
+ wt_status_add_cut_line(s->fp);
}
run_diff_index(&rev, 1);
}
diff --git a/wt-status.h b/wt-status.h
index 82f6ce64f8..283a9fef03 100644
--- a/wt-status.h
+++ b/wt-status.h
@@ -93,6 +93,7 @@ struct wt_status_state {
};
void wt_status_truncate_message_at_cut_line(struct strbuf *);
+void wt_status_add_cut_line(FILE *fp);
void wt_status_prepare(struct wt_status *s);
void wt_status_print(struct wt_status *s);
void wt_status_collect(struct wt_status *s);