summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.mailmap1
-rw-r--r--Documentation/CodingGuidelines27
-rw-r--r--Documentation/RelNotes/2.3.1.txt52
-rw-r--r--Documentation/RelNotes/2.3.2.txt79
-rw-r--r--Documentation/RelNotes/2.3.3.txt39
-rw-r--r--Documentation/RelNotes/2.3.4.txt32
-rw-r--r--Documentation/RelNotes/2.3.5.txt44
-rw-r--r--Documentation/RelNotes/2.3.6.txt13
-rw-r--r--Documentation/RelNotes/2.3.7.txt21
-rw-r--r--Documentation/RelNotes/2.3.8.txt22
-rw-r--r--Documentation/RelNotes/2.4.0.txt514
-rw-r--r--Documentation/RelNotes/2.4.1.txt40
-rw-r--r--Documentation/RelNotes/2.4.2.txt45
-rw-r--r--Documentation/RelNotes/2.4.3.txt76
-rw-r--r--Documentation/SubmittingPatches5
-rw-r--r--Documentation/blame-options.txt4
-rw-r--r--Documentation/config.txt432
-rw-r--r--Documentation/diff-config.txt10
-rw-r--r--Documentation/diff-format.txt3
-rw-r--r--Documentation/diff-generate-patch.txt2
-rw-r--r--Documentation/diff-options.txt23
-rw-r--r--Documentation/fetch-options.txt2
-rw-r--r--Documentation/git-add.txt7
-rw-r--r--Documentation/git-am.txt3
-rw-r--r--Documentation/git-apply.txt14
-rw-r--r--Documentation/git-branch.txt6
-rw-r--r--Documentation/git-check-ignore.txt2
-rw-r--r--Documentation/git-checkout.txt4
-rw-r--r--Documentation/git-cherry-pick.txt3
-rw-r--r--Documentation/git-clean.txt8
-rw-r--r--Documentation/git-commit-tree.txt2
-rw-r--r--Documentation/git-commit.txt19
-rw-r--r--Documentation/git-config.txt2
-rw-r--r--Documentation/git-credential-store.txt35
-rw-r--r--Documentation/git-cvsserver.txt22
-rw-r--r--Documentation/git-fast-export.txt6
-rw-r--r--Documentation/git-fast-import.txt34
-rw-r--r--Documentation/git-fetch-pack.txt2
-rw-r--r--Documentation/git-fetch.txt2
-rw-r--r--Documentation/git-format-patch.txt4
-rw-r--r--Documentation/git-gc.txt12
-rw-r--r--Documentation/git-hash-object.txt10
-rw-r--r--Documentation/git-http-backend.txt13
-rw-r--r--Documentation/git-imap-send.txt3
-rw-r--r--Documentation/git-init.txt2
-rw-r--r--Documentation/git-instaweb.txt2
-rw-r--r--Documentation/git-log.txt6
-rw-r--r--Documentation/git-merge.txt4
-rw-r--r--Documentation/git-pack-objects.txt2
-rw-r--r--Documentation/git-pull.txt7
-rw-r--r--Documentation/git-push.txt41
-rw-r--r--Documentation/git-rebase.txt12
-rw-r--r--Documentation/git-receive-pack.txt2
-rw-r--r--Documentation/git-reflog.txt144
-rw-r--r--Documentation/git-remote.txt23
-rw-r--r--Documentation/git-repack.txt4
-rw-r--r--Documentation/git-rerere.txt2
-rw-r--r--Documentation/git-rev-list.txt96
-rw-r--r--Documentation/git-rev-parse.txt4
-rw-r--r--Documentation/git-send-email.txt50
-rw-r--r--Documentation/git-send-pack.txt2
-rw-r--r--Documentation/git-show.txt2
-rw-r--r--Documentation/git-status.txt12
-rw-r--r--Documentation/git-stripspace.txt6
-rw-r--r--Documentation/git-submodule.txt66
-rw-r--r--Documentation/git-svn.txt10
-rw-r--r--Documentation/git-tag.txt15
-rw-r--r--Documentation/git-unpack-objects.txt6
-rw-r--r--Documentation/git-verify-pack.txt2
-rw-r--r--Documentation/git.txt34
-rw-r--r--Documentation/gitattributes.txt2
-rw-r--r--Documentation/gitcore-tutorial.txt2
-rw-r--r--Documentation/gitcredentials.txt2
-rw-r--r--Documentation/gitdiffcore.txt6
-rw-r--r--Documentation/gitignore.txt4
-rw-r--r--Documentation/gitk.txt4
-rw-r--r--Documentation/gitmodules.txt21
-rw-r--r--Documentation/gitremote-helpers.txt14
-rw-r--r--Documentation/gitweb.conf.txt4
-rw-r--r--Documentation/howto/recover-corrupted-object-harder.txt237
-rw-r--r--Documentation/line-range-format.txt11
-rw-r--r--Documentation/merge-config.txt2
-rw-r--r--Documentation/pretty-formats.txt5
-rw-r--r--Documentation/rev-list-options.txt25
-rw-r--r--Documentation/technical/api-error-handling.txt75
-rw-r--r--Documentation/technical/api-strbuf.txt351
-rw-r--r--Documentation/technical/pack-protocol.txt10
-rw-r--r--Documentation/user-manual.txt2
-rwxr-xr-xGIT-VERSION-GEN2
-rw-r--r--Makefile11
l---------RelNotes2
-rw-r--r--archive-zip.c27
-rw-r--r--attr.c63
-rw-r--r--branch.c5
-rw-r--r--builtin/add.c3
-rw-r--r--builtin/apply.c180
-rw-r--r--builtin/blame.c21
-rw-r--r--builtin/branch.c19
-rw-r--r--builtin/bundle.c8
-rw-r--r--builtin/clean.c11
-rw-r--r--builtin/clone.c15
-rw-r--r--builtin/commit.c20
-rw-r--r--builtin/config.c10
-rw-r--r--builtin/fetch.c7
-rw-r--r--builtin/fmt-merge-msg.c16
-rw-r--r--builtin/for-each-ref.c7
-rw-r--r--builtin/grep.c6
-rw-r--r--builtin/hash-object.c4
-rw-r--r--builtin/help.c5
-rw-r--r--builtin/index-pack.c1
-rw-r--r--builtin/init-db.c18
-rw-r--r--builtin/ls-files.c43
-rw-r--r--builtin/merge-file.c3
-rw-r--r--builtin/pack-objects.c6
-rw-r--r--builtin/prune.c1
-rw-r--r--builtin/push.c21
-rw-r--r--builtin/receive-pack.c26
-rw-r--r--builtin/reflog.c9
-rw-r--r--builtin/repack.c8
-rw-r--r--builtin/replace.c2
-rw-r--r--builtin/rm.c3
-rw-r--r--builtin/tag.c6
-rw-r--r--builtin/update-index.c1
-rw-r--r--builtin/update-ref.c20
-rw-r--r--bulk-checkin.c1
-rw-r--r--bundle.c11
-rw-r--r--cache.h40
-rwxr-xr-xcheck-builtins.sh2
-rw-r--r--config.c23
-rw-r--r--config.mak.uname5
-rw-r--r--configure.ac23
-rw-r--r--connect.c114
-rw-r--r--contrib/completion/git-completion.bash19
-rw-r--r--contrib/completion/git-prompt.sh2
-rw-r--r--contrib/credential/wincred/git-credential-wincred.c25
-rwxr-xr-xcontrib/diff-highlight/diff-highlight9
-rw-r--r--contrib/hooks/multimail/README43
-rw-r--r--contrib/hooks/multimail/README.Git6
-rw-r--r--credential-store.c90
-rw-r--r--csum-file.c10
-rw-r--r--ctype.c2
-rw-r--r--daemon.c214
-rw-r--r--date.c14
-rw-r--r--diff-lib.c8
-rw-r--r--diff-no-index.c66
-rw-r--r--diff.c3
-rw-r--r--diffcore-rename.c44
-rw-r--r--dir.c62
-rw-r--r--dir.h1
-rw-r--r--environment.c1
-rw-r--r--ewah/ewok.h3
-rw-r--r--exec_cmd.c1
-rw-r--r--fast-import.c15
-rw-r--r--fetch-pack.c14
-rw-r--r--gettext.c25
-rw-r--r--gettext.h2
-rwxr-xr-xgit-add--interactive.perl5
-rw-r--r--git-compat-util.h78
-rwxr-xr-xgit-filter-branch.sh10
-rwxr-xr-xgit-gui/GIT-VERSION-GEN2
-rw-r--r--git-gui/Makefile3
-rwxr-xr-xgit-gui/git-gui.sh42
-rw-r--r--git-gui/lib/choose_repository.tcl55
-rw-r--r--git-gui/lib/diff.tcl20
-rw-r--r--git-gui/lib/option.tcl1
-rw-r--r--git-gui/macosx/AppMain.tcl7
-rw-r--r--git-gui/po/bg.po650
-rw-r--r--git-gui/po/sv.po2993
-rw-r--r--git-gui/po/vi.po2690
-rwxr-xr-xgit-instaweb.sh3
-rwxr-xr-xgit-pull.sh9
-rw-r--r--git-rebase--interactive.sh36
-rwxr-xr-xgit-rebase.sh2
-rwxr-xr-xgit-remote-testgit.sh8
-rwxr-xr-xgit-send-email.perl11
-rwxr-xr-xgit-stash.sh19
-rwxr-xr-xgit-submodule.sh2
-rwxr-xr-xgit-svn.perl13
-rw-r--r--git.c15
-rwxr-xr-xgitk-git/gitk132
-rw-r--r--gitk-git/po/bg.po622
-rw-r--r--gitk-git/po/ca.po1354
-rw-r--r--gitk-git/po/de.po748
-rw-r--r--gitk-git/po/es.po1006
-rw-r--r--gitk-git/po/fr.po817
-rw-r--r--gitk-git/po/hu.po757
-rw-r--r--gitk-git/po/it.po734
-rw-r--r--gitk-git/po/ja.po769
-rw-r--r--gitk-git/po/pt_br.po739
-rw-r--r--gitk-git/po/ru.po973
-rw-r--r--gitk-git/po/sv.po639
-rw-r--r--gitk-git/po/vi.po641
-rw-r--r--hex.c2
-rw-r--r--http-backend.c110
-rw-r--r--http-push.c2
-rw-r--r--http.c127
-rw-r--r--imap-send.c17
-rw-r--r--kwset.c8
-rw-r--r--kwset.h2
-rw-r--r--line-log.c3
-rw-r--r--log-tree.c101
-rw-r--r--merge-blobs.c4
-rw-r--r--merge-recursive.c6
-rw-r--r--object.c3
-rw-r--r--pack-bitmap.c10
-rw-r--r--pager.c8
-rw-r--r--parse-options.h3
-rw-r--r--path.c54
-rw-r--r--perl/Git.pm4
-rw-r--r--perl/Git/SVN.pm25
-rw-r--r--perl/Git/SVN/Editor.pm3
-rw-r--r--perl/Git/SVN/Fetcher.pm11
-rw-r--r--perl/Git/SVN/Ra.pm8
-rw-r--r--po/TEAMS7
-rw-r--r--po/bg.po2892
-rw-r--r--po/ca.po1877
-rw-r--r--po/de.po1903
-rw-r--r--po/fr.po1880
-rw-r--r--po/git.pot1659
-rw-r--r--po/ru.po10633
-rw-r--r--po/sv.po1850
-rw-r--r--po/vi.po1897
-rw-r--r--po/zh_CN.po2212
-rw-r--r--pretty.c2
-rw-r--r--reachable.c6
-rw-r--r--read-cache.c62
-rw-r--r--refs.c651
-rw-r--r--refs.h113
-rw-r--r--remote-curl.c5
-rw-r--r--rerere.c2
-rw-r--r--revision.c28
-rw-r--r--run-command.c27
-rw-r--r--run-command.h13
-rw-r--r--send-pack.c25
-rw-r--r--sequencer.c7
-rw-r--r--sha1_file.c97
-rw-r--r--sha1_name.c17
-rw-r--r--strbuf.h470
-rw-r--r--streaming.c5
-rw-r--r--submodule.c7
-rw-r--r--t/README10
-rw-r--r--t/annotate-tests.sh2
-rw-r--r--t/diff-lib.sh2
-rw-r--r--t/diff-lib/COPYING361
-rw-r--r--t/diff-lib/README46
-rwxr-xr-xt/lib-gpg.sh4
-rw-r--r--t/lib-gpg/keyring.gpg54
-rw-r--r--t/lib-httpd.sh15
-rw-r--r--t/lib-httpd/apache.conf1
-rw-r--r--t/perf/perf-lib.sh2
-rwxr-xr-xt/t0000-basic.sh4
-rwxr-xr-xt/t0005-signals.sh8
-rwxr-xr-xt/t0008-ignores.sh10
-rwxr-xr-xt/t0011-hashmap.sh2
-rwxr-xr-xt/t0020-crlf.sh224
-rwxr-xr-xt/t0021-conversion.sh26
-rwxr-xr-xt/t0040-parse-options.sh12
-rwxr-xr-xt/t0050-filesystem.sh12
-rwxr-xr-xt/t0056-git-C.sh10
-rwxr-xr-xt/t0061-run-command.sh2
-rwxr-xr-xt/t0062-revision-walking.sh2
-rwxr-xr-xt/t0201-gettext-fallbacks.sh8
-rwxr-xr-xt/t0302-credential-store.sh114
-rwxr-xr-xt/t1002-read-tree-m-u-2way.sh8
-rwxr-xr-xt/t1006-cat-file.sh2
-rwxr-xr-xt/t1007-hash-object.sh19
-rwxr-xr-xt/t1020-subdirectory.sh11
-rwxr-xr-xt/t1300-repo-config.sh4
-rwxr-xr-xt/t1301-shared-repo.sh20
-rwxr-xr-xt/t1307-config-blob.sh9
-rwxr-xr-xt/t1400-update-ref.sh42
-rwxr-xr-xt/t1403-show-ref.sh10
-rwxr-xr-xt/t1404-update-ref-df-conflicts.sh107
-rwxr-xr-xt/t1509-root-worktree.sh17
-rwxr-xr-xt/t1509/prepare-chroot.sh38
-rwxr-xr-xt/t1700-split-index.sh17
-rwxr-xr-xt/t3001-ls-files-others-exclude.sh2
-rwxr-xr-xt/t3010-ls-files-killed-modified.sh17
-rwxr-xr-xt/t3031-merge-criscross.sh2
-rwxr-xr-xt/t3060-ls-files-with-tree.sh14
-rwxr-xr-xt/t3202-show-branch-octopus.sh2
-rwxr-xr-xt/t3203-branch-output.sh39
-rwxr-xr-xt/t3305-notes-fanout.sh9
-rwxr-xr-xt/t3404-rebase-interactive.sh67
-rwxr-xr-xt/t3405-rebase-malformed.sh4
-rwxr-xr-xt/t3425-rebase-topology-merges.sh4
-rwxr-xr-xt/t3511-cherry-pick-x.sh28
-rwxr-xr-xt/t3600-rm.sh42
-rwxr-xr-xt/t3702-add-edit.sh7
-rwxr-xr-xt/t3901-i18n-patch.sh8
-rwxr-xr-xt/t3903-stash.sh25
-rwxr-xr-xt/t4003-diff-rename-1.sh4
-rwxr-xr-xt/t4005-diff-rename-2.sh4
-rwxr-xr-xt/t4007-rename-3.sh2
-rwxr-xr-xt/t4008-diff-break-rewrite.sh292
-rwxr-xr-xt/t4009-diff-rename-4.sh4
-rwxr-xr-xt/t4010-diff-pathspec.sh2
-rw-r--r--t/t4013/diff.log_--decorate=full_--all2
-rw-r--r--t/t4013/diff.log_--decorate_--all2
-rwxr-xr-xt/t4014-format-patch.sh2
-rwxr-xr-xt/t4022-diff-rewrite.sh5
-rwxr-xr-xt/t4024-diff-optimize-common.sh2
-rwxr-xr-xt/t4026-color.sh6
-rwxr-xr-xt/t4035-diff-quiet.sh66
-rwxr-xr-xt/t4041-diff-submodule-option.sh12
-rwxr-xr-xt/t4046-diff-unmerged.sh8
-rwxr-xr-xt/t4047-diff-dirstat.sh16
-rwxr-xr-xt/t4049-diff-stat-count.sh6
-rwxr-xr-xt/t4052-stat-output.sh48
-rwxr-xr-xt/t4053-diff-no-index.sh38
-rwxr-xr-xt/t4054-diff-bogus-tree.sh2
-rwxr-xr-xt/t4058-diff-duplicates.sh79
-rwxr-xr-xt/t4104-apply-boundary.sh32
-rwxr-xr-xt/t4117-apply-reject.sh66
-rwxr-xr-xt/t4122-apply-symlink-inside.sh117
-rwxr-xr-xt/t4124-apply-ws-rule.sh5
-rwxr-xr-xt/t4138-apply-ws-expansion.sh121
-rwxr-xr-xt/t4139-apply-escape.sh141
-rwxr-xr-xt/t4151-am-abort.sh2
-rwxr-xr-xt/t4202-log.sh36
-rwxr-xr-xt/t4207-log-decoration-colors.sh16
-rwxr-xr-xt/t4211-line-log.sh8
-rwxr-xr-xt/t4212-log-corrupt.sh2
-rwxr-xr-xt/t5003-archive-zip.sh47
-rwxr-xr-xt/t5004-archive-corner-cases.sh6
-rwxr-xr-xt/t5100-mailinfo.sh2
-rwxr-xr-xt/t5304-prune.sh8
-rwxr-xr-xt/t5312-prune-corruption.sh114
-rwxr-xr-xt/t5500-fetch-pack.sh64
-rwxr-xr-xt/t5503-tagfollow.sh4
-rwxr-xr-xt/t5505-remote.sh8
-rwxr-xr-xt/t5510-fetch.sh4
-rwxr-xr-xt/t5512-ls-remote.sh6
-rwxr-xr-xt/t5514-fetch-multiple.sh4
-rwxr-xr-xt/t5516-fetch-push.sh70
-rwxr-xr-xt/t5524-pull-msg.sh17
-rwxr-xr-xt/t5526-fetch-submodules.sh10
-rwxr-xr-xt/t5528-push-default.sh4
-rwxr-xr-xt/t5531-deep-submodule-push.sh2
-rwxr-xr-xt/t5533-push-cas.sh6
-rwxr-xr-xt/t5539-fetch-http-shallow.sh6
-rwxr-xr-xt/t5540-http-push-webdav.sh2
-rwxr-xr-xt/t5541-http-push-smart.sh13
-rwxr-xr-xt/t5542-push-http-shallow.sh6
-rwxr-xr-xt/t5550-http-fetch-dumb.sh72
-rwxr-xr-xt/t5551-http-fetch-smart.sh87
-rwxr-xr-xt/t5561-http-backend.sh6
-rwxr-xr-xt/t5570-git-daemon.sh27
-rwxr-xr-xt/t5601-clone.sh109
-rwxr-xr-xt/t5709-clone-refspec.sh2
-rwxr-xr-xt/t5801-remote-helpers.sh24
-rwxr-xr-xt/t6000-rev-list-misc.sh8
-rwxr-xr-xt/t6006-rev-list-format.sh7
-rwxr-xr-xt/t6012-rev-list-simplify.sh10
-rwxr-xr-xt/t6014-rev-list-all.sh4
-rwxr-xr-xt/t6022-merge-rename.sh6
-rwxr-xr-xt/t6023-merge-file.sh3
-rwxr-xr-xt/t6026-merge-attr.sh6
-rwxr-xr-xt/t6028-merge-up-to-date.sh2
-rwxr-xr-xt/t6030-bisect-porcelain.sh91
-rwxr-xr-xt/t6032-merge-large-rename.sh6
-rwxr-xr-xt/t6034-merge-rename-nocruft.sh66
-rwxr-xr-xt/t6036-recursive-corner-cases.sh11
-rwxr-xr-xt/t6039-merge-ignorecase.sh2
-rwxr-xr-xt/t6040-tracking-info.sh7
-rwxr-xr-xt/t6111-rev-list-treesame.sh7
-rwxr-xr-xt/t6132-pathspec-exclude.sh28
-rwxr-xr-xt/t6200-fmt-merge-msg.sh2
-rwxr-xr-xt/t7001-mv.sh5
-rwxr-xr-xt/t7003-filter-branch.sh10
-rwxr-xr-xt/t7004-tag.sh36
-rwxr-xr-xt/t7006-pager.sh2
-rwxr-xr-xt/t7007-show.sh4
-rwxr-xr-xt/t7009-filter-branch-null-sha1.sh2
-rwxr-xr-xt/t7061-wtstatus-ignore.sh9
-rwxr-xr-xt/t7201-co.sh21
-rwxr-xr-xt/t7300-clean.sh10
-rwxr-xr-xt/t7400-submodule-basic.sh21
-rwxr-xr-xt/t7406-submodule-update.sh2
-rwxr-xr-xt/t7508-status.sh113
-rwxr-xr-xt/t7510-signed-commit.sh6
-rwxr-xr-xt/t7516-commit-races.sh30
-rwxr-xr-xt/t7600-merge.sh2
-rwxr-xr-xt/t7601-merge-pull-config.sh8
-rwxr-xr-xt/t7612-merge-verify-signatures.sh2
-rwxr-xr-xt/t7701-repack-unpack-unreachable.sh2
-rwxr-xr-xt/t8003-blame-corner-cases.sh26
-rwxr-xr-xt/t8008-blame-formats.sh2
-rwxr-xr-xt/t9001-send-email.sh37
-rwxr-xr-xt/t9104-git-svn-follow-parent.sh10
-rwxr-xr-xt/t9158-git-svn-mergeinfo.sh4
-rwxr-xr-xt/t9161-git-svn-mergeinfo-push.sh10
-rwxr-xr-xt/t9300-fast-import.sh15
-rwxr-xr-xt/t9500-gitweb-standalone-no-errors.sh7
-rwxr-xr-xt/t9502-gitweb-standalone-parse-output.sh10
-rwxr-xr-xt/t9814-git-p4-rename.sh43
-rwxr-xr-xt/t9902-completion.sh21
-rwxr-xr-xt/t9903-bash-prompt.sh13
-rw-r--r--t/test-lib-functions.sh8
-rw-r--r--t/test-lib.sh58
-rw-r--r--thread-utils.c18
-rw-r--r--trailer.c19
-rw-r--r--transport-helper.c41
-rw-r--r--transport.c10
-rw-r--r--upload-pack.c16
-rw-r--r--userdiff.c1
-rw-r--r--utf8.c11
-rw-r--r--utf8.h3
-rw-r--r--versioncmp.c50
-rw-r--r--walker.c2
-rw-r--r--wrapper.c16
-rw-r--r--wt-status.c39
-rw-r--r--wt-status.h1
-rw-r--r--zlib.c2
414 files changed, 37830 insertions, 16600 deletions
diff --git a/.mailmap b/.mailmap
index bb6f52e..ece2951 100644
--- a/.mailmap
+++ b/.mailmap
@@ -13,6 +13,7 @@ Alex Riesen <raa.lkml@gmail.com> <raa@limbo.localdomain>
Alex Riesen <raa.lkml@gmail.com> <raa@steel.home>
Alex Vandiver <alex@chmrr.net> <alexmv@MIT.EDU>
Alexander Gavrilov <angavrilov@gmail.com>
+Alexander Kuleshov <kuleshovmail@gmail.com>
Alexey Shumkin <alex.crezoff@gmail.com> <zapped@mail.ru>
Alexey Shumkin <alex.crezoff@gmail.com> <Alex.Crezoff@gmail.com>
Anders Kaseorg <andersk@MIT.EDU> <andersk@ksplice.com>
diff --git a/Documentation/CodingGuidelines b/Documentation/CodingGuidelines
index 49089de..c6e536f 100644
--- a/Documentation/CodingGuidelines
+++ b/Documentation/CodingGuidelines
@@ -1,5 +1,5 @@
Like other projects, we also have some guidelines to keep to the
-code. For Git in general, three rough rules are:
+code. For Git in general, a few rough rules are:
- Most importantly, we never say "It's in POSIX; we'll happily
ignore your needs should your system not conform to it."
@@ -418,6 +418,29 @@ Error Messages
- Say what the error is first ("cannot open %s", not "%s: cannot open")
+Externally Visible Names
+
+ - For configuration variable names, follow the existing convention:
+
+ . The section name indicates the affected subsystem.
+
+ . The subsection name, if any, indicates which of an unbounded set
+ of things to set the value for.
+
+ . The variable name describes the effect of tweaking this knob.
+
+ The section and variable names that consist of multiple words are
+ formed by concatenating the words without punctuations (e.g. `-`),
+ and are broken using bumpyCaps in documentation as a hint to the
+ reader.
+
+ When choosing the variable namespace, do not use variable name for
+ specifying possibly unbounded set of things, most notably anything
+ an end user can freely come up with (e.g. branch names). Instead,
+ use subsection names or variable values, like the existing variable
+ branch.<name>.description does.
+
+
Writing Documentation:
Most (if not all) of the documentation pages are written in the
@@ -503,7 +526,7 @@ Writing Documentation:
`backticks around word phrases`, do so.
`--pretty=oneline`
`git rev-list`
- `remote.pushdefault`
+ `remote.pushDefault`
Word phrases enclosed in `backtick characters` are rendered literally
and will not be further expanded. The use of `backticks` to achieve the
diff --git a/Documentation/RelNotes/2.3.1.txt b/Documentation/RelNotes/2.3.1.txt
new file mode 100644
index 0000000..cf96186
--- /dev/null
+++ b/Documentation/RelNotes/2.3.1.txt
@@ -0,0 +1,52 @@
+Git v2.3.1 Release Notes
+========================
+
+Fixes since v2.3
+----------------
+
+ * The interactive "show a list and let the user choose from it"
+ interface "add -i" used showed and prompted to the user even when
+ the candidate list was empty, against which the only "choice" the
+ user could have made was to choose nothing.
+
+ * "git apply --whitespace=fix" used to under-allocate the memory
+ when the fix resulted in a longer text than the original patch.
+
+ * "git log --help" used to show rev-list options that are irrelevant
+ to the "log" command.
+
+ * The error message from "git commit", when a non-existing author
+ name was given as value to the "--author=" parameter, has been
+ reworded to avoid misunderstanding.
+
+ * A broken pack .idx file in the receiving repository prevented the
+ dumb http transport from fetching a good copy of it from the other
+ side.
+
+ * The documentation incorrectly said that C(opy) and R(ename) are the
+ only ones that can be followed by the score number in the output in
+ the --raw format.
+
+ * Fix a misspelled conditional that is always true.
+
+ * Code to read branch name from various files in .git/ directory
+ would have misbehaved if the code to write them left an empty file.
+
+ * The "git push" documentation made the "--repo=<there>" option
+ easily misunderstood.
+
+ * After attempting and failing a password-less authentication
+ (e.g. kerberos), libcURL refuses to fall back to password based
+ Basic authentication without a bit of help/encouragement.
+
+ * Setting diff.submodule to 'log' made "git format-patch" produce
+ broken patches.
+
+ * "git rerere" (invoked internally from many mergy operations) did
+ not correctly signal errors when told to update the working tree
+ files and failed to do so for whatever reason.
+
+ * "git blame HEAD -- missing" failed to correctly say "HEAD" when it
+ tried to say "No such path 'missing' in HEAD".
+
+Also contains typofixes, documentation updates and trivial code clean-ups.
diff --git a/Documentation/RelNotes/2.3.2.txt b/Documentation/RelNotes/2.3.2.txt
new file mode 100644
index 0000000..93462e4
--- /dev/null
+++ b/Documentation/RelNotes/2.3.2.txt
@@ -0,0 +1,79 @@
+Git v2.3.2 Release Notes
+========================
+
+Fixes since v2.3.1
+------------------
+
+ * "update-index --refresh" used to leak when an entry cannot be
+ refreshed for whatever reason.
+
+ * "git fast-import" used to crash when it could not close and
+ conclude the resulting packfile cleanly.
+
+ * "git blame" died, trying to free an uninitialized piece of memory.
+
+ * "git merge-file" did not work correctly in a subdirectory.
+
+ * "git submodule add" failed to squash "path/to/././submodule" to
+ "path/to/submodule".
+
+ * In v2.2.0, we broke "git prune" that runs in a repository that
+ borrows from an alternate object store.
+
+ * Certain older vintages of cURL give irregular output from
+ "curl-config --vernum", which confused our build system.
+
+ * An earlier workaround to squelch unhelpful deprecation warnings
+ from the compiler on Mac OSX unnecessarily set minimum required
+ version of the OS, which the user might want to raise (or lower)
+ for other reasons.
+
+ * Longstanding configuration variable naming rules has been added to
+ the documentation.
+
+ * The credential helper for Windows (in contrib/) used to mishandle
+ a user name with an at-sign in it.
+
+ * Older GnuPG implementations may not correctly import the keyring
+ material we prepare for the tests to use.
+
+ * Clarify in the documentation that "remote.<nick>.pushURL" and
+ "remote.<nick>.URL" are there to name the same repository accessed
+ via different transports, not two separate repositories.
+
+ * The pack bitmap support did not build with older versions of GCC.
+
+ * Reading configuration from a blob object, when it ends with a lone
+ CR, use to confuse the configuration parser.
+
+ * We didn't format an integer that wouldn't fit in "int" but in
+ "uintmax_t" correctly.
+
+ * "git push --signed" gave an incorrectly worded error message when
+ the other side did not support the capability.
+
+ * "git fetch" over a remote-helper that cannot respond to "list"
+ command could not fetch from a symbolic reference e.g. HEAD.
+
+ * The insn sheet "git rebase -i" creates did not fully honor
+ core.abbrev settings.
+
+ * The tests that wanted to see that file becomes unreadable after
+ running "chmod a-r file", and the tests that wanted to make sure it
+ is not run as root, we used "can we write into the / directory?" as
+ a cheap substitute, but on some platforms that is not a good
+ heuristics. The tests and their prerequisites have been updated to
+ check what they really require.
+
+ * The configuration variable 'mailinfo.scissors' was hard to
+ discover in the documentation.
+
+ * Correct a breakage to git-svn around v2.2 era that triggers
+ premature closing of FileHandle.
+
+ * Even though we officially haven't dropped Perl 5.8 support, the
+ Getopt::Long package that came with it does not support "--no-"
+ prefix to negate a boolean option; manually add support to help
+ people with older Getopt::Long package.
+
+Also contains typofixes, documentation updates and trivial code clean-ups.
diff --git a/Documentation/RelNotes/2.3.3.txt b/Documentation/RelNotes/2.3.3.txt
new file mode 100644
index 0000000..5ef1264
--- /dev/null
+++ b/Documentation/RelNotes/2.3.3.txt
@@ -0,0 +1,39 @@
+Git v2.3.3 Release Notes
+========================
+
+Fixes since v2.3.2
+------------------
+
+ * A corrupt input to "git diff -M" used cause us to segfault.
+
+ * The borrowed code in kwset API did not follow our usual convention
+ to use "unsigned char" to store values that range from 0-255.
+
+ * Description given by "grep -h" for its --exclude-standard option
+ was phrased poorly.
+
+ * Documentaton for "git remote add" mentioned "--tags" and
+ "--no-tags" and it was not clear that fetch from the remote in
+ the future will use the default behaviour when neither is given
+ to override it.
+
+ * "git diff --shortstat --dirstat=changes" showed a dirstat based on
+ lines that was never asked by the end user in addition to the
+ dirstat that the user asked for.
+
+ * The interaction between "git submodule update" and the
+ submodule.*.update configuration was not clearly documented.
+
+ * "git apply" was not very careful about reading from, removing,
+ updating and creating paths outside the working tree (under
+ --index/--cached) or the current directory (when used as a
+ replacement for GNU patch).
+
+ * "git daemon" looked up the hostname even when "%CH" and "%IP"
+ interpolations are not requested, which was unnecessary.
+
+ * The "interpolated-path" option of "git daemon" inserted any string
+ client declared on the "host=" capability request without checking.
+ Sanitize and limit %H and %CH to a saner and a valid DNS name.
+
+Also contains typofixes, documentation updates and trivial code clean-ups.
diff --git a/Documentation/RelNotes/2.3.4.txt b/Documentation/RelNotes/2.3.4.txt
new file mode 100644
index 0000000..094c7b8
--- /dev/null
+++ b/Documentation/RelNotes/2.3.4.txt
@@ -0,0 +1,32 @@
+Git v2.3.4 Release Notes
+========================
+
+Fixes since v2.3.3
+------------------
+
+ * The 'color.status.unmerged' configuration was not described.
+
+ * "git log --decorate" did not reset colors correctly around the
+ branch names.
+
+ * "git -C '' subcmd" refused to work in the current directory, unlike
+ "cd ''" which silently behaves as a no-op.
+
+ * "git imap-send" learned to optionally talk with an IMAP server via
+ libcURL; because there is no other option when Git is built with
+ NO_OPENSSL option, use that codepath by default under such
+ configuration.
+
+ * A workaround for certain build of GPG that triggered false breakage
+ in a test has been added.
+
+ * "git rebase -i" recently started to include the number of
+ commits in the insn sheet to be processed, but on a platform
+ that prepends leading whitespaces to "wc -l" output, the numbers
+ are shown with extra whitespaces that aren't necessary.
+
+ * We did not parse username followed by literal IPv6 address in SSH
+ transport URLs, e.g. ssh://user@[2001:db8::1]:22/repo.git
+ correctly.
+
+Also contains typofixes, documentation updates and trivial code clean-ups.
diff --git a/Documentation/RelNotes/2.3.5.txt b/Documentation/RelNotes/2.3.5.txt
new file mode 100644
index 0000000..5b309db
--- /dev/null
+++ b/Documentation/RelNotes/2.3.5.txt
@@ -0,0 +1,44 @@
+Git v2.3.5 Release Notes
+========================
+
+Fixes since v2.3.4
+------------------
+
+ * The prompt script (in contrib/) did not show the untracked sign
+ when working in a subdirectory without any untracked files.
+
+ * Even though "git grep --quiet" is run merely to ask for the exit
+ status, we spawned the pager regardless. Stop doing that.
+
+ * Recommend format-patch and send-email for those who want to submit
+ patches to this project.
+
+ * An failure early in the "git clone" that started creating the
+ working tree and repository could have resulted in some directories
+ and files left without getting cleaned up.
+
+ * "git fetch" that fetches a commit using the allow-tip-sha1-in-want
+ extension could have failed to fetch all the requested refs.
+
+ * The split-index mode introduced at v2.3.0-rc0~41 was broken in the
+ codepath to protect us against a broken reimplementation of Git
+ that writes an invalid index with duplicated index entries, etc.
+
+ * "git prune" used to largely ignore broken refs when deciding which
+ objects are still being used, which could spread an existing small
+ damage and make it a larger one.
+
+ * "git tag -h" used to show the "--column" and "--sort" options
+ that are about listing in a wrong section.
+
+ * The transfer.hiderefs support did not quite work for smart-http
+ transport.
+
+ * The code that reads from the ctags file in the completion script
+ (in contrib/) did not spell ${param/pattern/string} substitution
+ correctly, which happened to work with bash but not with zsh.
+
+ * The explanation on "rebase --preserve-merges", "pull --rebase=preserve",
+ and "push --force-with-lease" in the documentation was unclear.
+
+Also contains typofixes, documentation updates and trivial code clean-ups.
diff --git a/Documentation/RelNotes/2.3.6.txt b/Documentation/RelNotes/2.3.6.txt
new file mode 100644
index 0000000..432f770
--- /dev/null
+++ b/Documentation/RelNotes/2.3.6.txt
@@ -0,0 +1,13 @@
+Git v2.3.6 Release Notes
+========================
+
+Fixes since v2.3.5
+------------------
+
+ * "diff-highlight" (in contrib/) used to show byte-by-byte
+ differences, which meant that multi-byte characters can be chopped
+ in the middle. It learned to pay attention to character boundaries
+ (assuming the UTF-8 payload).
+
+Also contains typofixes, documentation updates and trivial code
+clean-ups.
diff --git a/Documentation/RelNotes/2.3.7.txt b/Documentation/RelNotes/2.3.7.txt
new file mode 100644
index 0000000..fc95812
--- /dev/null
+++ b/Documentation/RelNotes/2.3.7.txt
@@ -0,0 +1,21 @@
+Git v2.3.7 Release Notes
+========================
+
+Fixes since v2.3.6
+------------------
+
+ * An earlier update to the parser that disects a URL broke an
+ address, followed by a colon, followed by an empty string (instead
+ of the port number), e.g. ssh://example.com:/path/to/repo.
+
+ * The completion script (in contrib/) contaminated global namespace
+ and clobbered on a shell variable $x.
+
+ * The "git push --signed" protocol extension did not limit what the
+ "nonce" that is a server-chosen string can contain or how long it
+ can be, which was unnecessarily lax. Limit both the length and the
+ alphabet to a reasonably small space that can still have enough
+ entropy.
+
+Also contains typofixes, documentation updates and trivial code
+clean-ups.
diff --git a/Documentation/RelNotes/2.3.8.txt b/Documentation/RelNotes/2.3.8.txt
new file mode 100644
index 0000000..0b67268
--- /dev/null
+++ b/Documentation/RelNotes/2.3.8.txt
@@ -0,0 +1,22 @@
+Git v2.3.8 Release Notes
+========================
+
+Fixes since v2.3.7
+------------------
+
+ * The usual "git diff" when seeing a file turning into a directory
+ showed a patchset to remove the file and create all files in the
+ directory, but "git diff --no-index" simply refused to work. Also,
+ when asked to compare a file and a directory, imitate POSIX "diff"
+ and compare the file with the file with the same name in the
+ directory, instead of refusing to run.
+
+ * The default $HOME/.gitconfig file created upon "git config --global"
+ that edits it had incorrectly spelled user.name and user.email
+ entries in it.
+
+ * "git commit --date=now" or anything that relies on approxidate lost
+ the daylight-saving-time offset.
+
+Also contains typofixes, documentation updates and trivial code
+clean-ups.
diff --git a/Documentation/RelNotes/2.4.0.txt b/Documentation/RelNotes/2.4.0.txt
new file mode 100644
index 0000000..cde64be
--- /dev/null
+++ b/Documentation/RelNotes/2.4.0.txt
@@ -0,0 +1,514 @@
+Git 2.4 Release Notes
+=====================
+
+Backward compatibility warning(s)
+---------------------------------
+
+This release has a few changes in the user-visible output from
+Porcelain commands. These are not meant to be parsed by scripts, but
+users still may want to be aware of the changes:
+
+ * The output from "git log --decorate" (and, more generally, the "%d"
+ format specifier used in the "--format=<string>" parameter to the
+ "git log" family of commands) has changed. It used to list "HEAD"
+ just like other branches; e.g.,
+
+ $ git log --decorate -1 master
+ commit bdb0f6788fa5e3cacc4315e9ff318a27b2676ff4 (HEAD, master)
+ ...
+
+ This release changes the output slightly when HEAD refers to a
+ branch whose name is also shown in the output. The above is now
+ shown as:
+
+ $ git log --decorate -1 master
+ commit bdb0f6788fa5e3cacc4315e9ff318a27b2676ff4 (HEAD -> master)
+ ...
+
+ * The phrasing "git branch" uses to describe a detached HEAD has been
+ updated to agree with the phrasing used by "git status":
+
+ - When HEAD is at the same commit as when it was originally
+ detached, they now both show "detached at <commit object name>".
+
+ - When HEAD has moved since it was originally detached, they now
+ both show "detached from <commit object name>".
+
+ Previously, "git branch" always used "from".
+
+
+Updates since v2.3
+------------------
+
+Ports
+
+ * Our default I/O size (8 MiB) for large files was too large for some
+ platforms with smaller SSIZE_MAX, leading to read(2)/write(2)
+ failures.
+
+ * We did not check the curl library version before using the
+ CURLOPT_PROXYAUTH feature, which did not exist in older versions of
+ the library.
+
+ * We now detect number of CPUs on older BSD-derived systems.
+
+ * Portability fixes and workarounds for shell scripts have been added
+ to help BSD-derived systems.
+
+
+UI, Workflows & Features
+
+ * The command usage info strings given by "git cmd -h" and in
+ documentation have been tweaked for consistency.
+
+ * The "sync" subcommand of "git p4" now allows users to exclude
+ subdirectories like its "clone" subcommand does.
+
+ * "git log --invert-grep --grep=WIP" will show only commits that do
+ not have the string "WIP" in their messages.
+
+ * "git push" has been taught an "--atomic" option that makes a push
+ that updates more than one ref an "all-or-none" affair.
+
+ * Extending the "push to deploy" feature that was added in 2.3, the
+ behaviour of "git push" when updating the branch that is checked
+ out can now be tweaked by a "push-to-checkout" hook.
+
+ * HTTP-based transports now send Accept-Language when making
+ requests. The languages to accept are inferred from environment
+ variables on the client side (LANGUAGE, etc).
+
+ * "git send-email" used to accept a mistaken "y" (or "yes") as an
+ answer to "What encoding do you want to use [UTF-8]?" without
+ questioning. Now it asks for confirmation when the answer looks too
+ short to be a valid encoding name.
+
+ * When "git apply --whitespace=fix" fixed whitespace errors in the
+ common context lines, the command reports that it did so.
+
+ * "git status" now allows the "-v" option to be given twice, in which
+ case it also shows the differences in the working tree that are not
+ staged to be committed.
+
+ * "git cherry-pick" used to clean up the log message even when it is
+ merely replaying an existing commit. It now replays the message
+ verbatim unless you are editing the message of the resulting
+ commit.
+
+ * "git archive" can now be told to set the 'text' attribute in the
+ resulting zip archive.
+
+ * Output from "git log --decorate" now distinguishes between a
+ detached HEAD vs. a HEAD that points at a branch.
+
+ This is a potentially backward-incompatible change; see above for
+ more information.
+
+ * When HEAD was detached when at commit xyz and hasn't been moved
+ since it was detached, "git status" would report "detached at xyz"
+ whereas "git branch" would report "detached from xyz". Now the
+ output of "git branch" agrees with that of "git status".
+
+ This is a potentially backward-incompatible change; see above for
+ more information.
+
+ * "git -C '' subcmd" now works in the current directory (analogously
+ to "cd ''") rather than dying with an error message.
+ (merge 6a536e2 kn/git-cd-to-empty later to maint).
+
+ * The versionsort.prereleaseSuffix configuration variable can be used
+ to specify that, for example, v1.0-pre1 comes before v1.0.
+
+ * A new "push.followTags" configuration turns the "--follow-tags"
+ option on by default for the "git push" command.
+
+ * "git log --graph --no-walk A B..." is a nonsensical combination of
+ options: "--no-walk" requests discrete points in the history, while
+ "--graph" asks to draw connections between these discrete points.
+ Forbid the use of these options together.
+
+ * "git rev-list --bisect --first-parent" does not work (yet) and can
+ even cause SEGV; forbid it. "git log --bisect --first-parent" would
+ not be useful until "git bisect --first-parent" materializes, so
+ also forbid it for now.
+
+
+Performance, Internal Implementation, Development Support etc.
+
+ * Slightly change the implementation of the N_() macro to help us
+ detect mistakes.
+
+ * Restructure the implementation of "reflog expire" to fit better
+ with the recently updated reference API.
+
+ * The transport-helper did not pass transport options such as
+ verbosity, progress, cloning, etc. to import and export based
+ helpers, like it did for fetch and push based helpers, robbing them
+ of the chance to honor the wish of the end-users better.
+
+ * The tests that wanted to see that a file becomes unreadable after
+ running "chmod a-r file", and the tests that wanted to make sure
+ that they are not run as root, used "can we write into the /
+ directory?" as a cheap substitute. But on some platforms that is
+ not a good heuristic. The tests and their prerequisites have been
+ updated to check what they really require.
+ (merge f400e51 jk/sanity later to maint).
+
+ * Various issues around "reflog expire", e.g. using --updateref when
+ expiring a reflog for a symbolic reference, have been corrected
+ and/or made saner.
+
+ * The documentation for the strbuf API had been split between the API
+ documentation and the header file. Consolidate the documentation in
+ strbuf.h.
+
+ * The error handling functions and conventions are now documented in
+ the API manual (in api-error-handling.txt).
+
+ * Optimize gitattribute look-up, mostly useful in "git grep" on a
+ project that does not use many attributes, by avoiding it when we
+ (should) know that the attributes are not defined in the first
+ place.
+
+ * Typofix in comments.
+ (merge ef2956a ak/git-pm-typofix later to maint).
+
+ * Code clean-up.
+ (merge 0b868f0 sb/hex-object-name-is-at-most-41-bytes-long later to maint).
+ (merge 5d30851 dp/remove-duplicated-header-inclusion later to maint).
+
+ * Simplify the ref transaction API for verifying that "the ref should
+ be pointing at this object".
+
+ * Simplify the code in "git daemon" that parses out and holds
+ hostnames used in request interpolation.
+
+ * Restructure the "git push" codepath to make it easier to add new
+ configuration bits.
+
+ * The run-command interface made it easy to make a pipe for us to
+ read from a process, wait for the process to finish, and then
+ attempt to read its output. But this pattern can lead to deadlock.
+ So introduce a helper to do this correctly (i.e., first read, and
+ then wait the process to finish) and also add code to prevent such
+ abuse in the run-command helper.
+
+ * People often forget to chain the commands in their test together
+ with &&, letting a failure from an earlier command in the test go
+ unnoticed. The new GIT_TEST_CHAIN_LINT mechanism allows you to
+ catch such a mistake more easily.
+
+
+Also contains various documentation updates and code clean-ups.
+
+
+Fixes since v2.3
+----------------
+
+Unless otherwise noted, all the fixes since v2.3 in the maintenance
+track are contained in this release (see the maintenance releases'
+notes for details).
+
+ * "git blame HEAD -- missing" failed to correctly say "HEAD" when it
+ tried to say "No such path 'missing' in HEAD".
+ (merge a46442f jk/blame-commit-label later to maint).
+
+ * "git rerere" (invoked internally from many mergy operations) did
+ not correctly signal errors when it attempted to update the working
+ tree files but failed for whatever reason.
+ (merge 89ea903 jn/rerere-fail-on-auto-update-failure later to maint).
+
+ * Setting diff.submodule to 'log' made "git format-patch" produce
+ broken patches.
+ (merge 339de50 dk/format-patch-ignore-diff-submodule later to maint).
+
+ * After attempting and failing a password-less authentication (e.g.,
+ Kerberos), libcURL refuses to fall back to password-based Basic
+ authentication without a bit of help/encouragement.
+ (merge 4dbe664 bc/http-fallback-to-password-after-krb-fails later to maint).
+
+ * The "git push" documentation for the "--repo=<there>" option was
+ easily misunderstood.
+ (merge 57b92a7 mg/push-repo-option-doc later to maint).
+
+ * Code to read a branch name from various files in the .git/
+ directory would have overrun array limits if asked to read an empty
+ file.
+ (merge 66ec904 jk/status-read-branch-name-fix later to maint).
+
+ * Remove a superfluous conditional that is always true.
+ (merge 94ee8e2 jk/remote-curl-an-array-in-struct-cannot-be-null later to maint).
+
+ * The "git diff --raw" documentation incorrectly implied that C(opy)
+ and R(ename) are the only statuses that can be followed by a score
+ number.
+ (merge ac1c2d9 jc/diff-format-doc later to maint).
+
+ * A broken pack .idx file in the receiving repository prevented the
+ dumb http transport from fetching a good copy of it from the other
+ side.
+ (merge 8b9c2dd jk/dumb-http-idx-fetch-fix later to maint).
+
+ * The error message from "git commit", when a non-existing author
+ name was given as value to the "--author=" parameter, has been
+ reworded to avoid misunderstanding.
+ (merge 1044b1f mg/commit-author-no-match-malformed-message later to maint).
+
+ * "git log --help" used to show rev-list options that are irrelevant
+ to the "log" command.
+ (merge 3cab02d jc/doc-log-rev-list-options later to maint).
+
+ * "git apply --whitespace=fix" used to under-allocate memory when the
+ fix resulted in a longer text than the original patch.
+ (merge 407a792 jc/apply-ws-fix-expands later to maint).
+
+ * The interactive "show a list and let the user choose from it"
+ interface used by "git add -i" unnecessarily prompted the user even
+ when the candidate list was empty, against which the only "choice"
+ the user could have made was to choose nothing.
+ (merge a9c4641 ak/add-i-empty-candidates later to maint).
+
+ * The todo list created by "git rebase -i" did not fully honor
+ core.abbrev settings.
+ (merge edb72d5 ks/rebase-i-abbrev later to maint).
+
+ * "git fetch" over a remote-helper that cannot respond to the "list"
+ command could not fetch from a symbolic reference (e.g., HEAD).
+ (merge 33cae54 mh/deref-symref-over-helper-transport later to maint).
+
+ * "git push --signed" gave an incorrectly worded error message when
+ the other side did not support the capability.
+
+ * The "git push --signed" protocol extension did not limit what the
+ "nonce" (a server-chosen string) could contain nor how long it
+ could be, which was unnecessarily lax. Limit both the length and
+ the alphabet to a reasonably small space that can still have enough
+ entropy.
+ (merge afcb6ee jc/push-cert later to maint).
+
+ * The completion script (in contrib/) clobbered the shell variable $x
+ in the global shell namespace.
+ (merge 852ff1c ma/bash-completion-leaking-x later to maint).
+
+ * We incorrectly formatted a "uintmax_t" integer that doesn't fit in
+ "int".
+ (merge d306f3d jk/decimal-width-for-uintmax later to maint).
+
+ * The configuration parser used to be confused when reading
+ configuration from a blob object that ends with a lone CR.
+ (merge 1d0655c jk/config-no-ungetc-eof later to maint).
+
+ * The pack bitmap support did not build with older versions of GCC.
+ (merge bd4e882 jk/pack-bitmap later to maint).
+
+ * The documentation wasn't clear that "remote.<nick>.pushURL" and
+ "remote.<nick>.URL" are there to name the same repository accessed
+ via different transports, not two separate repositories.
+ (merge 697f652 jc/remote-set-url-doc later to maint).
+
+ * Older GnuPG implementations may not correctly import the keyring
+ material we prepare for the tests to use.
+ (merge 1f985d6 ch/new-gpg-drops-rfc-1991 later to maint).
+
+ * The credential helper for Windows (in contrib/) used to mishandle
+ user names that contain an at-sign.
+ (merge 13d261e av/wincred-with-at-in-username-fix later to maint).
+
+ * "diff-highlight" (in contrib/) used to show byte-by-byte
+ differences, which could cause multi-byte characters to be chopped
+ in the middle. It learned to pay attention to character boundaries
+ (assuming UTF-8).
+ (merge 8d00662 jk/colors later to maint).
+
+ * Document longstanding configuration variable naming rules in
+ CodingGuidelines.
+ (merge 35840a3 jc/conf-var-doc later to maint).
+
+ * An earlier workaround to squelch unhelpful deprecation warnings
+ from the compiler on OS X unnecessarily set a minimum required
+ version of the OS, which the user might want to raise (or lower)
+ for other reasons.
+ (merge 88c03eb es/squelch-openssl-warnings-on-macosx later to maint).
+
+ * Certain older vintages of cURL give irregular output from
+ "curl-config --vernum", which confused our build system.
+ (merge 3af6792 tc/curl-vernum-output-broken-in-7.11 later to maint).
+
+ * In v2.2.0, we broke "git prune" that runs in a repository that
+ borrows from an alternate object store.
+ (merge b0a4264 jk/prune-mtime later to maint).
+
+ * "git submodule add" failed to squash "path/to/././submodule" to
+ "path/to/submodule".
+ (merge 8196e72 ps/submodule-sanitize-path-upon-add later to maint).
+
+ * "git merge-file" did not work correctly when invoked in a
+ subdirectory.
+ (merge 204a8ff ab/merge-file-prefix later to maint).
+
+ * "git blame" could die trying to free an uninitialized piece of
+ memory.
+ (merge e600592 es/blame-commit-info-fix later to maint).
+
+ * "git fast-import" used to crash when it could not close and
+ finalize the resulting packfile cleanly.
+ (merge 5e915f3 jk/fast-import-die-nicely-fix later to maint).
+
+ * "update-index --refresh" used to leak memory when an entry could
+ not be refreshed for whatever reason.
+ (merge bc1c2ca sb/plug-leak-in-make-cache-entry later to maint).
+
+ * The "interpolated-path" option of "git daemon" inserted any string
+ the client declared on the "host=" capability request without
+ checking. Sanitize and limit %H and %CH to a saner and a valid DNS
+ name.
+ (merge b485373 jk/daemon-interpolate later to maint).
+
+ * "git daemon" unnecessarily looked up the hostname even when "%CH"
+ and "%IP" interpolations were not requested.
+ (merge dc8edc8 rs/daemon-interpolate later to maint).
+
+ * We relied on "--no-" prefix handling in Perl's Getopt::Long
+ package, even though that support didn't exist in Perl 5.8 (which
+ we still support). Manually add support to help people with older
+ Getopt::Long packages.
+ (merge f471494 km/send-email-getopt-long-workarounds later to maint).
+
+ * "git apply" was not very careful about reading from, removing,
+ updating and creating paths outside the working tree (under
+ --index/--cached) or the current directory (when used as a
+ replacement for GNU patch).
+ (merge e0d201b jc/apply-beyond-symlink later to maint).
+
+ * Correct a breakage in git-svn, introduced around the v2.2 era, that
+ can cause FileHandles to be closed prematurely.
+ (merge e426311 ew/svn-maint-fixes later to maint).
+
+ * We did not parse usernames followed by literal IPv6 addresses
+ correctly in SSH transport URLs; e.g.,
+ ssh://user@[2001:db8::1]:22/repo.git.
+ (merge 6b6c5f7 tb/connect-ipv6-parse-fix later to maint).
+
+ * The configuration variable 'mailinfo.scissors' was hard to
+ discover in the documentation.
+ (merge afb5de7 mm/am-c-doc later to maint).
+
+ * The interaction between "git submodule update" and the
+ submodule.*.update configuration was not clearly documented.
+ (merge 5c31acf ms/submodule-update-config-doc later to maint).
+
+ * "git diff --shortstat" used together with "--dirstat=changes" or
+ "--dirstat=files" incorrectly output dirstat information twice.
+ (merge ab27389 mk/diff-shortstat-dirstat-fix later to maint).
+
+ * The manpage for "git remote add" mentioned "--tags" and "--no-tags"
+ but did not explain what happens if neither option is provided.
+ (merge aaba0ab mg/doc-remote-tags-or-not later to maint).
+
+ * The description of "--exclude-standard option" in the output of
+ "git grep -h" was phrased poorly.
+ (merge 77fdb8a nd/grep-exclude-standard-help-fix later to maint).
+
+ * "git rebase -i" recently started to include the number of commits
+ in the todo list, but that output included extraneous whitespace on
+ a platform that prepends leading whitespaces to its "wc -l" output.
+ (merge 2185d3b es/rebase-i-count-todo later to maint).
+
+ * The borrowed code in the kwset API did not follow our usual
+ convention to use "unsigned char" to store values that range from
+ 0-255.
+ (merge 189c860 bw/kwset-use-unsigned later to maint).
+
+ * A corrupt input to "git diff -M" used to cause it to segfault.
+ (merge 4d6be03 jk/diffcore-rename-duplicate later to maint).
+
+ * Certain builds of GPG triggered false breakages in a test.
+ (merge 3f88c1b mg/verify-commit later to maint).
+
+ * "git imap-send" learned to optionally talk with an IMAP server via
+ libcURL. Because there is no other option when Git is built with
+ the NO_OPENSSL option, use libcURL by default in that case.
+ (merge dcd01ea km/imap-send-libcurl-options later to maint).
+
+ * "git log --decorate" did not reset colors correctly around the
+ branch names.
+ (merge 5ee8758 jc/decorate-leaky-separator-color later to maint).
+
+ * The code that reads from the ctags file in the completion script
+ (in contrib/) did not spell ${param/pattern/string} substitution
+ correctly, which happened to work with bash but not with zsh.
+ (merge db8d750 js/completion-ctags-pattern-substitution-fix later to maint).
+
+ * The transfer.hiderefs support did not quite work for smart-http
+ transport.
+ (merge 8ddf3ca jk/smart-http-hide-refs later to maint).
+
+ * In the "git tag -h" output, move the documentation for the
+ "--column" and "--sort" options to the "Tag listing options"
+ section.
+ (merge dd059c6 jk/tag-h-column-is-a-listing-option later to maint).
+
+ * "git prune" used to largely ignore broken refs when deciding which
+ objects are still being used, which could cause reference
+ corruption to lead to object loss.
+ (merge ea56c4e jk/prune-with-corrupt-refs later to maint).
+
+ * The split-index mode introduced in v2.3.0-rc0~41 was broken in the
+ codepath to protect us against a broken reimplementation of Git
+ that writes an invalid index with duplicated index entries, etc.
+ (merge 03f15a7 tg/fix-check-order-with-split-index later to maint).
+
+ * "git fetch", when fetching a commit using the
+ allow-tip-sha1-in-want extension, could have failed to fetch all of
+ the requested refs.
+ (merge 32d0462 jk/fetch-pack later to maint).
+
+ * An failure early in the "git clone" that started creating the
+ working tree and repository could have resulted in the failure to
+ clean up some directories and files.
+ (merge 16eff6c jk/cleanup-failed-clone later to maint).
+
+ * Recommend format-patch and send-email for those who want to submit
+ patches to this project.
+ (merge b25c469 jc/submitting-patches-mention-send-email later to maint).
+
+ * Do not spawn the pager when "git grep" is run with "--quiet".
+ (merge c2048f0 ws/grep-quiet-no-pager later to maint).
+
+ * The prompt script (in contrib/) did not show the untracked sign
+ when working in a subdirectory without any untracked files.
+ (merge 9bdc517 ct/prompt-untracked-fix later to maint).
+
+ * An earlier update to the URL parser broke an address that contains
+ a colon but an empty string for the port number, like
+ ssh://example.com:/path/to/repo.
+ (merge 6b6c5f7 tb/connect-ipv6-parse-fix later to maint).
+
+ * Code cleanups and documentation updates.
+ (merge 2ce63e9 rs/simple-cleanups later to maint).
+ (merge 33baa69 rj/no-xopen-source-for-cygwin later to maint).
+ (merge 817d03e jc/diff-test-updates later to maint).
+ (merge eb32c66 ak/t5516-typofix later to maint).
+ (merge bcd57cb mr/doc-clean-f-f later to maint).
+ (merge 0d6accc mg/doc-status-color-slot later to maint).
+ (merge 53e53c7 sg/completion-remote later to maint).
+ (merge 8fa7975 ak/git-done-help-cleanup later to maint).
+ (merge 9a6f128 rs/deflate-init-cleanup later to maint).
+ (merge 6f75d45 rs/use-isxdigit later to maint).
+ (merge 376e4b3 jk/test-annoyances later to maint).
+ (merge 7032054 nd/doc-git-index-version later to maint).
+ (merge e869c5e tg/test-index-v4 later to maint).
+ (merge 599d223 jk/simplify-csum-file-sha1fd-check later to maint).
+ (merge 260d585 sg/completion-gitcomp-nl-for-refs later to maint).
+ (merge 777c55a jc/report-path-error-to-dir later to maint).
+ (merge fddfaf8 ph/push-doc-cas later to maint).
+ (merge d50d31e ss/pull-rebase-preserve later to maint).
+ (merge c8c3f1d pt/enter-repo-comment-fix later to maint).
+ (merge d7bfb9e jz/gitweb-conf-doc-fix later to maint).
+ (merge f907282 jk/cherry-pick-docfix later to maint).
+ (merge d3c0811 iu/fix-parse-options-h-comment later to maint).
+ (merge 6c3b2af jg/cguide-we-cannot-count later to maint).
+ (merge 2b8bd44 jk/pack-corruption-post-mortem later to maint).
+ (merge 9585cb8 jn/doc-fast-import-no-16-octopus-limit later to maint).
+ (merge 5dcd1b1 ps/grep-help-all-callback-arg later to maint).
+ (merge f1f4c84 va/fix-git-p4-tests later to maint).
diff --git a/Documentation/RelNotes/2.4.1.txt b/Documentation/RelNotes/2.4.1.txt
new file mode 100644
index 0000000..a65a6c5
--- /dev/null
+++ b/Documentation/RelNotes/2.4.1.txt
@@ -0,0 +1,40 @@
+Git v2.4.1 Release Notes
+========================
+
+Fixes since v2.4
+----------------
+
+ * The usual "git diff" when seeing a file turning into a directory
+ showed a patchset to remove the file and create all files in the
+ directory, but "git diff --no-index" simply refused to work. Also,
+ when asked to compare a file and a directory, imitate POSIX "diff"
+ and compare the file with the file with the same name in the
+ directory, instead of refusing to run.
+
+ * The default $HOME/.gitconfig file created upon "git config --global"
+ that edits it had incorrectly spelled user.name and user.email
+ entries in it.
+
+ * "git commit --date=now" or anything that relies on approxidate lost
+ the daylight-saving-time offset.
+
+ * "git cat-file bl $blob" failed to barf even though there is no
+ object type that is "bl".
+
+ * Teach the codepaths that read .gitignore and .gitattributes files
+ that these files encoded in UTF-8 may have UTF-8 BOM marker at the
+ beginning; this makes it in line with what we do for configuration
+ files already.
+
+ * Access to objects in repositories that borrow from another one on a
+ slow NFS server unnecessarily got more expensive due to recent code
+ becoming more cautious in a naive way not to lose objects to pruning.
+
+ * We avoid setting core.worktree when the repository location is the
+ ".git" directory directly at the top level of the working tree, but
+ the code misdetected the case in which the working tree is at the
+ root level of the filesystem (which arguably is a silly thing to
+ do, but still valid).
+
+Also contains typofixes, documentation updates and trivial code
+clean-ups.
diff --git a/Documentation/RelNotes/2.4.2.txt b/Documentation/RelNotes/2.4.2.txt
new file mode 100644
index 0000000..250cdc4
--- /dev/null
+++ b/Documentation/RelNotes/2.4.2.txt
@@ -0,0 +1,45 @@
+Git v2.4.2 Release Notes
+========================
+
+Fixes since v2.4.1
+------------------
+
+ * "git rev-list --objects $old --not --all" to see if everything that
+ is reachable from $old is already connected to the existing refs
+ was very inefficient.
+
+ * "hash-object --literally" introduced in v2.2 was not prepared to
+ take a really long object type name.
+
+ * "git rebase --quiet" was not quite quiet when there is nothing to
+ do.
+
+ * The completion for "log --decorate=" parameter value was incorrect.
+
+ * "filter-branch" corrupted commit log message that ends with an
+ incomplete line on platforms with some "sed" implementations that
+ munge such a line. Work it around by avoiding to use "sed".
+
+ * "git daemon" fails to build from the source under NO_IPV6
+ configuration (regression in 2.4).
+
+ * "git stash pop/apply" forgot to make sure that not just the working
+ tree is clean but also the index is clean. The latter is important
+ as a stash application can conflict and the index will be used for
+ conflict resolution.
+
+ * We have prepended $GIT_EXEC_PATH and the path "git" is installed in
+ (typically "/usr/bin") to $PATH when invoking subprograms and hooks
+ for almost eternity, but the original use case the latter tried to
+ support was semi-bogus (i.e. install git to /opt/foo/git and run it
+ without having /opt/foo on $PATH), and more importantly it has
+ become less and less relevant as Git grew more mainstream (i.e. the
+ users would _want_ to have it on their $PATH). Stop prepending the
+ path in which "git" is installed to users' $PATH, as that would
+ interfere the command search order people depend on (e.g. they may
+ not like versions of programs that are unrelated to Git in /usr/bin
+ and want to override them by having different ones in /usr/local/bin
+ and have the latter directory earlier in their $PATH).
+
+Also contains typofixes, documentation updates and trivial code
+clean-ups.
diff --git a/Documentation/RelNotes/2.4.3.txt b/Documentation/RelNotes/2.4.3.txt
new file mode 100644
index 0000000..914d2c1
--- /dev/null
+++ b/Documentation/RelNotes/2.4.3.txt
@@ -0,0 +1,76 @@
+Git v2.4.3 Release Notes
+========================
+
+Fixes since v2.4.3
+------------------
+
+ * Error messages from "git branch" called remote-tracking branches as
+ "remote branches".
+
+ * "git rerere forget" in a repository without rerere enabled gave a
+ cryptic error message; it should be a silent no-op instead.
+
+ * "git pull --log" and "git pull --no-log" worked as expected, but
+ "git pull --log=20" did not.
+
+ * The pull.ff configuration was supposed to override the merge.ff
+ configuration, but it didn't.
+
+ * The code to read pack-bitmap wanted to allocate a few hundred
+ pointers to a structure, but by mistake allocated and leaked memory
+ enough to hold that many actual structures. Correct the allocation
+ size and also have it on stack, as it is small enough.
+
+ * Various documentation mark-up fixes to make the output more
+ consistent in general and also make AsciiDoctor (an alternative
+ formatter) happier.
+
+ * "git bundle verify" did not diagnose extra parameters on the
+ command line.
+
+ * Multi-ref transaction support we merged a few releases ago
+ unnecessarily kept many file descriptors open, risking to fail with
+ resource exhaustion.
+
+ * The ref API did not handle cases where 'refs/heads/xyzzy/frotz' is
+ removed at the same time as 'refs/heads/xyzzy' is added (or vice
+ versa) very well.
+
+ * The "log --decorate" enhancement in Git 2.4 that shows the commit
+ at the tip of the current branch e.g. "HEAD -> master", did not
+ work with --decorate=full.
+
+ * There was a commented-out (instead of being marked to expect
+ failure) test that documented a breakage that was fixed since the
+ test was written; turn it into a proper test.
+
+ * core.excludesfile (defaulting to $XDG_HOME/git/ignore) is supposed
+ to be overridden by repository-specific .git/info/exclude file, but
+ the order was swapped from the beginning. This belatedly fixes it.
+
+ * The connection initiation code for "ssh" transport tried to absorb
+ differences between the stock "ssh" and Putty-supplied "plink" and
+ its derivatives, but the logic to tell that we are using "plink"
+ variants were too loose and falsely triggered when "plink" appeared
+ anywhere in the path (e.g. "/home/me/bin/uplink/ssh").
+
+ * "git rebase -i" moved the "current" command from "todo" to "done" a
+ bit too prematurely, losing a step when a "pick" did not even start.
+
+ * "git add -e" did not allow the user to abort the operation by
+ killing the editor.
+
+ * Git 2.4 broke setting verbosity and progress levels on "git clone"
+ with native transports.
+
+ * Some time ago, "git blame" (incorrectly) lost the convert_to_git()
+ call when synthesizing a fake "tip" commit that represents the
+ state in the working tree, which broke folks who record the history
+ with LF line ending to make their project portabile across
+ platforms while terminating lines in their working tree files with
+ CRLF for their platform.
+
+ * Code clean-up for xdg configuration path support.
+
+Also contains typofixes, documentation updates and trivial code
+clean-ups.
diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches
index ef0eeb4..98fc4cc 100644
--- a/Documentation/SubmittingPatches
+++ b/Documentation/SubmittingPatches
@@ -136,6 +136,11 @@ that is fine, but please mark it as such.
(4) Sending your patches.
+Learn to use format-patch and send-email if possible. These commands
+are optimized for the workflow of sending patches, avoiding many ways
+your existing e-mail client that is optimized for "multipart/*" mime
+type e-mails to corrupt and render your patches unusable.
+
People on the Git mailing list need to be able to read and
comment on the changes you are submitting. It is important for
a developer to be able to "quote" your changes, using standard
diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt
index 0cebc4f..a09969b 100644
--- a/Documentation/blame-options.txt
+++ b/Documentation/blame-options.txt
@@ -4,13 +4,13 @@
--root::
Do not treat root commits as boundaries. This can also be
- controlled via the `blame.showroot` config option.
+ controlled via the `blame.showRoot` config option.
--show-stats::
Include additional statistics at the end of blame output.
-L <start>,<end>::
--L :<regex>::
+-L :<funcname>::
Annotate only the given line range. May be specified multiple times.
Overlapping ranges are allowed.
+
diff --git a/Documentation/config.txt b/Documentation/config.txt
index ae6791d..f4fb31a 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -14,7 +14,8 @@ the fully qualified variable name of the variable itself is the last
dot-separated segment and the section name is everything before the last
dot. The variable names are case-insensitive, allow only alphanumeric
characters and `-`, and must start with an alphabetic character. Some
-variables may appear multiple times.
+variables may appear multiple times; we say then that the variable is
+multivalued.
Syntax
~~~~~~
@@ -25,7 +26,7 @@ blank lines are ignored.
The file consists of sections and variables. A section begins with
the name of the section in square brackets and continues until the next
-section begins. Section names are not case sensitive. Only alphanumeric
+section begins. Section names are case-insensitive. Only alphanumeric
characters, `-` and `.` are allowed in section names. Each variable
must belong to some section, which means that there must be a section
header before the first setting of a variable.
@@ -40,8 +41,8 @@ in the section header, like in the example below:
--------
Subsection names are case sensitive and can contain any characters except
-newline (doublequote `"` and backslash have to be escaped as `\"` and `\\`,
-respectively). Section headers cannot span multiple
+newline (doublequote `"` and backslash can be included by escaping them
+as `\"` and `\\`, respectively). Section headers cannot span multiple
lines. Variables may belong directly to a section or to a given subsection.
You can have `[section]` if you have `[section "subsection"]`, but you
don't need to.
@@ -53,38 +54,27 @@ restrictions as section names.
All the other lines (and the remainder of the line after the section
header) are recognized as setting variables, in the form
-'name = value'. If there is no equal sign on the line, the entire line
-is taken as 'name' and the variable is recognized as boolean "true".
+'name = value' (or just 'name', which is a short-hand to say that
+the variable is the boolean "true").
The variable names are case-insensitive, allow only alphanumeric characters
-and `-`, and must start with an alphabetic character. There can be more
-than one value for a given variable; we say then that the variable is
-multivalued.
-
-Leading and trailing whitespace in a variable value is discarded.
-Internal whitespace within a variable value is retained verbatim.
+and `-`, and must start with an alphabetic character.
-The values following the equals sign in variable assign are all either
-a string, an integer, or a boolean. Boolean values may be given as yes/no,
-1/0, true/false or on/off. Case is not significant in boolean values, when
-converting value to the canonical form using '--bool' type specifier;
-'git config' will ensure that the output is "true" or "false".
+A line that defines a value can be continued to the next line by
+ending it with a `\`; the backquote and the end-of-line are
+stripped. Leading whitespaces after 'name =', the remainder of the
+line after the first comment character '#' or ';', and trailing
+whitespaces of the line are discarded unless they are enclosed in
+double quotes. Internal whitespaces within the value are retained
+verbatim.
-String values may be entirely or partially enclosed in double quotes.
-You need to enclose variable values in double quotes if you want to
-preserve leading or trailing whitespace, or if the variable value contains
-comment characters (i.e. it contains '#' or ';').
-Double quote `"` and backslash `\` characters in variable values must
-be escaped: use `\"` for `"` and `\\` for `\`.
+Inside double quotes, double quote `"` and backslash `\` characters
+must be escaped: use `\"` for `"` and `\\` for `\`.
The following escape sequences (beside `\"` and `\\`) are recognized:
`\n` for newline character (NL), `\t` for horizontal tabulation (HT, TAB)
and `\b` for backspace (BS). Other char escape sequences (including octal
escape sequences) are invalid.
-Variable values ending in a `\` are continued on the next line in the
-customary UNIX fashion.
-
-Some variables may require a special value format.
Includes
~~~~~~~~
@@ -126,6 +116,60 @@ Example
path = foo ; expand "foo" relative to the current file
path = ~/foo ; expand "foo" in your $HOME directory
+
+Values
+~~~~~~
+
+Values of many variables are treated as a simple string, but there
+are variables that take values of specific types and there are rules
+as to how to spell them.
+
+boolean::
+
+ When a variable is said to take a boolean value, many
+ synonyms are accepted for 'true' and 'false'; these are all
+ case-insensitive.
+
+ true;; Boolean true can be spelled as `yes`, `on`, `true`,
+ or `1`. Also, a variable defined without `= <value>`
+ is taken as true.
+
+ false;; Boolean false can be spelled as `no`, `off`,
+ `false`, or `0`.
++
+When converting value to the canonical form using '--bool' type
+specifier; 'git config' will ensure that the output is "true" or
+"false" (spelled in lowercase).
+
+integer::
+ The value for many variables that specify various sizes can
+ be suffixed with `k`, `M`,... to mean "scale the number by
+ 1024", "by 1024x1024", etc.
+
+color::
+ The value for a variables that takes a color is a list of
+ colors (at most two) and attributes (at most one), separated
+ by spaces. The colors accepted are `normal`, `black`,
+ `red`, `green`, `yellow`, `blue`, `magenta`, `cyan` and
+ `white`; the attributes are `bold`, `dim`, `ul`, `blink` and
+ `reverse`. The first color given is the foreground; the
+ second is the background. The position of the attribute, if
+ any, doesn't matter. Attributes may be turned off specifically
+ by prefixing them with `no` (e.g., `noreverse`, `noul`, etc).
++
+Colors (foreground and background) may also be given as numbers between
+0 and 255; these use ANSI 256-color mode (but note that not all
+terminals may support this). If your terminal supports it, you may also
+specify 24-bit RGB values as hex, like `#ff0ab3`.
++
+The attributes are meant to be reset at the beginning of each item
+in the colored output, so setting color.decorate.branch to `black`
+will paint that branch name in a plain `black`, even if the previous
+thing on the same output line (e.g. opening parenthesis before the
+list of branch names in `log --decorate` output) is set to be
+painted with `bold` or some other attribute.
+
+
Variables
~~~~~~~~~
@@ -225,7 +269,7 @@ See linkgit:git-update-index[1].
+
The default is true (when core.filemode is not specified in the config file).
-core.ignorecase::
+core.ignoreCase::
If true, this option enables various workarounds to enable
Git to work better on filesystems that are not case sensitive,
like FAT. For example, if a directory listing finds
@@ -234,12 +278,12 @@ core.ignorecase::
"Makefile".
+
The default is false, except linkgit:git-clone[1] or linkgit:git-init[1]
-will probe and set core.ignorecase true if appropriate when the repository
+will probe and set core.ignoreCase true if appropriate when the repository
is created.
-core.precomposeunicode::
+core.precomposeUnicode::
This option is only used by Mac OS implementation of Git.
- When core.precomposeunicode=true, Git reverts the unicode decomposition
+ When core.precomposeUnicode=true, Git reverts the unicode decomposition
of filenames done by Mac OS. This is useful when sharing a repository
between Mac OS and Linux or Windows.
(Git for Windows 1.7.10 or higher is needed, or Git under cygwin 1.7).
@@ -264,13 +308,13 @@ core.trustctime::
crawlers and some backup systems).
See linkgit:git-update-index[1]. True by default.
-core.checkstat::
+core.checkStat::
Determines which stat fields to match between the index
and work tree. The user can set this to 'default' or
'minimal'. Default (or explicitly 'default'), is to check
all fields, including the sub-second part of mtime and ctime.
-core.quotepath::
+core.quotePath::
The commands that output paths (e.g. 'ls-files',
'diff'), when not given the `-z` option, will quote
"unusual" characters in the pathname by enclosing the
@@ -474,9 +518,9 @@ core.compression::
-1 is the zlib default. 0 means no compression,
and 1..9 are various speed/size tradeoffs, 9 being slowest.
If set, this provides a default to other compression variables,
- such as 'core.loosecompression' and 'pack.compression'.
+ such as 'core.looseCompression' and 'pack.compression'.
-core.loosecompression::
+core.looseCompression::
An integer -1..9, indicating the compression level for objects that
are not in a pack file. -1 is the zlib default. 0 means no
compression, and 1..9 are various speed/size tradeoffs, 9 being
@@ -537,7 +581,7 @@ be delta compressed, but larger binary media files won't be.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.
-core.excludesfile::
+core.excludesFile::
In addition to '.gitignore' (per-directory) and
'.git/info/exclude', Git looks into this file for patterns
of files which are not meant to be tracked. "`~/`" is expanded
@@ -546,7 +590,7 @@ core.excludesfile::
If $XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/ignore
is used instead. See linkgit:gitignore[5].
-core.askpass::
+core.askPass::
Some commands (e.g. svn and http interfaces) that interactively
ask for a password can be told to use an external program given
via the value of this variable. Can be overridden by the 'GIT_ASKPASS'
@@ -555,11 +599,11 @@ core.askpass::
prompt. The external program shall be given a suitable prompt as
command-line argument and write the password on its STDOUT.
-core.attributesfile::
+core.attributesFile::
In addition to '.gitattributes' (per-directory) and
'.git/info/attributes', Git looks into this file for attributes
(see linkgit:gitattributes[5]). Path expansions are made the same
- way as for `core.excludesfile`. Its default value is
+ way as for `core.excludesFile`. Its default value is
$XDG_CONFIG_HOME/git/attributes. If $XDG_CONFIG_HOME is either not
set or empty, $HOME/.config/git/attributes is used instead.
@@ -569,7 +613,7 @@ core.editor::
variable when it is set, and the environment variable
`GIT_EDITOR` is not set. See linkgit:git-var[1].
-core.commentchar::
+core.commentChar::
Commands such as `commit` and `tag` that lets you edit
messages consider a line that begins with this character
commented, and removes them after the editor returns
@@ -638,7 +682,7 @@ core.whitespace::
is relevant for `indent-with-non-tab` and when Git fixes `tab-in-indent`
errors. The default tab width is 8. Allowed values are 1 to 63.
-core.fsyncobjectfiles::
+core.fsyncObjectFiles::
This boolean will enable 'fsync()' when writing object files.
+
This is a total waste of time and effort on a filesystem that orders
@@ -646,7 +690,7 @@ data writes properly, but can be useful for filesystems that do not use
journalling (traditional UNIX filesystems) or that only journal metadata
and not file contents (OS X's HFS+, or Linux ext3 with "data=writeback").
-core.preloadindex::
+core.preloadIndex::
Enable parallel index preload for operations like 'git diff'
+
This can speed up operations like 'git diff' and 'git status' especially
@@ -683,14 +727,13 @@ core.abbrev::
for abbreviated object names to stay unique for sufficiently long
time.
-add.ignore-errors::
add.ignoreErrors::
+add.ignore-errors (deprecated)::
Tells 'git add' to continue adding files when some files cannot be
added due to indexing errors. Equivalent to the '--ignore-errors'
- option of linkgit:git-add[1]. Older versions of Git accept only
- `add.ignore-errors`, which does not follow the usual naming
- convention for configuration variables. Newer versions of Git
- honor `add.ignoreErrors` as well.
+ option of linkgit:git-add[1]. `add.ignore-errors` is deprecated,
+ as it does not follow the usual naming convention for configuration
+ variables.
alias.*::
Command aliases for the linkgit:git[1] command wrapper - e.g.
@@ -718,7 +761,7 @@ am.keepcr::
by giving '--no-keep-cr' from the command line.
See linkgit:git-am[1], linkgit:git-mailsplit[1].
-apply.ignorewhitespace::
+apply.ignoreWhitespace::
When set to 'change', tells 'git apply' to ignore changes in
whitespace, in the same way as the '--ignore-space-change'
option.
@@ -730,7 +773,7 @@ apply.whitespace::
Tells 'git apply' how to handle whitespaces, in the same way
as the '--whitespace' option. See linkgit:git-apply[1].
-branch.autosetupmerge::
+branch.autoSetupMerge::
Tells 'git branch' and 'git checkout' to set up new branches
so that linkgit:git-pull[1] will appropriately merge from the
starting point branch. Note that even if this option is not set,
@@ -742,7 +785,7 @@ branch.autosetupmerge::
local branch or remote-tracking
branch. This option defaults to true.
-branch.autosetuprebase::
+branch.autoSetupRebase::
When a new branch is created with 'git branch' or 'git checkout'
that tracks another branch, this variable tells Git to set
up pull to rebase instead of merge (see "branch.<name>.rebase").
@@ -753,27 +796,27 @@ branch.autosetuprebase::
remote-tracking branches.
When `always`, rebase will be set to true for all tracking
branches.
- See "branch.autosetupmerge" for details on how to set up a
+ See "branch.autoSetupMerge" for details on how to set up a
branch to track another branch.
This option defaults to never.
branch.<name>.remote::
When on branch <name>, it tells 'git fetch' and 'git push'
which remote to fetch from/push to. The remote to push to
- may be overridden with `remote.pushdefault` (for all branches).
+ may be overridden with `remote.pushDefault` (for all branches).
The remote to push to, for the current branch, may be further
- overridden by `branch.<name>.pushremote`. If no remote is
+ overridden by `branch.<name>.pushRemote`. If no remote is
configured, or if you are not on any branch, it defaults to
- `origin` for fetching and `remote.pushdefault` for pushing.
+ `origin` for fetching and `remote.pushDefault` for pushing.
Additionally, `.` (a period) is the current local repository
(a dot-repository), see `branch.<name>.merge`'s final note below.
-branch.<name>.pushremote::
+branch.<name>.pushRemote::
When on branch <name>, it overrides `branch.<name>.remote` for
- pushing. It also overrides `remote.pushdefault` for pushing
+ pushing. It also overrides `remote.pushDefault` for pushing
from branch <name>. When you pull from one place (e.g. your
upstream) and push to another place (e.g. your own publishing
- repository), you would want to set `remote.pushdefault` to
+ repository), you would want to set `remote.pushDefault` to
specify the remote to push to for all branches, and use this
option to override it for a specific branch.
@@ -795,7 +838,7 @@ branch.<name>.merge::
branch.<name>.merge to the desired branch, and use the relative path
setting `.` (a period) for branch.<name>.remote.
-branch.<name>.mergeoptions::
+branch.<name>.mergeOptions::
Sets default options for merging into branch <name>. The syntax and
supported options are the same as those of linkgit:git-merge[1], but
option values containing whitespace characters are currently not
@@ -847,20 +890,6 @@ color.branch.<slot>::
`remote` (a remote-tracking branch in refs/remotes/),
`upstream` (upstream tracking branch), `plain` (other
refs).
-+
-The value for these configuration variables is a list of colors (at most
-two) and attributes (at most one), separated by spaces. The colors
-accepted are `normal`, `black`, `red`, `green`, `yellow`, `blue`,
-`magenta`, `cyan` and `white`; the attributes are `bold`, `dim`, `ul`,
-`blink` and `reverse`. The first color given is the foreground; the
-second is the background. The position of the attribute, if any,
-doesn't matter. Attributes may be turned off specifically by prefixing
-them with `no` (e.g., `noreverse`, `noul`, etc).
-+
-Colors (foreground and background) may also be given as numbers between
-0 and 255; these use ANSI 256-color mode (but note that not all
-terminals may support this). If your terminal supports it, you may also
-specify 24-bit RGB values as hex, like `#ff0ab3`.
color.diff::
Whether to use ANSI escape sequences to add color to patches.
@@ -880,8 +909,7 @@ color.diff.<slot>::
of `plain` (context text), `meta` (metainformation), `frag`
(hunk header), 'func' (function in hunk header), `old` (removed lines),
`new` (added lines), `commit` (commit headers), or `whitespace`
- (highlighting whitespace errors). The values of these variables may be
- specified as in color.branch.<slot>.
+ (highlighting whitespace errors).
color.decorate.<slot>::
Use customized color for 'git log --decorate' output. `<slot>` is one
@@ -918,8 +946,6 @@ color.grep.<slot>::
separators between fields on a line (`:`, `-`, and `=`)
and between hunks (`--`)
--
-+
-The values of these variables may be specified as in color.branch.<slot>.
color.interactive::
When set to `always`, always use colors for interactive prompts
@@ -932,14 +958,13 @@ color.interactive.<slot>::
Use customized color for 'git add --interactive' and 'git clean
--interactive' output. `<slot>` may be `prompt`, `header`, `help`
or `error`, for four distinct types of normal output from
- interactive commands. The values of these variables may be
- specified as in color.branch.<slot>.
+ interactive commands.
color.pager::
A boolean to enable/disable colored output when the pager is in
use (default is true).
-color.showbranch::
+color.showBranch::
A boolean to enable/disable color in the output of
linkgit:git-show-branch[1]. May be set to `always`,
`false` (or `never`) or `auto` (or `true`), in which case colors are used
@@ -957,10 +982,10 @@ color.status.<slot>::
`added` or `updated` (files which are added but not committed),
`changed` (files which are changed but not added in the index),
`untracked` (files which are not tracked by Git),
- `branch` (the current branch), or
+ `branch` (the current branch),
`nobranch` (the color the 'no branch' warning is shown in, defaulting
- to red). The values of these variables may be specified as in
- color.branch.<slot>.
+ to red), or
+ `unmerged` (files which have unmerged changes).
color.ui::
This variable determines the default value for variables such
@@ -1039,7 +1064,7 @@ commit.cleanup::
have to remove the help lines that begin with `#` in the commit log
template yourself, if you do this).
-commit.gpgsign::
+commit.gpgSign::
A boolean to specify whether all commits should be GPG signed.
Use of this option when doing operations such as rebase can
@@ -1152,7 +1177,7 @@ format.cc::
by mail. See the --to and --cc options in
linkgit:git-format-patch[1].
-format.subjectprefix::
+format.subjectPrefix::
The default for format-patch is to output files with the '[PATCH]'
subject prefix. Use this variable to change that prefix.
@@ -1162,7 +1187,7 @@ format.signature::
Set this variable to the empty string ("") to suppress
signature generation.
-format.signaturefile::
+format.signatureFile::
Works just like format.signature except the contents of the
file specified by this variable will be used as the signature.
@@ -1186,7 +1211,7 @@ format.thread::
A true boolean value is the same as `shallow`, and a false
value disables threading.
-format.signoff::
+format.signOff::
A boolean value which lets you enable the `-s/--signoff` option of
format-patch by default. *Note:* Adding the Signed-off-by: line to a
patch should be a conscious act and means that you certify you have
@@ -1225,17 +1250,17 @@ gc.auto::
light-weight garbage collection from time to time. The
default value is 6700. Setting this to 0 disables it.
-gc.autopacklimit::
+gc.autoPackLimit::
When there are more than this many packs that are not
marked with `*.keep` file in the repository, `git gc
--auto` consolidates them into one larger pack. The
default value is 50. Setting this to 0 disables it.
-gc.autodetach::
+gc.autoDetach::
Make `git gc --auto` return immediately and run in background
if the system supports it. Default is true.
-gc.packrefs::
+gc.packRefs::
Running `git pack-refs` in a repository renders it
unclonable by Git versions prior to 1.5.1.2 over dumb
transports such as HTTP. This variable determines whether
@@ -1243,38 +1268,38 @@ gc.packrefs::
to enable it within all non-bare repos or it can be set to a
boolean value. The default is `true`.
-gc.pruneexpire::
+gc.pruneExpire::
When 'git gc' is run, it will call 'prune --expire 2.weeks.ago'.
Override the grace period with this config variable. The value
"now" may be used to disable this grace period and always prune
unreachable objects immediately.
-gc.reflogexpire::
-gc.<pattern>.reflogexpire::
+gc.reflogExpire::
+gc.<pattern>.reflogExpire::
'git reflog expire' removes reflog entries older than
this time; defaults to 90 days. With "<pattern>" (e.g.
"refs/stash") in the middle the setting applies only to
the refs that match the <pattern>.
-gc.reflogexpireunreachable::
-gc.<ref>.reflogexpireunreachable::
+gc.reflogExpireUnreachable::
+gc.<ref>.reflogExpireUnreachable::
'git reflog expire' removes reflog entries older than
this time and are not reachable from the current tip;
defaults to 30 days. With "<pattern>" (e.g. "refs/stash")
in the middle, the setting applies only to the refs that
match the <pattern>.
-gc.rerereresolved::
+gc.rerereResolved::
Records of conflicted merge you resolved earlier are
kept for this many days when 'git rerere gc' is run.
The default is 60 days. See linkgit:git-rerere[1].
-gc.rerereunresolved::
+gc.rerereUnresolved::
Records of conflicted merge you have not resolved are
kept for this many days when 'git rerere gc' is run.
The default is 15 days. See linkgit:git-rerere[1].
-gitcvs.commitmsgannotation::
+gitcvs.commitMsgAnnotation::
Append this string to each commit message. Set to empty string
to disable this feature. Defaults to "via git-CVS emulator".
@@ -1282,7 +1307,7 @@ gitcvs.enabled::
Whether the CVS server interface is enabled for this repository.
See linkgit:git-cvsserver[1].
-gitcvs.logfile::
+gitcvs.logFile::
Path to a log file where the CVS server interface well... logs
various stuff. See linkgit:git-cvsserver[1].
@@ -1294,10 +1319,10 @@ gitcvs.usecrlfattr::
treat it as text. If they suppress text conversion, the file
will be set with '-kb' mode, which suppresses any newline munging
the client might otherwise do. If the attributes do not allow
- the file type to be determined, then 'gitcvs.allbinary' is
+ the file type to be determined, then 'gitcvs.allBinary' is
used. See linkgit:gitattributes[5].
-gitcvs.allbinary::
+gitcvs.allBinary::
This is used if 'gitcvs.usecrlfattr' does not resolve
the correct '-kb' mode to use. If true, all
unresolved files are sent to the client in
@@ -1307,7 +1332,7 @@ gitcvs.allbinary::
then the contents of the file are examined to decide if
it is binary, similar to 'core.autocrlf'.
-gitcvs.dbname::
+gitcvs.dbName::
Database used by git-cvsserver to cache revision information
derived from the Git repository. The exact meaning depends on the
used database driver, for SQLite (which is the default driver) this
@@ -1315,7 +1340,7 @@ gitcvs.dbname::
linkgit:git-cvsserver[1] for details). May not contain semicolons (`;`).
Default: '%Ggitcvs.%m.sqlite'
-gitcvs.dbdriver::
+gitcvs.dbDriver::
Used Perl DBI driver. You can specify any available driver
for this here, but it might not work. git-cvsserver is tested
with 'DBD::SQLite', reported to work with 'DBD::Pg', and
@@ -1323,10 +1348,10 @@ gitcvs.dbdriver::
May not contain double colons (`:`). Default: 'SQLite'.
See linkgit:git-cvsserver[1].
-gitcvs.dbuser, gitcvs.dbpass::
- Database user and password. Only useful if setting 'gitcvs.dbdriver',
+gitcvs.dbUser, gitcvs.dbPass::
+ Database user and password. Only useful if setting 'gitcvs.dbDriver',
since SQLite has no concept of database users and/or passwords.
- 'gitcvs.dbuser' supports variable substitution (see
+ 'gitcvs.dbUser' supports variable substitution (see
linkgit:git-cvsserver[1] for details).
gitcvs.dbTableNamePrefix::
@@ -1337,7 +1362,7 @@ gitcvs.dbTableNamePrefix::
characters will be replaced with underscores.
All gitcvs variables except for 'gitcvs.usecrlfattr' and
-'gitcvs.allbinary' can also be specified as
+'gitcvs.allBinary' can also be specified as
'gitcvs.<access_method>.<varname>' (where 'access_method'
is one of "ext" and "pserver") to make them apply only for the given
access method.
@@ -1355,7 +1380,7 @@ gitweb.highlight::
gitweb.patches::
gitweb.pickaxe::
gitweb.remote_heads::
-gitweb.showsizes::
+gitweb.showSizes::
gitweb.snapshot::
See linkgit:gitweb.conf[5] for description.
@@ -1384,15 +1409,15 @@ gpg.program::
signed, and the program is expected to send the result to its
standard output.
-gui.commitmsgwidth::
+gui.commitMsgWidth::
Defines how wide the commit message window is in the
linkgit:git-gui[1]. "75" is the default.
-gui.diffcontext::
+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::
+gui.displayUntracked::
Determines if linkgit::git-gui[1] shows untracked files
in the file list. The default is "true".
@@ -1404,16 +1429,16 @@ gui.encoding::
If this option is not set, the tools default to the
locale encoding.
-gui.matchtrackingbranch::
+gui.matchTrackingBranch::
Determines if new branches created with linkgit:git-gui[1] should
default to tracking remote branches with matching names or
not. Default: "false".
-gui.newbranchtemplate::
+gui.newBranchTemplate::
Is used as suggested name when creating new branches using the
linkgit:git-gui[1].
-gui.pruneduringfetch::
+gui.pruneDuringFetch::
"true" if linkgit:git-gui[1] should prune remote-tracking branches when
performing a fetch. The default value is "false".
@@ -1421,17 +1446,17 @@ gui.trustmtime::
Determines if linkgit:git-gui[1] should trust the file modification
timestamp or not. By default the timestamps are not trusted.
-gui.spellingdictionary::
+gui.spellingDictionary::
Specifies the dictionary used for spell checking commit messages in
the linkgit:git-gui[1]. When set to "none" spell checking is turned
off.
-gui.fastcopyblame::
+gui.fastCopyBlame::
If true, 'git gui blame' uses `-C` instead of `-C -C` for original
location detection. It makes blame significantly faster on huge
repositories at the expense of less thorough copy detection.
-gui.copyblamethreshold::
+gui.copyBlameThreshold::
Specifies the threshold to use in 'git gui blame' original location
detection, measured in alphanumeric characters. See the
linkgit:git-blame[1] manual for more information on copy detection.
@@ -1451,22 +1476,22 @@ guitool.<name>.cmd::
'FILENAME', and the name of the current branch as 'CUR_BRANCH' (if
the head is detached, 'CUR_BRANCH' is empty).
-guitool.<name>.needsfile::
+guitool.<name>.needsFile::
Run the tool only if a diff is selected in the GUI. It guarantees
that 'FILENAME' is not empty.
-guitool.<name>.noconsole::
+guitool.<name>.noConsole::
Run the command silently, without creating a window to display its
output.
-guitool.<name>.norescan::
+guitool.<name>.noRescan::
Don't rescan the working directory for changes after the tool
finishes execution.
guitool.<name>.confirm::
Show a confirmation dialog before actually running the tool.
-guitool.<name>.argprompt::
+guitool.<name>.argPrompt::
Request a string argument from the user, and pass it to the tool
through the 'ARGS' environment variable. Since requesting an
argument implies confirmation, the 'confirm' option has no effect
@@ -1474,13 +1499,13 @@ guitool.<name>.argprompt::
the dialog uses a built-in generic prompt; otherwise the exact
value of the variable is used.
-guitool.<name>.revprompt::
+guitool.<name>.revPrompt::
Request a single valid revision from the user, and set the
'REVISION' environment variable. In other aspects this option
- is similar to 'argprompt', and can be used together with it.
+ is similar to 'argPrompt', and can be used together with it.
-guitool.<name>.revunmerged::
- Show only unmerged branches in the 'revprompt' subdialog.
+guitool.<name>.revUnmerged::
+ Show only unmerged branches in the 'revPrompt' subdialog.
This is useful for tools similar to merge or rebase, but not
for things like checkout or reset.
@@ -1490,7 +1515,7 @@ guitool.<name>.title::
guitool.<name>.prompt::
Specifies the general prompt string to display at the top of
- the dialog, before subsections for 'argprompt' and 'revprompt'.
+ the dialog, before subsections for 'argPrompt' and 'revPrompt'.
The default value includes the actual command.
help.browser::
@@ -1502,7 +1527,7 @@ help.format::
Values 'man', 'info', 'web' and 'html' are supported. 'man' is
the default. 'web' and 'html' are the same.
-help.autocorrect::
+help.autoCorrect::
Automatically correct and execute mistyped commands after
waiting for the given number of deciseconds (0.1 sec). If more
than one command can be deduced from the entered text, nothing
@@ -1511,7 +1536,7 @@ help.autocorrect::
value is 0 - the command will be just shown but not executed.
This is the default.
-help.htmlpath::
+help.htmlPath::
Specify the path where the HTML documentation resides. File system paths
and URLs are supported. HTML pages will be prefixed with this path when
help is displayed in the 'web' format. This defaults to the documentation
@@ -1523,17 +1548,17 @@ http.proxy::
`curl(1)`). This can be overridden on a per-remote basis; see
remote.<name>.proxy
-http.cookiefile::
+http.cookieFile::
File containing previously stored cookie lines which should be used
in the Git http session, if they match the server. The file format
of the file to read cookies from should be plain HTTP headers or
the Netscape/Mozilla cookie file format (see linkgit:curl[1]).
- NOTE that the file specified with http.cookiefile is only used as
+ NOTE that the file specified with http.cookieFile is only used as
input unless http.saveCookies is set.
-http.savecookies::
+http.saveCookies::
If set, store cookies received during requests to the file specified by
- http.cookiefile. Has no effect if http.cookiefile is unset.
+ http.cookieFile. Has no effect if http.cookieFile is unset.
http.sslVerify::
Whether to verify the SSL certificate when fetching or pushing
@@ -1604,7 +1629,7 @@ http.noEPSV::
support EPSV mode. Can be overridden by the 'GIT_CURL_FTP_NO_EPSV'
environment variable. Default is false (curl will use EPSV).
-http.useragent::
+http.userAgent::
The HTTP USER_AGENT string presented to an HTTP server. The default
value represents the version of the client Git such as git/1.7.1.
This option allows you to override this value to a more common value
@@ -1677,7 +1702,7 @@ index.version::
Specify the version with which new index files should be
initialized. This does not affect existing repositories.
-init.templatedir::
+init.templateDir::
Specify the directory from which templates will be copied.
(See the "TEMPLATE DIRECTORY" section of linkgit:git-init[1].)
@@ -1693,7 +1718,7 @@ instaweb.local::
If true the web server started by linkgit:git-instaweb[1] will
be bound to the local IP (127.0.0.1).
-instaweb.modulepath::
+instaweb.modulePath::
The default module path for linkgit:git-instaweb[1] to use
instead of /usr/lib/apache2/modules. Only used if httpd
is Apache.
@@ -1702,7 +1727,7 @@ instaweb.port::
The port number to bind the gitweb httpd to. See
linkgit:git-instaweb[1].
-interactive.singlekey::
+interactive.singleKey::
In interactive commands, allow the user to provide one-letter
input with a single key (i.e., without hitting enter).
Currently this is used by the `--patch` mode of
@@ -1730,7 +1755,7 @@ log.decorate::
specified, the full ref name (including prefix) will be printed.
This is the same as the log commands '--decorate' option.
-log.showroot::
+log.showRoot::
If true, the initial commit will be shown as a big creation event.
This is equivalent to a diff against an empty tree.
Tools like linkgit:git-log[1] or linkgit:git-whatchanged[1], which
@@ -1740,6 +1765,13 @@ log.mailmap::
If true, makes linkgit:git-log[1], linkgit:git-show[1], and
linkgit:git-whatchanged[1] assume `--use-mailmap`.
+mailinfo.scissors::
+ If true, makes linkgit:git-mailinfo[1] (and therefore
+ linkgit:git-am[1]) act by default as if the --scissors option
+ was provided on the command-line. When active, this features
+ removes everything from the message body before a scissors
+ line (i.e. consisting mainly of ">8", "8<" and "-").
+
mailmap.file::
The location of an augmenting mailmap file. The default
mailmap, located in the root of the repository, is loaded
@@ -1960,7 +1992,7 @@ pack.useBitmaps::
true. You should not generally need to turn this off unless
you are debugging pack bitmaps.
-pack.writebitmaps::
+pack.writeBitmaps (deprecated)::
This is a deprecated synonym for `repack.writeBitmaps`.
pack.writeBitmapHashCache::
@@ -2001,7 +2033,7 @@ pull.ff::
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).
+ command line). This setting overrides `merge.ff` when pulling.
pull.rebase::
When true, rebase branches on top of the fetched branch, instead
@@ -2079,14 +2111,20 @@ new default).
--
+push.followTags::
+ If set to true enable '--follow-tags' option by default. You
+ may override this configuration at time of push by specifying
+ '--no-follow-tags'.
+
+
rebase.stat::
Whether to show a diffstat of what changed upstream since the last
rebase. False by default.
-rebase.autosquash::
+rebase.autoSquash::
If set to true enable '--autosquash' option by default.
-rebase.autostash::
+rebase.autoStash::
When set to true, automatically create a temporary stash
before the operation begins, and apply it after the operation
ends. This means that you can run rebase on a dirty worktree.
@@ -2094,7 +2132,7 @@ rebase.autostash::
successful rebase might result in non-trivial conflicts.
Defaults to false.
-receive.advertiseatomic::
+receive.advertiseAtomic::
By default, git-receive-pack will advertise the atomic push
capability to its clients. If you don't want to this capability
to be advertised, set this variable to false.
@@ -2104,13 +2142,13 @@ receive.autogc::
receiving data from git-push and updating refs. You can stop
it by setting this variable to false.
-receive.certnonceseed::
+receive.certNonceSeed::
By setting this variable to a string, `git receive-pack`
will accept a `git push --signed` and verifies it by using
a "nonce" protected by HMAC using this string as a secret
key.
-receive.certnonceslop::
+receive.certNonceSlop::
When a `git push --signed` sent a push certificate with a
"nonce" that was issued by a receive-pack serving the same
repository within this many seconds, export the "nonce"
@@ -2174,7 +2212,7 @@ receive.denyNonFastForwards::
even if that push is forced. This configuration variable is
set when initializing a shared repository.
-receive.hiderefs::
+receive.hideRefs::
String(s) `receive-pack` uses to decide which refs to omit
from its initial advertisement. Use more than one
definitions to specify multiple prefix strings. A ref that
@@ -2183,18 +2221,18 @@ receive.hiderefs::
push`, and an attempt to update or delete a hidden ref by
`git push` is rejected.
-receive.updateserverinfo::
+receive.updateServerInfo::
If set to true, git-receive-pack will run git-update-server-info
after receiving data from git-push and updating refs.
-receive.shallowupdate::
+receive.shallowUpdate::
If set to true, .git/shallow can be updated when new refs
require new shallow roots. Otherwise those refs are rejected.
-remote.pushdefault::
+remote.pushDefault::
The remote to push to by default. Overrides
`branch.<name>.remote` for all branches, and is overridden by
- `branch.<name>.pushremote` for specific branches.
+ `branch.<name>.pushRemote` for specific branches.
remote.<name>.url::
The URL of a remote repository. See linkgit:git-fetch[1] or
@@ -2232,18 +2270,18 @@ remote.<name>.skipFetchAll::
remote.<name>.receivepack::
The default program to execute on the remote side when pushing. See
- option \--receive-pack of linkgit:git-push[1].
+ option --receive-pack of linkgit:git-push[1].
remote.<name>.uploadpack::
The default program to execute on the remote side when fetching. See
- option \--upload-pack of linkgit:git-fetch-pack[1].
+ option --upload-pack of linkgit:git-fetch-pack[1].
-remote.<name>.tagopt::
- Setting this value to \--no-tags disables automatic tag following when
- fetching from remote <name>. Setting it to \--tags will fetch every
+remote.<name>.tagOpt::
+ Setting this value to --no-tags disables automatic tag following when
+ fetching from remote <name>. Setting it to --tags will fetch every
tag from remote <name>, even if they are not reachable from remote
branch heads. Passing these flags directly to linkgit:git-fetch[1] can
- override this setting. See options \--tags and \--no-tags of
+ override this setting. See options --tags and --no-tags of
linkgit:git-fetch[1].
remote.<name>.vcs::
@@ -2260,7 +2298,7 @@ remotes.<group>::
The list of remotes which are fetched by "git remote update
<group>". See linkgit:git-remote[1].
-repack.usedeltabaseoffset::
+repack.useDeltaBaseOffset::
By default, linkgit:git-repack[1] creates packs that use
delta-base offset. If you need to share your repository with
Git older than version 1.4.4, either directly or via a dumb
@@ -2283,7 +2321,7 @@ repack.writeBitmaps::
space and extra time spent on the initial repack. Defaults to
false.
-rerere.autoupdate::
+rerere.autoUpdate::
When set to true, `git-rerere` updates the index with the
resulting contents after it cleanly resolves conflicts using
previously recorded resolution. Defaults to false.
@@ -2302,12 +2340,12 @@ sendemail.identity::
values in the 'sendemail' section. The default identity is
the value of 'sendemail.identity'.
-sendemail.smtpencryption::
+sendemail.smtpEncryption::
See linkgit:git-send-email[1] for description. Note that this
setting is not subject to the 'identity' mechanism.
-sendemail.smtpssl::
- Deprecated alias for 'sendemail.smtpencryption = ssl'.
+sendemail.smtpssl (deprecated)::
+ Deprecated alias for 'sendemail.smtpEncryption = ssl'.
sendemail.smtpsslcertpath::
Path to ca-certificates (either a directory or a single file).
@@ -2319,34 +2357,34 @@ sendemail.<identity>.*::
identity is selected, through command-line or
'sendemail.identity'.
-sendemail.aliasesfile::
-sendemail.aliasfiletype::
+sendemail.aliasesFile::
+sendemail.aliasFileType::
sendemail.annotate::
sendemail.bcc::
sendemail.cc::
-sendemail.cccmd::
-sendemail.chainreplyto::
+sendemail.ccCmd::
+sendemail.chainReplyTo::
sendemail.confirm::
-sendemail.envelopesender::
+sendemail.envelopeSender::
sendemail.from::
-sendemail.multiedit::
+sendemail.multiEdit::
sendemail.signedoffbycc::
-sendemail.smtppass::
+sendemail.smtpPass::
sendemail.suppresscc::
-sendemail.suppressfrom::
+sendemail.suppressFrom::
sendemail.to::
-sendemail.smtpdomain::
-sendemail.smtpserver::
-sendemail.smtpserverport::
-sendemail.smtpserveroption::
-sendemail.smtpuser::
+sendemail.smtpDomain::
+sendemail.smtpServer::
+sendemail.smtpServerPort::
+sendemail.smtpServerOption::
+sendemail.smtpUser::
sendemail.thread::
-sendemail.transferencoding::
+sendemail.transferEncoding::
sendemail.validate::
sendemail.xmailer::
See linkgit:git-send-email[1] for description.
-sendemail.signedoffcc::
+sendemail.signedoffcc (deprecated)::
Deprecated alias for 'sendemail.signedoffbycc'.
showbranch.default::
@@ -2393,7 +2431,7 @@ If this variable is not specified, it defaults to 'normal'.
This variable can be overridden with the -u|--untracked-files option
of linkgit:git-status[1] and linkgit:git-commit[1].
-status.submodulesummary::
+status.submoduleSummary::
Defaults to false.
If this is set to a non zero number or true (identical to -1 or an
unlimited number), the submodule summary will be enabled and a
@@ -2411,12 +2449,16 @@ status.submodulesummary::
submodule.<name>.path::
submodule.<name>.url::
+ The path within this project and URL for a submodule. These
+ variables are initially populated by 'git submodule init'. See
+ linkgit:git-submodule[1] and linkgit:gitmodules[5] for
+ details.
+
submodule.<name>.update::
- The path within this project, URL, and the updating strategy
- for a submodule. These variables are initially populated
- by 'git submodule init'; edit them to override the
- URL and other values found in the `.gitmodules` file. See
- linkgit:git-submodule[1] and linkgit:gitmodules[5] for details.
+ The default update procedure for a submodule. This variable
+ is populated by `git submodule init` from the
+ linkgit:gitmodules[5] file. See description of 'update'
+ command in linkgit:git-submodule[1].
submodule.<name>.branch::
The remote branch name for a submodule, used by `git submodule
@@ -2464,9 +2506,9 @@ transfer.fsckObjects::
not set, the value of this variable is used instead.
Defaults to false.
-transfer.hiderefs::
- This variable can be used to set both `receive.hiderefs`
- and `uploadpack.hiderefs` at the same time to the same
+transfer.hideRefs::
+ This variable can be used to set both `receive.hideRefs`
+ and `uploadpack.hideRefs` at the same time to the same
values. See entries for these other variables.
transfer.unpackLimit::
@@ -2481,7 +2523,7 @@ uploadarchive.allowUnreachable::
linkgit:git-upload-archive[1] for more details. Defaults to
`false`.
-uploadpack.hiderefs::
+uploadpack.hideRefs::
String(s) `upload-pack` uses to decide which refs to omit
from its initial advertisement. Use more than one
definitions to specify multiple prefix strings. A ref that
@@ -2491,12 +2533,12 @@ uploadpack.hiderefs::
fetch` will fail. See also `uploadpack.allowtipsha1inwant`.
uploadpack.allowtipsha1inwant::
- When `uploadpack.hiderefs` is in effect, allow `upload-pack`
+ When `uploadpack.hideRefs` is in effect, allow `upload-pack`
to accept a fetch request that asks for an object at the tip
of a hidden ref (by default, such a request is rejected).
- see also `uploadpack.hiderefs`.
+ see also `uploadpack.hideRefs`.
-uploadpack.keepalive::
+uploadpack.keepAlive::
When `upload-pack` has started `pack-objects`, there may be a
quiet period while `pack-objects` prepares the pack. Normally
it would output progress information, but if `--quiet` was used
@@ -2504,7 +2546,7 @@ uploadpack.keepalive::
the pack data begins. Some clients and networks may consider
the server to be hung and give up. Setting this option instructs
`upload-pack` to send an empty keepalive packet every
- `uploadpack.keepalive` seconds. Setting this option to 0
+ `uploadpack.keepAlive` seconds. Setting this option to 0
disables keepalive packets entirely. The default is 5 seconds.
url.<base>.insteadOf::
@@ -2541,13 +2583,25 @@ user.name::
Can be overridden by the 'GIT_AUTHOR_NAME' and 'GIT_COMMITTER_NAME'
environment variables. See linkgit:git-commit-tree[1].
-user.signingkey::
+user.signingKey::
If linkgit:git-tag[1] or linkgit:git-commit[1] is not selecting the
key you want it to automatically when creating a signed tag or
commit, you can override the default selection with this variable.
This option is passed unchanged to gpg's --local-user parameter,
so you may specify a key using any method that gpg supports.
+versionsort.prereleaseSuffix::
+ When version sort is used in linkgit:git-tag[1], prerelease
+ tags (e.g. "1.0-rc1") may appear after the main release
+ "1.0". By specifying the suffix "-rc" in this variable,
+ "1.0-rc1" will appear before "1.0".
++
+This variable can be specified multiple times, once per suffix. The
+order of suffixes in the config file determines the sorting order
+(e.g. if "-pre" appears before "-rc" in the config file then 1.0-preXX
+is sorted before 1.0-rcXX). The sorting order between different
+suffixes is undefined if they are in multiple config files.
+
web.browser::
Specify a web browser that may be used by some commands.
Currently only linkgit:git-instaweb[1] and linkgit:git-help[1]
diff --git a/Documentation/diff-config.txt b/Documentation/diff-config.txt
index b001779..6eaa452 100644
--- a/Documentation/diff-config.txt
+++ b/Documentation/diff-config.txt
@@ -1,4 +1,4 @@
-diff.autorefreshindex::
+diff.autoRefreshIndex::
When using 'git diff' to compare with work tree
files, do not consider stat-only change as changed.
Instead, silently run `git update-index --refresh` to
@@ -75,11 +75,11 @@ diff.ignoreSubmodules::
commands such as 'git diff-files'. 'git checkout' also honors
this setting when reporting uncommitted changes. Setting it to
'all' disables the submodule summary normally shown by 'git commit'
- and 'git status' when 'status.submodulesummary' is set unless it is
+ and 'git status' when 'status.submoduleSummary' is set unless it is
overridden by using the --ignore-submodules command-line option.
The 'git submodule' commands are not affected by this setting.
-diff.mnemonicprefix::
+diff.mnemonicPrefix::
If set, 'git diff' uses a prefix pair that is different from the
standard "a/" and "b/" depending on what is being compared. When
this configuration is in effect, reverse diff output also swaps
@@ -98,7 +98,7 @@ diff.mnemonicprefix::
diff.noprefix::
If set, 'git diff' does not show any source or destination prefix.
-diff.orderfile::
+diff.orderFile::
File indicating how to order files within a diff, using
one shell glob pattern per line.
Can be overridden by the '-O' option to linkgit:git-diff[1].
@@ -148,7 +148,7 @@ diff.<driver>.textconv::
conversion is used to generate a human-readable diff. See
linkgit:gitattributes[5] for details.
-diff.<driver>.wordregex::
+diff.<driver>.wordRegex::
The regular expression that the diff driver should use to
split words in a line. See linkgit:gitattributes[5] for
details.
diff --git a/Documentation/diff-format.txt b/Documentation/diff-format.txt
index 15c7e79..85b0890 100644
--- a/Documentation/diff-format.txt
+++ b/Documentation/diff-format.txt
@@ -66,7 +66,8 @@ be committed)
Status letters C and R are always followed by a score (denoting the
percentage of similarity between the source and target of the move or
-copy), and are the only ones to be so.
+copy). Status letter M may be followed by a score (denoting the
+percentage of dissimilarity) for file rewrites.
<sha1> is shown as all 0's if a file is new on the filesystem
and it is out of sync with the index.
diff --git a/Documentation/diff-generate-patch.txt b/Documentation/diff-generate-patch.txt
index 843a20b..bcf54da 100644
--- a/Documentation/diff-generate-patch.txt
+++ b/Documentation/diff-generate-patch.txt
@@ -77,7 +77,7 @@ combined diff format
Any diff-generating command can take the `-c` or `--cc` option to
produce a 'combined diff' when showing a merge. This is the default
format when showing merges with linkgit:git-diff[1] or
-linkgit:git-show[1]. Note also that you can give the `-m' option to any
+linkgit:git-show[1]. Note also that you can give the `-m` option to any
of these commands to force generation of diffs with individual parents
of a merge.
diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt
index 6cb083a..3ad6404 100644
--- a/Documentation/diff-options.txt
+++ b/Documentation/diff-options.txt
@@ -23,7 +23,9 @@ ifndef::git-format-patch[]
-u::
--patch::
Generate patch (see section on generating patches).
- {git-diff? This is the default.}
+ifdef::git-diff[]
+ This is the default.
+endif::git-diff[]
endif::git-format-patch[]
-s::
@@ -41,8 +43,19 @@ endif::git-format-patch[]
ifndef::git-format-patch[]
--raw::
- Generate the raw format.
- {git-diff-core? This is the default.}
+ifndef::git-log[]
+ Generate the diff in raw format.
+ifdef::git-diff-core[]
+ This is the default.
+endif::git-diff-core[]
+endif::git-log[]
+ifdef::git-log[]
+ For each commit, show a summary of changes using the raw diff
+ format. See the "RAW OUTPUT FORMAT" section of
+ linkgit:git-diff[1]. This is different from showing the log
+ itself in raw format, which you can achieve with
+ `--format=raw`.
+endif::git-log[]
endif::git-format-patch[]
ifndef::git-format-patch[]
@@ -432,8 +445,8 @@ endif::git-format-patch[]
-O<orderfile>::
Output the patch in the order specified in the
<orderfile>, which has one shell glob pattern per line.
- This overrides the `diff.orderfile` configuration variable
- (see linkgit:git-config[1]). To cancel `diff.orderfile`,
+ This overrides the `diff.orderFile` configuration variable
+ (see linkgit:git-config[1]). To cancel `diff.orderFile`,
use `-O/dev/null`.
ifndef::git-format-patch[]
diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
index b09a783..45583d8 100644
--- a/Documentation/fetch-options.txt
+++ b/Documentation/fetch-options.txt
@@ -68,7 +68,7 @@ endif::git-pull[]
By default, tags that point at objects that are downloaded
from the remote repository are fetched and stored locally.
This option disables this automatic tag following. The default
- behavior for a remote may be specified with the remote.<name>.tagopt
+ behavior for a remote may be specified with the remote.<name>.tagOpt
setting. See linkgit:git-config[1].
ifndef::git-pull[]
diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt
index 1c74907..fe5282f 100644
--- a/Documentation/git-add.txt
+++ b/Documentation/git-add.txt
@@ -93,7 +93,8 @@ This effectively runs `add --interactive`, but bypasses the
initial command menu and directly jumps to the `patch` subcommand.
See ``Interactive mode'' for details.
--e, \--edit::
+-e::
+--edit::
Open the diff vs. the index in an editor and let the user
edit it. After the editor was closed, adjust the hunk headers
and apply the patch to the index.
@@ -173,7 +174,7 @@ for "git add --no-all <pathspec>...", i.e. ignored removed files.
Configuration
-------------
-The optional configuration variable `core.excludesfile` indicates a path to a
+The optional configuration variable `core.excludesFile` indicates a path to a
file containing patterns of file names to exclude from git-add, similar to
$GIT_DIR/info/exclude. Patterns in the exclude file are used in addition to
those in info/exclude. See linkgit:gitignore[5].
@@ -317,7 +318,7 @@ After deciding the fate for all hunks, if there is any hunk
that was chosen, the index is updated with the selected hunks.
+
You can omit having to type return here, by setting the configuration
-variable `interactive.singlekey` to `true`.
+variable `interactive.singleKey` to `true`.
diff::
diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt
index f4eea28..0d8ba48 100644
--- a/Documentation/git-am.txt
+++ b/Documentation/git-am.txt
@@ -52,7 +52,8 @@ OPTIONS
-c::
--scissors::
Remove everything in body before a scissors line (see
- linkgit:git-mailinfo[1]).
+ linkgit:git-mailinfo[1]). Can be activated by default using
+ the `mailinfo.scissors` configuration variable.
--no-scissors::
Ignore scissors lines (see linkgit:git-mailinfo[1]).
diff --git a/Documentation/git-apply.txt b/Documentation/git-apply.txt
index f605327..d9ed6a1 100644
--- a/Documentation/git-apply.txt
+++ b/Documentation/git-apply.txt
@@ -16,7 +16,7 @@ SYNOPSIS
[--ignore-space-change | --ignore-whitespace ]
[--whitespace=(nowarn|warn|fix|error|error-all)]
[--exclude=<path>] [--include=<path>] [--directory=<root>]
- [--verbose] [<patch>...]
+ [--verbose] [--unsafe-paths] [<patch>...]
DESCRIPTION
-----------
@@ -229,10 +229,20 @@ For example, a patch that talks about updating `a/git-gui.sh` to `b/git-gui.sh`
can be applied to the file in the working tree `modules/git-gui/git-gui.sh` by
running `git apply --directory=modules/git-gui`.
+--unsafe-paths::
+ By default, a patch that affects outside the working area
+ (either a Git controlled working tree, or the current working
+ directory when "git apply" is used as a replacement of GNU
+ patch) is rejected as a mistake (or a mischief).
++
+When `git apply` is used as a "better GNU patch", the user can pass
+the `--unsafe-paths` option to override this safety check. This option
+has no effect when `--index` or `--cached` is in use.
+
Configuration
-------------
-apply.ignorewhitespace::
+apply.ignoreWhitespace::
Set to 'change' if you want changes in whitespace to be ignored by default.
Set to one of: no, none, never, false if you want changes in
whitespace to be significant.
diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt
index 311b336..359619b 100644
--- a/Documentation/git-branch.txt
+++ b/Documentation/git-branch.txt
@@ -51,7 +51,7 @@ When a local branch is started off a remote-tracking branch, Git sets up the
branch (specifically the `branch.<name>.remote` and `branch.<name>.merge`
configuration entries) so that 'git pull' will appropriately merge from
the remote-tracking branch. This behavior may be changed via the global
-`branch.autosetupmerge` configuration flag. That setting can be
+`branch.autoSetupMerge` configuration flag. That setting can be
overridden by using the `--track` and `--no-track` options, and
changed later using `git branch --set-upstream-to`.
@@ -166,14 +166,14 @@ This option is only applicable in non-verbose mode.
upstream when the new branch is checked out.
+
This behavior is the default when the start point is a remote-tracking branch.
-Set the branch.autosetupmerge configuration variable to `false` if you
+Set the branch.autoSetupMerge configuration variable to `false` if you
want `git checkout` and `git branch` to always behave as if '--no-track'
were given. Set it to `always` if you want this behavior when the
start-point is either a local or remote-tracking branch.
--no-track::
Do not set up "upstream" configuration, even if the
- branch.autosetupmerge configuration variable is true.
+ branch.autoSetupMerge configuration variable is true.
--set-upstream::
If specified branch does not exist yet or if `--force` has been
diff --git a/Documentation/git-check-ignore.txt b/Documentation/git-check-ignore.txt
index 788a011..e35cd04 100644
--- a/Documentation/git-check-ignore.txt
+++ b/Documentation/git-check-ignore.txt
@@ -72,7 +72,7 @@ matching pattern, <source> is the pattern's source file, and <linenum>
is the line number of the pattern within that source. If the pattern
contained a `!` prefix or `/` suffix, it will be preserved in the
output. <source> will be an absolute path when referring to the file
-configured by `core.excludesfile`, or relative to the repository root
+configured by `core.excludesFile`, or relative to the repository root
when referring to `.git/info/exclude` or a per-directory exclude file.
If `-z` is specified, the pathnames in the output are delimited by the
diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt
index 33ad2ad..d504108 100644
--- a/Documentation/git-checkout.txt
+++ b/Documentation/git-checkout.txt
@@ -144,7 +144,7 @@ explicitly give a name with '-b' in such a case.
--no-track::
Do not set up "upstream" configuration, even if the
- branch.autosetupmerge configuration variable is true.
+ branch.autoSetupMerge configuration variable is true.
-l::
Create the new branch's reflog; see linkgit:git-branch[1] for
@@ -210,7 +210,7 @@ the conflicted merge in the specified paths.
--conflict=<style>::
The same as --merge option above, but changes the way the
conflicting hunks are presented, overriding the
- merge.conflictstyle configuration variable. Possible values are
+ merge.conflictStyle configuration variable. Possible values are
"merge" (default) and "diff3" (in addition to what is shown by
"merge" style, shows the original contents).
diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt
index 1c03c79..1147c71 100644
--- a/Documentation/git-cherry-pick.txt
+++ b/Documentation/git-cherry-pick.txt
@@ -131,7 +131,8 @@ effect to your index in a row.
--keep-redundant-commits::
If a commit being cherry picked duplicates a commit already in the
current history, it will become empty. By default these
- redundant commits are ignored. This option overrides that behavior and
+ redundant commits cause `cherry-pick` to stop so the user can
+ examine the commit. This option overrides that behavior and
creates an empty commit object. Implies `--allow-empty`.
--strategy=<strategy>::
diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt
index 94b6d19..641681f 100644
--- a/Documentation/git-clean.txt
+++ b/Documentation/git-clean.txt
@@ -34,8 +34,12 @@ OPTIONS
-f::
--force::
If the Git configuration variable clean.requireForce is not set
- to false, 'git clean' will refuse to run unless given -f, -n or
- -i.
+ to false, 'git clean' will refuse to delete files or directories
+ unless given -f, -n or -i. Git will refuse to delete directories
+ with .git sub directory or file unless a second -f
+ is given. This affects also git submodules where the storage area
+ of the removed submodule under .git/modules/ is not removed until
+ -f is given twice.
-i::
--interactive::
diff --git a/Documentation/git-commit-tree.txt b/Documentation/git-commit-tree.txt
index a469eab..f5f2a8d 100644
--- a/Documentation/git-commit-tree.txt
+++ b/Documentation/git-commit-tree.txt
@@ -59,7 +59,7 @@ OPTIONS
GPG-sign commit.
--no-gpg-sign::
- Countermand `commit.gpgsign` configuration variable that is
+ Countermand `commit.gpgSign` configuration variable that is
set to force each and every commit to be signed.
diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index 1e74b75..904dafa 100644
--- a/Documentation/git-commit.txt
+++ b/Documentation/git-commit.txt
@@ -94,7 +94,7 @@ OPTIONS
--reset-author::
When used with -C/-c/--amend options, or when committing after a
a conflicting cherry-pick, declare that the authorship of the
- resulting commit now belongs of the committer. This also renews
+ resulting commit now belongs to the committer. This also renews
the author timestamp.
--short::
@@ -180,8 +180,8 @@ OPTIONS
+
--
strip::
- Strip leading and trailing empty lines, trailing whitespace, and
- #commentary and collapse consecutive empty lines.
+ Strip leading and trailing empty lines, trailing whitespace,
+ commentary and collapse consecutive empty lines.
whitespace::
Same as `strip` except #commentary is not removed.
verbatim::
@@ -282,8 +282,15 @@ configuration variable documented in linkgit:git-config[1].
--verbose::
Show unified diff between the HEAD commit and what
would be committed at the bottom of the commit message
- template. Note that this diff output doesn't have its
- lines prefixed with '#'.
+ template to help the user describe the commit by reminding
+ what changes the commit has.
+ Note that this diff output doesn't have its
+ lines prefixed with '#'. This diff will not be a part
+ of the commit message.
++
+If specified twice, show in addition the unified diff between
+what would be committed and the worktree files, i.e. the unstaged
+changes to tracked files.
-q::
--quiet::
@@ -310,7 +317,7 @@ configuration variable documented in linkgit:git-config[1].
GPG-sign commit.
--no-gpg-sign::
- Countermand `commit.gpgsign` configuration variable that is
+ Countermand `commit.gpgSign` configuration variable that is
set to force each and every commit to be signed.
\--::
diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt
index 9dfa1a5..02ec096 100644
--- a/Documentation/git-config.txt
+++ b/Documentation/git-config.txt
@@ -405,7 +405,7 @@ true
% git config --bool --get-urlmatch http.sslverify https://weak.example.com
false
% git config --get-urlmatch http https://weak.example.com
-http.cookiefile /tmp/cookie.txt
+http.cookieFile /tmp/cookie.txt
http.sslverify false
------------
diff --git a/Documentation/git-credential-store.txt b/Documentation/git-credential-store.txt
index bc97071..e3c8f27 100644
--- a/Documentation/git-credential-store.txt
+++ b/Documentation/git-credential-store.txt
@@ -31,10 +31,41 @@ OPTIONS
--file=<path>::
- Use `<path>` to store credentials. The file will have its
+ Use `<path>` to lookup and store credentials. The file will have its
filesystem permissions set to prevent other users on the system
from reading it, but will not be encrypted or otherwise
- protected. Defaults to `~/.git-credentials`.
+ protected. If not specified, credentials will be searched for from
+ `~/.git-credentials` and `$XDG_CONFIG_HOME/git/credentials`, and
+ credentials will be written to `~/.git-credentials` if it exists, or
+ `$XDG_CONFIG_HOME/git/credentials` if it exists and the former does
+ not. See also <<FILES>>.
+
+[[FILES]]
+FILES
+-----
+
+If not set explicitly with '--file', there are two files where
+git-credential-store will search for credentials in order of precedence:
+
+~/.git-credentials::
+ User-specific credentials file.
+
+$XDG_CONFIG_HOME/git/credentials::
+ Second user-specific credentials file. If '$XDG_CONFIG_HOME' is not set
+ or empty, `$HOME/.config/git/credentials` will be used. Any credentials
+ stored in this file will not be used if `~/.git-credentials` has a
+ matching credential as well. It is a good idea not to create this file
+ if you sometimes use older versions of Git that do not support it.
+
+For credential lookups, the files are read in the order given above, with the
+first matching credential found taking precedence over credentials found in
+files further down the list.
+
+Credential storage will by default write to the first existing file in the
+list. If none of these files exist, `~/.git-credentials` will be created and
+written to.
+
+When erasing credentials, matching credentials will be erased from all files.
EXAMPLES
--------
diff --git a/Documentation/git-cvsserver.txt b/Documentation/git-cvsserver.txt
index 4961f1a..db4d7a9 100644
--- a/Documentation/git-cvsserver.txt
+++ b/Documentation/git-cvsserver.txt
@@ -154,7 +154,7 @@ with CVS_SERVER (and shouldn't) as 'git-shell' understands `cvs` to mean
[gitcvs]
enabled=1
# optional for debugging
- logfile=/path/to/logfile
+ logFile=/path/to/logfile
------
Note: you need to ensure each user that is going to invoke 'git-cvsserver' has
@@ -254,14 +254,14 @@ Configuring database backend
its documentation if changing these variables, especially
about `DBI->connect()`.
-gitcvs.dbname::
+gitcvs.dbName::
Database name. The exact meaning depends on the
selected database driver, for SQLite this is a filename.
Supports variable substitution (see below). May
not contain semicolons (`;`).
Default: '%Ggitcvs.%m.sqlite'
-gitcvs.dbdriver::
+gitcvs.dbDriver::
Used DBI driver. You can specify any available driver
for this here, but it might not work. cvsserver is tested
with 'DBD::SQLite', reported to work with
@@ -271,12 +271,12 @@ gitcvs.dbdriver::
Default: 'SQLite'
gitcvs.dbuser::
- Database user. Only useful if setting `dbdriver`, since
+ Database user. Only useful if setting `dbDriver`, since
SQLite has no concept of database users. Supports variable
substitution (see below).
-gitcvs.dbpass::
- Database password. Only useful if setting `dbdriver`, since
+gitcvs.dbPass::
+ Database password. Only useful if setting `dbDriver`, since
SQLite has no concept of database passwords.
gitcvs.dbTableNamePrefix::
@@ -288,7 +288,7 @@ All variables can also be set per access method, see <<configaccessmethod,above>
Variable substitution
^^^^^^^^^^^^^^^^^^^^^
-In `dbdriver` and `dbuser` you can use the following variables:
+In `dbDriver` and `dbUser` you can use the following variables:
%G::
Git directory name
@@ -413,16 +413,16 @@ about end-of-line conversion.
Alternatively, if `gitcvs.usecrlfattr` config is not enabled
or the attributes do not allow automatic detection for a filename, then
-the server uses the `gitcvs.allbinary` config for the default setting.
-If `gitcvs.allbinary` is set, then file not otherwise
+the server uses the `gitcvs.allBinary` config for the default setting.
+If `gitcvs.allBinary` is set, then file not otherwise
specified will default to '-kb' mode. Otherwise the '-k' mode
-is left blank. But if `gitcvs.allbinary` is set to "guess", then
+is left blank. But if `gitcvs.allBinary` is set to "guess", then
the correct '-k' mode will be guessed based on the contents of
the file.
For best consistency with 'cvs', it is probably best to override the
defaults by setting `gitcvs.usecrlfattr` to true,
-and `gitcvs.allbinary` to "guess".
+and `gitcvs.allBinary` to "guess".
Dependencies
------------
diff --git a/Documentation/git-fast-export.txt b/Documentation/git-fast-export.txt
index 929e496..ed57c68 100644
--- a/Documentation/git-fast-export.txt
+++ b/Documentation/git-fast-export.txt
@@ -67,17 +67,17 @@ produced incorrect results if you gave these options.
have been completed, or to save the marks table across
incremental runs. As <file> is only opened and truncated
at completion, the same path can also be safely given to
- \--import-marks.
+ --import-marks.
The file will not be written if no new object has been
marked/exported.
--import-marks=<file>::
Before processing any input, load the marks specified in
<file>. The input file must exist, must be readable, and
- must use the same format as produced by \--export-marks.
+ must use the same format as produced by --export-marks.
+
Any commits that have already been marked will not be exported again.
-If the backend uses a similar \--import-marks file, this allows for
+If the backend uses a similar --import-marks file, this allows for
incremental bidirectional exporting of the repository by keeping the
marks the same across runs.
diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt
index f71fb01..fd32895 100644
--- a/Documentation/git-fast-import.txt
+++ b/Documentation/git-fast-import.txt
@@ -42,13 +42,13 @@ OPTIONS
--quiet::
Disable all non-fatal output, making fast-import silent when it
is successful. This option disables the output shown by
- \--stats.
+ --stats.
--stats::
Display some basic statistics about the objects fast-import has
created, the packfiles they were stored into, and the
memory used by fast-import during this run. Showing this output
- is currently the default, but can be disabled with \--quiet.
+ is currently the default, but can be disabled with --quiet.
Options for Frontends
~~~~~~~~~~~~~~~~~~~~~
@@ -81,12 +81,12 @@ Locations of Marks Files
have been completed, or to save the marks table across
incremental runs. As <file> is only opened and truncated
at checkpoint (or completion) the same path can also be
- safely given to \--import-marks.
+ safely given to --import-marks.
--import-marks=<file>::
Before processing any input, load the marks specified in
<file>. The input file must exist, must be readable, and
- must use the same format as produced by \--export-marks.
+ must use the same format as produced by --export-marks.
Multiple options may be supplied to import more than one
set of marks. If a mark is defined to different values,
the last file wins.
@@ -179,8 +179,8 @@ fast-forward update, fast-import will skip updating that ref and instead
prints a warning message. fast-import will always attempt to update all
branch refs, and does not stop on the first failure.
-Branch updates can be forced with \--force, but it's recommended that
-this only be used on an otherwise quiet repository. Using \--force
+Branch updates can be forced with --force, but it's recommended that
+this only be used on an otherwise quiet repository. Using --force
is not necessary for an initial import into an empty repository.
@@ -231,11 +231,11 @@ Date Formats
~~~~~~~~~~~~
The following date formats are supported. A frontend should select
the format it will use for this import by passing the format name
-in the \--date-format=<fmt> command-line option.
+in the --date-format=<fmt> command-line option.
`raw`::
This is the Git native format and is `<time> SP <offutc>`.
- It is also fast-import's default format, if \--date-format was
+ It is also fast-import's default format, if --date-format was
not specified.
+
The time of the event is specified by `<time>` as the number of
@@ -437,7 +437,7 @@ the email address from the other fields in the line. Note that
of bytes, except `LT`, `GT` and `LF`. `<name>` is typically UTF-8 encoded.
The time of the change is specified by `<when>` using the date format
-that was selected by the \--date-format=<fmt> command-line option.
+that was selected by the --date-format=<fmt> command-line option.
See ``Date Formats'' above for the set of supported formats, and
their syntax.
@@ -507,10 +507,6 @@ omitted when creating a new branch, the first `merge` commit will be
the first ancestor of the current commit, and the branch will start
out with no files. An unlimited number of `merge` commands per
commit are permitted by fast-import, thereby establishing an n-way merge.
-However Git's other tools never create commits with more than 15
-additional ancestors (forming a 16-way merge). For this reason
-it is suggested that frontends do not use more than 15 `merge`
-commands per commit; 16, if starting a new, empty branch.
Here `<commit-ish>` is any of the commit specification expressions
also accepted by `from` (see above).
@@ -604,7 +600,7 @@ be removed from the branch.
See `filemodify` above for a detailed description of `<path>`.
`filecopy`
-^^^^^^^^^^^^
+^^^^^^^^^^
Recursively copies an existing file or subdirectory to a different
location within the branch. The existing file or directory must
exist. If the destination exists it will be completely replaced
@@ -892,7 +888,7 @@ save out all current branch refs, tags and marks.
....
Note that fast-import automatically switches packfiles when the current
-packfile reaches \--max-pack-size, or 4 GiB, whichever limit is
+packfile reaches --max-pack-size, or 4 GiB, whichever limit is
smaller. During an automatic packfile switch fast-import does not update
the branch refs, tags or marks.
@@ -1230,7 +1226,7 @@ users of fast-import, and are offered here as suggestions.
Use One Mark Per Commit
~~~~~~~~~~~~~~~~~~~~~~~
When doing a repository conversion, use a unique mark per commit
-(`mark :<n>`) and supply the \--export-marks option on the command
+(`mark :<n>`) and supply the --export-marks option on the command
line. fast-import will dump a file which lists every mark and the Git
object SHA-1 that corresponds to it. If the frontend can tie
the marks back to the source repository, it is easy to verify the
@@ -1295,7 +1291,7 @@ even for considerably large projects (100,000+ commits).
However repacking the repository is necessary to improve data
locality and access performance. It can also take hours on extremely
-large projects (especially if -f and a large \--window parameter is
+large projects (especially if -f and a large --window parameter is
used). Since repacking is safe to run alongside readers and writers,
run the repack in the background and let it finish when it finishes.
There is no reason to wait to explore your new Git project!
@@ -1309,7 +1305,7 @@ Repacking Historical Data
~~~~~~~~~~~~~~~~~~~~~~~~~
If you are repacking very old imported data (e.g. older than the
last year), consider expending some extra CPU time and supplying
-\--window=50 (or higher) when you run 'git repack'.
+--window=50 (or higher) when you run 'git repack'.
This will take longer, but will also produce a smaller packfile.
You only need to expend the effort once, and everyone using your
project will benefit from the smaller repository.
@@ -1411,7 +1407,7 @@ branch, their in-memory storage size can grow to a considerable size
fast-import automatically moves active branches to inactive status based on
a simple least-recently-used algorithm. The LRU chain is updated on
each `commit` command. The maximum number of active branches can be
-increased or decreased on the command line with \--active-branches=.
+increased or decreased on the command line with --active-branches=.
per active tree
~~~~~~~~~~~~~~~
diff --git a/Documentation/git-fetch-pack.txt b/Documentation/git-fetch-pack.txt
index 93b5067..8680f45 100644
--- a/Documentation/git-fetch-pack.txt
+++ b/Documentation/git-fetch-pack.txt
@@ -80,7 +80,7 @@ be in a separate packet, and the list must end with a flush packet.
the things up in .bash_profile).
--exec=<git-upload-pack>::
- Same as \--upload-pack=<git-upload-pack>.
+ Same as --upload-pack=<git-upload-pack>.
--depth=<n>::
Limit fetching to ancestor-chains not longer than n.
diff --git a/Documentation/git-fetch.txt b/Documentation/git-fetch.txt
index 8deb614..e62d9a0 100644
--- a/Documentation/git-fetch.txt
+++ b/Documentation/git-fetch.txt
@@ -26,7 +26,7 @@ By default, any tag that points into the histories being fetched is
also fetched; the effect is to fetch tags that
point at branches that you are interested in. This default behavior
can be changed by using the --tags or --no-tags options or by
-configuring remote.<name>.tagopt. By using a refspec that fetches tags
+configuring remote.<name>.tagOpt. By using a refspec that fetches tags
explicitly, you can fetch tags that do not point into branches you
are interested in as well.
diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt
index c0fd470..bb3ea93 100644
--- a/Documentation/git-format-patch.txt
+++ b/Documentation/git-format-patch.txt
@@ -273,13 +273,13 @@ attachments, and sign off patches with configuration variables.
------------
[format]
headers = "Organization: git-foo\n"
- subjectprefix = CHANGE
+ subjectPrefix = CHANGE
suffix = .txt
numbered = auto
to = <email>
cc = <email>
attach [ = mime-boundary-string ]
- signoff = true
+ signOff = true
coverletter = auto
------------
diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt
index 273c466..5223498 100644
--- a/Documentation/git-gc.txt
+++ b/Documentation/git-gc.txt
@@ -54,10 +54,10 @@ all loose objects are combined into a single pack using
`git repack -d -l`. Setting the value of `gc.auto` to 0
disables automatic packing of loose objects.
+
-If the number of packs exceeds the value of `gc.autopacklimit`,
+If the number of packs exceeds the value of `gc.autoPackLimit`,
then existing packs (except those marked with a `.keep` file)
are consolidated into a single pack by using the `-A` option of
-'git repack'. Setting `gc.autopacklimit` to 0 disables
+'git repack'. Setting `gc.autoPackLimit` to 0 disables
automatic consolidation of packs.
--prune=<date>::
@@ -101,18 +101,18 @@ branches:
------------
[gc "refs/remotes/*"]
reflogExpire = never
- reflogexpireUnreachable = 3 days
+ reflogExpireUnreachable = 3 days
------------
-The optional configuration variable 'gc.rerereresolved' indicates
+The optional configuration variable 'gc.rerereResolved' indicates
how long records of conflicted merge you resolved earlier are
kept. This defaults to 60 days.
-The optional configuration variable 'gc.rerereunresolved' indicates
+The optional configuration variable 'gc.rerereUnresolved' indicates
how long records of conflicted merge you have not resolved are
kept. This defaults to 15 days.
-The optional configuration variable 'gc.packrefs' determines if
+The optional configuration variable 'gc.packRefs' determines if
'git gc' runs 'git pack-refs'. This can be set to "notbare" to enable
it within all non-bare repos or it can be set to a boolean value.
This defaults to true.
diff --git a/Documentation/git-hash-object.txt b/Documentation/git-hash-object.txt
index 02c1f12..0c75f3b 100644
--- a/Documentation/git-hash-object.txt
+++ b/Documentation/git-hash-object.txt
@@ -9,7 +9,7 @@ git-hash-object - Compute object ID and optionally creates a blob from a file
SYNOPSIS
--------
[verse]
-'git hash-object' [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin] [--] <file>...
+'git hash-object' [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin [--literally]] [--] <file>...
'git hash-object' [-t <type>] [-w] --stdin-paths [--no-filters] < <list-of-paths>
DESCRIPTION
@@ -51,7 +51,13 @@ OPTIONS
Hash the contents as is, ignoring any input filter that would
have been chosen by the attributes mechanism, including the end-of-line
conversion. If the file is read from standard input then this
- is always implied, unless the --path option is given.
+ is always implied, unless the `--path` option is given.
+
+--literally::
+ Allow `--stdin` to hash any garbage into a loose object which might not
+ otherwise pass standard object parsing or git-fsck checks. Useful for
+ stress-testing Git itself or reproducing characteristics of corrupt or
+ bogus objects encountered in the wild.
GIT
---
diff --git a/Documentation/git-http-backend.txt b/Documentation/git-http-backend.txt
index d422ba4..9268fb6 100644
--- a/Documentation/git-http-backend.txt
+++ b/Documentation/git-http-backend.txt
@@ -65,8 +65,8 @@ automatically by the web server.
EXAMPLES
--------
-All of the following examples map 'http://$hostname/git/foo/bar.git'
-to '/var/www/git/foo/bar.git'.
+All of the following examples map `http://$hostname/git/foo/bar.git`
+to `/var/www/git/foo/bar.git`.
Apache 2.x::
Ensure mod_cgi, mod_alias, and mod_env are enabled, set
@@ -255,6 +255,15 @@ The GIT_HTTP_EXPORT_ALL environmental variable may be passed to
'git-http-backend' to bypass the check for the "git-daemon-export-ok"
file in each repository before allowing export of that repository.
+The `GIT_HTTP_MAX_REQUEST_BUFFER` environment variable (or the
+`http.maxRequestBuffer` config variable) may be set to change the
+largest ref negotiation request that git will handle during a fetch; any
+fetch requiring a larger buffer will not succeed. This value should not
+normally need to be changed, but may be helpful if you are fetching from
+a repository with an extremely large number of refs. The value can be
+specified with a unit (e.g., `100M` for 100 megabytes). The default is
+10 megabytes.
+
The backend process sets GIT_COMMITTER_NAME to '$REMOTE_USER' and
GIT_COMMITTER_EMAIL to '$\{REMOTE_USER}@http.$\{REMOTE_ADDR\}',
ensuring that any reflogs created by 'git-receive-pack' contain some
diff --git a/Documentation/git-imap-send.txt b/Documentation/git-imap-send.txt
index 77aacf1..5d1e4c8 100644
--- a/Documentation/git-imap-send.txt
+++ b/Documentation/git-imap-send.txt
@@ -44,7 +44,8 @@ OPTIONS
--no-curl::
Talk to the IMAP server using git's own IMAP routines instead of
- using libcurl.
+ using libcurl. Ignored if Git was built with the NO_OPENSSL option
+ set.
CONFIGURATION
diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt
index 369f889..8174d27 100644
--- a/Documentation/git-init.txt
+++ b/Documentation/git-init.txt
@@ -125,7 +125,7 @@ The template directory will be one of the following (in order):
- the contents of the `$GIT_TEMPLATE_DIR` environment variable;
- - the `init.templatedir` configuration variable; or
+ - the `init.templateDir` configuration variable; or
- the default template directory: `/usr/share/git-core/templates`.
diff --git a/Documentation/git-instaweb.txt b/Documentation/git-instaweb.txt
index f3eef51..cc75b25 100644
--- a/Documentation/git-instaweb.txt
+++ b/Documentation/git-instaweb.txt
@@ -76,7 +76,7 @@ You may specify configuration in your .git/config
httpd = apache2 -f
port = 4321
browser = konqueror
- modulepath = /usr/lib/apache2/modules
+ modulePath = /usr/lib/apache2/modules
-----------------------------------------------------------------------
diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt
index 1f7bc67..5692945 100644
--- a/Documentation/git-log.txt
+++ b/Documentation/git-log.txt
@@ -62,9 +62,9 @@ produced by `--stat`, etc.
output by allowing them to allocate space in advance.
-L <start>,<end>:<file>::
--L :<regex>:<file>::
+-L :<funcname>:<file>::
Trace the evolution of the line range given by "<start>,<end>"
- (or the funcname regex <regex>) within the <file>. You may
+ (or the function name regex <funcname>) within the <file>. You may
not give any pathspec limiters. This is currently limited to
a walk starting from a single revision, i.e., you may only
give zero or one positive revision arguments.
@@ -184,7 +184,7 @@ log.date::
`--date` option.) Defaults to "default", which means to write
dates like `Sat May 8 19:35:34 2010 -0500`.
-log.showroot::
+log.showRoot::
If `false`, `git log` and related commands will not treat the
initial commit as a big creation event. Any root commits in
`git log -p` output would be shown without a diff attached.
diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt
index cf2c374..1f94908 100644
--- a/Documentation/git-merge.txt
+++ b/Documentation/git-merge.txt
@@ -232,7 +232,7 @@ Barbie's remark on your side. The only thing you can tell is that your
side wants to say it is hard and you'd prefer to go shopping, while the
other side wants to claim it is easy.
-An alternative style can be used by setting the "merge.conflictstyle"
+An alternative style can be used by setting the "merge.conflictStyle"
configuration variable to "diff3". In "diff3" style, the above conflict
may look like this:
@@ -329,7 +329,7 @@ CONFIGURATION
-------------
include::merge-config.txt[]
-branch.<name>.mergeoptions::
+branch.<name>.mergeOptions::
Sets default options for merging into branch <name>. The syntax and
supported options are the same as those of 'git merge', but option
values containing whitespace characters are currently not supported.
diff --git a/Documentation/git-pack-objects.txt b/Documentation/git-pack-objects.txt
index c2f76fb..bbea529 100644
--- a/Documentation/git-pack-objects.txt
+++ b/Documentation/git-pack-objects.txt
@@ -192,7 +192,7 @@ self-contained. Use `git index-pack --fix-thin`
--shallow::
Optimize a pack that will be provided to a client with a shallow
- repository. This option, combined with \--thin, can result in a
+ repository. This option, combined with --thin, can result in a
smaller pack at the cost of speed.
--delta-base-offset::
diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt
index 200eb22..712ab4b 100644
--- a/Documentation/git-pull.txt
+++ b/Documentation/git-pull.txt
@@ -111,13 +111,12 @@ include::merge-options.txt[]
was rebased since last fetched, the rebase uses that information
to avoid rebasing non-local changes.
+
-When preserve, also rebase the current branch on top of the upstream
-branch, but pass `--preserve-merges` along to `git rebase` so that
-locally created merge commits will not be flattened.
+When set to preserve, rebase with the `--preserve-merges` option passed
+to `git rebase` so that locally created merge commits will not be flattened.
+
When false, merge the current branch into the upstream branch.
+
-See `pull.rebase`, `branch.<name>.rebase` and `branch.autosetuprebase` in
+See `pull.rebase`, `branch.<name>.rebase` and `branch.autoSetupRebase` in
linkgit:git-config[1] if you want to make `git pull` always use
`--rebase` instead of merging.
+
diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt
index ea97576..135d810 100644
--- a/Documentation/git-push.txt
+++ b/Documentation/git-push.txt
@@ -128,7 +128,10 @@ already exists on the remote side.
Push all the refs that would be pushed without this option,
and also push annotated tags in `refs/tags` that are missing
from the remote but are pointing at commit-ish that are
- reachable from the refs being pushed.
+ reachable from the refs being pushed. This can also be specified
+ with configuration variable 'push.followTags'. For more
+ information, see 'push.followTags' in linkgit:git-config[1].
+
--signed::
GPG-sign the push request to update refs on the receiving
@@ -154,9 +157,8 @@ already exists on the remote side.
Usually, "git push" refuses to update a remote ref that is
not an ancestor of the local ref used to overwrite it.
+
-This option bypasses the check, but instead requires that the
-current value of the ref to be the expected value. "git push"
-fails otherwise.
+This option overrides this restriction if the current value of the
+remote ref is the expected value. "git push" fails otherwise.
+
Imagine that you have to rebase what you have already published.
You will have to bypass the "must fast-forward" rule in order to
@@ -168,15 +170,14 @@ commit, and blindly pushing with `--force` will lose her work.
This option allows you to say that you expect the history you are
updating is what you rebased and want to replace. If the remote ref
still points at the commit you specified, you can be sure that no
-other people did anything to the ref (it is like taking a "lease" on
-the ref without explicitly locking it, and you update the ref while
-making sure that your earlier "lease" is still valid).
+other people did anything to the ref. It is like taking a "lease" on
+the ref without explicitly locking it, and the remote ref is updated
+only if the "lease" is still valid.
+
`--force-with-lease` alone, without specifying the details, will protect
all remote refs that are going to be updated by requiring their
current value to be the same as the remote-tracking branch we have
-for them, unless specified with a `--force-with-lease=<refname>:<expect>`
-option that explicitly states what the expected value is.
+for them.
+
`--force-with-lease=<refname>`, without specifying the expected value, will
protect the named ref (alone), if it is going to be updated, by
@@ -219,22 +220,8 @@ origin +master` to force a push to the `master` branch). See the
`<refspec>...` section above for details.
--repo=<repository>::
- This option is only relevant if no <repository> argument is
- passed in the invocation. In this case, 'git push' derives the
- remote name from the current branch: If it tracks a remote
- branch, then that remote repository is pushed to. Otherwise,
- the name "origin" is used. For this latter case, this option
- can be used to override the name "origin". In other words,
- the difference between these two commands
-+
---------------------------
-git push public #1
-git push --repo=public #2
---------------------------
-+
-is that #1 always pushes to "public" whereas #2 pushes to "public"
-only if the current branch does not track a remote branch. This is
-useful if you write an alias or script around 'git push'.
+ This option is equivalent to the <repository> argument. If both
+ are specified, the command-line argument takes precedence.
-u::
--set-upstream::
@@ -278,8 +265,8 @@ useful if you write an alias or script around 'git push'.
--[no-]verify::
Toggle the pre-push hook (see linkgit:githooks[5]). The
- default is \--verify, giving the hook a chance to prevent the
- push. With \--no-verify, the hook is bypassed completely.
+ default is --verify, giving the hook a chance to prevent the
+ push. With --no-verify, the hook is bypassed completely.
include::urls-remotes.txt[]
diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt
index 924827d..1d01baa 100644
--- a/Documentation/git-rebase.txt
+++ b/Documentation/git-rebase.txt
@@ -80,7 +80,7 @@ remain the checked-out branch.
If the upstream branch already contains a change you have made (e.g.,
because you mailed a patch which was applied upstream), then that commit
will be skipped. For example, running `git rebase master` on the
-following history (in which A' and A introduce the same set of changes,
+following history (in which `A'` and `A` introduce the same set of changes,
but have different committer information):
------------
@@ -207,10 +207,10 @@ rebase.stat::
Whether to show a diffstat of what changed upstream since the last
rebase. False by default.
-rebase.autosquash::
+rebase.autoSquash::
If set to true enable '--autosquash' option by default.
-rebase.autostash::
+rebase.autoStash::
If set to true enable '--autostash' option by default.
OPTIONS
@@ -362,7 +362,9 @@ default is `--no-fork-point`, otherwise the default is `--fork-point`.
-p::
--preserve-merges::
- Instead of ignoring merges, try to recreate them.
+ Recreate merge commits instead of flattening the history by replaying
+ commits a merge commit introduces. Merge conflict resolutions or manual
+ amendments to merge commits are not preserved.
+
This uses the `--interactive` machinery internally, but combining it
with the `--interactive` option explicitly is generally not a good
@@ -414,7 +416,7 @@ squash/fixup series.
This option is only valid when the '--interactive' option is used.
+
If the '--autosquash' option is enabled by default using the
-configuration variable `rebase.autosquash`, this option can be
+configuration variable `rebase.autoSquash`, this option can be
used to override and disable this setting.
--[no-]autostash::
diff --git a/Documentation/git-receive-pack.txt b/Documentation/git-receive-pack.txt
index 9016960..000ee8d 100644
--- a/Documentation/git-receive-pack.txt
+++ b/Documentation/git-receive-pack.txt
@@ -100,7 +100,7 @@ the following environment variables:
starting time is different by this many seconds from the
current session. Only meaningful when
`GIT_PUSH_CERT_NONCE_STATUS` says `SLOP`.
- Also read about `receive.certnonceslop` variable in
+ Also read about `receive.certNonceSlop` variable in
linkgit:git-config[1].
This hook is called before any refname is updated and before any
diff --git a/Documentation/git-reflog.txt b/Documentation/git-reflog.txt
index 70791b9..5e7908e 100644
--- a/Documentation/git-reflog.txt
+++ b/Documentation/git-reflog.txt
@@ -17,85 +17,113 @@ The command takes various subcommands, and different options
depending on the subcommand:
[verse]
-'git reflog expire' [--dry-run] [--stale-fix] [--verbose]
- [--expire=<time>] [--expire-unreachable=<time>] [--all] <refs>...
-'git reflog delete' ref@\{specifier\}...
'git reflog' ['show'] [log-options] [<ref>]
+'git reflog expire' [--expire=<time>] [--expire-unreachable=<time>]
+ [--rewrite] [--updateref] [--stale-fix]
+ [--dry-run] [--verbose] [--all | <refs>...]
+'git reflog delete' [--rewrite] [--updateref]
+ [--dry-run] [--verbose] ref@\{specifier\}...
+
+Reference logs, or "reflogs", record when the tips of branches and
+other references were updated in the local repository. Reflogs are
+useful in various Git commands, to specify the old value of a
+reference. For example, `HEAD@{2}` means "where HEAD used to be two
+moves ago", `master@{one.week.ago}` means "where master used to point
+to one week ago in this local repository", and so on. See
+linkgit:gitrevisions[7] for more details.
+
+This command manages the information recorded in the reflogs.
+
+The "show" subcommand (which is also the default, in the absence of
+any subcommands) shows the log of the reference provided in the
+command-line (or `HEAD`, by default). The reflog covers all recent
+actions, and in addition the `HEAD` reflog records branch switching.
+`git reflog show` is an alias for `git log -g --abbrev-commit
+--pretty=oneline`; see linkgit:git-log[1] for more information.
+
+The "expire" subcommand prunes older reflog entries. Entries older
+than `expire` time, or entries older than `expire-unreachable` time
+and not reachable from the current tip, are removed from the reflog.
+This is typically not used directly by end users -- instead, see
+linkgit:git-gc[1].
+
+The "delete" subcommand deletes single entries from the reflog. Its
+argument must be an _exact_ entry (e.g. "`git reflog delete
+master@{2}`"). This subcommand is also typically not used directly by
+end users.
-Reflog is a mechanism to record when the tip of branches are
-updated. This command is to manage the information recorded in it.
-The subcommand "expire" is used to prune older reflog entries.
-Entries older than `expire` time, or entries older than
-`expire-unreachable` time and not reachable from the current
-tip, are removed from the reflog. This is typically not used
-directly by the end users -- instead, see linkgit:git-gc[1].
-
-The subcommand "show" (which is also the default, in the absence of any
-subcommands) will take all the normal log options, and show the log of
-the reference provided in the command-line (or `HEAD`, by default).
-The reflog will cover all recent actions (HEAD reflog records branch switching
-as well). It is an alias for `git log -g --abbrev-commit --pretty=oneline`;
-see linkgit:git-log[1].
+OPTIONS
+-------
-The reflog is useful in various Git commands, to specify the old value
-of a reference. For example, `HEAD@{2}` means "where HEAD used to be
-two moves ago", `master@{one.week.ago}` means "where master used to
-point to one week ago", and so on. See linkgit:gitrevisions[7] for
-more details.
+Options for `show`
+~~~~~~~~~~~~~~~~~~
-To delete single entries from the reflog, use the subcommand "delete"
-and specify the _exact_ entry (e.g. "`git reflog delete master@{2}`").
+`git reflog show` accepts any of the options accepted by `git log`.
-OPTIONS
--------
+Options for `expire`
+~~~~~~~~~~~~~~~~~~~~
---stale-fix::
- This revamps the logic -- the definition of "broken commit"
- becomes: a commit that is not reachable from any of the refs and
- there is a missing object among the commit, tree, or blob
- objects reachable from it that is not reachable from any of the
- refs.
-+
-This computation involves traversing all the reachable objects, i.e. it
-has the same cost as 'git prune'. Fortunately, once this is run, we
-should not have to ever worry about missing objects, because the current
-prune and pack-objects know about reflogs and protect objects referred by
-them.
+--all::
+ Process the reflogs of all references.
--expire=<time>::
- Entries older than this time are pruned. Without the
- option it is taken from configuration `gc.reflogExpire`,
- which in turn defaults to 90 days. --expire=all prunes
- entries regardless of their age; --expire=never turns off
- pruning of reachable entries (but see --expire-unreachable).
+ Prune entries older than the specified time. If this option is
+ not specified, the expiration time is taken from the
+ configuration setting `gc.reflogExpire`, which in turn
+ defaults to 90 days. `--expire=all` prunes entries regardless
+ of their age; `--expire=never` turns off pruning of reachable
+ entries (but see `--expire-unreachable`).
--expire-unreachable=<time>::
- Entries older than this time and not reachable from
- the current tip of the branch are pruned. Without the
- option it is taken from configuration
- `gc.reflogExpireUnreachable`, which in turn defaults to
- 30 days. --expire-unreachable=all prunes unreachable
- entries regardless of their age; --expire-unreachable=never
+ Prune entries older than `<time>` that are not reachable from
+ the current tip of the branch. If this option is not
+ specified, the expiration time is taken from the configuration
+ setting `gc.reflogExpireUnreachable`, which in turn defaults
+ to 30 days. `--expire-unreachable=all` prunes unreachable
+ entries regardless of their age; `--expire-unreachable=never`
turns off early pruning of unreachable entries (but see
- --expire).
-
---all::
- Instead of listing <refs> explicitly, prune all refs.
+ `--expire`).
--updateref::
- Update the ref with the sha1 of the top reflog entry (i.e.
- <ref>@\{0\}) after expiring or deleting.
+ Update the reference to the value of the top reflog entry (i.e.
+ <ref>@\{0\}) if the previous top entry was pruned. (This
+ option is ignored for symbolic references.)
--rewrite::
- While expiring or deleting, adjust each reflog entry to ensure
- that the `old` sha1 field points to the `new` sha1 field of the
- previous entry.
+ If a reflog entry's predecessor is pruned, adjust its "old"
+ SHA-1 to be equal to the "new" SHA-1 field of the entry that
+ now precedes it.
+
+--stale-fix::
+ Prune any reflog entries that point to "broken commits". A
+ broken commit is a commit that is not reachable from any of
+ the reference tips and that refers, directly or indirectly, to
+ a missing commit, tree, or blob object.
++
+This computation involves traversing all the reachable objects, i.e. it
+has the same cost as 'git prune'. It is primarily intended to fix
+corruption caused by garbage collecting using older versions of Git,
+which didn't protect objects referred to by reflogs.
+
+-n::
+--dry-run::
+ Do not actually prune any entries; just show what would have
+ been pruned.
--verbose::
Print extra information on screen.
+
+Options for `delete`
+~~~~~~~~~~~~~~~~~~~~
+
+`git reflog delete` accepts options `--updateref`, `--rewrite`, `-n`,
+`--dry-run`, and `--verbose`, with the same meanings as when they are
+used with `expire`.
+
+
GIT
---
Part of the linkgit:git[1] suite
diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt
index cb103c8..4c6d6de 100644
--- a/Documentation/git-remote.txt
+++ b/Documentation/git-remote.txt
@@ -58,6 +58,9 @@ remote repository.
With `--no-tags` option, `git fetch <name>` does not import tags from
the remote repository.
+
+By default, only tags on fetched branches are imported
+(see linkgit:git-fetch[1]).
++
With `-t <branch>` option, instead of the default glob
refspec for the remote to track all branches under
the `refs/remotes/<name>/` namespace, a refspec to track only `<branch>`
@@ -130,17 +133,25 @@ branches, adds to that list.
'set-url'::
-Changes URL remote points to. Sets first URL remote points to matching
+Changes URLs for the remote. Sets first URL for remote <name> that matches
regex <oldurl> (first URL if no <oldurl> is given) to <newurl>. If
-<oldurl> doesn't match any URL, error occurs and nothing is changed.
+<oldurl> doesn't match any URL, an error occurs and nothing is changed.
+
With '--push', push URLs are manipulated instead of fetch URLs.
+
-With '--add', instead of changing some URL, new URL is added.
+With '--add', instead of changing existing URLs, new URL is added.
++
+With '--delete', instead of changing existing URLs, all URLs matching
+regex <url> are deleted for remote <name>. Trying to delete all
+non-push URLs is an error.
+
-With '--delete', instead of changing some URL, all URLs matching
-regex <url> are deleted. Trying to delete all non-push URLs is an
-error.
+Note that the push URL and the fetch URL, even though they can
+be set differently, must still refer to the same place. What you
+pushed to the push URL should be what you would see if you
+immediately fetched from the fetch URL. If you are trying to
+fetch from one place (e.g. your upstream) and push to another (e.g.
+your publishing repository), use two separate remotes.
+
'show'::
diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt
index 4786a78..0e0bd36 100644
--- a/Documentation/git-repack.txt
+++ b/Documentation/git-repack.txt
@@ -115,7 +115,7 @@ other objects in that pack they already have locally.
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`.
+ overrides the setting of `pack.writeBitmaps`.
--pack-kept-objects::
Include objects in `.keep` files when repacking. Note that we
@@ -123,7 +123,7 @@ other objects in that pack they already have locally.
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
+ with `-b` or `pack.writeBitmaps`, as it ensures that the
bitmapped packfile has the necessary objects.
Configuration
diff --git a/Documentation/git-rerere.txt b/Documentation/git-rerere.txt
index a62227f..9ee083c 100644
--- a/Documentation/git-rerere.txt
+++ b/Documentation/git-rerere.txt
@@ -69,7 +69,7 @@ Prune records of conflicted merges that
occurred a long time ago. By default, unresolved conflicts older
than 15 days and resolved conflicts older than 60
days are pruned. These defaults are controlled via the
-`gc.rerereunresolved` and `gc.rerereresolved` configuration
+`gc.rerereUnresolved` and `gc.rerereResolved` configuration
variables respectively.
diff --git a/Documentation/git-rev-list.txt b/Documentation/git-rev-list.txt
index 5b11922..b10ea60 100644
--- a/Documentation/git-rev-list.txt
+++ b/Documentation/git-rev-list.txt
@@ -9,54 +9,54 @@ git-rev-list - Lists commit objects in reverse chronological order
SYNOPSIS
--------
[verse]
-'git rev-list' [ \--max-count=<number> ]
- [ \--skip=<number> ]
- [ \--max-age=<timestamp> ]
- [ \--min-age=<timestamp> ]
- [ \--sparse ]
- [ \--merges ]
- [ \--no-merges ]
- [ \--min-parents=<number> ]
- [ \--no-min-parents ]
- [ \--max-parents=<number> ]
- [ \--no-max-parents ]
- [ \--first-parent ]
- [ \--remove-empty ]
- [ \--full-history ]
- [ \--not ]
- [ \--all ]
- [ \--branches[=<pattern>] ]
- [ \--tags[=<pattern>] ]
- [ \--remotes[=<pattern>] ]
- [ \--glob=<glob-pattern> ]
- [ \--ignore-missing ]
- [ \--stdin ]
- [ \--quiet ]
- [ \--topo-order ]
- [ \--parents ]
- [ \--timestamp ]
- [ \--left-right ]
- [ \--left-only ]
- [ \--right-only ]
- [ \--cherry-mark ]
- [ \--cherry-pick ]
- [ \--encoding=<encoding> ]
- [ \--(author|committer|grep)=<pattern> ]
- [ \--regexp-ignore-case | -i ]
- [ \--extended-regexp | -E ]
- [ \--fixed-strings | -F ]
- [ \--date=(local|relative|default|iso|iso-strict|rfc|short) ]
- [ [ \--objects | \--objects-edge | \--objects-edge-aggressive ]
- [ \--unpacked ] ]
- [ \--pretty | \--header ]
- [ \--bisect ]
- [ \--bisect-vars ]
- [ \--bisect-all ]
- [ \--merge ]
- [ \--reverse ]
- [ \--walk-reflogs ]
- [ \--no-walk ] [ \--do-walk ]
- [ \--use-bitmap-index ]
+'git rev-list' [ --max-count=<number> ]
+ [ --skip=<number> ]
+ [ --max-age=<timestamp> ]
+ [ --min-age=<timestamp> ]
+ [ --sparse ]
+ [ --merges ]
+ [ --no-merges ]
+ [ --min-parents=<number> ]
+ [ --no-min-parents ]
+ [ --max-parents=<number> ]
+ [ --no-max-parents ]
+ [ --first-parent ]
+ [ --remove-empty ]
+ [ --full-history ]
+ [ --not ]
+ [ --all ]
+ [ --branches[=<pattern>] ]
+ [ --tags[=<pattern>] ]
+ [ --remotes[=<pattern>] ]
+ [ --glob=<glob-pattern> ]
+ [ --ignore-missing ]
+ [ --stdin ]
+ [ --quiet ]
+ [ --topo-order ]
+ [ --parents ]
+ [ --timestamp ]
+ [ --left-right ]
+ [ --left-only ]
+ [ --right-only ]
+ [ --cherry-mark ]
+ [ --cherry-pick ]
+ [ --encoding=<encoding> ]
+ [ --(author|committer|grep)=<pattern> ]
+ [ --regexp-ignore-case | -i ]
+ [ --extended-regexp | -E ]
+ [ --fixed-strings | -F ]
+ [ --date=(local|relative|default|iso|iso-strict|rfc|short) ]
+ [ [ --objects | --objects-edge | --objects-edge-aggressive ]
+ [ --unpacked ] ]
+ [ --pretty | --header ]
+ [ --bisect ]
+ [ --bisect-vars ]
+ [ --bisect-all ]
+ [ --merge ]
+ [ --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 d6de42f..bf81b97 100644
--- a/Documentation/git-rev-parse.txt
+++ b/Documentation/git-rev-parse.txt
@@ -102,7 +102,7 @@ eval "set -- $(git rev-parse --sq --prefix "$prefix" "$@")"
+
If you want to make sure that the output actually names an object in
your object database and/or can be used as a specific type of object
-you require, you can add "\^{type}" peeling operator to the parameter.
+you require, you can add the `^{type}` peeling operator to the parameter.
For example, `git rev-parse "$VAR^{commit}"` will make sure `$VAR`
names an existing object that is a commit-ish (i.e. a commit, or an
annotated tag that points at a commit). To make sure that `$VAR`
@@ -147,7 +147,7 @@ can be used.
form as close to the original input as possible.
--symbolic-full-name::
- This is similar to \--symbolic, but it omits input that
+ This is similar to --symbolic, but it omits input that
are not refs (i.e. branch or tag names; or more
explicitly disambiguating "heads/master" form, when you
want to name the "master" branch when there is an
diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt
index f248a86..8045546 100644
--- a/Documentation/git-send-email.txt
+++ b/Documentation/git-send-email.txt
@@ -47,7 +47,7 @@ Composing
--annotate::
Review and edit each patch you're about to send. Default is the value
of 'sendemail.annotate'. See the CONFIGURATION section for
- 'sendemail.multiedit'.
+ 'sendemail.multiEdit'.
--bcc=<address>::
Specify a "Bcc:" value for each email. Default is the value of
@@ -73,7 +73,7 @@ and In-Reply-To headers will be used unless they are removed.
+
Missing From or In-Reply-To headers will be prompted for.
+
-See the CONFIGURATION section for 'sendemail.multiedit'.
+See the CONFIGURATION section for 'sendemail.multiEdit'.
--from=<address>::
Specify the sender of the emails. If not specified on the command line,
@@ -156,31 +156,31 @@ Sending
subscribed to a list. In order to use the 'From' address, set the
value to "auto". If you use the sendmail binary, you must have
suitable privileges for the -f parameter. Default is the value of the
- 'sendemail.envelopesender' configuration variable; if that is
+ 'sendemail.envelopeSender' configuration variable; if that is
unspecified, choosing the envelope sender is left to your MTA.
--smtp-encryption=<encryption>::
Specify the encryption to use, either 'ssl' or 'tls'. Any other
value reverts to plain SMTP. Default is the value of
- 'sendemail.smtpencryption'.
+ 'sendemail.smtpEncryption'.
--smtp-domain=<FQDN>::
Specifies the Fully Qualified Domain Name (FQDN) used in the
HELO/EHLO command to the SMTP server. Some servers require the
FQDN to match your IP address. If not set, git send-email attempts
to determine your FQDN automatically. Default is the value of
- 'sendemail.smtpdomain'.
+ 'sendemail.smtpDomain'.
--smtp-pass[=<password>]::
Password for SMTP-AUTH. The argument is optional: If no
argument is specified, then the empty string is used as
- the password. Default is the value of 'sendemail.smtppass',
+ the password. Default is the value of 'sendemail.smtpPass',
however '--smtp-pass' always overrides this value.
+
Furthermore, passwords need not be specified in configuration files
or on the command line. If a username has been specified (with
-'--smtp-user' or a 'sendemail.smtpuser'), but no password has been
-specified (with '--smtp-pass' or 'sendemail.smtppass'), then
+'--smtp-user' or a 'sendemail.smtpUser'), but no password has been
+specified (with '--smtp-pass' or 'sendemail.smtpPass'), then
a password is obtained using 'git-credential'.
--smtp-server=<host>::
@@ -188,7 +188,7 @@ a password is obtained using 'git-credential'.
`smtp.example.com` or a raw IP address). Alternatively it can
specify a full pathname of a sendmail-like program instead;
the program must support the `-i` option. Default value can
- be specified by the 'sendemail.smtpserver' configuration
+ be specified by the 'sendemail.smtpServer' configuration
option; the built-in default is `/usr/sbin/sendmail` or
`/usr/lib/sendmail` if such program is available, or
`localhost` otherwise.
@@ -199,11 +199,11 @@ a password is obtained using 'git-credential'.
submission port 587, or the common SSL smtp port 465);
symbolic port names (e.g. "submission" instead of 587)
are also accepted. The port can also be set with the
- 'sendemail.smtpserverport' configuration variable.
+ 'sendemail.smtpServerPort' configuration variable.
--smtp-server-option=<option>::
If set, specifies the outgoing SMTP server option to use.
- Default value can be specified by the 'sendemail.smtpserveroption'
+ Default value can be specified by the 'sendemail.smtpServerOption'
configuration option.
+
The --smtp-server-option option must be repeated for each option you want
@@ -225,8 +225,8 @@ must be used for each option.
be the best choice on most platforms).
--smtp-user=<user>::
- Username for SMTP-AUTH. Default is the value of 'sendemail.smtpuser';
- if a username is not specified (with '--smtp-user' or 'sendemail.smtpuser'),
+ Username for SMTP-AUTH. Default is the value of 'sendemail.smtpUser';
+ if a username is not specified (with '--smtp-user' or 'sendemail.smtpUser'),
then authentication is not attempted.
--smtp-debug=0|1::
@@ -247,14 +247,14 @@ Automating
Specify a command to execute once per patch file which
should generate patch file specific "Cc:" entries.
Output of this command must be single email address per line.
- Default is the value of 'sendemail.cccmd' configuration value.
+ Default is the value of 'sendemail.ccCmd' configuration value.
--[no-]chain-reply-to::
If this is set, each email will be sent as a reply to the previous
email sent. If disabled with "--no-chain-reply-to", all emails after
the first will be sent as replies to the first email sent. When using
this, it is recommended that the first file given be an overview of the
- entire patch series. Disabled by default, but the 'sendemail.chainreplyto'
+ entire patch series. Disabled by default, but the 'sendemail.chainReplyTo'
configuration variable can be used to enable it.
--identity=<identity>::
@@ -304,7 +304,7 @@ specified, as well as 'body' if --no-signed-off-cc is specified.
--[no-]suppress-from::
If this is set, do not add the From: address to the cc: list.
- Default is the value of 'sendemail.suppressfrom' configuration
+ Default is the value of 'sendemail.suppressFrom' configuration
value; if that is unspecified, default to --no-suppress-from.
--[no-]thread::
@@ -377,15 +377,15 @@ default to '--validate'.
CONFIGURATION
-------------
-sendemail.aliasesfile::
+sendemail.aliasesFile::
To avoid typing long email addresses, point this to one or more
- email aliases files. You must also supply 'sendemail.aliasfiletype'.
+ email aliases files. You must also supply 'sendemail.aliasFileType'.
-sendemail.aliasfiletype::
- Format of the file(s) specified in sendemail.aliasesfile. Must be
+sendemail.aliasFileType::
+ Format of the file(s) specified in sendemail.aliasesFile. Must be
one of 'mutt', 'mailrc', 'pine', 'elm', or 'gnus'.
-sendemail.multiedit::
+sendemail.multiEdit::
If true (default), a single editor instance will be spawned to edit
files you have to edit (patches when '--annotate' is used, and the
summary when '--compose' is used). If false, files will be edited one
@@ -404,10 +404,10 @@ To use 'git send-email' to send your patches through the GMail SMTP server,
edit ~/.gitconfig to specify your account settings:
[sendemail]
- smtpencryption = tls
- smtpserver = smtp.gmail.com
- smtpuser = yourname@gmail.com
- smtpserverport = 587
+ smtpEncryption = tls
+ smtpServer = smtp.gmail.com
+ smtpUser = yourname@gmail.com
+ smtpServerPort = 587
Once your commits are ready to be sent to the mailing list, run the
following commands:
diff --git a/Documentation/git-send-pack.txt b/Documentation/git-send-pack.txt
index 45c7725..b5d09f7 100644
--- a/Documentation/git-send-pack.txt
+++ b/Documentation/git-send-pack.txt
@@ -29,7 +29,7 @@ OPTIONS
a directory on the default $PATH.
--exec=<git-receive-pack>::
- Same as \--receive-pack=<git-receive-pack>.
+ Same as --receive-pack=<git-receive-pack>.
--all::
Instead of explicitly specifying which refs to update,
diff --git a/Documentation/git-show.txt b/Documentation/git-show.txt
index 4e617e6..82a4125 100644
--- a/Documentation/git-show.txt
+++ b/Documentation/git-show.txt
@@ -22,7 +22,7 @@ presents the merge commit in a special format as produced by
For tags, it shows the tag message and the referenced objects.
For trees, it shows the names (equivalent to 'git ls-tree'
-with \--name-only).
+with --name-only).
For plain blobs, it shows the plain contents.
diff --git a/Documentation/git-status.txt b/Documentation/git-status.txt
index 4d8d530..5221f95 100644
--- a/Documentation/git-status.txt
+++ b/Documentation/git-status.txt
@@ -41,6 +41,14 @@ OPTIONS
--long::
Give the output in the long-format. This is the default.
+-v::
+--verbose::
+ In addition to the names of files that have been changed, also
+ show the textual changes that are staged to be committed
+ (i.e., like the output of `git diff --cached`). If `-v` is specified
+ twice, then also show the changes in the working tree that
+ have not yet been staged (i.e., like the output of `git diff`).
+
-u[<mode>]::
--untracked-files[=<mode>]::
Show untracked files.
@@ -77,7 +85,7 @@ configuration variable documented in linkgit:git-config[1].
only changes to the commits stored in the superproject are shown (this was
the behavior before 1.7.0). Using "all" hides all changes to submodules
(and suppresses the output of submodule summaries when the config option
- `status.submodulesummary` is set).
+ `status.submoduleSummary` is set).
--ignored::
Show ignored files as well.
@@ -207,7 +215,7 @@ If the config variable `status.relativePaths` is set to false, then all
paths shown are relative to the repository root, not to the current
directory.
-If `status.submodulesummary` is set to a non zero number or true (identical
+If `status.submoduleSummary` is set to a non zero number or true (identical
to -1 or an unlimited number), the submodule summary will be enabled for
the long format and a summary of commits for modified submodules will be
shown (see --summary-limit option of linkgit:git-submodule[1]). Please note
diff --git a/Documentation/git-stripspace.txt b/Documentation/git-stripspace.txt
index 6c6e989..60328d5 100644
--- a/Documentation/git-stripspace.txt
+++ b/Documentation/git-stripspace.txt
@@ -49,7 +49,7 @@ EXAMPLES
Given the following noisy input with '$' indicating the end of a line:
---------
+---------
|A brief introduction $
| $
|$
@@ -65,7 +65,7 @@ Given the following noisy input with '$' indicating the end of a line:
Use 'git stripspace' with no arguments to obtain:
---------
+---------
|A brief introduction$
|$
|A new paragraph$
@@ -79,7 +79,7 @@ Use 'git stripspace' with no arguments to obtain:
Use 'git stripspace --strip-comments' to obtain:
---------
+---------
|A brief introduction$
|$
|A new paragraph$
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index 8e6af65..2c25916 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -154,27 +154,51 @@ If `--force` is specified, the submodule's work tree will be removed even if
it contains local modifications.
update::
- Update the registered submodules, i.e. clone missing submodules and
- checkout the commit specified in the index of the containing repository.
- This will make the submodules HEAD be detached unless `--rebase` or
- `--merge` is specified or the key `submodule.$name.update` is set to
- `rebase`, `merge` or `none`. `none` can be overridden by specifying
- `--checkout`. Setting the key `submodule.$name.update` to `!command`
- will cause `command` to be run. `command` can be any arbitrary shell
- command that takes a single argument, namely the sha1 to update to.
+
+--
+Update the registered submodules to match what the superproject
+expects by cloning missing submodules and updating the working tree of
+the submodules. The "updating" can be done in several ways depending
+on command line options and the value of `submodule.<name>.update`
+configuration variable. Supported update procedures are:
+
+ checkout;; the commit recorded in the superproject will be
+ checked out in the submodule on a detached HEAD. This is
+ done when `--checkout` option is given, or no option is
+ given, and `submodule.<name>.update` is unset, or if it is
+ set to 'checkout'.
++
+If `--force` is specified, the submodule will be checked out (using
+`git checkout --force` if appropriate), even if the commit specified
+in the index of the containing repository already matches the commit
+checked out in the submodule.
+
+ rebase;; the current branch of the submodule will be rebased
+ onto the commit recorded in the superproject. This is done
+ when `--rebase` option is given, or no option is given, and
+ `submodule.<name>.update` is set to 'rebase'.
+
+ merge;; the commit recorded in the superproject will be merged
+ into the current branch in the submodule. This is done
+ when `--merge` option is given, or no option is given, and
+ `submodule.<name>.update` is set to 'merge'.
+
+ custom command;; arbitrary shell command that takes a single
+ argument (the sha1 of the commit recorded in the
+ superproject) is executed. This is done when no option is
+ given, and `submodule.<name>.update` has the form of
+ '!command'.
+
+When no option is given and `submodule.<name>.update` is set to 'none',
+the submodule is not updated.
+
If the submodule is not yet initialized, and you just want to use the
setting as stored in .gitmodules, you can automatically initialize the
submodule with the `--init` option.
-+
+
If `--recursive` is specified, this command will recurse into the
registered submodules, and update any nested submodules within.
-+
-If `--force` is specified, the submodule will be checked out (using
-`git checkout --force` if appropriate), even if the commit specified in the
-index of the containing repository already matches the commit checked out in
-the submodule.
-
+--
summary::
Show commit summary between the given commit (defaults to HEAD) and
working tree/index. For a submodule in question, a series of commits
@@ -238,10 +262,12 @@ OPTIONS
When running add, allow adding an otherwise ignored submodule path.
When running deinit the submodule work trees will be removed even if
they contain local changes.
- When running update, throw away local changes in submodules when
- switching to a different commit; and always run a checkout operation
- in the submodule, even if the commit listed in the index of the
- containing repository matches the commit checked out in the submodule.
+ When running update (only effective with the checkout procedure),
+ throw away local changes in submodules when switching to a
+ different commit; and always run a checkout operation in the
+ submodule, even if the commit listed in the index of the
+ containing repository matches the commit checked out in the
+ submodule.
--cached::
This option is only valid for status and summary commands. These
@@ -302,7 +328,7 @@ the submodule itself.
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`.
+ a value other than `checkout`.
If the key `submodule.$name.update` is either not explicitly set or
set to `checkout`, this option is implicit.
diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
index 39e9a18..11d1e2f 100644
--- a/Documentation/git-svn.txt
+++ b/Documentation/git-svn.txt
@@ -70,8 +70,8 @@ COMMANDS
--username=<user>;;
For transports that SVN handles authentication for (http,
https, and plain svn), specify the username. For other
- transports (e.g. svn+ssh://), you must include the username in
- the URL, e.g. svn+ssh://foo@svn.bar.com/project
+ transports (e.g. `svn+ssh://`), you must include the username in
+ the URL, e.g. `svn+ssh://foo@svn.bar.com/project`
--prefix=<prefix>;;
This allows one to specify a prefix which is prepended
to the names of remotes if trunk/branches/tags are
@@ -279,9 +279,9 @@ first have already been pushed into SVN.
Ask the user to confirm that a patch set should actually be sent to SVN.
For each patch, one may answer "yes" (accept this patch), "no" (discard this
patch), "all" (accept all patches), or "quit".
- +
- 'git svn dcommit' returns immediately if answer is "no" or "quit", without
- committing anything to SVN.
++
+'git svn dcommit' returns immediately if answer is "no" or "quit", without
+committing anything to SVN.
'branch'::
Create a branch in the SVN repository.
diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index e953ba4..034d10d 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -98,10 +98,13 @@ OPTIONS
--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. When this option is not given, the sort order defaults to the
- value configured for the 'tag.sort' variable if it exists, or
- lexicographic order otherwise. See linkgit:git-config[1].
+ names are treated as versions). The "version:refname" sort
+ order can also be affected by the
+ "versionsort.prereleaseSuffix" configuration variable. Prepend
+ "-" to reverse sort order. When this option is not given, the
+ sort order defaults to the value configured for the 'tag.sort'
+ variable if it exists, or lexicographic order otherwise. See
+ linkgit:git-config[1].
--column[=<options>]::
--no-column::
@@ -155,13 +158,13 @@ This option is only applicable when listing tags without annotation lines.
CONFIGURATION
-------------
By default, 'git tag' in sign-with-default mode (-s) will use your
-committer identity (of the form "Your Name <\your@email.address>") to
+committer identity (of the form `Your Name <your@email.address>`) to
find a key. If you want to use a different default key, you can specify
it in the repository configuration as follows:
-------------------------------------
[user]
- signingkey = <gpg-key-id>
+ signingKey = <gpg-key-id>
-------------------------------------
diff --git a/Documentation/git-unpack-objects.txt b/Documentation/git-unpack-objects.txt
index 12cb108..07d4329 100644
--- a/Documentation/git-unpack-objects.txt
+++ b/Documentation/git-unpack-objects.txt
@@ -9,7 +9,7 @@ git-unpack-objects - Unpack objects from a packed archive
SYNOPSIS
--------
[verse]
-'git unpack-objects' [-n] [-q] [-r] [--strict] < <pack-file>
+'git unpack-objects' [-n] [-q] [-r] [--strict] < <packfile>
DESCRIPTION
@@ -19,8 +19,8 @@ the objects contained within and writing them into the repository in
"loose" (one object per file) format.
Objects that already exist in the repository will *not* be unpacked
-from the pack-file. Therefore, nothing will be unpacked if you use
-this command on a pack-file that exists within the target repository.
+from the packfile. Therefore, nothing will be unpacked if you use
+this command on a packfile that exists within the target repository.
See linkgit:git-repack[1] for options to generate
new packs and replace existing ones.
diff --git a/Documentation/git-verify-pack.txt b/Documentation/git-verify-pack.txt
index 526ba7b..61ca6d0 100644
--- a/Documentation/git-verify-pack.txt
+++ b/Documentation/git-verify-pack.txt
@@ -40,7 +40,7 @@ OUTPUT FORMAT
-------------
When specifying the -v option the format used is:
- SHA-1 type size size-in-pack-file offset-in-packfile
+ SHA-1 type size size-in-packfile offset-in-packfile
for objects that are not deltified in the pack, and
diff --git a/Documentation/git.txt b/Documentation/git.txt
index eadbd05..12d9df1 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -43,9 +43,25 @@ unreleased) version of Git, that is available from the 'master'
branch of the `git.git` repository.
Documentation for older releases are available here:
-* link:v2.3.0/git.html[documentation for release 2.3]
+* link:v2.4.3/git.html[documentation for release 2.4.3]
* release notes for
+ link:RelNotes/2.4.3.txt[2.4.3],
+ link:RelNotes/2.4.2.txt[2.4.2],
+ link:RelNotes/2.4.1.txt[2.4.1],
+ link:RelNotes/2.4.0.txt[2.4].
+
+* link:v2.3.8/git.html[documentation for release 2.3.8]
+
+* release notes for
+ link:RelNotes/2.3.8.txt[2.3.8],
+ link:RelNotes/2.3.7.txt[2.3.7],
+ link:RelNotes/2.3.6.txt[2.3.6],
+ link:RelNotes/2.3.5.txt[2.3.5],
+ link:RelNotes/2.3.4.txt[2.3.4],
+ link:RelNotes/2.3.3.txt[2.3.3],
+ link:RelNotes/2.3.2.txt[2.3.2],
+ link:RelNotes/2.3.1.txt[2.3.1],
link:RelNotes/2.3.0.txt[2.3].
* link:v2.2.2/git.html[documentation for release 2.2.2]
@@ -765,7 +781,8 @@ Git so take care if using Cogito etc.
'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.
+ files. By default index file version 2 or 3 is used. See
+ linkgit:git-update-index[1] for more information.
'GIT_OBJECT_DIRECTORY'::
If the object storage directory is specified via this
@@ -916,7 +933,7 @@ for further details.
If this environment variable is set, then Git commands which need to
acquire passwords or passphrases (e.g. for HTTP or IMAP authentication)
will call this program with a suitable prompt as command-line argument
- and read the password from its STDOUT. See also the 'core.askpass'
+ and read the password from its STDOUT. See also the 'core.askPass'
option in linkgit:git-config[1].
'GIT_TERMINAL_PROMPT'::
@@ -1023,6 +1040,17 @@ GIT_ICASE_PATHSPECS::
variable when it is invoked as the top level command by the
end user, to be recorded in the body of the reflog.
+`GIT_REF_PARANOIA`::
+ If set to `1`, include broken or badly named refs when iterating
+ over lists of refs. In a normal, non-corrupted repository, this
+ does nothing. However, enabling it may help git to detect and
+ abort some operations in the presence of broken refs. Git sets
+ this variable automatically when performing destructive
+ operations like linkgit:git-prune[1]. You should not need to set
+ it yourself unless you want to be paranoid about making sure
+ an operation has touched every ref (e.g., because you are
+ cloning a repository to make a backup).
+
Discussion[[Discussion]]
------------------------
diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt
index c892ffa..70899b3 100644
--- a/Documentation/gitattributes.txt
+++ b/Documentation/gitattributes.txt
@@ -80,7 +80,7 @@ Attributes which should be version-controlled and distributed to other
repositories (i.e., attributes of interest to all users) should go into
`.gitattributes` files. Attributes that should affect all repositories
for a single user should be placed in a file specified by the
-`core.attributesfile` configuration option (see linkgit:git-config[1]).
+`core.attributesFile` configuration option (see linkgit:git-config[1]).
Its default value is $XDG_CONFIG_HOME/git/attributes. If $XDG_CONFIG_HOME
is either not set or empty, $HOME/.config/git/attributes is used instead.
Attributes for all users on a system should be placed in the
diff --git a/Documentation/gitcore-tutorial.txt b/Documentation/gitcore-tutorial.txt
index 8475c07..36e9ab3 100644
--- a/Documentation/gitcore-tutorial.txt
+++ b/Documentation/gitcore-tutorial.txt
@@ -259,7 +259,7 @@ index 557db03..263414f 100644
@@ -1 +1,2 @@
Hello World
+It's a new day for git
-----
+------------
i.e. the diff of the change we caused by adding another line to `hello`.
diff --git a/Documentation/gitcredentials.txt b/Documentation/gitcredentials.txt
index 47576be..1c75be0 100644
--- a/Documentation/gitcredentials.txt
+++ b/Documentation/gitcredentials.txt
@@ -32,7 +32,7 @@ strategies to ask the user for usernames and passwords:
to the program on the command line, and the user's input is read
from its standard output.
-2. Otherwise, if the `core.askpass` configuration variable is set, its
+2. Otherwise, if the `core.askPass` configuration variable is set, its
value is used as above.
3. Otherwise, if the `SSH_ASKPASS` environment variable is set, its
diff --git a/Documentation/gitdiffcore.txt b/Documentation/gitdiffcore.txt
index c8b3e51..c579593 100644
--- a/Documentation/gitdiffcore.txt
+++ b/Documentation/gitdiffcore.txt
@@ -28,8 +28,8 @@ The 'git diff-{asterisk}' family works by first comparing two sets of
files:
- 'git diff-index' compares contents of a "tree" object and the
- working directory (when '\--cached' flag is not used) or a
- "tree" object and the index file (when '\--cached' flag is
+ working directory (when '--cached' flag is not used) or a
+ "tree" object and the index file (when '--cached' flag is
used);
- 'git diff-files' compares contents of the index file and the
@@ -142,7 +142,7 @@ merges these filepairs and creates:
When the "-C" option is used, the original contents of modified files,
and deleted files (and also unmodified files, if the
-"\--find-copies-harder" option is used) are considered as candidates
+"--find-copies-harder" option is used) are considered as candidates
of the source files in rename/copy operation. If the input were like
these filepairs, that talk about a modified file fileY and a newly
created file file0:
diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt
index 4fd0442..473623d 100644
--- a/Documentation/gitignore.txt
+++ b/Documentation/gitignore.txt
@@ -38,7 +38,7 @@ precedence, the last matching pattern decides the outcome):
* Patterns read from `$GIT_DIR/info/exclude`.
* Patterns read from the file specified by the configuration
- variable 'core.excludesfile'.
+ variable 'core.excludesFile'.
Which file to place a pattern in depends on how the pattern is meant to
be used.
@@ -56,7 +56,7 @@ be used.
* Patterns which a user wants Git to
ignore in all situations (e.g., backup or temporary files generated by
the user's editor of choice) generally go into a file specified by
- `core.excludesfile` in the user's `~/.gitconfig`. Its default value is
+ `core.excludesFile` in the user's `~/.gitconfig`. Its default value is
$XDG_CONFIG_HOME/git/ignore. If $XDG_CONFIG_HOME is either not set or
empty, $HOME/.config/git/ignore is used instead.
diff --git a/Documentation/gitk.txt b/Documentation/gitk.txt
index 7ae50aa..6ade002 100644
--- a/Documentation/gitk.txt
+++ b/Documentation/gitk.txt
@@ -99,10 +99,10 @@ linkgit:git-rev-list[1] for a complete list.
detailed explanation.)
-L<start>,<end>:<file>::
--L:<regex>:<file>::
+-L:<funcname>:<file>::
Trace the evolution of the line range given by "<start>,<end>"
- (or the funcname regex <regex>) within the <file>. You may
+ (or the function name regex <funcname>) within the <file>. You may
not give any pathspec limiters. This is currently limited to
a walk starting from a single revision, i.e., you may only
give zero or one positive revision arguments.
diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt
index f6c0dfd..ac70eca 100644
--- a/Documentation/gitmodules.txt
+++ b/Documentation/gitmodules.txt
@@ -38,18 +38,15 @@ submodule.<name>.url::
In addition, there are a number of optional keys:
submodule.<name>.update::
- Defines what to do when the submodule is updated by the superproject.
- If 'checkout' (the default), the new commit specified in the
- superproject will be checked out in the submodule on a detached HEAD.
- If 'rebase', the current branch of the submodule will be rebased onto
- the commit specified in the superproject. If 'merge', the commit
- specified in the superproject will be merged into the current branch
- in the submodule.
- If 'none', the submodule with name `$name` will not be updated
- by default.
-
- This config option is overridden if 'git submodule update' is given
- the '--merge', '--rebase' or '--checkout' options.
+ Defines the default update procedure for the named submodule,
+ i.e. how the submodule is updated by "git submodule update"
+ command in the superproject. This is only used by `git
+ submodule init` to initialize the configuration variable of
+ the same name. Allowed values here are 'checkout', 'rebase',
+ 'merge' or 'none'. See description of 'update' command in
+ linkgit:git-submodule[1] for their meaning. Note that the
+ '!command' form is intentionally ignored here for security
+ reasons.
submodule.<name>.branch::
A remote branch name for tracking updates in the upstream submodule.
diff --git a/Documentation/gitremote-helpers.txt b/Documentation/gitremote-helpers.txt
index 8edf72c..82e2d15 100644
--- a/Documentation/gitremote-helpers.txt
+++ b/Documentation/gitremote-helpers.txt
@@ -408,14 +408,14 @@ set by Git if the remote helper has the 'option' capability.
of <n> correspond to the number of -v flags passed on the
command line.
-'option progress' \{'true'|'false'\}::
+'option progress' {'true'|'false'}::
Enables (or disables) progress messages displayed by the
transport helper during a command.
'option depth' <depth>::
Deepens the history of a shallow repository.
-'option followtags' \{'true'|'false'\}::
+'option followtags' {'true'|'false'}::
If enabled the helper should automatically fetch annotated
tag objects if the object the tag points at was transferred
during the fetch command. If the tag is not fetched by
@@ -423,7 +423,7 @@ set by Git if the remote helper has the 'option' capability.
ask for the tag specifically. Some helpers may be able to
use this option to avoid a second network connection.
-'option dry-run' \{'true'|'false'\}:
+'option dry-run' {'true'|'false'}:
If true, pretend the operation completed successfully,
but don't actually change any repository data. For most
helpers this only applies to the 'push', if supported.
@@ -434,18 +434,18 @@ set by Git if the remote helper has the 'option' capability.
must not rely on this option being set before
connect request occurs.
-'option check-connectivity' \{'true'|'false'\}::
+'option check-connectivity' {'true'|'false'}::
Request the helper to check connectivity of a clone.
-'option force' \{'true'|'false'\}::
+'option force' {'true'|'false'}::
Request the helper to perform a force update. Defaults to
'false'.
-'option cloning \{'true'|'false'\}::
+'option cloning {'true'|'false'}::
Notify the helper this is a clone request (i.e. the current
repository is guaranteed empty).
-'option update-shallow \{'true'|'false'\}::
+'option update-shallow {'true'|'false'}::
Allow to extend .git/shallow if the new refs require it.
SEE ALSO
diff --git a/Documentation/gitweb.conf.txt b/Documentation/gitweb.conf.txt
index ebe7a6c..a096e7d 100644
--- a/Documentation/gitweb.conf.txt
+++ b/Documentation/gitweb.conf.txt
@@ -482,7 +482,7 @@ project config. Per-repository configuration takes precedence over value
composed from `@git_base_url_list` elements and project name.
+
You can setup one single value (single entry/item in this list) at build
-time by setting the `GITWEB_BASE_URL` built-time configuration variable.
+time by setting the `GITWEB_BASE_URL` build-time configuration variable.
By default it is set to (), i.e. an empty list. This means that gitweb
would not try to create project URL (to fetch) from project name.
@@ -706,7 +706,7 @@ show-sizes::
I/O. Enabled by default.
+
This feature can be configured on a per-repository basis via
-repository's `gitweb.showsizes` configuration variable (boolean).
+repository's `gitweb.showSizes` configuration variable (boolean).
patches::
Enable and configure "patches" view, which displays list of commits in email
diff --git a/Documentation/howto/recover-corrupted-object-harder.txt b/Documentation/howto/recover-corrupted-object-harder.txt
index 23e685d..9c4cd09 100644
--- a/Documentation/howto/recover-corrupted-object-harder.txt
+++ b/Documentation/howto/recover-corrupted-object-harder.txt
@@ -240,3 +240,240 @@ But more importantly, git's hashing and checksumming noticed a problem
that easily could have gone undetected in another system. The result
still compiled, but would have caused an interesting bug (that would
have been blamed on some random commit).
+
+
+The adventure continues...
+--------------------------
+
+I ended up doing this again! Same entity, new hardware. The assumption
+at this point is that the old disk corrupted the packfile, and then the
+corruption was migrated to the new hardware (because it was done by
+rsync or similar, and no fsck was done at the time of migration).
+
+This time, the affected blob was over 20 megabytes, which was far too
+large to do a brute-force on. I followed the instructions above to
+create the `zlib` file. I then used the `inflate` program below to pull
+the corrupted data from that. Examining that output gave me a hint about
+where in the file the corruption was. But now I was working with the
+file itself, not the zlib contents. So knowing the sha1 of the object
+and the approximate area of the corruption, I used the `sha1-munge`
+program below to brute-force the correct byte.
+
+Here's the inflate program (it's essentially `gunzip` but without the
+`.gz` header processing):
+
+--------------------------
+#include <stdio.h>
+#include <string.h>
+#include <zlib.h>
+#include <stdlib.h>
+
+int main(int argc, char **argv)
+{
+ /*
+ * oversized so we can read the whole buffer in;
+ * this could actually be switched to streaming
+ * to avoid any memory limitations
+ */
+ static unsigned char buf[25 * 1024 * 1024];
+ static unsigned char out[25 * 1024 * 1024];
+ int len;
+ z_stream z;
+ int ret;
+
+ len = read(0, buf, sizeof(buf));
+ memset(&z, 0, sizeof(z));
+ inflateInit(&z);
+
+ z.next_in = buf;
+ z.avail_in = len;
+ z.next_out = out;
+ z.avail_out = sizeof(out);
+
+ ret = inflate(&z, 0);
+ if (ret != Z_OK && ret != Z_STREAM_END)
+ fprintf(stderr, "initial inflate failed (%d)\n", ret);
+
+ fprintf(stderr, "outputting %lu bytes", z.total_out);
+ fwrite(out, 1, z.total_out, stdout);
+ return 0;
+}
+--------------------------
+
+And here is the `sha1-munge` program:
+
+--------------------------
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <openssl/sha.h>
+#include <stdlib.h>
+
+/* eye candy */
+static int counter = 0;
+static void progress(int sig)
+{
+ fprintf(stderr, "\r%d", counter);
+ alarm(1);
+}
+
+static const signed char hexval_table[256] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 00-07 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 08-0f */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 10-17 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 18-1f */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 20-27 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 28-2f */
+ 0, 1, 2, 3, 4, 5, 6, 7, /* 30-37 */
+ 8, 9, -1, -1, -1, -1, -1, -1, /* 38-3f */
+ -1, 10, 11, 12, 13, 14, 15, -1, /* 40-47 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 48-4f */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 50-57 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 58-5f */
+ -1, 10, 11, 12, 13, 14, 15, -1, /* 60-67 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 68-67 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 70-77 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 78-7f */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 80-87 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 88-8f */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 90-97 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* 98-9f */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* a0-a7 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* a8-af */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* b0-b7 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* b8-bf */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* c0-c7 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* c8-cf */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* d0-d7 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* d8-df */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* e0-e7 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* e8-ef */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* f0-f7 */
+ -1, -1, -1, -1, -1, -1, -1, -1, /* f8-ff */
+};
+
+static inline unsigned int hexval(unsigned char c)
+{
+return hexval_table[c];
+}
+
+static int get_sha1_hex(const char *hex, unsigned char *sha1)
+{
+ int i;
+ for (i = 0; i < 20; i++) {
+ unsigned int val;
+ /*
+ * hex[1]=='\0' is caught when val is checked below,
+ * but if hex[0] is NUL we have to avoid reading
+ * past the end of the string:
+ */
+ if (!hex[0])
+ return -1;
+ val = (hexval(hex[0]) << 4) | hexval(hex[1]);
+ if (val & ~0xff)
+ return -1;
+ *sha1++ = val;
+ hex += 2;
+ }
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ /* oversized so we can read the whole buffer in */
+ static unsigned char buf[25 * 1024 * 1024];
+ char header[32];
+ int header_len;
+ unsigned char have[20], want[20];
+ int start, len;
+ SHA_CTX orig;
+ unsigned i, j;
+
+ if (!argv[1] || get_sha1_hex(argv[1], want)) {
+ fprintf(stderr, "usage: sha1-munge <sha1> [start] <file.in\n");
+ return 1;
+ }
+
+ if (argv[2])
+ start = atoi(argv[2]);
+ else
+ start = 0;
+
+ len = read(0, buf, sizeof(buf));
+ header_len = sprintf(header, "blob %d", len) + 1;
+ fprintf(stderr, "using header: %s\n", header);
+
+ /*
+ * We keep a running sha1 so that if you are munging
+ * near the end of the file, we do not have to re-sha1
+ * the unchanged earlier bytes
+ */
+ SHA1_Init(&orig);
+ SHA1_Update(&orig, header, header_len);
+ if (start)
+ SHA1_Update(&orig, buf, start);
+
+ signal(SIGALRM, progress);
+ alarm(1);
+
+ for (i = start; i < len; i++) {
+ unsigned char c;
+ SHA_CTX x;
+
+#if 0
+ /*
+ * deletion -- this would not actually work in practice,
+ * I think, because we've already committed to a
+ * particular size in the header. Ditto for addition
+ * below. In those cases, you'd have to do the whole
+ * sha1 from scratch, or possibly keep three running
+ * "orig" sha1 computations going.
+ */
+ memcpy(&x, &orig, sizeof(x));
+ SHA1_Update(&x, buf + i + 1, len - i - 1);
+ SHA1_Final(have, &x);
+ if (!memcmp(have, want, 20))
+ printf("i=%d, deletion\n", i);
+#endif
+
+ /*
+ * replacement -- note that this tries each of the 256
+ * possible bytes. If you suspect a single-bit flip,
+ * it would be much shorter to just try the 8
+ * bit-flipped variants.
+ */
+ c = buf[i];
+ for (j = 0; j <= 0xff; j++) {
+ buf[i] = j;
+
+ memcpy(&x, &orig, sizeof(x));
+ SHA1_Update(&x, buf + i, len - i);
+ SHA1_Final(have, &x);
+ if (!memcmp(have, want, 20))
+ printf("i=%d, j=%02x\n", i, j);
+ }
+ buf[i] = c;
+
+#if 0
+ /* addition */
+ for (j = 0; j <= 0xff; j++) {
+ unsigned char extra = j;
+ memcpy(&x, &orig, sizeof(x));
+ SHA1_Update(&x, &extra, 1);
+ SHA1_Update(&x, buf + i, len - i);
+ SHA1_Final(have, &x);
+ if (!memcmp(have, want, 20))
+ printf("i=%d, addition=%02x", i, j);
+ }
+#endif
+
+ SHA1_Update(&orig, buf + i, 1);
+ counter++;
+ }
+
+ alarm(0);
+ fprintf(stderr, "\r%d\n", counter);
+ return 0;
+}
+--------------------------
diff --git a/Documentation/line-range-format.txt b/Documentation/line-range-format.txt
index d7f2603..829676f 100644
--- a/Documentation/line-range-format.txt
+++ b/Documentation/line-range-format.txt
@@ -22,8 +22,9 @@ This is only valid for <end> and will specify a number
of lines before or after the line given by <start>.
+
-If ``:<regex>'' is given in place of <start> and <end>, it denotes the range
-from the first funcname line that matches <regex>, up to the next
-funcname line. ``:<regex>'' searches from the end of the previous `-L` range,
-if any, otherwise from the start of file.
-``^:<regex>'' searches from the start of file.
+If ``:<funcname>'' is given in place of <start> and <end>, it is a
+regular expression that denotes the range from the first funcname line
+that matches <funcname>, up to the next funcname line. ``:<funcname>''
+searches from the end of the previous `-L` range, if any, otherwise
+from the start of file. ``^:<funcname>'' searches from the start of
+file.
diff --git a/Documentation/merge-config.txt b/Documentation/merge-config.txt
index d78d6d8..8a0e52f 100644
--- a/Documentation/merge-config.txt
+++ b/Documentation/merge-config.txt
@@ -1,4 +1,4 @@
-merge.conflictstyle::
+merge.conflictStyle::
Specify the style in which conflicted hunks are written out to
working tree files upon merge. The default is "merge", which
shows a `<<<<<<<` conflict marker, changes made by one side,
diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt
index dcf7429..dc865cb 100644
--- a/Documentation/pretty-formats.txt
+++ b/Documentation/pretty-formats.txt
@@ -79,7 +79,10 @@ stored in the commit object. Notably, the SHA-1s are
displayed in full, regardless of whether --abbrev or
--no-abbrev are used, and 'parents' information show the
true parent commits, without taking grafts or history
-simplification into account.
+simplification into account. Note that this format affects the way
+commits are displayed, but not the way the diff is shown e.g. with
+`git log --raw`. To get full object names in a raw diff format,
+use `--no-abbrev`.
* 'format:<string>'
+
diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt
index 0f3d460..77ac439 100644
--- a/Documentation/rev-list-options.txt
+++ b/Documentation/rev-list-options.txt
@@ -59,8 +59,8 @@ endif::git-rev-list[]
matches any of the given patterns are chosen (but see
`--all-match`).
+
-When `--show-notes` is in effect, the message from the notes as
-if it is part of the log message.
+When `--show-notes` is in effect, the message from the notes is
+matched as if it were part of the log message.
--all-match::
Limit the commits output to ones that match all given `--grep`,
@@ -123,7 +123,8 @@ parents) and `--max-parents=-1` (negative numbers denote no upper limit).
because merges into a topic branch tend to be only about
adjusting to updated upstream from time to time, and
this option allows you to ignore the individual commits
- brought in to your history by such a merge.
+ brought in to your history by such a merge. Cannot be
+ combined with --bisect.
--not::
Reverses the meaning of the '{caret}' prefix (or lack thereof)
@@ -176,11 +177,6 @@ explicitly.
Pretend as if all objects mentioned by reflogs are listed on the
command line as `<commit>`.
---indexed-objects::
- Pretend as if all trees and blobs used by the index are listed
- on the command line. Note that you probably want to use
- `--objects`, too.
-
--ignore-missing::
Upon seeing an invalid object name in the input, pretend as if
the bad input was not given.
@@ -190,7 +186,7 @@ ifndef::git-rev-list[]
Pretend as if the bad bisection ref `refs/bisect/bad`
was listed and as if it was followed by `--not` and the good
bisection refs `refs/bisect/good-*` on the command
- line.
+ line. Cannot be combined with --first-parent.
endif::git-rev-list[]
--stdin::
@@ -571,7 +567,7 @@ outputs 'midpoint', the output of the two commands
would be of roughly the same length. Finding the change which
introduces a regression is thus reduced to a binary search: repeatedly
generate and test new 'midpoint's until the commit chain is of length
-one.
+one. Cannot be combined with --first-parent.
--bisect-vars::
This calculates the same as `--bisect`, except that refs in
@@ -648,6 +644,7 @@ Object Traversal
These options are mostly targeted for packing of Git repositories.
+ifdef::git-rev-list[]
--objects::
Print the object IDs of any object referenced by the listed
commits. `--objects foo ^bar` thus means ``send me
@@ -666,9 +663,15 @@ These options are mostly targeted for packing of Git repositories.
commits at the cost of increased time. This is used instead of
`--objects-edge` to build ``thin'' packs for shallow repositories.
+--indexed-objects::
+ Pretend as if all trees and blobs used by the index are listed
+ on the command line. Note that you probably want to use
+ `--objects`, too.
+
--unpacked::
Only useful with `--objects`; print the object IDs that are not
in packs.
+endif::git-rev-list[]
--no-walk[=(sorted|unsorted)]::
Only show the given commits, but do not traverse their ancestors.
@@ -677,6 +680,7 @@ These options are mostly targeted for packing of Git repositories.
given on the command line. Otherwise (if `sorted` or no argument
was given), the commits are shown in reverse chronological order
by commit time.
+ Cannot be combined with `--graph`.
--do-walk::
Overrides a previous `--no-walk`.
@@ -779,6 +783,7 @@ you would get an output like this:
on the left hand side of the output. This may cause extra lines
to be printed in between commits, in order for the graph history
to be drawn properly.
+ Cannot be combined with `--no-walk`.
+
This enables parent rewriting, see 'History Simplification' below.
+
diff --git a/Documentation/technical/api-error-handling.txt b/Documentation/technical/api-error-handling.txt
new file mode 100644
index 0000000..ceeedd4
--- /dev/null
+++ b/Documentation/technical/api-error-handling.txt
@@ -0,0 +1,75 @@
+Error reporting in git
+======================
+
+`die`, `usage`, `error`, and `warning` report errors of various
+kinds.
+
+- `die` is for fatal application errors. It prints a message to
+ the user and exits with status 128.
+
+- `usage` is for errors in command line usage. After printing its
+ message, it exits with status 129. (See also `usage_with_options`
+ in the link:api-parse-options.html[parse-options API].)
+
+- `error` is for non-fatal library errors. It prints a message
+ to the user and returns -1 for convenience in signaling the error
+ to the caller.
+
+- `warning` is for reporting situations that probably should not
+ occur but which the user (and Git) can continue to work around
+ without running into too many problems. Like `error`, it
+ returns -1 after reporting the situation to the caller.
+
+Customizable error handlers
+---------------------------
+
+The default behavior of `die` and `error` is to write a message to
+stderr and then exit or return as appropriate. This behavior can be
+overridden using `set_die_routine` and `set_error_routine`. For
+example, "git daemon" uses set_die_routine to write the reason `die`
+was called to syslog before exiting.
+
+Library errors
+--------------
+
+Functions return a negative integer on error. Details beyond that
+vary from function to function:
+
+- Some functions return -1 for all errors. Others return a more
+ specific value depending on how the caller might want to react
+ to the error.
+
+- Some functions report the error to stderr with `error`,
+ while others leave that for the caller to do.
+
+- errno is not meaningful on return from most functions (except
+ for thin wrappers for system calls).
+
+Check the function's API documentation to be sure.
+
+Caller-handled errors
+---------------------
+
+An increasing number of functions take a parameter 'struct strbuf *err'.
+On error, such functions append a message about what went wrong to the
+'err' strbuf. The message is meant to be complete enough to be passed
+to `die` or `error` as-is. For example:
+
+ if (ref_transaction_commit(transaction, &err))
+ die("%s", err.buf);
+
+The 'err' parameter will be untouched if no error occurred, so multiple
+function calls can be chained:
+
+ t = ref_transaction_begin(&err);
+ if (!t ||
+ ref_transaction_update(t, "HEAD", ..., &err) ||
+ ret_transaction_commit(t, &err))
+ die("%s", err.buf);
+
+The 'err' parameter must be a pointer to a valid strbuf. To silence
+a message, pass a strbuf that is explicitly ignored:
+
+ if (thing_that_can_fail_in_an_ignorable_way(..., &err))
+ /* This failure is okay. */
+ strbuf_reset(&err);
diff --git a/Documentation/technical/api-strbuf.txt b/Documentation/technical/api-strbuf.txt
deleted file mode 100644
index cca6543..0000000
--- a/Documentation/technical/api-strbuf.txt
+++ /dev/null
@@ -1,351 +0,0 @@
-strbuf API
-==========
-
-strbuf's are meant to be used with all the usual C string and memory
-APIs. Given that the length of the buffer is known, it's often better to
-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.
-
-A strbuf is NUL terminated for convenience, but no function in the
-strbuf API actually relies on the string being free of NULs.
-
-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
-`strbuf_init()` or by `= STRBUF_INIT` before the invariants, though.
-+
-Do *not* assume anything on what `buf` really is (e.g. if it is
-allocated memory or not), use `strbuf_detach()` to unwrap a memory
-buffer from its strbuf shell in a safe way. That is the sole supported
-way. This will give you a malloced buffer that you can later `free()`.
-+
-However, it is totally safe to modify anything in the string pointed by
-the `buf` member, between the indices `0` and `len-1` (inclusive).
-
-. The `buf` member is a byte array that has at least `len + 1` bytes
- allocated. The extra byte is used to store a `'\0'`, allowing the
- `buf` member to be a valid C-string. Every strbuf function ensure this
- invariant is preserved.
-+
-NOTE: It is OK to "play" with the buffer directly if you work it this
- way:
-+
-----
-strbuf_grow(sb, SOME_SIZE); <1>
-strbuf_setlen(sb, sb->len + SOME_OTHER_SIZE);
-----
-<1> Here, the memory array starting at `sb->buf`, and of length
-`strbuf_avail(sb)` is all yours, and you can be sure that
-`strbuf_avail(sb)` is at least `SOME_SIZE`.
-+
-NOTE: `SOME_OTHER_SIZE` must be smaller or equal to `strbuf_avail(sb)`.
-+
-Doing so is safe, though if it has to be done in many places, adding the
-missing API to the strbuf module is the way to go.
-+
-WARNING: Do _not_ assume that the area that is yours is of size `alloc
-- 1` even if it's true in the current implementation. Alloc is somehow a
-"private" member that should not be messed with. Use `strbuf_avail()`
-instead.
-
-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.
-
-Functions
----------
-
-* Life cycle
-
-`strbuf_init`::
-
- Initialize the structure. The second parameter can be zero or a bigger
- number to allocate memory, in case you want to prevent further reallocs.
-
-`strbuf_release`::
-
- Release a string buffer and the memory it used. You should not use the
- string buffer after using this function, unless you initialize it again.
-
-`strbuf_detach`::
-
- Detach the string from the strbuf and returns it; you now own the
- storage the string occupies and it is your responsibility from then on
- to release it with `free(3)` when you are done with it.
-
-`strbuf_attach`::
-
- Attach a string to a buffer. You should specify the string to attach,
- the current length of the string and the amount of allocated memory.
- The amount must be larger than the string length, because the string you
- pass is supposed to be a NUL-terminated string. This string _must_ be
- malloc()ed, and after attaching, the pointer cannot be relied upon
- anymore, and neither be free()d directly.
-
-`strbuf_swap`::
-
- Swap the contents of two string buffers.
-
-* Related to the size of the buffer
-
-`strbuf_avail`::
-
- Determine the amount of allocated but unused memory.
-
-`strbuf_grow`::
-
- Ensure that at least this amount of unused memory is available after
- `len`. This is used when you know a typical size for what you will add
- and want to avoid repetitive automatic resizing of the underlying buffer.
- This is never a needed operation, but can be critical for performance in
- some cases.
-
-`strbuf_setlen`::
-
- Set the length of the buffer to a given value. This function does *not*
- allocate new memory, so you should not perform a `strbuf_setlen()` to a
- length that is larger than `len + strbuf_avail()`. `strbuf_setlen()` is
- just meant as a 'please fix invariants from this strbuf I just messed
- with'.
-
-`strbuf_reset`::
-
- Empty the buffer by setting the size of it to zero.
-
-* Related to the contents of the buffer
-
-`strbuf_trim`::
-
- Strip whitespace from the beginning and end of a string.
- Equivalent to performing `strbuf_rtrim()` followed by `strbuf_ltrim()`.
-
-`strbuf_rtrim`::
-
- Strip whitespace from the end of a string.
-
-`strbuf_ltrim`::
-
- Strip whitespace from the beginning of a string.
-
-`strbuf_reencode`::
-
- Replace the contents of the strbuf with a reencoded form. Returns -1
- on error, 0 on success.
-
-`strbuf_tolower`::
-
- Lowercase each character in the buffer using `tolower`.
-
-`strbuf_cmp`::
-
- Compare two buffers. Returns an integer less than, equal to, or greater
- than zero if the first buffer is found, respectively, to be less than,
- to match, or be greater than the second buffer.
-
-* Adding data to the buffer
-
-NOTE: All of the functions in this section will grow the buffer as necessary.
-If they fail for some reason other than memory shortage and the buffer hadn't
-been allocated before (i.e. the `struct strbuf` was set to `STRBUF_INIT`),
-then they will free() it.
-
-`strbuf_addch`::
-
- Add a single character to the buffer.
-
-`strbuf_addchars`::
-
- Add a character the specified number of times to the buffer.
-
-`strbuf_insert`::
-
- Insert data to the given position of the buffer. The remaining contents
- will be shifted, not overwritten.
-
-`strbuf_remove`::
-
- Remove given amount of data from a given position of the buffer.
-
-`strbuf_splice`::
-
- Remove the bytes between `pos..pos+len` and replace it with the given
- data.
-
-`strbuf_add_commented_lines`::
-
- Add a NUL-terminated string to the buffer. Each line will be prepended
- by a comment character and a blank.
-
-`strbuf_add`::
-
- Add data of given length to the buffer.
-
-`strbuf_addstr`::
-
-Add a NUL-terminated string to the buffer.
-+
-NOTE: This function will *always* be implemented as an inline or a macro
-that expands to:
-+
-----
-strbuf_add(..., s, strlen(s));
-----
-+
-Meaning that this is efficient to write things like:
-+
-----
-strbuf_addstr(sb, "immediate string");
-----
-
-`strbuf_addbuf`::
-
- Copy the contents of another buffer at the end of the current one.
-
-`strbuf_adddup`::
-
- Copy part of the buffer from a given position till a given length to the
- end of the buffer.
-
-`strbuf_expand`::
-
- This function can be used to expand a format string containing
- placeholders. To that end, it parses the string and calls the specified
- function for every percent sign found.
-+
-The callback function is given a pointer to the character after the `%`
-and a pointer to the struct strbuf. It is expected to add the expanded
-version of the placeholder to the strbuf, e.g. to add a newline
-character if the letter `n` appears after a `%`. The function returns
-the length of the placeholder recognized and `strbuf_expand()` skips
-over it.
-+
-The format `%%` is automatically expanded to a single `%` as a quoting
-mechanism; callers do not need to handle the `%` placeholder themselves,
-and the callback function will not be invoked for this placeholder.
-+
-All other characters (non-percent and not skipped ones) are copied
-verbatim to the strbuf. If the callback returned zero, meaning that the
-placeholder is unknown, then the percent sign is copied, too.
-+
-In order to facilitate caching and to make it possible to give
-parameters to the callback, `strbuf_expand()` passes a context pointer,
-which can be used by the programmer of the callback as she sees fit.
-
-`strbuf_expand_dict_cb`::
-
- Used as callback for `strbuf_expand()`, expects an array of
- struct strbuf_expand_dict_entry as context, i.e. pairs of
- placeholder and replacement string. The array needs to be
- terminated by an entry with placeholder set to NULL.
-
-`strbuf_addbuf_percentquote`::
-
- Append the contents of one strbuf to another, quoting any
- percent signs ("%") into double-percents ("%%") in the
- destination. This is useful for literal data to be fed to either
- strbuf_expand or to the *printf family of functions.
-
-`strbuf_humanise_bytes`::
-
- Append the given byte size as a human-readable string (i.e. 12.23 KiB,
- 3.50 MiB).
-
-`strbuf_addf`::
-
- Add a formatted string to the buffer.
-
-`strbuf_commented_addf`::
-
- Add a formatted string prepended by a comment character and a
- blank to the buffer.
-
-`strbuf_fread`::
-
- Read a given size of data from a FILE* pointer to the buffer.
-+
-NOTE: The buffer is rewound if the read fails. If -1 is returned,
-`errno` must be consulted, like you would do for `read(3)`.
-`strbuf_read()`, `strbuf_read_file()` and `strbuf_getline()` has the
-same behaviour as well.
-
-`strbuf_read`::
-
- Read the contents of a given file descriptor. The third argument can be
- used to give a hint about the file size, to avoid reallocs.
-
-`strbuf_read_file`::
-
- Read the contents of a file, specified by its path. The third argument
- can be used to give a hint about the file size, to avoid reallocs.
-
-`strbuf_readlink`::
-
- Read the target of a symbolic link, specified by its path. The third
- argument can be used to give a hint about the size, to avoid reallocs.
-
-`strbuf_getline`::
-
- Read a line from a FILE *, overwriting the existing contents
- of the strbuf. The second argument specifies the line
- terminator character, typically `'\n'`.
- Reading stops after the terminator or at EOF. The terminator
- is removed from the buffer before returning. Returns 0 unless
- there was nothing left before EOF, in which case it returns `EOF`.
-
-`strbuf_getwholeline`::
-
- Like `strbuf_getline`, but keeps the trailing terminator (if
- any) in the buffer.
-
-`strbuf_getwholeline_fd`::
-
- Like `strbuf_getwholeline`, but operates on a file descriptor.
- It reads one character at a time, so it is very slow. Do not
- use it unless you need the correct position in the file
- descriptor.
-
-`strbuf_getcwd`::
-
- Set the buffer to the path of the current working directory.
-
-`strbuf_add_absolute_path`
-
- Add a path to a buffer, converting a relative path to an
- absolute one in the process. Symbolic links are not
- resolved.
-
-`stripspace`::
-
- Strip whitespace from a buffer. The second parameter controls if
- comments are considered contents to be removed or not.
-
-`strbuf_split_buf`::
-`strbuf_split_str`::
-`strbuf_split_max`::
-`strbuf_split`::
-
- Split a string or strbuf into a list of strbufs at a specified
- terminator character. The returned substrings include the
- terminator characters. Some of these functions take a `max`
- parameter, which, if positive, limits the output to that
- number of substrings.
-
-`strbuf_list_free`::
-
- Free a list of strbufs (for example, the return values of the
- `strbuf_split()` functions).
-
-`launch_editor`::
-
- Launch the user preferred editor to edit a file and fill the buffer
- with the file's contents upon the user completing their editing. The
- third argument can be used to set the environment which the editor is
- run in. If the buffer is NULL the editor is launched as usual but the
- file's contents are not read into the buffer upon completion.
diff --git a/Documentation/technical/pack-protocol.txt b/Documentation/technical/pack-protocol.txt
index 462e206..fc09c63 100644
--- a/Documentation/technical/pack-protocol.txt
+++ b/Documentation/technical/pack-protocol.txt
@@ -465,7 +465,7 @@ contain all the objects that the server will need to complete the new
references.
----
- update-request = *shallow ( command-list | push-cert ) [pack-file]
+ update-request = *shallow ( command-list | push-cert ) [packfile]
shallow = PKT-LINE("shallow" SP obj-id LF)
@@ -491,7 +491,7 @@ references.
*PKT-LINE(gpg-signature-lines LF)
PKT-LINE("push-cert-end" LF)
- pack-file = "PACK" 28*(OCTET)
+ packfile = "PACK" 28*(OCTET)
----
If the receiving end does not support delete-refs, the sending end MUST
@@ -502,11 +502,11 @@ MUST NOT send a push-cert command. When a push-cert command is
sent, command-list MUST NOT be sent; the commands recorded in the
push certificate is used instead.
-The pack-file MUST NOT be sent if the only command used is 'delete'.
+The packfile MUST NOT be sent if the only command used is 'delete'.
-A pack-file MUST be sent if either create or update command is used,
+A packfile MUST be sent if either create or update command is used,
even if the server already has all the necessary objects. In this
-case the client MUST send an empty pack-file. The only time this
+case the client MUST send an empty packfile. The only time this
is likely to happen is if the client is creating
a new branch or a tag that points to an existing obj-id.
diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt
index 7330d88..68978f5 100644
--- a/Documentation/user-manual.txt
+++ b/Documentation/user-manual.txt
@@ -1200,7 +1200,7 @@ for other users who clone your repository.
If you wish the exclude patterns to affect only certain repositories
(instead of every repository for a given project), you may instead put
them in a file in your repository named `.git/info/exclude`, or in any
-file specified by the `core.excludesfile` configuration variable.
+file specified by the `core.excludesFile` configuration variable.
Some Git commands can also take exclude patterns directly on the
command line. See linkgit:gitignore[5] for the details.
diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN
index 780064a..f94921c 100755
--- a/GIT-VERSION-GEN
+++ b/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
-DEF_VER=v2.3.0
+DEF_VER=v2.4.3
LF='
'
diff --git a/Makefile b/Makefile
index e8ce649..40a93c1 100644
--- a/Makefile
+++ b/Makefile
@@ -357,6 +357,8 @@ all::
# and define it to "no" if you need to remove the parentheses () around the
# constant. The default is "auto", which means to use parentheses if your
# compiler is detected to support it.
+#
+# Define HAVE_BSD_SYSCTL if your platform has a BSD-compatible sysctl function.
GIT-VERSION-FILE: FORCE
@$(SHELL_PATH) ./GIT-VERSION-GEN
@@ -1052,13 +1054,13 @@ else
REMOTE_CURL_NAMES = $(REMOTE_CURL_PRIMARY) $(REMOTE_CURL_ALIASES)
PROGRAM_OBJS += http-fetch.o
PROGRAMS += $(REMOTE_CURL_NAMES)
- curl_check := $(shell (echo 070908; curl-config --vernum) 2>/dev/null | sort -r | sed -ne 2p)
+ curl_check := $(shell (echo 070908; curl-config --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
ifeq "$(curl_check)" "070908"
ifndef NO_EXPAT
PROGRAM_OBJS += http-push.o
endif
endif
- curl_check := $(shell (echo 072200; curl-config --vernum) 2>/dev/null | sort -r | sed -ne 2p)
+ curl_check := $(shell (echo 072200; curl-config --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
ifeq "$(curl_check)" "072200"
USE_CURL_FOR_IMAP_SEND = YesPlease
endif
@@ -1431,6 +1433,10 @@ ifdef HAVE_CLOCK_MONOTONIC
BASIC_CFLAGS += -DHAVE_CLOCK_MONOTONIC
endif
+ifdef HAVE_BSD_SYSCTL
+ BASIC_CFLAGS += -DHAVE_BSD_SYSCTL
+endif
+
ifeq ($(TCLTK_PATH),)
NO_TCLTK = NoThanks
endif
@@ -2096,6 +2102,7 @@ GIT-BUILD-OPTIONS: FORCE
@echo PYTHON_PATH=\''$(subst ','\'',$(PYTHON_PATH_SQ))'\' >>$@
@echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@
@echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@
+ @echo NO_EXPAT=\''$(subst ','\'',$(subst ','\'',$(NO_EXPAT)))'\' >>$@
@echo USE_LIBPCRE=\''$(subst ','\'',$(subst ','\'',$(USE_LIBPCRE)))'\' >>$@
@echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@
@echo NO_PYTHON=\''$(subst ','\'',$(subst ','\'',$(NO_PYTHON)))'\' >>$@
diff --git a/RelNotes b/RelNotes
index 9257c74..9810a70 120000
--- a/RelNotes
+++ b/RelNotes
@@ -1 +1 @@
-Documentation/RelNotes/2.3.0.txt \ No newline at end of file
+Documentation/RelNotes/2.4.3.txt \ No newline at end of file
diff --git a/archive-zip.c b/archive-zip.c
index 4bde019..ffb3535 100644
--- a/archive-zip.c
+++ b/archive-zip.c
@@ -5,6 +5,8 @@
#include "archive.h"
#include "streaming.h"
#include "utf8.h"
+#include "userdiff.h"
+#include "xdiff-interface.h"
static int zip_date;
static int zip_time;
@@ -120,7 +122,6 @@ static void *zlib_deflate_raw(void *data, unsigned long size,
void *buffer;
int result;
- memset(&stream, 0, sizeof(stream));
git_deflate_init_raw(&stream, compression_level);
maxsize = git_deflate_bound(&stream, size);
buffer = xmalloc(maxsize);
@@ -189,6 +190,16 @@ static int has_only_ascii(const char *s)
}
}
+static int entry_is_binary(const char *path, const void *buffer, size_t size)
+{
+ struct userdiff_driver *driver = userdiff_find_by_path(path);
+ if (!driver)
+ driver = userdiff_find_by_name("default");
+ if (driver->binary != -1)
+ return driver->binary;
+ return buffer_is_binary(buffer, size);
+}
+
#define STREAM_BUFFER_SIZE (1024 * 16)
static int write_zip_entry(struct archiver_args *args,
@@ -210,6 +221,8 @@ static int write_zip_entry(struct archiver_args *args,
struct git_istream *stream = NULL;
unsigned long flags = 0;
unsigned long size;
+ int is_binary = -1;
+ const char *path_without_prefix = path + args->baselen;
crc = crc32(0, NULL, 0);
@@ -256,6 +269,8 @@ static int write_zip_entry(struct archiver_args *args,
return error("cannot read %s",
sha1_to_hex(sha1));
crc = crc32(crc, buffer, size);
+ is_binary = entry_is_binary(path_without_prefix,
+ buffer, size);
out = buffer;
}
compressed_size = (method == 0) ? size : 0;
@@ -300,7 +315,6 @@ static int write_zip_entry(struct archiver_args *args,
copy_le16(dirent.extra_length, ZIP_EXTRA_MTIME_SIZE);
copy_le16(dirent.comment_length, 0);
copy_le16(dirent.disk, 0);
- copy_le16(dirent.attr1, 0);
copy_le32(dirent.attr2, attr2);
copy_le32(dirent.offset, zip_offset);
@@ -328,6 +342,9 @@ static int write_zip_entry(struct archiver_args *args,
if (readlen <= 0)
break;
crc = crc32(crc, buf, readlen);
+ if (is_binary == -1)
+ is_binary = entry_is_binary(path_without_prefix,
+ buf, readlen);
write_or_die(1, buf, readlen);
}
close_istream(stream);
@@ -349,7 +366,6 @@ static int write_zip_entry(struct archiver_args *args,
size_t out_len;
unsigned char compressed[STREAM_BUFFER_SIZE * 2];
- memset(&zstream, 0, sizeof(zstream));
git_deflate_init_raw(&zstream, args->compression_level);
compressed_size = 0;
@@ -361,6 +377,9 @@ static int write_zip_entry(struct archiver_args *args,
if (readlen <= 0)
break;
crc = crc32(crc, buf, readlen);
+ if (is_binary == -1)
+ is_binary = entry_is_binary(path_without_prefix,
+ buf, readlen);
zstream.next_in = buf;
zstream.avail_in = readlen;
@@ -405,6 +424,8 @@ static int write_zip_entry(struct archiver_args *args,
free(deflated);
free(buffer);
+ copy_le16(dirent.attr1, !is_binary);
+
memcpy(zip_dir + zip_dir_offset, &dirent, ZIP_DIR_HEADER_SIZE);
zip_dir_offset += ZIP_DIR_HEADER_SIZE;
memcpy(zip_dir + zip_dir_offset, path, pathlen);
diff --git a/attr.c b/attr.c
index cd54697..8f2ac6c 100644
--- a/attr.c
+++ b/attr.c
@@ -12,6 +12,7 @@
#include "exec_cmd.h"
#include "attr.h"
#include "dir.h"
+#include "utf8.h"
const char git_attr__true[] = "(builtin)true";
const char git_attr__false[] = "\0(builtin)false";
@@ -32,9 +33,12 @@ struct git_attr {
struct git_attr *next;
unsigned h;
int attr_nr;
+ int maybe_macro;
+ int maybe_real;
char name[FLEX_ARRAY];
};
static int attr_nr;
+static int cannot_trust_maybe_real;
static struct git_attr_check *check_all_attr;
static struct git_attr *(git_attr_hash[HASHSIZE]);
@@ -95,6 +99,8 @@ static struct git_attr *git_attr_internal(const char *name, int len)
a->h = hval;
a->next = git_attr_hash[pos];
a->attr_nr = attr_nr++;
+ a->maybe_macro = 0;
+ a->maybe_real = 0;
git_attr_hash[pos] = a;
REALLOC_ARRAY(check_all_attr, attr_nr);
@@ -244,9 +250,10 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
sizeof(*res) +
sizeof(struct attr_state) * num_attr +
(is_macro ? 0 : namelen + 1));
- if (is_macro)
+ if (is_macro) {
res->u.attr = git_attr_internal(name, namelen);
- else {
+ res->u.attr->maybe_macro = 1;
+ } else {
char *p = (char *)&(res->state[num_attr]);
memcpy(p, name, namelen);
res->u.pat.pattern = p;
@@ -266,6 +273,10 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
/* Second pass to fill the attr_states */
for (cp = states, i = 0; *cp; i++) {
cp = parse_attr(src, lineno, cp, &(res->state[i]));
+ if (!is_macro)
+ res->state[i].attr->maybe_real = 1;
+ if (res->state[i].attr->maybe_macro)
+ cannot_trust_maybe_real = 1;
}
return res;
@@ -369,8 +380,12 @@ static struct attr_stack *read_attr_from_file(const char *path, int macro_ok)
return NULL;
}
res = xcalloc(1, sizeof(*res));
- while (fgets(buf, sizeof(buf), fp))
- handle_attr_line(res, buf, path, ++lineno, macro_ok);
+ while (fgets(buf, sizeof(buf), fp)) {
+ char *bufp = buf;
+ if (!lineno)
+ skip_utf8_bom(&bufp, strlen(bufp));
+ handle_attr_line(res, bufp, path, ++lineno, macro_ok);
+ }
fclose(fp);
return res;
}
@@ -478,7 +493,6 @@ static int git_attr_system(void)
static void bootstrap_attr_stack(void)
{
struct attr_stack *elem;
- char *xdg_attributes_file;
if (attr_stack)
return;
@@ -497,10 +511,8 @@ static void bootstrap_attr_stack(void)
}
}
- if (!git_attributes_file) {
- home_config_paths(NULL, &xdg_attributes_file, "attributes");
- git_attributes_file = xdg_attributes_file;
- }
+ if (!git_attributes_file)
+ git_attributes_file = xdg_config_home("attributes");
if (git_attributes_file) {
elem = read_attr_from_file(git_attributes_file, 1);
if (elem) {
@@ -681,13 +693,14 @@ static int fill(const char *path, int pathlen, int basename_offset,
return rem;
}
-static int macroexpand_one(int attr_nr, int rem)
+static int macroexpand_one(int nr, int rem)
{
struct attr_stack *stk;
struct match_attr *a = NULL;
int i;
- if (check_all_attr[attr_nr].value != ATTR__TRUE)
+ if (check_all_attr[nr].value != ATTR__TRUE ||
+ !check_all_attr[nr].attr->maybe_macro)
return rem;
for (stk = attr_stack; !a && stk; stk = stk->prev)
@@ -695,7 +708,7 @@ static int macroexpand_one(int attr_nr, int rem)
struct match_attr *ma = stk->attrs[i];
if (!ma->is_macro)
continue;
- if (ma->u.attr->attr_nr == attr_nr)
+ if (ma->u.attr->attr_nr == nr)
a = ma;
}
@@ -706,10 +719,13 @@ static int macroexpand_one(int attr_nr, int rem)
}
/*
- * Collect all attributes for path into the array pointed to by
- * check_all_attr.
+ * Collect attributes for path into the array pointed to by
+ * check_all_attr. If num is non-zero, only attributes in check[] are
+ * collected. Otherwise all attributes are collected.
*/
-static void collect_all_attrs(const char *path)
+static void collect_some_attrs(const char *path, int num,
+ struct git_attr_check *check)
+
{
struct attr_stack *stk;
int i, pathlen, rem, dirlen;
@@ -732,6 +748,19 @@ static void collect_all_attrs(const char *path)
prepare_attr_stack(path, dirlen);
for (i = 0; i < attr_nr; i++)
check_all_attr[i].value = ATTR__UNKNOWN;
+ if (num && !cannot_trust_maybe_real) {
+ rem = 0;
+ for (i = 0; i < num; i++) {
+ if (!check[i].attr->maybe_real) {
+ struct git_attr_check *c;
+ c = check_all_attr + check[i].attr->attr_nr;
+ c->value = ATTR__UNSET;
+ rem++;
+ }
+ }
+ if (rem == num)
+ return;
+ }
rem = attr_nr;
for (stk = attr_stack; 0 < rem && stk; stk = stk->prev)
@@ -742,7 +771,7 @@ int git_check_attr(const char *path, int num, struct git_attr_check *check)
{
int i;
- collect_all_attrs(path);
+ collect_some_attrs(path, num, check);
for (i = 0; i < num; i++) {
const char *value = check_all_attr[check[i].attr->attr_nr].value;
@@ -758,7 +787,7 @@ int git_all_attrs(const char *path, int *num, struct git_attr_check **check)
{
int i, count, j;
- collect_all_attrs(path);
+ collect_some_attrs(path, 0, NULL);
/* Count the number of attributes that are set. */
count = 0;
diff --git a/branch.c b/branch.c
index 4bab55a..b002435 100644
--- a/branch.c
+++ b/branch.c
@@ -284,8 +284,9 @@ void create_branch(const char *head,
transaction = ref_transaction_begin(&err);
if (!transaction ||
- ref_transaction_update(transaction, ref.buf, sha1,
- null_sha1, 0, !forcing, msg, &err) ||
+ ref_transaction_update(transaction, ref.buf,
+ sha1, forcing ? NULL : null_sha1,
+ 0, msg, &err) ||
ref_transaction_commit(transaction, &err))
die("%s", err.buf);
ref_transaction_free(transaction);
diff --git a/builtin/add.c b/builtin/add.c
index 3390933..4bd98b7 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -208,7 +208,8 @@ static int edit_patch(int argc, const char **argv, const char *prefix)
if (run_diff_files(&rev, 0))
die(_("Could not write patch"));
- launch_editor(file, NULL, NULL);
+ if (launch_editor(file, NULL, NULL))
+ die(_("editing patch failed"));
if (stat(file, &st))
die_errno(_("Could not stat '%s'"), file);
diff --git a/builtin/apply.c b/builtin/apply.c
index 23bda96..0769b09 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -51,6 +51,7 @@ static int apply_verbosely;
static int allow_overlap;
static int no_add;
static int threeway;
+static int unsafe_paths;
static const char *fake_ancestor;
static int line_termination = '\n';
static unsigned int p_context = UINT_MAX;
@@ -1600,6 +1601,9 @@ static int parse_fragment(const char *line, unsigned long size,
if (!deleted && !added)
leading++;
trailing++;
+ if (!apply_in_reverse &&
+ ws_error_action == correct_ws_error)
+ check_whitespace(line, len, patch->ws_rule);
break;
case '-':
if (apply_in_reverse &&
@@ -2230,6 +2234,12 @@ static void update_pre_post_images(struct image *preimage,
ctx++;
}
+ if (postlen
+ ? postlen < new - postimage->buf
+ : postimage->len < new - postimage->buf)
+ die("BUG: caller miscounted postlen: asked %d, orig = %d, used = %d",
+ (int)postlen, (int) postimage->len, (int)(new - postimage->buf));
+
/* Fix the length of the whole thing */
postimage->len = new - postimage->buf;
postimage->nr -= reduced;
@@ -2385,10 +2395,27 @@ static int match_fragment(struct image *img,
/*
* The hunk does not apply byte-by-byte, but the hash says
- * it might with whitespace fuzz. We haven't been asked to
+ * it might with whitespace fuzz. We weren't asked to
* ignore whitespace, we were asked to correct whitespace
* errors, so let's try matching after whitespace correction.
*
+ * While checking the preimage against the target, whitespace
+ * errors in both fixed, we count how large the corresponding
+ * postimage needs to be. The postimage prepared by
+ * apply_one_fragment() has whitespace errors fixed on added
+ * lines already, but the common lines were propagated as-is,
+ * which may become longer when their whitespace errors are
+ * fixed.
+ */
+
+ /* First count added lines in postimage */
+ postlen = 0;
+ for (i = 0; i < postimage->nr; i++) {
+ if (!(postimage->line[i].flag & LINE_COMMON))
+ postlen += postimage->line[i].len;
+ }
+
+ /*
* The preimage may extend beyond the end of the file,
* but in this loop we will only handle the part of the
* preimage that falls within the file.
@@ -2396,7 +2423,6 @@ static int match_fragment(struct image *img,
strbuf_init(&fixed, preimage->len + 1);
orig = preimage->buf;
target = img->buf + try;
- postlen = 0;
for (i = 0; i < preimage_limit; i++) {
size_t oldlen = preimage->line[i].len;
size_t tgtlen = img->line[try_lno + i].len;
@@ -2424,7 +2450,10 @@ static int match_fragment(struct image *img,
match = (tgtfix.len == fixed.len - fixstart &&
!memcmp(tgtfix.buf, fixed.buf + fixstart,
fixed.len - fixstart));
- postlen += tgtfix.len;
+
+ /* Add the length if this is common with the postimage */
+ if (preimage->line[i].flag & LINE_COMMON)
+ postlen += tgtfix.len;
strbuf_release(&tgtfix);
if (!match)
@@ -2747,7 +2776,8 @@ static int apply_one_fragment(struct image *img, struct fragment *frag,
default:
if (apply_verbosely)
error(_("invalid start of line: '%c'"), first);
- return -1;
+ applied_pos = -1;
+ goto out;
}
if (added_blank_line) {
if (!new_blank_lines_at_end)
@@ -2886,6 +2916,7 @@ static int apply_one_fragment(struct image *img, struct fragment *frag,
(int)(old - oldlines), oldlines);
}
+out:
free(oldlines);
strbuf_release(&newlines);
free(preimage.line_allocated);
@@ -3196,7 +3227,7 @@ static int load_patch_target(struct strbuf *buf,
const char *name,
unsigned expected_mode)
{
- if (cached) {
+ if (cached || check_index) {
if (read_file_or_gitlink(ce, buf))
return error(_("read of %s failed"), name);
} else if (name) {
@@ -3205,6 +3236,8 @@ static int load_patch_target(struct strbuf *buf,
return read_file_or_gitlink(ce, buf);
else
return SUBMODULE_PATCH_WITHOUT_INDEX;
+ } else if (has_symlink_leading_path(name, strlen(name))) {
+ return error(_("reading from '%s' beyond a symbolic link"), name);
} else {
if (read_old_data(st, name, buf))
return error(_("read of %s failed"), name);
@@ -3545,6 +3578,121 @@ static int check_to_create(const char *new_name, int ok_if_exists)
}
/*
+ * We need to keep track of how symlinks in the preimage are
+ * manipulated by the patches. A patch to add a/b/c where a/b
+ * is a symlink should not be allowed to affect the directory
+ * the symlink points at, but if the same patch removes a/b,
+ * it is perfectly fine, as the patch removes a/b to make room
+ * to create a directory a/b so that a/b/c can be created.
+ */
+static struct string_list symlink_changes;
+#define SYMLINK_GOES_AWAY 01
+#define SYMLINK_IN_RESULT 02
+
+static uintptr_t register_symlink_changes(const char *path, uintptr_t what)
+{
+ struct string_list_item *ent;
+
+ ent = string_list_lookup(&symlink_changes, path);
+ if (!ent) {
+ ent = string_list_insert(&symlink_changes, path);
+ ent->util = (void *)0;
+ }
+ ent->util = (void *)(what | ((uintptr_t)ent->util));
+ return (uintptr_t)ent->util;
+}
+
+static uintptr_t check_symlink_changes(const char *path)
+{
+ struct string_list_item *ent;
+
+ ent = string_list_lookup(&symlink_changes, path);
+ if (!ent)
+ return 0;
+ return (uintptr_t)ent->util;
+}
+
+static void prepare_symlink_changes(struct patch *patch)
+{
+ for ( ; patch; patch = patch->next) {
+ if ((patch->old_name && S_ISLNK(patch->old_mode)) &&
+ (patch->is_rename || patch->is_delete))
+ /* the symlink at patch->old_name is removed */
+ register_symlink_changes(patch->old_name, SYMLINK_GOES_AWAY);
+
+ if (patch->new_name && S_ISLNK(patch->new_mode))
+ /* the symlink at patch->new_name is created or remains */
+ register_symlink_changes(patch->new_name, SYMLINK_IN_RESULT);
+ }
+}
+
+static int path_is_beyond_symlink_1(struct strbuf *name)
+{
+ do {
+ unsigned int change;
+
+ while (--name->len && name->buf[name->len] != '/')
+ ; /* scan backwards */
+ if (!name->len)
+ break;
+ name->buf[name->len] = '\0';
+ change = check_symlink_changes(name->buf);
+ if (change & SYMLINK_IN_RESULT)
+ return 1;
+ if (change & SYMLINK_GOES_AWAY)
+ /*
+ * This cannot be "return 0", because we may
+ * see a new one created at a higher level.
+ */
+ continue;
+
+ /* otherwise, check the preimage */
+ if (check_index) {
+ struct cache_entry *ce;
+
+ ce = cache_file_exists(name->buf, name->len, ignore_case);
+ if (ce && S_ISLNK(ce->ce_mode))
+ return 1;
+ } else {
+ struct stat st;
+ if (!lstat(name->buf, &st) && S_ISLNK(st.st_mode))
+ return 1;
+ }
+ } while (1);
+ return 0;
+}
+
+static int path_is_beyond_symlink(const char *name_)
+{
+ int ret;
+ struct strbuf name = STRBUF_INIT;
+
+ assert(*name_ != '\0');
+ strbuf_addstr(&name, name_);
+ ret = path_is_beyond_symlink_1(&name);
+ strbuf_release(&name);
+
+ return ret;
+}
+
+static void die_on_unsafe_path(struct patch *patch)
+{
+ const char *old_name = NULL;
+ const char *new_name = NULL;
+ if (patch->is_delete)
+ old_name = patch->old_name;
+ else if (!patch->is_new && !patch->is_copy)
+ old_name = patch->old_name;
+ if (!patch->is_delete)
+ new_name = patch->new_name;
+
+ if (old_name && !verify_path(old_name))
+ die(_("invalid path '%s'"), old_name);
+ if (new_name && !verify_path(new_name))
+ die(_("invalid path '%s'"), new_name);
+}
+
+/*
* Check and apply the patch in-core; leave the result in patch->result
* for the caller to write it out to the final destination.
*/
@@ -3631,6 +3779,22 @@ static int check_patch(struct patch *patch)
}
}
+ if (!unsafe_paths)
+ die_on_unsafe_path(patch);
+
+ /*
+ * An attempt to read from or delete a path that is beyond a
+ * symbolic link will be prevented by load_patch_target() that
+ * is called at the beginning of apply_data() so we do not
+ * have to worry about a patch marked with "is_delete" bit
+ * here. We however need to make sure that the patch result
+ * is not deposited to a path that is beyond a symbolic link
+ * here.
+ */
+ if (!patch->is_delete && path_is_beyond_symlink(patch->new_name))
+ return error(_("affected file '%s' is beyond a symbolic link"),
+ patch->new_name);
+
if (apply_data(patch, &st, ce) < 0)
return error(_("%s: patch does not apply"), name);
patch->rejected = 0;
@@ -3641,6 +3805,7 @@ static int check_patch_list(struct patch *patch)
{
int err = 0;
+ prepare_symlink_changes(patch);
prepare_fn_table(patch);
while (patch) {
if (apply_verbosely)
@@ -4379,6 +4544,8 @@ int cmd_apply(int argc, const char **argv, const char *prefix_)
N_("make sure the patch is applicable to the current index")),
OPT_BOOL(0, "cached", &cached,
N_("apply a patch without touching the working tree")),
+ OPT_BOOL(0, "unsafe-paths", &unsafe_paths,
+ N_("accept a patch that touches outside the working area")),
OPT_BOOL(0, "apply", &force_apply,
N_("also apply the patch (use with --stat/--summary/--check)")),
OPT_BOOL('3', "3way", &threeway,
@@ -4451,6 +4618,9 @@ int cmd_apply(int argc, const char **argv, const char *prefix_)
die(_("--cached outside a repository"));
check_index = 1;
}
+ if (check_index)
+ unsafe_paths = 0;
+
for (i = 0; i < argc; i++) {
const char *arg = argv[i];
int fd;
diff --git a/builtin/blame.c b/builtin/blame.c
index 5710dcb..b3e948e 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -26,6 +26,7 @@
#include "userdiff.h"
#include "line-range.h"
#include "line-log.h"
+#include "dir.h"
static char blame_usage[] = N_("git blame [<options>] [<rev-opts>] [<rev>] [--] <file>");
@@ -2085,7 +2086,6 @@ static void find_alignment(struct scoreboard *sb, int *option)
for (e = sb->ent; e; e = e->next) {
struct origin *suspect = e->suspect;
- struct commit_info ci;
int num;
if (compute_auto_abbrev)
@@ -2096,6 +2096,7 @@ static void find_alignment(struct scoreboard *sb, int *option)
if (longest_file < num)
longest_file = num;
if (!(suspect->commit->object.flags & METAINFO_SHOWN)) {
+ struct commit_info ci;
suspect->commit->object.flags |= METAINFO_SHOWN;
get_commit_info(suspect->commit, &ci, 1);
if (*option & OUTPUT_SHOW_EMAIL)
@@ -2104,6 +2105,7 @@ static void find_alignment(struct scoreboard *sb, int *option)
num = utf8_strwidth(ci.author.buf);
if (longest_author < num)
longest_author = num;
+ commit_info_destroy(&ci);
}
num = e->s_lno + e->num_lines;
if (longest_src_lines < num)
@@ -2113,8 +2115,6 @@ static void find_alignment(struct scoreboard *sb, int *option)
longest_dst_lines = num;
if (largest_score < ent_score(sb, e))
largest_score = ent_score(sb, e);
-
- commit_info_destroy(&ci);
}
max_orig_digits = decimal_width(longest_src_lines);
max_digits = decimal_width(longest_dst_lines);
@@ -2152,16 +2152,6 @@ static void sanity_check_refcnt(struct scoreboard *sb)
}
}
-/*
- * Used for the command line parsing; check if the path exists
- * in the working tree.
- */
-static int has_string_in_work_tree(const char *path)
-{
- struct stat st;
- return !lstat(path, &st);
-}
-
static unsigned parse_score(const char *arg)
{
char *end;
@@ -2349,6 +2339,7 @@ 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);
@@ -2656,14 +2647,14 @@ parse_done:
if (argc < 2)
usage_with_options(blame_opt_usage, options);
path = add_prefix(prefix, argv[argc - 1]);
- if (argc == 3 && !has_string_in_work_tree(path)) { /* (2b) */
+ if (argc == 3 && !file_exists(path)) { /* (2b) */
path = add_prefix(prefix, argv[1]);
argv[1] = argv[2];
}
argv[argc - 1] = "--";
setup_work_tree();
- if (!has_string_in_work_tree(path))
+ if (!file_exists(path))
die_errno("cannot stat path '%s'", path);
}
diff --git a/builtin/branch.c b/builtin/branch.c
index 6a25957..a0a03fc 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -242,7 +242,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
sha1, &flags);
if (!target) {
error(remote_branch
- ? _("remote branch '%s' not found.")
+ ? _("remote-tracking branch '%s' not found.")
: _("branch '%s' not found."), bname.buf);
ret = 1;
continue;
@@ -257,7 +257,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
if (delete_ref(name, sha1, REF_NODEREF)) {
error(remote_branch
- ? _("Error deleting remote branch '%s'")
+ ? _("Error deleting remote-tracking branch '%s'")
: _("Error deleting branch '%s'"),
bname.buf);
ret = 1;
@@ -265,7 +265,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
}
if (!quiet) {
printf(remote_branch
- ? _("Deleted remote branch %s (was %s).\n")
+ ? _("Deleted remote-tracking branch %s (was %s).\n")
: _("Deleted branch %s (was %s).\n"),
bname.buf,
(flags & REF_ISBROKEN) ? "broken"
@@ -589,9 +589,16 @@ static char *get_head_description(void)
else if (state.bisect_in_progress)
strbuf_addf(&desc, _("(no branch, bisect started on %s)"),
state.branch);
- else if (state.detached_from)
- strbuf_addf(&desc, _("(detached from %s)"),
- state.detached_from);
+ else if (state.detached_from) {
+ /* TRANSLATORS: make sure these match _("HEAD detached at ")
+ and _("HEAD detached from ") in wt-status.c */
+ if (state.detached_at)
+ strbuf_addf(&desc, _("(HEAD detached at %s)"),
+ state.detached_from);
+ else
+ strbuf_addf(&desc, _("(HEAD detached from %s)"),
+ state.detached_from);
+ }
else
strbuf_addstr(&desc, _("(no branch)"));
free(state.branch);
diff --git a/builtin/bundle.c b/builtin/bundle.c
index 92a8a60..4883a43 100644
--- a/builtin/bundle.c
+++ b/builtin/bundle.c
@@ -42,6 +42,10 @@ int cmd_bundle(int argc, const char **argv, const char *prefix)
if (!strcmp(cmd, "verify")) {
close(bundle_fd);
+ if (argc != 1) {
+ usage(builtin_bundle_usage);
+ return 1;
+ }
if (verify_bundle(&header, 1))
return 1;
fprintf(stderr, _("%s is okay\n"), bundle_file);
@@ -52,6 +56,10 @@ int cmd_bundle(int argc, const char **argv, const char *prefix)
return !!list_bundle_refs(&header, argc, argv);
}
if (!strcmp(cmd, "create")) {
+ if (argc < 2) {
+ usage(builtin_bundle_usage);
+ return 1;
+ }
if (!startup_info->have_repository)
die(_("Need a repository to create a bundle."));
return !!create_bundle(&header, bundle_file, argc, argv);
diff --git a/builtin/clean.c b/builtin/clean.c
index 7e7fdcf..6dcb72e 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -314,7 +314,6 @@ static void print_highlight_menu_stuff(struct menu_stuff *stuff, int **chosen)
{
struct string_list menu_list = STRING_LIST_INIT_DUP;
struct strbuf menu = STRBUF_INIT;
- struct strbuf buf = STRBUF_INIT;
struct menu_item *menu_item;
struct string_list_item *string_list_item;
int i;
@@ -363,7 +362,6 @@ static void print_highlight_menu_stuff(struct menu_stuff *stuff, int **chosen)
pretty_print_menus(&menu_list);
strbuf_release(&menu);
- strbuf_release(&buf);
string_list_clear(&menu_list, 0);
}
@@ -754,7 +752,8 @@ static int ask_each_cmd(void)
/* Ctrl-D should stop removing files */
if (!eof) {
qname = quote_path_relative(item->string, NULL, &buf);
- printf(_("remove %s? "), qname);
+ /* TRANSLATORS: Make sure to keep [y/N] as is */
+ printf(_("Remove %s [y/N]? "), qname);
if (strbuf_getline(&confirm, stdin, '\n') != EOF) {
strbuf_trim(&confirm);
} else {
@@ -940,15 +939,15 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
if (!cache_name_is_other(ent->name, ent->len))
continue;
- if (lstat(ent->name, &st))
- die_errno("Cannot lstat '%s'", ent->name);
-
if (pathspec.nr)
matches = dir_path_match(ent, &pathspec, 0, NULL);
if (pathspec.nr && !matches)
continue;
+ if (lstat(ent->name, &st))
+ die_errno("Cannot lstat '%s'", ent->name);
+
if (S_ISDIR(st.st_mode) && !remove_directories &&
matches != MATCHED_EXACTLY)
continue;
diff --git a/builtin/clone.c b/builtin/clone.c
index 9572467..13030ee 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -842,20 +842,21 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
git_dir = mkpathdup("%s/.git", dir);
}
+ atexit(remove_junk);
+ sigchain_push_common(remove_junk_on_signal);
+
if (!option_bare) {
- junk_work_tree = work_tree;
if (safe_create_leading_directories_const(work_tree) < 0)
die_errno(_("could not create leading directories of '%s'"),
work_tree);
if (!dest_exists && mkdir(work_tree, 0777))
- die_errno(_("could not create work tree dir '%s'."),
+ die_errno(_("could not create work tree dir '%s'"),
work_tree);
+ junk_work_tree = work_tree;
set_git_work_tree(work_tree);
}
- junk_git_dir = git_dir;
- atexit(remove_junk);
- sigchain_push_common(remove_junk_on_signal);
+ junk_git_dir = git_dir;
if (safe_create_leading_directories_const(git_dir) < 0)
die(_("could not create leading directories of '%s'"), git_dir);
@@ -905,6 +906,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
remote = remote_get(option_origin);
transport = transport_get(remote, remote->url[0]);
+ transport_set_verbosity(transport, option_verbosity, option_progress);
+
path = get_repo_path(remote->url[0], &is_bundle);
is_local = option_local != 0 && path && !is_bundle;
if (is_local) {
@@ -931,8 +934,6 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
if (option_single_branch)
transport_set_option(transport, TRANS_OPT_FOLLOWTAGS, "1");
- transport_set_verbosity(transport, option_verbosity, option_progress);
-
if (option_upload_pack)
transport_set_option(transport, TRANS_OPT_UPLOADPACK,
option_upload_pack);
diff --git a/builtin/commit.c b/builtin/commit.c
index 7f46713..c2ebea4 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -229,7 +229,7 @@ static int commit_index_files(void)
static int list_paths(struct string_list *list, const char *with_tree,
const char *prefix, const struct pathspec *pattern)
{
- int i;
+ int i, ret;
char *m;
if (!pattern->nr)
@@ -256,7 +256,9 @@ static int list_paths(struct string_list *list, const char *with_tree,
item->util = item; /* better a valid pointer than a fake one */
}
- return report_path_error(m, pattern, prefix);
+ ret = report_path_error(m, pattern, prefix);
+ free(m);
+ return ret;
}
static void add_remove_files(struct string_list *list)
@@ -1050,7 +1052,7 @@ static const char *find_author_by_nickname(const char *name)
clear_mailmap(&mailmap);
return strbuf_detach(&buf, NULL);
}
- die(_("No existing author found with '%s'"), name);
+ die(_("--author '%s' is not 'Name <email>' and matches no existing author"), name);
}
@@ -1396,12 +1398,10 @@ int cmd_status(int argc, const char **argv, const char *prefix)
static const char *implicit_ident_advice(void)
{
- char *user_config = NULL;
- char *xdg_config = NULL;
- int config_exists;
+ char *user_config = expand_user_path("~/.gitconfig");
+ char *xdg_config = xdg_config_home("config");
+ int config_exists = file_exists(user_config) || file_exists(xdg_config);
- home_config_paths(&user_config, &xdg_config, "config");
- config_exists = file_exists(user_config) || file_exists(xdg_config);
free(user_config);
free(xdg_config);
@@ -1766,8 +1766,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
if (!transaction ||
ref_transaction_update(transaction, "HEAD", sha1,
current_head
- ? current_head->object.sha1 : NULL,
- 0, !!current_head, sb.buf, &err) ||
+ ? current_head->object.sha1 : null_sha1,
+ 0, sb.buf, &err) ||
ref_transaction_commit(transaction, &err)) {
rollback_index_files();
die("%s", err.buf);
diff --git a/builtin/config.c b/builtin/config.c
index d32c532..a58f99c 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -455,9 +455,9 @@ static char *default_user_config(void)
struct strbuf buf = STRBUF_INIT;
strbuf_addf(&buf,
_("# This is Git's per-user configuration file.\n"
- "[core]\n"
+ "[user]\n"
"# Please adapt and uncomment the following lines:\n"
- "# user = %s\n"
+ "# name = %s\n"
"# email = %s\n"),
ident_default_name(),
ident_default_email());
@@ -488,10 +488,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
}
if (use_global_config) {
- char *user_config = NULL;
- char *xdg_config = NULL;
-
- home_config_paths(&user_config, &xdg_config, "config");
+ char *user_config = expand_user_path("~/.gitconfig");
+ char *xdg_config = xdg_config_home("config");
if (!user_config)
/*
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 7b84d35..f951265 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -11,7 +11,6 @@
#include "run-command.h"
#include "parse-options.h"
#include "sigchain.h"
-#include "transport.h"
#include "submodule.h"
#include "connected.h"
#include "argv-array.h"
@@ -416,8 +415,10 @@ static int s_update_ref(const char *action,
transaction = ref_transaction_begin(&err);
if (!transaction ||
- ref_transaction_update(transaction, ref->name, ref->new_sha1,
- ref->old_sha1, 0, check_old, msg, &err))
+ ref_transaction_update(transaction, ref->name,
+ ref->new_sha1,
+ check_old ? ref->old_sha1 : NULL,
+ 0, msg, &err))
goto fail;
ret = ref_transaction_commit(transaction, &err);
diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c
index 1d962dc..05f4c26 100644
--- a/builtin/fmt-merge-msg.c
+++ b/builtin/fmt-merge-msg.c
@@ -223,16 +223,14 @@ static void add_branch_desc(struct strbuf *out, const char *name)
#define util_as_integral(elem) ((intptr_t)((elem)->util))
-static void record_person(int which, struct string_list *people,
- struct commit *commit)
+static void record_person_from_buf(int which, struct string_list *people,
+ const char *buffer)
{
- const char *buffer;
char *name_buf, *name, *name_end;
struct string_list_item *elem;
const char *field;
field = (which == 'a') ? "\nauthor " : "\ncommitter ";
- buffer = get_commit_buffer(commit, NULL);
name = strstr(buffer, field);
if (!name)
return;
@@ -245,7 +243,6 @@ 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) {
@@ -256,6 +253,15 @@ static void record_person(int which, struct string_list *people,
free(name_buf);
}
+
+static void record_person(int which, struct string_list *people,
+ struct commit *commit)
+{
+ const char *buffer = get_commit_buffer(commit, NULL);
+ record_person_from_buf(which, people, buffer);
+ unuse_commit_buffer(commit, buffer);
+}
+
static int cmp_string_list_util_as_integral(const void *a_, const void *b_)
{
const struct string_list_item *a = a_, *b = b_;
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 19be78a..83f9cf9 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -178,11 +178,10 @@ static const char *find_next(const char *cp)
static int verify_format(const char *format)
{
const char *cp, *sp;
- static const char color_reset[] = "color:reset";
need_color_reset_at_eol = 0;
for (cp = format; *cp && (sp = find_next(cp)); ) {
- const char *ep = strchr(sp, ')');
+ const char *color, *ep = strchr(sp, ')');
int at;
if (!ep)
@@ -191,8 +190,8 @@ static int verify_format(const char *format)
at = parse_atom(sp + 2, ep);
cp = ep + 1;
- if (starts_with(used_atom[at], "color:"))
- need_color_reset_at_eol = !!strcmp(used_atom[at], color_reset);
+ if (skip_prefix(used_atom[at], "color:", &color))
+ need_color_reset_at_eol = !!strcmp(color, "reset");
}
return 0;
}
diff --git a/builtin/grep.c b/builtin/grep.c
index 9262b73..d04f440 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -641,7 +641,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
OPT_BOOL(0, "untracked", &untracked,
N_("search in both tracked and untracked files")),
OPT_SET_INT(0, "exclude-standard", &opt_exclude,
- N_("search also in ignored files"), 1),
+ N_("ignore files specified via '.gitignore'"), 1),
OPT_GROUP(""),
OPT_BOOL('v', "invert-match", &opt.invert,
N_("show non-matching lines")),
@@ -738,7 +738,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
PARSE_OPT_OPTARG, NULL, (intptr_t)default_pager },
OPT_BOOL(0, "ext-grep", &external_grep_allowed__ignored,
N_("allow calling of grep(1) (ignored by this build)")),
- { OPTION_CALLBACK, 0, "help-all", &options, NULL, N_("show usage"),
+ { OPTION_CALLBACK, 0, "help-all", NULL, NULL, N_("show usage"),
PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, help_callback },
OPT_END()
};
@@ -885,7 +885,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
}
}
- if (!show_in_pager)
+ if (!show_in_pager && !opt.status_only)
setup_pager();
if (!use_index && (untracked || cached))
diff --git a/builtin/hash-object.c b/builtin/hash-object.c
index 207b90c..07fef3c 100644
--- a/builtin/hash-object.c
+++ b/builtin/hash-object.c
@@ -22,10 +22,8 @@ static int hash_literally(unsigned char *sha1, int fd, const char *type, unsigne
if (strbuf_read(&buf, fd, 4096) < 0)
ret = -1;
- else if (flags & HASH_WRITE_OBJECT)
- ret = write_sha1_file(buf.buf, buf.len, type, sha1);
else
- ret = hash_sha1_file(buf.buf, buf.len, type, sha1);
+ ret = hash_sha1_file_literally(buf.buf, buf.len, type, sha1, flags);
strbuf_release(&buf);
return ret;
}
diff --git a/builtin/help.c b/builtin/help.c
index 6133fe4..3422e73 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -171,7 +171,7 @@ static void exec_man_cmd(const char *cmd, const char *page)
{
struct strbuf shell_cmd = STRBUF_INIT;
strbuf_addf(&shell_cmd, "%s %s", cmd, page);
- execl("/bin/sh", "sh", "-c", shell_cmd.buf, (char *)NULL);
+ execl(SHELL_PATH, SHELL_PATH, "-c", shell_cmd.buf, (char *)NULL);
warning(_("failed to exec '%s': %s"), cmd, strerror(errno));
}
@@ -456,7 +456,7 @@ static void list_common_guides_help(void)
int cmd_help(int argc, const char **argv, const char *prefix)
{
int nongit;
- const char *alias;
+ char *alias;
enum help_format parsed_help_format;
argc = parse_options(argc, argv, prefix, builtin_help_options,
@@ -499,6 +499,7 @@ int cmd_help(int argc, const char **argv, const char *prefix)
alias = alias_lookup(argv[0]);
if (alias && !is_git_command(argv[0])) {
printf_ln(_("`git %s' is aliased to `%s'"), argv[0], alias);
+ free(alias);
return 0;
}
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 4632117..cf654df 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -1204,7 +1204,6 @@ static int write_compressed(struct sha1file *f, void *in, unsigned int size)
int status;
unsigned char outbuf[4096];
- memset(&stream, 0, sizeof(stream));
git_deflate_init(&stream, zlib_compression_level);
stream.next_in = in;
stream.avail_in = size;
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 6723d39..ab9f86b 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -182,6 +182,20 @@ static int git_init_db_config(const char *k, const char *v, void *cb)
return 0;
}
+/*
+ * If the git_dir is not directly inside the working tree, then git will not
+ * find it by default, and we need to set the worktree explicitly.
+ */
+static int needs_work_tree_config(const char *git_dir, const char *work_tree)
+{
+ if (!strcmp(work_tree, "/") && !strcmp(git_dir, "/.git"))
+ return 0;
+ if (skip_prefix(git_dir, work_tree, &git_dir) &&
+ !strcmp(git_dir, "/.git"))
+ return 0;
+ return 1;
+}
+
static int create_default_files(const char *template_path)
{
const char *git_dir = get_git_dir();
@@ -274,10 +288,8 @@ static int create_default_files(const char *template_path)
/* allow template config file to override the default */
if (log_all_ref_updates == -1)
git_config_set("core.logallrefupdates", "true");
- if (!starts_with(git_dir, work_tree) ||
- strcmp(git_dir + strlen(work_tree), "/.git")) {
+ if (needs_work_tree_config(git_dir, work_tree))
git_config_set("core.worktree", work_tree);
- }
}
if (!reinit) {
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 914054d..6fa2205 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -354,49 +354,6 @@ void overlay_tree_on_cache(const char *tree_name, const char *prefix)
}
}
-int report_path_error(const char *ps_matched,
- const struct pathspec *pathspec,
- const char *prefix)
-{
- /*
- * Make sure all pathspec matched; otherwise it is an error.
- */
- struct strbuf sb = STRBUF_INIT;
- int num, errors = 0;
- for (num = 0; num < pathspec->nr; num++) {
- int other, found_dup;
-
- if (ps_matched[num])
- continue;
- /*
- * The caller might have fed identical pathspec
- * twice. Do not barf on such a mistake.
- * FIXME: parse_pathspec should have eliminated
- * duplicate pathspec.
- */
- for (found_dup = other = 0;
- !found_dup && other < pathspec->nr;
- other++) {
- if (other == num || !ps_matched[other])
- continue;
- if (!strcmp(pathspec->items[other].original,
- pathspec->items[num].original))
- /*
- * Ok, we have a match already.
- */
- found_dup = 1;
- }
- if (found_dup)
- continue;
-
- error("pathspec '%s' did not match any file(s) known to git.",
- pathspec->items[num].original);
- errors++;
- }
- strbuf_release(&sb);
- return errors;
-}
-
static const char * const ls_files_usage[] = {
N_("git ls-files [<options>] [<file>...]"),
NULL
diff --git a/builtin/merge-file.c b/builtin/merge-file.c
index 131edc2..ea8093f 100644
--- a/builtin/merge-file.c
+++ b/builtin/merge-file.c
@@ -90,7 +90,8 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix)
if (ret >= 0) {
const char *filename = argv[0];
- FILE *f = to_stdout ? stdout : fopen(filename, "wb");
+ const char *fpath = prefix_filename(prefix, prefixlen, argv[0]);
+ FILE *f = to_stdout ? stdout : fopen(fpath, "wb");
if (!f)
ret = error("Could not open %s for writing", filename);
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index d816587..c067107 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -125,7 +125,6 @@ static unsigned long do_compress(void **pptr, unsigned long size)
void *in, *out;
unsigned long maxsize;
- memset(&stream, 0, sizeof(stream));
git_deflate_init(&stream, pack_compression_level);
maxsize = git_deflate_bound(&stream, size);
@@ -153,7 +152,6 @@ static unsigned long write_large_blob_data(struct git_istream *st, struct sha1fi
unsigned char obuf[1024 * 16];
unsigned long olen = 0;
- memset(&stream, 0, sizeof(stream));
git_deflate_init(&stream, pack_compression_level);
for (;;) {
@@ -963,10 +961,8 @@ static int want_object_in_pack(const unsigned char *sha1,
off_t offset = find_pack_entry_one(sha1, p);
if (offset) {
if (!*found_pack) {
- if (!is_pack_valid(p)) {
- warning("packfile %s cannot be accessed", p->pack_name);
+ if (!is_pack_valid(p))
continue;
- }
*found_offset = offset;
*found_pack = p;
}
diff --git a/builtin/prune.c b/builtin/prune.c
index 04d3b12..17094ad 100644
--- a/builtin/prune.c
+++ b/builtin/prune.c
@@ -115,6 +115,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
expire = ULONG_MAX;
save_commit_buffer = 0;
check_replace_refs = 0;
+ ref_paranoia = 1;
init_revisions(&revs, prefix);
argc = parse_options(argc, argv, prefix, options, prune_usage, 0);
diff --git a/builtin/push.c b/builtin/push.c
index fc771a9..57c138b 100644
--- a/builtin/push.c
+++ b/builtin/push.c
@@ -473,13 +473,22 @@ static int option_parse_recurse_submodules(const struct option *opt,
static int git_push_config(const char *k, const char *v, void *cb)
{
- struct wt_status *s = cb;
+ int *flags = cb;
int status;
status = git_gpg_config(k, v, NULL);
if (status)
return status;
- return git_default_config(k, v, s);
+
+ if (!strcmp(k, "push.followtags")) {
+ if (git_config_bool(k, v))
+ *flags |= TRANSPORT_PUSH_FOLLOW_TAGS;
+ else
+ *flags &= ~TRANSPORT_PUSH_FOLLOW_TAGS;
+ return 0;
+ }
+
+ return git_default_config(k, v, NULL);
}
int cmd_push(int argc, const char **argv, const char *prefix)
@@ -487,7 +496,6 @@ int cmd_push(int argc, const char **argv, const char *prefix)
int flags = 0;
int tags = 0;
int rc;
- int atomic = 0;
const char *repo = NULL; /* default repository */
struct option options[] = {
OPT__VERBOSITY(&verbosity),
@@ -519,12 +527,12 @@ int cmd_push(int argc, const char **argv, const char *prefix)
OPT_BIT(0, "follow-tags", &flags, N_("push missing but relevant tags"),
TRANSPORT_PUSH_FOLLOW_TAGS),
OPT_BIT(0, "signed", &flags, N_("GPG sign the push"), TRANSPORT_PUSH_CERT),
- OPT_BOOL(0, "atomic", &atomic, N_("request atomic transaction on remote side")),
+ OPT_BIT(0, "atomic", &flags, N_("request atomic transaction on remote side"), TRANSPORT_PUSH_ATOMIC),
OPT_END()
};
packet_trace_identity("push");
- git_config(git_push_config, NULL);
+ git_config(git_push_config, &flags);
argc = parse_options(argc, argv, prefix, options, push_usage, 0);
if (deleterefs && (tags || (flags & (TRANSPORT_PUSH_ALL | TRANSPORT_PUSH_MIRROR))))
@@ -535,9 +543,6 @@ int cmd_push(int argc, const char **argv, const char *prefix)
if (tags)
add_refspec("refs/tags/*");
- if (atomic)
- flags |= TRANSPORT_PUSH_ATOMIC;
-
if (argc > 0) {
repo = argv[0];
set_refspecs(argv + 1, argc - 1, repo);
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index e0ce78e..5292bb5 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -743,6 +743,22 @@ static int update_shallow_ref(struct command *cmd, struct shallow_info *si)
return 0;
}
+/*
+ * NEEDSWORK: we should consolidate various implementions of "are we
+ * on an unborn branch?" test into one, and make the unified one more
+ * robust. !get_sha1() based check used here and elsewhere would not
+ * allow us to tell an unborn branch from corrupt ref, for example.
+ * For the purpose of fixing "deploy-to-update does not work when
+ * pushing into an empty repository" issue, this should suffice for
+ * now.
+ */
+static int head_has_history(void)
+{
+ unsigned char sha1[20];
+
+ return !get_sha1("HEAD", sha1);
+}
+
static const char *push_to_deploy(unsigned char *sha1,
struct argv_array *env,
const char *work_tree)
@@ -755,7 +771,7 @@ static const char *push_to_deploy(unsigned char *sha1,
};
const char *diff_index[] = {
"diff-index", "--quiet", "--cached", "--ignore-submodules",
- "HEAD", "--", NULL
+ NULL, "--", NULL
};
const char *read_tree[] = {
"read-tree", "-u", "-m", NULL, NULL
@@ -782,6 +798,9 @@ static const char *push_to_deploy(unsigned char *sha1,
if (run_command(&child))
return "Working directory has unstaged changes";
+ /* diff-index with either HEAD or an empty tree */
+ diff_index[4] = head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX;
+
child_process_init(&child);
child.argv = diff_index;
child.env = env->argv;
@@ -953,8 +972,7 @@ static const char *update(struct command *cmd, struct shallow_info *si)
if (ref_transaction_delete(transaction,
namespaced_name,
old_sha1,
- 0, old_sha1 != NULL,
- "push", &err)) {
+ 0, "push", &err)) {
rp_error("%s", err.buf);
strbuf_release(&err);
return "failed to delete";
@@ -971,7 +989,7 @@ static const char *update(struct command *cmd, struct shallow_info *si)
if (ref_transaction_update(transaction,
namespaced_name,
new_sha1, old_sha1,
- 0, 1, "push",
+ 0, "push",
&err)) {
rp_error("%s", err.buf);
strbuf_release(&err);
diff --git a/builtin/reflog.c b/builtin/reflog.c
index 49c64f9..8182b64 100644
--- a/builtin/reflog.c
+++ b/builtin/reflog.c
@@ -8,14 +8,11 @@
#include "revision.h"
#include "reachable.h"
-/*
- * reflog expire
- */
-
+/* NEEDSWORK: switch to using parse_options */
static const char reflog_expire_usage[] =
-"git reflog expire [--verbose] [--dry-run] [--stale-fix] [--expire=<time>] [--expire-unreachable=<time>] [--all] <refs>...";
+"git reflog expire [--expire=<time>] [--expire-unreachable=<time>] [--rewrite] [--updateref] [--stale-fix] [--dry-run | -n] [--verbose] [--all] <refs>...";
static const char reflog_delete_usage[] =
-"git reflog delete [--verbose] [--dry-run] [--rewrite] [--updateref] <refs>...";
+"git reflog delete [--rewrite] [--updateref] [--dry-run | -n] [--verbose] <refs>...";
static unsigned long default_reflog_expire;
static unsigned long default_reflog_expire_unreachable;
diff --git a/builtin/repack.c b/builtin/repack.c
index 28fbc70..f2edeb0 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -228,13 +228,17 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
get_non_kept_pack_filenames(&existing_packs);
if (existing_packs.nr && delete_redundant) {
- if (unpack_unreachable)
+ if (unpack_unreachable) {
argv_array_pushf(&cmd.args,
"--unpack-unreachable=%s",
unpack_unreachable);
- else if (pack_everything & LOOSEN_UNREACHABLE)
+ argv_array_push(&cmd.env_array, "GIT_REF_PARANOIA=1");
+ } else if (pack_everything & LOOSEN_UNREACHABLE) {
argv_array_push(&cmd.args,
"--unpack-unreachable");
+ } else {
+ argv_array_push(&cmd.env_array, "GIT_REF_PARANOIA=1");
+ }
}
} else {
argv_array_push(&cmd.args, "--unpacked");
diff --git a/builtin/replace.c b/builtin/replace.c
index 85d39b5..54bf01a 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -172,7 +172,7 @@ static int replace_object_sha1(const char *object_ref,
transaction = ref_transaction_begin(&err);
if (!transaction ||
ref_transaction_update(transaction, ref, repl, prev,
- 0, 1, NULL, &err) ||
+ 0, NULL, &err) ||
ref_transaction_commit(transaction, &err))
die("%s", err.buf);
diff --git a/builtin/rm.c b/builtin/rm.c
index 3304bff..80b972f 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -84,7 +84,6 @@ static int check_submodules_use_gitfiles(void)
const char *name = list.entry[i].name;
int pos;
const struct cache_entry *ce;
- struct stat st;
pos = cache_name_pos(name, strlen(name));
if (pos < 0) {
@@ -95,7 +94,7 @@ static int check_submodules_use_gitfiles(void)
ce = active_cache[pos];
if (!S_ISGITLINK(ce->ce_mode) ||
- (lstat(ce->name, &st) < 0) ||
+ !file_exists(ce->name) ||
is_empty_dir(name))
continue;
diff --git a/builtin/tag.c b/builtin/tag.c
index 6dc85a9..6f07ac6 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -605,13 +605,13 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
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_GROUP(N_("Tag listing options")),
OPT_COLUMN(0, "column", &colopts, N_("show tag list in columns")),
{
OPTION_CALLBACK, 0, "sort", &tag_sort, N_("type"), N_("sort tags"),
PARSE_OPT_NONEG, parse_opt_sort
},
-
- OPT_GROUP(N_("Tag listing options")),
{
OPTION_CALLBACK, 0, "contains", &with_commit, N_("commit"),
N_("print only tags that contain the commit"),
@@ -733,7 +733,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
transaction = ref_transaction_begin(&err);
if (!transaction ||
ref_transaction_update(transaction, ref.buf, object, prev,
- 0, 1, NULL, &err) ||
+ 0, NULL, &err) ||
ref_transaction_commit(transaction, &err))
die("%s", err.buf);
ref_transaction_free(transaction);
diff --git a/builtin/update-index.c b/builtin/update-index.c
index 5878986..6271b54 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -584,6 +584,7 @@ static int do_reupdate(int ac, const char **av,
path = xstrdup(ce->name);
update_one(path);
free(path);
+ free(old);
if (save_nr != active_nr)
goto redo;
}
diff --git a/builtin/update-ref.c b/builtin/update-ref.c
index 2497ba4..3d79a46 100644
--- a/builtin/update-ref.c
+++ b/builtin/update-ref.c
@@ -198,8 +198,9 @@ static const char *parse_cmd_update(struct ref_transaction *transaction,
if (*next != line_termination)
die("update %s: extra input: %s", refname, next);
- if (ref_transaction_update(transaction, refname, new_sha1, old_sha1,
- update_flags, have_old, msg, &err))
+ if (ref_transaction_update(transaction, refname,
+ new_sha1, have_old ? old_sha1 : NULL,
+ update_flags, msg, &err))
die("%s", err.buf);
update_flags = 0;
@@ -264,8 +265,9 @@ static const char *parse_cmd_delete(struct ref_transaction *transaction,
if (*next != line_termination)
die("delete %s: extra input: %s", refname, next);
- if (ref_transaction_delete(transaction, refname, old_sha1,
- update_flags, have_old, msg, &err))
+ if (ref_transaction_delete(transaction, refname,
+ have_old ? old_sha1 : NULL,
+ update_flags, msg, &err))
die("%s", err.buf);
update_flags = 0;
@@ -280,7 +282,6 @@ static const char *parse_cmd_verify(struct ref_transaction *transaction,
{
struct strbuf err = STRBUF_INIT;
char *refname;
- unsigned char new_sha1[20];
unsigned char old_sha1[20];
refname = parse_refname(input, &next);
@@ -291,13 +292,11 @@ static const char *parse_cmd_verify(struct ref_transaction *transaction,
PARSE_SHA1_OLD))
hashclr(old_sha1);
- hashcpy(new_sha1, old_sha1);
-
if (*next != line_termination)
die("verify %s: extra input: %s", refname, next);
- if (ref_transaction_update(transaction, refname, new_sha1, old_sha1,
- update_flags, 1, msg, &err))
+ if (ref_transaction_verify(transaction, refname, old_sha1,
+ update_flags, &err))
die("%s", err.buf);
update_flags = 0;
@@ -353,7 +352,8 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
{
const char *refname, *oldval;
unsigned char sha1[20], oldsha1[20];
- int delete = 0, no_deref = 0, read_stdin = 0, end_null = 0, flags = 0;
+ int delete = 0, no_deref = 0, read_stdin = 0, end_null = 0;
+ unsigned int flags = 0;
struct option options[] = {
OPT_STRING( 'm', NULL, &msg, N_("reason"), N_("reason of the update")),
OPT_BOOL('d', NULL, &delete, N_("delete the reference")),
diff --git a/bulk-checkin.c b/bulk-checkin.c
index 0c4b8a7..8d157eb 100644
--- a/bulk-checkin.c
+++ b/bulk-checkin.c
@@ -105,7 +105,6 @@ static int stream_to_pack(struct bulk_checkin_state *state,
int write_object = (flags & HASH_WRITE_OBJECT);
off_t offset = 0;
- memset(&s, 0, sizeof(s));
git_deflate_init(&s, pack_compression_level);
hdrlen = encode_in_pack_object_header(type, size, obuf);
diff --git a/bundle.c b/bundle.c
index 2e2dbd5..f732c92 100644
--- a/bundle.c
+++ b/bundle.c
@@ -334,7 +334,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
if (e->item->flags & UNINTERESTING)
continue;
if (dwim_ref(e->name, strlen(e->name), sha1, &ref) != 1)
- continue;
+ goto skip_write_ref;
if (read_ref_full(e->name, RESOLVE_REF_READING, sha1, &flag))
flag = 0;
display_ref = (flag & REF_ISSYMREF) ? e->name : ref;
@@ -342,7 +342,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
if (e->item->type == OBJ_TAG &&
!is_tag_in_date_range(e->item, revs)) {
e->item->flags |= UNINTERESTING;
- continue;
+ goto skip_write_ref;
}
/*
@@ -357,8 +357,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
if (!(e->item->flags & SHOWN) && e->item->type == OBJ_COMMIT) {
warning(_("ref '%s' is excluded by the rev-list options"),
e->name);
- free(ref);
- continue;
+ goto skip_write_ref;
}
/*
* If you run "git bundle create bndl v1.0..v2.0", the
@@ -388,8 +387,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
obj->flags |= SHOWN;
add_pending_object(revs, obj, e->name);
}
- free(ref);
- continue;
+ goto skip_write_ref;
}
ref_count++;
@@ -397,6 +395,7 @@ static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
write_or_die(bundle_fd, " ", 1);
write_or_die(bundle_fd, display_ref, strlen(display_ref));
write_or_die(bundle_fd, "\n", 1);
+ skip_write_ref:
free(ref);
}
diff --git a/cache.h b/cache.h
index f704af5..badf3da 100644
--- a/cache.h
+++ b/cache.h
@@ -568,7 +568,7 @@ extern void update_index_if_able(struct index_state *, struct lock_file *);
extern int hold_locked_index(struct lock_file *, int);
extern void set_alternate_index_output(const char *);
-extern int delete_ref(const char *, const unsigned char *sha1, int delopt);
+extern int delete_ref(const char *, const unsigned char *sha1, unsigned int flags);
/* Environment bits from configuration mechanism */
extern int trust_executable_bit;
@@ -614,6 +614,14 @@ extern int protect_hfs;
extern int protect_ntfs;
/*
+ * Include broken refs in all ref iterations, which will
+ * generally choke dangerous operations rather than letting
+ * them silently proceed without taking the broken ref into
+ * account.
+ */
+extern int ref_paranoia;
+
+/*
* The character that begins a commented line in user-editable file
* that is subject to stripspace.
*/
@@ -808,7 +816,6 @@ enum scld_error safe_create_leading_directories(char *path);
enum scld_error safe_create_leading_directories_const(const char *path);
int mkdir_in_gitdir(const char *path);
-extern void home_config_paths(char **global, char **xdg, char *file);
extern char *expand_user_path(const char *path);
const char *enter_repo(const char *path, int strict);
static inline int is_absolute_path(const char *path)
@@ -828,6 +835,13 @@ char *strip_path_suffix(const char *path, const char *suffix);
int daemon_avoid_alias(const char *path);
extern int is_ntfs_dotgit(const char *name);
+/**
+ * Return a newly allocated string with the evaluation of
+ * "$XDG_CONFIG_HOME/git/$filename" if $XDG_CONFIG_HOME is non-empty, otherwise
+ * "$HOME/.config/git/$filename". Return NULL upon error.
+ */
+extern char *xdg_config_home(const char *filename);
+
/* object replacement */
#define LOOKUP_REPLACE_OBJECT 1
extern void *read_sha1_file_extended(const unsigned char *sha1, enum object_type *type, unsigned long *size, unsigned flag);
@@ -866,6 +880,7 @@ static inline const unsigned char *lookup_replace_object_extended(const unsigned
extern int sha1_object_info(const unsigned char *, unsigned long *);
extern int hash_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *sha1);
extern int write_sha1_file(const void *buf, unsigned long len, const char *type, unsigned char *return_sha1);
+extern int hash_sha1_file_literally(const void *buf, unsigned long len, const char *type, unsigned char *sha1, unsigned flags);
extern int pretend_sha1_file(void *, unsigned long, enum object_type, unsigned char *);
extern int force_object_loose(const unsigned char *sha1, time_t mtime);
extern int git_open_noatime(const char *name);
@@ -1166,6 +1181,7 @@ extern struct packed_git {
int pack_fd;
unsigned pack_local:1,
pack_keep:1,
+ freshened:1,
do_not_close:1;
unsigned char sha1[20];
/* something like ".git/objects/pack/xxxxx.pack" */
@@ -1254,6 +1270,10 @@ extern int unpack_object_header(struct packed_git *, struct pack_window **, off_
*
* Any callback that is NULL will be ignored. Callbacks returning non-zero
* will end the iteration.
+ *
+ * In the "buf" variant, "path" is a strbuf which will also be used as a
+ * scratch buffer, but restored to its original contents before
+ * the function returns.
*/
typedef int each_loose_object_fn(const unsigned char *sha1,
const char *path,
@@ -1269,17 +1289,24 @@ int for_each_loose_file_in_objdir(const char *path,
each_loose_cruft_fn cruft_cb,
each_loose_subdir_fn subdir_cb,
void *data);
+int for_each_loose_file_in_objdir_buf(struct strbuf *path,
+ each_loose_object_fn obj_cb,
+ each_loose_cruft_fn cruft_cb,
+ each_loose_subdir_fn subdir_cb,
+ void *data);
/*
* Iterate over loose and packed objects in both the local
- * repository and any alternates repositories.
+ * repository and any alternates repositories (unless the
+ * LOCAL_ONLY flag is set).
*/
+#define FOR_EACH_OBJECT_LOCAL_ONLY 0x1
typedef int each_packed_object_fn(const unsigned char *sha1,
struct packed_git *pack,
uint32_t pos,
void *data);
-extern int for_each_loose_object(each_loose_object_fn, void *);
-extern int for_each_packed_object(each_packed_object_fn, void *);
+extern int for_each_loose_object(each_loose_object_fn, void *, unsigned flags);
+extern int for_each_packed_object(each_packed_object_fn, void *, unsigned flags);
struct object_info {
/* Request */
@@ -1498,7 +1525,7 @@ extern const char *pager_program;
extern int pager_in_use(void);
extern int pager_use_color;
extern int term_columns(void);
-extern int decimal_width(int);
+extern int decimal_width(uintmax_t);
extern int check_pager_config(const char *cmd);
extern const char *editor_program;
@@ -1560,7 +1587,6 @@ extern int ws_blank_line(const char *line, int len, unsigned ws_rule);
#define ws_tab_width(rule) ((rule) & WS_TAB_WIDTH_MASK)
/* ls-files */
-int report_path_error(const char *ps_matched, const struct pathspec *pathspec, const char *prefix);
void overlay_tree_on_cache(const char *tree_name, const char *prefix);
char *alias_lookup(const char *alias);
diff --git a/check-builtins.sh b/check-builtins.sh
index 07cff69..a0aaf3a 100755
--- a/check-builtins.sh
+++ b/check-builtins.sh
@@ -3,7 +3,7 @@
{
cat <<\EOF
sayIt:
- $(foreach b,$(BUILT_INS),echo XXX $b YYY;)
+ $(foreach b,$(BUILT_INS),echo XXX $(b:$X=) YYY;)
EOF
cat Makefile
} |
diff --git a/config.c b/config.c
index e5e64dc..286907b 100644
--- a/config.c
+++ b/config.c
@@ -12,6 +12,7 @@
#include "quote.h"
#include "hashmap.h"
#include "string-list.h"
+#include "utf8.h"
struct config_source {
struct config_source *prev;
@@ -73,8 +74,12 @@ static int config_buf_fgetc(struct config_source *conf)
static int config_buf_ungetc(int c, struct config_source *conf)
{
- if (conf->u.buf.pos > 0)
- return conf->u.buf.buf[--conf->u.buf.pos];
+ if (conf->u.buf.pos > 0) {
+ conf->u.buf.pos--;
+ if (conf->u.buf.buf[conf->u.buf.pos] != c)
+ die("BUG: config_buf can only ungetc the same character");
+ return c;
+ }
return EOF;
}
@@ -235,7 +240,8 @@ static int get_next_char(void)
/* DOS like systems */
c = cf->do_fgetc(cf);
if (c != '\n') {
- cf->do_ungetc(c, cf);
+ if (c != EOF)
+ cf->do_ungetc(c, cf);
c = '\r';
}
}
@@ -412,8 +418,7 @@ static int git_parse_source(config_fn_t fn, void *data)
struct strbuf *var = &cf->var;
/* U+FEFF Byte Order Mark in UTF8 */
- static const unsigned char *utf8_bom = (unsigned char *) "\xef\xbb\xbf";
- const unsigned char *bomptr = utf8_bom;
+ const char *bomptr = utf8_bom;
for (;;) {
int c = get_next_char();
@@ -421,7 +426,7 @@ static int git_parse_source(config_fn_t fn, void *data)
/* We are at the file beginning; skip UTF8-encoded BOM
* if present. Sane editors won't put this in on their
* own, but e.g. Windows Notepad will do it happily. */
- if ((unsigned char) c == *bomptr) {
+ if (c == (*bomptr & 0377)) {
bomptr++;
continue;
} else {
@@ -1180,10 +1185,8 @@ int git_config_system(void)
int git_config_early(config_fn_t fn, void *data, const char *repo_config)
{
int ret = 0, found = 0;
- char *xdg_config = NULL;
- char *user_config = NULL;
-
- home_config_paths(&user_config, &xdg_config, "config");
+ char *xdg_config = xdg_config_home("config");
+ char *user_config = expand_user_path("~/.gitconfig");
if (git_config_system() && !access_or_die(git_etc_gitconfig(), R_OK, 0)) {
ret += git_config_from_file(fn, git_etc_gitconfig(),
diff --git a/config.mak.uname b/config.mak.uname
index b64b63c..f4e77cb 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -107,6 +107,7 @@ ifeq ($(uname_S),Darwin)
COMPAT_OBJS += compat/precompose_utf8.o
BASIC_CFLAGS += -DPRECOMPOSE_UNICODE
BASIC_CFLAGS += -DPROTECT_HFS_DEFAULT=1
+ HAVE_BSD_SYSCTL = YesPlease
endif
ifeq ($(uname_S),SunOS)
NEEDS_SOCKET = YesPlease
@@ -199,6 +200,7 @@ ifeq ($(uname_S),FreeBSD)
PYTHON_PATH = /usr/local/bin/python
HAVE_PATHS_H = YesPlease
GMTIME_UNRELIABLE_ERRORS = UnfortunatelyYes
+ HAVE_BSD_SYSCTL = YesPlease
endif
ifeq ($(uname_S),OpenBSD)
NO_STRCASESTR = YesPlease
@@ -208,6 +210,7 @@ ifeq ($(uname_S),OpenBSD)
BASIC_CFLAGS += -I/usr/local/include
BASIC_LDFLAGS += -L/usr/local/lib
HAVE_PATHS_H = YesPlease
+ HAVE_BSD_SYSCTL = YesPlease
endif
ifeq ($(uname_S),MirBSD)
NO_STRCASESTR = YesPlease
@@ -215,6 +218,7 @@ ifeq ($(uname_S),MirBSD)
USE_ST_TIMESPEC = YesPlease
NEEDS_LIBICONV = YesPlease
HAVE_PATHS_H = YesPlease
+ HAVE_BSD_SYSCTL = YesPlease
endif
ifeq ($(uname_S),NetBSD)
ifeq ($(shell expr "$(uname_R)" : '[01]\.'),2)
@@ -225,6 +229,7 @@ ifeq ($(uname_S),NetBSD)
USE_ST_TIMESPEC = YesPlease
NO_MKSTEMPS = YesPlease
HAVE_PATHS_H = YesPlease
+ HAVE_BSD_SYSCTL = YesPlease
endif
ifeq ($(uname_S),AIX)
DEFAULT_PAGER = more
diff --git a/configure.ac b/configure.ac
index 55e5a9b..bbdde85 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1046,6 +1046,29 @@ GIT_CONF_SUBST([NO_INITGROUPS])
#
# Define NO_ICONV if your libc does not properly support iconv.
+AC_DEFUN([BSD_SYSCTL_SRC], [
+AC_LANG_PROGRAM([[
+#include <stddef.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+]],[[
+int val, mib[2];
+size_t len;
+mib[0] = CTL_HW;
+mib[1] = 1;
+len = sizeof(val);
+return sysctl(mib, 2, &val, &len, NULL, 0) ? 1 : 0;
+]])])
+
+#
+# Define HAVE_BSD_SYSCTL=YesPlease if a BSD-compatible sysctl function is available.
+AC_MSG_CHECKING([for BSD sysctl])
+AC_COMPILE_IFELSE([BSD_SYSCTL_SRC],
+ [AC_MSG_RESULT([yes])
+ HAVE_BSD_SYSCTL=YesPlease],
+ [AC_MSG_RESULT([no])
+ HAVE_BSD_SYSCTL=])
+GIT_CONF_SUBST([HAVE_BSD_SYSCTL])
## Other checks.
# Define USE_PIC if you need the main git objects to be built with -fPIC
diff --git a/connect.c b/connect.c
index 062e133..c0144d8 100644
--- a/connect.c
+++ b/connect.c
@@ -157,8 +157,7 @@ struct ref **get_remote_heads(int in, char *src_buf, size_t src_len,
server_capabilities = xstrdup(name + name_len + 1);
}
- if (extra_have &&
- name_len == 5 && !memcmp(".have", name, 5)) {
+ if (extra_have && !strcmp(name, ".have")) {
sha1_array_append(extra_have, old_sha1);
continue;
}
@@ -274,28 +273,46 @@ static enum protocol get_protocol(const char *name)
die("I don't handle protocol '%s'", name);
}
+static char *host_end(char **hoststart, int removebrackets)
+{
+ char *host = *hoststart;
+ char *end;
+ char *start = strstr(host, "@[");
+ if (start)
+ start++; /* Jump over '@' */
+ else
+ start = host;
+ if (start[0] == '[') {
+ end = strchr(start + 1, ']');
+ if (end) {
+ if (removebrackets) {
+ *end = 0;
+ memmove(start, start + 1, end - start);
+ end++;
+ }
+ } else
+ end = host;
+ } else
+ end = host;
+ return end;
+}
+
#define STR_(s) # s
#define STR(s) STR_(s)
static void get_host_and_port(char **host, const char **port)
{
char *colon, *end;
-
- if (*host[0] == '[') {
- end = strchr(*host + 1, ']');
- if (end) {
- *end = 0;
- end++;
- (*host)++;
- } else
- end = *host;
- } else
- end = *host;
+ end = host_end(host, 1);
colon = strchr(end, ':');
-
if (colon) {
- *colon = 0;
- *port = colon + 1;
+ long portnr = strtol(colon + 1, &end, 10);
+ if (end != colon + 1 && *end == '\0' && 0 <= portnr && portnr < 65536) {
+ *colon = 0;
+ *port = colon + 1;
+ } else if (!colon[1]) {
+ *colon = 0;
+ }
}
}
@@ -547,13 +564,16 @@ static struct child_process *git_proxy_connect(int fd[2], char *host)
return proxy;
}
-static const char *get_port_numeric(const char *p)
+static char *get_port(char *host)
{
char *end;
+ char *p = strchr(host, ':');
+
if (p) {
long port = strtol(p + 1, &end, 10);
if (end != p + 1 && *end == '\0' && 0 <= port && port < 65536) {
- return p;
+ *p = '\0';
+ return p+1;
}
}
@@ -595,14 +615,7 @@ static enum protocol parse_connect_url(const char *url_orig, char **ret_host,
* Don't do destructive transforms as protocol code does
* '[]' unwrapping in get_host_and_port()
*/
- if (host[0] == '[') {
- end = strchr(host + 1, ']');
- if (end) {
- end++;
- } else
- end = host;
- } else
- end = host;
+ end = host_end(&host, 0);
if (protocol == PROTO_LOCAL)
path = end;
@@ -663,17 +676,27 @@ struct child_process *git_connect(int fd[2], const char *url,
signal(SIGCHLD, SIG_DFL);
protocol = parse_connect_url(url, &hostandport, &path);
- if (flags & CONNECT_DIAG_URL) {
+ if ((flags & CONNECT_DIAG_URL) && (protocol != PROTO_SSH)) {
printf("Diag: url=%s\n", url ? url : "NULL");
printf("Diag: protocol=%s\n", prot_name(protocol));
printf("Diag: hostandport=%s\n", hostandport ? hostandport : "NULL");
printf("Diag: path=%s\n", path ? path : "NULL");
conn = NULL;
} else if (protocol == PROTO_GIT) {
+ /*
+ * Set up virtual host information based on where we will
+ * connect, unless the user has overridden us in
+ * the environment.
+ */
+ char *target_host = getenv("GIT_OVERRIDE_VIRTUAL_HOST");
+ if (target_host)
+ target_host = xstrdup(target_host);
+ else
+ target_host = xstrdup(hostandport);
+
/* These underlying connection commands die() if they
* cannot connect.
*/
- char *target_host = xstrdup(hostandport);
if (git_use_proxy(hostandport))
conn = git_proxy_connect(fd, hostandport);
else
@@ -701,25 +724,52 @@ struct child_process *git_connect(int fd[2], const char *url,
conn->in = conn->out = -1;
if (protocol == PROTO_SSH) {
const char *ssh;
- int putty;
+ int putty, tortoiseplink = 0;
char *ssh_host = hostandport;
const char *port = NULL;
get_host_and_port(&ssh_host, &port);
- port = get_port_numeric(port);
+
+ if (!port)
+ port = get_port(ssh_host);
+
+ if (flags & CONNECT_DIAG_URL) {
+ printf("Diag: url=%s\n", url ? url : "NULL");
+ printf("Diag: protocol=%s\n", prot_name(protocol));
+ printf("Diag: userandhost=%s\n", ssh_host ? ssh_host : "NULL");
+ printf("Diag: port=%s\n", port ? port : "NONE");
+ printf("Diag: path=%s\n", path ? path : "NULL");
+
+ free(hostandport);
+ free(path);
+ free(conn);
+ return NULL;
+ }
ssh = getenv("GIT_SSH_COMMAND");
if (ssh) {
conn->use_shell = 1;
putty = 0;
} else {
+ const char *base;
+ char *ssh_dup;
+
ssh = getenv("GIT_SSH");
if (!ssh)
ssh = "ssh";
- putty = !!strcasestr(ssh, "plink");
+
+ ssh_dup = xstrdup(ssh);
+ base = basename(ssh_dup);
+
+ tortoiseplink = !strcasecmp(base, "tortoiseplink") ||
+ !strcasecmp(base, "tortoiseplink.exe");
+ putty = !strcasecmp(base, "plink") ||
+ !strcasecmp(base, "plink.exe") || tortoiseplink;
+
+ free(ssh_dup);
}
argv_array_push(&conn->args, ssh);
- if (putty && !strcasestr(ssh, "tortoiseplink"))
+ if (tortoiseplink)
argv_array_push(&conn->args, "-batch");
if (port) {
/* P is for PuTTY, p is for OpenSSH */
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index c21190d..eae9dce 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -186,7 +186,7 @@ fi
__gitcompappend ()
{
- local i=${#COMPREPLY[@]}
+ local x i=${#COMPREPLY[@]}
for x in $1; do
if [[ "$x" == "$3"* ]]; then
COMPREPLY[i++]="$2$x$4"
@@ -411,12 +411,9 @@ __git_refs_remotes ()
__git_remotes ()
{
- local i IFS=$'\n' d="$(__gitdir)"
+ local d="$(__gitdir)"
test -d "$d/remotes" && ls -1 "$d/remotes"
- for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
- i="${i#remote.}"
- echo "${i/.url*/}"
- done
+ git --git-dir="$d" remote
}
__git_list_merge_strategies ()
@@ -980,7 +977,7 @@ _git_branch ()
case "$cur" in
--set-upstream-to=*)
- __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}"
+ __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}"
;;
--*)
__gitcomp "
@@ -1048,7 +1045,7 @@ _git_checkout ()
_git_cherry ()
{
- __gitcomp "$(__git_refs)"
+ __gitcomp_nl "$(__git_refs)"
}
_git_cherry_pick ()
@@ -1305,7 +1302,7 @@ _git_gitk ()
}
__git_match_ctag() {
- awk "/^${1////\\/}/ { print \$1 }" "$2"
+ awk "/^${1//\//\\/}/ { print \$1 }" "$2"
}
_git_grep ()
@@ -1451,7 +1448,7 @@ _git_log ()
return
;;
--decorate=*)
- __gitcomp "long short" "" "${cur##--decorate=}"
+ __gitcomp "full short no" "" "${cur##--decorate=}"
return
;;
--*)
@@ -2014,6 +2011,7 @@ _git_config ()
color.status.changed
color.status.header
color.status.nobranch
+ color.status.unmerged
color.status.untracked
color.status.updated
color.ui
@@ -2188,6 +2186,7 @@ _git_config ()
pull.octopus
pull.twohead
push.default
+ push.followTags
rebase.autosquash
rebase.stat
receive.autogc
diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh
index 214e859..f18aedc 100644
--- a/contrib/completion/git-prompt.sh
+++ b/contrib/completion/git-prompt.sh
@@ -487,7 +487,7 @@ __git_ps1 ()
if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &&
[ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &&
- git ls-files --others --exclude-standard --error-unmatch -- '*' >/dev/null 2>/dev/null
+ git ls-files --others --exclude-standard --error-unmatch -- ':/*' >/dev/null 2>/dev/null
then
u="%${ZSH_VERSION+%}"
fi
diff --git a/contrib/credential/wincred/git-credential-wincred.c b/contrib/credential/wincred/git-credential-wincred.c
index a1d38f0..0061340 100644
--- a/contrib/credential/wincred/git-credential-wincred.c
+++ b/contrib/credential/wincred/git-credential-wincred.c
@@ -111,14 +111,23 @@ static void write_item(const char *what, LPCWSTR wbuf, int wlen)
* Match an (optional) expected string and a delimiter in the target string,
* consuming the matched text by updating the target pointer.
*/
-static int match_part(LPCWSTR *ptarget, LPCWSTR want, LPCWSTR delim)
+
+static LPCWSTR wcsstr_last(LPCWSTR str, LPCWSTR find)
+{
+ LPCWSTR res = NULL, pos;
+ for (pos = wcsstr(str, find); pos; pos = wcsstr(pos + 1, find))
+ res = pos;
+ return res;
+}
+
+static int match_part_with_last(LPCWSTR *ptarget, LPCWSTR want, LPCWSTR delim, int last)
{
LPCWSTR delim_pos, start = *ptarget;
int len;
/* find start of delimiter (or end-of-string if delim is empty) */
if (*delim)
- delim_pos = wcsstr(start, delim);
+ delim_pos = last ? wcsstr_last(start, delim) : wcsstr(start, delim);
else
delim_pos = start + wcslen(start);
@@ -138,6 +147,16 @@ static int match_part(LPCWSTR *ptarget, LPCWSTR want, LPCWSTR delim)
return !want || (!wcsncmp(want, start, len) && !want[len]);
}
+static int match_part(LPCWSTR *ptarget, LPCWSTR want, LPCWSTR delim)
+{
+ return match_part_with_last(ptarget, want, delim, 0);
+}
+
+static int match_part_last(LPCWSTR *ptarget, LPCWSTR want, LPCWSTR delim)
+{
+ return match_part_with_last(ptarget, want, delim, 1);
+}
+
static int match_cred(const CREDENTIALW *cred)
{
LPCWSTR target = cred->TargetName;
@@ -146,7 +165,7 @@ static int match_cred(const CREDENTIALW *cred)
return match_part(&target, L"git", L":") &&
match_part(&target, protocol, L"://") &&
- match_part(&target, wusername, L"@") &&
+ match_part_last(&target, wusername, L"@") &&
match_part(&target, host, L"/") &&
match_part(&target, path, L"");
}
diff --git a/contrib/diff-highlight/diff-highlight b/contrib/diff-highlight/diff-highlight
index 08c88bb..ffefc31 100755
--- a/contrib/diff-highlight/diff-highlight
+++ b/contrib/diff-highlight/diff-highlight
@@ -1,5 +1,6 @@
#!/usr/bin/perl
+use 5.008;
use warnings FATAL => 'all';
use strict;
@@ -164,8 +165,12 @@ sub highlight_pair {
sub split_line {
local $_ = shift;
- return map { /$COLOR/ ? $_ : (split //) }
- split /($COLOR*)/;
+ return utf8::decode($_) ?
+ map { utf8::encode($_); $_ }
+ map { /$COLOR/ ? $_ : (split //) }
+ split /($COLOR+)/ :
+ map { /$COLOR/ ? $_ : (split //) }
+ split /($COLOR+)/;
}
sub highlight_line {
diff --git a/contrib/hooks/multimail/README b/contrib/hooks/multimail/README
index 477d65f..6efa4ff 100644
--- a/contrib/hooks/multimail/README
+++ b/contrib/hooks/multimail/README
@@ -456,34 +456,35 @@ consider sharing them with the community!
Getting involved
----------------
-git-multimail is an open-source project, built by volunteers. We
-would welcome your help!
+git-multimail is an open-source project, built by volunteers. We would
+welcome your help!
-The current maintainer is Michael Haggerty <mhagger@alum.mit.edu>.
+The current maintainers are Michael Haggerty <mhagger@alum.mit.edu>
+and Matthieu Moy <matthieu.moy@grenoble-inp.fr>.
-General discussion of git-multimail takes place on the main Git
-mailing list,
+Please note that although a copy of git-multimail is distributed in
+the "contrib" section of the main Git project, development takes place
+in a separate git-multimail repository on GitHub:
- git@vger.kernel.org
+ https://github.com/git-multimail/git-multimail
-Please CC emails regarding git-multimail to me so that I don't
-overlook them.
+Whenever enough changes to git-multimail have accumulated, a new
+code-drop of git-multimail will be submitted for inclusion in the Git
+project.
-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 we use GitHub pull requests to exchange patches (though,
+if you prefer, you can send patches via the Git mailing list with CC
+to the maintainers). Please sign off your patches as per the Git
+project practice.
- https://github.com/mhagger/git-multimail
+General discussion of git-multimail can take place on the main Git
+mailing list,
-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,
-development takes place in the separate git-multimail repository on
-GitHub! (Whenever enough changes to git-multimail have accumulated, a
-new code-drop of git-multimail will be submitted for inclusion in the
-Git project.)
+ git@vger.kernel.org
+
+Please CC emails regarding git-multimail to the maintainers so that we
+don't overlook them.
Footnotes
diff --git a/contrib/hooks/multimail/README.Git b/contrib/hooks/multimail/README.Git
index 129b771..ab3ece5 100644
--- a/contrib/hooks/multimail/README.Git
+++ b/contrib/hooks/multimail/README.Git
@@ -3,13 +3,13 @@ section of the Git project as a convenience to Git users.
git-multimail is developed as an independent project at the following
website:
- https://github.com/mhagger/git-multimail
+ https://github.com/git-multimail/git-multimail
The version in this directory was obtained from the upstream project
-on 2014-04-07 and consists of the "git-multimail" subdirectory from
+on 2015-04-27 and consists of the "git-multimail" subdirectory from
revision
- 1b32653bafc4f902535b9fc1cd9cae911325b870
+ 8c3aaafa873bf10de8dddf1d202c449b3eff3b42 refs/tags/1.0.2
Please see the README file in this directory for information about how
to report bugs or contribute to git-multimail.
diff --git a/credential-store.c b/credential-store.c
index 925d3f4..f692509 100644
--- a/credential-store.c
+++ b/credential-store.c
@@ -6,7 +6,7 @@
static struct lock_file credential_lock;
-static void parse_credential_file(const char *fn,
+static int parse_credential_file(const char *fn,
struct credential *c,
void (*match_cb)(struct credential *),
void (*other_cb)(struct strbuf *))
@@ -14,18 +14,20 @@ static void parse_credential_file(const char *fn,
FILE *fh;
struct strbuf line = STRBUF_INIT;
struct credential entry = CREDENTIAL_INIT;
+ int found_credential = 0;
fh = fopen(fn, "r");
if (!fh) {
- if (errno != ENOENT)
+ if (errno != ENOENT && errno != EACCES)
die_errno("unable to open %s", fn);
- return;
+ return found_credential;
}
while (strbuf_getline(&line, fh, '\n') != EOF) {
credential_from_url(&entry, line.buf);
if (entry.username && entry.password &&
credential_match(c, &entry)) {
+ found_credential = 1;
if (match_cb) {
match_cb(&entry);
break;
@@ -38,6 +40,7 @@ static void parse_credential_file(const char *fn,
credential_clear(&entry);
strbuf_release(&line);
fclose(fh);
+ return found_credential;
}
static void print_entry(struct credential *c)
@@ -64,21 +67,10 @@ static void rewrite_credential_file(const char *fn, struct credential *c,
die_errno("unable to commit credential store");
}
-static void store_credential(const char *fn, struct credential *c)
+static void store_credential_file(const char *fn, struct credential *c)
{
struct strbuf buf = STRBUF_INIT;
- /*
- * Sanity check that what we are storing is actually sensible.
- * In particular, we can't make a URL without a protocol field.
- * Without either a host or pathname (depending on the scheme),
- * we have no primary key. And without a username and password,
- * we are not actually storing a credential.
- */
- if (!c->protocol || !(c->host || c->path) ||
- !c->username || !c->password)
- return;
-
strbuf_addf(&buf, "%s://", c->protocol);
strbuf_addstr_urlencode(&buf, c->username, 1);
strbuf_addch(&buf, ':');
@@ -95,8 +87,37 @@ static void store_credential(const char *fn, struct credential *c)
strbuf_release(&buf);
}
-static void remove_credential(const char *fn, struct credential *c)
+static void store_credential(const struct string_list *fns, struct credential *c)
+{
+ struct string_list_item *fn;
+
+ /*
+ * Sanity check that what we are storing is actually sensible.
+ * In particular, we can't make a URL without a protocol field.
+ * Without either a host or pathname (depending on the scheme),
+ * we have no primary key. And without a username and password,
+ * we are not actually storing a credential.
+ */
+ if (!c->protocol || !(c->host || c->path) || !c->username || !c->password)
+ return;
+
+ for_each_string_list_item(fn, fns)
+ if (!access(fn->string, F_OK)) {
+ store_credential_file(fn->string, c);
+ return;
+ }
+ /*
+ * Write credential to the filename specified by fns->items[0], thus
+ * creating it
+ */
+ if (fns->nr)
+ store_credential_file(fns->items[0].string, c);
+}
+
+static void remove_credential(const struct string_list *fns, struct credential *c)
{
+ struct string_list_item *fn;
+
/*
* Sanity check that we actually have something to match
* against. The input we get is a restrictive pattern,
@@ -105,14 +126,20 @@ static void remove_credential(const char *fn, struct credential *c)
* to empty input. So explicitly disallow it, and require that the
* pattern have some actual content to match.
*/
- if (c->protocol || c->host || c->path || c->username)
- rewrite_credential_file(fn, c, NULL);
+ if (!c->protocol && !c->host && !c->path && !c->username)
+ return;
+ for_each_string_list_item(fn, fns)
+ if (!access(fn->string, F_OK))
+ rewrite_credential_file(fn->string, c, NULL);
}
-static int lookup_credential(const char *fn, struct credential *c)
+static void lookup_credential(const struct string_list *fns, struct credential *c)
{
- parse_credential_file(fn, c, print_entry, NULL);
- return c->username && c->password;
+ struct string_list_item *fn;
+
+ for_each_string_list_item(fn, fns)
+ if (parse_credential_file(fn->string, c, print_entry, NULL))
+ return; /* Found credential */
}
int main(int argc, char **argv)
@@ -123,6 +150,7 @@ int main(int argc, char **argv)
};
const char *op;
struct credential c = CREDENTIAL_INIT;
+ struct string_list fns = STRING_LIST_INIT_DUP;
char *file = NULL;
struct option options[] = {
OPT_STRING(0, "file", &file, "path",
@@ -137,22 +165,30 @@ int main(int argc, char **argv)
usage_with_options(usage, options);
op = argv[0];
- if (!file)
- file = expand_user_path("~/.git-credentials");
- if (!file)
+ if (file) {
+ string_list_append(&fns, file);
+ } else {
+ if ((file = expand_user_path("~/.git-credentials")))
+ string_list_append_nodup(&fns, file);
+ file = xdg_config_home("credentials");
+ if (file)
+ string_list_append_nodup(&fns, file);
+ }
+ if (!fns.nr)
die("unable to set up default path; use --file");
if (credential_read(&c, stdin) < 0)
die("unable to read credential");
if (!strcmp(op, "get"))
- lookup_credential(file, &c);
+ lookup_credential(&fns, &c);
else if (!strcmp(op, "erase"))
- remove_credential(file, &c);
+ remove_credential(&fns, &c);
else if (!strcmp(op, "store"))
- store_credential(file, &c);
+ store_credential(&fns, &c);
else
; /* Ignore unknown operation. */
+ string_list_clear(&fns, 0);
return 0;
}
diff --git a/csum-file.c b/csum-file.c
index b00b215..a172199 100644
--- a/csum-file.c
+++ b/csum-file.c
@@ -130,14 +130,10 @@ struct sha1file *sha1fd_check(const char *name)
sink = open("/dev/null", O_WRONLY);
if (sink < 0)
- return NULL;
+ die_errno("unable to open /dev/null");
check = open(name, O_RDONLY);
- if (check < 0) {
- int saved_errno = errno;
- close(sink);
- errno = saved_errno;
- return NULL;
- }
+ if (check < 0)
+ die_errno("unable to open '%s'", name);
f = sha1fd(sink, name);
f->check_fd = check;
return f;
diff --git a/ctype.c b/ctype.c
index 0bfebb4..fc0225c 100644
--- a/ctype.c
+++ b/ctype.c
@@ -30,7 +30,7 @@ const unsigned char sane_ctype[256] = {
};
/* For case-insensitive kwset */
-const char tolower_trans_tbl[256] = {
+const unsigned char tolower_trans_tbl[256] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
diff --git a/daemon.c b/daemon.c
index 54a03bd..4be1091 100644
--- a/daemon.c
+++ b/daemon.c
@@ -43,9 +43,6 @@ static const char *base_path;
static const char *interpolated_path;
static int base_path_relaxed;
-/* Flag indicating client sent extra args. */
-static int saw_extended_args;
-
/* If defined, ~user notation is allowed and the string is inserted
* after ~user/. E.g. a request to git://host/~alice/frotz would
* go to /home/alice/pub_git/frotz with --user-path=pub_git.
@@ -56,10 +53,28 @@ static const char *user_path;
static unsigned int timeout;
static unsigned int init_timeout;
-static char *hostname;
-static char *canon_hostname;
-static char *ip_address;
-static char *tcp_port;
+struct hostinfo {
+ struct strbuf hostname;
+ struct strbuf canon_hostname;
+ struct strbuf ip_address;
+ struct strbuf tcp_port;
+ unsigned int hostname_lookup_done:1;
+ unsigned int saw_extended_args:1;
+};
+
+static void lookup_hostname(struct hostinfo *hi);
+
+static const char *get_canon_hostname(struct hostinfo *hi)
+{
+ lookup_hostname(hi);
+ return hi->canon_hostname.buf;
+}
+
+static const char *get_ip_address(struct hostinfo *hi)
+{
+ lookup_hostname(hi);
+ return hi->ip_address.buf;
+}
static void logreport(int priority, const char *err, va_list params)
{
@@ -106,7 +121,43 @@ static void NORETURN daemon_die(const char *err, va_list params)
exit(1);
}
-static const char *path_ok(const char *directory)
+struct expand_path_context {
+ const char *directory;
+ struct hostinfo *hostinfo;
+};
+
+static size_t expand_path(struct strbuf *sb, const char *placeholder, void *ctx)
+{
+ struct expand_path_context *context = ctx;
+ struct hostinfo *hi = context->hostinfo;
+
+ switch (placeholder[0]) {
+ case 'H':
+ strbuf_addbuf(sb, &hi->hostname);
+ return 1;
+ case 'C':
+ if (placeholder[1] == 'H') {
+ strbuf_addstr(sb, get_canon_hostname(hi));
+ return 2;
+ }
+ break;
+ case 'I':
+ if (placeholder[1] == 'P') {
+ strbuf_addstr(sb, get_ip_address(hi));
+ return 2;
+ }
+ break;
+ case 'P':
+ strbuf_addbuf(sb, &hi->tcp_port);
+ return 1;
+ case 'D':
+ strbuf_addstr(sb, context->directory);
+ return 1;
+ }
+ return 0;
+}
+
+static const char *path_ok(const char *directory, struct hostinfo *hi)
{
static char rpath[PATH_MAX];
static char interp_path[PATH_MAX];
@@ -142,16 +193,13 @@ static const char *path_ok(const char *directory)
dir = rpath;
}
}
- else if (interpolated_path && saw_extended_args) {
+ else if (interpolated_path && hi->saw_extended_args) {
struct strbuf expanded_path = STRBUF_INIT;
- struct strbuf_expand_dict_entry dict[6];
-
- dict[0].placeholder = "H"; dict[0].value = hostname;
- dict[1].placeholder = "CH"; dict[1].value = canon_hostname;
- dict[2].placeholder = "IP"; dict[2].value = ip_address;
- dict[3].placeholder = "P"; dict[3].value = tcp_port;
- dict[4].placeholder = "D"; dict[4].value = directory;
- dict[5].placeholder = NULL; dict[5].value = NULL;
+ struct expand_path_context context;
+
+ context.directory = directory;
+ context.hostinfo = hi;
+
if (*dir != '/') {
/* Allow only absolute */
logerror("'%s': Non-absolute path denied (interpolated-path active)", dir);
@@ -159,7 +207,7 @@ static const char *path_ok(const char *directory)
}
strbuf_expand(&expanded_path, interpolated_path,
- strbuf_expand_dict_cb, &dict);
+ expand_path, &context);
strlcpy(interp_path, expanded_path.buf, PATH_MAX);
strbuf_release(&expanded_path);
loginfo("Interpolated dir '%s'", interp_path);
@@ -240,7 +288,8 @@ static int daemon_error(const char *dir, const char *msg)
static const char *access_hook;
-static int run_access_hook(struct daemon_service *service, const char *dir, const char *path)
+static int run_access_hook(struct daemon_service *service, const char *dir,
+ const char *path, struct hostinfo *hi)
{
struct child_process child = CHILD_PROCESS_INIT;
struct strbuf buf = STRBUF_INIT;
@@ -249,16 +298,14 @@ static int run_access_hook(struct daemon_service *service, const char *dir, cons
char *eol;
int seen_errors = 0;
-#define STRARG(x) ((x) ? (x) : "")
*arg++ = access_hook;
*arg++ = service->name;
*arg++ = path;
- *arg++ = STRARG(hostname);
- *arg++ = STRARG(canon_hostname);
- *arg++ = STRARG(ip_address);
- *arg++ = STRARG(tcp_port);
+ *arg++ = hi->hostname.buf;
+ *arg++ = get_canon_hostname(hi);
+ *arg++ = get_ip_address(hi);
+ *arg++ = hi->tcp_port.buf;
*arg = NULL;
-#undef STRARG
child.use_shell = 1;
child.argv = argv;
@@ -302,7 +349,8 @@ error_return:
return -1;
}
-static int run_service(const char *dir, struct daemon_service *service)
+static int run_service(const char *dir, struct daemon_service *service,
+ struct hostinfo *hi)
{
const char *path;
int enabled = service->enabled;
@@ -316,7 +364,7 @@ static int run_service(const char *dir, struct daemon_service *service)
return daemon_error(dir, "service not enabled");
}
- if (!(path = path_ok(dir)))
+ if (!(path = path_ok(dir, hi)))
return daemon_error(dir, "no such repository");
/*
@@ -352,7 +400,7 @@ static int run_service(const char *dir, struct daemon_service *service)
* Optionally, a hook can choose to deny access to the
* repository depending on the phase of the moon.
*/
- if (access_hook && run_access_hook(service, dir, path))
+ if (access_hook && run_access_hook(service, dir, path, hi))
return -1;
/*
@@ -485,16 +533,46 @@ static void parse_host_and_port(char *hostport, char **host,
}
/*
+ * Sanitize a string from the client so that it's OK to be inserted into a
+ * filesystem path. Specifically, we disallow slashes, runs of "..", and
+ * trailing and leading dots, which means that the client cannot escape
+ * our base path via ".." traversal.
+ */
+static void sanitize_client(struct strbuf *out, const char *in)
+{
+ for (; *in; in++) {
+ if (*in == '/')
+ continue;
+ if (*in == '.' && (!out->len || out->buf[out->len - 1] == '.'))
+ continue;
+ strbuf_addch(out, *in);
+ }
+
+ while (out->len && out->buf[out->len - 1] == '.')
+ strbuf_setlen(out, out->len - 1);
+}
+
+/*
+ * Like sanitize_client, but we also perform any canonicalization
+ * to make life easier on the admin.
+ */
+static void canonicalize_client(struct strbuf *out, const char *in)
+{
+ sanitize_client(out, in);
+ strbuf_tolower(out);
+}
+
+/*
* Read the host as supplied by the client connection.
*/
-static void parse_host_arg(char *extra_args, int buflen)
+static void parse_host_arg(struct hostinfo *hi, char *extra_args, int buflen)
{
char *val;
int vallen;
char *end = extra_args + buflen;
if (extra_args < end && *extra_args) {
- saw_extended_args = 1;
+ hi->saw_extended_args = 1;
if (strncasecmp("host=", extra_args, 5) == 0) {
val = extra_args + 5;
vallen = strlen(val) + 1;
@@ -503,12 +581,10 @@ static void parse_host_arg(char *extra_args, int buflen)
char *host;
char *port;
parse_host_and_port(val, &host, &port);
- if (port) {
- free(tcp_port);
- tcp_port = xstrdup(port);
- }
- free(hostname);
- hostname = xstrdup_tolower(host);
+ if (port)
+ sanitize_client(&hi->tcp_port, port);
+ canonicalize_client(&hi->hostname, host);
+ hi->hostname_lookup_done = 0;
}
/* On to the next one */
@@ -517,11 +593,14 @@ static void parse_host_arg(char *extra_args, int buflen)
if (extra_args < end && *extra_args)
die("Invalid request");
}
+}
- /*
- * Locate canonical hostname and its IP address.
- */
- if (hostname) {
+/*
+ * Locate canonical hostname and its IP address.
+ */
+static void lookup_hostname(struct hostinfo *hi)
+{
+ if (!hi->hostname_lookup_done && hi->hostname.len) {
#ifndef NO_IPV6
struct addrinfo hints;
struct addrinfo *ai;
@@ -531,18 +610,20 @@ static void parse_host_arg(char *extra_args, int buflen)
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_CANONNAME;
- gai = getaddrinfo(hostname, NULL, &hints, &ai);
+ gai = getaddrinfo(hi->hostname.buf, NULL, &hints, &ai);
if (!gai) {
struct sockaddr_in *sin_addr = (void *)ai->ai_addr;
inet_ntop(AF_INET, &sin_addr->sin_addr,
addrbuf, sizeof(addrbuf));
- free(ip_address);
- ip_address = xstrdup(addrbuf);
+ strbuf_addstr(&hi->ip_address, addrbuf);
- free(canon_hostname);
- canon_hostname = xstrdup(ai->ai_canonname ?
- ai->ai_canonname : ip_address);
+ if (ai->ai_canonname)
+ sanitize_client(&hi->canon_hostname,
+ ai->ai_canonname);
+ else
+ strbuf_addbuf(&hi->canon_hostname,
+ &hi->ip_address);
freeaddrinfo(ai);
}
@@ -552,7 +633,7 @@ static void parse_host_arg(char *extra_args, int buflen)
char **ap;
static char addrbuf[HOST_NAME_MAX + 1];
- hent = gethostbyname(hostname);
+ hent = gethostbyname(hi->hostname.buf);
if (hent) {
ap = hent->h_addr_list;
memset(&sa, 0, sizeof sa);
@@ -563,21 +644,39 @@ static void parse_host_arg(char *extra_args, int buflen)
inet_ntop(hent->h_addrtype, &sa.sin_addr,
addrbuf, sizeof(addrbuf));
- free(canon_hostname);
- canon_hostname = xstrdup(hent->h_name);
- free(ip_address);
- ip_address = xstrdup(addrbuf);
+ sanitize_client(&hi->canon_hostname, hent->h_name);
+ strbuf_addstr(&hi->ip_address, addrbuf);
}
#endif
+ hi->hostname_lookup_done = 1;
}
}
+static void hostinfo_init(struct hostinfo *hi)
+{
+ memset(hi, 0, sizeof(*hi));
+ strbuf_init(&hi->hostname, 0);
+ strbuf_init(&hi->canon_hostname, 0);
+ strbuf_init(&hi->ip_address, 0);
+ strbuf_init(&hi->tcp_port, 0);
+}
+
+static void hostinfo_clear(struct hostinfo *hi)
+{
+ strbuf_release(&hi->hostname);
+ strbuf_release(&hi->canon_hostname);
+ strbuf_release(&hi->ip_address);
+ strbuf_release(&hi->tcp_port);
+}
static int execute(void)
{
char *line = packet_buffer;
int pktlen, len, i;
char *addr = getenv("REMOTE_ADDR"), *port = getenv("REMOTE_PORT");
+ struct hostinfo hi;
+
+ hostinfo_init(&hi);
if (addr)
loginfo("Connection from %s:%s", addr, port);
@@ -596,14 +695,8 @@ static int execute(void)
pktlen--;
}
- free(hostname);
- free(canon_hostname);
- free(ip_address);
- free(tcp_port);
- hostname = canon_hostname = ip_address = tcp_port = NULL;
-
if (len != pktlen)
- parse_host_arg(line + len + 1, pktlen - len - 1);
+ parse_host_arg(&hi, line + len + 1, pktlen - len - 1);
for (i = 0; i < ARRAY_SIZE(daemon_service); i++) {
struct daemon_service *s = &(daemon_service[i]);
@@ -616,10 +709,13 @@ static int execute(void)
* Note: The directory here is probably context sensitive,
* and might depend on the actual service being performed.
*/
- return run_service(arg, s);
+ int rc = run_service(arg, s, &hi);
+ hostinfo_clear(&hi);
+ return rc;
}
}
+ hostinfo_clear(&hi);
logerror("Protocol error: '%s'", line);
return -1;
}
diff --git a/date.c b/date.c
index 3eba2df..733d1b2 100644
--- a/date.c
+++ b/date.c
@@ -704,10 +704,17 @@ int parse_date_basic(const char *date, unsigned long *timestamp, int *offset)
date += match;
}
- /* mktime uses local timezone */
+ /* do not use mktime(), which uses local timezone, here */
*timestamp = tm_to_time_t(&tm);
+ if (*timestamp == -1)
+ return -1;
+
if (*offset == -1) {
- time_t temp_time = mktime(&tm);
+ time_t temp_time;
+
+ /* gmtime_r() in match_digit() may have clobbered it */
+ tm.tm_isdst = -1;
+ temp_time = mktime(&tm);
if ((time_t)*timestamp > temp_time) {
*offset = ((time_t)*timestamp - temp_time) / 60;
} else {
@@ -715,9 +722,6 @@ int parse_date_basic(const char *date, unsigned long *timestamp, int *offset)
}
}
- if (*timestamp == -1)
- return -1;
-
if (!tm_gmt)
*timestamp -= *offset * 60;
return 0; /* success */
diff --git a/diff-lib.c b/diff-lib.c
index 875aff8..a85c497 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -101,6 +101,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
struct cache_entry *ce = active_cache[i];
int changed;
unsigned dirty_submodule = 0;
+ const unsigned char *old_sha1, *new_sha1;
if (diff_can_quit_early(&revs->diffopt))
break;
@@ -224,9 +225,12 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
continue;
}
oldmode = ce->ce_mode;
+ old_sha1 = ce->sha1;
+ new_sha1 = changed ? null_sha1 : ce->sha1;
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)),
+ old_sha1, new_sha1,
+ !is_null_sha1(old_sha1),
+ !is_null_sha1(new_sha1),
ce->name, 0, dirty_submodule);
}
diff --git a/diff-no-index.c b/diff-no-index.c
index 265709b..0320605 100644
--- a/diff-no-index.c
+++ b/diff-no-index.c
@@ -97,8 +97,27 @@ static int queue_diff(struct diff_options *o,
if (get_mode(name1, &mode1) || get_mode(name2, &mode2))
return -1;
- if (mode1 && mode2 && S_ISDIR(mode1) != S_ISDIR(mode2))
- return error("file/directory conflict: %s, %s", name1, name2);
+ if (mode1 && mode2 && S_ISDIR(mode1) != S_ISDIR(mode2)) {
+ struct diff_filespec *d1, *d2;
+
+ if (S_ISDIR(mode1)) {
+ /* 2 is file that is created */
+ d1 = noindex_filespec(NULL, 0);
+ d2 = noindex_filespec(name2, mode2);
+ name2 = NULL;
+ mode2 = 0;
+ } else {
+ /* 1 is file that is deleted */
+ d1 = noindex_filespec(name1, mode1);
+ d2 = noindex_filespec(NULL, 0);
+ name1 = NULL;
+ mode1 = 0;
+ }
+ /* emit that file */
+ diff_queue(&diff_queued_diff, d1, d2);
+
+ /* and then let the entire directory be created or deleted */
+ }
if (S_ISDIR(mode1) || S_ISDIR(mode2)) {
struct strbuf buffer1 = STRBUF_INIT;
@@ -182,12 +201,50 @@ static int queue_diff(struct diff_options *o,
}
}
+/* append basename of F to D */
+static void append_basename(struct strbuf *path, const char *dir, const char *file)
+{
+ const char *tail = strrchr(file, '/');
+
+ strbuf_addstr(path, dir);
+ while (path->len && path->buf[path->len - 1] == '/')
+ path->len--;
+ strbuf_addch(path, '/');
+ strbuf_addstr(path, tail ? tail + 1 : file);
+}
+
+/*
+ * DWIM "diff D F" into "diff D/F F" and "diff F D" into "diff F D/F"
+ * Note that we append the basename of F to D/, so "diff a/b/file D"
+ * becomes "diff a/b/file D/file", not "diff a/b/file D/a/b/file".
+ */
+static void fixup_paths(const char **path, struct strbuf *replacement)
+{
+ unsigned int isdir0, isdir1;
+
+ if (path[0] == file_from_standard_input ||
+ path[1] == file_from_standard_input)
+ return;
+ isdir0 = is_directory(path[0]);
+ isdir1 = is_directory(path[1]);
+ if (isdir0 == isdir1)
+ return;
+ if (isdir0) {
+ append_basename(replacement, path[0], path[1]);
+ path[0] = replacement->buf;
+ } else {
+ append_basename(replacement, path[1], path[0]);
+ path[1] = replacement->buf;
+ }
+}
+
void diff_no_index(struct rev_info *revs,
int argc, const char **argv,
const char *prefix)
{
int i, prefixlen;
const char *paths[2];
+ struct strbuf replacement = STRBUF_INIT;
diff_setup(&revs->diffopt);
for (i = 1; i < argc - 2; ) {
@@ -217,6 +274,9 @@ void diff_no_index(struct rev_info *revs,
p = xstrdup(prefix_filename(prefix, prefixlen, p));
paths[i] = p;
}
+
+ fixup_paths(paths, &replacement);
+
revs->diffopt.skip_stat_unmatch = 1;
if (!revs->diffopt.output_format)
revs->diffopt.output_format = DIFF_FORMAT_PATCH;
@@ -235,6 +295,8 @@ void diff_no_index(struct rev_info *revs,
diffcore_std(&revs->diffopt);
diff_flush(&revs->diffopt);
+ strbuf_release(&replacement);
+
/*
* The return code for --no-index imitates diff(1):
* 0 = no changes, 1 = changes, else error
diff --git a/diff.c b/diff.c
index d1bd534..7500c55 100644
--- a/diff.c
+++ b/diff.c
@@ -2093,7 +2093,6 @@ static unsigned char *deflate_it(char *data,
unsigned char *deflated;
git_zstream stream;
- memset(&stream, 0, sizeof(stream));
git_deflate_init(&stream, zlib_compression_level);
bound = git_deflate_bound(&stream, size);
deflated = xmalloc(bound);
@@ -4541,7 +4540,7 @@ void diff_flush(struct diff_options *options)
show_stats(&diffstat, options);
if (output_format & DIFF_FORMAT_SHORTSTAT)
show_shortstats(&diffstat, options);
- if (output_format & DIFF_FORMAT_DIRSTAT)
+ if (output_format & DIFF_FORMAT_DIRSTAT && dirstat_by_line)
show_dirstat_by_line(&diffstat, options);
free_diffstat_info(&diffstat);
separator++;
diff --git a/diffcore-rename.c b/diffcore-rename.c
index 4e132f1..af1fe08 100644
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
@@ -15,8 +15,7 @@ static struct diff_rename_dst {
} *rename_dst;
static int rename_dst_nr, rename_dst_alloc;
-static struct diff_rename_dst *locate_rename_dst(struct diff_filespec *two,
- int insert_ok)
+static int find_rename_dst(struct diff_filespec *two)
{
int first, last;
@@ -27,16 +26,33 @@ static struct diff_rename_dst *locate_rename_dst(struct diff_filespec *two,
struct diff_rename_dst *dst = &(rename_dst[next]);
int cmp = strcmp(two->path, dst->two->path);
if (!cmp)
- return dst;
+ return next;
if (cmp < 0) {
last = next;
continue;
}
first = next+1;
}
- /* not found */
- if (!insert_ok)
- return NULL;
+ return -first - 1;
+}
+
+static struct diff_rename_dst *locate_rename_dst(struct diff_filespec *two)
+{
+ int ofs = find_rename_dst(two);
+ return ofs < 0 ? NULL : &rename_dst[ofs];
+}
+
+/*
+ * Returns 0 on success, -1 if we found a duplicate.
+ */
+static int add_rename_dst(struct diff_filespec *two)
+{
+ int first = find_rename_dst(two);
+
+ if (first >= 0)
+ return -1;
+ first = -first - 1;
+
/* insert to make it at "first" */
ALLOC_GROW(rename_dst, rename_dst_nr + 1, rename_dst_alloc);
rename_dst_nr++;
@@ -46,7 +62,7 @@ static struct diff_rename_dst *locate_rename_dst(struct diff_filespec *two,
rename_dst[first].two = alloc_filespec(two->path);
fill_filespec(rename_dst[first].two, two->sha1, two->sha1_valid, two->mode);
rename_dst[first].pair = NULL;
- return &(rename_dst[first]);
+ return 0;
}
/* Table of rename/copy src files */
@@ -450,8 +466,12 @@ void diffcore_rename(struct diff_options *options)
else if (!DIFF_OPT_TST(options, RENAME_EMPTY) &&
is_empty_blob_sha1(p->two->sha1))
continue;
- else
- locate_rename_dst(p->two, 1);
+ else if (add_rename_dst(p->two) < 0) {
+ warning("skipping rename detection, detected"
+ " duplicate destination '%s'",
+ p->two->path);
+ goto cleanup;
+ }
}
else if (!DIFF_OPT_TST(options, RENAME_EMPTY) &&
is_empty_blob_sha1(p->one->sha1))
@@ -582,8 +602,7 @@ void diffcore_rename(struct diff_options *options)
* We would output this create record if it has
* not been turned into a rename/copy already.
*/
- struct diff_rename_dst *dst =
- locate_rename_dst(p->two, 0);
+ struct diff_rename_dst *dst = locate_rename_dst(p->two);
if (dst && dst->pair) {
diff_q(&outq, dst->pair);
pair_to_free = p;
@@ -613,8 +632,7 @@ void diffcore_rename(struct diff_options *options)
*/
if (DIFF_PAIR_BROKEN(p)) {
/* broken delete */
- struct diff_rename_dst *dst =
- locate_rename_dst(p->one, 0);
+ struct diff_rename_dst *dst = locate_rename_dst(p->one);
if (dst && dst->pair)
/* counterpart is now rename/copy */
pair_to_free = p;
diff --git a/dir.c b/dir.c
index 3f7a025..56106c9 100644
--- a/dir.c
+++ b/dir.c
@@ -12,6 +12,7 @@
#include "refs.h"
#include "wildmatch.h"
#include "pathspec.h"
+#include "utf8.h"
struct path_simplify {
int len;
@@ -377,6 +378,47 @@ int match_pathspec(const struct pathspec *ps,
return negative ? 0 : positive;
}
+int report_path_error(const char *ps_matched,
+ const struct pathspec *pathspec,
+ const char *prefix)
+{
+ /*
+ * Make sure all pathspec matched; otherwise it is an error.
+ */
+ int num, errors = 0;
+ for (num = 0; num < pathspec->nr; num++) {
+ int other, found_dup;
+
+ if (ps_matched[num])
+ continue;
+ /*
+ * The caller might have fed identical pathspec
+ * twice. Do not barf on such a mistake.
+ * FIXME: parse_pathspec should have eliminated
+ * duplicate pathspec.
+ */
+ for (found_dup = other = 0;
+ !found_dup && other < pathspec->nr;
+ other++) {
+ if (other == num || !ps_matched[other])
+ continue;
+ if (!strcmp(pathspec->items[other].original,
+ pathspec->items[num].original))
+ /*
+ * Ok, we have a match already.
+ */
+ found_dup = 1;
+ }
+ if (found_dup)
+ continue;
+
+ error("pathspec '%s' did not match any file(s) known to git.",
+ pathspec->items[num].original);
+ errors++;
+ }
+ return errors;
+}
+
/*
* Return the length of the "simple" part of a path match limiter.
*/
@@ -574,7 +616,12 @@ int add_excludes_from_file_to_list(const char *fname,
}
el->filebuf = buf;
+
+ if (skip_utf8_bom(&buf, size))
+ size -= buf - el->filebuf;
+
entry = buf;
+
for (i = 0; i < size; i++) {
if (buf[i] == '\n') {
if (entry != buf + i && entry[0] != '#') {
@@ -1622,18 +1669,19 @@ int remove_dir_recursively(struct strbuf *path, int flag)
void setup_standard_excludes(struct dir_struct *dir)
{
const char *path;
- char *xdg_path;
dir->exclude_per_dir = ".gitignore";
+
+ /* core.excludefile defaulting to $XDG_HOME/git/ignore */
+ if (!excludes_file)
+ excludes_file = xdg_config_home("ignore");
+ if (excludes_file && !access_or_warn(excludes_file, R_OK, 0))
+ add_excludes_from_file(dir, excludes_file);
+
+ /* per repository user preference */
path = git_path("info/exclude");
- if (!excludes_file) {
- home_config_paths(NULL, &xdg_path, "ignore");
- excludes_file = xdg_path;
- }
if (!access_or_warn(path, R_OK, 0))
add_excludes_from_file(dir, path);
- if (excludes_file && !access_or_warn(excludes_file, R_OK, 0))
- add_excludes_from_file(dir, excludes_file);
}
int remove_path(const char *name)
diff --git a/dir.h b/dir.h
index 6c45e9d..72b73c6 100644
--- a/dir.h
+++ b/dir.h
@@ -137,6 +137,7 @@ extern char *common_prefix(const struct pathspec *pathspec);
extern int match_pathspec(const struct pathspec *pathspec,
const char *name, int namelen,
int prefix, char *seen, int is_dir);
+extern int report_path_error(const char *ps_matched, const struct pathspec *pathspec, const char *prefix);
extern int within_depth(const char *name, int namelen, int depth, int max_depth);
extern int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec);
diff --git a/environment.c b/environment.c
index 1ade5c9..a40044c 100644
--- a/environment.c
+++ b/environment.c
@@ -24,6 +24,7 @@ int is_bare_repository_cfg = -1; /* unspecified */
int log_all_ref_updates = -1; /* unspecified */
int warn_ambiguous_refs = 1;
int warn_on_object_refname_ambiguity = 1;
+int ref_paranoia = -1;
int repository_format_version;
const char *git_commit_encoding;
const char *git_log_output_encoding;
diff --git a/ewah/ewok.h b/ewah/ewok.h
index f6ad190..13c6e20 100644
--- a/ewah/ewok.h
+++ b/ewah/ewok.h
@@ -47,7 +47,8 @@ static inline uint32_t ewah_bit_popcount64(uint64_t x)
return (x * 0x0101010101010101ULL) >> 56;
}
-#ifdef __GNUC__
+/* __builtin_ctzll was not available until 3.4.0 */
+#if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR > 3))
#define ewah_bit_ctz64(x) __builtin_ctzll(x)
#else
static inline int ewah_bit_ctz64(uint64_t x)
diff --git a/exec_cmd.c b/exec_cmd.c
index 8ab37b5..e85f0fd 100644
--- a/exec_cmd.c
+++ b/exec_cmd.c
@@ -96,7 +96,6 @@ void setup_path(void)
struct strbuf new_path = STRBUF_INIT;
add_path(&new_path, git_exec_path());
- add_path(&new_path, argv0_path);
if (old_path)
strbuf_addstr(&new_path, old_path);
diff --git a/fast-import.c b/fast-import.c
index d0bd285..e78ca10 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -947,9 +947,12 @@ static void unkeep_all_packs(void)
static void end_packfile(void)
{
- if (!pack_data)
+ static int running;
+
+ if (running || !pack_data)
return;
+ running = 1;
clear_delta_base_cache();
if (object_count) {
struct packed_git *new_p;
@@ -999,6 +1002,7 @@ static void end_packfile(void)
}
free(pack_data);
pack_data = NULL;
+ running = 0;
/* We can't carry a delta across packfiles. */
strbuf_release(&last_blob.data);
@@ -1058,7 +1062,6 @@ static int store_object(
} else
delta = NULL;
- memset(&s, 0, sizeof(s));
git_deflate_init(&s, pack_compression_level);
if (delta) {
s.next_in = delta;
@@ -1086,7 +1089,6 @@ static int store_object(
free(delta);
delta = NULL;
- memset(&s, 0, sizeof(s));
git_deflate_init(&s, pack_compression_level);
s.next_in = (void *)dat->buf;
s.avail_in = dat->len;
@@ -1186,7 +1188,6 @@ static void stream_blob(uintmax_t len, unsigned char *sha1out, uintmax_t mark)
crc32_begin(pack_file);
- memset(&s, 0, sizeof(s));
git_deflate_init(&s, pack_compression_level);
hdrlen = encode_in_pack_object_header(OBJ_BLOB, len, out_buf);
@@ -1716,7 +1717,7 @@ static int update_branch(struct branch *b)
transaction = ref_transaction_begin(&err);
if (!transaction ||
ref_transaction_update(transaction, b->name, b->sha1, old_sha1,
- 0, 1, msg, &err) ||
+ 0, msg, &err) ||
ref_transaction_commit(transaction, &err)) {
ref_transaction_free(transaction);
error("%s", err.buf);
@@ -1756,8 +1757,8 @@ static void dump_tags(void)
strbuf_reset(&ref_name);
strbuf_addf(&ref_name, "refs/tags/%s", t->name);
- if (ref_transaction_update(transaction, ref_name.buf, t->sha1,
- NULL, 0, 0, msg, &err)) {
+ if (ref_transaction_update(transaction, ref_name.buf,
+ t->sha1, NULL, 0, msg, &err)) {
failure |= error("%s", err.buf);
goto cleanup;
}
diff --git a/fetch-pack.c b/fetch-pack.c
index 655ee64..48526aa 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -544,16 +544,19 @@ static void filter_refs(struct fetch_pack_args *args,
/* Append unmatched requests to the list */
if (allow_tip_sha1_in_want) {
for (i = 0; i < nr_sought; i++) {
+ unsigned char sha1[20];
+
ref = sought[i];
if (ref->matched)
continue;
- if (get_sha1_hex(ref->name, ref->old_sha1))
+ if (get_sha1_hex(ref->name, sha1) ||
+ ref->name[40] != '\0' ||
+ hashcmp(sha1, ref->old_sha1))
continue;
ref->matched = 1;
- *newtail = ref;
- ref->next = NULL;
- newtail = &ref->next;
+ *newtail = copy_ref(ref);
+ newtail = &(*newtail)->next;
}
}
*refs = newlist;
@@ -625,7 +628,6 @@ static int everything_local(struct fetch_pack_args *args,
for (retval = 1, ref = *refs; ref ; ref = ref->next) {
const unsigned char *remote = ref->old_sha1;
- unsigned char local[20];
struct object *o;
o = lookup_object(remote);
@@ -638,8 +640,6 @@ static int everything_local(struct fetch_pack_args *args,
ref->name);
continue;
}
-
- hashcpy(ref->new_sha1, local);
if (!args->verbose)
continue;
fprintf(stderr,
diff --git a/gettext.c b/gettext.c
index 8b2da46..7378ba2 100644
--- a/gettext.c
+++ b/gettext.c
@@ -18,6 +18,31 @@
# endif
#endif
+/*
+ * Guess the user's preferred languages from the value in LANGUAGE environment
+ * variable and LC_MESSAGES locale category if NO_GETTEXT is not defined.
+ *
+ * The result can be a colon-separated list like "ko:ja:en".
+ */
+const char *get_preferred_languages(void)
+{
+ const char *retval;
+
+ retval = getenv("LANGUAGE");
+ if (retval && *retval)
+ return retval;
+
+#ifndef NO_GETTEXT
+ retval = setlocale(LC_MESSAGES, NULL);
+ if (retval && *retval &&
+ strcmp(retval, "C") &&
+ strcmp(retval, "POSIX"))
+ return retval;
+#endif
+
+ return NULL;
+}
+
#ifdef GETTEXT_POISON
int use_gettext_poison(void)
{
diff --git a/gettext.h b/gettext.h
index dc1722d..33696a4 100644
--- a/gettext.h
+++ b/gettext.h
@@ -89,4 +89,6 @@ const char *Q_(const char *msgid, const char *plu, unsigned long n)
#define N_(msgid) (msgid)
#endif
+const char *get_preferred_languages(void);
+
#endif
diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index c725674..77876d4 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -515,6 +515,9 @@ sub error_msg {
sub list_and_choose {
my ($opts, @stuff) = @_;
my (@chosen, @return);
+ if (!@stuff) {
+ return @return;
+ }
my $i;
my @prefixes = find_unique_prefixes(@stuff) unless $opts->{LIST_ONLY};
@@ -725,6 +728,8 @@ sub add_untracked_cmd {
if (@add) {
system(qw(git update-index --add --), @add);
say_n_paths('added', @add);
+ } else {
+ print "No untracked files.\n";
}
print "\n";
}
diff --git a/git-compat-util.h b/git-compat-util.h
index 68c07af..b45c75f 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -3,6 +3,23 @@
#define _FILE_OFFSET_BITS 64
+
+/* Derived from Linux "Features Test Macro" header
+ * Convenience macros to test the versions of gcc (or
+ * a compatible compiler).
+ * Use them like this:
+ * #if GIT_GNUC_PREREQ (2,8)
+ * ... code requiring gcc 2.8 or later ...
+ * #endif
+*/
+#if defined(__GNUC__) && defined(__GNUC_MINOR__)
+# define GIT_GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+#else
+ #define GIT_GNUC_PREREQ(maj, min) 0
+#endif
+
+
#ifndef FLEX_ARRAY
/*
* See if our compiler is known to support flexible array members.
@@ -25,7 +42,42 @@
#endif
#endif
-#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
+
+/*
+ * BUILD_ASSERT_OR_ZERO - assert a build-time dependency, as an expression.
+ * @cond: the compile-time condition which must be true.
+ *
+ * Your compile will fail if the condition isn't true, or can't be evaluated
+ * by the compiler. This can be used in an expression: its value is "0".
+ *
+ * Example:
+ * #define foo_to_char(foo) \
+ * ((char *)(foo) \
+ * + BUILD_ASSERT_OR_ZERO(offsetof(struct foo, string) == 0))
+ */
+#define BUILD_ASSERT_OR_ZERO(cond) \
+ (sizeof(char [1 - 2*!(cond)]) - 1)
+
+#if defined(__GNUC__) && (__GNUC__ >= 3)
+# if GIT_GNUC_PREREQ(3, 1)
+ /* &arr[0] degrades to a pointer: a different type from an array */
+# define BARF_UNLESS_AN_ARRAY(arr) \
+ BUILD_ASSERT_OR_ZERO(!__builtin_types_compatible_p(__typeof__(arr), \
+ __typeof__(&(arr)[0])))
+# else
+# define BARF_UNLESS_AN_ARRAY(arr) 0
+# endif
+#endif
+/*
+ * ARRAY_SIZE - get the number of elements in a visible array
+ * <at> x: the array whose size you want.
+ *
+ * This does not work on pointers, or arrays declared as [], or
+ * function parameters. With correct compiler support, such usage
+ * will cause a build error (see the build_assert_or_zero macro).
+ */
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]) + BARF_UNLESS_AN_ARRAY(x))
+
#define bitsizeof(x) (CHAR_BIT * sizeof(x))
#define maximum_signed_value_of_type(a) \
@@ -127,6 +179,9 @@
#else
#include <poll.h>
#endif
+#ifdef HAVE_BSD_SYSCTL
+#include <sys/sysctl.h>
+#endif
#if defined(__MINGW32__)
/* pull in Windows compatibility stuff */
@@ -164,16 +219,10 @@
typedef long intptr_t;
typedef unsigned long uintptr_t;
#endif
-#if defined(__CYGWIN__)
-#undef _XOPEN_SOURCE
-#include <grp.h>
-#define _XOPEN_SOURCE 600
-#else
#undef _ALL_SOURCE /* AIX 5.3L defines a struct list with _ALL_SOURCE. */
#include <grp.h>
#define _ALL_SOURCE 1
#endif
-#endif
/* used on Mac OS X */
#ifdef PRECOMPOSE_UNICODE
@@ -212,12 +261,15 @@ extern char *gitbasename(char *);
#endif
#ifndef NO_OPENSSL
+#ifdef __APPLE__
#define __AVAILABILITY_MACROS_USES_AVAILABILITY 0
-#define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_6
+#include <AvailabilityMacros.h>
+#undef DEPRECATED_ATTRIBUTE
+#define DEPRECATED_ATTRIBUTE
+#undef __AVAILABILITY_MACROS_USES_AVAILABILITY
+#endif
#include <openssl/ssl.h>
#include <openssl/err.h>
-#undef MAC_OS_X_VERSION_MIN_REQUIRED
-#undef __AVAILABILITY_MACROS_USES_AVAILABILITY
#ifdef NO_HMAC_CTX_CLEANUP
#define HMAC_CTX_cleanup HMAC_cleanup
#endif
@@ -691,7 +743,7 @@ static inline size_t xsize_t(off_t len)
}
/* in ctype.c, for kwset users */
-extern const char tolower_trans_tbl[256];
+extern const unsigned char tolower_trans_tbl[256];
/* Sane ctype - no locale, and works with signed chars */
#undef isascii
@@ -879,4 +931,8 @@ struct tm *git_gmtime_r(const time_t *, struct tm *);
#define USE_PARENS_AROUND_GETTEXT_N 1
#endif
+#ifndef SHELL_PATH
+# define SHELL_PATH "/bin/sh"
+#endif
+
#endif
diff --git a/git-filter-branch.sh b/git-filter-branch.sh
index e6e99f5..5b3f63d 100755
--- a/git-filter-branch.sh
+++ b/git-filter-branch.sh
@@ -346,7 +346,15 @@ while read commit parents; do
die "parent filter failed: $filter_parent"
fi
- sed -e '1,/^$/d' <../commit | \
+ {
+ while read -r header_line && test -n "$header_line"
+ do
+ # skip header lines...
+ :;
+ done
+ # and output the actual commit message
+ cat
+ } <../commit |
eval "$filter_msg" > ../message ||
die "msg filter failed: $filter_msg"
workdir=$workdir @SHELL_PATH@ -c "$filter_commit" "git commit-tree" \
diff --git a/git-gui/GIT-VERSION-GEN b/git-gui/GIT-VERSION-GEN
index a9ea218..a88b682 100755
--- a/git-gui/GIT-VERSION-GEN
+++ b/git-gui/GIT-VERSION-GEN
@@ -1,7 +1,7 @@
#!/bin/sh
GVF=GIT-VERSION-FILE
-DEF_VER=0.19.GITGUI
+DEF_VER=0.20.GITGUI
LF='
'
diff --git a/git-gui/Makefile b/git-gui/Makefile
index cde8b2e..4f00bdd 100644
--- a/git-gui/Makefile
+++ b/git-gui/Makefile
@@ -177,7 +177,8 @@ git-gui: GIT-VERSION-FILE GIT-GUI-VARS
echo then >>$@+ && \
echo ' 'echo \'git-gui version '$(GITGUI_VERSION)'\' >>$@+ && \
echo else >>$@+ && \
- echo ' 'exec \''$(libdir_SQ)/Git Gui.app/Contents/MacOS/$(subst \,,$(TKEXECUTABLE))'\' \
+ echo ' libdir="$${GIT_GUI_LIB_DIR:-$(libdir_SQ)}"' >>$@+ && \
+ echo ' 'exec \"'$$libdir/Git Gui.app/Contents/MacOS/$(subst \,,$(TKEXECUTABLE))'\" \
'"$$0" "$$@"' >>$@+ && \
echo fi >>$@+ && \
chmod +x $@+ && \
diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh
index b186329..11048c7 100755
--- a/git-gui/git-gui.sh
+++ b/git-gui/git-gui.sh
@@ -49,7 +49,11 @@ catch {rename send {}} ; # What an evil concept...
##
## locate our library
-set oguilib {@@GITGUI_LIBDIR@@}
+if { [info exists ::env(GIT_GUI_LIB_DIR) ] } {
+ set oguilib $::env(GIT_GUI_LIB_DIR)
+} else {
+ set oguilib {@@GITGUI_LIBDIR@@}
+}
set oguirel {@@GITGUI_RELATIVE@@}
if {$oguirel eq {1}} {
set oguilib [file dirname [file normalize $argv0]]
@@ -79,9 +83,9 @@ if {![catch {set _verbose $env(GITGUI_VERBOSE)}]} {
return [uplevel 1 real__auto_load $name $args]
}
rename source real__source
- proc source {name} {
- puts stderr "source $name"
- uplevel 1 real__source $name
+ proc source {args} {
+ puts stderr "source $args"
+ uplevel 1 [linsert $args 0 real__source]
}
if {[tk windowingsystem] eq "win32"} { console show }
}
@@ -666,9 +670,7 @@ proc kill_file_process {fd} {
catch {
if {[is_Windows]} {
- # Use a Cygwin-specific flag to allow killing
- # native Windows processes
- exec kill -f $process
+ exec taskkill /pid $process
} else {
exec kill $process
}
@@ -908,6 +910,7 @@ set default_config(gui.fontdiff) [font configure font_diff]
set default_config(gui.maxfilesdisplayed) 5000
set default_config(gui.usettk) 1
set default_config(gui.warndetachedcommit) 1
+set default_config(gui.tabsize) 8
set font_descs {
{fontui font_ui {mc "Main Font"}}
{fontdiff font_diff {mc "Diff/Console Font"}}
@@ -1283,7 +1286,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 vcompare $_git_version 1.7.0] >= 0} {
if { [is_Cygwin] } {
catch {set _gitworktree [exec cygpath --windows [git rev-parse --show-toplevel]]}
} else {
@@ -1539,7 +1542,7 @@ proc rescan_stage2 {fd after} {
close $fd
}
- if {[package vsatisfies $::_git_version 1.6.3-]} {
+ if {[package vcompare $::_git_version 1.6.3] >= 0} {
set ls_others [list --exclude-standard]
} else {
set ls_others [list --exclude-per-directory=.gitignore]
@@ -1962,20 +1965,22 @@ proc display_all_files {} {
set to_display [lsort [array names file_states]]
set display_limit [get_config gui.maxfilesdisplayed]
- if {[llength $to_display] > $display_limit} {
- if {!$files_warning} {
- # do not repeatedly warn:
- set files_warning 1
- info_popup [mc "Displaying only %s of %s files." \
- $display_limit [llength $to_display]]
- }
- set to_display [lrange $to_display 0 [expr {$display_limit-1}]]
- }
+ set displayed 0
foreach path $to_display {
set s $file_states($path)
set m [lindex $s 0]
set icon_name [lindex $s 1]
+ if {$displayed > $display_limit && [string index $m 1] eq {O} } {
+ if {!$files_warning} {
+ # do not repeatedly warn:
+ set files_warning 1
+ info_popup [mc "Display limit (gui.maxfilesdisplayed = %s) reached, not showing all %s files." \
+ $display_limit [llength $to_display]]
+ }
+ continue
+ }
+
set s [string index $m 0]
if {$s ne {U} && $s ne {_}} {
display_all_files_helper $ui_index $path \
@@ -1990,6 +1995,7 @@ proc display_all_files {} {
if {$s ne {_}} {
display_all_files_helper $ui_workdir $path \
$icon_name $s
+ incr displayed
}
}
diff --git a/git-gui/lib/choose_repository.tcl b/git-gui/lib/choose_repository.tcl
index 3c10bc6..75d1da8 100644
--- a/git-gui/lib/choose_repository.tcl
+++ b/git-gui/lib/choose_repository.tcl
@@ -18,6 +18,7 @@ field local_path {} ; # Where this repository is locally
field origin_url {} ; # Where we are cloning from
field origin_name origin ; # What we shall call 'origin'
field clone_type hardlink ; # Type of clone to construct
+field recursive true ; # Recursive cloning flag
field readtree_err ; # Error output from read-tree (if any)
field sorted_recent ; # recent repositories (sorted)
@@ -337,16 +338,31 @@ method _git_init {} {
return 1
}
-proc _is_git {path} {
+proc _is_git {path {outdir_var ""}} {
+ if {$outdir_var ne ""} {
+ upvar 1 $outdir_var outdir
+ }
+ if {[file isfile $path]} {
+ set fp [open $path r]
+ gets $fp line
+ close $fp
+ if {[regexp "^gitdir: (.+)$" $line line link_target]} {
+ set path [file join [file dirname $path] $link_target]
+ set path [file normalize $path]
+ }
+ }
+
if {[file exists [file join $path HEAD]]
&& [file exists [file join $path objects]]
&& [file exists [file join $path config]]} {
+ set outdir $path
return 1
}
if {[is_Cygwin]} {
if {[file exists [file join $path HEAD]]
&& [file exists [file join $path objects.lnk]]
&& [file exists [file join $path config.lnk]]} {
+ set outdir $path
return 1
}
}
@@ -525,6 +541,11 @@ method _do_clone {} {
foreach r $w_types {
pack $r -anchor w
}
+ ${NS}::checkbutton $args.type_f.recursive \
+ -text [mc "Recursively clone submodules too"] \
+ -variable @recursive \
+ -onvalue true -offvalue false
+ pack $args.type_f.recursive -anchor w
grid $args.type_l $args.type_f -sticky new
grid columnconfigure $args 1 -weight 1
@@ -952,6 +973,30 @@ method _do_clone_checkout {HEAD} {
fileevent $fd readable [cb _readtree_wait $fd]
}
+method _do_validate_submodule_cloning {ok} {
+ if {$ok} {
+ $o_cons done $ok
+ set done 1
+ } else {
+ _clone_failed $this [mc "Cannot clone submodules."]
+ }
+}
+
+method _do_clone_submodules {} {
+ if {$recursive eq {true}} {
+ destroy $w_body
+ set o_cons [console::embed \
+ $w_body \
+ [mc "Cloning submodules"]]
+ pack $w_body -fill both -expand 1 -padx 10
+ $o_cons exec \
+ [list git submodule update --init --recursive] \
+ [cb _do_validate_submodule_cloning]
+ } else {
+ set done 1
+ }
+}
+
method _readtree_wait {fd} {
set buf [read $fd]
$o_cons update_meter $buf
@@ -982,7 +1027,7 @@ method _readtree_wait {fd} {
fconfigure $fd_ph -blocking 0 -translation binary -eofchar {}
fileevent $fd_ph readable [cb _postcheckout_wait $fd_ph]
} else {
- set done 1
+ _do_clone_submodules $this
}
}
@@ -996,7 +1041,7 @@ method _postcheckout_wait {fd_ph} {
hook_failed_popup post-checkout $pch_error 0
}
unset pch_error
- set done 1
+ _do_clone_submodules $this
return
}
fconfigure $fd_ph -blocking 0
@@ -1063,7 +1108,7 @@ method _open_local_path {} {
}
method _do_open2 {} {
- if {![_is_git [file join $local_path .git]]} {
+ if {![_is_git [file join $local_path .git] actualgit]} {
error_popup [mc "Not a Git repository: %s" [file tail $local_path]]
return
}
@@ -1076,7 +1121,7 @@ method _do_open2 {} {
}
_append_recentrepos [pwd]
- set ::_gitdir .git
+ set ::_gitdir $actualgit
set ::_prefix {}
set done 1
}
diff --git a/git-gui/lib/diff.tcl b/git-gui/lib/diff.tcl
index b0a5180..0d56986 100644
--- a/git-gui/lib/diff.tcl
+++ b/git-gui/lib/diff.tcl
@@ -1,6 +1,19 @@
# git-gui diff viewer
# Copyright (C) 2006, 2007 Shawn Pearce
+proc apply_tab_size {{firsttab {}}} {
+ global have_tk85 repo_config ui_diff
+
+ set w [font measure font_diff "0"]
+ if {$have_tk85 && $firsttab != 0} {
+ $ui_diff configure -tabs [list [expr {$firsttab * $w}] [expr {($firsttab + $repo_config(gui.tabsize)) * $w}]]
+ } elseif {$have_tk85 || $repo_config(gui.tabsize) != 8} {
+ $ui_diff configure -tabs [expr {$repo_config(gui.tabsize) * $w}]
+ } else {
+ $ui_diff configure -tabs {}
+ }
+}
+
proc clear_diff {} {
global ui_diff current_diff_path current_diff_header
global ui_index ui_workdir
@@ -105,6 +118,8 @@ proc show_diff {path w {lno {}} {scroll_pos {}} {callback {}}} {
set cont_info [list $scroll_pos $callback]
+ apply_tab_size 0
+
if {[string first {U} $m] >= 0} {
merge_load_stages $path [list show_unmerged_diff $cont_info]
} elseif {$m eq {_O}} {
@@ -401,7 +416,10 @@ proc read_diff {fd conflict_size cont_info} {
# -- Automatically detect if this is a 3 way diff.
#
- if {[string match {@@@ *} $line]} {set is_3way_diff 1}
+ if {[string match {@@@ *} $line]} {
+ set is_3way_diff 1
+ apply_tab_size 1
+ }
if {$::current_diff_inheader} {
diff --git a/git-gui/lib/option.tcl b/git-gui/lib/option.tcl
index 23c9ae7..b5b6b2f 100644
--- a/git-gui/lib/option.tcl
+++ b/git-gui/lib/option.tcl
@@ -161,6 +161,7 @@ proc do_options {} {
{b gui.warndetachedcommit {mc "Warn before committing to a detached head"}}
{s gui.stageuntracked {mc "Staging of untracked files"} {list "yes" "no" "ask"}}
{b gui.displayuntracked {mc "Show untracked files"}}
+ {i-1..99 gui.tabsize {mc "Tab spacing"}}
} {
set type [lindex $option 0]
set name [lindex $option 1]
diff --git a/git-gui/macosx/AppMain.tcl b/git-gui/macosx/AppMain.tcl
index 738bdd0..b6c6dc3 100644
--- a/git-gui/macosx/AppMain.tcl
+++ b/git-gui/macosx/AppMain.tcl
@@ -1,5 +1,10 @@
set gitexecdir {@@gitexecdir@@}
-set gitguilib {@@GITGUI_LIBDIR@@}
+if { [info exists ::env(GIT_GUI_LIB_DIR) ] } {
+ set gitguilib $::env(GIT_GUI_LIB_DIR)
+} else {
+ set gitguilib {@@GITGUI_LIBDIR@@}
+}
+
set env(PATH) "$gitexecdir:$env(PATH)"
if {[string first -psn [lindex $argv 0]] == 0} {
diff --git a/git-gui/po/bg.po b/git-gui/po/bg.po
index 89b3a4e..4d9b039 100644
--- a/git-gui/po/bg.po
+++ b/git-gui/po/bg.po
@@ -1,15 +1,15 @@
# Bulgarian translation of git-gui po-file.
-# Copyright (C) 2012, 2013, 2014 Alexander Shopov <ash@kambanaria.org>.
+# Copyright (C) 2012, 2013, 2014, 2015 Alexander Shopov <ash@kambanaria.org>.
# This file is distributed under the same license as the git package.
-# Alexander Shopov <ash@kambanaria.org>, 2012, 2013, 2014.
+# Alexander Shopov <ash@kambanaria.org>, 2012, 2013, 2014, 2015.
#
#
msgid ""
msgstr ""
"Project-Id-Version: git-gui master\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-01-13 20:45+0200\n"
-"PO-Revision-Date: 2014-01-13 21:31+0200\n"
+"POT-Creation-Date: 2015-04-07 07:37+0300\n"
+"PO-Revision-Date: 2015-04-07 07:46+0300\n"
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
"Language: bg\n"
@@ -18,33 +18,33 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: git-gui.sh:859
+#: git-gui.sh:861
#, tcl-format
msgid "Invalid font specified in %s:"
-msgstr "Указан е неправилен шрифт в %s:"
+msgstr "Указан е неправилен шрифт в „%s“:"
-#: git-gui.sh:912
+#: git-gui.sh:915
msgid "Main Font"
msgstr "Основен шрифт"
-#: git-gui.sh:913
+#: git-gui.sh:916
msgid "Diff/Console Font"
msgstr "Шрифт за разликите/конзолата"
-#: git-gui.sh:928 git-gui.sh:942 git-gui.sh:955 git-gui.sh:1045
-#: git-gui.sh:1064 git-gui.sh:3115
+#: git-gui.sh:931 git-gui.sh:945 git-gui.sh:958 git-gui.sh:1048
+#: git-gui.sh:1067 git-gui.sh:3125
msgid "git-gui: fatal error"
msgstr "git-gui: фатална грешка"
-#: git-gui.sh:929
+#: git-gui.sh:932
msgid "Cannot find git in PATH."
msgstr "Командата git липсва в пътя (PATH)."
-#: git-gui.sh:956
+#: git-gui.sh:959
msgid "Cannot parse Git version string:"
msgstr "Низът с версията на Git не може да бъде интерпретиран:"
-#: git-gui.sh:981
+#: git-gui.sh:984
#, tcl-format
msgid ""
"Git version cannot be determined.\n"
@@ -57,504 +57,509 @@ msgid ""
msgstr ""
"Версията на Git не може да бъде определена.\n"
"\n"
-"Версията на %s изглежда, че е „%s“.\n"
+"Версията на „%s“ изглежда, че е „%s“.\n"
"\n"
-"%s изисква Git, версия поне 1.5.0.\n"
+"„%s“ изисква Git, версия поне 1.5.0.\n"
"\n"
-"Да се приеме ли, че „%s“ е версия 1.5.0?\n"
+"Да се приеме ли, че „%s“ е версия „1.5.0“?\n"
-#: git-gui.sh:1278
+#: git-gui.sh:1281
msgid "Git directory not found:"
msgstr "Директорията на Git не е открита:"
-#: git-gui.sh:1312
+#: git-gui.sh:1315
msgid "Cannot move to top of working directory:"
msgstr "Не може да се премине към родителската директория."
-#: git-gui.sh:1320
+#: git-gui.sh:1323
msgid "Cannot use bare repository:"
msgstr "Голо хранилище не може да се използва:"
-#: git-gui.sh:1328
+#: git-gui.sh:1331
msgid "No working directory"
msgstr "Работната директория липсва"
-#: git-gui.sh:1500 lib/checkout_op.tcl:306
+#: git-gui.sh:1503 lib/checkout_op.tcl:306
msgid "Refreshing file status..."
msgstr "Обновяване на състоянието на файла…"
-#: git-gui.sh:1560
+#: git-gui.sh:1563
msgid "Scanning for modified files ..."
msgstr "Проверка за променени файлове…"
-#: git-gui.sh:1632
+#: git-gui.sh:1639
msgid "Calling prepare-commit-msg hook..."
-msgstr "Куката prepare-commit-msg се изпълнява в момента…"
+msgstr "Куката „prepare-commit-msg“ се изпълнява в момента…"
-#: git-gui.sh:1649
+#: git-gui.sh:1656
msgid "Commit declined by prepare-commit-msg hook."
-msgstr "Подаването е отхвърлено от куката prepare-commit-msg."
+msgstr "Подаването е отхвърлено от куката „prepare-commit-msg“."
-#: git-gui.sh:1807 lib/browser.tcl:252
+#: git-gui.sh:1814 lib/browser.tcl:252
msgid "Ready."
msgstr "Готово."
-#: git-gui.sh:1965
+#: git-gui.sh:1978
#, tcl-format
-msgid "Displaying only %s of %s files."
-msgstr "Показване на само %s от %s файла."
+msgid ""
+"Display limit (gui.maxfilesdisplayed = %s) reached, not showing all %s files."
+msgstr ""
+"Достигнат е максималният брой файлове за показване (gui.maxfilesdisplayed = "
+"%s). Файловете са общо %s."
-#: git-gui.sh:2091
+#: git-gui.sh:2101
msgid "Unmodified"
msgstr "Непроменен"
-#: git-gui.sh:2093
+#: git-gui.sh:2103
msgid "Modified, not staged"
msgstr "Променен, но не е в индекса"
-#: git-gui.sh:2094 git-gui.sh:2106
+#: git-gui.sh:2104 git-gui.sh:2116
msgid "Staged for commit"
msgstr "В индекса за подаване"
-#: git-gui.sh:2095 git-gui.sh:2107
+#: git-gui.sh:2105 git-gui.sh:2117
msgid "Portions staged for commit"
msgstr "Части са в индекса за подаване"
-#: git-gui.sh:2096 git-gui.sh:2108
+#: git-gui.sh:2106 git-gui.sh:2118
msgid "Staged for commit, missing"
msgstr "В индекса за подаване, но липсва"
-#: git-gui.sh:2098
+#: git-gui.sh:2108
msgid "File type changed, not staged"
msgstr "Видът на файла е сменен, но не е в индекса"
-#: git-gui.sh:2099 git-gui.sh:2100
+#: git-gui.sh:2109 git-gui.sh:2110
msgid "File type changed, old type staged for commit"
-msgstr "Видът на файла е сменен, в индекса е старият"
+msgstr "Видът на файла е сменен, но в индекса е все още старият"
-#: git-gui.sh:2101
+#: git-gui.sh:2111
msgid "File type changed, staged"
msgstr "Видът на файла е сменен и е в индекса"
-#: git-gui.sh:2102
+#: git-gui.sh:2112
msgid "File type change staged, modification not staged"
-msgstr "Видът на файла е сменен, промяната не е в индекса"
+msgstr "Видът на файла е сменен, но промяната не е в индекса"
-#: git-gui.sh:2103
+#: git-gui.sh:2113
msgid "File type change staged, file missing"
msgstr "Видът на файла е сменен, файлът липсва"
-#: git-gui.sh:2105
+#: git-gui.sh:2115
msgid "Untracked, not staged"
msgstr "Неследен"
-#: git-gui.sh:2110
+#: git-gui.sh:2120
msgid "Missing"
msgstr "Липсващ"
-#: git-gui.sh:2111
+#: git-gui.sh:2121
msgid "Staged for removal"
msgstr "В индекса за изтриване"
-#: git-gui.sh:2112
+#: git-gui.sh:2122
msgid "Staged for removal, still present"
msgstr "В индекса за изтриване, но още го има"
-#: git-gui.sh:2114 git-gui.sh:2115 git-gui.sh:2116 git-gui.sh:2117
-#: git-gui.sh:2118 git-gui.sh:2119
+#: git-gui.sh:2124 git-gui.sh:2125 git-gui.sh:2126 git-gui.sh:2127
+#: git-gui.sh:2128 git-gui.sh:2129
msgid "Requires merge resolution"
msgstr "Изисква коригиране при сливане"
-#: git-gui.sh:2154
+#: git-gui.sh:2164
msgid "Starting gitk... please wait..."
-msgstr "Стартиране на gitk…, изчакайте…"
+msgstr "Стартиране на „gitk“…, изчакайте…"
-#: git-gui.sh:2166
+#: git-gui.sh:2176
msgid "Couldn't find gitk in PATH"
-msgstr "В пътищата, определени от променливата PATH, липсва изпълним gitk"
+msgstr "Командата „gitk“ липсва в пътищата, определени от променливата PATH."
-#: git-gui.sh:2225
+#: git-gui.sh:2235
msgid "Couldn't find git gui in PATH"
-msgstr "В пътищата, определени от променливата PATH, липсва изпълним git gui"
+msgstr ""
+"Командата „git gui“ липсва в пътищата, определени от променливата PATH."
-#: git-gui.sh:2644 lib/choose_repository.tcl:40
+#: git-gui.sh:2654 lib/choose_repository.tcl:41
msgid "Repository"
msgstr "Хранилище"
-#: git-gui.sh:2645
+#: git-gui.sh:2655
msgid "Edit"
msgstr "Редактиране"
-#: git-gui.sh:2647 lib/choose_rev.tcl:567
+#: git-gui.sh:2657 lib/choose_rev.tcl:567
msgid "Branch"
msgstr "Клон"
-#: git-gui.sh:2650 lib/choose_rev.tcl:554
+#: git-gui.sh:2660 lib/choose_rev.tcl:554
msgid "Commit@@noun"
msgstr "Подаване"
-#: git-gui.sh:2653 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170
+#: git-gui.sh:2663 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170
msgid "Merge"
msgstr "Сливане"
-#: git-gui.sh:2654 lib/choose_rev.tcl:563
+#: git-gui.sh:2664 lib/choose_rev.tcl:563
msgid "Remote"
msgstr "Отдалечено хранилище"
-#: git-gui.sh:2657
+#: git-gui.sh:2667
msgid "Tools"
msgstr "Команди"
-#: git-gui.sh:2666
+#: git-gui.sh:2676
msgid "Explore Working Copy"
msgstr "Разглеждане на работното копие"
-#: git-gui.sh:2672
+#: git-gui.sh:2682
msgid "Git Bash"
-msgstr "Bash на Git"
+msgstr "Bash за Git"
-#: git-gui.sh:2682
+#: git-gui.sh:2692
msgid "Browse Current Branch's Files"
msgstr "Разглеждане на файловете в текущия клон"
-#: git-gui.sh:2686
+#: git-gui.sh:2696
msgid "Browse Branch Files..."
-msgstr "Разглеждане на текущия клон"
+msgstr "Разглеждане на текущия клон…"
-#: git-gui.sh:2691
+#: git-gui.sh:2701
msgid "Visualize Current Branch's History"
msgstr "Визуализация на историята на текущия клон"
-#: git-gui.sh:2695
+#: git-gui.sh:2705
msgid "Visualize All Branch History"
msgstr "Визуализация на историята на всички клонове"
-#: git-gui.sh:2702
+#: git-gui.sh:2712
#, tcl-format
msgid "Browse %s's Files"
msgstr "Разглеждане на файловете в %s"
-#: git-gui.sh:2704
+#: git-gui.sh:2714
#, tcl-format
msgid "Visualize %s's History"
msgstr "Визуализация на историята на %s"
-#: git-gui.sh:2709 lib/database.tcl:40 lib/database.tcl:66
+#: git-gui.sh:2719 lib/database.tcl:40 lib/database.tcl:66
msgid "Database Statistics"
msgstr "Статистика на базата от данни"
-#: git-gui.sh:2712 lib/database.tcl:33
+#: git-gui.sh:2722 lib/database.tcl:33
msgid "Compress Database"
msgstr "Компресиране на базата от данни"
-#: git-gui.sh:2715
+#: git-gui.sh:2725
msgid "Verify Database"
msgstr "Проверка на базата от данни"
-#: git-gui.sh:2722 git-gui.sh:2726 git-gui.sh:2730 lib/shortcut.tcl:8
+#: git-gui.sh:2732 git-gui.sh:2736 git-gui.sh:2740 lib/shortcut.tcl:8
#: lib/shortcut.tcl:40 lib/shortcut.tcl:72
msgid "Create Desktop Icon"
msgstr "Добавяне на икона на работния плот"
-#: git-gui.sh:2738 lib/choose_repository.tcl:192 lib/choose_repository.tcl:200
+#: git-gui.sh:2748 lib/choose_repository.tcl:193 lib/choose_repository.tcl:201
msgid "Quit"
msgstr "Спиране на програмата"
-#: git-gui.sh:2746
+#: git-gui.sh:2756
msgid "Undo"
msgstr "Отмяна"
-#: git-gui.sh:2749
+#: git-gui.sh:2759
msgid "Redo"
msgstr "Повторение"
-#: git-gui.sh:2753 git-gui.sh:3348
+#: git-gui.sh:2763 git-gui.sh:3368
msgid "Cut"
msgstr "Отрязване"
-#: git-gui.sh:2756 git-gui.sh:3351 git-gui.sh:3425 git-gui.sh:3510
+#: git-gui.sh:2766 git-gui.sh:3371 git-gui.sh:3445 git-gui.sh:3530
#: lib/console.tcl:69
msgid "Copy"
msgstr "Копиране"
-#: git-gui.sh:2759 git-gui.sh:3354
+#: git-gui.sh:2769 git-gui.sh:3374
msgid "Paste"
msgstr "Поставяне"
-#: git-gui.sh:2762 git-gui.sh:3357 lib/remote_branch_delete.tcl:39
+#: git-gui.sh:2772 git-gui.sh:3377 lib/remote_branch_delete.tcl:39
#: lib/branch_delete.tcl:28
msgid "Delete"
msgstr "Изтриване"
-#: git-gui.sh:2766 git-gui.sh:3361 git-gui.sh:3514 lib/console.tcl:71
+#: git-gui.sh:2776 git-gui.sh:3381 git-gui.sh:3534 lib/console.tcl:71
msgid "Select All"
msgstr "Избиране на всичко"
-#: git-gui.sh:2775
+#: git-gui.sh:2785
msgid "Create..."
msgstr "Създаване…"
-#: git-gui.sh:2781
+#: git-gui.sh:2791
msgid "Checkout..."
msgstr "Изтегляне…"
-#: git-gui.sh:2787
+#: git-gui.sh:2797
msgid "Rename..."
msgstr "Преименуване…"
-#: git-gui.sh:2792
+#: git-gui.sh:2802
msgid "Delete..."
msgstr "Изтриване…"
-#: git-gui.sh:2797
+#: git-gui.sh:2807
msgid "Reset..."
msgstr "Отмяна на промените…"
-#: git-gui.sh:2807
+#: git-gui.sh:2817
msgid "Done"
msgstr "Готово"
-#: git-gui.sh:2809
+#: git-gui.sh:2819
msgid "Commit@@verb"
msgstr "Подаване"
-#: git-gui.sh:2818 git-gui.sh:3289
+#: git-gui.sh:2828 git-gui.sh:3309
msgid "New Commit"
-msgstr "Подаване"
+msgstr "Ново подаване"
-#: git-gui.sh:2826 git-gui.sh:3296
+#: git-gui.sh:2836 git-gui.sh:3316
msgid "Amend Last Commit"
msgstr "Поправяне на последното подаване"
-#: git-gui.sh:2836 git-gui.sh:3250 lib/remote_branch_delete.tcl:101
+#: git-gui.sh:2846 git-gui.sh:3270 lib/remote_branch_delete.tcl:101
msgid "Rescan"
msgstr "Обновяване"
-#: git-gui.sh:2842
+#: git-gui.sh:2852
msgid "Stage To Commit"
msgstr "Към индекса за подаване"
-#: git-gui.sh:2848
+#: git-gui.sh:2858
msgid "Stage Changed Files To Commit"
msgstr "Всички променени файлове към индекса за подаване"
-#: git-gui.sh:2854
+#: git-gui.sh:2864
msgid "Unstage From Commit"
msgstr "Изваждане от индекса за подаване"
-#: git-gui.sh:2860 lib/index.tcl:442
+#: git-gui.sh:2870 lib/index.tcl:442
msgid "Revert Changes"
msgstr "Връщане на оригинала"
-#: git-gui.sh:2868 git-gui.sh:3561 git-gui.sh:3592
+#: git-gui.sh:2878 git-gui.sh:3581 git-gui.sh:3612
msgid "Show Less Context"
msgstr "По-малко контекст"
-#: git-gui.sh:2872 git-gui.sh:3565 git-gui.sh:3596
+#: git-gui.sh:2882 git-gui.sh:3585 git-gui.sh:3616
msgid "Show More Context"
msgstr "Повече контекст"
-#: git-gui.sh:2879 git-gui.sh:3263 git-gui.sh:3372
+#: git-gui.sh:2889 git-gui.sh:3283 git-gui.sh:3392
msgid "Sign Off"
msgstr "Подписване"
-#: git-gui.sh:2895
+#: git-gui.sh:2905
msgid "Local Merge..."
msgstr "Локално сливане…"
-#: git-gui.sh:2900
+#: git-gui.sh:2910
msgid "Abort Merge..."
msgstr "Преустановяване на сливане…"
-#: git-gui.sh:2912 git-gui.sh:2940
+#: git-gui.sh:2922 git-gui.sh:2950
msgid "Add..."
msgstr "Добавяне…"
-#: git-gui.sh:2916
+#: git-gui.sh:2926
msgid "Push..."
msgstr "Избутване…"
-#: git-gui.sh:2920
+#: git-gui.sh:2930
msgid "Delete Branch..."
msgstr "Изтриване на клон…"
-#: git-gui.sh:2930 git-gui.sh:3543
+#: git-gui.sh:2940 git-gui.sh:3563
msgid "Options..."
msgstr "Опции…"
-#: git-gui.sh:2941
+#: git-gui.sh:2951
msgid "Remove..."
msgstr "Премахване…"
-#: git-gui.sh:2950 lib/choose_repository.tcl:54
+#: git-gui.sh:2960 lib/choose_repository.tcl:55
msgid "Help"
msgstr "Помощ"
-#: git-gui.sh:2954 git-gui.sh:2958 lib/choose_repository.tcl:48
-#: lib/choose_repository.tcl:57 lib/about.tcl:14
+#: git-gui.sh:2964 git-gui.sh:2968 lib/choose_repository.tcl:49
+#: lib/choose_repository.tcl:58 lib/about.tcl:14
#, tcl-format
msgid "About %s"
msgstr "Относно %s"
-#: git-gui.sh:2982
+#: git-gui.sh:2992
msgid "Online Documentation"
msgstr "Документация в Интернет"
-#: git-gui.sh:2985 lib/choose_repository.tcl:51 lib/choose_repository.tcl:60
+#: git-gui.sh:2995 lib/choose_repository.tcl:52 lib/choose_repository.tcl:61
msgid "Show SSH Key"
msgstr "Показване на ключа за SSH"
-#: git-gui.sh:3004 git-gui.sh:3136
+#: git-gui.sh:3014 git-gui.sh:3146
msgid "Usage"
msgstr "Употреба"
-#: git-gui.sh:3085 lib/blame.tcl:573
+#: git-gui.sh:3095 lib/blame.tcl:573
msgid "Error"
msgstr "Грешка"
-#: git-gui.sh:3116
+#: git-gui.sh:3126
#, tcl-format
msgid "fatal: cannot stat path %s: No such file or directory"
msgstr ""
-"фатално: пътят %s не може да бъде открит: такъв файл или директория няма"
+"ФАТАЛНА ГРЕШКА: пътят %s не може да бъде открит: такъв файл или директория "
+"няма"
-#: git-gui.sh:3149
+#: git-gui.sh:3159
msgid "Current Branch:"
msgstr "Текущ клон:"
-#: git-gui.sh:3175
+#: git-gui.sh:3185
msgid "Staged Changes (Will Commit)"
msgstr "Промени в индекса (за подаване)"
-#: git-gui.sh:3195
+#: git-gui.sh:3205
msgid "Unstaged Changes"
msgstr "Промени извън индекса"
-#: git-gui.sh:3256
+#: git-gui.sh:3276
msgid "Stage Changed"
msgstr "Индексът е променен"
-#: git-gui.sh:3275 lib/transport.tcl:137 lib/transport.tcl:229
+#: git-gui.sh:3295 lib/transport.tcl:137 lib/transport.tcl:229
msgid "Push"
msgstr "Изтласкване"
-#: git-gui.sh:3310
+#: git-gui.sh:3330
msgid "Initial Commit Message:"
msgstr "Първоначално съобщение при подаване:"
-#: git-gui.sh:3311
+#: git-gui.sh:3331
msgid "Amended Commit Message:"
msgstr "Поправено съобщение при подаване:"
-#: git-gui.sh:3312
+#: git-gui.sh:3332
msgid "Amended Initial Commit Message:"
msgstr "Поправено първоначално съобщение при подаване:"
-#: git-gui.sh:3313
+#: git-gui.sh:3333
msgid "Amended Merge Commit Message:"
msgstr "Поправено съобщение при подаване със сливане:"
-#: git-gui.sh:3314
+#: git-gui.sh:3334
msgid "Merge Commit Message:"
msgstr "Съобщение при подаване със сливане:"
-#: git-gui.sh:3315
+#: git-gui.sh:3335
msgid "Commit Message:"
msgstr "Съобщение при подаване:"
-#: git-gui.sh:3364 git-gui.sh:3518 lib/console.tcl:73
+#: git-gui.sh:3384 git-gui.sh:3538 lib/console.tcl:73
msgid "Copy All"
msgstr "Копиране на всичко"
-#: git-gui.sh:3388 lib/blame.tcl:105
+#: git-gui.sh:3408 lib/blame.tcl:105
msgid "File:"
msgstr "Файл:"
-#: git-gui.sh:3506
+#: git-gui.sh:3526
msgid "Refresh"
msgstr "Обновяване"
-#: git-gui.sh:3527
+#: git-gui.sh:3547
msgid "Decrease Font Size"
msgstr "По-едър шрифт"
-#: git-gui.sh:3531
+#: git-gui.sh:3551
msgid "Increase Font Size"
msgstr "По-дребен шрифт"
-#: git-gui.sh:3539 lib/blame.tcl:294
+#: git-gui.sh:3559 lib/blame.tcl:294
msgid "Encoding"
msgstr "Кодиране"
-#: git-gui.sh:3550
+#: git-gui.sh:3570
msgid "Apply/Reverse Hunk"
msgstr "Прилагане/връщане на парче"
-#: git-gui.sh:3555
+#: git-gui.sh:3575
msgid "Apply/Reverse Line"
msgstr "Прилагане/връщане на ред"
-#: git-gui.sh:3574
+#: git-gui.sh:3594
msgid "Run Merge Tool"
msgstr "Изпълнение на програмата за сливане"
-#: git-gui.sh:3579
+#: git-gui.sh:3599
msgid "Use Remote Version"
msgstr "Версия от отдалеченото хранилище"
-#: git-gui.sh:3583
+#: git-gui.sh:3603
msgid "Use Local Version"
msgstr "Локална версия"
-#: git-gui.sh:3587
+#: git-gui.sh:3607
msgid "Revert To Base"
msgstr "Връщане към родителската версия"
-#: git-gui.sh:3605
+#: git-gui.sh:3625
msgid "Visualize These Changes In The Submodule"
msgstr "Визуализиране на промените в подмодула"
-#: git-gui.sh:3609
+#: git-gui.sh:3629
msgid "Visualize Current Branch History In The Submodule"
msgstr "Визуализация на историята на текущия клон в историята за подмодула"
-#: git-gui.sh:3613
+#: git-gui.sh:3633
msgid "Visualize All Branch History In The Submodule"
msgstr "Визуализация на историята на всички клони в историята за подмодула"
-#: git-gui.sh:3618
+#: git-gui.sh:3638
msgid "Start git gui In The Submodule"
msgstr "Стартиране на „git gui“ за подмодула"
-#: git-gui.sh:3653
+#: git-gui.sh:3673
msgid "Unstage Hunk From Commit"
msgstr "Изваждане на парчето от подаването"
-#: git-gui.sh:3655
+#: git-gui.sh:3675
msgid "Unstage Lines From Commit"
msgstr "Изваждане на редовете от подаването"
-#: git-gui.sh:3657
+#: git-gui.sh:3677
msgid "Unstage Line From Commit"
msgstr "Изваждане на реда от подаването"
-#: git-gui.sh:3660
+#: git-gui.sh:3680
msgid "Stage Hunk For Commit"
msgstr "Добавяне на парчето за подаване"
-#: git-gui.sh:3662
+#: git-gui.sh:3682
msgid "Stage Lines For Commit"
msgstr "Добавяне на редовете за подаване"
-#: git-gui.sh:3664
+#: git-gui.sh:3684
msgid "Stage Line For Commit"
msgstr "Добавяне на реда за подаване"
-#: git-gui.sh:3689
+#: git-gui.sh:3709
msgid "Initializing..."
msgstr "Инициализиране…"
-#: git-gui.sh:3832
+#: git-gui.sh:3852
#, tcl-format
msgid ""
"Possible environment issues exist.\n"
@@ -567,11 +572,11 @@ msgstr ""
"Възможно е да има проблем със средата.\n"
"\n"
"Най-вероятно следните променливи няма да бъдат\n"
-"взети под внимание от подпроцесите Git изпълнени\n"
+"взети под внимание от подпроцесите на Git\n"
"от %s:\n"
"\n"
-#: git-gui.sh:3861
+#: git-gui.sh:3881
msgid ""
"\n"
"This is due to a known issue with the\n"
@@ -581,7 +586,7 @@ msgstr ""
"Това е познат проблем и се дължи на\n"
"версията на Tcl включена в Cygwin."
-#: git-gui.sh:3866
+#: git-gui.sh:3886
#, tcl-format
msgid ""
"\n"
@@ -593,9 +598,9 @@ msgid ""
msgstr ""
"\n"
"\n"
-"Добър заместител на %s\n"
-"е да поставите настройките user.name и\n"
-"user.email в личния си файл ~/.gitconfig.\n"
+"Добър заместител на „%s“\n"
+"е да поставите настройките „user.name“ и\n"
+"„user.email“ в личния си файл „~/.gitconfig“.\n"
#: lib/spellcheck.tcl:57
msgid "Unsupported spell checker"
@@ -744,9 +749,9 @@ msgstr "[Към родителя]"
msgid "Browse Branch Files"
msgstr "Разглеждане на файловете в клона"
-#: lib/browser.tcl:288 lib/choose_repository.tcl:406
-#: lib/choose_repository.tcl:493 lib/choose_repository.tcl:502
-#: lib/choose_repository.tcl:1029
+#: lib/browser.tcl:288 lib/choose_repository.tcl:422
+#: lib/choose_repository.tcl:509 lib/choose_repository.tcl:518
+#: lib/choose_repository.tcl:1074
msgid "Browse"
msgstr "Разглеждане"
@@ -762,12 +767,12 @@ msgstr "За изпълнението на „%s“ трябва да избер
#: lib/tools.tcl:91
#, tcl-format
msgid "Are you sure you want to run %1$s on file \"%2$s\"?"
-msgstr "Сигурни ли сте, че искате да стартирате „%1$s“ върху „%2$s“?"
+msgstr "Сигурни ли сте, че искате да изпълните „%1$s“ върху файла „%2$s“?"
#: lib/tools.tcl:95
#, tcl-format
msgid "Are you sure you want to run %s?"
-msgstr "Сигурни ли сте, че искате да стартирате „%s“?"
+msgstr "Сигурни ли сте, че искате да изпълните „%s“?"
#: lib/tools.tcl:116
#, tcl-format
@@ -797,7 +802,7 @@ msgstr "Клон за изтегляне"
msgid "Checkout"
msgstr "Изтегляне"
-#: lib/branch_checkout.tcl:39 lib/option.tcl:309 lib/branch_create.tcl:69
+#: lib/branch_checkout.tcl:39 lib/option.tcl:310 lib/branch_create.tcl:69
msgid "Options"
msgstr "Опции"
@@ -812,7 +817,7 @@ msgstr "Изтриване от локалния клон"
#: lib/transport.tcl:7
#, tcl-format
msgid "Fetching new changes from %s"
-msgstr "Доставяне на промените от %s"
+msgstr "Доставяне на промените от „%s“"
#: lib/transport.tcl:18
#, tcl-format
@@ -826,26 +831,25 @@ msgstr "Окастряне на следящите клони на изтрит
#: lib/transport.tcl:25
msgid "fetch all remotes"
-msgstr "доставяне на всички хранилища"
+msgstr "доставяне на всички отдалечени хранилища"
#: lib/transport.tcl:26
msgid "Fetching new changes from all remotes"
-msgstr "Доставяне на промените от всички отдалечени хранилища"
+msgstr "Доставяне на новите промени от всички отдалечени хранилища"
#: lib/transport.tcl:40
msgid "remote prune all remotes"
-msgstr "окастряне на всички клони следящи изтрити клони"
+msgstr "окастряне на всички следящи клони"
#: lib/transport.tcl:41
msgid "Pruning tracking branches deleted from all remotes"
msgstr ""
-"Окастряне на следящите клони на изтритите клони от всички отдалечени "
-"хранилища"
+"Окастряне на всички клони, които следят изтрити клони от отдалечени хранилища"
#: lib/transport.tcl:55
#, tcl-format
msgid "Pushing changes to %s"
-msgstr "Изтласкване на промените към %s"
+msgstr "Изтласкване на промените към „%s“"
#: lib/transport.tcl:93
#, tcl-format
@@ -855,7 +859,7 @@ msgstr "Изтласкване на всичко към „%s“"
#: lib/transport.tcl:111
#, tcl-format
msgid "Pushing %s %s to %s"
-msgstr "Изтласкване на %s %s към %s"
+msgstr "Изтласкване на %s „%s“ към „%s“"
#: lib/transport.tcl:132
msgid "Push Branches"
@@ -1031,7 +1035,7 @@ msgid ""
"If you like this text, it can be your font."
msgstr ""
"Това е примерен текст.\n"
-"Ако ви харесва как изглежда, изберете този шрифт."
+"Ако ви харесва как изглежда, изберете шрифта."
#: lib/option.tcl:11
#, tcl-format
@@ -1098,7 +1102,8 @@ msgstr "Напасване на следящите клонове"
#: lib/option.tcl:151
msgid "Use Textconv For Diffs and Blames"
-msgstr "Използване на „textconv“ за разликите и анотациите"
+msgstr ""
+"Преобразуване на текста с „textconv“ при анотиране и извеждане на разлики"
#: lib/option.tcl:152
msgid "Blame Copy Only On Changed Files"
@@ -1106,7 +1111,7 @@ msgstr "Анотиране на копието само по променени
#: lib/option.tcl:153
msgid "Maximum Length of Recent Repositories List"
-msgstr "Максимален брой скоро ползвани хранилища"
+msgstr "Максимална дължина на списъка със скоро ползвани хранилища"
#: lib/option.tcl:154
msgid "Minimum Letters To Blame Copy On"
@@ -1122,7 +1127,7 @@ msgstr "Брой редове за контекста при извеждане
#: lib/option.tcl:157
msgid "Additional Diff Parameters"
-msgstr "Допълнителни параметри за разликите"
+msgstr "Допълнителни аргументи към „git diff“"
#: lib/option.tcl:158
msgid "Commit Message Text Width"
@@ -1138,45 +1143,62 @@ msgstr "Стандартно кодиране на файловете"
#: lib/option.tcl:161
msgid "Warn before committing to a detached head"
-msgstr "Предупреждение при подаване към несвързан връх"
+msgstr "Предупреждаване при подаването при несвързан връх"
#: lib/option.tcl:162
msgid "Staging of untracked files"
-msgstr "Добавяне на неследените файлове към индекса"
+msgstr "Вкарване на неследени файлове в индекса"
#: lib/option.tcl:163
msgid "Show untracked files"
msgstr "Показване на неследените файлове"
-#: lib/option.tcl:209
+#: lib/option.tcl:164
+msgid "Tab spacing"
+msgstr "Размер на табулацията в интервали"
+
+#: lib/option.tcl:210
msgid "Change"
msgstr "Смяна"
-#: lib/option.tcl:253
+#: lib/option.tcl:254
msgid "Spelling Dictionary:"
msgstr "Правописен речник:"
-#: lib/option.tcl:283
+#: lib/option.tcl:284
msgid "Change Font"
msgstr "Смяна на шрифта"
-#: lib/option.tcl:287
+#: lib/option.tcl:288
#, tcl-format
msgid "Choose %s"
msgstr "Избор на „%s“"
-#: lib/option.tcl:293
+#: lib/option.tcl:294
msgid "pt."
msgstr "тчк."
-#: lib/option.tcl:307
+#: lib/option.tcl:308
msgid "Preferences"
msgstr "Настройки"
-#: lib/option.tcl:344
+#: lib/option.tcl:345
msgid "Failed to completely save options:"
msgstr "Неуспешно запазване на настройките:"
+#: lib/encoding.tcl:443
+msgid "Default"
+msgstr "Стандартното"
+
+#: lib/encoding.tcl:448
+#, tcl-format
+msgid "System (%s)"
+msgstr "Системното (%s)"
+
+#: lib/encoding.tcl:459 lib/encoding.tcl:465
+msgid "Other"
+msgstr "Друго"
+
#: lib/mergetool.tcl:8
msgid "Force resolution to the base version?"
msgstr "Да се използва базовата версия"
@@ -1208,7 +1230,7 @@ msgstr ""
#, tcl-format
msgid "File %s seems to have unresolved conflicts, still stage?"
msgstr ""
-"Изглежда, че във файла „%s“ все още има некоригирани конфликти. Да се добави "
+"Изглежда, че все още има некоригирани конфликти във файла „%s“. Да се добави "
"ли файлът към индекса?"
#: lib/mergetool.tcl:60
@@ -1286,7 +1308,7 @@ msgstr "Подробности за командата"
#: lib/tools_dlg.tcl:49
msgid "Use '/' separators to create a submenu tree:"
-msgstr "За създаване на подменюта използвайте за разделител знака „/“:"
+msgstr "За създаване на подменюта използвайте знака „/“ за разделител:"
#: lib/tools_dlg.tcl:60
msgid "Command:"
@@ -1346,7 +1368,7 @@ msgstr "Премахване"
#: lib/tools_dlg.tcl:231
msgid "(Blue denotes repository-local tools)"
-msgstr "(команди към локалното хранилище са обозначени в синьо)"
+msgstr "(командите към локалното хранилище са обозначени в синьо)"
#: lib/tools_dlg.tcl:292
#, tcl-format
@@ -1379,7 +1401,7 @@ msgstr "Предишна поява"
#: lib/search.tcl:52
msgid "RegExp"
-msgstr "Рег. изр."
+msgstr "Рег. израз"
#: lib/search.tcl:54
msgid "Case"
@@ -1393,7 +1415,7 @@ msgstr "Клавишната комбинация не може да бъде з
msgid "Cannot write icon:"
msgstr "Иконата не може да бъде запазена:"
-#: lib/diff.tcl:64
+#: lib/diff.tcl:77
#, tcl-format
msgid ""
"No differences detected.\n"
@@ -1416,12 +1438,12 @@ msgstr ""
"Автоматично ще започне нова проверка дали няма други файлове в това "
"състояние."
-#: lib/diff.tcl:104
+#: lib/diff.tcl:117
#, tcl-format
msgid "Loading diff of %s..."
msgstr "Зареждане на разликите в „%s“…"
-#: lib/diff.tcl:125
+#: lib/diff.tcl:140
msgid ""
"LOCAL: deleted\n"
"REMOTE:\n"
@@ -1429,7 +1451,7 @@ msgstr ""
"ЛОКАЛНО: изтрит\n"
"ОТДАЛЕЧЕНО:\n"
-#: lib/diff.tcl:130
+#: lib/diff.tcl:145
msgid ""
"REMOTE: deleted\n"
"LOCAL:\n"
@@ -1437,41 +1459,41 @@ msgstr ""
"ОТДАЛЕЧЕНО: изтрит\n"
"ЛОКАЛНО:\n"
-#: lib/diff.tcl:137
+#: lib/diff.tcl:152
msgid "LOCAL:\n"
msgstr "ЛОКАЛНО:\n"
-#: lib/diff.tcl:140
+#: lib/diff.tcl:155
msgid "REMOTE:\n"
msgstr "ОТДАЛЕЧЕНО:\n"
-#: lib/diff.tcl:202 lib/diff.tcl:337
+#: lib/diff.tcl:217 lib/diff.tcl:355
#, tcl-format
msgid "Unable to display %s"
-msgstr "Не може да бъде показан файлът „%s“"
+msgstr "Файлът „%s“ не може да бъде показан"
-#: lib/diff.tcl:203
+#: lib/diff.tcl:218
msgid "Error loading file:"
msgstr "Грешка при зареждане на файл:"
-#: lib/diff.tcl:210
+#: lib/diff.tcl:225
msgid "Git Repository (subproject)"
-msgstr "Хранилище на Git (подпроект)"
+msgstr "Хранилище на Git (подмодул)"
-#: lib/diff.tcl:222
+#: lib/diff.tcl:237
msgid "* Binary file (not showing content)."
-msgstr "⁃ Двоичен файл (съдържанието не се показва)."
+msgstr "● Двоичен файл (съдържанието не се показва)."
-#: lib/diff.tcl:227
+#: lib/diff.tcl:242
#, tcl-format
msgid ""
"* Untracked file is %d bytes.\n"
"* Showing only first %d bytes.\n"
msgstr ""
-"⁃ Неследеният файл е %d байта.\n"
-"⁃ Показват се само първите %d байта.\n"
+"● Неследеният файл е %d байта.\n"
+"● Показват се само първите %d байта.\n"
-#: lib/diff.tcl:233
+#: lib/diff.tcl:248
#, tcl-format
msgid ""
"\n"
@@ -1479,26 +1501,26 @@ msgid ""
"* To see the entire file, use an external editor.\n"
msgstr ""
"\n"
-"⁃ Неследеният файл е отрязан дотук %s.\n"
-"⁃ Използвайте външен редактор, за да видите целия файл.\n"
+"● Неследеният файл е отрязан дотук от програмата „%s“.\n"
+"● Използвайте външен редактор, за да видите целия файл.\n"
-#: lib/diff.tcl:338 lib/blame.tcl:1128
+#: lib/diff.tcl:356 lib/blame.tcl:1128
msgid "Error loading diff:"
msgstr "Грешка при зареждане на разлика:"
-#: lib/diff.tcl:557
+#: lib/diff.tcl:578
msgid "Failed to unstage selected hunk."
msgstr "Избраното парче не може да бъде извадено от индекса."
-#: lib/diff.tcl:564
+#: lib/diff.tcl:585
msgid "Failed to stage selected hunk."
-msgstr "Избраното парче не може да бъде добавен към индекса."
+msgstr "Избраното парче не може да бъде добавено към индекса."
-#: lib/diff.tcl:643
+#: lib/diff.tcl:664
msgid "Failed to unstage selected line."
msgstr "Избраният ред не може да бъде изваден от индекса."
-#: lib/diff.tcl:651
+#: lib/diff.tcl:672
msgid "Failed to stage selected line."
msgstr "Избраният ред не може да бъде добавен към индекса."
@@ -1512,7 +1534,7 @@ msgstr "От хранилище"
#: lib/remote_branch_delete.tcl:88
msgid "Branches"
-msgstr "Клонове"
+msgstr "Клони"
#: lib/remote_branch_delete.tcl:110
msgid "Delete Only If"
@@ -1539,7 +1561,7 @@ msgid ""
msgstr ""
"Следните клони не са слети напълно в „%s“:\n"
"\n"
-" ⁃ %s"
+" ● %s"
#: lib/remote_branch_delete.tcl:190
#, tcl-format
@@ -1578,239 +1600,251 @@ msgstr "Не е избрано хранилище."
msgid "Scanning %s..."
msgstr "Претърсване на „%s“…"
-#: lib/choose_repository.tcl:32
+#: lib/choose_repository.tcl:33
msgid "Git Gui"
msgstr "ГПИ на Git"
-#: lib/choose_repository.tcl:91 lib/choose_repository.tcl:396
+#: lib/choose_repository.tcl:92 lib/choose_repository.tcl:412
msgid "Create New Repository"
msgstr "Създаване на ново хранилище"
-#: lib/choose_repository.tcl:97
+#: lib/choose_repository.tcl:98
msgid "New..."
msgstr "Ново…"
-#: lib/choose_repository.tcl:104 lib/choose_repository.tcl:480
+#: lib/choose_repository.tcl:105 lib/choose_repository.tcl:496
msgid "Clone Existing Repository"
msgstr "Клониране на съществуващо хранилище"
-#: lib/choose_repository.tcl:115
+#: lib/choose_repository.tcl:116
msgid "Clone..."
msgstr "Клониране…"
-#: lib/choose_repository.tcl:122 lib/choose_repository.tcl:1019
+#: lib/choose_repository.tcl:123 lib/choose_repository.tcl:1064
msgid "Open Existing Repository"
msgstr "Отваряне на съществуващо хранилище"
-#: lib/choose_repository.tcl:128
+#: lib/choose_repository.tcl:129
msgid "Open..."
msgstr "Отваряне…"
-#: lib/choose_repository.tcl:141
+#: lib/choose_repository.tcl:142
msgid "Recent Repositories"
msgstr "Скоро ползвани"
-#: lib/choose_repository.tcl:147
+#: lib/choose_repository.tcl:148
msgid "Open Recent Repository:"
msgstr "Отваряне на хранилище ползвано наскоро:"
-#: lib/choose_repository.tcl:315 lib/choose_repository.tcl:322
-#: lib/choose_repository.tcl:329
+#: lib/choose_repository.tcl:316 lib/choose_repository.tcl:323
+#: lib/choose_repository.tcl:330
#, tcl-format
msgid "Failed to create repository %s:"
msgstr "Неуспешно създаване на хранилището „%s“:"
-#: lib/choose_repository.tcl:391 lib/branch_create.tcl:33
+#: lib/choose_repository.tcl:407 lib/branch_create.tcl:33
msgid "Create"
msgstr "Създаване"
-#: lib/choose_repository.tcl:401
+#: lib/choose_repository.tcl:417
msgid "Directory:"
msgstr "Директория:"
-#: lib/choose_repository.tcl:431 lib/choose_repository.tcl:552
-#: lib/choose_repository.tcl:1053
+#: lib/choose_repository.tcl:447 lib/choose_repository.tcl:573
+#: lib/choose_repository.tcl:1098
msgid "Git Repository"
msgstr "Хранилище на Git"
-#: lib/choose_repository.tcl:456
+#: lib/choose_repository.tcl:472
#, tcl-format
msgid "Directory %s already exists."
msgstr "Вече съществува директория „%s“."
-#: lib/choose_repository.tcl:460
+#: lib/choose_repository.tcl:476
#, tcl-format
msgid "File %s already exists."
msgstr "Вече съществува файл „%s“."
-#: lib/choose_repository.tcl:475
+#: lib/choose_repository.tcl:491
msgid "Clone"
msgstr "Клониране"
-#: lib/choose_repository.tcl:488
+#: lib/choose_repository.tcl:504
msgid "Source Location:"
msgstr "Адрес на източника:"
-#: lib/choose_repository.tcl:497
+#: lib/choose_repository.tcl:513
msgid "Target Directory:"
msgstr "Целева директория:"
-#: lib/choose_repository.tcl:507
+#: lib/choose_repository.tcl:523
msgid "Clone Type:"
msgstr "Вид клониране:"
-#: lib/choose_repository.tcl:512
+#: lib/choose_repository.tcl:528
msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
msgstr "Стандартно (бързо, частично споделяне на файлове, твърди връзки)"
-#: lib/choose_repository.tcl:517
+#: lib/choose_repository.tcl:533
msgid "Full Copy (Slower, Redundant Backup)"
msgstr "Пълно (бавно, пълноценно резервно копие)"
-#: lib/choose_repository.tcl:522
+#: lib/choose_repository.tcl:538
msgid "Shared (Fastest, Not Recommended, No Backup)"
msgstr "Споделено (най-бързо, не се препоръчва, не прави резервно копие)"
-#: lib/choose_repository.tcl:558 lib/choose_repository.tcl:605
-#: lib/choose_repository.tcl:751 lib/choose_repository.tcl:821
-#: lib/choose_repository.tcl:1059 lib/choose_repository.tcl:1067
+#: lib/choose_repository.tcl:545
+msgid "Recursively clone submodules too"
+msgstr "Рекурсивно клониране и на подмодулите"
+
+#: lib/choose_repository.tcl:579 lib/choose_repository.tcl:626
+#: lib/choose_repository.tcl:772 lib/choose_repository.tcl:842
+#: lib/choose_repository.tcl:1104 lib/choose_repository.tcl:1112
#, tcl-format
msgid "Not a Git repository: %s"
msgstr "Това не е хранилище на Git: %s"
-#: lib/choose_repository.tcl:594
+#: lib/choose_repository.tcl:615
msgid "Standard only available for local repository."
msgstr "Само локални хранилища могат да се клонират стандартно"
-#: lib/choose_repository.tcl:598
+#: lib/choose_repository.tcl:619
msgid "Shared only available for local repository."
msgstr "Само локални хранилища могат да се клонират споделено"
-#: lib/choose_repository.tcl:619
+#: lib/choose_repository.tcl:640
#, tcl-format
msgid "Location %s already exists."
-msgstr "Вече съществува местоположението „%s“."
+msgstr "Местоположението „%s“ вече съществува."
-#: lib/choose_repository.tcl:630
+#: lib/choose_repository.tcl:651
msgid "Failed to configure origin"
msgstr "Неуспешно настройване на хранилището-източник"
-#: lib/choose_repository.tcl:642
+#: lib/choose_repository.tcl:663
msgid "Counting objects"
msgstr "Преброяване на обекти"
-#: lib/choose_repository.tcl:643
+#: lib/choose_repository.tcl:664
msgid "buckets"
msgstr "клетки"
-#: lib/choose_repository.tcl:667
+#: lib/choose_repository.tcl:688
#, tcl-format
msgid "Unable to copy objects/info/alternates: %s"
msgstr "Обектите/информацията/синонимите не могат да бъдат копирани: %s"
-#: lib/choose_repository.tcl:703
+#: lib/choose_repository.tcl:724
#, tcl-format
msgid "Nothing to clone from %s."
msgstr "Няма какво да се клонира от „%s“."
-#: lib/choose_repository.tcl:705 lib/choose_repository.tcl:919
-#: lib/choose_repository.tcl:931
+#: lib/choose_repository.tcl:726 lib/choose_repository.tcl:940
+#: lib/choose_repository.tcl:952
msgid "The 'master' branch has not been initialized."
msgstr "Основният клон — „master“ не е инициализиран."
-#: lib/choose_repository.tcl:718
+#: lib/choose_repository.tcl:739
msgid "Hardlinks are unavailable. Falling back to copying."
msgstr "Не се поддържат твърди връзки. Преминава се към копиране."
-#: lib/choose_repository.tcl:730
+#: lib/choose_repository.tcl:751
#, tcl-format
msgid "Cloning from %s"
msgstr "Клониране на „%s“"
-#: lib/choose_repository.tcl:761
+#: lib/choose_repository.tcl:782
msgid "Copying objects"
msgstr "Копиране на обекти"
-#: lib/choose_repository.tcl:762
+#: lib/choose_repository.tcl:783
msgid "KiB"
msgstr "KiB"
-#: lib/choose_repository.tcl:786
+#: lib/choose_repository.tcl:807
#, tcl-format
msgid "Unable to copy object: %s"
msgstr "Неуспешно копиране на обект: %s"
-#: lib/choose_repository.tcl:796
+#: lib/choose_repository.tcl:817
msgid "Linking objects"
msgstr "Създаване на връзки към обектите"
-#: lib/choose_repository.tcl:797
+#: lib/choose_repository.tcl:818
msgid "objects"
msgstr "обекти"
-#: lib/choose_repository.tcl:805
+#: lib/choose_repository.tcl:826
#, tcl-format
msgid "Unable to hardlink object: %s"
msgstr "Неуспешно създаване на твърда връзка към обект: %s"
-#: lib/choose_repository.tcl:860
+#: lib/choose_repository.tcl:881
msgid "Cannot fetch branches and objects. See console output for details."
msgstr ""
"Клоните и обектите не могат да бъдат изтеглени. За повече информация "
"погледнете изхода на конзолата."
-#: lib/choose_repository.tcl:871
+#: lib/choose_repository.tcl:892
msgid "Cannot fetch tags. See console output for details."
msgstr ""
"Етикетите не могат да бъдат изтеглени. За повече информация погледнете "
"изхода на конзолата."
-#: lib/choose_repository.tcl:895
+#: lib/choose_repository.tcl:916
msgid "Cannot determine HEAD. See console output for details."
msgstr ""
-"Върхът HEAD не може да бъде определен. За повече информация погледнете "
+"Върхът „HEAD“ не може да бъде определен. За повече информация погледнете "
"изхода на конзолата."
-#: lib/choose_repository.tcl:904
+#: lib/choose_repository.tcl:925
#, tcl-format
msgid "Unable to cleanup %s"
-msgstr "Не може да се зачисти „%s“"
+msgstr "„%s“ не може да се зачисти"
-#: lib/choose_repository.tcl:910
+#: lib/choose_repository.tcl:931
msgid "Clone failed."
msgstr "Неуспешно клониране."
-#: lib/choose_repository.tcl:917
+#: lib/choose_repository.tcl:938
msgid "No default branch obtained."
msgstr "Не е получен клон по подразбиране."
-#: lib/choose_repository.tcl:928
+#: lib/choose_repository.tcl:949
#, tcl-format
msgid "Cannot resolve %s as a commit."
msgstr "Няма подаване отговарящо на „%s“."
-#: lib/choose_repository.tcl:940
+#: lib/choose_repository.tcl:961
msgid "Creating working directory"
msgstr "Създаване на работната директория"
-#: lib/choose_repository.tcl:941 lib/index.tcl:70 lib/index.tcl:136
+#: lib/choose_repository.tcl:962 lib/index.tcl:70 lib/index.tcl:136
#: lib/index.tcl:207
msgid "files"
msgstr "файлове"
-#: lib/choose_repository.tcl:970
+#: lib/choose_repository.tcl:981
+msgid "Cannot clone submodules."
+msgstr "Подмодулите не могат да се клонират."
+
+#: lib/choose_repository.tcl:990
+msgid "Cloning submodules"
+msgstr "Клониране на подмодулите"
+
+#: lib/choose_repository.tcl:1015
msgid "Initial file checkout failed."
msgstr "Неуспешно първоначално изтегляне."
-#: lib/choose_repository.tcl:1014
+#: lib/choose_repository.tcl:1059
msgid "Open"
msgstr "Отваряне"
-#: lib/choose_repository.tcl:1024
+#: lib/choose_repository.tcl:1069
msgid "Repository:"
msgstr "Хранилище:"
-#: lib/choose_repository.tcl:1073
+#: lib/choose_repository.tcl:1118
#, tcl-format
msgid "Failed to open repository %s:"
msgstr "Неуспешно отваряне на хранилището „%s“:"
@@ -1849,7 +1883,7 @@ msgid ""
msgstr ""
"Клонът „%s“ съществува.\n"
"\n"
-"Той не може да бъде тривиално превъртян до %s.\n"
+"Той не може да бъде тривиално слят до „%s“.\n"
"Необходимо е сливане."
#: lib/checkout_op.tcl:243
@@ -2003,7 +2037,7 @@ msgstr "Изберете клон за следени."
#: lib/branch_create.tcl:141
#, tcl-format
msgid "Tracking branch %s is not a branch in the remote repository."
-msgstr "Клонът, който се следи „%s“ не съществува в отдалеченото хранилище."
+msgstr "Следящият клон — „%s“, не съществува в отдалеченото хранилище."
#: lib/console.tcl:59
msgid "Working... please wait..."
@@ -2023,7 +2057,7 @@ msgstr "Това несвързано изтегляне"
#: lib/choose_rev.tcl:60
msgid "Revision Expression:"
-msgstr "Израз за версия"
+msgstr "Израз за версия:"
#: lib/choose_rev.tcl:72
msgid "Local Branch"
@@ -2101,7 +2135,7 @@ msgstr "Идентификацията ви не може да бъде опре
#: lib/commit.tcl:80
msgid "Invalid GIT_COMMITTER_IDENT:"
-msgstr "Неправилно поле GIT_COMMITTER_IDENT:"
+msgstr "Неправилно поле „GIT_COMMITTER_IDENT“:"
#: lib/commit.tcl:129
#, tcl-format
@@ -2157,7 +2191,7 @@ msgid ""
msgstr ""
"Няма промени за подаване.\n"
"\n"
-"Трябва да добавите поне 1 файл към индекса, преди да подадете.\n"
+"Трябва да добавите поне един файл към индекса, за да подадете.\n"
#: lib/commit.tcl:204
msgid ""
@@ -2173,9 +2207,9 @@ msgstr ""
"\n"
"Използвайте следния формат:\n"
"\n"
-"⁃ Първи ред: описание в едно изречение на промяната.\n"
-"⁃ Втори ред: празен.\n"
-"⁃ Останалите редове: опишете защо се налага тази промяна.\n"
+"● Първи ред: описание в едно изречение на промяната.\n"
+"● Втори ред: празен.\n"
+"● Останалите редове: опишете защо се налага тази промяна.\n"
#: lib/commit.tcl:235
msgid "Calling pre-commit hook..."
@@ -2194,13 +2228,12 @@ msgid ""
" \n"
" Do you really want to proceed with your Commit?"
msgstr ""
-"Ще подадете към несвързан връх. Това действие е опасно, защото при "
-"преминаването към който и да е клон ще загубите промените си и не е сигурно, "
-"че ще можете по-късно да ги възстановите чрез журнала на указателите. Най-"
-"вероятно трябва първо да създадете клон базиран на текущото състояние и да "
-"подадете към него.\n"
+"Ще подавате към несвързан връх. Това е опасно — при изтеглянето на друг клон "
+"ще изгубите промените си. След това може да е невъзможно да ги възстановите "
+"от журнала на указателите „reflog“. Най-вероятно трябва да отмените това "
+"подаване и да създадете клон, в който да подадете.\n"
" \n"
-"Сигурни ли сте, че искате да подадете точно сега?"
+"Сигурни ли сте, че искате да подадете към несвързан връх?"
#: lib/commit.tcl:290
msgid "Calling commit-msg hook..."
@@ -2212,7 +2245,7 @@ msgstr "Подаването е отхвърлено от куката за съ
#: lib/commit.tcl:318
msgid "Committing changes..."
-msgstr "Подаване на промените."
+msgstr "Подаване на промените…"
#: lib/commit.tcl:334
msgid "write-tree failed:"
@@ -2278,7 +2311,7 @@ msgstr "Изтриване, само ако промените са слети
#: lib/branch_delete.tcl:103
#, tcl-format
msgid "The following branches are not completely merged into %s:"
-msgstr "Не всички промени в клоните са слети в %s:"
+msgstr "Не всички промени в клоните са слети в „%s“:"
#: lib/branch_delete.tcl:141
#, tcl-format
@@ -2324,7 +2357,7 @@ msgstr "Анотиране на родителското подаване"
#: lib/blame.tcl:466
#, tcl-format
msgid "Reading %s..."
-msgstr "%s се чете…"
+msgstr "Чете се „%s“…"
#: lib/blame.tcl:594
msgid "Loading copy/move tracking annotations..."
@@ -2372,7 +2405,7 @@ msgstr "Първоначален файл:"
#: lib/blame.tcl:1057
msgid "Cannot find HEAD commit:"
-msgstr "Подаването за връх HEAD не може да се открие:"
+msgstr "Подаването за връх „HEAD“ не може да се открие:"
#: lib/blame.tcl:1112
msgid "Cannot find parent commit:"
@@ -2421,7 +2454,7 @@ msgstr "Отключване на индекса"
#: lib/index.tcl:298
#, tcl-format
msgid "Unstaging %s from commit"
-msgstr "Изваждане на %s от подаването"
+msgstr "Изваждане на „%s“ от подаването"
#: lib/index.tcl:337
msgid "Ready to commit."
@@ -2435,7 +2468,7 @@ msgstr "Добавяне на „%s“"
#: lib/index.tcl:380
#, tcl-format
msgid "Stage %d untracked files?"
-msgstr "Да се добавят ли %d на брой неследени файла към индекса?"
+msgstr "Да се вкарат ли %d неследени файла в индекса?"
#: lib/index.tcl:428
#, tcl-format
@@ -2466,19 +2499,6 @@ msgstr "Махане на промените в избраните файлов
msgid "Reverting %s"
msgstr "Махане на промените в „%s“"
-#: lib/encoding.tcl:443
-msgid "Default"
-msgstr "Стандартното"
-
-#: lib/encoding.tcl:448
-#, tcl-format
-msgid "System (%s)"
-msgstr "Системното (%s)"
-
-#: lib/encoding.tcl:459 lib/encoding.tcl:465
-msgid "Other"
-msgstr "Друго"
-
#: lib/date.tcl:25
#, tcl-format
msgid "Invalid date from Git: %s"
@@ -2518,7 +2538,7 @@ msgstr "Компресиране на базата с данни за обект
#: lib/database.tcl:83
msgid "Verifying the object database with fsck-objects"
-msgstr "Проверка на базата с данни за обектите с програмата fsck-objects"
+msgstr "Проверка на базата с данни за обектите с програмата „fsck-objects“"
#: lib/database.tcl:107
#, tcl-format
@@ -2532,7 +2552,7 @@ msgid ""
msgstr ""
"В това хранилище в момента има към %i непакетирани обекти.\n"
"\n"
-"Зd добра производителност се препоръчва да компресирате базата с данни за "
+"За добра производителност се препоръчва да компресирате базата с данни за "
"обектите.\n"
"\n"
"Да се започне ли компресирането?"
@@ -2547,7 +2567,7 @@ msgstr "предупреждение"
#: lib/error.tcl:96
msgid "You must correct the above errors before committing."
-msgstr "Преди да можете да подадете, оправете горните грешки."
+msgstr "Преди да можете да подадете, коригирайте горните грешки."
#: lib/merge.tcl:13
msgid ""
@@ -2659,7 +2679,7 @@ msgid ""
msgstr ""
"Да се преустанови ли сливането?\n"
"\n"
-"В такъв случай *ВСИЧКИ* неподадени промени ще бъдат безвъзвратно загубени.\n"
+"В такъв случай ●ВСИЧКИ● неподадени промени ще бъдат безвъзвратно загубени.\n"
"\n"
"Наистина ли да се преустанови сливането?"
@@ -2673,7 +2693,7 @@ msgid ""
msgstr ""
"Да се занулят ли промените?\n"
"\n"
-"В такъв случай *ВСИЧКИ* неподадени промени ще бъдат безвъзвратно загубени.\n"
+"В такъв случай ●ВСИЧКИ● неподадени промени ще бъдат безвъзвратно загубени.\n"
"\n"
"Наистина ли да се занулят промените?"
diff --git a/git-gui/po/sv.po b/git-gui/po/sv.po
index fcb063f..1b4ad83 100644
--- a/git-gui/po/sv.po
+++ b/git-gui/po/sv.po
@@ -2,47 +2,51 @@
# Copyright (C) 2007-2008 Shawn Pearce, et al.
# This file is distributed under the same license as the git-gui package.
#
-# Peter Krefting <peter@softwolves.pp.se>, 2007-2008.
# Mikael Magnusson <mikachu@gmail.com>, 2008.
+# Peter Krefting <peter@softwolves.pp.se>, 2007-2008, 2015.
+#
msgid ""
msgstr ""
"Project-Id-Version: sv\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-09-12 21:11+0100\n"
-"PO-Revision-Date: 2010-09-12 21:12+0100\n"
+"POT-Creation-Date: 2015-03-27 10:15+0100\n"
+"PO-Revision-Date: 2015-03-27 10:24+0100\n"
"Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
+"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Gtranslator 2.91.6\n"
-#: git-gui.sh:781
+#: git-gui.sh:861
#, tcl-format
msgid "Invalid font specified in %s:"
msgstr "Ogiltigt teckensnitt angivet i %s:"
-#: git-gui.sh:831
+#: git-gui.sh:915
msgid "Main Font"
msgstr "Huvudteckensnitt"
-#: git-gui.sh:832
+#: git-gui.sh:916
msgid "Diff/Console Font"
msgstr "Diff/konsolteckensnitt"
-#: git-gui.sh:845 git-gui.sh:859 git-gui.sh:872 git-gui.sh:955 git-gui.sh:974
-#: git-gui.sh:2964
+#: git-gui.sh:931 git-gui.sh:945 git-gui.sh:958 git-gui.sh:1048
+#: git-gui.sh:1067 git-gui.sh:3125
msgid "git-gui: fatal error"
msgstr "git-gui: ödesdigert fel"
-#: git-gui.sh:846
+#: git-gui.sh:932
msgid "Cannot find git in PATH."
msgstr "Hittar inte git i PATH."
-#: git-gui.sh:873
+#: git-gui.sh:959
msgid "Cannot parse Git version string:"
msgstr "Kan inte tolka versionssträng från Git:"
-#: git-gui.sh:891
+#: git-gui.sh:984
#, tcl-format
msgid ""
"Git version cannot be determined.\n"
@@ -61,478 +65,505 @@ msgstr ""
"\n"
"Anta att \"%s\" är version 1.5.0?\n"
-#: git-gui.sh:1180
+#: git-gui.sh:1281
msgid "Git directory not found:"
msgstr "Git-katalogen hittades inte:"
-#: git-gui.sh:1201
+#: git-gui.sh:1315
msgid "Cannot move to top of working directory:"
msgstr "Kan inte gå till början på arbetskatalogen:"
-#: git-gui.sh:1209
+#: git-gui.sh:1323
msgid "Cannot use bare repository:"
msgstr "Kan inte använda naket arkiv:"
-#: git-gui.sh:1217
+#: git-gui.sh:1331
msgid "No working directory"
msgstr "Ingen arbetskatalog"
-#: git-gui.sh:1389 lib/checkout_op.tcl:306
+#: git-gui.sh:1503 lib/checkout_op.tcl:306
msgid "Refreshing file status..."
msgstr "Uppdaterar filstatus..."
-#: git-gui.sh:1445
+#: git-gui.sh:1563
msgid "Scanning for modified files ..."
msgstr "Söker efter ändrade filer..."
-#: git-gui.sh:1509
+#: git-gui.sh:1639
msgid "Calling prepare-commit-msg hook..."
msgstr ""
"Anropar kroken för förberedelse av incheckningsmeddelande (prepare-commit-"
"msg)..."
-#: git-gui.sh:1526
+#: git-gui.sh:1656
msgid "Commit declined by prepare-commit-msg hook."
msgstr ""
"Incheckningen avvisades av kroken för förberedelse av incheckningsmeddelande "
"(prepare-commit-msg)."
-#: git-gui.sh:1684 lib/browser.tcl:246
+#: git-gui.sh:1814 lib/browser.tcl:252
msgid "Ready."
msgstr "Klar."
-#: git-gui.sh:1842
+#: git-gui.sh:1978
#, tcl-format
-msgid "Displaying only %s of %s files."
-msgstr "Visar endast %s av %s filer."
+msgid ""
+"Display limit (gui.maxfilesdisplayed = %s) reached, not showing all %s files."
+msgstr ""
+"Visningsgräns (gui.maxfilesdisplayed = %s) nådd, visare inte samtliga %s "
+"filer."
-#: git-gui.sh:1968
+#: git-gui.sh:2101
msgid "Unmodified"
msgstr "Oförändrade"
-#: git-gui.sh:1970
+#: git-gui.sh:2103
msgid "Modified, not staged"
msgstr "Förändrade, ej köade"
-#: git-gui.sh:1971 git-gui.sh:1979
+#: git-gui.sh:2104 git-gui.sh:2116
msgid "Staged for commit"
msgstr "Köade för incheckning"
-#: git-gui.sh:1972 git-gui.sh:1980
+#: git-gui.sh:2105 git-gui.sh:2117
msgid "Portions staged for commit"
msgstr "Delar köade för incheckning"
-#: git-gui.sh:1973 git-gui.sh:1981
+#: git-gui.sh:2106 git-gui.sh:2118
msgid "Staged for commit, missing"
msgstr "Köade för incheckning, saknade"
-#: git-gui.sh:1975
+#: git-gui.sh:2108
msgid "File type changed, not staged"
msgstr "Filtyp ändrad, ej köade"
-#: git-gui.sh:1976
+#: git-gui.sh:2109 git-gui.sh:2110
+msgid "File type changed, old type staged for commit"
+msgstr "Filtyp ändrad, gammal typ köade för incheckning"
+
+#: git-gui.sh:2111
msgid "File type changed, staged"
msgstr "Filtyp ändrad, köade"
-#: git-gui.sh:1978
+#: git-gui.sh:2112
+msgid "File type change staged, modification not staged"
+msgstr "Filtypsändringar köade, innehållsändringar ej köade"
+
+#: git-gui.sh:2113
+msgid "File type change staged, file missing"
+msgstr "Filtypsändringar köade, fil saknas"
+
+#: git-gui.sh:2115
msgid "Untracked, not staged"
msgstr "Ej spårade, ej köade"
-#: git-gui.sh:1983
+#: git-gui.sh:2120
msgid "Missing"
msgstr "Saknade"
-#: git-gui.sh:1984
+#: git-gui.sh:2121
msgid "Staged for removal"
msgstr "Köade för borttagning"
-#: git-gui.sh:1985
+#: git-gui.sh:2122
msgid "Staged for removal, still present"
msgstr "Köade för borttagning, fortfarande närvarande"
-#: git-gui.sh:1987 git-gui.sh:1988 git-gui.sh:1989 git-gui.sh:1990
-#: git-gui.sh:1991 git-gui.sh:1992
+#: git-gui.sh:2124 git-gui.sh:2125 git-gui.sh:2126 git-gui.sh:2127
+#: git-gui.sh:2128 git-gui.sh:2129
msgid "Requires merge resolution"
msgstr "Kräver konflikthantering efter sammanslagning"
-#: git-gui.sh:2027
+#: git-gui.sh:2164
msgid "Starting gitk... please wait..."
msgstr "Startar gitk... vänta..."
-#: git-gui.sh:2039
+#: git-gui.sh:2176
msgid "Couldn't find gitk in PATH"
msgstr "Hittade inte gitk i PATH."
-#: git-gui.sh:2098
+#: git-gui.sh:2235
msgid "Couldn't find git gui in PATH"
msgstr "Hittade inte git gui i PATH."
-#: git-gui.sh:2515 lib/choose_repository.tcl:36
+#: git-gui.sh:2654 lib/choose_repository.tcl:41
msgid "Repository"
msgstr "Arkiv"
-#: git-gui.sh:2516
+#: git-gui.sh:2655
msgid "Edit"
msgstr "Redigera"
-#: git-gui.sh:2518 lib/choose_rev.tcl:566
+#: git-gui.sh:2657 lib/choose_rev.tcl:567
msgid "Branch"
msgstr "Gren"
-#: git-gui.sh:2521 lib/choose_rev.tcl:553
+#: git-gui.sh:2660 lib/choose_rev.tcl:554
msgid "Commit@@noun"
msgstr "Incheckning"
-#: git-gui.sh:2524 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168
+#: git-gui.sh:2663 lib/merge.tcl:123 lib/merge.tcl:152 lib/merge.tcl:170
msgid "Merge"
msgstr "Slå ihop"
-#: git-gui.sh:2525 lib/choose_rev.tcl:562
+#: git-gui.sh:2664 lib/choose_rev.tcl:563
msgid "Remote"
msgstr "Fjärrarkiv"
-#: git-gui.sh:2528
+#: git-gui.sh:2667
msgid "Tools"
msgstr "Verktyg"
-#: git-gui.sh:2537
+#: git-gui.sh:2676
msgid "Explore Working Copy"
msgstr "Utforska arbetskopia"
-#: git-gui.sh:2543
+#: git-gui.sh:2682
+msgid "Git Bash"
+msgstr "Git Bash"
+
+#: git-gui.sh:2692
msgid "Browse Current Branch's Files"
msgstr "Bläddra i grenens filer"
-#: git-gui.sh:2547
+#: git-gui.sh:2696
msgid "Browse Branch Files..."
msgstr "Bläddra filer på gren..."
-#: git-gui.sh:2552
+#: git-gui.sh:2701
msgid "Visualize Current Branch's History"
msgstr "Visualisera grenens historik"
-#: git-gui.sh:2556
+#: git-gui.sh:2705
msgid "Visualize All Branch History"
msgstr "Visualisera alla grenars historik"
-#: git-gui.sh:2563
+#: git-gui.sh:2712
#, tcl-format
msgid "Browse %s's Files"
msgstr "Bläddra i filer för %s"
-#: git-gui.sh:2565
+#: git-gui.sh:2714
#, tcl-format
msgid "Visualize %s's History"
msgstr "Visualisera historik för %s"
-#: git-gui.sh:2570 lib/database.tcl:40 lib/database.tcl:66
+#: git-gui.sh:2719 lib/database.tcl:40 lib/database.tcl:66
msgid "Database Statistics"
msgstr "Databasstatistik"
-#: git-gui.sh:2573 lib/database.tcl:33
+#: git-gui.sh:2722 lib/database.tcl:33
msgid "Compress Database"
msgstr "Komprimera databas"
-#: git-gui.sh:2576
+#: git-gui.sh:2725
msgid "Verify Database"
msgstr "Verifiera databas"
-#: git-gui.sh:2583 git-gui.sh:2587 git-gui.sh:2591 lib/shortcut.tcl:8
+#: git-gui.sh:2732 git-gui.sh:2736 git-gui.sh:2740 lib/shortcut.tcl:8
#: lib/shortcut.tcl:40 lib/shortcut.tcl:72
msgid "Create Desktop Icon"
msgstr "Skapa skrivbordsikon"
-#: git-gui.sh:2599 lib/choose_repository.tcl:188 lib/choose_repository.tcl:196
+#: git-gui.sh:2748 lib/choose_repository.tcl:193 lib/choose_repository.tcl:201
msgid "Quit"
msgstr "Avsluta"
-#: git-gui.sh:2607
+#: git-gui.sh:2756
msgid "Undo"
msgstr "Ångra"
-#: git-gui.sh:2610
+#: git-gui.sh:2759
msgid "Redo"
msgstr "Gör om"
-#: git-gui.sh:2614 git-gui.sh:3190
+#: git-gui.sh:2763 git-gui.sh:3368
msgid "Cut"
msgstr "Klipp ut"
-#: git-gui.sh:2617 git-gui.sh:3193 git-gui.sh:3267 git-gui.sh:3340
+#: git-gui.sh:2766 git-gui.sh:3371 git-gui.sh:3445 git-gui.sh:3530
#: lib/console.tcl:69
msgid "Copy"
msgstr "Kopiera"
-#: git-gui.sh:2620 git-gui.sh:3196
+#: git-gui.sh:2769 git-gui.sh:3374
msgid "Paste"
msgstr "Klistra in"
-#: git-gui.sh:2623 git-gui.sh:3199 lib/branch_delete.tcl:28
-#: lib/remote_branch_delete.tcl:39
+#: git-gui.sh:2772 git-gui.sh:3377 lib/remote_branch_delete.tcl:39
+#: lib/branch_delete.tcl:28
msgid "Delete"
msgstr "Ta bort"
-#: git-gui.sh:2627 git-gui.sh:3203 git-gui.sh:3344 lib/console.tcl:71
+#: git-gui.sh:2776 git-gui.sh:3381 git-gui.sh:3534 lib/console.tcl:71
msgid "Select All"
msgstr "Markera alla"
-#: git-gui.sh:2636
+#: git-gui.sh:2785
msgid "Create..."
msgstr "Skapa..."
-#: git-gui.sh:2642
+#: git-gui.sh:2791
msgid "Checkout..."
msgstr "Checka ut..."
-#: git-gui.sh:2648
+#: git-gui.sh:2797
msgid "Rename..."
msgstr "Byt namn..."
-#: git-gui.sh:2653
+#: git-gui.sh:2802
msgid "Delete..."
msgstr "Ta bort..."
-#: git-gui.sh:2658
+#: git-gui.sh:2807
msgid "Reset..."
msgstr "Återställ..."
-#: git-gui.sh:2668
+#: git-gui.sh:2817
msgid "Done"
msgstr "Färdig"
-#: git-gui.sh:2670
+#: git-gui.sh:2819
msgid "Commit@@verb"
msgstr "Checka in"
-#: git-gui.sh:2679 git-gui.sh:3131
+#: git-gui.sh:2828 git-gui.sh:3309
msgid "New Commit"
msgstr "Ny incheckning"
-#: git-gui.sh:2687 git-gui.sh:3138
+#: git-gui.sh:2836 git-gui.sh:3316
msgid "Amend Last Commit"
msgstr "Lägg till föregående incheckning"
-#: git-gui.sh:2697 git-gui.sh:3092 lib/remote_branch_delete.tcl:101
+#: git-gui.sh:2846 git-gui.sh:3270 lib/remote_branch_delete.tcl:101
msgid "Rescan"
msgstr "Sök på nytt"
-#: git-gui.sh:2703
+#: git-gui.sh:2852
msgid "Stage To Commit"
msgstr "Köa för incheckning"
-#: git-gui.sh:2709
+#: git-gui.sh:2858
msgid "Stage Changed Files To Commit"
msgstr "Köa ändrade filer för incheckning"
-#: git-gui.sh:2715
+#: git-gui.sh:2864
msgid "Unstage From Commit"
msgstr "Ta bort från incheckningskö"
-#: git-gui.sh:2721 lib/index.tcl:415
+#: git-gui.sh:2870 lib/index.tcl:442
msgid "Revert Changes"
msgstr "Återställ ändringar"
-#: git-gui.sh:2729 git-gui.sh:3391 git-gui.sh:3422
+#: git-gui.sh:2878 git-gui.sh:3581 git-gui.sh:3612
msgid "Show Less Context"
msgstr "Visa mindre sammanhang"
-#: git-gui.sh:2733 git-gui.sh:3395 git-gui.sh:3426
+#: git-gui.sh:2882 git-gui.sh:3585 git-gui.sh:3616
msgid "Show More Context"
msgstr "Visa mer sammanhang"
-#: git-gui.sh:2740 git-gui.sh:3105 git-gui.sh:3214
+#: git-gui.sh:2889 git-gui.sh:3283 git-gui.sh:3392
msgid "Sign Off"
msgstr "Skriv under"
-#: git-gui.sh:2756
+#: git-gui.sh:2905
msgid "Local Merge..."
msgstr "Lokal sammanslagning..."
-#: git-gui.sh:2761
+#: git-gui.sh:2910
msgid "Abort Merge..."
msgstr "Avbryt sammanslagning..."
-#: git-gui.sh:2773 git-gui.sh:2801
+#: git-gui.sh:2922 git-gui.sh:2950
msgid "Add..."
msgstr "Lägg till..."
-#: git-gui.sh:2777
+#: git-gui.sh:2926
msgid "Push..."
msgstr "Sänd..."
-#: git-gui.sh:2781
+#: git-gui.sh:2930
msgid "Delete Branch..."
msgstr "Ta bort gren..."
-#: git-gui.sh:2791 git-gui.sh:3373
+#: git-gui.sh:2940 git-gui.sh:3563
msgid "Options..."
msgstr "Alternativ..."
-#: git-gui.sh:2802
+#: git-gui.sh:2951
msgid "Remove..."
msgstr "Ta bort..."
-#: git-gui.sh:2811 lib/choose_repository.tcl:50
+#: git-gui.sh:2960 lib/choose_repository.tcl:55
msgid "Help"
msgstr "Hjälp"
-#: git-gui.sh:2815 git-gui.sh:2819 lib/about.tcl:14
-#: lib/choose_repository.tcl:44 lib/choose_repository.tcl:53
+#: git-gui.sh:2964 git-gui.sh:2968 lib/choose_repository.tcl:49
+#: lib/choose_repository.tcl:58 lib/about.tcl:14
#, tcl-format
msgid "About %s"
msgstr "Om %s"
-#: git-gui.sh:2843
+#: git-gui.sh:2992
msgid "Online Documentation"
msgstr "Webbdokumentation"
-#: git-gui.sh:2846 lib/choose_repository.tcl:47 lib/choose_repository.tcl:56
+#: git-gui.sh:2995 lib/choose_repository.tcl:52 lib/choose_repository.tcl:61
msgid "Show SSH Key"
msgstr "Visa SSH-nyckel"
-#: git-gui.sh:2965
+#: git-gui.sh:3014 git-gui.sh:3146
+msgid "Usage"
+msgstr "Användning"
+
+#: git-gui.sh:3095 lib/blame.tcl:573
+msgid "Error"
+msgstr "Fel"
+
+#: git-gui.sh:3126
#, tcl-format
msgid "fatal: cannot stat path %s: No such file or directory"
msgstr ""
"ödesdigert: kunde inte ta status på sökvägen %s: Fil eller katalog saknas"
-#: git-gui.sh:2997
+#: git-gui.sh:3159
msgid "Current Branch:"
msgstr "Aktuell gren:"
-#: git-gui.sh:3023
+#: git-gui.sh:3185
msgid "Staged Changes (Will Commit)"
msgstr "Köade ändringar (kommer att checkas in)"
-#: git-gui.sh:3043
+#: git-gui.sh:3205
msgid "Unstaged Changes"
msgstr "Oköade ändringar"
-#: git-gui.sh:3098
+#: git-gui.sh:3276
msgid "Stage Changed"
msgstr "Köa ändrade"
-#: git-gui.sh:3117 lib/transport.tcl:107 lib/transport.tcl:196
+#: git-gui.sh:3295 lib/transport.tcl:137 lib/transport.tcl:229
msgid "Push"
msgstr "Sänd"
-#: git-gui.sh:3152
+#: git-gui.sh:3330
msgid "Initial Commit Message:"
msgstr "Inledande incheckningsmeddelande:"
-#: git-gui.sh:3153
+#: git-gui.sh:3331
msgid "Amended Commit Message:"
msgstr "Utökat incheckningsmeddelande:"
-#: git-gui.sh:3154
+#: git-gui.sh:3332
msgid "Amended Initial Commit Message:"
msgstr "Utökat inledande incheckningsmeddelande:"
-#: git-gui.sh:3155
+#: git-gui.sh:3333
msgid "Amended Merge Commit Message:"
msgstr "Utökat incheckningsmeddelande för sammanslagning:"
-#: git-gui.sh:3156
+#: git-gui.sh:3334
msgid "Merge Commit Message:"
msgstr "Incheckningsmeddelande för sammanslagning:"
-#: git-gui.sh:3157
+#: git-gui.sh:3335
msgid "Commit Message:"
msgstr "Incheckningsmeddelande:"
-#: git-gui.sh:3206 git-gui.sh:3348 lib/console.tcl:73
+#: git-gui.sh:3384 git-gui.sh:3538 lib/console.tcl:73
msgid "Copy All"
msgstr "Kopiera alla"
-#: git-gui.sh:3230 lib/blame.tcl:104
+#: git-gui.sh:3408 lib/blame.tcl:105
msgid "File:"
msgstr "Fil:"
-#: git-gui.sh:3336
+#: git-gui.sh:3526
msgid "Refresh"
msgstr "Uppdatera"
-#: git-gui.sh:3357
+#: git-gui.sh:3547
msgid "Decrease Font Size"
msgstr "Minska teckensnittsstorlek"
-#: git-gui.sh:3361
+#: git-gui.sh:3551
msgid "Increase Font Size"
msgstr "Öka teckensnittsstorlek"
-#: git-gui.sh:3369 lib/blame.tcl:281
+#: git-gui.sh:3559 lib/blame.tcl:294
msgid "Encoding"
msgstr "Teckenkodning"
-#: git-gui.sh:3380
+#: git-gui.sh:3570
msgid "Apply/Reverse Hunk"
msgstr "Använd/återställ del"
-#: git-gui.sh:3385
+#: git-gui.sh:3575
msgid "Apply/Reverse Line"
msgstr "Använd/återställ rad"
-#: git-gui.sh:3404
+#: git-gui.sh:3594
msgid "Run Merge Tool"
msgstr "Starta verktyg för sammanslagning"
-#: git-gui.sh:3409
+#: git-gui.sh:3599
msgid "Use Remote Version"
msgstr "Använd versionen från fjärrarkivet"
-#: git-gui.sh:3413
+#: git-gui.sh:3603
msgid "Use Local Version"
msgstr "Använd lokala versionen"
-#: git-gui.sh:3417
+#: git-gui.sh:3607
msgid "Revert To Base"
msgstr "Återställ till basversionen"
-#: git-gui.sh:3435
+#: git-gui.sh:3625
msgid "Visualize These Changes In The Submodule"
msgstr "Visualisera ändringarna i undermodulen"
-#: git-gui.sh:3439
+#: git-gui.sh:3629
msgid "Visualize Current Branch History In The Submodule"
msgstr "Visualisera grenens historik i undermodulen"
-#: git-gui.sh:3443
+#: git-gui.sh:3633
msgid "Visualize All Branch History In The Submodule"
msgstr "Visualisera alla grenars historik i undermodulen"
-#: git-gui.sh:3448
+#: git-gui.sh:3638
msgid "Start git gui In The Submodule"
msgstr "Starta git gui i undermodulen"
-#: git-gui.sh:3483
+#: git-gui.sh:3673
msgid "Unstage Hunk From Commit"
msgstr "Ta bort del ur incheckningskö"
-#: git-gui.sh:3485
+#: git-gui.sh:3675
msgid "Unstage Lines From Commit"
msgstr "Ta bort rader ur incheckningskö"
-#: git-gui.sh:3487
+#: git-gui.sh:3677
msgid "Unstage Line From Commit"
msgstr "Ta bort rad ur incheckningskö"
-#: git-gui.sh:3490
+#: git-gui.sh:3680
msgid "Stage Hunk For Commit"
msgstr "Ställ del i incheckningskö"
-#: git-gui.sh:3492
+#: git-gui.sh:3682
msgid "Stage Lines For Commit"
msgstr "Ställ rader i incheckningskö"
-#: git-gui.sh:3494
+#: git-gui.sh:3684
msgid "Stage Line For Commit"
msgstr "Ställ rad i incheckningskö"
-#: git-gui.sh:3519
+#: git-gui.sh:3709
msgid "Initializing..."
msgstr "Initierar..."
-#: git-gui.sh:3658
+#: git-gui.sh:3852
#, tcl-format
msgid ""
"Possible environment issues exist.\n"
@@ -549,7 +580,7 @@ msgstr ""
"av %s:\n"
"\n"
-#: git-gui.sh:3687
+#: git-gui.sh:3881
msgid ""
"\n"
"This is due to a known issue with the\n"
@@ -559,7 +590,7 @@ msgstr ""
"Detta beror på ett känt problem med\n"
"Tcl-binären som följer med Cygwin."
-#: git-gui.sh:3692
+#: git-gui.sh:3886
#, tcl-format
msgid ""
"\n"
@@ -576,314 +607,30 @@ msgstr ""
"user.name och user.email i din personliga\n"
"~/.gitconfig-fil.\n"
-#: lib/about.tcl:26
-msgid "git-gui - a graphical user interface for Git."
-msgstr "git-gui - ett grafiskt användargränssnitt för Git."
-
-#: lib/blame.tcl:72
-msgid "File Viewer"
-msgstr "Filvisare"
-
-#: lib/blame.tcl:78
-msgid "Commit:"
-msgstr "Incheckning:"
-
-#: lib/blame.tcl:271
-msgid "Copy Commit"
-msgstr "Kopiera incheckning"
-
-#: lib/blame.tcl:275
-msgid "Find Text..."
-msgstr "Sök text..."
-
-#: lib/blame.tcl:284
-msgid "Do Full Copy Detection"
-msgstr "Gör full kopieringsigenkänning"
-
-#: lib/blame.tcl:288
-msgid "Show History Context"
-msgstr "Visa historiksammanhang"
-
-#: lib/blame.tcl:291
-msgid "Blame Parent Commit"
-msgstr "Klandra föräldraincheckning"
-
-#: lib/blame.tcl:450
-#, tcl-format
-msgid "Reading %s..."
-msgstr "Läser %s..."
-
-#: lib/blame.tcl:581
-msgid "Loading copy/move tracking annotations..."
-msgstr "Läser annoteringar för kopiering/flyttning..."
-
-#: lib/blame.tcl:601
-msgid "lines annotated"
-msgstr "rader annoterade"
-
-#: lib/blame.tcl:793
-msgid "Loading original location annotations..."
-msgstr "Läser in annotering av originalplacering..."
-
-#: lib/blame.tcl:796
-msgid "Annotation complete."
-msgstr "Annotering fullbordad."
-
-#: lib/blame.tcl:826
-msgid "Busy"
-msgstr "Upptagen"
-
-#: lib/blame.tcl:827
-msgid "Annotation process is already running."
-msgstr "Annoteringsprocess körs redan."
-
-#: lib/blame.tcl:866
-msgid "Running thorough copy detection..."
-msgstr "Kör grundlig kopieringsigenkänning..."
-
-#: lib/blame.tcl:934
-msgid "Loading annotation..."
-msgstr "Läser in annotering..."
-
-#: lib/blame.tcl:987
-msgid "Author:"
-msgstr "Författare:"
-
-#: lib/blame.tcl:991
-msgid "Committer:"
-msgstr "Incheckare:"
-
-#: lib/blame.tcl:996
-msgid "Original File:"
-msgstr "Ursprunglig fil:"
-
-#: lib/blame.tcl:1044
-msgid "Cannot find HEAD commit:"
-msgstr "Hittar inte incheckning för HEAD:"
-
-#: lib/blame.tcl:1099
-msgid "Cannot find parent commit:"
-msgstr "Hittar inte föräldraincheckning:"
-
-#: lib/blame.tcl:1114
-msgid "Unable to display parent"
-msgstr "Kan inte visa förälder"
-
-#: lib/blame.tcl:1115 lib/diff.tcl:323
-msgid "Error loading diff:"
-msgstr "Fel vid inläsning av differens:"
-
-#: lib/blame.tcl:1255
-msgid "Originally By:"
-msgstr "Ursprungligen av:"
-
-#: lib/blame.tcl:1261
-msgid "In File:"
-msgstr "I filen:"
-
-#: lib/blame.tcl:1266
-msgid "Copied Or Moved Here By:"
-msgstr "Kopierad eller flyttad hit av:"
-
-#: lib/branch_checkout.tcl:16 lib/branch_checkout.tcl:21
-msgid "Checkout Branch"
-msgstr "Checka ut gren"
-
-#: lib/branch_checkout.tcl:26
-msgid "Checkout"
-msgstr "Checka ut"
-
-#: lib/branch_checkout.tcl:30 lib/branch_create.tcl:37
-#: lib/branch_delete.tcl:34 lib/branch_rename.tcl:32 lib/browser.tcl:286
-#: lib/checkout_op.tcl:579 lib/choose_font.tcl:45 lib/merge.tcl:172
-#: lib/option.tcl:127 lib/remote_add.tcl:34 lib/remote_branch_delete.tcl:43
-#: lib/tools_dlg.tcl:41 lib/tools_dlg.tcl:202 lib/tools_dlg.tcl:345
-#: lib/transport.tcl:111
-msgid "Cancel"
-msgstr "Avbryt"
-
-#: lib/branch_checkout.tcl:35 lib/browser.tcl:291 lib/tools_dlg.tcl:321
-msgid "Revision"
-msgstr "Revision"
+#: lib/line.tcl:17
+msgid "Goto Line:"
+msgstr "Gå till rad:"
-#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:69 lib/option.tcl:287
-msgid "Options"
-msgstr "Alternativ"
+#: lib/line.tcl:23
+msgid "Go"
+msgstr "Gå"
-#: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92
-msgid "Fetch Tracking Branch"
-msgstr "Hämta spårande gren"
-
-#: lib/branch_checkout.tcl:47
-msgid "Detach From Local Branch"
-msgstr "Koppla bort från lokal gren"
-
-#: lib/branch_create.tcl:23
-msgid "Create Branch"
-msgstr "Skapa gren"
-
-#: lib/branch_create.tcl:28
-msgid "Create New Branch"
-msgstr "Skapa ny gren"
-
-#: lib/branch_create.tcl:33 lib/choose_repository.tcl:389
-msgid "Create"
-msgstr "Skapa"
-
-#: lib/branch_create.tcl:42
-msgid "Branch Name"
-msgstr "Namn på gren"
-
-#: lib/branch_create.tcl:44 lib/remote_add.tcl:41 lib/tools_dlg.tcl:51
-msgid "Name:"
-msgstr "Namn:"
-
-#: lib/branch_create.tcl:57
-msgid "Match Tracking Branch Name"
-msgstr "Använd namn på spårad gren"
-
-#: lib/branch_create.tcl:66
-msgid "Starting Revision"
-msgstr "Inledande revision"
-
-#: lib/branch_create.tcl:72
-msgid "Update Existing Branch:"
-msgstr "Uppdatera befintlig gren:"
-
-#: lib/branch_create.tcl:75
-msgid "No"
-msgstr "Nej"
-
-#: lib/branch_create.tcl:80
-msgid "Fast Forward Only"
-msgstr "Endast snabbspolning"
-
-#: lib/branch_create.tcl:85 lib/checkout_op.tcl:571
-msgid "Reset"
-msgstr "Återställ"
-
-#: lib/branch_create.tcl:97
-msgid "Checkout After Creation"
-msgstr "Checka ut när skapad"
-
-#: lib/branch_create.tcl:132
-msgid "Please select a tracking branch."
-msgstr "Välj en gren att spåra."
-
-#: lib/branch_create.tcl:141
-#, tcl-format
-msgid "Tracking branch %s is not a branch in the remote repository."
-msgstr "Den spårade grenen %s är inte en gren i fjärrarkivet."
-
-#: lib/branch_create.tcl:154 lib/branch_rename.tcl:92
-msgid "Please supply a branch name."
-msgstr "Ange ett namn för grenen."
-
-#: lib/branch_create.tcl:165 lib/branch_rename.tcl:112
-#, tcl-format
-msgid "'%s' is not an acceptable branch name."
-msgstr "\"%s\" kan inte användas som namn på grenen."
-
-#: lib/branch_delete.tcl:16
-msgid "Delete Branch"
-msgstr "Ta bort gren"
-
-#: lib/branch_delete.tcl:21
-msgid "Delete Local Branch"
-msgstr "Ta bort lokal gren"
-
-#: lib/branch_delete.tcl:39
-msgid "Local Branches"
-msgstr "Lokala grenar"
-
-#: lib/branch_delete.tcl:51
-msgid "Delete Only If Merged Into"
-msgstr "Ta bara bort om sammanslagen med"
-
-#: lib/branch_delete.tcl:53 lib/remote_branch_delete.tcl:120
-msgid "Always (Do not perform merge checks)"
-msgstr "Alltid (utför inte sammanslagningstest)"
-
-#: lib/branch_delete.tcl:103
-#, tcl-format
-msgid "The following branches are not completely merged into %s:"
-msgstr "Följande grenar är inte till fullo sammanslagna med %s:"
-
-#: lib/branch_delete.tcl:115 lib/remote_branch_delete.tcl:218
-msgid ""
-"Recovering deleted branches is difficult.\n"
-"\n"
-"Delete the selected branches?"
-msgstr ""
-"Det kan vara svårt att återställa borttagna grenar.\n"
-"\n"
-"Ta bort de valda grenarna?"
-
-#: lib/branch_delete.tcl:141
-#, tcl-format
-msgid ""
-"Failed to delete branches:\n"
-"%s"
-msgstr ""
-"Kunde inte ta bort grenar:\n"
-"%s"
-
-#: lib/branch_rename.tcl:15 lib/branch_rename.tcl:23
-msgid "Rename Branch"
-msgstr "Byt namn på gren"
-
-#: lib/branch_rename.tcl:28
-msgid "Rename"
-msgstr "Byt namn"
-
-#: lib/branch_rename.tcl:38
-msgid "Branch:"
-msgstr "Gren:"
-
-#: lib/branch_rename.tcl:46
-msgid "New Name:"
-msgstr "Nytt namn:"
-
-#: lib/branch_rename.tcl:81
-msgid "Please select a branch to rename."
-msgstr "Välj en gren att byta namn på."
-
-#: lib/branch_rename.tcl:102 lib/checkout_op.tcl:202
-#, tcl-format
-msgid "Branch '%s' already exists."
-msgstr "Grenen \"%s\" finns redan."
-
-#: lib/branch_rename.tcl:123
-#, tcl-format
-msgid "Failed to rename '%s'."
-msgstr "Kunde inte byta namn på \"%s\"."
-
-#: lib/browser.tcl:17
-msgid "Starting..."
-msgstr "Startar..."
-
-#: lib/browser.tcl:27
-msgid "File Browser"
-msgstr "Filbläddrare"
-
-#: lib/browser.tcl:126 lib/browser.tcl:143
-#, tcl-format
-msgid "Loading %s..."
-msgstr "Läser %s..."
+#: lib/console.tcl:59
+msgid "Working... please wait..."
+msgstr "Arbetar... vänta..."
-#: lib/browser.tcl:187
-msgid "[Up To Parent]"
-msgstr "[Upp till förälder]"
+#: lib/console.tcl:81 lib/checkout_op.tcl:146 lib/sshkey.tcl:55
+#: lib/database.tcl:30
+msgid "Close"
+msgstr "Stäng"
-#: lib/browser.tcl:269 lib/browser.tcl:276
-msgid "Browse Branch Files"
-msgstr "Bläddra filer på grenen"
+#: lib/console.tcl:186
+msgid "Success"
+msgstr "Lyckades"
-#: lib/browser.tcl:282 lib/choose_repository.tcl:404
-#: lib/choose_repository.tcl:491 lib/choose_repository.tcl:500
-#: lib/choose_repository.tcl:1027
-msgid "Browse"
-msgstr "Bläddra"
+#: lib/console.tcl:200
+msgid "Error: Command Failed"
+msgstr "Fel: Kommando misslyckades"
#: lib/checkout_op.tcl:85
#, tcl-format
@@ -895,11 +642,6 @@ msgstr "Hämtar %s från %s"
msgid "fatal: Cannot resolve %s"
msgstr "ödesdigert: Kunde inte slå upp %s"
-#: lib/checkout_op.tcl:146 lib/console.tcl:81 lib/database.tcl:30
-#: lib/sshkey.tcl:55
-msgid "Close"
-msgstr "Stäng"
-
#: lib/checkout_op.tcl:175
#, tcl-format
msgid "Branch '%s' does not exist."
@@ -910,6 +652,11 @@ msgstr "Grenen \"%s\" finns inte."
msgid "Failed to configure simplified git-pull for '%s'."
msgstr "Kunde inte konfigurera förenklad git-pull för '%s'."
+#: lib/checkout_op.tcl:202 lib/branch_rename.tcl:102
+#, tcl-format
+msgid "Branch '%s' already exists."
+msgstr "Grenen \"%s\" finns redan."
+
#: lib/checkout_op.tcl:229
#, tcl-format
msgid ""
@@ -1008,10 +755,23 @@ msgstr "Det kanske inte är så enkelt att återskapa förlorade incheckningar."
msgid "Reset '%s'?"
msgstr "Återställa \"%s\"?"
-#: lib/checkout_op.tcl:567 lib/merge.tcl:164 lib/tools_dlg.tcl:336
+#: lib/checkout_op.tcl:567 lib/merge.tcl:166 lib/tools_dlg.tcl:336
msgid "Visualize"
msgstr "Visualisera"
+#: lib/checkout_op.tcl:571 lib/branch_create.tcl:85
+msgid "Reset"
+msgstr "Återställ"
+
+#: lib/checkout_op.tcl:579 lib/transport.tcl:141 lib/remote_add.tcl:34
+#: lib/browser.tcl:292 lib/merge.tcl:174 lib/branch_checkout.tcl:30
+#: lib/choose_font.tcl:45 lib/option.tcl:127 lib/tools_dlg.tcl:41
+#: lib/tools_dlg.tcl:202 lib/tools_dlg.tcl:345 lib/branch_rename.tcl:32
+#: lib/remote_branch_delete.tcl:43 lib/branch_create.tcl:37
+#: lib/branch_delete.tcl:34
+msgid "Cancel"
+msgstr "Avbryt"
+
#: lib/checkout_op.tcl:635
#, tcl-format
msgid ""
@@ -1029,544 +789,442 @@ msgstr ""
"\n"
"Detta skulle inte ha hänt. %s kommer nu stängas och ge upp."
-#: lib/choose_font.tcl:41
-msgid "Select"
-msgstr "Välj"
-
-#: lib/choose_font.tcl:55
-msgid "Font Family"
-msgstr "Teckensnittsfamilj"
-
-#: lib/choose_font.tcl:76
-msgid "Font Size"
-msgstr "Storlek"
-
-#: lib/choose_font.tcl:93
-msgid "Font Example"
-msgstr "Exempel"
-
-#: lib/choose_font.tcl:105
-msgid ""
-"This is example text.\n"
-"If you like this text, it can be your font."
-msgstr ""
-"Detta är en exempeltext.\n"
-"Om du tycker om den här texten kan den vara ditt teckensnitt."
-
-#: lib/choose_repository.tcl:28
-msgid "Git Gui"
-msgstr "Git Gui"
-
-#: lib/choose_repository.tcl:87 lib/choose_repository.tcl:394
-msgid "Create New Repository"
-msgstr "Skapa nytt arkiv"
-
-#: lib/choose_repository.tcl:93
-msgid "New..."
-msgstr "Nytt..."
-
-#: lib/choose_repository.tcl:100 lib/choose_repository.tcl:478
-msgid "Clone Existing Repository"
-msgstr "Klona befintligt arkiv"
-
-#: lib/choose_repository.tcl:111
-msgid "Clone..."
-msgstr "Klona..."
-
-#: lib/choose_repository.tcl:118 lib/choose_repository.tcl:1017
-msgid "Open Existing Repository"
-msgstr "Öppna befintligt arkiv"
-
-#: lib/choose_repository.tcl:124
-msgid "Open..."
-msgstr "Öppna..."
-
-#: lib/choose_repository.tcl:137
-msgid "Recent Repositories"
-msgstr "Senaste arkiven"
-
-#: lib/choose_repository.tcl:143
-msgid "Open Recent Repository:"
-msgstr "Öppna tidigare arkiv:"
-
-#: lib/choose_repository.tcl:313 lib/choose_repository.tcl:320
-#: lib/choose_repository.tcl:327
+#: lib/transport.tcl:6 lib/remote_add.tcl:132
#, tcl-format
-msgid "Failed to create repository %s:"
-msgstr "Kunde inte skapa arkivet %s:"
-
-#: lib/choose_repository.tcl:399
-msgid "Directory:"
-msgstr "Katalog:"
-
-#: lib/choose_repository.tcl:429 lib/choose_repository.tcl:550
-#: lib/choose_repository.tcl:1051
-msgid "Git Repository"
-msgstr "Gitarkiv"
+msgid "fetch %s"
+msgstr "hämta %s"
-#: lib/choose_repository.tcl:454
+#: lib/transport.tcl:7
#, tcl-format
-msgid "Directory %s already exists."
-msgstr "Katalogen %s finns redan."
+msgid "Fetching new changes from %s"
+msgstr "Hämtar nya ändringar från %s"
-#: lib/choose_repository.tcl:458
+#: lib/transport.tcl:18
#, tcl-format
-msgid "File %s already exists."
-msgstr "Filen %s finns redan."
-
-#: lib/choose_repository.tcl:473
-msgid "Clone"
-msgstr "Klona"
-
-#: lib/choose_repository.tcl:486
-msgid "Source Location:"
-msgstr "Plats för källkod:"
+msgid "remote prune %s"
+msgstr "fjärrborttagning %s"
-#: lib/choose_repository.tcl:495
-msgid "Target Directory:"
-msgstr "Målkatalog:"
+#: lib/transport.tcl:19
+#, tcl-format
+msgid "Pruning tracking branches deleted from %s"
+msgstr "Tar bort spårande grenar som tagits bort från %s"
-#: lib/choose_repository.tcl:505
-msgid "Clone Type:"
-msgstr "Typ av klon:"
+#: lib/transport.tcl:25
+msgid "fetch all remotes"
+msgstr "hämta alla fjärrarkiv"
-#: lib/choose_repository.tcl:510
-msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
-msgstr "Standard (snabb, semiredundant, hårda länkar)"
+#: lib/transport.tcl:26
+msgid "Fetching new changes from all remotes"
+msgstr "Hämtar nya ändringar från alla fjärrarkiv"
-#: lib/choose_repository.tcl:515
-msgid "Full Copy (Slower, Redundant Backup)"
-msgstr "Full kopia (långsammare, redundant säkerhetskopia)"
+#: lib/transport.tcl:40
+msgid "remote prune all remotes"
+msgstr "rensa alla fjärrarkiv"
-#: lib/choose_repository.tcl:520
-msgid "Shared (Fastest, Not Recommended, No Backup)"
-msgstr "Delad (snabbast, rekommenderas ej, ingen säkerhetskopia)"
+#: lib/transport.tcl:41
+msgid "Pruning tracking branches deleted from all remotes"
+msgstr "Rensar spårande grenar som tagits bort, från alla fjärrarkiv"
-#: lib/choose_repository.tcl:556 lib/choose_repository.tcl:603
-#: lib/choose_repository.tcl:749 lib/choose_repository.tcl:819
-#: lib/choose_repository.tcl:1057 lib/choose_repository.tcl:1065
+#: lib/transport.tcl:54 lib/transport.tcl:92 lib/transport.tcl:110
+#: lib/remote_add.tcl:162
#, tcl-format
-msgid "Not a Git repository: %s"
-msgstr "Inte ett Gitarkiv: %s"
-
-#: lib/choose_repository.tcl:592
-msgid "Standard only available for local repository."
-msgstr "Standard är endast tillgängligt för lokala arkiv."
-
-#: lib/choose_repository.tcl:596
-msgid "Shared only available for local repository."
-msgstr "Delat är endast tillgängligt för lokala arkiv."
+msgid "push %s"
+msgstr "sänd %s"
-#: lib/choose_repository.tcl:617
+#: lib/transport.tcl:55
#, tcl-format
-msgid "Location %s already exists."
-msgstr "Platsen %s finns redan."
-
-#: lib/choose_repository.tcl:628
-msgid "Failed to configure origin"
-msgstr "Kunde inte konfigurera ursprung"
-
-#: lib/choose_repository.tcl:640
-msgid "Counting objects"
-msgstr "Räknar objekt"
-
-#: lib/choose_repository.tcl:641
-msgid "buckets"
-msgstr "hinkar"
+msgid "Pushing changes to %s"
+msgstr "Sänder ändringar till %s"
-#: lib/choose_repository.tcl:665
+#: lib/transport.tcl:93
#, tcl-format
-msgid "Unable to copy objects/info/alternates: %s"
-msgstr "Kunde inte kopiera objekt/info/alternativ: %s"
+msgid "Mirroring to %s"
+msgstr "Speglar till %s"
-#: lib/choose_repository.tcl:701
+#: lib/transport.tcl:111
#, tcl-format
-msgid "Nothing to clone from %s."
-msgstr "Ingenting att klona från %s."
+msgid "Pushing %s %s to %s"
+msgstr "Sänder %s %s till %s"
-#: lib/choose_repository.tcl:703 lib/choose_repository.tcl:917
-#: lib/choose_repository.tcl:929
-msgid "The 'master' branch has not been initialized."
-msgstr "Grenen \"master\" har inte initierats."
+#: lib/transport.tcl:132
+msgid "Push Branches"
+msgstr "Sänd grenar"
-#: lib/choose_repository.tcl:716
-msgid "Hardlinks are unavailable. Falling back to copying."
-msgstr "Hårda länkar är inte tillgängliga. Faller tillbaka på kopiering."
+#: lib/transport.tcl:147
+msgid "Source Branches"
+msgstr "Källgrenar"
-#: lib/choose_repository.tcl:728
-#, tcl-format
-msgid "Cloning from %s"
-msgstr "Klonar från %s"
+#: lib/transport.tcl:162
+msgid "Destination Repository"
+msgstr "Destinationsarkiv"
-#: lib/choose_repository.tcl:759
-msgid "Copying objects"
-msgstr "Kopierar objekt"
+#: lib/transport.tcl:165 lib/remote_branch_delete.tcl:51
+msgid "Remote:"
+msgstr "Fjärrarkiv:"
-#: lib/choose_repository.tcl:760
-msgid "KiB"
-msgstr "KiB"
+#: lib/transport.tcl:187 lib/remote_branch_delete.tcl:72
+msgid "Arbitrary Location:"
+msgstr "Godtycklig plats:"
-#: lib/choose_repository.tcl:784
-#, tcl-format
-msgid "Unable to copy object: %s"
-msgstr "Kunde inte kopiera objekt: %s"
+#: lib/transport.tcl:205
+msgid "Transfer Options"
+msgstr "Överföringsalternativ"
-#: lib/choose_repository.tcl:794
-msgid "Linking objects"
-msgstr "Länkar objekt"
+#: lib/transport.tcl:207
+msgid "Force overwrite existing branch (may discard changes)"
+msgstr "Tvinga överskrivning av befintlig gren (kan kasta bort ändringar)"
-#: lib/choose_repository.tcl:795
-msgid "objects"
-msgstr "objekt"
+#: lib/transport.tcl:211
+msgid "Use thin pack (for slow network connections)"
+msgstr "Använd tunt paket (för långsamma nätverksanslutningar)"
-#: lib/choose_repository.tcl:803
-#, tcl-format
-msgid "Unable to hardlink object: %s"
-msgstr "Kunde inte hårdlänka objekt: %s"
+#: lib/transport.tcl:215
+msgid "Include tags"
+msgstr "Ta med taggar"
-#: lib/choose_repository.tcl:858
-msgid "Cannot fetch branches and objects. See console output for details."
-msgstr "Kunde inte hämta grenar och objekt. Se konsolutdata för detaljer."
+#: lib/remote_add.tcl:20
+msgid "Add Remote"
+msgstr "Lägg till fjärrarkiv"
-#: lib/choose_repository.tcl:869
-msgid "Cannot fetch tags. See console output for details."
-msgstr "Kunde inte hämta taggar. Se konsolutdata för detaljer."
+#: lib/remote_add.tcl:25
+msgid "Add New Remote"
+msgstr "Lägg till nytt fjärrarkiv"
-#: lib/choose_repository.tcl:893
-msgid "Cannot determine HEAD. See console output for details."
-msgstr "Kunde inte avgöra HEAD. Se konsolutdata för detaljer."
+#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37
+msgid "Add"
+msgstr "Lägg till"
-#: lib/choose_repository.tcl:902
-#, tcl-format
-msgid "Unable to cleanup %s"
-msgstr "Kunde inte städa upp %s"
+#: lib/remote_add.tcl:39
+msgid "Remote Details"
+msgstr "Detaljer för fjärrarkiv"
-#: lib/choose_repository.tcl:908
-msgid "Clone failed."
-msgstr "Kloning misslyckades."
+#: lib/remote_add.tcl:41 lib/tools_dlg.tcl:51 lib/branch_create.tcl:44
+msgid "Name:"
+msgstr "Namn:"
-#: lib/choose_repository.tcl:915
-msgid "No default branch obtained."
-msgstr "Hämtade ingen standardgren."
+#: lib/remote_add.tcl:50
+msgid "Location:"
+msgstr "Plats:"
-#: lib/choose_repository.tcl:926
-#, tcl-format
-msgid "Cannot resolve %s as a commit."
-msgstr "Kunde inte slå upp %s till någon incheckning."
+#: lib/remote_add.tcl:60
+msgid "Further Action"
+msgstr "Ytterligare åtgärd"
-#: lib/choose_repository.tcl:938
-msgid "Creating working directory"
-msgstr "Skapar arbetskatalog"
+#: lib/remote_add.tcl:63
+msgid "Fetch Immediately"
+msgstr "Hämta omedelbart"
-#: lib/choose_repository.tcl:939 lib/index.tcl:70 lib/index.tcl:133
-#: lib/index.tcl:201
-msgid "files"
-msgstr "filer"
+#: lib/remote_add.tcl:69
+msgid "Initialize Remote Repository and Push"
+msgstr "Initiera fjärrarkiv och sänd till"
-#: lib/choose_repository.tcl:968
-msgid "Initial file checkout failed."
-msgstr "Inledande filutcheckning misslyckades."
+#: lib/remote_add.tcl:75
+msgid "Do Nothing Else Now"
+msgstr "Gör ingent mer nu"
-#: lib/choose_repository.tcl:1012
-msgid "Open"
-msgstr "Öppna"
+#: lib/remote_add.tcl:100
+msgid "Please supply a remote name."
+msgstr "Ange ett namn för fjärrarkivet."
-#: lib/choose_repository.tcl:1022
-msgid "Repository:"
-msgstr "Arkiv:"
+#: lib/remote_add.tcl:113
+#, tcl-format
+msgid "'%s' is not an acceptable remote name."
+msgstr "\"%s\" kan inte användas som namn på fjärrarkivet."
-#: lib/choose_repository.tcl:1071
+#: lib/remote_add.tcl:124
#, tcl-format
-msgid "Failed to open repository %s:"
-msgstr "Kunde inte öppna arkivet %s:"
+msgid "Failed to add remote '%s' of location '%s'."
+msgstr "Kunde inte lägga till fjärrarkivet \"%s\" på platsen \"%s\"."
-#: lib/choose_rev.tcl:52
-msgid "This Detached Checkout"
-msgstr "Denna frånkopplade utcheckning"
+#: lib/remote_add.tcl:133
+#, tcl-format
+msgid "Fetching the %s"
+msgstr "Hämtar %s"
-#: lib/choose_rev.tcl:60
-msgid "Revision Expression:"
-msgstr "Revisionsuttryck:"
+#: lib/remote_add.tcl:156
+#, tcl-format
+msgid "Do not know how to initialize repository at location '%s'."
+msgstr "Vet inte hur arkivet på platsen \"%s\" skall initieras."
-#: lib/choose_rev.tcl:72
-msgid "Local Branch"
-msgstr "Lokal gren"
+#: lib/remote_add.tcl:163
+#, tcl-format
+msgid "Setting up the %s (at %s)"
+msgstr "Konfigurerar %s (på %s)"
-#: lib/choose_rev.tcl:77
-msgid "Tracking Branch"
-msgstr "Spårande gren"
+#: lib/browser.tcl:17
+msgid "Starting..."
+msgstr "Startar..."
-#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:543
-msgid "Tag"
-msgstr "Tagg"
+#: lib/browser.tcl:27
+msgid "File Browser"
+msgstr "Filbläddrare"
-#: lib/choose_rev.tcl:321
+#: lib/browser.tcl:132 lib/browser.tcl:149
#, tcl-format
-msgid "Invalid revision: %s"
-msgstr "Ogiltig revision: %s"
-
-#: lib/choose_rev.tcl:342
-msgid "No revision selected."
-msgstr "Ingen revision vald."
+msgid "Loading %s..."
+msgstr "Läser %s..."
-#: lib/choose_rev.tcl:350
-msgid "Revision expression is empty."
-msgstr "Revisionsuttrycket är tomt."
+#: lib/browser.tcl:193
+msgid "[Up To Parent]"
+msgstr "[Upp till förälder]"
-#: lib/choose_rev.tcl:536
-msgid "Updated"
-msgstr "Uppdaterad"
+#: lib/browser.tcl:275 lib/browser.tcl:282
+msgid "Browse Branch Files"
+msgstr "Bläddra filer på grenen"
-#: lib/choose_rev.tcl:564
-msgid "URL"
-msgstr "Webbadress"
+#: lib/browser.tcl:288 lib/choose_repository.tcl:422
+#: lib/choose_repository.tcl:509 lib/choose_repository.tcl:518
+#: lib/choose_repository.tcl:1074
+msgid "Browse"
+msgstr "Bläddra"
-#: lib/commit.tcl:9
-msgid ""
-"There is nothing to amend.\n"
-"\n"
-"You are about to create the initial commit. There is no commit before this "
-"to amend.\n"
-msgstr ""
-"Det finns ingenting att utöka.\n"
-"\n"
-"Du håller på att skapa den inledande incheckningen. Det finns ingen tidigare "
-"incheckning att utöka.\n"
+#: lib/browser.tcl:297 lib/branch_checkout.tcl:35 lib/tools_dlg.tcl:321
+msgid "Revision"
+msgstr "Revision"
-#: lib/commit.tcl:18
+#: lib/merge.tcl:13
msgid ""
-"Cannot amend while merging.\n"
+"Cannot merge while amending.\n"
"\n"
-"You are currently in the middle of a merge that has not been fully "
-"completed. You cannot amend the prior commit unless you first abort the "
-"current merge activity.\n"
+"You must finish amending this commit before starting any type of merge.\n"
msgstr ""
-"Kan inte utöka vid sammanslagning.\n"
+"Kan inte slå ihop vid utökning.\n"
"\n"
-"Du är i mitten av en sammanslagning som inte är fullbordad. Du kan inte "
-"utöka tidigare incheckningar om du inte först avbryter den pågående "
-"sammanslagningen.\n"
-
-#: lib/commit.tcl:48
-msgid "Error loading commit data for amend:"
-msgstr "Fel vid inläsning av incheckningsdata för utökning:"
-
-#: lib/commit.tcl:75
-msgid "Unable to obtain your identity:"
-msgstr "Kunde inte hämta din identitet:"
-
-#: lib/commit.tcl:80
-msgid "Invalid GIT_COMMITTER_IDENT:"
-msgstr "Felaktig GIT_COMMITTER_IDENT:"
-
-#: lib/commit.tcl:129
-#, tcl-format
-msgid "warning: Tcl does not support encoding '%s'."
-msgstr "varning: Tcl stöder inte teckenkodningen \"%s\"."
+"Du måste göra färdig utökningen av incheckningen innan du påbörjar någon "
+"slags sammanslagning.\n"
-#: lib/commit.tcl:149
+#: lib/merge.tcl:27
msgid ""
"Last scanned state does not match repository state.\n"
"\n"
"Another Git program has modified this repository since the last scan. A "
-"rescan must be performed before another commit can be created.\n"
+"rescan must be performed before a merge can be performed.\n"
"\n"
"The rescan will be automatically started now.\n"
msgstr ""
"Det senaste inlästa tillståndet motsvarar inte tillståndet i arkivet.\n"
"\n"
"Ett annat Git-program har ändrat arkivet sedan senaste avsökningen. Du måste "
-"utföra en ny sökning innan du kan göra en ny incheckning.\n"
+"utföra en ny sökning innan du kan utföra en sammanslagning.\n"
"\n"
"Sökningen kommer att startas automatiskt nu.\n"
-#: lib/commit.tcl:172
+#: lib/merge.tcl:45
#, tcl-format
msgid ""
-"Unmerged files cannot be committed.\n"
+"You are in the middle of a conflicted merge.\n"
"\n"
-"File %s has merge conflicts. You must resolve them and stage the file "
-"before committing.\n"
+"File %s has merge conflicts.\n"
+"\n"
+"You must resolve them, stage the file, and commit to complete the current "
+"merge. Only then can you begin another merge.\n"
msgstr ""
-"Osammanslagna filer kan inte checkas in.\n"
+"Du är mitt i en sammanslagning med konflikter.\n"
"\n"
-"Filen %s har sammanslagningskonflikter. Du måste lösa dem och köa filen "
-"innan du checkar in den.\n"
+"Filen %s har sammanslagningskonflikter.\n"
+"\n"
+"Du måste lösa dem, köa filen och checka in för att fullborda den aktuella "
+"sammanslagningen. När du gjort det kan du påbörja en ny sammanslagning.\n"
-#: lib/commit.tcl:180
+#: lib/merge.tcl:55
#, tcl-format
msgid ""
-"Unknown file state %s detected.\n"
+"You are in the middle of a change.\n"
"\n"
-"File %s cannot be committed by this program.\n"
+"File %s is modified.\n"
+"\n"
+"You should complete the current commit before starting a merge. Doing so "
+"will help you abort a failed merge, should the need arise.\n"
msgstr ""
-"Okänd filstatus %s upptäckt.\n"
+"Du är mitt i en ändring.\n"
"\n"
-"Filen %s kan inte checkas in av programmet.\n"
+"Filen %s har ändringar.\n"
+"\n"
+"Du bör fullborda den aktuella incheckningen innan du påbörjar en "
+"sammanslagning. Om du gör det blir det enklare att avbryta en misslyckad "
+"sammanslagning, om det skulle vara nödvändigt.\n"
+
+#: lib/merge.tcl:108
+#, tcl-format
+msgid "%s of %s"
+msgstr "%s av %s"
+
+#: lib/merge.tcl:122
+#, tcl-format
+msgid "Merging %s and %s..."
+msgstr "Slår ihop %s och %s..."
+
+#: lib/merge.tcl:133
+msgid "Merge completed successfully."
+msgstr "Sammanslagningen avslutades framgångsrikt."
-#: lib/commit.tcl:188
+#: lib/merge.tcl:135
+msgid "Merge failed. Conflict resolution is required."
+msgstr "Sammanslagningen misslyckades. Du måste lösa konflikterna."
+
+#: lib/merge.tcl:160
+#, tcl-format
+msgid "Merge Into %s"
+msgstr "Slå ihop i %s"
+
+#: lib/merge.tcl:179
+msgid "Revision To Merge"
+msgstr "Revisioner att slå ihop"
+
+#: lib/merge.tcl:214
msgid ""
-"No changes to commit.\n"
+"Cannot abort while amending.\n"
"\n"
-"You must stage at least 1 file before you can commit.\n"
+"You must finish amending this commit.\n"
msgstr ""
-"Inga ändringar att checka in.\n"
+"Kan inte avbryta vid utökning.\n"
"\n"
-"Du måste köa åtminstone en fil innan du kan checka in.\n"
+"Du måste göra dig färdig med att utöka incheckningen.\n"
-#: lib/commit.tcl:203
+#: lib/merge.tcl:224
msgid ""
-"Please supply a commit message.\n"
+"Abort merge?\n"
"\n"
-"A good commit message has the following format:\n"
+"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n"
"\n"
-"- First line: Describe in one sentence what you did.\n"
-"- Second line: Blank\n"
-"- Remaining lines: Describe why this change is good.\n"
+"Continue with aborting the current merge?"
msgstr ""
-"Ange ett incheckningsmeddelande.\n"
+"Avbryt sammanslagning?\n"
"\n"
-"Ett bra incheckningsmeddelande har följande format:\n"
+"Om du avbryter sammanslagningen kommer *ALLA* ej incheckade ändringar att gå "
+"förlorade.\n"
"\n"
-"- Första raden: Beskriv i en mening vad du gjorde.\n"
-"- Andra raden: Tom\n"
-"- Följande rader: Beskriv varför det här är en bra ändring.\n"
-
-#: lib/commit.tcl:234
-msgid "Calling pre-commit hook..."
-msgstr "Anropar kroken före incheckning (pre-commit)..."
+"Gå vidare med att avbryta den aktuella sammanslagningen?"
-#: lib/commit.tcl:249
-msgid "Commit declined by pre-commit hook."
-msgstr "Incheckningen avvisades av kroken före incheckning (pre-commit)."
+#: lib/merge.tcl:230
+msgid ""
+"Reset changes?\n"
+"\n"
+"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n"
+"\n"
+"Continue with resetting the current changes?"
+msgstr ""
+"Återställ ändringar?\n"
+"\n"
+"Om du återställer ändringarna kommer *ALLA* ej incheckade ändringar att gå "
+"förlorade.\n"
+"\n"
+"Gå vidare med att återställa de aktuella ändringarna?"
-#: lib/commit.tcl:272
-msgid "Calling commit-msg hook..."
-msgstr "Anropar kroken för incheckningsmeddelande (commit-msg)..."
+#: lib/merge.tcl:241
+msgid "Aborting"
+msgstr "Avbryter"
-#: lib/commit.tcl:287
-msgid "Commit declined by commit-msg hook."
-msgstr "Incheckning avvisad av kroken för incheckningsmeddelande (commit-msg)."
+#: lib/merge.tcl:241
+msgid "files reset"
+msgstr "filer återställda"
-#: lib/commit.tcl:300
-msgid "Committing changes..."
-msgstr "Checkar in ändringar..."
+#: lib/merge.tcl:269
+msgid "Abort failed."
+msgstr "Misslyckades avbryta."
-#: lib/commit.tcl:316
-msgid "write-tree failed:"
-msgstr "write-tree misslyckades:"
+#: lib/merge.tcl:271
+msgid "Abort completed. Ready."
+msgstr "Avbrytning fullbordad. Redo."
-#: lib/commit.tcl:317 lib/commit.tcl:361 lib/commit.tcl:382
-msgid "Commit failed."
-msgstr "Incheckningen misslyckades."
+#: lib/tools.tcl:75
+#, tcl-format
+msgid "Running %s requires a selected file."
+msgstr "För att starta %s måste du välja en fil."
-#: lib/commit.tcl:334
+#: lib/tools.tcl:91
#, tcl-format
-msgid "Commit %s appears to be corrupt"
-msgstr "Incheckningen %s verkar vara trasig"
+msgid "Are you sure you want to run %1$s on file \"%2$s\"?"
+msgstr "Är du säker på att du vill starta %1$s med filen \"%2$s\"?"
-#: lib/commit.tcl:339
-msgid ""
-"No changes to commit.\n"
-"\n"
-"No files were modified by this commit and it was not a merge commit.\n"
-"\n"
-"A rescan will be automatically started now.\n"
-msgstr ""
-"Inga ändringar att checka in.\n"
-"\n"
-"Inga filer ändrades av incheckningen och det var inte en sammanslagning.\n"
-"\n"
-"En sökning kommer att startas automatiskt nu.\n"
+#: lib/tools.tcl:95
+#, tcl-format
+msgid "Are you sure you want to run %s?"
+msgstr "Är du säker på att du vill starta %s?"
-#: lib/commit.tcl:346
-msgid "No changes to commit."
-msgstr "Inga ändringar att checka in."
+#: lib/tools.tcl:116
+#, tcl-format
+msgid "Tool: %s"
+msgstr "Verktyg: %s"
-#: lib/commit.tcl:360
-msgid "commit-tree failed:"
-msgstr "commit-tree misslyckades:"
+#: lib/tools.tcl:117
+#, tcl-format
+msgid "Running: %s"
+msgstr "Exekverar: %s"
-#: lib/commit.tcl:381
-msgid "update-ref failed:"
-msgstr "update-ref misslyckades:"
+#: lib/tools.tcl:155
+#, tcl-format
+msgid "Tool completed successfully: %s"
+msgstr "Verktyget avslutades framgångsrikt: %s"
-#: lib/commit.tcl:469
+#: lib/tools.tcl:157
#, tcl-format
-msgid "Created commit %s: %s"
-msgstr "Skapade incheckningen %s: %s"
+msgid "Tool failed: %s"
+msgstr "Verktyget misslyckades: %s"
-#: lib/console.tcl:59
-msgid "Working... please wait..."
-msgstr "Arbetar... vänta..."
+#: lib/branch_checkout.tcl:16 lib/branch_checkout.tcl:21
+msgid "Checkout Branch"
+msgstr "Checka ut gren"
-#: lib/console.tcl:186
-msgid "Success"
-msgstr "Lyckades"
+#: lib/branch_checkout.tcl:26
+msgid "Checkout"
+msgstr "Checka ut"
-#: lib/console.tcl:200
-msgid "Error: Command Failed"
-msgstr "Fel: Kommando misslyckades"
+#: lib/branch_checkout.tcl:39 lib/option.tcl:310 lib/branch_create.tcl:69
+msgid "Options"
+msgstr "Alternativ"
-#: lib/database.tcl:42
-msgid "Number of loose objects"
-msgstr "Antal lösa objekt"
+#: lib/branch_checkout.tcl:42 lib/branch_create.tcl:92
+msgid "Fetch Tracking Branch"
+msgstr "Hämta spårande gren"
-#: lib/database.tcl:43
-msgid "Disk space used by loose objects"
-msgstr "Diskutrymme använt av lösa objekt"
+#: lib/branch_checkout.tcl:47
+msgid "Detach From Local Branch"
+msgstr "Koppla bort från lokal gren"
-#: lib/database.tcl:44
-msgid "Number of packed objects"
-msgstr "Antal packade objekt"
+#: lib/spellcheck.tcl:57
+msgid "Unsupported spell checker"
+msgstr "Stavningskontrollprogrammet stöds inte"
-#: lib/database.tcl:45
-msgid "Number of packs"
-msgstr "Antal paket"
+#: lib/spellcheck.tcl:65
+msgid "Spell checking is unavailable"
+msgstr "Stavningskontroll är ej tillgänglig"
-#: lib/database.tcl:46
-msgid "Disk space used by packed objects"
-msgstr "Diskutrymme använt av packade objekt"
+#: lib/spellcheck.tcl:68
+msgid "Invalid spell checking configuration"
+msgstr "Ogiltig inställning för stavningskontroll"
-#: lib/database.tcl:47
-msgid "Packed objects waiting for pruning"
-msgstr "Packade objekt som väntar på städning"
+#: lib/spellcheck.tcl:70
+#, tcl-format
+msgid "Reverting dictionary to %s."
+msgstr "Återställer ordlistan till %s."
-#: lib/database.tcl:48
-msgid "Garbage files"
-msgstr "Skräpfiler"
+#: lib/spellcheck.tcl:73
+msgid "Spell checker silently failed on startup"
+msgstr "Stavningskontroll misslyckades tyst vid start"
-#: lib/database.tcl:72
-msgid "Compressing the object database"
-msgstr "Komprimerar objektdatabasen"
+#: lib/spellcheck.tcl:80
+msgid "Unrecognized spell checker"
+msgstr "Stavningskontrollprogrammet känns inte igen"
-#: lib/database.tcl:83
-msgid "Verifying the object database with fsck-objects"
-msgstr "Verifierar objektdatabasen med fsck-objects"
+#: lib/spellcheck.tcl:186
+msgid "No Suggestions"
+msgstr "Inga förslag"
-#: lib/database.tcl:107
-#, tcl-format
-msgid ""
-"This repository currently has approximately %i loose objects.\n"
-"\n"
-"To maintain optimal performance it is strongly recommended that you compress "
-"the database.\n"
-"\n"
-"Compress the database now?"
-msgstr ""
-"Arkivet har för närvarande omkring %i lösa objekt.\n"
-"\n"
-"För att bibehålla optimal prestanda rekommenderas det å det bestämdaste att "
-"du komprimerar databasen.\n"
-"\n"
-"Komprimera databasen nu?"
+#: lib/spellcheck.tcl:388
+msgid "Unexpected EOF from spell checker"
+msgstr "Oväntat filslut från stavningskontroll"
-#: lib/date.tcl:25
+#: lib/spellcheck.tcl:392
+msgid "Spell Checker Failed"
+msgstr "Stavningskontroll misslyckades"
+
+#: lib/status_bar.tcl:87
#, tcl-format
-msgid "Invalid date from Git: %s"
-msgstr "Ogiltigt datum från Git: %s"
+msgid "%s ... %*i of %*i %s (%3i%%)"
+msgstr "%s... %*i av %*i %s (%3i%%)"
-#: lib/diff.tcl:64
+#: lib/diff.tcl:77
#, tcl-format
msgid ""
"No differences detected.\n"
@@ -1589,12 +1247,12 @@ msgstr ""
"En sökning kommer automatiskt att startas för att hitta andra filer som kan "
"vara i samma tillstånd."
-#: lib/diff.tcl:104
+#: lib/diff.tcl:117
#, tcl-format
msgid "Loading diff of %s..."
msgstr "Läser differens för %s..."
-#: lib/diff.tcl:125
+#: lib/diff.tcl:140
msgid ""
"LOCAL: deleted\n"
"REMOTE:\n"
@@ -1602,7 +1260,7 @@ msgstr ""
"LOKAL: borttagen\n"
"FJÄRR:\n"
-#: lib/diff.tcl:130
+#: lib/diff.tcl:145
msgid ""
"REMOTE: deleted\n"
"LOCAL:\n"
@@ -1610,32 +1268,32 @@ msgstr ""
"FJÄRR: borttagen\n"
"LOKAL:\n"
-#: lib/diff.tcl:137
+#: lib/diff.tcl:152
msgid "LOCAL:\n"
msgstr "LOKAL:\n"
-#: lib/diff.tcl:140
+#: lib/diff.tcl:155
msgid "REMOTE:\n"
msgstr "FJÄRR:\n"
-#: lib/diff.tcl:202 lib/diff.tcl:322
+#: lib/diff.tcl:217 lib/diff.tcl:355
#, tcl-format
msgid "Unable to display %s"
msgstr "Kan inte visa %s"
-#: lib/diff.tcl:203
+#: lib/diff.tcl:218
msgid "Error loading file:"
msgstr "Fel vid läsning av fil:"
-#: lib/diff.tcl:210
+#: lib/diff.tcl:225
msgid "Git Repository (subproject)"
msgstr "Gitarkiv (underprojekt)"
-#: lib/diff.tcl:222
+#: lib/diff.tcl:237
msgid "* Binary file (not showing content)."
msgstr "* Binärfil (visar inte innehållet)."
-#: lib/diff.tcl:227
+#: lib/diff.tcl:242
#, tcl-format
msgid ""
"* Untracked file is %d bytes.\n"
@@ -1644,7 +1302,7 @@ msgstr ""
"* Den ospårade filen är %d byte.\n"
"* Visar endast inledande %d byte.\n"
-#: lib/diff.tcl:233
+#: lib/diff.tcl:248
#, tcl-format
msgid ""
"\n"
@@ -1655,257 +1313,213 @@ msgstr ""
"* Den ospårade filen klipptes här av %s.\n"
"* För att se hela filen, använd ett externt redigeringsprogram.\n"
-#: lib/diff.tcl:485
+#: lib/diff.tcl:356 lib/blame.tcl:1128
+msgid "Error loading diff:"
+msgstr "Fel vid inläsning av differens:"
+
+#: lib/diff.tcl:578
msgid "Failed to unstage selected hunk."
msgstr "Kunde inte ta bort den valda delen från kön."
-#: lib/diff.tcl:492
+#: lib/diff.tcl:585
msgid "Failed to stage selected hunk."
msgstr "Kunde inte lägga till den valda delen till kön."
-#: lib/diff.tcl:571
+#: lib/diff.tcl:664
msgid "Failed to unstage selected line."
msgstr "Kunde inte ta bort den valda raden från kön."
-#: lib/diff.tcl:579
+#: lib/diff.tcl:672
msgid "Failed to stage selected line."
msgstr "Kunde inte lägga till den valda raden till kön."
-#: lib/encoding.tcl:443
-msgid "Default"
-msgstr "Standard"
+#: lib/remote.tcl:200
+msgid "Push to"
+msgstr "Sänd till"
-#: lib/encoding.tcl:448
-#, tcl-format
-msgid "System (%s)"
-msgstr "Systemets (%s)"
+#: lib/remote.tcl:218
+msgid "Remove Remote"
+msgstr "Ta bort fjärrarkiv"
-#: lib/encoding.tcl:459 lib/encoding.tcl:465
-msgid "Other"
-msgstr "Annan"
+#: lib/remote.tcl:223
+msgid "Prune from"
+msgstr "Ta bort från"
-#: lib/error.tcl:20 lib/error.tcl:116
-msgid "error"
-msgstr "fel"
+#: lib/remote.tcl:228
+msgid "Fetch from"
+msgstr "Hämta från"
-#: lib/error.tcl:36
-msgid "warning"
-msgstr "varning"
+#: lib/choose_font.tcl:41
+msgid "Select"
+msgstr "Välj"
-#: lib/error.tcl:96
-msgid "You must correct the above errors before committing."
-msgstr "Du måste rätta till felen ovan innan du checkar in."
+#: lib/choose_font.tcl:55
+msgid "Font Family"
+msgstr "Teckensnittsfamilj"
-#: lib/index.tcl:6
-msgid "Unable to unlock the index."
-msgstr "Kunde inte låsa upp indexet."
+#: lib/choose_font.tcl:76
+msgid "Font Size"
+msgstr "Storlek"
-#: lib/index.tcl:17
-msgid "Index Error"
-msgstr "Indexfel"
+#: lib/choose_font.tcl:93
+msgid "Font Example"
+msgstr "Exempel"
-#: lib/index.tcl:19
+#: lib/choose_font.tcl:105
msgid ""
-"Updating the Git index failed. A rescan will be automatically started to "
-"resynchronize git-gui."
+"This is example text.\n"
+"If you like this text, it can be your font."
msgstr ""
-"Misslyckades med att uppdatera Gitindexet. En omsökning kommer att startas "
-"automatiskt för att synkronisera om git-gui."
-
-#: lib/index.tcl:30
-msgid "Continue"
-msgstr "Fortsätt"
+"Detta är en exempeltext.\n"
+"Om du tycker om den här texten kan den vara ditt teckensnitt."
-#: lib/index.tcl:33
-msgid "Unlock Index"
-msgstr "Lås upp index"
+#: lib/option.tcl:11
+#, tcl-format
+msgid "Invalid global encoding '%s'"
+msgstr "Den globala teckenkodningen \"%s\" är ogiltig"
-#: lib/index.tcl:292
+#: lib/option.tcl:19
#, tcl-format
-msgid "Unstaging %s from commit"
-msgstr "Tar bort %s för incheckningskön"
+msgid "Invalid repo encoding '%s'"
+msgstr "Arkivets teckenkodning \"%s\" är ogiltig"
-#: lib/index.tcl:331
-msgid "Ready to commit."
-msgstr "Redo att checka in."
+#: lib/option.tcl:119
+msgid "Restore Defaults"
+msgstr "Återställ standardvärden"
-#: lib/index.tcl:344
-#, tcl-format
-msgid "Adding %s"
-msgstr "Lägger till %s"
+#: lib/option.tcl:123
+msgid "Save"
+msgstr "Spara"
-#: lib/index.tcl:401
+#: lib/option.tcl:133
#, tcl-format
-msgid "Revert changes in file %s?"
-msgstr "Återställ ändringarna i filen %s?"
+msgid "%s Repository"
+msgstr "Arkivet %s"
-#: lib/index.tcl:403
-#, tcl-format
-msgid "Revert changes in these %i files?"
-msgstr "Återställ ändringarna i dessa %i filer?"
+#: lib/option.tcl:134
+msgid "Global (All Repositories)"
+msgstr "Globalt (alla arkiv)"
-#: lib/index.tcl:411
-msgid "Any unstaged changes will be permanently lost by the revert."
-msgstr ""
-"Alla oköade ändringar kommer permanent gå förlorade vid återställningen."
+#: lib/option.tcl:140
+msgid "User Name"
+msgstr "Användarnamn"
-#: lib/index.tcl:414
-msgid "Do Nothing"
-msgstr "Gör ingenting"
+#: lib/option.tcl:141
+msgid "Email Address"
+msgstr "E-postadress"
-#: lib/index.tcl:432
-msgid "Reverting selected files"
-msgstr "Återställer valda filer"
+#: lib/option.tcl:143
+msgid "Summarize Merge Commits"
+msgstr "Summera sammanslagningsincheckningar"
-#: lib/index.tcl:436
-#, tcl-format
-msgid "Reverting %s"
-msgstr "Återställer %s"
+#: lib/option.tcl:144
+msgid "Merge Verbosity"
+msgstr "Pratsamhet för sammanslagningar"
-#: lib/merge.tcl:13
-msgid ""
-"Cannot merge while amending.\n"
-"\n"
-"You must finish amending this commit before starting any type of merge.\n"
-msgstr ""
-"Kan inte slå ihop vid utökning.\n"
-"\n"
-"Du måste göra färdig utökningen av incheckningen innan du påbörjar någon "
-"slags sammanslagning.\n"
+#: lib/option.tcl:145
+msgid "Show Diffstat After Merge"
+msgstr "Visa diffstatistik efter sammanslagning"
-#: lib/merge.tcl:27
-msgid ""
-"Last scanned state does not match repository state.\n"
-"\n"
-"Another Git program has modified this repository since the last scan. A "
-"rescan must be performed before a merge can be performed.\n"
-"\n"
-"The rescan will be automatically started now.\n"
-msgstr ""
-"Det senaste inlästa tillståndet motsvarar inte tillståndet i arkivet.\n"
-"\n"
-"Ett annat Git-program har ändrat arkivet sedan senaste avsökningen. Du måste "
-"utföra en ny sökning innan du kan utföra en sammanslagning.\n"
-"\n"
-"Sökningen kommer att startas automatiskt nu.\n"
+#: lib/option.tcl:146
+msgid "Use Merge Tool"
+msgstr "Använd verktyg för sammanslagning"
-#: lib/merge.tcl:45
-#, tcl-format
-msgid ""
-"You are in the middle of a conflicted merge.\n"
-"\n"
-"File %s has merge conflicts.\n"
-"\n"
-"You must resolve them, stage the file, and commit to complete the current "
-"merge. Only then can you begin another merge.\n"
-msgstr ""
-"Du är mitt i en sammanslagning med konflikter.\n"
-"\n"
-"Filen %s har sammanslagningskonflikter.\n"
-"\n"
-"Du måste lösa dem, köa filen och checka in för att fullborda den aktuella "
-"sammanslagningen. När du gjort det kan du påbörja en ny sammanslagning.\n"
+#: lib/option.tcl:148
+msgid "Trust File Modification Timestamps"
+msgstr "Lita på filändringstidsstämplar"
-#: lib/merge.tcl:55
-#, tcl-format
-msgid ""
-"You are in the middle of a change.\n"
-"\n"
-"File %s is modified.\n"
-"\n"
-"You should complete the current commit before starting a merge. Doing so "
-"will help you abort a failed merge, should the need arise.\n"
-msgstr ""
-"Du är mitt i en ändring.\n"
-"\n"
-"Filen %s har ändringar.\n"
-"\n"
-"Du bör fullborda den aktuella incheckningen innan du påbörjar en "
-"sammanslagning. Om du gör det blir det enklare att avbryta en misslyckad "
-"sammanslagning, om det skulle vara nödvändigt.\n"
+#: lib/option.tcl:149
+msgid "Prune Tracking Branches During Fetch"
+msgstr "Städa spårade grenar vid hämtning"
-#: lib/merge.tcl:107
-#, tcl-format
-msgid "%s of %s"
-msgstr "%s av %s"
+#: lib/option.tcl:150
+msgid "Match Tracking Branches"
+msgstr "Matcha spårade grenar"
-#: lib/merge.tcl:120
-#, tcl-format
-msgid "Merging %s and %s..."
-msgstr "Slår ihop %s och %s..."
+#: lib/option.tcl:151
+msgid "Use Textconv For Diffs and Blames"
+msgstr "Använd Textconv för diff och klandring"
-#: lib/merge.tcl:131
-msgid "Merge completed successfully."
-msgstr "Sammanslagningen avslutades framgångsrikt."
+#: lib/option.tcl:152
+msgid "Blame Copy Only On Changed Files"
+msgstr "Klandra kopiering bara i ändrade filer"
-#: lib/merge.tcl:133
-msgid "Merge failed. Conflict resolution is required."
-msgstr "Sammanslagningen misslyckades. Du måste lösa konflikterna."
+#: lib/option.tcl:153
+msgid "Maximum Length of Recent Repositories List"
+msgstr "Max längd för lista över tidigare arkiv"
-#: lib/merge.tcl:158
-#, tcl-format
-msgid "Merge Into %s"
-msgstr "Slå ihop i %s"
+#: lib/option.tcl:154
+msgid "Minimum Letters To Blame Copy On"
+msgstr "Minsta antal tecken att klandra kopiering för"
-#: lib/merge.tcl:177
-msgid "Revision To Merge"
-msgstr "Revisioner att slå ihop"
+#: lib/option.tcl:155
+msgid "Blame History Context Radius (days)"
+msgstr "Historikradie för klandring (dagar)"
-#: lib/merge.tcl:212
-msgid ""
-"Cannot abort while amending.\n"
-"\n"
-"You must finish amending this commit.\n"
-msgstr ""
-"Kan inte avbryta vid utökning.\n"
-"\n"
-"Du måste göra dig färdig med att utöka incheckningen.\n"
+#: lib/option.tcl:156
+msgid "Number of Diff Context Lines"
+msgstr "Antal rader sammanhang i differenser"
-#: lib/merge.tcl:222
-msgid ""
-"Abort merge?\n"
-"\n"
-"Aborting the current merge will cause *ALL* uncommitted changes to be lost.\n"
-"\n"
-"Continue with aborting the current merge?"
-msgstr ""
-"Avbryt sammanslagning?\n"
-"\n"
-"Om du avbryter sammanslagningen kommer *ALLA* ej incheckade ändringar att gå "
-"förlorade.\n"
-"\n"
-"Gå vidare med att avbryta den aktuella sammanslagningen?"
+#: lib/option.tcl:157
+msgid "Additional Diff Parameters"
+msgstr "Ytterligare diff-parametrar"
-#: lib/merge.tcl:228
-msgid ""
-"Reset changes?\n"
-"\n"
-"Resetting the changes will cause *ALL* uncommitted changes to be lost.\n"
-"\n"
-"Continue with resetting the current changes?"
-msgstr ""
-"Återställ ändringar?\n"
-"\n"
-"Om du återställer ändringarna kommer *ALLA* ej incheckade ändringar att gå "
-"förlorade.\n"
-"\n"
-"Gå vidare med att återställa de aktuella ändringarna?"
+#: lib/option.tcl:158
+msgid "Commit Message Text Width"
+msgstr "Textbredd för incheckningsmeddelande"
-#: lib/merge.tcl:239
-msgid "Aborting"
-msgstr "Avbryter"
+#: lib/option.tcl:159
+msgid "New Branch Name Template"
+msgstr "Mall för namn på nya grenar"
-#: lib/merge.tcl:239
-msgid "files reset"
-msgstr "filer återställda"
+#: lib/option.tcl:160
+msgid "Default File Contents Encoding"
+msgstr "Standardteckenkodning för filinnehåll"
-#: lib/merge.tcl:267
-msgid "Abort failed."
-msgstr "Misslyckades avbryta."
+#: lib/option.tcl:161
+msgid "Warn before committing to a detached head"
+msgstr "Varna för incheckning på frånkopplat huvud"
-#: lib/merge.tcl:269
-msgid "Abort completed. Ready."
-msgstr "Avbrytning fullbordad. Redo."
+#: lib/option.tcl:162
+msgid "Staging of untracked files"
+msgstr "Köa ospårade filer"
+
+#: lib/option.tcl:163
+msgid "Show untracked files"
+msgstr "Visa ospårade filer"
+
+#: lib/option.tcl:164
+msgid "Tab spacing"
+msgstr "Blanksteg för tabulatortecken"
+
+#: lib/option.tcl:210
+msgid "Change"
+msgstr "Ändra"
+
+#: lib/option.tcl:254
+msgid "Spelling Dictionary:"
+msgstr "Stavningsordlista:"
+
+#: lib/option.tcl:284
+msgid "Change Font"
+msgstr "Byt teckensnitt"
+
+#: lib/option.tcl:288
+#, tcl-format
+msgid "Choose %s"
+msgstr "Välj %s"
+
+#: lib/option.tcl:294
+msgid "pt."
+msgstr "p."
+
+#: lib/option.tcl:308
+msgid "Preferences"
+msgstr "Inställningar"
+
+#: lib/option.tcl:345
+msgid "Failed to completely save options:"
+msgstr "Misslyckades med att helt spara alternativ:"
#: lib/mergetool.tcl:8
msgid "Force resolution to the base version?"
@@ -1952,21 +1566,21 @@ msgstr "Kan inte lösa borttagnings- eller länkkonflikter med ett verktyg"
msgid "Conflict file does not exist"
msgstr "Konfliktfil existerar inte"
-#: lib/mergetool.tcl:264
+#: lib/mergetool.tcl:246
#, tcl-format
msgid "Not a GUI merge tool: '%s'"
msgstr "Inte ett grafiskt verktyg för sammanslagning: %s"
-#: lib/mergetool.tcl:268
+#: lib/mergetool.tcl:275
#, tcl-format
msgid "Unsupported merge tool '%s'"
msgstr "Verktyget \"%s\" för sammanslagning stöds inte"
-#: lib/mergetool.tcl:303
+#: lib/mergetool.tcl:310
msgid "Merge tool is already running, terminate it?"
msgstr "Verktyget för sammanslagning körs redan. Vill du avsluta det?"
-#: lib/mergetool.tcl:323
+#: lib/mergetool.tcl:330
#, tcl-format
msgid ""
"Error retrieving versions:\n"
@@ -1975,7 +1589,7 @@ msgstr ""
"Fel vid hämtning av versioner:\n"
"%s"
-#: lib/mergetool.tcl:343
+#: lib/mergetool.tcl:350
#, tcl-format
msgid ""
"Could not start the merge tool:\n"
@@ -1986,213 +1600,158 @@ msgstr ""
"\n"
"%s"
-#: lib/mergetool.tcl:347
+#: lib/mergetool.tcl:354
msgid "Running merge tool..."
msgstr "Kör verktyg för sammanslagning..."
-#: lib/mergetool.tcl:375 lib/mergetool.tcl:383
+#: lib/mergetool.tcl:382 lib/mergetool.tcl:390
msgid "Merge tool failed."
msgstr "Verktyget för sammanslagning misslyckades."
-#: lib/option.tcl:11
-#, tcl-format
-msgid "Invalid global encoding '%s'"
-msgstr "Den globala teckenkodningen \"%s\" är ogiltig"
-
-#: lib/option.tcl:19
-#, tcl-format
-msgid "Invalid repo encoding '%s'"
-msgstr "Arkivets teckenkodning \"%s\" är ogiltig"
-
-#: lib/option.tcl:119
-msgid "Restore Defaults"
-msgstr "Återställ standardvärden"
-
-#: lib/option.tcl:123
-msgid "Save"
-msgstr "Spara"
-
-#: lib/option.tcl:133
-#, tcl-format
-msgid "%s Repository"
-msgstr "Arkivet %s"
-
-#: lib/option.tcl:134
-msgid "Global (All Repositories)"
-msgstr "Globalt (alla arkiv)"
-
-#: lib/option.tcl:140
-msgid "User Name"
-msgstr "Användarnamn"
-
-#: lib/option.tcl:141
-msgid "Email Address"
-msgstr "E-postadress"
-
-#: lib/option.tcl:143
-msgid "Summarize Merge Commits"
-msgstr "Summera sammanslagningsincheckningar"
+#: lib/tools_dlg.tcl:22
+msgid "Add Tool"
+msgstr "Lägg till verktyg"
-#: lib/option.tcl:144
-msgid "Merge Verbosity"
-msgstr "Pratsamhet för sammanslagningar"
+#: lib/tools_dlg.tcl:28
+msgid "Add New Tool Command"
+msgstr "Lägg till nytt verktygskommando"
-#: lib/option.tcl:145
-msgid "Show Diffstat After Merge"
-msgstr "Visa diffstatistik efter sammanslagning"
+#: lib/tools_dlg.tcl:34
+msgid "Add globally"
+msgstr "Lägg till globalt"
-#: lib/option.tcl:146
-msgid "Use Merge Tool"
-msgstr "Använd verktyg för sammanslagning"
+#: lib/tools_dlg.tcl:46
+msgid "Tool Details"
+msgstr "Detaljer för verktyg"
-#: lib/option.tcl:148
-msgid "Trust File Modification Timestamps"
-msgstr "Lita på filändringstidsstämplar"
+#: lib/tools_dlg.tcl:49
+msgid "Use '/' separators to create a submenu tree:"
+msgstr "Använd \"/\"-avdelare för att skapa ett undermenyträd:"
-#: lib/option.tcl:149
-msgid "Prune Tracking Branches During Fetch"
-msgstr "Städa spårade grenar vid hämtning"
+#: lib/tools_dlg.tcl:60
+msgid "Command:"
+msgstr "Kommando:"
-#: lib/option.tcl:150
-msgid "Match Tracking Branches"
-msgstr "Matcha spårade grenar"
+#: lib/tools_dlg.tcl:71
+msgid "Show a dialog before running"
+msgstr "Visa dialog innan programmet startas"
-#: lib/option.tcl:151
-msgid "Use Textconv For Diffs and Blames"
-msgstr "Använd Textconv för diff och klandring"
+#: lib/tools_dlg.tcl:77
+msgid "Ask the user to select a revision (sets $REVISION)"
+msgstr "Be användaren välja en version (sätter $REVISION)"
-#: lib/option.tcl:152
-msgid "Blame Copy Only On Changed Files"
-msgstr "Klandra kopiering bara i ändrade filer"
+#: lib/tools_dlg.tcl:82
+msgid "Ask the user for additional arguments (sets $ARGS)"
+msgstr "Be användaren om ytterligare parametrar (sätter $ARGS)"
-#: lib/option.tcl:153
-msgid "Minimum Letters To Blame Copy On"
-msgstr "Minsta antal tecken att klandra kopiering för"
+#: lib/tools_dlg.tcl:89
+msgid "Don't show the command output window"
+msgstr "Visa inte kommandots utdatafönster"
-#: lib/option.tcl:154
-msgid "Blame History Context Radius (days)"
-msgstr "Historikradie för klandring (dagar)"
+#: lib/tools_dlg.tcl:94
+msgid "Run only if a diff is selected ($FILENAME not empty)"
+msgstr "Kör endast om en diff har markerats ($FILENAME är inte tomt)"
-#: lib/option.tcl:155
-msgid "Number of Diff Context Lines"
-msgstr "Antal rader sammanhang i differenser"
+#: lib/tools_dlg.tcl:118
+msgid "Please supply a name for the tool."
+msgstr "Ange ett namn för verktyget."
-#: lib/option.tcl:156
-msgid "Commit Message Text Width"
-msgstr "Textbredd för incheckningsmeddelande"
+#: lib/tools_dlg.tcl:126
+#, tcl-format
+msgid "Tool '%s' already exists."
+msgstr "Verktyget \"%s\" finns redan."
-#: lib/option.tcl:157
-msgid "New Branch Name Template"
-msgstr "Mall för namn på nya grenar"
+#: lib/tools_dlg.tcl:148
+#, tcl-format
+msgid ""
+"Could not add tool:\n"
+"%s"
+msgstr ""
+"Kunde inte lägga till verktyget:\n"
+"%s"
-#: lib/option.tcl:158
-msgid "Default File Contents Encoding"
-msgstr "Standardteckenkodning för filinnehåll"
+#: lib/tools_dlg.tcl:187
+msgid "Remove Tool"
+msgstr "Ta bort verktyg"
-#: lib/option.tcl:204
-msgid "Change"
-msgstr "Ändra"
+#: lib/tools_dlg.tcl:193
+msgid "Remove Tool Commands"
+msgstr "Ta bort verktygskommandon"
-#: lib/option.tcl:231
-msgid "Spelling Dictionary:"
-msgstr "Stavningsordlista:"
+#: lib/tools_dlg.tcl:198
+msgid "Remove"
+msgstr "Ta bort"
-#: lib/option.tcl:261
-msgid "Change Font"
-msgstr "Byt teckensnitt"
+#: lib/tools_dlg.tcl:231
+msgid "(Blue denotes repository-local tools)"
+msgstr "(Blått anger verktyg lokala för arkivet)"
-#: lib/option.tcl:265
+#: lib/tools_dlg.tcl:292
#, tcl-format
-msgid "Choose %s"
-msgstr "Välj %s"
-
-#: lib/option.tcl:271
-msgid "pt."
-msgstr "p."
-
-#: lib/option.tcl:285
-msgid "Preferences"
-msgstr "Inställningar"
-
-#: lib/option.tcl:322
-msgid "Failed to completely save options:"
-msgstr "Misslyckades med att helt spara alternativ:"
-
-#: lib/remote_add.tcl:20
-msgid "Add Remote"
-msgstr "Lägg till fjärrarkiv"
+msgid "Run Command: %s"
+msgstr "Kör kommandot: %s"
-#: lib/remote_add.tcl:25
-msgid "Add New Remote"
-msgstr "Lägg till nytt fjärrarkiv"
+#: lib/tools_dlg.tcl:306
+msgid "Arguments"
+msgstr "Argument"
-#: lib/remote_add.tcl:30 lib/tools_dlg.tcl:37
-msgid "Add"
-msgstr "Lägg till"
+#: lib/tools_dlg.tcl:341
+msgid "OK"
+msgstr "OK"
-#: lib/remote_add.tcl:39
-msgid "Remote Details"
-msgstr "Detaljer för fjärrarkiv"
+#: lib/search.tcl:48
+msgid "Find:"
+msgstr "Sök:"
-#: lib/remote_add.tcl:50
-msgid "Location:"
-msgstr "Plats:"
+#: lib/search.tcl:50
+msgid "Next"
+msgstr "Nästa"
-#: lib/remote_add.tcl:60
-msgid "Further Action"
-msgstr "Ytterligare åtgärd"
+#: lib/search.tcl:51
+msgid "Prev"
+msgstr "Föreg"
-#: lib/remote_add.tcl:63
-msgid "Fetch Immediately"
-msgstr "Hämta omedelbart"
+#: lib/search.tcl:52
+msgid "RegExp"
+msgstr "Reg.uttr."
-#: lib/remote_add.tcl:69
-msgid "Initialize Remote Repository and Push"
-msgstr "Initiera fjärrarkiv och sänd till"
+#: lib/search.tcl:54
+msgid "Case"
+msgstr "Skiftläge"
-#: lib/remote_add.tcl:75
-msgid "Do Nothing Else Now"
-msgstr "Gör ingent mer nu"
-
-#: lib/remote_add.tcl:100
-msgid "Please supply a remote name."
-msgstr "Ange ett namn för fjärrarkivet."
+#: lib/branch_rename.tcl:15 lib/branch_rename.tcl:23
+msgid "Rename Branch"
+msgstr "Byt namn på gren"
-#: lib/remote_add.tcl:113
-#, tcl-format
-msgid "'%s' is not an acceptable remote name."
-msgstr "\"%s\" kan inte användas som namn på fjärrarkivet."
+#: lib/branch_rename.tcl:28
+msgid "Rename"
+msgstr "Byt namn"
-#: lib/remote_add.tcl:124
-#, tcl-format
-msgid "Failed to add remote '%s' of location '%s'."
-msgstr "Kunde inte lägga till fjärrarkivet \"%s\" på platsen \"%s\"."
+#: lib/branch_rename.tcl:38
+msgid "Branch:"
+msgstr "Gren:"
-#: lib/remote_add.tcl:132 lib/transport.tcl:6
-#, tcl-format
-msgid "fetch %s"
-msgstr "hämta %s"
+#: lib/branch_rename.tcl:46
+msgid "New Name:"
+msgstr "Nytt namn:"
-#: lib/remote_add.tcl:133
-#, tcl-format
-msgid "Fetching the %s"
-msgstr "Hämtar %s"
+#: lib/branch_rename.tcl:81
+msgid "Please select a branch to rename."
+msgstr "Välj en gren att byta namn på."
-#: lib/remote_add.tcl:156
-#, tcl-format
-msgid "Do not know how to initialize repository at location '%s'."
-msgstr "Vet inte hur arkivet på platsen \"%s\" skall initieras."
+#: lib/branch_rename.tcl:92 lib/branch_create.tcl:154
+msgid "Please supply a branch name."
+msgstr "Ange ett namn för grenen."
-#: lib/remote_add.tcl:162 lib/transport.tcl:25 lib/transport.tcl:63
-#: lib/transport.tcl:81
+#: lib/branch_rename.tcl:112 lib/branch_create.tcl:165
#, tcl-format
-msgid "push %s"
-msgstr "sänd %s"
+msgid "'%s' is not an acceptable branch name."
+msgstr "\"%s\" kan inte användas som namn på grenen."
-#: lib/remote_add.tcl:163
+#: lib/branch_rename.tcl:123
#, tcl-format
-msgid "Setting up the %s (at %s)"
-msgstr "Konfigurerar %s (på %s)"
+msgid "Failed to rename '%s'."
+msgstr "Kunde inte byta namn på \"%s\"."
#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34
msgid "Delete Branch Remotely"
@@ -2202,14 +1761,6 @@ msgstr "Ta bort gren från fjärrarkiv"
msgid "From Repository"
msgstr "Från arkiv"
-#: lib/remote_branch_delete.tcl:51 lib/transport.tcl:134
-msgid "Remote:"
-msgstr "Fjärrarkiv:"
-
-#: lib/remote_branch_delete.tcl:72 lib/transport.tcl:154
-msgid "Arbitrary Location:"
-msgstr "Godtycklig plats:"
-
#: lib/remote_branch_delete.tcl:88
msgid "Branches"
msgstr "Grenar"
@@ -2222,6 +1773,10 @@ msgstr "Ta endast bort om"
msgid "Merged Into:"
msgstr "Sammanslagen i:"
+#: lib/remote_branch_delete.tcl:120 lib/branch_delete.tcl:53
+msgid "Always (Do not perform merge checks)"
+msgstr "Alltid (utför inte sammanslagningstest)"
+
#: lib/remote_branch_delete.tcl:153
msgid "A branch is required for 'Merged Into'."
msgstr "En gren krävs för \"Sammanslagen i\"."
@@ -2250,96 +1805,381 @@ msgstr ""
msgid "Please select one or more branches to delete."
msgstr "Välj en eller flera grenar att ta bort."
+#: lib/remote_branch_delete.tcl:218 lib/branch_delete.tcl:115
+msgid ""
+"Recovering deleted branches is difficult.\n"
+"\n"
+"Delete the selected branches?"
+msgstr ""
+"Det kan vara svårt att återställa borttagna grenar.\n"
+"\n"
+"Ta bort de valda grenarna?"
+
#: lib/remote_branch_delete.tcl:227
#, tcl-format
msgid "Deleting branches from %s"
msgstr "Tar bort grenar från %s"
-#: lib/remote_branch_delete.tcl:293
+#: lib/remote_branch_delete.tcl:300
msgid "No repository selected."
msgstr "Inget arkiv markerat."
-#: lib/remote_branch_delete.tcl:298
+#: lib/remote_branch_delete.tcl:305
#, tcl-format
msgid "Scanning %s..."
msgstr "Söker %s..."
-#: lib/remote.tcl:163
-msgid "Remove Remote"
-msgstr "Ta bort fjärrarkiv"
+#: lib/choose_repository.tcl:33
+msgid "Git Gui"
+msgstr "Git Gui"
-#: lib/remote.tcl:168
-msgid "Prune from"
-msgstr "Ta bort från"
+#: lib/choose_repository.tcl:92 lib/choose_repository.tcl:412
+msgid "Create New Repository"
+msgstr "Skapa nytt arkiv"
-#: lib/remote.tcl:173
-msgid "Fetch from"
-msgstr "Hämta från"
+#: lib/choose_repository.tcl:98
+msgid "New..."
+msgstr "Nytt..."
-#: lib/remote.tcl:215
-msgid "Push to"
-msgstr "Sänd till"
+#: lib/choose_repository.tcl:105 lib/choose_repository.tcl:496
+msgid "Clone Existing Repository"
+msgstr "Klona befintligt arkiv"
-#: lib/search.tcl:22
-msgid "Find:"
-msgstr "Sök:"
+#: lib/choose_repository.tcl:116
+msgid "Clone..."
+msgstr "Klona..."
-#: lib/search.tcl:24
-msgid "Next"
-msgstr "Nästa"
+#: lib/choose_repository.tcl:123 lib/choose_repository.tcl:1064
+msgid "Open Existing Repository"
+msgstr "Öppna befintligt arkiv"
-#: lib/search.tcl:25
-msgid "Prev"
-msgstr "Föreg"
+#: lib/choose_repository.tcl:129
+msgid "Open..."
+msgstr "Öppna..."
-#: lib/search.tcl:26
-msgid "Case-Sensitive"
-msgstr "Skilj på VERSALER/gemener"
+#: lib/choose_repository.tcl:142
+msgid "Recent Repositories"
+msgstr "Senaste arkiven"
-#: lib/shortcut.tcl:21 lib/shortcut.tcl:62
-msgid "Cannot write shortcut:"
-msgstr "Kan inte skriva genväg:"
+#: lib/choose_repository.tcl:148
+msgid "Open Recent Repository:"
+msgstr "Öppna tidigare arkiv:"
-#: lib/shortcut.tcl:137
-msgid "Cannot write icon:"
-msgstr "Kan inte skriva ikon:"
+#: lib/choose_repository.tcl:316 lib/choose_repository.tcl:323
+#: lib/choose_repository.tcl:330
+#, tcl-format
+msgid "Failed to create repository %s:"
+msgstr "Kunde inte skapa arkivet %s:"
-#: lib/spellcheck.tcl:57
-msgid "Unsupported spell checker"
-msgstr "Stavningskontrollprogrammet stöds inte"
+#: lib/choose_repository.tcl:407 lib/branch_create.tcl:33
+msgid "Create"
+msgstr "Skapa"
-#: lib/spellcheck.tcl:65
-msgid "Spell checking is unavailable"
-msgstr "Stavningskontroll är ej tillgänglig"
+#: lib/choose_repository.tcl:417
+msgid "Directory:"
+msgstr "Katalog:"
-#: lib/spellcheck.tcl:68
-msgid "Invalid spell checking configuration"
-msgstr "Ogiltig inställning för stavningskontroll"
+#: lib/choose_repository.tcl:447 lib/choose_repository.tcl:573
+#: lib/choose_repository.tcl:1098
+msgid "Git Repository"
+msgstr "Gitarkiv"
-#: lib/spellcheck.tcl:70
+#: lib/choose_repository.tcl:472
#, tcl-format
-msgid "Reverting dictionary to %s."
-msgstr "Återställer ordlistan till %s."
+msgid "Directory %s already exists."
+msgstr "Katalogen %s finns redan."
-#: lib/spellcheck.tcl:73
-msgid "Spell checker silently failed on startup"
-msgstr "Stavningskontroll misslyckades tyst vid start"
+#: lib/choose_repository.tcl:476
+#, tcl-format
+msgid "File %s already exists."
+msgstr "Filen %s finns redan."
-#: lib/spellcheck.tcl:80
-msgid "Unrecognized spell checker"
-msgstr "Stavningskontrollprogrammet känns inte igen"
+#: lib/choose_repository.tcl:491
+msgid "Clone"
+msgstr "Klona"
-#: lib/spellcheck.tcl:186
-msgid "No Suggestions"
-msgstr "Inga förslag"
+#: lib/choose_repository.tcl:504
+msgid "Source Location:"
+msgstr "Plats för källkod:"
-#: lib/spellcheck.tcl:388
-msgid "Unexpected EOF from spell checker"
-msgstr "Oväntat filslut från stavningskontroll"
+#: lib/choose_repository.tcl:513
+msgid "Target Directory:"
+msgstr "Målkatalog:"
-#: lib/spellcheck.tcl:392
-msgid "Spell Checker Failed"
-msgstr "Stavningskontroll misslyckades"
+#: lib/choose_repository.tcl:523
+msgid "Clone Type:"
+msgstr "Typ av klon:"
+
+#: lib/choose_repository.tcl:528
+msgid "Standard (Fast, Semi-Redundant, Hardlinks)"
+msgstr "Standard (snabb, semiredundant, hårda länkar)"
+
+#: lib/choose_repository.tcl:533
+msgid "Full Copy (Slower, Redundant Backup)"
+msgstr "Full kopia (långsammare, redundant säkerhetskopia)"
+
+#: lib/choose_repository.tcl:538
+msgid "Shared (Fastest, Not Recommended, No Backup)"
+msgstr "Delad (snabbast, rekommenderas ej, ingen säkerhetskopia)"
+
+#: lib/choose_repository.tcl:545
+msgid "Recursively clone submodules too"
+msgstr "Klona även rekursivt undermoduler"
+
+#: lib/choose_repository.tcl:579 lib/choose_repository.tcl:626
+#: lib/choose_repository.tcl:772 lib/choose_repository.tcl:842
+#: lib/choose_repository.tcl:1104 lib/choose_repository.tcl:1112
+#, tcl-format
+msgid "Not a Git repository: %s"
+msgstr "Inte ett Gitarkiv: %s"
+
+#: lib/choose_repository.tcl:615
+msgid "Standard only available for local repository."
+msgstr "Standard är endast tillgängligt för lokala arkiv."
+
+#: lib/choose_repository.tcl:619
+msgid "Shared only available for local repository."
+msgstr "Delat är endast tillgängligt för lokala arkiv."
+
+#: lib/choose_repository.tcl:640
+#, tcl-format
+msgid "Location %s already exists."
+msgstr "Platsen %s finns redan."
+
+#: lib/choose_repository.tcl:651
+msgid "Failed to configure origin"
+msgstr "Kunde inte konfigurera ursprung"
+
+#: lib/choose_repository.tcl:663
+msgid "Counting objects"
+msgstr "Räknar objekt"
+
+#: lib/choose_repository.tcl:664
+msgid "buckets"
+msgstr "hinkar"
+
+#: lib/choose_repository.tcl:688
+#, tcl-format
+msgid "Unable to copy objects/info/alternates: %s"
+msgstr "Kunde inte kopiera objekt/info/alternativ: %s"
+
+#: lib/choose_repository.tcl:724
+#, tcl-format
+msgid "Nothing to clone from %s."
+msgstr "Ingenting att klona från %s."
+
+#: lib/choose_repository.tcl:726 lib/choose_repository.tcl:940
+#: lib/choose_repository.tcl:952
+msgid "The 'master' branch has not been initialized."
+msgstr "Grenen \"master\" har inte initierats."
+
+#: lib/choose_repository.tcl:739
+msgid "Hardlinks are unavailable. Falling back to copying."
+msgstr "Hårda länkar är inte tillgängliga. Faller tillbaka på kopiering."
+
+#: lib/choose_repository.tcl:751
+#, tcl-format
+msgid "Cloning from %s"
+msgstr "Klonar från %s"
+
+#: lib/choose_repository.tcl:782
+msgid "Copying objects"
+msgstr "Kopierar objekt"
+
+#: lib/choose_repository.tcl:783
+msgid "KiB"
+msgstr "KiB"
+
+#: lib/choose_repository.tcl:807
+#, tcl-format
+msgid "Unable to copy object: %s"
+msgstr "Kunde inte kopiera objekt: %s"
+
+#: lib/choose_repository.tcl:817
+msgid "Linking objects"
+msgstr "Länkar objekt"
+
+#: lib/choose_repository.tcl:818
+msgid "objects"
+msgstr "objekt"
+
+#: lib/choose_repository.tcl:826
+#, tcl-format
+msgid "Unable to hardlink object: %s"
+msgstr "Kunde inte hårdlänka objekt: %s"
+
+#: lib/choose_repository.tcl:881
+msgid "Cannot fetch branches and objects. See console output for details."
+msgstr "Kunde inte hämta grenar och objekt. Se konsolutdata för detaljer."
+
+#: lib/choose_repository.tcl:892
+msgid "Cannot fetch tags. See console output for details."
+msgstr "Kunde inte hämta taggar. Se konsolutdata för detaljer."
+
+#: lib/choose_repository.tcl:916
+msgid "Cannot determine HEAD. See console output for details."
+msgstr "Kunde inte avgöra HEAD. Se konsolutdata för detaljer."
+
+#: lib/choose_repository.tcl:925
+#, tcl-format
+msgid "Unable to cleanup %s"
+msgstr "Kunde inte städa upp %s"
+
+#: lib/choose_repository.tcl:931
+msgid "Clone failed."
+msgstr "Kloning misslyckades."
+
+#: lib/choose_repository.tcl:938
+msgid "No default branch obtained."
+msgstr "Hämtade ingen standardgren."
+
+#: lib/choose_repository.tcl:949
+#, tcl-format
+msgid "Cannot resolve %s as a commit."
+msgstr "Kunde inte slå upp %s till någon incheckning."
+
+#: lib/choose_repository.tcl:961
+msgid "Creating working directory"
+msgstr "Skapar arbetskatalog"
+
+#: lib/choose_repository.tcl:962 lib/index.tcl:70 lib/index.tcl:136
+#: lib/index.tcl:207
+msgid "files"
+msgstr "filer"
+
+#: lib/choose_repository.tcl:981
+msgid "Cannot clone submodules."
+msgstr "Kan inte klona undermoduler."
+
+#: lib/choose_repository.tcl:990
+msgid "Cloning submodules"
+msgstr "Klonar undermoduler"
+
+#: lib/choose_repository.tcl:1015
+msgid "Initial file checkout failed."
+msgstr "Inledande filutcheckning misslyckades."
+
+#: lib/choose_repository.tcl:1059
+msgid "Open"
+msgstr "Öppna"
+
+#: lib/choose_repository.tcl:1069
+msgid "Repository:"
+msgstr "Arkiv:"
+
+#: lib/choose_repository.tcl:1118
+#, tcl-format
+msgid "Failed to open repository %s:"
+msgstr "Kunde inte öppna arkivet %s:"
+
+#: lib/about.tcl:26
+msgid "git-gui - a graphical user interface for Git."
+msgstr "git-gui - ett grafiskt användargränssnitt för Git."
+
+#: lib/blame.tcl:73
+msgid "File Viewer"
+msgstr "Filvisare"
+
+#: lib/blame.tcl:79
+msgid "Commit:"
+msgstr "Incheckning:"
+
+#: lib/blame.tcl:280
+msgid "Copy Commit"
+msgstr "Kopiera incheckning"
+
+#: lib/blame.tcl:284
+msgid "Find Text..."
+msgstr "Sök text..."
+
+#: lib/blame.tcl:288
+msgid "Goto Line..."
+msgstr "Gå till rad..."
+
+#: lib/blame.tcl:297
+msgid "Do Full Copy Detection"
+msgstr "Gör full kopieringsigenkänning"
+
+#: lib/blame.tcl:301
+msgid "Show History Context"
+msgstr "Visa historiksammanhang"
+
+#: lib/blame.tcl:304
+msgid "Blame Parent Commit"
+msgstr "Klandra föräldraincheckning"
+
+#: lib/blame.tcl:466
+#, tcl-format
+msgid "Reading %s..."
+msgstr "Läser %s..."
+
+#: lib/blame.tcl:594
+msgid "Loading copy/move tracking annotations..."
+msgstr "Läser annoteringar för kopiering/flyttning..."
+
+#: lib/blame.tcl:614
+msgid "lines annotated"
+msgstr "rader annoterade"
+
+#: lib/blame.tcl:806
+msgid "Loading original location annotations..."
+msgstr "Läser in annotering av originalplacering..."
+
+#: lib/blame.tcl:809
+msgid "Annotation complete."
+msgstr "Annotering fullbordad."
+
+#: lib/blame.tcl:839
+msgid "Busy"
+msgstr "Upptagen"
+
+#: lib/blame.tcl:840
+msgid "Annotation process is already running."
+msgstr "Annoteringsprocess körs redan."
+
+#: lib/blame.tcl:879
+msgid "Running thorough copy detection..."
+msgstr "Kör grundlig kopieringsigenkänning..."
+
+#: lib/blame.tcl:947
+msgid "Loading annotation..."
+msgstr "Läser in annotering..."
+
+#: lib/blame.tcl:1000
+msgid "Author:"
+msgstr "Författare:"
+
+#: lib/blame.tcl:1004
+msgid "Committer:"
+msgstr "Incheckare:"
+
+#: lib/blame.tcl:1009
+msgid "Original File:"
+msgstr "Ursprunglig fil:"
+
+#: lib/blame.tcl:1057
+msgid "Cannot find HEAD commit:"
+msgstr "Hittar inte incheckning för HEAD:"
+
+#: lib/blame.tcl:1112
+msgid "Cannot find parent commit:"
+msgstr "Hittar inte föräldraincheckning:"
+
+#: lib/blame.tcl:1127
+msgid "Unable to display parent"
+msgstr "Kan inte visa förälder"
+
+#: lib/blame.tcl:1269
+msgid "Originally By:"
+msgstr "Ursprungligen av:"
+
+#: lib/blame.tcl:1275
+msgid "In File:"
+msgstr "I filen:"
+
+#: lib/blame.tcl:1280
+msgid "Copied Or Moved Here By:"
+msgstr "Kopierad eller flyttad hit av:"
#: lib/sshkey.tcl:31
msgid "No keys found."
@@ -2390,189 +2230,480 @@ msgstr "Lyckades skapa nyckeln, men hittar inte någon nyckel."
msgid "Your key is in: %s"
msgstr "Din nyckel finns i: %s"
-#: lib/status_bar.tcl:86
+#: lib/branch_create.tcl:23
+msgid "Create Branch"
+msgstr "Skapa gren"
+
+#: lib/branch_create.tcl:28
+msgid "Create New Branch"
+msgstr "Skapa ny gren"
+
+#: lib/branch_create.tcl:42
+msgid "Branch Name"
+msgstr "Namn på gren"
+
+#: lib/branch_create.tcl:57
+msgid "Match Tracking Branch Name"
+msgstr "Använd namn på spårad gren"
+
+#: lib/branch_create.tcl:66
+msgid "Starting Revision"
+msgstr "Inledande revision"
+
+#: lib/branch_create.tcl:72
+msgid "Update Existing Branch:"
+msgstr "Uppdatera befintlig gren:"
+
+#: lib/branch_create.tcl:75
+msgid "No"
+msgstr "Nej"
+
+#: lib/branch_create.tcl:80
+msgid "Fast Forward Only"
+msgstr "Endast snabbspolning"
+
+#: lib/branch_create.tcl:97
+msgid "Checkout After Creation"
+msgstr "Checka ut när skapad"
+
+#: lib/branch_create.tcl:132
+msgid "Please select a tracking branch."
+msgstr "Välj en gren att spåra."
+
+#: lib/branch_create.tcl:141
#, tcl-format
-msgid "%s ... %*i of %*i %s (%3i%%)"
-msgstr "%s... %*i av %*i %s (%3i%%)"
+msgid "Tracking branch %s is not a branch in the remote repository."
+msgstr "Den spårade grenen %s är inte en gren i fjärrarkivet."
-#: lib/tools_dlg.tcl:22
-msgid "Add Tool"
-msgstr "Lägg till verktyg"
+#: lib/shortcut.tcl:21 lib/shortcut.tcl:62
+msgid "Cannot write shortcut:"
+msgstr "Kan inte skriva genväg:"
-#: lib/tools_dlg.tcl:28
-msgid "Add New Tool Command"
-msgstr "Lägg till nytt verktygskommando"
+#: lib/shortcut.tcl:137
+msgid "Cannot write icon:"
+msgstr "Kan inte skriva ikon:"
-#: lib/tools_dlg.tcl:34
-msgid "Add globally"
-msgstr "Lägg till globalt"
+#: lib/choose_rev.tcl:52
+msgid "This Detached Checkout"
+msgstr "Denna frånkopplade utcheckning"
-#: lib/tools_dlg.tcl:46
-msgid "Tool Details"
-msgstr "Detaljer för verktyg"
+#: lib/choose_rev.tcl:60
+msgid "Revision Expression:"
+msgstr "Revisionsuttryck:"
-#: lib/tools_dlg.tcl:49
-msgid "Use '/' separators to create a submenu tree:"
-msgstr "Använd \"/\"-avdelare för att skapa ett undermenyträd:"
+#: lib/choose_rev.tcl:72
+msgid "Local Branch"
+msgstr "Lokal gren"
-#: lib/tools_dlg.tcl:60
-msgid "Command:"
-msgstr "Kommando:"
+#: lib/choose_rev.tcl:77
+msgid "Tracking Branch"
+msgstr "Spårande gren"
-#: lib/tools_dlg.tcl:71
-msgid "Show a dialog before running"
-msgstr "Visa dialog innan programmet startas"
+#: lib/choose_rev.tcl:82 lib/choose_rev.tcl:544
+msgid "Tag"
+msgstr "Tagg"
-#: lib/tools_dlg.tcl:77
-msgid "Ask the user to select a revision (sets $REVISION)"
-msgstr "Be användaren välja en version (sätter $REVISION)"
+#: lib/choose_rev.tcl:321
+#, tcl-format
+msgid "Invalid revision: %s"
+msgstr "Ogiltig revision: %s"
-#: lib/tools_dlg.tcl:82
-msgid "Ask the user for additional arguments (sets $ARGS)"
-msgstr "Be användaren om ytterligare parametrar (sätter $ARGS)"
+#: lib/choose_rev.tcl:342
+msgid "No revision selected."
+msgstr "Ingen revision vald."
-#: lib/tools_dlg.tcl:89
-msgid "Don't show the command output window"
-msgstr "Visa inte kommandots utdatafönster"
+#: lib/choose_rev.tcl:350
+msgid "Revision expression is empty."
+msgstr "Revisionsuttrycket är tomt."
-#: lib/tools_dlg.tcl:94
-msgid "Run only if a diff is selected ($FILENAME not empty)"
-msgstr "Kör endast om en diff har markerats ($FILENAME är inte tomt)"
+#: lib/choose_rev.tcl:537
+msgid "Updated"
+msgstr "Uppdaterad"
-#: lib/tools_dlg.tcl:118
-msgid "Please supply a name for the tool."
-msgstr "Ange ett namn för verktyget."
+#: lib/choose_rev.tcl:565
+msgid "URL"
+msgstr "Webbadress"
-#: lib/tools_dlg.tcl:126
+#: lib/commit.tcl:9
+msgid ""
+"There is nothing to amend.\n"
+"\n"
+"You are about to create the initial commit. There is no commit before this "
+"to amend.\n"
+msgstr ""
+"Det finns ingenting att utöka.\n"
+"\n"
+"Du håller på att skapa den inledande incheckningen. Det finns ingen tidigare "
+"incheckning att utöka.\n"
+
+#: lib/commit.tcl:18
+msgid ""
+"Cannot amend while merging.\n"
+"\n"
+"You are currently in the middle of a merge that has not been fully "
+"completed. You cannot amend the prior commit unless you first abort the "
+"current merge activity.\n"
+msgstr ""
+"Kan inte utöka vid sammanslagning.\n"
+"\n"
+"Du är i mitten av en sammanslagning som inte är fullbordad. Du kan inte "
+"utöka tidigare incheckningar om du inte först avbryter den pågående "
+"sammanslagningen.\n"
+
+#: lib/commit.tcl:48
+msgid "Error loading commit data for amend:"
+msgstr "Fel vid inläsning av incheckningsdata för utökning:"
+
+#: lib/commit.tcl:75
+msgid "Unable to obtain your identity:"
+msgstr "Kunde inte hämta din identitet:"
+
+#: lib/commit.tcl:80
+msgid "Invalid GIT_COMMITTER_IDENT:"
+msgstr "Felaktig GIT_COMMITTER_IDENT:"
+
+#: lib/commit.tcl:129
#, tcl-format
-msgid "Tool '%s' already exists."
-msgstr "Verktyget \"%s\" finns redan."
+msgid "warning: Tcl does not support encoding '%s'."
+msgstr "varning: Tcl stöder inte teckenkodningen \"%s\"."
-#: lib/tools_dlg.tcl:148
+#: lib/commit.tcl:149
+msgid ""
+"Last scanned state does not match repository state.\n"
+"\n"
+"Another Git program has modified this repository since the last scan. A "
+"rescan must be performed before another commit can be created.\n"
+"\n"
+"The rescan will be automatically started now.\n"
+msgstr ""
+"Det senaste inlästa tillståndet motsvarar inte tillståndet i arkivet.\n"
+"\n"
+"Ett annat Git-program har ändrat arkivet sedan senaste avsökningen. Du måste "
+"utföra en ny sökning innan du kan göra en ny incheckning.\n"
+"\n"
+"Sökningen kommer att startas automatiskt nu.\n"
+
+#: lib/commit.tcl:173
#, tcl-format
msgid ""
-"Could not add tool:\n"
-"%s"
+"Unmerged files cannot be committed.\n"
+"\n"
+"File %s has merge conflicts. You must resolve them and stage the file "
+"before committing.\n"
msgstr ""
-"Kunde inte lägga till verktyget:\n"
-"%s"
+"Osammanslagna filer kan inte checkas in.\n"
+"\n"
+"Filen %s har sammanslagningskonflikter. Du måste lösa dem och köa filen "
+"innan du checkar in den.\n"
-#: lib/tools_dlg.tcl:187
-msgid "Remove Tool"
-msgstr "Ta bort verktyg"
+#: lib/commit.tcl:181
+#, tcl-format
+msgid ""
+"Unknown file state %s detected.\n"
+"\n"
+"File %s cannot be committed by this program.\n"
+msgstr ""
+"Okänd filstatus %s upptäckt.\n"
+"\n"
+"Filen %s kan inte checkas in av programmet.\n"
-#: lib/tools_dlg.tcl:193
-msgid "Remove Tool Commands"
-msgstr "Ta bort verktygskommandon"
+#: lib/commit.tcl:189
+msgid ""
+"No changes to commit.\n"
+"\n"
+"You must stage at least 1 file before you can commit.\n"
+msgstr ""
+"Inga ändringar att checka in.\n"
+"\n"
+"Du måste köa åtminstone en fil innan du kan checka in.\n"
-#: lib/tools_dlg.tcl:198
-msgid "Remove"
-msgstr "Ta bort"
+#: lib/commit.tcl:204
+msgid ""
+"Please supply a commit message.\n"
+"\n"
+"A good commit message has the following format:\n"
+"\n"
+"- First line: Describe in one sentence what you did.\n"
+"- Second line: Blank\n"
+"- Remaining lines: Describe why this change is good.\n"
+msgstr ""
+"Ange ett incheckningsmeddelande.\n"
+"\n"
+"Ett bra incheckningsmeddelande har följande format:\n"
+"\n"
+"- Första raden: Beskriv i en mening vad du gjorde.\n"
+"- Andra raden: Tom\n"
+"- Följande rader: Beskriv varför det här är en bra ändring.\n"
-#: lib/tools_dlg.tcl:231
-msgid "(Blue denotes repository-local tools)"
-msgstr "(Blått anger verktyg lokala för arkivet)"
+#: lib/commit.tcl:235
+msgid "Calling pre-commit hook..."
+msgstr "Anropar kroken före incheckning (pre-commit)..."
-#: lib/tools_dlg.tcl:292
-#, tcl-format
-msgid "Run Command: %s"
-msgstr "Kör kommandot: %s"
+#: lib/commit.tcl:250
+msgid "Commit declined by pre-commit hook."
+msgstr "Incheckningen avvisades av kroken före incheckning (pre-commit)."
-#: lib/tools_dlg.tcl:306
-msgid "Arguments"
-msgstr "Argument"
+#: lib/commit.tcl:269
+msgid ""
+"You are about to commit on a detached head. This is a potentially dangerous "
+"thing to do because if you switch to another branch you will lose your "
+"changes and it can be difficult to retrieve them later from the reflog. You "
+"should probably cancel this commit and create a new branch to continue.\n"
+" \n"
+" Do you really want to proceed with your Commit?"
+msgstr ""
+"Du är på väg att checka in på ett frånkopplat huvud. Det kan potentiellt "
+"vara farligt, eftersom du kommer förlora dina ändringar om du växlar till en "
+"annan gren och det kan vara svårt att hämta dem senare från ref-loggen. Du "
+"bör troligen avbryta incheckningen och skapa en ny gren för att fortsätta.\n"
+" \n"
+" Vill du verkligen fortsätta checka in?"
+
+#: lib/commit.tcl:290
+msgid "Calling commit-msg hook..."
+msgstr "Anropar kroken för incheckningsmeddelande (commit-msg)..."
-#: lib/tools_dlg.tcl:341
-msgid "OK"
-msgstr "OK"
+#: lib/commit.tcl:305
+msgid "Commit declined by commit-msg hook."
+msgstr "Incheckning avvisad av kroken för incheckningsmeddelande (commit-msg)."
-#: lib/tools.tcl:75
+#: lib/commit.tcl:318
+msgid "Committing changes..."
+msgstr "Checkar in ändringar..."
+
+#: lib/commit.tcl:334
+msgid "write-tree failed:"
+msgstr "write-tree misslyckades:"
+
+#: lib/commit.tcl:335 lib/commit.tcl:379 lib/commit.tcl:400
+msgid "Commit f