diff options
122 files changed, 5063 insertions, 1004 deletions
diff --git a/Documentation/Makefile b/Documentation/Makefile index c34c1cae20..144ec32f12 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -32,6 +32,7 @@ DOC_MAN7=$(patsubst %.txt,%.7,$(MAN7_TXT)) prefix?=$(HOME) bindir?=$(prefix)/bin htmldir?=$(prefix)/share/doc/git-doc +pdfdir?=$(prefix)/share/doc/git-doc mandir?=$(prefix)/share/man man1dir=$(mandir)/man1 man5dir=$(mandir)/man5 @@ -50,6 +51,7 @@ infodir?=$(prefix)/share/info MAKEINFO=makeinfo INSTALL_INFO=install-info DOCBOOK2X_TEXI=docbook2x-texi +DBLATEX=dblatex ifndef PERL_PATH PERL_PATH = /usr/bin/perl endif @@ -87,6 +89,8 @@ man7: $(DOC_MAN7) info: git.info gitman.info +pdf: user-manual.pdf + install: install-man install-man: man @@ -107,6 +111,10 @@ install-info: info echo "No directory found in $(DESTDIR)$(infodir)" >&2 ; \ fi +install-pdf: pdf + $(INSTALL) -d -m 755 $(DESTDIR)$(pdfdir) + $(INSTALL) -m 644 user-manual.pdf $(DESTDIR)$(pdfdir) + install-html: html sh ./install-webdoc.sh $(DESTDIR)$(htmldir) @@ -187,17 +195,23 @@ git.info: user-manual.texi user-manual.texi: user-manual.xml $(RM) $@+ $@ - $(DOCBOOK2X_TEXI) user-manual.xml --to-stdout | $(PERL_PATH) fix-texi.perl >$@+ + $(DOCBOOK2X_TEXI) user-manual.xml --encoding=UTF-8 --to-stdout | \ + $(PERL_PATH) fix-texi.perl >$@+ + mv $@+ $@ + +user-manual.pdf: user-manual.xml + $(RM) $@+ $@ + $(DBLATEX) -o $@+ -p /etc/asciidoc/dblatex/asciidoc-dblatex.xsl -s /etc/asciidoc/dblatex/asciidoc-dblatex.sty $< mv $@+ $@ gitman.texi: $(MAN_XML) cat-texi.perl $(RM) $@+ $@ - ($(foreach xml,$(MAN_XML),$(DOCBOOK2X_TEXI) --to-stdout $(xml);)) | \ - $(PERL_PATH) cat-texi.perl $@ >$@+ + ($(foreach xml,$(MAN_XML),$(DOCBOOK2X_TEXI) --encoding=UTF-8 \ + --to-stdout $(xml);)) | $(PERL_PATH) cat-texi.perl $@ >$@+ mv $@+ $@ gitman.info: gitman.texi - $(MAKEINFO) --no-split $*.texi + $(MAKEINFO) --no-split --no-validate $*.texi $(patsubst %.txt,%.texi,$(MAN_TXT)): %.texi : %.xml $(RM) $@+ $@ diff --git a/Documentation/RelNotes-1.5.4.7.txt b/Documentation/RelNotes-1.5.4.7.txt new file mode 100644 index 0000000000..9065a0e273 --- /dev/null +++ b/Documentation/RelNotes-1.5.4.7.txt @@ -0,0 +1,10 @@ +GIT v1.5.4.7 Release Notes +========================== + +Fixes since 1.5.4.7 +------------------- + + * Removed support for an obsolete gitweb request URI, whose + implementation ran "git diff" Porcelain, instead of using plumbing, + which would have run an external diff command specified in the + repository configuration as the gitweb user. diff --git a/Documentation/RelNotes-1.5.5.6.txt b/Documentation/RelNotes-1.5.5.6.txt new file mode 100644 index 0000000000..d5e85cb70e --- /dev/null +++ b/Documentation/RelNotes-1.5.5.6.txt @@ -0,0 +1,10 @@ +GIT v1.5.5.6 Release Notes +========================== + +Fixes since 1.5.5.5 +------------------- + + * Removed support for an obsolete gitweb request URI, whose + implementation ran "git diff" Porcelain, instead of using plumbing, + which would have run an external diff command specified in the + repository configuration as the gitweb user. diff --git a/Documentation/RelNotes-1.5.6.6.txt b/Documentation/RelNotes-1.5.6.6.txt new file mode 100644 index 0000000000..79da23db5a --- /dev/null +++ b/Documentation/RelNotes-1.5.6.6.txt @@ -0,0 +1,10 @@ +GIT v1.5.6.6 Release Notes +========================== + +Fixes since 1.5.6.5 +------------------- + + * Removed support for an obsolete gitweb request URI, whose + implementation ran "git diff" Porcelain, instead of using plumbing, + which would have run an external diff command specified in the + repository configuration as the gitweb user. diff --git a/Documentation/RelNotes-1.6.0.6.txt b/Documentation/RelNotes-1.6.0.6.txt new file mode 100644 index 0000000000..64ece1ffd5 --- /dev/null +++ b/Documentation/RelNotes-1.6.0.6.txt @@ -0,0 +1,33 @@ +GIT v1.6.0.6 Release Notes +========================== + +Fixes since 1.6.0.5 +------------------- + + * "git fsck" had a deep recursion that wasted stack space. + + * "git fast-export" and "git fast-import" choked on an old style + annotated tag that lack the tagger information. + + * "git mergetool -- file" did not correctly skip "--" marker that + signals the end of options list. + + * "git show $tag" segfaulted when an annotated $tag pointed at a + nonexistent object. + + * "git show 2>error" when the standard output is automatically redirected + to the pager redirected the standard error to the pager as well; there + was no need to. + + * "git send-email" did not correctly handle list of addresses when + they had quoted comma (e.g. "Lastname, Givenname" <mail@addre.ss>). + + * Logic to discover branch ancestry in "git svn" was unreliable when + the process to fetch history was interrupted. + + * Removed support for an obsolete gitweb request URI, whose + implementation ran "git diff" Porcelain, instead of using plumbing, + which would have run an external diff command specified in the + repository configuration as the gitweb user. + +Also contains numerous documentation typofixes. diff --git a/Documentation/RelNotes-1.6.1.1.txt b/Documentation/RelNotes-1.6.1.1.txt new file mode 100644 index 0000000000..10b38e6ec1 --- /dev/null +++ b/Documentation/RelNotes-1.6.1.1.txt @@ -0,0 +1,23 @@ +GIT v1.6.1.1 Release Notes +========================== + +Fixes since v1.6.1 +------------------ + +* "git describe --all" complained when a commit is described with a tag, + which was nonsense. + +* "git log --pretty=format:%s" did not handle a multi-line subject the + same way as built-in log listers (i.e. shortlog, --pretty=oneline, etc.) + +* "git daemon", and "git merge-file" are more careful when freopen fails + and barf, instead of going on and writing to unopened filehandle. + +Other documentation fixes. + +--- +exec >/var/tmp/1 +O=v1.6.1-15-ga9e67c8 +echo O=$(git describe maint) +git shortlog --no-merges $O..maint + diff --git a/Documentation/RelNotes-1.6.1.txt b/Documentation/RelNotes-1.6.1.txt index 0405309743..adb7ccab0a 100644 --- a/Documentation/RelNotes-1.6.1.txt +++ b/Documentation/RelNotes-1.6.1.txt @@ -230,6 +230,13 @@ Fixes since v1.6.0 All of the fixes in v1.6.0.X maintenance series are included in this release, unless otherwise noted. +* Porcelains implemented as shell scripts were utterly confused when you + entered to a subdirectory of a work tree from sideways, following a + symbolic link (this may need to be backported to older releases later). + +* Tracking symbolic links would work better on filesystems whose lstat() + returns incorrect st_size value for them. + * "git add" and "git update-index" incorrectly allowed adding S/F when S is a tracked symlink that points at a directory D that has a path F in it (we still need to fix a similar nonsense when S is a submodule and F @@ -244,6 +251,20 @@ release, unless otherwise noted. * "git filter-branch" failed to rewrite a tag name with slashes in it. +* "git http-push" did not understand URI scheme other than opaquelocktoken + when acquiring a lock from the server (this may need to be backported to + older releases later). + +* After "git rebase -p" stopped with conflicts while replaying a merge, + "git rebase --continue" did not work (may need to be backported to older + releases). + +* "git revert" records relative to which parent a revert was made when + reverting a merge. Together with new documentation that explains issues + around reverting a merge and merging from the updated branch later, this + hopefully will reduce user confusion (this may need to be backported to + older releases later). + * "git rm --cached" used to allow an empty blob that was added earlier to be removed without --force, even when the file in the work tree has since been modified. @@ -260,6 +281,6 @@ release, unless otherwise noted. -- exec >/var/tmp/1 -O=v1.6.1-rc1-55-gd8af75d +O=v1.6.1-rc3-74-gf66bc5f echo O=$(git describe master) git shortlog --no-merges $O..master ^maint diff --git a/Documentation/RelNotes-1.6.2.txt b/Documentation/RelNotes-1.6.2.txt new file mode 100644 index 0000000000..1a80626781 --- /dev/null +++ b/Documentation/RelNotes-1.6.2.txt @@ -0,0 +1,28 @@ +GIT v1.6.2 Release Notes +======================== + +Updates since v1.6.1 +-------------------- + +(subsystems) + +(portability) + +(performance) + +(usability, bells and whistles) + +(internal) + + +Fixes since v1.6.1 +------------------ + +All of the fixes in v1.6.1.X maintenance series are included in this +release, unless otherwise noted. + +-- +exec >/var/tmp/1 +O=v1.6.1 +echo O=$(git describe master) +git shortlog --no-merges $O..master ^maint diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches index f0295c60f5..ba07c8c571 100644 --- a/Documentation/SubmittingPatches +++ b/Documentation/SubmittingPatches @@ -222,6 +222,9 @@ D-C-O. Indeed you are encouraged to do so. Do not forget to place an in-body "From: " line at the beginning to properly attribute the change to its true author (see (2) above). +Also notice that a real name is used in the Signed-off-by: line. Please +don't hide your real name. + Some people also put extra tags at the end. "Acked-by:" says that the patch was reviewed by the person who diff --git a/Documentation/cat-texi.perl b/Documentation/cat-texi.perl index dbc133cd3c..828ec62554 100755 --- a/Documentation/cat-texi.perl +++ b/Documentation/cat-texi.perl @@ -18,8 +18,12 @@ close TMP; printf '\input texinfo @setfilename gitman.info -@documentencoding us-ascii -@node Top,,%s +@documentencoding UTF-8 +@dircategory Development +@direntry +* Git Man Pages: (gitman). Manual pages for Git revision control system +@end direntry +@node Top,,, (dir) @top Git Manual Pages @documentlanguage en @menu diff --git a/Documentation/config.txt b/Documentation/config.txt index 21ea16590b..7408bb2d34 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -601,10 +601,6 @@ diff.autorefreshindex:: affects only 'git-diff' Porcelain, and not lower level 'diff' commands, such as 'git-diff-files'. -diff.suppress-blank-empty:: - A boolean to inhibit the standard behavior of printing a space - before each empty output line. Defaults to false. - diff.external:: If this config variable is set, diff generation is not performed using the internal diff machinery, but using the @@ -639,6 +635,10 @@ diff.renames:: will enable basic rename detection. If set to "copies" or "copy", it will detect copies, as well. +diff.suppress-blank-empty:: + A boolean to inhibit the standard behavior of printing a space + before each empty output line. Defaults to false. + fetch.unpackLimit:: If the number of objects fetched over the git native transfer is below this @@ -1044,6 +1044,16 @@ mergetool.keepBackup:: is set to `false` then this file is not preserved. Defaults to `true` (i.e. keep the backup files). +mergetool.keepTemporaries:: + When invoking a custom merge tool, git uses a set of temporary + files to pass to the tool. If the tool returns an error and this + variable is set to `true`, then these temporary files will be + preserved, otherwise they will be removed after the tool has + exited. Defaults to `false`. + +mergetool.prompt:: + Prompt before each invocation of the merge resolution program. + pack.window:: The size of the window used by linkgit:git-pack-objects[1] when no window size is given on the command line. Defaults to 10. diff --git a/Documentation/diff-format.txt b/Documentation/diff-format.txt index aafd3a3941..1eeb1c7683 100644 --- a/Documentation/diff-format.txt +++ b/Documentation/diff-format.txt @@ -58,7 +58,7 @@ Possible status letters are: be committed) - X: "unknown" change type (most probably a bug, please report it) -Status letters C and M are always followed by a score (denoting the +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. diff --git a/Documentation/diff-generate-patch.txt b/Documentation/diff-generate-patch.txt index 517e1eba3c..0f25ba7e38 100644 --- a/Documentation/diff-generate-patch.txt +++ b/Documentation/diff-generate-patch.txt @@ -143,15 +143,15 @@ different from it. A `-` character in the column N means that the line appears in fileN but it does not appear in the result. A `+` character -in the column N means that the line appears in the last file, +in the column N means that the line appears in the result, and fileN does not have that line (in other words, the line was added, from the point of view of that parent). In the above example output, the function signature was changed from both files (hence two `-` removals from both file1 and file2, plus `++` to mean one line that was added does not appear -in either file1 nor file2). Also two other lines are the same -from file1 but do not appear in file2 (hence prefixed with ` +`). +in either file1 nor file2). Also eight other lines are the same +from file1 but do not appear in file2 (hence prefixed with `{plus}`). When shown by `git diff-tree -c`, it compares the parents of a merge commit with the merge result (i.e. file1..fileN are the diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt index c62b45cdba..b432d2518a 100644 --- a/Documentation/diff-options.txt +++ b/Documentation/diff-options.txt @@ -19,16 +19,12 @@ endif::git-format-patch[] ifndef::git-format-patch[] -p:: +-u:: Generate patch (see section on generating patches). {git-diff? This is the default.} endif::git-format-patch[] --u:: - Synonym for "-p". - -U<n>:: - Shorthand for "--unified=<n>". - --unified=<n>:: Generate diffs with <n> lines of context instead of the usual three. Implies "-p". @@ -190,31 +186,25 @@ endif::git-format-patch[] can name which subdirectory to make the output relative to by giving a <path> as an argument. +-a:: --text:: Treat all files as text. --a:: - Shorthand for "--text". - --ignore-space-at-eol:: Ignore changes in whitespace at EOL. +-b:: --ignore-space-change:: Ignore changes in amount of whitespace. This ignores whitespace at line end, and considers all other sequences of one or more whitespace characters to be equivalent. --b:: - Shorthand for "--ignore-space-change". - +-w:: --ignore-all-space:: Ignore whitespace when comparing lines. This ignores differences even if one line has whitespace where the other line has none. --w:: - Shorthand for "--ignore-all-space". - --exit-code:: Make the program exit with codes similar to diff(1). That is, it exits with 1 if there were differences and diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index 168333a588..9cd51514db 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -27,7 +27,7 @@ the first namespace level. When <paths> are given, this command does *not* switch branches. It updates the named paths in the working tree from -the index file, or from a named commit. In +the index file, or from a named <tree-ish> (most often a commit). In this case, the `-b` options is meaningless and giving either of them results in an error. <tree-ish> argument can be used to specify a specific tree-ish (i.e. commit, tag or tree) @@ -232,7 +232,6 @@ the `-m` option, you would see something like this: ------------ $ git checkout -m mytopic Auto-merging frotz -merge: warning: conflicts during merge ERROR: Merge conflict in frotz fatal: merge program failed ------------ diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index 6203461f41..b5d81be7ec 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -166,7 +166,7 @@ FROM UPSTREAM REBASE" section in linkgit:git-rebase[1].) 'git-commit' if any paths are given on the command line, in which case this option can be omitted. If this option is specified together with '--amend', then - no paths need be specified, which can be used to amend + no paths need to be specified, which can be used to amend the last commit without committing changes that have already been staged. diff --git a/Documentation/git-daemon.txt b/Documentation/git-daemon.txt index f1a570a874..36f00aed67 100644 --- a/Documentation/git-daemon.txt +++ b/Documentation/git-daemon.txt @@ -110,9 +110,9 @@ OPTIONS --user-path:: --user-path=path:: - Allow ~user notation to be used in requests. When + Allow {tilde}user notation to be used in requests. When specified with no parameter, requests to - git://host/~alice/foo is taken as a request to access + git://host/{tilde}alice/foo is taken as a request to access 'foo' repository in the home directory of user `alice`. If `--user-path=path` is specified, the same request is taken as a request to access `path/foo` repository in diff --git a/Documentation/git-diff-tree.txt b/Documentation/git-diff-tree.txt index 5d48664e62..23b7abd3c6 100644 --- a/Documentation/git-diff-tree.txt +++ b/Documentation/git-diff-tree.txt @@ -43,7 +43,7 @@ include::diff-options.txt[] show tree entry itself as well as subtrees. Implies -r. --root:: - When '--root' is specified the initial commit will be showed as a big + When '--root' is specified the initial commit will be shown as a big creation event. This is equivalent to a diff against the NULL tree. --stdin:: @@ -63,7 +63,7 @@ and terminated by a newline) is printed before the difference. When comparing commits, the ID of the first (or only) commit, followed by a newline, is printed. + -The following flags further affects the behavior when comparing +The following flags further affect the behavior when comparing commits (but not trees). -m:: diff --git a/Documentation/git-fast-export.txt b/Documentation/git-fast-export.txt index 99a1c3158d..0c9eb567cb 100644 --- a/Documentation/git-fast-export.txt +++ b/Documentation/git-fast-export.txt @@ -65,6 +65,12 @@ 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. +--fake-missing-tagger:: + Some old repositories have tags without a tagger. The + fast-import protocol was pretty strict about that, and did not + allow that. So fake a tagger to be able to fast-import the + output. + EXAMPLES -------- diff --git a/Documentation/git-fsck.txt b/Documentation/git-fsck.txt index d5a7647219..287c4fc5e0 100644 --- a/Documentation/git-fsck.txt +++ b/Documentation/git-fsck.txt @@ -79,7 +79,8 @@ that aren't readable from any of the specified head nodes. So for example - git fsck --unreachable HEAD $(cat .git/refs/heads/*) + git fsck --unreachable HEAD \ + $(git for-each-ref --format="%(objectname)" refs/heads) will do quite a _lot_ of verification on the tree. There are a few extra validity tests to be added (make sure that tree objects are diff --git a/Documentation/git-mailinfo.txt b/Documentation/git-mailinfo.txt index 31eccea5bc..8d95aaa304 100644 --- a/Documentation/git-mailinfo.txt +++ b/Documentation/git-mailinfo.txt @@ -13,7 +13,7 @@ SYNOPSIS DESCRIPTION ----------- -Reading a single e-mail message from the standard input, and +Reads a single e-mail message from the standard input, and writes the commit log message in <msg> file, and the patches in <patch> file. The author name, e-mail and e-mail subject are written out to the standard output to be used by 'git-am' diff --git a/Documentation/git-mergetool.txt b/Documentation/git-mergetool.txt index 602e7c6d3b..4c0ffec507 100644 --- a/Documentation/git-mergetool.txt +++ b/Documentation/git-mergetool.txt @@ -7,7 +7,7 @@ git-mergetool - Run merge conflict resolution tools to resolve merge conflicts SYNOPSIS -------- -'git mergetool' [--tool=<tool>] [<file>]... +'git mergetool' [--tool=<tool>] [-y|--no-prompt|--prompt] [<file>]... DESCRIPTION ----------- @@ -60,6 +60,15 @@ variable `mergetool.<tool>.trustExitCode` can be set to `true`. Otherwise, 'git-mergetool' will prompt the user to indicate the success of the resolution after the custom tool has exited. +-y or --no-prompt:: + Don't prompt before each invocation of the merge resolution + program. + +--prompt:: + Prompt before each invocation of the merge resolution program. + This is the default behaviour; the option is provided to + override any configuration settings. + Author ------ Written by Theodore Y Ts'o <tytso@mit.edu> diff --git a/Documentation/git-receive-pack.txt b/Documentation/git-receive-pack.txt index 6b2f8c4de7..514f03c979 100644 --- a/Documentation/git-receive-pack.txt +++ b/Documentation/git-receive-pack.txt @@ -86,7 +86,7 @@ post-receive Hook ----------------- After all refs were updated (or attempted to be updated), if any ref update was successful, and if $GIT_DIR/hooks/post-receive -file exists and is executable, it will be invoke once with no +file exists and is executable, it will be invoked once with no parameters. The standard input of the hook will be one line for each successfully updated ref: @@ -133,7 +133,7 @@ post-update Hook ---------------- After all other processing, if at least one ref was updated, and if $GIT_DIR/hooks/post-update file exists and is executable, then -post-update will called with the list of refs that have been updated. +post-update will be called with the list of refs that have been updated. This can be used to implement any repository wide cleanup tasks. The exit code from this hook invocation is ignored; the only thing diff --git a/Documentation/git-reflog.txt b/Documentation/git-reflog.txt index d99236e14d..7f7a5445c7 100644 --- a/Documentation/git-reflog.txt +++ b/Documentation/git-reflog.txt @@ -28,7 +28,7 @@ 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 are not reachable from the current +`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]. @@ -71,7 +71,7 @@ them. which in turn defaults to 90 days. --expire-unreachable=<time>:: - Entries older than this time and are not reachable from + 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 diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.txt index 52aab5e680..abb25d1c00 100644 --- a/Documentation/git-reset.txt +++ b/Documentation/git-reset.txt @@ -8,7 +8,7 @@ git-reset - Reset current HEAD to the specified state SYNOPSIS -------- [verse] -'git reset' [--mixed | --soft | --hard] [-q] [<commit>] +'git reset' [--mixed | --soft | --hard | --merge] [-q] [<commit>] 'git reset' [-q] [<commit>] [--] <paths>... DESCRIPTION @@ -45,6 +45,11 @@ OPTIONS switched to. Any changes to tracked files in the working tree since <commit> are lost. +--merge:: + Resets the index to match the tree recorded by the named commit, + and updates the files that are different between the named commit + and the current commit in the working tree. + -q:: Be quiet, only report errors. @@ -130,7 +135,7 @@ Undo a merge or pull:: $ git pull <1> Auto-merging nitfol CONFLICT (content): Merge conflict in nitfol -Automatic merge failed/prevented; fix up by hand +Automatic merge failed; fix conflicts and then commit the result. $ git reset --hard <2> $ git pull . topic/branch <3> Updating from 41223... to 13134... @@ -152,6 +157,28 @@ tip of the current branch in ORIG_HEAD, so resetting hard to it brings your index file and the working tree back to that state, and resets the tip of the branch to that commit. +Undo a merge or pull inside a dirty work tree:: ++ +------------ +$ git pull <1> +Auto-merging nitfol +Merge made by recursive. + nitfol | 20 +++++---- + ... +$ git reset --merge ORIG_HEAD <2> +------------ ++ +<1> Even if you may have local modifications in your +working tree, you can safely say "git pull" when you know +that the change in the other branch does not overlap with +them. +<2> After inspecting the result of the merge, you may find +that the change in the other branch is unsatisfactory. Running +"git reset --hard ORIG_HEAD" will let you go back to where you +were, but it will discard your local changes, which you do not +want. "git reset --merge" keeps your local changes. + + Interrupted workflow:: + Suppose you are interrupted by an urgent fix request while you @@ -177,6 +204,8 @@ $ git reset <3> <3> At this point the index file still has all the WIP changes you committed as 'snapshot WIP'. This updates the index to show your WIP files as uncommitted. ++ +See also linkgit:git-stash[1]. Reset a single file in the index:: + diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt index caa07298a6..5e1175800a 100644 --- a/Documentation/git-revert.txt +++ b/Documentation/git-revert.txt @@ -44,6 +44,14 @@ OPTIONS option specifies the parent number (starting from 1) of the mainline and allows revert to reverse the change relative to the specified parent. ++ +Reverting a merge commit declares that you will never want the tree changes +brought in by the merge. As a result, later merges will only bring in tree +changes introduced by commits that are not ancestors of the previously +reverted merge. This may or may not be what you want. ++ +See the link:howto/revert-a-faulty-merge.txt[revert-a-faulty-merge How-To] for +more details. --no-edit:: With this option, 'git-revert' will not start the commit diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index 12788667d4..b69846e522 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -197,12 +197,6 @@ Administering --[no-]validate:: Perform sanity checks on patches. Currently, validation means the following: - ---[no-]format-patch:: - When an argument may be understood either as a reference or as a file name, - choose to understand it as a format-patch argument ('--format-patch') - or as a file name ('--no-format-patch'). By default, when such a conflict - occurs, git send-email will fail. + -- * Warn of patches that contain lines longer than 998 characters; this @@ -212,6 +206,12 @@ Administering Default is the value of 'sendemail.validate'; if this is not set, default to '--validate'. +--[no-]format-patch:: + When an argument may be understood either as a reference or as a file name, + choose to understand it as a format-patch argument ('--format-patch') + or as a file name ('--no-format-patch'). By default, when such a conflict + occurs, git send-email will fail. + CONFIGURATION ------------- diff --git a/Documentation/git-shortlog.txt b/Documentation/git-shortlog.txt index 7ccf31ccc4..8f7c0e226d 100644 --- a/Documentation/git-shortlog.txt +++ b/Documentation/git-shortlog.txt @@ -48,15 +48,41 @@ OPTIONS FILES ----- -If the file `.mailmap` exists, it will be used for mapping author -email addresses to a real author name. One mapping per line, first -the author name followed by the email address enclosed by -'<' and '>'. Use hash '#' for comments. Example: +If a file `.mailmap` exists at the toplevel of the repository, +it is used to map an author email address to a canonical real name. This +can be used to coalesce together commits by the same person where their +name was spelled differently (whether with the same email address or +not). + +Each line in the file consists, in this order, of the canonical real name +of an author, whitespace, and an email address (enclosed by '<' and '>') +to map to the name. Use hash '#' for comments, either on their own line, +or after the email address. + +A canonical name may appear in more than one line, associated with +different email addresses, but it doesn't make sense for a given address +to appear more than once (if that happens, a later line overrides the +earlier ones). + +So, for example, if your history contains commits by two authors, Jane +and Joe, whose names appear in the repository under several forms: + +------------ +Joe Developer <joe@example.com> +Joe R. Developer <joe@example.com> +Jane Doe <jane@example.com> +Jane Doe <jane@laptop.(none)> +Jane D. <jane@desktop.(none)> +------------ + +Then, supposing Joe wants his middle name initial used, and Jane prefers +her family name fully spelled out, a proper `.mailmap` file would look like: ------------ -# Keep alphabetized -Adam Morrow <adam@localhost.localdomain> -Eve Jones <eve@laptop.(none)> +# Note how we don't need an entry for <jane@laptop.(none)>, because the +# real name of that author is correct already, and coalesced directly. +Jane Doe <jane@desktop.(none)> +Joe R. Developer <joe@random.com> ------------ Author diff --git a/Documentation/git-show-branch.txt b/Documentation/git-show-branch.txt index d3f258869f..8277577a6f 100644 --- a/Documentation/git-show-branch.txt +++ b/Documentation/git-show-branch.txt @@ -30,7 +30,7 @@ OPTIONS ------- <rev>:: Arbitrary extended SHA1 expression (see linkgit:git-rev-parse[1]) - that typically names a branch HEAD or a tag. + that typically names a branch head or a tag. <glob>:: A glob pattern that matches branch or tag names under @@ -172,7 +172,7 @@ only the primary branches. In addition, if you happen to be on your topic branch, it is shown as well. ------------ -$ git show-branch --reflog='10,1 hour ago' --list master +$ git show-branch --reflog="10,1 hour ago" --list master ------------ shows 10 reflog entries going back from the tip as of 1 hour ago. diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index babaa9bc46..2f207fbbda 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -87,7 +87,7 @@ use by subsequent users cloning the superproject. If the URL is given relative to the superproject's repository, the presumption is the superproject and submodule repositories will be kept together in the same relative location, and only the -superproject's URL need be provided: git-submodule will correctly +superproject's URL needs to be provided: git-submodule will correctly locate the submodule using the relative URL in .gitmodules. status:: diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt index 046ab3542b..e44f543025 100644 --- a/Documentation/git-tag.txt +++ b/Documentation/git-tag.txt @@ -70,7 +70,7 @@ OPTIONS -m <msg>:: Use the given tag message (instead of prompting). - If multiple `-m` options are given, there values are + If multiple `-m` options are given, their values are concatenated as separate paragraphs. Implies `-a` if none of `-a`, `-s`, or `-u <key-id>` is given. @@ -207,7 +207,7 @@ determines who are interested in whose tags. A one-shot pull is a sign that a commit history is now crossing the boundary between one circle of people (e.g. "people who are -primarily interested in networking part of the kernel") who may +primarily interested in the networking part of the kernel") who may have their own set of tags (e.g. "this is the third release candidate from the networking group to be proposed for general consumption with 2.6.21 release") to another circle of people diff --git a/Documentation/git-update-index.txt b/Documentation/git-update-index.txt index 1d9d81a702..25e0bbea86 100644 --- a/Documentation/git-update-index.txt +++ b/Documentation/git-update-index.txt @@ -55,7 +55,7 @@ OPTIONS default behavior is to error out. This option makes 'git-update-index' continue anyway. ---ignore-submodules: +--ignore-submodules:: Do not try to update submodules. This option is only respected when passed before --refresh. @@ -78,9 +78,9 @@ OPTIONS --assume-unchanged:: --no-assume-unchanged:: - When these flags are specified, the object name recorded + When these flags are specified, the object names recorded for the paths are not updated. Instead, these options - sets and unsets the "assume unchanged" bit for the + set and unset the "assume unchanged" bit for the paths. When the "assume unchanged" bit is on, git stops checking the working tree files for possible modifications, so you need to manually unset the bit to @@ -122,7 +122,7 @@ you will need to handle the situation manually. 'git-update-index' refuses an attempt to add `path/file`. Similarly if a file `path/file` exists, a file `path` cannot be added. With --replace flag, existing entries - that conflicts with the entry being added are + that conflict with the entry being added are automatically removed with warning messages. --stdin:: diff --git a/Documentation/git.txt b/Documentation/git.txt index 585af7a0d0..17dc8b2019 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -43,9 +43,15 @@ unreleased) version of git, that is available from 'master' branch of the `git.git` repository. Documentation for older releases are available here: -* link:v1.6.0.5/git.html[documentation for release 1.6.0.5] +* link:v1.6.1/git.html[documentation for release 1.6.1] * release notes for + link:RelNotes-1.6.1.txt[1.6.1]. + +* link:v1.6.0.6/git.html[documentation for release 1.6.0.6] + +* release notes for + link:RelNotes-1.6.0.6.txt[1.6.0.6], link:RelNotes-1.6.0.5.txt[1.6.0.5], link:RelNotes-1.6.0.4.txt[1.6.0.4], link:RelNotes-1.6.0.3.txt[1.6.0.3], @@ -53,9 +59,10 @@ Documentation for older releases are available here: link:RelNotes-1.6.0.1.txt[1.6.0.1], link:RelNotes-1.6.0.txt[1.6.0]. -* link:v1.5.6.5/git.html[documentation for release 1.5.6.5] +* link:v1.5.6.6/git.html[documentation for release 1.5.6.6] * release notes for + link:RelNotes-1.5.6.6.txt[1.5.6.6], link:RelNotes-1.5.6.5.txt[1.5.6.5], link:RelNotes-1.5.6.4.txt[1.5.6.4], link:RelNotes-1.5.6.3.txt[1.5.6.3], @@ -63,18 +70,22 @@ Documentation for older releases are available here: link:RelNotes-1.5.6.1.txt[1.5.6.1], link:RelNotes-1.5.6.txt[1.5.6]. -* link:v1.5.5.4/git.html[documentation for release 1.5.5.4] +* link:v1.5.5.6/git.html[documentation for release 1.5.5.6] * release notes for + link:RelNotes-1.5.5.6.txt[1.5.5.6], + link:RelNotes-1.5.5.5.txt[1.5.5.5], link:RelNotes-1.5.5.4.txt[1.5.5.4], link:RelNotes-1.5.5.3.txt[1.5.5.3], link:RelNotes-1.5.5.2.txt[1.5.5.2], link:RelNotes-1.5.5.1.txt[1.5.5.1], link:RelNotes-1.5.5.txt[1.5.5]. -* link:v1.5.4.5/git.html[documentation for release 1.5.4.5] +* link:v1.5.4.7/git.html[documentation for release 1.5.4.7] * release notes for + link:RelNotes-1.5.4.7.txt[1.5.4.7], + link:RelNotes-1.5.4.6.txt[1.5.4.6], link:RelNotes-1.5.4.5.txt[1.5.4.5], link:RelNotes-1.5.4.4.txt[1.5.4.4], link:RelNotes-1.5.4.3.txt[1.5.4.3], diff --git a/Documentation/gitcore-tutorial.txt b/Documentation/gitcore-tutorial.txt index 96bf353d13..e4dd5518c8 100644 --- a/Documentation/gitcore-tutorial.txt +++ b/Documentation/gitcore-tutorial.txt @@ -899,7 +899,7 @@ file, which had no differences in the `mybranch` branch), and say: ---------------- Auto-merging hello CONFLICT (content): Merge conflict in hello - Automatic merge failed; fix up by hand + Automatic merge failed; fix conflicts and then commit the result. ---------------- It tells you that it did an "Automatic merge", which @@ -993,14 +993,14 @@ would be different) ---------------- Updating from ae3a2da... to a80b4aa.... -Fast forward +Fast forward (no commit created; -m option ignored) example | 1 + hello | 1 + 2 files changed, 2 insertions(+), 0 deletions(-) ---------------- -Because your branch did not contain anything more than what are -already merged into the `master` branch, the merge operation did +Because your branch did not contain anything more than what had +already been merged into the `master` branch, the merge operation did not actually do a merge. Instead, it just updated the top of the tree of your branch to that of the `master` branch. This is often called 'fast forward' merge. @@ -1265,9 +1265,8 @@ file, using 3-way merge. This is done by giving ------------ $ git merge-index git-merge-one-file hello -Auto-merging hello. -merge: warning: conflicts during merge -ERROR: Merge conflict in hello. +Auto-merging hello +ERROR: Merge conflict in hello fatal: merge program failed ------------ @@ -1353,7 +1352,7 @@ $ GIT_DIR=my-git.git git init ------------ Make sure this directory is available for others you want your -changes to be pulled by via the transport of your choice. Also +changes to be pulled via the transport of your choice. Also you need to make sure that you have the 'git-receive-pack' program on the `$PATH`. @@ -1447,7 +1446,7 @@ public repository you might want to repack & prune often, or never. If you run `git repack` again at this point, it will say -"Nothing to pack". Once you continue your development and +"Nothing new to pack.". Once you continue your development and accumulate the changes, running `git repack` again will create a new pack, that contains objects created since you packed your repository the last time. We recommend that you pack your project @@ -1512,7 +1511,7 @@ You can repack this private repository whenever you feel like. 6. Push your changes to the public repository, and announce it to the public. -7. Every once in a while, "git-repack" the public repository. +7. Every once in a while, 'git-repack' the public repository. Go back to step 5. and continue working. diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt index 5faaaa5fed..cfdae1efa2 100644 --- a/Documentation/githooks.txt +++ b/Documentation/githooks.txt @@ -20,6 +20,10 @@ directory to trigger action at certain points. When all disabled. To enable a hook, rename it by removing its `.sample` suffix. +NOTE: It is also a requirement for a given hook to be executable. +However - in a freshly initialized repository - the `.sample` files are +executable by default. + This document describes the currently defined hooks. applypatch-msg diff --git a/Documentation/gitk.txt b/Documentation/gitk.txt index 317f6317c2..4673a75a98 100644 --- a/Documentation/gitk.txt +++ b/Documentation/gitk.txt @@ -21,7 +21,7 @@ git repository. OPTIONS ------- -To control which revisions to shown, the command takes options applicable to +To control which revisions to show, the command takes options applicable to the 'git-rev-list' command (see linkgit:git-rev-list[1]). This manual page describes only the most frequently used options. @@ -80,7 +80,7 @@ Examples -------- gitk v2.6.12.. include/scsi drivers/scsi:: - Show as the changes since version 'v2.6.12' that changed any + Show the changes since version 'v2.6.12' that changed any file in the include/scsi or drivers/scsi subdirectories gitk --since="2 weeks ago" \-- gitk:: diff --git a/Documentation/gitrepository-layout.txt b/Documentation/gitrepository-layout.txt index a969b3fbc3..1befca98d4 100644 --- a/Documentation/gitrepository-layout.txt +++ b/Documentation/gitrepository-layout.txt @@ -134,7 +134,8 @@ hooks:: Hooks are customization scripts used by various git commands. A handful of sample hooks are installed when 'git-init' is run, but all of them are disabled by - default. To enable, they need to be made executable. + default. To enable, the `.sample` suffix has to be + removed from the filename by renaming. Read linkgit:githooks[5] for more details about each hook. diff --git a/Documentation/gittutorial.txt b/Documentation/gittutorial.txt index 7892244ef1..458fafdb2c 100644 --- a/Documentation/gittutorial.txt +++ b/Documentation/gittutorial.txt @@ -590,7 +590,7 @@ list. When the history has lines of development that diverged and then merged back together, the order in which 'git-log' presents those commits is meaningless. -Most projects with multiple contributors (such as the linux kernel, +Most projects with multiple contributors (such as the Linux kernel, or git itself) have frequent merges, and 'gitk' does a better job of visualizing their history. For example, @@ -642,7 +642,7 @@ digressions that may be interesting at this point are: * linkgit:git-format-patch[1], linkgit:git-am[1]: These convert series of git commits into emailed patches, and vice versa, - useful for projects such as the linux kernel which rely heavily + useful for projects such as the Linux kernel which rely heavily on emailed patches. * linkgit:git-bisect[1]: When there is a regression in your diff --git a/Documentation/glossary-content.txt b/Documentation/glossary-content.txt index 9b4a4f45e9..9afca755ed 100644 --- a/Documentation/glossary-content.txt +++ b/Documentation/glossary-content.txt @@ -183,7 +183,8 @@ to point at the new commit. and potentially aborted, and allow for a post-notification after the operation is done. The hook scripts are found in the `$GIT_DIR/hooks/` directory, and are enabled by simply - making them executable. + removing the `.sample` suffix from the filename. In earlier versions + of git you had to make them executable. [[def_index]]index:: A collection of files with stat information, whose contents are stored diff --git a/Documentation/howto/revert-a-faulty-merge.txt b/Documentation/howto/revert-a-faulty-merge.txt new file mode 100644 index 0000000000..39b1da440a --- /dev/null +++ b/Documentation/howto/revert-a-faulty-merge.txt @@ -0,0 +1,179 @@ +Date: Fri, 19 Dec 2008 00:45:19 -0800 +From: Linus Torvalds <torvalds@linux-foundation.org>, Junio C Hamano <gitster@pobox.com> +Subject: Re: Odd merge behaviour involving reverts +Abstract: Sometimes a branch that was already merged to the mainline + is later found to be faulty. Linus and Junio give guidance on + recovering from such a premature merge and continuing development + after the offending branch is fixed. +Message-ID: <7vocz8a6zk.fsf@gitster.siamese.dyndns.org> +References: <alpine.LFD.2.00.0812181949450.14014@localhost.localdomain> + +Alan <alan@clueserver.org> said: + + I have a master branch. We have a branch off of that that some + developers are doing work on. They claim it is ready. We merge it + into the master branch. It breaks something so we revert the merge. + They make changes to the code. they get it to a point where they say + it is ok and we merge again. + + When examined, we find that code changes made before the revert are + not in the master branch, but code changes after are in the master + branch. + +and asked for help recovering from this situation. + +The history immediately after the "revert of the merge" would look like +this: + + ---o---o---o---M---x---x---W + / + ---A---B + +where A and B are on the side development that was not so good, M is the +merge that brings these premature changes into the mainline, x are changes +unrelated to what the side branch did and already made on the mainline, +and W is the "revert of the merge M" (doesn't W look M upside down?). +IOW, "diff W^..W" is similar to "diff -R M^..M". + +Such a "revert" of a merge can be made with: + + $ git revert -m 1 M + +After the develpers of the side branch fixes their mistakes, the history +may look like this: + + ---o---o---o---M---x---x---W---x + / + ---A---B-------------------C---D + +where C and D are to fix what was broken in A and B, and you may already +have some other changes on the mainline after W. + +If you merge the updated side branch (with D at its tip), none of the +changes made in A nor B will be in the result, because they were reverted +by W. That is what Alan saw. + +Linus explains the situation: + + Reverting a regular commit just effectively undoes what that commit + did, and is fairly straightforward. But reverting a merge commit also + undoes the _data_ that the commit changed, but it does absolutely + nothing to the effects on _history_ that the merge had. + + So the merge will still exist, and it will still be seen as joining + the two branches together, and future merges will see that merge as + the last shared state - and the revert that reverted the merge brought + in will not affect that at all. + + So a "revert" undoes the data changes, but it's very much _not_ an + "undo" in the sense that it doesn't undo the effects of a commit on + the repository history. + + So if you think of "revert" as "undo", then you're going to always + miss this part of reverts. Yes, it undoes the data, but no, it doesn't + undo history. + +In such a situation, you would want to first revert the previous revert, +which would make the history look like this: + + ---o---o---o---M---x---x---W---x---Y + / + ---A---B-------------------C---D + +where Y is the revert of W. Such a "revert of the revert" can be done +with: + + $ git revert W + +This history would (ignoring possible conflicts between what W and W..Y +changed) be equivalent to not having W nor Y at all in the history: + + ---o---o---o---M---x---x-------x---- + / + ---A---B-------------------C---D + +and merging the side branch again will not have conflict arising from an +earlier revert and revert of the revert. + + ---o---o---o---M---x---x-------x-------* + / / + ---A---B-------------------C---D + +Of course the changes made in C and D still can conflict with what was +done by any of the x, but that is just a normal merge conflict. + +On the other hand, if the developers of the side branch discarded their +faulty A and B, and redone the changes on top of the updated mainline +after the revert, the history would have looked like this: + + ---o---o---o---M---x---x---W---x---x + / \ + ---A---B A'--B'--C' + +If you reverted the revert in such a case as in the previous example: + + ---o---o---o---M---x---x---W---x---x---Y---* + / \ / + ---A---B A'--B'--C' + +where Y is the revert of W, A' and B'are rerolled A and B, and there may +also be a further fix-up C' on the side branch. "diff Y^..Y" is similar +to "diff -R W^..W" (which in turn means it is similar to "diff M^..M"), +and "diff A'^..C'" by definition would be similar but different from that, +because it is a rerolled series of the earlier change. There will be a +lot of overlapping changes that result in conflicts. So do not do "revert +of revert" blindly without thinking.. + + ---o---o---o---M---x---x---W---x---x + / \ + ---A---B A'--B'--C' + +In the history with rebased side branch, W (and M) are behind the merge +base of the updated branch and the tip of the mainline, and they should +merge without the past faulty merge and its revert getting in the way. + +To recap, these are two very different scenarios, and they want two very +different resolution strategies: + + - If the faulty side branch was fixed by adding corrections on top, then + doing a revert of the previous revert would be the right thing to do. + + - If the faulty side branch whose effects were discarded by an earlier + revert of a merge was rebuilt from scratch (i.e. rebasing and fixing, + as you seem to have interpreted), then re-merging the result without + doing anything else fancy would be the right thing to do. + +However, there are things to keep in mind when reverting a merge (and +reverting such a revert). + +For example, think about what reverting a merge (and then reverting the +revert) does to bisectability. Ignore the fact that the revert of a revert +is undoing it - just think of it as a "single commit that does a lot". +Because that is what it does. + +When you have a problem you are chasing down, and you hit a "revert this +merge", what you're hitting is essentially a single commit that contains +all the changes (but obviously in reverse) of all the commits that got +merged. So it's debugging hell, because now you don't have lots of small +changes that you can try to pinpoint which _part_ of it changes. + +But does it all work? Sure it does. You can revert a merge, and from a +purely technical angle, git did it very naturally and had no real +troubles. It just considered it a change from "state before merge" to +"state after merge", and that was it. Nothing complicated, nothing odd, +nothing really dangerous. Git will do it without even thinking about it. + +So from a technical angle, there's nothing wrong with reverting a merge, +but from a workflow angle it's something that you generally should try to +avoid. + +If at all possible, for example, if you find a problem that got merged +into the main tree, rather than revert the merge, try _really_ hard to +bisect the problem down into the branch you merged, and just fix it, or +try to revert the individual commit that caused it. + +Yes, it's more complex, and no, it's not always going to work (sometimes +the answer is: "oops, I really shouldn't have merged it, because it wasn't +ready yet, and I really need to undo _all_ of the merge"). So then you +really should revert the merge, but when you want to re-do the merge, you +now need to do it by reverting the revert. diff --git a/Documentation/i18n.txt b/Documentation/i18n.txt index 2cdacd94cd..708da6ca31 100644 --- a/Documentation/i18n.txt +++ b/Documentation/i18n.txt @@ -7,11 +7,11 @@ At the core level, git is character encoding agnostic. to be what lstat(2) and creat(2) accepts. There is no such thing as pathname encoding translation. - - The contents of the blob objects are uninterpreted sequence + - The contents of the blob objects are uninterpreted sequences of bytes. There is no encoding translation at the core level. - - The commit log messages are uninterpreted sequence of non-NUL + - The commit log messages are uninterpreted sequences of non-NUL bytes. Although we encourage that the commit log messages are encoded diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index f18d33e00b..0a8a948e6f 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -30,7 +30,7 @@ This is designed to be as compact as possible. commit <sha1> Author: <author> - Date: <author date> + Date: <author date> <title line> @@ -49,9 +49,9 @@ This is designed to be as compact as possible. * 'fuller' commit <sha1> - Author: <author> + Author: <author> AuthorDate: <author date> - Commit: <committer> + Commit: <committer> CommitDate: <committer date> <title line> diff --git a/Documentation/technical/api-strbuf.txt b/Documentation/technical/api-strbuf.txt index a8ee2fe6a1..9a4e3ea92c 100644 --- a/Documentation/technical/api-strbuf.txt +++ b/Documentation/technical/api-strbuf.txt @@ -133,8 +133,10 @@ Functions * Adding data to the buffer -NOTE: All of these functions in this section will grow the buffer as - necessary. +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`:: @@ -235,6 +237,11 @@ same behaviour as well. 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* pointer. The second argument specifies the line diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt index d4b1e90f94..19f571ae3b 100644 --- a/Documentation/user-manual.txt +++ b/Documentation/user-manual.txt @@ -59,7 +59,7 @@ project in mind, here are some interesting examples: ------------------------------------------------ # git itself (approx. 10MB download): $ git clone git://git.kernel.org/pub/scm/git/git.git - # the linux kernel (approx. 150MB download): + # the Linux kernel (approx. 150MB download): $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git ------------------------------------------------ @@ -1009,7 +1009,7 @@ $ git init If you have some initial content (say, a tarball): ------------------------------------------------- -$ tar -xzvf project.tar.gz +$ tar xzvf project.tar.gz $ cd project $ git init $ git add . # include everything below ./ in the first commit: @@ -1340,7 +1340,7 @@ These will display all commits which exist only on HEAD or on MERGE_HEAD, and which touch an unmerged file. You may also use linkgit:git-mergetool[1], which lets you merge the -unmerged files using external tools such as emacs or kdiff3. +unmerged files using external tools such as Emacs or kdiff3. Each time you resolve the conflicts in a file and update the index: @@ -101,6 +101,9 @@ Issues of note: Building and installing the info file additionally requires makeinfo and docbook2X. Version 0.8.3 is known to work. + Building and installing the pdf file additionally requires + dblatex. Version 0.2.7 with asciidoc >= 8.2.7 is known to work. + The documentation is written for AsciiDoc 7, but "make ASCIIDOC8=YesPlease doc" will let you format with AsciiDoc 8. @@ -645,6 +645,7 @@ ifeq ($(uname_S),Darwin) endif NO_STRLCPY = YesPlease NO_MEMMEM = YesPlease + THREADED_DELTA_SEARCH = YesPlease endif ifeq ($(uname_S),SunOS) NEEDS_SOCKET = YesPlease @@ -1306,6 +1307,9 @@ html: info: $(MAKE) -C Documentation info +pdf: + $(MAKE) -C Documentation pdf + TAGS: $(RM) TAGS $(FIND) . -name '*.[hcS]' -print | xargs etags -a @@ -1448,6 +1452,9 @@ install-html: install-info: $(MAKE) -C Documentation install-info +install-pdf: + $(MAKE) -C Documentation install-pdf + quick-install-doc: $(MAKE) -C Documentation quick-install @@ -24,7 +24,7 @@ It was originally written by Linus Torvalds with help of a group of hackers around the net. It is currently maintained by Junio C Hamano. Please read the file INSTALL for installation instructions. -See Documentation/tutorial.txt to get started, then see +See Documentation/gittutorial.txt to get started, then see Documentation/everyday.txt for a useful minimum set of commands, and "man git-commandname" for documentation of each command. CVS users may also want to read Documentation/cvs-migration.txt. @@ -1 +1 @@ -Documentation/RelNotes-1.6.1.txt
\ No newline at end of file +Documentation/RelNotes-1.6.2.txt
\ No newline at end of file @@ -64,6 +64,8 @@ const char *make_absolute_path(const char *path) len = readlink(buf, next_buf, PATH_MAX); if (len < 0) die ("Invalid symlink: %s", buf); + if (PATH_MAX <= len) + die("symbolic link too long: %s", buf); next_buf[len] = '\0'; buf = next_buf; buf_index = 1 - buf_index; diff --git a/builtin-apply.c b/builtin-apply.c index 4c4d1e1774..a8f75ed3ed 100644 --- a/builtin-apply.c +++ b/builtin-apply.c @@ -630,7 +630,7 @@ static int gitdiff_index(const char *line, struct patch *patch) memcpy(patch->new_sha1_prefix, line, len); patch->new_sha1_prefix[len] = 0; if (*ptr == ' ') - patch->new_mode = patch->old_mode = strtoul(ptr+1, NULL, 8); + patch->old_mode = strtoul(ptr+1, NULL, 8); return 0; } @@ -1559,10 +1559,8 @@ static int read_old_data(struct stat *st, const char *path, struct strbuf *buf) { switch (st->st_mode & S_IFMT) { case S_IFLNK: - strbuf_grow(buf, st->st_size); - if (readlink(path, buf->buf, st->st_size) != st->st_size) - return -1; - strbuf_setlen(buf, st->st_size); + if (strbuf_readlink(buf, path, st->st_size) < 0) + return error("unable to read symlink %s", path); return 0; case S_IFREG: if (strbuf_read_file(buf, path, st->st_size) != st->st_size) @@ -2449,6 +2447,8 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s if (st_mode != patch->old_mode) fprintf(stderr, "warning: %s has type %o, expected %o\n", old_name, st_mode, patch->old_mode); + if (!patch->new_mode) + patch->new_mode = st_mode; return 0; is_new: diff --git a/builtin-blame.c b/builtin-blame.c index a0d60145f2..aae14ef8bb 100644 --- a/builtin-blame.c +++ b/builtin-blame.c @@ -1996,7 +1996,6 @@ static struct commit *fake_working_tree_commit(const char *path, const char *con if (!contents_from || strcmp("-", contents_from)) { struct stat st; const char *read_from; - unsigned long fin_size; if (contents_from) { if (stat(contents_from, &st) < 0) @@ -2008,7 +2007,6 @@ static struct commit *fake_working_tree_commit(const char *path, const char *con die("Cannot lstat %s", path); read_from = path; } - fin_size = xsize_t(st.st_size); mode = canon_mode(st.st_mode); switch (st.st_mode & S_IFMT) { case S_IFREG: @@ -2016,9 +2014,8 @@ static struct commit *fake_working_tree_commit(const char *path, const char *con die("cannot open or read %s", read_from); break; case S_IFLNK: - if (readlink(read_from, buf.buf, buf.alloc) != fin_size) + if (strbuf_readlink(&buf, read_from, st.st_size) < 0) die("cannot readlink %s", read_from); - buf.len = fin_size; break; default: die("unsupported file type %s", read_from); diff --git a/builtin-cat-file.c b/builtin-cat-file.c index 30d00a6664..8fad19daed 100644 --- a/builtin-cat-file.c +++ b/builtin-cat-file.c @@ -137,7 +137,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name) break; default: - die("git cat-file: unknown option: %s\n", exp_type); + die("git cat-file: unknown option: %s", exp_type); } if (!buf) diff --git a/builtin-checkout.c b/builtin-checkout.c index c2c05613b6..b5dd9c07b4 100644 --- a/builtin-checkout.c +++ b/builtin-checkout.c @@ -681,8 +681,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) argv++; argc--; + new.name = arg; if ((new.commit = lookup_commit_reference_gently(rev, 1))) { - new.name = arg; setup_branch_path(&new); if (resolve_ref(new.path, rev, 1, NULL)) new.commit = lookup_commit_reference(rev); diff --git a/builtin-clone.c b/builtin-clone.c index 2feac9c5cb..f1a1a0c365 100644 --- a/builtin-clone.c +++ b/builtin-clone.c @@ -192,15 +192,15 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest) dir = opendir(src->buf); if (!dir) - die("failed to open %s\n", src->buf); + die("failed to open %s", src->buf); if (mkdir(dest->buf, 0777)) { if (errno != EEXIST) - die("failed to create directory %s\n", dest->buf); + die("failed to create directory %s", dest->buf); else if (stat(dest->buf, &buf)) - die("failed to stat %s\n", dest->buf); + die("failed to stat %s", dest->buf); else if (!S_ISDIR(buf.st_mode)) - die("%s exists and is not a directory\n", dest->buf); + die("%s exists and is not a directory", dest->buf); } strbuf_addch(src, '/'); @@ -224,16 +224,16 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest) } if (unlink(dest->buf) && errno != ENOENT) - die("failed to unlink %s\n", dest->buf); + die("failed to unlink %s", dest->buf); if (!option_no_hardlinks) { if (!link(src->buf, dest->buf)) continue; if (option_local) - die("failed to create link %s\n", dest->buf); + die("failed to create link %s", dest->buf); option_no_hardlinks = 1; } if (copy_file(dest->buf, src->buf, 0666)) - die("failed to copy file to %s\n", dest->buf); + die("failed to copy file to %s", dest->buf); } closedir(dir); } diff --git a/builtin-describe.c b/builtin-describe.c index d2cfb1b083..3a007ed1ca 100644 --- a/builtin-describe.c +++ b/builtin-describe.c @@ -158,7 +158,7 @@ static void display_name(struct commit_name *n) n->tag = lookup_tag(n->sha1); if (!n->tag || parse_tag(n->tag) || !n->tag->tag) die("annotated tag %s not available", n->path); - if (strcmp(n->tag->tag, n->path)) + if (strcmp(n->tag->tag, all ? n->path + 5 : n->path)) warning("tag '%s' is really '%s' here", n->tag->tag, n->path); } diff --git a/builtin-fast-export.c b/builtin-fast-export.c index 7d5d57ad75..e9ee2c79ac 100644 --- a/builtin-fast-export.c +++ b/builtin-fast-export.c @@ -24,6 +24,7 @@ static const char *fast_export_usage[] = { static int progress; static enum { VERBATIM, WARN, STRIP, ABORT } signed_tag_mode = ABORT; +static int fake_missing_tagger; static int parse_opt_signed_tag_mode(const struct option *opt, const char *arg, int unset) @@ -297,10 +298,17 @@ static void handle_tag(const char *name, struct tag *tag) message_size = strlen(message); } tagger = memmem(buf, message ? message - buf : size, "\ntagger ", 8); - if (!tagger) - die ("No tagger for tag %s", sha1_to_hex(tag->object.sha1)); - tagger++; - tagger_end = strchrnul(tagger, '\n'); + if (!tagger) { + if (fake_missing_tagger) + tagger = "tagger Unspecified Tagger " + "<unspecified-tagger> 0 +0000"; + else + tagger = ""; + tagger_end = tagger + strlen(tagger); + } else { + tagger++; + tagger_end = strchrnul(tagger, '\n'); + } /* handle signed tags */ if (message) { @@ -326,9 +334,10 @@ static void handle_tag(const char *name, struct tag *tag) if (!prefixcmp(name, "refs/tags/")) name += 10; - printf("tag %s\nfrom :%d\n%.*s\ndata %d\n%.*s\n", + printf("tag %s\nfrom :%d\n%.*s%sdata %d\n%.*s\n", name, get_object_mark(tag->tagged), (int)(tagger_end - tagger), tagger, + tagger == tagger_end ? "" : "\n", (int)message_size, (int)message_size, message ? message : ""); } @@ -483,9 +492,14 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix) "Dump marks to this file"), OPT_STRING(0, "import-marks", &import_filename, "FILE", "Import marks from this file"), + OPT_BOOLEAN(0, "fake-missing-tagger", &fake_missing_tagger, + "Fake a tagger when tags lack one"), OPT_END() }; + if (argc == 1) + usage_with_options (fast_export_usage, options); + /* we handle encodings */ git_config(git_default_config, NULL); diff --git a/builtin-fetch.c b/builtin-fetch.c index 7568163af2..de6f3074b1 100644 --- a/builtin-fetch.c +++ b/builtin-fetch.c @@ -607,7 +607,7 @@ static void set_option(const char *name, const char *value) { int r = transport_set_option(transport, name, value); if (r < 0) - die("Option \"%s\" value \"%s\" is not valid for %s\n", + die("Option \"%s\" value \"%s\" is not valid for %s", name, value, transport->url); if (r > 0) warning("Option \"%s\" is ignored for %s\n", diff --git a/builtin-init-db.c b/builtin-init-db.c index d30c3fe2ca..ee3911f8ee 100644 --- a/builtin-init-db.c +++ b/builtin-init-db.c @@ -29,7 +29,7 @@ static void safe_create_dir(const char *dir, int share) } } else if (share && adjust_shared_perm(dir)) - die("Could not make %s writable by group\n", dir); + die("Could not make %s writable by group", dir); } static void copy_templates_1(char *path, int baselen, diff --git a/builtin-log.c b/builtin-log.c index 840daf9078..4a02ee987a 100644 --- a/builtin-log.c +++ b/builtin-log.c @@ -249,22 +249,13 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix) static void show_tagger(char *buf, int len, struct rev_info *rev) { - char *email_end, *p; - unsigned long date; - int tz; + struct strbuf out = STRBUF_INIT; - email_end = memchr(buf, '>', len); - if (!email_end) - return; - p = ++email_end; - while (isspace(*p)) - p++; - date = strtoul(p, &p, 10); - while (isspace(*p)) - p++; - tz = (int)strtol(p, NULL, 10); - printf("Tagger: %.*s\nDate: %s\n", (int)(email_end - buf), buf, - show_date(date, tz, rev->date_mode)); + pp_user_info("Tagger", rev->commit_format, &out, buf, rev->date_mode, + git_log_output_encoding ? + git_log_output_encoding: git_commit_encoding); + printf("%s\n", out.buf); + strbuf_release(&out); } static int show_object(const unsigned char *sha1, int show_tag_object, @@ -340,7 +331,13 @@ int cmd_show(int argc, const char **argv, const char *prefix) t->tag, diff_get_color_opt(&rev.diffopt, DIFF_RESET)); ret = show_object(o->sha1, 1, &rev); - objects[i].item = parse_object(t->tagged->sha1); + if (ret) + break; + o = parse_object(t->tagged->sha1); + if (!o) + ret = error("Could not read object %s", + sha1_to_hex(t->tagged->sha1)); + objects[i].item = o; i--; break; } @@ -818,7 +815,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) committer = git_committer_info(IDENT_ERROR_ON_NO_NAME); endpos = strchr(committer, '>'); if (!endpos) - die("bogus committer info %s\n", committer); + die("bogus committer info %s", committer); add_signoff = xmemdupz(committer, endpos - committer + 1); } else if (!strcmp(argv[i], "--attach")) { diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c index e890f7a6d1..f7c8c08b32 100644 --- a/builtin-mailinfo.c +++ b/builtin-mailinfo.c @@ -494,7 +494,7 @@ static void convert_to_utf8(struct strbuf *line, const char *charset) return; out = reencode_string(line->buf, metainfo_charset, charset); if (!out) - die("cannot convert from %s to %s\n", + die("cannot convert from %s to %s", charset, metainfo_charset); strbuf_attach(line, out, strlen(out), strlen(out)); } diff --git a/builtin-merge-file.c b/builtin-merge-file.c index 9d4e874809..96edb97a83 100644 --- a/builtin-merge-file.c +++ b/builtin-merge-file.c @@ -51,8 +51,11 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, options, merge_file_usage, 0); if (argc != 3) usage_with_options(merge_file_usage, options); - if (quiet) - freopen("/dev/null", "w", stderr); + if (quiet) { + if (!freopen("/dev/null", "w", stderr)) + return error("failed to redirect stderr to /dev/null: " + "%s\n", strerror(errno)); + } for (i = 0; i < 3; i++) { if (!names[i]) diff --git a/builtin-merge-recursive.c b/builtin-merge-recursive.c index 6b534c1a66..703045bfc8 100644 --- a/builtin-merge-recursive.c +++ b/builtin-merge-recursive.c @@ -33,7 +33,7 @@ int cmd_merge_recursive(int argc, const char **argv, const char *prefix) } if (argc < 4) - die("Usage: %s <base>... -- <head> <remote> ...\n", argv[0]); + die("Usage: %s <base>... -- <head> <remote> ...", argv[0]); for (i = 1; i < argc; ++i) { if (!strcmp(argv[i], "--")) diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c index cedef52fd3..e8515348be 100644 --- a/builtin-pack-objects.c +++ b/builtin-pack-objects.c @@ -78,7 +78,7 @@ static int progress = 1; static int window = 10; static uint32_t pack_size_limit, pack_size_limit_cfg; static int depth = 50; -static int delta_search_threads = 1; +static int delta_search_threads; static int pack_to_stdout; static int num_preferred_base; static struct progress *progress_state; @@ -1612,11 +1612,18 @@ static void ll_find_deltas(struct object_entry **list, unsigned list_size, find_deltas(list, &list_size, window, depth, processed); return; } + if (progress > pack_to_stdout) + fprintf(stderr, "Delta compression using %d threads.\n", + delta_search_threads); /* Partition the work amongst work threads. */ for (i = 0; i < delta_search_threads; i++) { unsigned sub_size = list_size / (delta_search_threads - i); + /* don't use too small segments or no deltas will be found */ + if (sub_size < 2*window && i+1 < delta_search_threads) + sub_size = 0; + p[i].window = window; p[i].depth = depth; p[i].processed = processed; diff --git a/builtin-reset.c b/builtin-reset.c index 9514b77f8c..c0cb915c26 100644 --- a/builtin-reset.c +++ b/builtin-reset.c @@ -20,11 +20,14 @@ #include "parse-options.h" static const char * const git_reset_usage[] = { - "git reset [--mixed | --soft | --hard] [-q] [<commit>]", + "git reset [--mixed | --soft | --hard | --merge] [-q] [<commit>]", "git reset [--mixed] <commit> [--] <paths>...", NULL }; +enum reset_type { MIXED, SOFT, HARD, MERGE, NONE }; +static const char *reset_type_names[] = { "mixed", "soft", "hard", "merge", NULL }; + static char *args_to_str(const char **argv) { char *buf = NULL; @@ -49,7 +52,7 @@ static inline int is_merge(void) return !access(git_path("MERGE_HEAD"), F_OK); } -static int reset_index_file(const unsigned char *sha1, int is_hard_reset, int quiet) +static int reset_index_file(const unsigned char *sha1, int reset_type, int quiet) { int i = 0; const char *args[6]; @@ -57,9 +60,17 @@ static int reset_index_file(const unsigned char *sha1, int is_hard_reset, int qu args[i++] = "read-tree"; if (!quiet) args[i++] = "-v"; - args[i++] = "--reset"; - if (is_hard_reset) + switch (reset_type) { + case MERGE: args[i++] = "-u"; + args[i++] = "-m"; + break; + case HARD: + args[i++] = "-u"; + /* fallthrough */ + default: + args[i++] = "--reset"; + } args[i++] = sha1_to_hex(sha1); args[i] = NULL; @@ -169,9 +180,6 @@ static void prepend_reflog_action(const char *action, char *buf, size_t size) warning("Reflog action message too long: %.*s...", 50, buf); } -enum reset_type { MIXED, SOFT, HARD, NONE }; -static const char *reset_type_names[] = { "mixed", "soft", "hard", NULL }; - int cmd_reset(int argc, const char **argv, const char *prefix) { int i = 0, reset_type = NONE, update_ref_status = 0, quiet = 0; @@ -186,6 +194,8 @@ int cmd_reset(int argc, const char **argv, const char *prefix) OPT_SET_INT(0, "soft", &reset_type, "reset only HEAD", SOFT), OPT_SET_INT(0, "hard", &reset_type, "reset HEAD, index and working tree", HARD), + OPT_SET_INT(0, "merge", &reset_type, + "reset HEAD, index and working tree", MERGE), OPT_BOOLEAN('q', NULL, &quiet, "disable showing new HEAD in hard reset and progress message"), OPT_END() @@ -266,7 +276,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix) if (is_merge() || read_cache() < 0 || unmerged_cache()) die("Cannot do a soft reset in the middle of a merge."); } - else if (reset_index_file(sha1, (reset_type == HARD), quiet)) + else if (reset_index_file(sha1, reset_type, quiet)) die("Could not reset index file to revision '%s'.", rev); /* Any resets update HEAD to the head being switched to, diff --git a/builtin-revert.c b/builtin-revert.c index 4038b4118d..d48313c745 100644 --- a/builtin-revert.c +++ b/builtin-revert.c @@ -352,6 +352,11 @@ static int revert_or_cherry_pick(int argc, const char **argv) add_to_msg(oneline_body + 1); add_to_msg("\"\n\nThis reverts commit "); add_to_msg(sha1_to_hex(commit->object.sha1)); + + if (commit->parents->next) { + add_to_msg(", reversing\nchanges made to "); + add_to_msg(sha1_to_hex(parent->object.sha1)); + } add_to_msg(".\n"); } else { base = parent; diff --git a/builtin-update-index.c b/builtin-update-index.c index 65d5775107..5604977505 100644 --- a/builtin-update-index.c +++ b/builtin-update-index.c @@ -486,7 +486,7 @@ static int unresolve_one(const char *path) static void read_head_pointers(void) { if (read_ref("HEAD", head_sha1)) - die("No HEAD -- no initial commit yet?\n"); + die("No HEAD -- no initial commit yet?"); if (read_ref("MERGE_HEAD", merge_head_sha1)) { fprintf(stderr, "Not in the middle of a merge.\n"); exit(0); diff --git a/combine-diff.c b/combine-diff.c index ec8df39bb0..bccc018ab2 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -703,15 +703,15 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent, goto deleted_file; if (S_ISLNK(st.st_mode)) { - size_t len = xsize_t(st.st_size); - result_size = len; - result = xmalloc(len + 1); - if (result_size != readlink(elem->path, result, len)) { + struct strbuf buf = STRBUF_INIT; + + if (strbuf_readlink(&buf, elem->path, st.st_size) < 0) { error("readlink(%s): %s", elem->path, strerror(errno)); return; } - result[len] = 0; + result_size = buf.len; + result = strbuf_detach(&buf, NULL); elem->mode = canon_mode(st.st_mode); } else if (0 <= (fd = open(elem->path, O_RDONLY)) && @@ -315,7 +315,7 @@ static int git_tcp_connect_sock(char *host, int flags) /* Not numeric */ struct servent *se = getservbyname(port,"tcp"); if ( !se ) - die("Unknown port %s\n", port); + die("Unknown port %s", port); nport = se->s_port; } @@ -480,8 +480,8 @@ char *get_port(char *host) char *p = strchr(host, ':'); if (p) { - strtol(p+1, &end, 10); - if (*end == '\0') { + long port = strtol(p + 1, &end, 10); + if (end != p + 1 && *end == '\0' && 0 <= port && port < 65536) { *p = '\0'; return p+1; } diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index c79c98ffec..3b25d48098 100755 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -1155,7 +1155,7 @@ _git_config () ;; color.*.*) __gitcomp " - black red green yellow blue magenta cyan white + normal black red green yellow blue magenta cyan white bold dim ul blink reverse " return @@ -1179,7 +1179,7 @@ _git_config () branch.*.*) local pfx="${cur%.*}." cur="${cur##*.}" - __gitcomp "remote merge" "$pfx" "$cur" + __gitcomp "remote merge mergeoptions" "$pfx" "$cur" return ;; branch.*) @@ -1192,7 +1192,7 @@ _git_config () local pfx="${cur%.*}." cur="${cur##*.}" __gitcomp " - url fetch push skipDefaultUpdate + url proxy fetch push mirror skipDefaultUpdate receivepack uploadpack tagopt " "$pfx" "$cur" return @@ -1206,85 +1206,161 @@ _git_config () esac __gitcomp " apply.whitespace - core.fileMode - core.gitProxy - core.ignoreStat - core.preferSymlinkRefs - core.logAllRefUpdates - core.loosecompression - core.repositoryFormatVersion - core.sharedRepository - core.warnAmbiguousRefs - core.compression - core.packedGitWindowSize - core.packedGitLimit + branch.autosetupmerge + branch.autosetuprebase clean.requireForce color.branch color.branch.current color.branch.local - color.branch.remote color.branch.plain + color.branch.remote color.diff - color.diff.plain - color.diff.meta + color.diff.commit color.diff.frag - color.diff.old + color.diff.meta color.diff.new - color.diff.commit + color.diff.old + color.diff.plain color.diff.whitespace + color.interactive + color.interactive.header + color.interactive.help + color.interactive.prompt color.pager color.status - color.status.header color.status.added color.status.changed + color.status.header + color.status.nobranch color.status.untracked + color.status.updated + color.ui + commit.template + core.autocrlf + core.bare + core.compression + core.deltaBaseCacheLimit + core.editor + core.excludesfile + core.fileMode + core.fsyncobjectfiles + core.gitProxy + core.ignoreCygwinFSTricks + core.ignoreStat + core.logAllRefUpdates + core.loosecompression + core.packedGitLimit + core.packedGitWindowSize + core.pager + core.preferSymlinkRefs + core.preloadindex + core.quotepath + core.repositoryFormatVersion + core.safecrlf + core.sharedRepository + core.symlinks + core.trustctime + core.warnAmbiguousRefs + core.whitespace + core.worktree + diff.autorefreshindex + diff.external + diff.mnemonicprefix diff.renameLimit + diff.renameLimit. diff.renames fetch.unpackLimit format.headers - format.subjectprefix - gitcvs.enabled - gitcvs.logfile - gitcvs.allbinary - gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass - gitcvs.dbtablenameprefix + format.numbered + format.pretty + format.suffix + gc.aggressiveWindow + gc.auto + gc.autopacklimit gc.packrefs + gc.pruneexpire gc.reflogexpire gc.reflogexpireunreachable gc.rerereresolved gc.rerereunresolved - http.sslVerify - http.sslCert - http.sslKey - http.sslCAInfo - http.sslCAPath - http.maxRequests + gitcvs.allbinary + gitcvs.dbTableNamePrefix + gitcvs.dbdriver + gitcvs.dbname + gitcvs.dbpass + gitcvs.dbuser + gitcvs.enabled + gitcvs.logfile + gitcvs.usecrlfattr + gui.blamehistoryctx + gui.commitmsgwidth + gui.copyblamethreshold + gui.diffcontext + gui.encoding + gui.fastcopyblame + gui.matchtrackingbranch + gui.newbranchtemplate + gui.pruneduringfetch + gui.spellingdictionary + gui.trustmtime + help.autocorrect + help.browser + help.format http.lowSpeedLimit http.lowSpeedTime + http.maxRequests http.noEPSV + http.proxy + http.sslCAInfo + http.sslCAPath + http.sslCert + http.sslKey + http.sslVerify i18n.commitEncoding i18n.logOutputEncoding + instaweb.browser + instaweb.httpd + instaweb.local + instaweb.modulepath + instaweb.port + log.date log.showroot + man.viewer + merge.conflictstyle + merge.log + merge.renameLimit + merge.stat merge.tool - merge.summary merge.verbosity - pack.window - pack.depth - pack.windowMemory + mergetool.keepBackup pack.compression - pack.deltaCacheSize pack.deltaCacheLimit + pack.deltaCacheSize + pack.depth + pack.indexVersion + pack.packSizeLimit + pack.threads + pack.window + pack.windowMemory pull.octopus pull.twohead - repack.useDeltaBaseOffset + receive.denyCurrentBranch + receive.denyDeletes + receive.denyNonFastForwards + receive.fsckObjects + receive.unpackLimit + repack.usedeltabaseoffset + rerere.autoupdate + rerere.enabled showbranch.default + status.relativePaths + status.showUntrackedFiles tar.umask transfer.unpackLimit - receive.unpackLimit - receive.denyNonFastForwards - user.name user.email + user.name user.signingkey + web.browser branch. remote. " } @@ -1327,7 +1403,7 @@ _git_reset () local cur="${COMP_WORDS[COMP_CWORD]}" case "$cur" in --*) - __gitcomp "--mixed --hard --soft" + __gitcomp "--merge --mixed --hard --soft" return ;; esac diff --git a/contrib/workdir/git-new-workdir b/contrib/workdir/git-new-workdir index 7959eab902..993cacf324 100755 --- a/contrib/workdir/git-new-workdir +++ b/contrib/workdir/git-new-workdir @@ -22,7 +22,7 @@ branch=$3 # want to make sure that what is pointed to has a .git directory ... git_dir=$(cd "$orig_git" 2>/dev/null && git rev-parse --git-dir 2>/dev/null) || - die "\"$orig_git\" is not a git repository!" + die "Not a git repository: \"$orig_git\"" case "$git_dir" in .git) @@ -150,7 +150,6 @@ static char *path_ok(char *directory) { static char rpath[PATH_MAX]; static char interp_path[PATH_MAX]; - int retried_path = 0; char *path; char *dir; @@ -219,22 +218,15 @@ static char *path_ok(char *directory) dir = rpath; } - do { - path = enter_repo(dir, strict_paths); - if (path) - break; - + path = enter_repo(dir, strict_paths); + if (!path && base_path && base_path_relaxed) { /* * if we fail and base_path_relaxed is enabled, try without * prefixing the base path */ - if (base_path && base_path_relaxed && !retried_path) { - dir = directory; - retried_path = 1; - continue; - } - break; - } while (1); + dir = directory; + path = enter_repo(dir, strict_paths); + } if (!path) { logerror("'%s': unable to chdir or not a git archive", dir); @@ -405,6 +397,14 @@ static void make_service_overridable(const char *name, int ena) die("No such service %s", name); } +static char *xstrdup_tolower(const char *str) +{ + char *p, *dup = xstrdup(str); + for (p = dup; *p; p++) + *p = tolower(*p); + return dup; +} + /* * Separate the "extra args" information as supplied by the client connection. */ @@ -413,7 +413,6 @@ static void parse_extra_args(char *extra_args, int buflen) char *val; int vallen; char *end = extra_args + buflen; - char *hp; while (extra_args < end && *extra_args) { saw_extended_args = 1; @@ -431,7 +430,7 @@ static void parse_extra_args(char *extra_args, int buflen) tcp_port = xstrdup(port); } free(hostname); - hostname = xstrdup(host); + hostname = xstrdup_tolower(host); } /* On to the next one */ @@ -440,19 +439,10 @@ static void parse_extra_args(char *extra_args, int buflen) } /* - * Replace literal host with lowercase-ized hostname. - */ - hp = hostname; - if (!hp) - return; - for ( ; *hp; hp++) - *hp = tolower(*hp); - - /* * Locate canonical hostname and its IP address. */ + if (hostname) { #ifndef NO_IPV6 - { struct addrinfo hints; struct addrinfo *ai, *ai0; int gai; @@ -476,9 +466,7 @@ static void parse_extra_args(char *extra_args, int buflen) } freeaddrinfo(ai0); } - } #else - { struct hostent *hent; struct sockaddr_in sa; char **ap; @@ -499,8 +487,8 @@ static void parse_extra_args(char *extra_args, int buflen) canon_hostname = xstrdup(hent->h_name); free(ip_address); ip_address = xstrdup(addrbuf); - } #endif + } } @@ -728,7 +716,7 @@ static int socksetup(char *listen_addr, int listen_port, int **socklist_p) gai = getaddrinfo(listen_addr, pbuf, &hints, &ai0); if (gai) - die("getaddrinfo() failed: %s\n", gai_strerror(gai)); + die("getaddrinfo() failed: %s", gai_strerror(gai)); for (ai = ai0; ai; ai = ai->ai_next) { int sockfd; @@ -953,12 +941,8 @@ int main(int argc, char **argv) char *arg = argv[i]; if (!prefixcmp(arg, "--listen=")) { - char *p = arg + 9; - char *ph = listen_addr = xmalloc(strlen(arg + 9) + 1); - while (*p) - *ph++ = tolower(*p++); - *ph = 0; - continue; + listen_addr = xstrdup_tolower(arg + 9); + continue; } if (!prefixcmp(arg, "--port=")) { char *end; @@ -1118,7 +1102,9 @@ int main(int argc, char **argv) struct sockaddr *peer = (struct sockaddr *)&ss; socklen_t slen = sizeof(ss); - freopen("/dev/null", "w", stderr); + if (!freopen("/dev/null", "w", stderr)) + die("failed to redirect stderr to /dev/null: %s", + strerror(errno)); if (getpeername(0, peer, &slen)) peer = NULL; @@ -1773,19 +1773,18 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only) s->size = xsize_t(st.st_size); if (!s->size) goto empty; - if (size_only) - return 0; if (S_ISLNK(st.st_mode)) { - int ret; - s->data = xmalloc(s->size); - s->should_free = 1; - ret = readlink(s->path, s->data, s->size); - if (ret < 0) { - free(s->data); + struct strbuf sb = STRBUF_INIT; + + if (strbuf_readlink(&sb, s->path, s->size)) goto err_empty; - } + s->size = sb.len; + s->data = strbuf_detach(&sb, NULL); + s->should_free = 1; return 0; } + if (size_only) + return 0; fd = open(s->path, O_RDONLY); if (fd < 0) goto err_empty; @@ -1883,13 +1882,12 @@ static void prepare_temp_file(const char *name, if (S_ISLNK(st.st_mode)) { int ret; char buf[PATH_MAX + 1]; /* ought to be SYMLINK_MAX */ - size_t sz = xsize_t(st.st_size); - if (sizeof(buf) <= st.st_size) - die("symlink too long: %s", name); - ret = readlink(name, buf, sz); + ret = readlink(name, buf, sizeof(buf)); if (ret < 0) die("readlink(%s)", name); - prep_temp_blob(temp, buf, sz, + if (ret == sizeof(buf)) + die("symlink too long: %s", name); + prep_temp_blob(temp, buf, ret, (one->sha1_valid ? one->sha1 : null_sha1), (one->sha1_valid ? @@ -2041,7 +2039,7 @@ static void diff_fill_sha1_info(struct diff_filespec *one) if (lstat(one->path, &st) < 0) die("stat %s", one->path); if (index_path(one->sha1, one->path, &st, 0)) - die("cannot hash %s\n", one->path); + die("cannot hash %s", one->path); } } else diff --git a/fast-import.c b/fast-import.c index 3276d5d7aa..a6bce66196 100644 --- a/fast-import.c +++ b/fast-import.c @@ -43,7 +43,7 @@ Format of STDIN stream: new_tag ::= 'tag' sp tag_str lf 'from' sp (ref_str | hexsha1 | sha1exp_str | idnum) lf - 'tagger' sp name '<' email '>' when lf + ('tagger' sp name '<' email '>' when lf)? tag_msg; tag_msg ::= data; @@ -983,8 +983,10 @@ static void end_packfile(void) pack_id++; } - else + else { + close(old_p->pack_fd); unlink(old_p->pack_name); + } free(old_p); /* We can't carry a delta across packfiles. */ @@ -1746,9 +1748,12 @@ static int validate_raw_date(const char *src, char *result, int maxlen) { const char *orig_src = src; char *endp, sign; + unsigned long date; - strtoul(src, &endp, 10); - if (endp == src || *endp != ' ') + errno = 0; + + date = strtoul(src, &endp, 10); + if (errno || endp == src || *endp != ' ') return -1; src = endp + 1; @@ -1756,8 +1761,8 @@ static int validate_raw_date(const char *src, char *result, int maxlen) return -1; sign = *src; - strtoul(src + 1, &endp, 10); - if (endp == src || *endp || (endp - orig_src) >= maxlen) + date = strtoul(src + 1, &endp, 10); + if (errno || endp == src || *endp || (endp - orig_src) >= maxlen) return -1; strcpy(result, orig_src); @@ -2263,23 +2268,27 @@ static void parse_new_tag(void) read_next_command(); /* tagger ... */ - if (prefixcmp(command_buf.buf, "tagger ")) - die("Expected tagger command, got %s", command_buf.buf); - tagger = parse_ident(command_buf.buf + 7); + if (!prefixcmp(command_buf.buf, "tagger ")) { + tagger = parse_ident(command_buf.buf + 7); + read_next_command(); + } else + tagger = NULL; /* tag payload/message */ - read_next_command(); parse_data(&msg); /* build the tag object */ strbuf_reset(&new_data); + strbuf_addf(&new_data, - "object %s\n" - "type %s\n" - "tag %s\n" - "tagger %s\n" - "\n", - sha1_to_hex(sha1), commit_type, t->name, tagger); + "object %s\n" + "type %s\n" + "tag %s\n", + sha1_to_hex(sha1), commit_type, t->name); + if (tagger) + strbuf_addf(&new_data, + "tagger %s\n", tagger); + strbuf_addch(&new_data, '\n'); strbuf_addbuf(&new_data, &msg); free(tagger); diff --git a/git-add--interactive.perl b/git-add--interactive.perl index b0223c3419..ca60356d00 100755 --- a/git-add--interactive.perl +++ b/git-add--interactive.perl @@ -800,6 +800,7 @@ y - stage this hunk n - do not stage this hunk a - stage this and all the remaining hunks in the file d - do not stage this hunk nor any of the remaining hunks in the file +g - select a hunk to go to j - leave this hunk undecided, see next undecided hunk J - leave this hunk undecided, see next hunk k - leave this hunk undecided, see previous undecided hunk @@ -836,6 +837,47 @@ sub patch_update_cmd { } } +# Generate a one line summary of a hunk. +sub summarize_hunk { + my $rhunk = shift; + my $summary = $rhunk->{TEXT}[0]; + + # Keep the line numbers, discard extra context. + $summary =~ s/@@(.*?)@@.*/$1 /s; + $summary .= " " x (20 - length $summary); + + # Add some user context. + for my $line (@{$rhunk->{TEXT}}) { + if ($line =~ m/^[+-].*\w/) { + $summary .= $line; + last; + } + } + + chomp $summary; + return substr($summary, 0, 80) . "\n"; +} + + +# Print a one-line summary of each hunk in the array ref in +# the first argument, starting wih the index in the 2nd. +sub display_hunks { + my ($hunks, $i) = @_; + my $ctr = 0; + $i ||= 0; + for (; $i < @$hunks && $ctr < 20; $i++, $ctr++) { + my $status = " "; + if (defined $hunks->[$i]{USE}) { + $status = $hunks->[$i]{USE} ? "+" : "-"; + } + printf "%s%2d: %s", + $status, + $i + 1, + summarize_hunk($hunks->[$i]); + } + return $i; +} + sub patch_update_file { my ($ix, $num); my $path = shift; @@ -904,6 +946,9 @@ sub patch_update_file { if ($ix < $num - 1) { $other .= '/J'; } + if ($num > 1) { + $other .= '/g'; + } for ($i = 0; $i < $num; $i++) { if (!defined $hunk[$i]{USE}) { $undecided = 1; @@ -937,6 +982,28 @@ sub patch_update_file { } next; } + elsif ($other =~ /g/ && $line =~ /^g(.*)/) { + my $response = $1; + my $no = $ix > 10 ? $ix - 10 : 0; + while ($response eq '') { + my $extra = ""; + $no = display_hunks(\@hunk, $no); + if ($no < $num) { + $extra = " (<ret> to see more)"; + } + print "go to which hunk$extra? "; + $response = <STDIN>; + chomp $response; + } + if ($response !~ /^\s*\d+\s*$/) { + print STDERR "Invalid number: '$response'\n"; + } elsif (0 < $response && $response <= $num) { + $ix = $response - 1; + } else { + print STDERR "Sorry, only $num hunks available.\n"; + } + next; + } elsif ($line =~ /^d/i) { while ($ix < $num) { if (!defined $hunk[$ix]{USE}) { diff --git a/git-gui/GIT-VERSION-GEN b/git-gui/GIT-VERSION-GEN index 4e709ebe77..b3f937eace 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.11.GITGUI +DEF_VER=0.12.GITGUI LF=' ' diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh index 8a4b42dbd7..e018e076f8 100755 --- a/git-gui/git-gui.sh +++ b/git-gui/git-gui.sh @@ -2630,6 +2630,20 @@ proc usage {} { exit 1 } +proc normalize_relpath {path} { + set elements {} + foreach item [file split $path] { + if {$item eq {.}} continue + if {$item eq {..} && [llength $elements] > 0 + && [lindex $elements end] ne {..}} { + set elements [lrange $elements 0 end-1] + continue + } + lappend elements $item + } + return [eval file join $elements] +} + # -- Not a normal commit type invocation? Do that instead! # switch -- $subcommand { @@ -2648,7 +2662,7 @@ blame { foreach a $argv { if {$is_path || [file exists $_prefix$a]} { if {$path ne {}} usage - set path $_prefix$a + set path [normalize_relpath $_prefix$a] break } elseif {$a eq {--}} { if {$path ne {}} { @@ -2671,7 +2685,7 @@ blame { unset is_path if {$head ne {} && $path eq {}} { - set path $_prefix$head + set path [normalize_relpath $_prefix$head] set head {} } @@ -3315,7 +3329,6 @@ by %s: {^GIT_PAGER$} - {^GIT_TRACE$} - {^GIT_CONFIG$} - - {^GIT_CONFIG_LOCAL$} - {^GIT_(AUTHOR|COMMITTER)_DATE$} { append msg " - $name\n" incr ignored_env diff --git a/git-gui/lib/blame.tcl b/git-gui/lib/blame.tcl index c1cd7f3b92..1f3b08f9ef 100644 --- a/git-gui/lib/blame.tcl +++ b/git-gui/lib/blame.tcl @@ -940,9 +940,8 @@ method _showcommit {cur_w lno} { catch { set fd [git_read cat-file commit $cmit] fconfigure $fd -encoding binary -translation lf - if {[catch {set enc $repo_config(i18n.commitencoding)}]} { - set enc utf-8 - } + # By default commits are assumed to be in utf-8 + set enc utf-8 while {[gets $fd line] > 0} { if {[string match {encoding *} $line]} { set enc [string tolower [string range $line 9 end]] diff --git a/git-gui/lib/commit.tcl b/git-gui/lib/commit.tcl index 334514996a..9cc8410595 100644 --- a/git-gui/lib/commit.tcl +++ b/git-gui/lib/commit.tcl @@ -27,9 +27,8 @@ You are currently in the middle of a merge that has not been fully completed. Y if {[catch { set fd [git_read cat-file commit $curHEAD] fconfigure $fd -encoding binary -translation lf - if {[catch {set enc $repo_config(i18n.commitencoding)}]} { - set enc utf-8 - } + # By default commits are assumed to be in utf-8 + set enc utf-8 while {[gets $fd line] > 0} { if {[string match {parent *} $line]} { lappend parents [string range $line 7 end] @@ -208,7 +207,7 @@ A good commit message has the following format: if {$use_enc ne {}} { fconfigure $msg_wt -encoding $use_enc } else { - puts stderr [mc "warning: Tcl does not support encoding '%s'." $enc] + error_popup [mc "warning: Tcl does not support encoding '%s'." $enc] fconfigure $msg_wt -encoding utf-8 } puts $msg_wt $msg diff --git a/git-gui/po/de.po b/git-gui/po/de.po index 5c04812b1a..a6f730b4eb 100644 --- a/git-gui/po/de.po +++ b/git-gui/po/de.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: git-gui\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-10-25 13:32+0200\n" -"PO-Revision-Date: 2008-10-25 22:47+0200\n" +"POT-Creation-Date: 2008-12-06 20:51+0100\n" +"PO-Revision-Date: 2008-12-06 21:22+0100\n" "Last-Translator: Christian Stimming <stimming@tuhh.de>\n" "Language-Team: German\n" "MIME-Version: 1.0\n" @@ -86,17 +86,15 @@ msgstr "Dateistatus aktualisieren..." msgid "Scanning for modified files ..." msgstr "Nach geänderten Dateien suchen..." -#: git-gui.sh:1325 -#, fuzzy +#: git-gui.sh:1367 msgid "Calling prepare-commit-msg hook..." -msgstr "Aufrufen der Vor-Eintragen-Kontrolle..." +msgstr "Aufrufen der Eintragen-Vorbereiten-Kontrolle..." -#: git-gui.sh:1342 -#, fuzzy +#: git-gui.sh:1384 msgid "Commit declined by prepare-commit-msg hook." -msgstr "Eintragen abgelehnt durch Vor-Eintragen-Kontrolle (»pre-commit hook«)." +msgstr "Eintragen abgelehnt durch Eintragen-Vorbereiten-Kontrolle (»prepare-commit hook«)." -#: git-gui.sh:1502 lib/browser.tcl:246 +#: git-gui.sh:1542 lib/browser.tcl:246 msgid "Ready." msgstr "Bereit." @@ -180,7 +178,11 @@ msgstr "Zusammenführen" msgid "Remote" msgstr "Andere Archive" -#: git-gui.sh:2242 +#: git-gui.sh:2293 +msgid "Tools" +msgstr "Werkzeuge" + +#: git-gui.sh:2302 msgid "Explore Working Copy" msgstr "Arbeitskopie im Dateimanager" @@ -363,7 +365,11 @@ msgstr "Einstellungen..." msgid "Options..." msgstr "Optionen..." -#: git-gui.sh:2113 lib/choose_repository.tcl:47 +#: git-gui.sh:2576 +msgid "Remove..." +msgstr "Entfernen..." + +#: git-gui.sh:2585 lib/choose_repository.tcl:50 msgid "Help" msgstr "Hilfe" @@ -371,7 +377,11 @@ msgstr "Hilfe" msgid "Online Documentation" msgstr "Online-Dokumentation" -#: git-gui.sh:2238 +#: git-gui.sh:2614 lib/choose_repository.tcl:47 lib/choose_repository.tcl:56 +msgid "Show SSH Key" +msgstr "SSH-Schlüssel anzeigen" + +#: git-gui.sh:2707 #, tcl-format msgid "fatal: cannot stat path %s: No such file or directory" msgstr "" @@ -548,7 +558,11 @@ msgstr "Version:" msgid "Copy Commit" msgstr "Version kopieren" -#: lib/blame.tcl:260 +#: lib/blame.tcl:275 +msgid "Find Text..." +msgstr "Text suchen..." + +#: lib/blame.tcl:284 msgid "Do Full Copy Detection" msgstr "Volle Kopie-Erkennung" @@ -609,12 +623,11 @@ msgstr "Eintragender:" msgid "Original File:" msgstr "Ursprüngliche Datei:" -#: lib/blame.tcl:1013 -#, fuzzy +#: lib/blame.tcl:1021 msgid "Cannot find HEAD commit:" -msgstr "Elternversion kann nicht gefunden werden:" +msgstr "Zweigspitze (»HEAD«) kann nicht gefunden werden:" -#: lib/blame.tcl:1068 +#: lib/blame.tcl:1076 msgid "Cannot find parent commit:" msgstr "Elternversion kann nicht gefunden werden:" @@ -1049,7 +1062,7 @@ msgstr "Zuletzt benutztes Projektarchiv öffnen:" msgid "Failed to create repository %s:" msgstr "Projektarchiv »%s« konnte nicht erstellt werden:" -#: lib/choose_repository.tcl:381 lib/choose_repository.tcl:478 +#: lib/choose_repository.tcl:387 msgid "Directory:" msgstr "Verzeichnis:" @@ -1058,12 +1071,12 @@ msgstr "Verzeichnis:" msgid "Git Repository" msgstr "Git Projektarchiv" -#: lib/choose_repository.tcl:437 +#: lib/choose_repository.tcl:442 #, tcl-format msgid "Directory %s already exists." msgstr "Verzeichnis »%s« existiert bereits." -#: lib/choose_repository.tcl:441 +#: lib/choose_repository.tcl:446 #, tcl-format msgid "File %s already exists." msgstr "Datei »%s« existiert bereits." @@ -1072,11 +1085,11 @@ msgstr "Datei »%s« existiert bereits." msgid "Clone" msgstr "Klonen" -#: lib/choose_repository.tcl:467 +#: lib/choose_repository.tcl:473 msgid "Source Location:" -msgstr "" +msgstr "Herkunft:" -#: lib/choose_repository.tcl:478 +#: lib/choose_repository.tcl:484 msgid "Target Directory:" msgstr "Zielverzeichnis:" @@ -1565,20 +1578,24 @@ msgid "" "LOCAL: deleted\n" "REMOTE:\n" msgstr "" +"LOKAL: gelöscht\n" +"ANDERES:\n" #: lib/diff.tcl:125 msgid "" "REMOTE: deleted\n" "LOCAL:\n" msgstr "" +"ANDERES: gelöscht\n" +"LOKAL:\n" #: lib/diff.tcl:132 msgid "LOCAL:\n" -msgstr "" +msgstr "LOKAL:\n" #: lib/diff.tcl:135 msgid "REMOTE:\n" -msgstr "" +msgstr "ANDERES:\n" #: lib/diff.tcl:197 lib/diff.tcl:296 #, tcl-format @@ -1603,6 +1620,8 @@ msgid "" "* Untracked file is %d bytes.\n" "* Showing only first %d bytes.\n" msgstr "" +"* Datei nicht unter Versionskontrolle, Dateigröße %d Bytes.\n" +"* Nur erste %d Bytes werden angezeigt.\n" #: lib/diff.tcl:228 #, tcl-format @@ -1611,8 +1630,11 @@ msgid "" "* Untracked file clipped here by %s.\n" "* To see the entire file, use an external editor.\n" msgstr "" +"\n" +"* Datei nicht unter Versionskontrolle, hier abgeschnitten durch %s.\n" +"* Zum Ansehen der vollständigen Datei externen Editor benutzen.\n" -#: lib/diff.tcl:437 +#: lib/diff.tcl:436 msgid "Failed to unstage selected hunk." msgstr "" "Fehler beim Herausnehmen des gewählten Kontexts aus der Bereitstellung." @@ -2045,7 +2067,7 @@ msgstr "Namensvorschlag für neue Zweige" #: lib/option.tcl:155 msgid "Default File Contents Encoding" -msgstr "Vorgestellte Zeichenkodierung" +msgstr "Voreingestellte Zeichenkodierung" #: lib/option.tcl:203 msgid "Change" @@ -2113,19 +2135,18 @@ msgid "Do Nothing Else Now" msgstr "Nichts tun" #: lib/remote_add.tcl:101 -#, fuzzy msgid "Please supply a remote name." -msgstr "Bitte geben Sie einen Zweignamen an." +msgstr "Bitte geben Sie einen Namen des anderen Archivs an." #: lib/remote_add.tcl:114 -#, fuzzy, tcl-format +#, tcl-format msgid "'%s' is not an acceptable remote name." -msgstr "»%s« ist kein zulässiger Zweigname." +msgstr "»%s« ist kein zulässiger Name eines anderen Archivs." #: lib/remote_add.tcl:125 -#, fuzzy, tcl-format +#, tcl-format msgid "Failed to add remote '%s' of location '%s'." -msgstr "Fehler beim Umbenennen von »%s«." +msgstr "Fehler beim Hinzufügen des anderen Archivs »%s« aus Herkunftsort »%s«." #: lib/remote_add.tcl:133 lib/transport.tcl:6 #, tcl-format @@ -2133,16 +2154,18 @@ msgid "fetch %s" msgstr "»%s« anfordern" #: lib/remote_add.tcl:134 -#, fuzzy, tcl-format +#, tcl-format msgid "Fetching the %s" -msgstr "Änderungen »%s« von »%s« anfordern" +msgstr "»%s« anfordern" #: lib/remote_add.tcl:157 #, tcl-format msgid "Do not know how to initialize repository at location '%s'." -msgstr "Initialisieren eines anderen Archivs an Adresse »%s« ist nicht möglich." +msgstr "" +"Initialisieren eines anderen Archivs an Adresse »%s« ist nicht möglich." -#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:71 +#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63 +#: lib/transport.tcl:81 #, tcl-format msgid "push %s" msgstr "»%s« versenden..." @@ -2266,9 +2289,9 @@ msgstr "Nächster" msgid "Prev" msgstr "Voriger" -#: lib/search.tcl:24 +#: lib/search.tcl:25 msgid "Case-Sensitive" -msgstr "" +msgstr "Groß-/Kleinschreibung unterscheiden" #: lib/shortcut.tcl:20 lib/shortcut.tcl:61 msgid "Cannot write shortcut:" @@ -2315,11 +2338,182 @@ msgstr "Unerwartetes EOF vom Rechtschreibprüfungsprogramm" msgid "Spell Checker Failed" msgstr "Rechtschreibprüfung fehlgeschlagen" +#: lib/sshkey.tcl:31 +msgid "No keys found." +msgstr "Keine Schlüssel gefunden." + +#: lib/sshkey.tcl:34 +#, tcl-format +msgid "Found a public key in: %s" +msgstr "Öffentlicher Schlüssel gefunden in: %s" + +#: lib/sshkey.tcl:40 +msgid "Generate Key" +msgstr "Schlüssel erzeugen" + +#: lib/sshkey.tcl:56 +msgid "Copy To Clipboard" +msgstr "In Zwischenablage kopieren" + +#: lib/sshkey.tcl:70 +msgid "Your OpenSSH Public Key" +msgstr "Ihr OpenSSH öffenlicher Schlüssel" + +#: lib/sshkey.tcl:78 +msgid "Generating..." +msgstr "Erzeugen..." + +#: lib/sshkey.tcl:84 +#, tcl-format +msgid "" +"Could not start ssh-keygen:\n" +"\n" +"%s" +msgstr "" +"Konnte »ssh-keygen« nicht starten:\n" +"\n" +"%s" + +#: lib/sshkey.tcl:111 +msgid "Generation failed." +msgstr "Schlüsselerzeugung fehlgeschlagen." + +#: lib/sshkey.tcl:118 +msgid "Generation succeded, but no keys found." +msgstr "Schlüsselerzeugung erfolgreich, aber keine Schlüssel gefunden." + +#: lib/sshkey.tcl:121 +#, tcl-format +msgid "Your key is in: %s" +msgstr "Ihr Schlüssel ist abgelegt in: %s" + #: lib/status_bar.tcl:83 #, tcl-format msgid "%s ... %*i of %*i %s (%3i%%)" msgstr "%s ... %*i von %*i %s (%3i%%)" +#: lib/tools_dlg.tcl:22 +msgid "Add Tool" +msgstr "Werkzeug hinzufügen" + +#: lib/tools_dlg.tcl:28 +msgid "Add New Tool Command" +msgstr "Neues Kommando für Werkzeug hinzufügen" + +#: lib/tools_dlg.tcl:33 +msgid "Add globally" +msgstr "Global hinzufügen" + +#: lib/tools_dlg.tcl:45 +msgid "Tool Details" +msgstr "Einzelheiten des Werkzeugs" + +#: lib/tools_dlg.tcl:48 +msgid "Use '/' separators to create a submenu tree:" +msgstr "Benutzen Sie einen Schrägstrich »/«, um Untermenüs zu erstellen:" + +#: lib/tools_dlg.tcl:61 +msgid "Command:" +msgstr "Kommando:" + +#: lib/tools_dlg.tcl:74 +msgid "Show a dialog before running" +msgstr "Bestätigungsfrage vor Starten anzeigen" + +#: lib/tools_dlg.tcl:80 +msgid "Ask the user to select a revision (sets $REVISION)" +msgstr "Benutzer nach Version fragen (setzt $REVISION)" + +#: lib/tools_dlg.tcl:85 +msgid "Ask the user for additional arguments (sets $ARGS)" +msgstr "Benutzer nach zusätzlichen Argumenten fragen (setzt $ARGS)" + +#: lib/tools_dlg.tcl:92 +msgid "Don't show the command output window" +msgstr "Kein Ausgabefenster zeigen" + +#: lib/tools_dlg.tcl:97 +msgid "Run only if a diff is selected ($FILENAME not empty)" +msgstr "Nur starten, wenn ein Vergleich gewählt ist ($FILENAME ist nicht leer)" + +#: lib/tools_dlg.tcl:121 +msgid "Please supply a name for the tool." +msgstr "Bitte geben Sie einen Werkzeugnamen an." + +#: lib/tools_dlg.tcl:129 +#, tcl-format +msgid "Tool '%s' already exists." +msgstr "Werkzeug »%s« existiert bereits." + +#: lib/tools_dlg.tcl:151 +#, tcl-format +msgid "" +"Could not add tool:\n" +"%s" +msgstr "" +"Werkzeug konnte nicht hinzugefügt werden:\n" +"\n" +"%s" + +#: lib/tools_dlg.tcl:190 +msgid "Remove Tool" +msgstr "Werkzeug entfernen" + +#: lib/tools_dlg.tcl:196 +msgid "Remove Tool Commands" +msgstr "Werkzeugkommandos entfernen" + +#: lib/tools_dlg.tcl:200 +msgid "Remove" +msgstr "Entfernen" + +#: lib/tools_dlg.tcl:236 +msgid "(Blue denotes repository-local tools)" +msgstr "(Werkzeuge für lokales Archiv werden in Blau angezeigt)" + +#: lib/tools_dlg.tcl:297 +#, tcl-format +msgid "Run Command: %s" +msgstr "Kommando aufrufen: %s" + +#: lib/tools_dlg.tcl:311 +msgid "Arguments" +msgstr "Argumente" + +#: lib/tools_dlg.tcl:348 +msgid "OK" +msgstr "Ok" + +#: lib/tools.tcl:75 +#, tcl-format +msgid "Running %s requires a selected file." +msgstr "Um »%s« zu starten, muss eine Datei ausgewählt sein." + +#: lib/tools.tcl:90 +#, tcl-format +msgid "Are you sure you want to run %s?" +msgstr "Wollen Sie %s wirklich starten?" + +#: lib/tools.tcl:110 +#, tcl-format +msgid "Tool: %s" +msgstr "Werkzeug: %s" + +#: lib/tools.tcl:111 +#, tcl-format +msgid "Running: %s" +msgstr "Starten: %s" + +#: lib/tools.tcl:149 +#, tcl-format +msgid "Tool completed succesfully: %s" +msgstr "Werkzeug erfolgreich abgeschlossen: %s" + +#: lib/tools.tcl:151 +#, tcl-format +msgid "Tool failed: %s" +msgstr "Werkzeug fehlgeschlagen: %s" + #: lib/transport.tcl:7 #, tcl-format msgid "Fetching new changes from %s" @@ -2340,7 +2534,12 @@ msgstr "Übernahmezweige aufräumen und entfernen, die in »%s« gelöscht wurde msgid "Pushing changes to %s" msgstr "Änderungen nach »%s« versenden" -#: lib/transport.tcl:72 +#: lib/transport.tcl:64 +#, tcl-format +msgid "Mirroring to %s" +msgstr "Spiegeln nach %s" + +#: lib/transport.tcl:82 #, tcl-format msgid "Pushing %s %s to %s" msgstr "%s %s nach %s versenden" diff --git a/git-gui/po/git-gui.pot b/git-gui/po/git-gui.pot index 58db67c217..15aea0dc64 100644 --- a/git-gui/po/git-gui.pot +++ b/git-gui/po/git-gui.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-11-16 13:56-0800\n" +"POT-Creation-Date: 2008-12-08 08:31-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -234,25 +234,25 @@ msgstr "" msgid "Redo" msgstr "" -#: git-gui.sh:2378 git-gui.sh:2923 +#: git-gui.sh:2378 git-gui.sh:2937 msgid "Cut" msgstr "" -#: git-gui.sh:2381 git-gui.sh:2926 git-gui.sh:3000 git-gui.sh:3082 +#: git-gui.sh:2381 git-gui.sh:2940 git-gui.sh:3014 git-gui.sh:3096 #: lib/console.tcl:69 msgid "Copy" msgstr "" -#: git-gui.sh:2384 git-gui.sh:2929 +#: git-gui.sh:2384 git-gui.sh:2943 msgid "Paste" msgstr "" -#: git-gui.sh:2387 git-gui.sh:2932 lib/branch_delete.tcl:26 +#: git-gui.sh:2387 git-gui.sh:2946 lib/branch_delete.tcl:26 #: lib/remote_branch_delete.tcl:38 msgid "Delete" msgstr "" -#: git-gui.sh:2391 git-gui.sh:2936 git-gui.sh:3086 lib/console.tcl:71 +#: git-gui.sh:2391 git-gui.sh:2950 git-gui.sh:3100 lib/console.tcl:71 msgid "Select All" msgstr "" @@ -284,15 +284,15 @@ msgstr "" msgid "Commit@@verb" msgstr "" -#: git-gui.sh:2443 git-gui.sh:2864 +#: git-gui.sh:2443 git-gui.sh:2878 msgid "New Commit" msgstr "" -#: git-gui.sh:2451 git-gui.sh:2871 +#: git-gui.sh:2451 git-gui.sh:2885 msgid "Amend Last Commit" msgstr "" -#: git-gui.sh:2461 git-gui.sh:2825 lib/remote_branch_delete.tcl:99 +#: git-gui.sh:2461 git-gui.sh:2839 lib/remote_branch_delete.tcl:99 msgid "Rescan" msgstr "" @@ -312,15 +312,15 @@ msgstr "" msgid "Revert Changes" msgstr "" -#: git-gui.sh:2491 git-gui.sh:3069 +#: git-gui.sh:2491 git-gui.sh:3083 msgid "Show Less Context" msgstr "" -#: git-gui.sh:2495 git-gui.sh:3073 +#: git-gui.sh:2495 git-gui.sh:3087 msgid "Show More Context" msgstr "" -#: git-gui.sh:2502 git-gui.sh:2838 git-gui.sh:2947 +#: git-gui.sh:2502 git-gui.sh:2852 git-gui.sh:2961 msgid "Sign Off" msgstr "" @@ -354,7 +354,7 @@ msgstr "" msgid "Preferences..." msgstr "" -#: git-gui.sh:2565 git-gui.sh:3115 +#: git-gui.sh:2565 git-gui.sh:3129 msgid "Options..." msgstr "" @@ -374,124 +374,124 @@ msgstr "" msgid "Show SSH Key" msgstr "" -#: git-gui.sh:2707 +#: git-gui.sh:2721 #, tcl-format msgid "fatal: cannot stat path %s: No such file or directory" msgstr "" -#: git-gui.sh:2740 +#: git-gui.sh:2754 msgid "Current Branch:" msgstr "" -#: git-gui.sh:2761 +#: git-gui.sh:2775 msgid "Staged Changes (Will Commit)" msgstr "" -#: git-gui.sh:2781 +#: git-gui.sh:2795 msgid "Unstaged Changes" msgstr "" -#: git-gui.sh:2831 +#: git-gui.sh:2845 msgid "Stage Changed" msgstr "" -#: git-gui.sh:2850 lib/transport.tcl:93 lib/transport.tcl:182 +#: git-gui.sh:2864 lib/transport.tcl:104 lib/transport.tcl:193 msgid "Push" msgstr "" -#: git-gui.sh:2885 +#: git-gui.sh:2899 msgid "Initial Commit Message:" msgstr "" -#: git-gui.sh:2886 +#: git-gui.sh:2900 msgid "Amended Commit Message:" msgstr "" -#: git-gui.sh:2887 +#: git-gui.sh:2901 msgid "Amended Initial Commit Message:" msgstr "" -#: git-gui.sh:2888 +#: git-gui.sh:2902 msgid "Amended Merge Commit Message:" msgstr "" -#: git-gui.sh:2889 +#: git-gui.sh:2903 msgid "Merge Commit Message:" msgstr "" -#: git-gui.sh:2890 +#: git-gui.sh:2904 msgid "Commit Message:" msgstr "" -#: git-gui.sh:2939 git-gui.sh:3090 lib/console.tcl:73 +#: git-gui.sh:2953 git-gui.sh:3104 lib/console.tcl:73 msgid "Copy All" msgstr "" -#: git-gui.sh:2963 lib/blame.tcl:104 +#: git-gui.sh:2977 lib/blame.tcl:104 msgid "File:" msgstr "" -#: git-gui.sh:3078 +#: git-gui.sh:3092 msgid "Refresh" msgstr "" -#: git-gui.sh:3099 +#: git-gui.sh:3113 msgid "Decrease Font Size" msgstr "" -#: git-gui.sh:3103 +#: git-gui.sh:3117 msgid "Increase Font Size" msgstr "" -#: git-gui.sh:3111 lib/blame.tcl:281 +#: git-gui.sh:3125 lib/blame.tcl:281 msgid "Encoding" msgstr "" -#: git-gui.sh:3122 +#: git-gui.sh:3136 msgid "Apply/Reverse Hunk" msgstr "" -#: git-gui.sh:3127 +#: git-gui.sh:3141 msgid "Apply/Reverse Line" msgstr "" -#: git-gui.sh:3137 +#: git-gui.sh:3151 msgid "Run Merge Tool" msgstr "" -#: git-gui.sh:3142 +#: git-gui.sh:3156 msgid "Use Remote Version" msgstr "" -#: git-gui.sh:3146 +#: git-gui.sh:3160 msgid "Use Local Version" msgstr "" -#: git-gui.sh:3150 +#: git-gui.sh:3164 msgid "Revert To Base" msgstr "" -#: git-gui.sh:3169 +#: git-gui.sh:3183 msgid "Unstage Hunk From Commit" msgstr "" -#: git-gui.sh:3170 +#: git-gui.sh:3184 msgid "Unstage Line From Commit" msgstr "" -#: git-gui.sh:3172 +#: git-gui.sh:3186 msgid "Stage Hunk For Commit" msgstr "" -#: git-gui.sh:3173 +#: git-gui.sh:3187 msgid "Stage Line For Commit" msgstr "" -#: git-gui.sh:3196 +#: git-gui.sh:3210 msgid "Initializing..." msgstr "" -#: git-gui.sh:3301 +#: git-gui.sh:3315 #, tcl-format msgid "" "Possible environment issues exist.\n" @@ -502,14 +502,14 @@ msgid "" "\n" msgstr "" -#: git-gui.sh:3331 +#: git-gui.sh:3345 msgid "" "\n" "This is due to a known issue with the\n" "Tcl binary distributed by Cygwin." msgstr "" -#: git-gui.sh:3336 +#: git-gui.sh:3350 #, tcl-format msgid "" "\n" @@ -589,43 +589,43 @@ msgstr "" msgid "Loading annotation..." msgstr "" -#: lib/blame.tcl:964 +#: lib/blame.tcl:963 msgid "Author:" msgstr "" -#: lib/blame.tcl:968 +#: lib/blame.tcl:967 msgid "Committer:" msgstr "" -#: lib/blame.tcl:973 +#: lib/blame.tcl:972 msgid "Original File:" msgstr "" -#: lib/blame.tcl:1021 +#: lib/blame.tcl:1020 msgid "Cannot find HEAD commit:" msgstr "" -#: lib/blame.tcl:1076 +#: lib/blame.tcl:1075 msgid "Cannot find parent commit:" msgstr "" -#: lib/blame.tcl:1091 +#: lib/blame.tcl:1090 msgid "Unable to display parent" msgstr "" -#: lib/blame.tcl:1092 lib/diff.tcl:297 +#: lib/blame.tcl:1091 lib/diff.tcl:297 msgid "Error loading diff:" msgstr "" -#: lib/blame.tcl:1232 +#: lib/blame.tcl:1231 msgid "Originally By:" msgstr "" -#: lib/blame.tcl:1238 +#: lib/blame.tcl:1237 msgid "In File:" msgstr "" -#: lib/blame.tcl:1243 +#: lib/blame.tcl:1242 msgid "Copied Or Moved Here By:" msgstr "" @@ -642,7 +642,7 @@ msgstr "" #: lib/checkout_op.tcl:544 lib/choose_font.tcl:43 lib/merge.tcl:172 #: lib/option.tcl:125 lib/remote_add.tcl:32 lib/remote_branch_delete.tcl:42 #: lib/tools_dlg.tcl:40 lib/tools_dlg.tcl:204 lib/tools_dlg.tcl:352 -#: lib/transport.tcl:97 +#: lib/transport.tcl:108 msgid "Cancel" msgstr "" @@ -1254,19 +1254,19 @@ msgid "" "current merge activity.\n" msgstr "" -#: lib/commit.tcl:49 +#: lib/commit.tcl:48 msgid "Error loading commit data for amend:" msgstr "" -#: lib/commit.tcl:76 +#: lib/commit.tcl:75 msgid "Unable to obtain your identity:" msgstr "" -#: lib/commit.tcl:81 +#: lib/commit.tcl:80 msgid "Invalid GIT_COMMITTER_IDENT:" msgstr "" -#: lib/commit.tcl:133 +#: lib/commit.tcl:132 msgid "" "Last scanned state does not match repository state.\n" "\n" @@ -1276,7 +1276,7 @@ msgid "" "The rescan will be automatically started now.\n" msgstr "" -#: lib/commit.tcl:156 +#: lib/commit.tcl:155 #, tcl-format msgid "" "Unmerged files cannot be committed.\n" @@ -1285,7 +1285,7 @@ msgid "" "before committing.\n" msgstr "" -#: lib/commit.tcl:164 +#: lib/commit.tcl:163 #, tcl-format msgid "" "Unknown file state %s detected.\n" @@ -1293,14 +1293,14 @@ msgid "" "File %s cannot be committed by this program.\n" msgstr "" -#: lib/commit.tcl:172 +#: lib/commit.tcl:171 msgid "" "No changes to commit.\n" "\n" "You must stage at least 1 file before you can commit.\n" msgstr "" -#: lib/commit.tcl:187 +#: lib/commit.tcl:186 msgid "" "Please supply a commit message.\n" "\n" @@ -1311,45 +1311,45 @@ msgid "" "- Remaining lines: Describe why this change is good.\n" msgstr "" -#: lib/commit.tcl:211 +#: lib/commit.tcl:210 #, tcl-format msgid "warning: Tcl does not support encoding '%s'." msgstr "" -#: lib/commit.tcl:227 +#: lib/commit.tcl:226 msgid "Calling pre-commit hook..." msgstr "" -#: lib/commit.tcl:242 +#: lib/commit.tcl:241 msgid "Commit declined by pre-commit hook." msgstr "" -#: lib/commit.tcl:265 +#: lib/commit.tcl:264 msgid "Calling commit-msg hook..." msgstr "" -#: lib/commit.tcl:280 +#: lib/commit.tcl:279 msgid "Commit declined by commit-msg hook." msgstr "" -#: lib/commit.tcl:293 +#: lib/commit.tcl:292 msgid "Committing changes..." msgstr "" -#: lib/commit.tcl:309 +#: lib/commit.tcl:308 msgid "write-tree failed:" msgstr "" -#: lib/commit.tcl:310 lib/commit.tcl:354 lib/commit.tcl:374 +#: lib/commit.tcl:309 lib/commit.tcl:353 lib/commit.tcl:373 msgid "Commit failed." msgstr "" -#: lib/commit.tcl:327 +#: lib/commit.tcl:326 #, tcl-format msgid "Commit %s appears to be corrupt" msgstr "" -#: lib/commit.tcl:332 +#: lib/commit.tcl:331 msgid "" "No changes to commit.\n" "\n" @@ -1358,19 +1358,19 @@ msgid "" "A rescan will be automatically started now.\n" msgstr "" -#: lib/commit.tcl:339 +#: lib/commit.tcl:338 msgid "No changes to commit." msgstr "" -#: lib/commit.tcl:353 +#: lib/commit.tcl:352 msgid "commit-tree failed:" msgstr "" -#: lib/commit.tcl:373 +#: lib/commit.tcl:372 msgid "update-ref failed:" msgstr "" -#: lib/commit.tcl:461 +#: lib/commit.tcl:460 #, tcl-format msgid "Created commit %s: %s" msgstr "" @@ -1999,7 +1999,8 @@ msgstr "" msgid "Do not know how to initialize repository at location '%s'." msgstr "" -#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:71 +#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63 +#: lib/transport.tcl:81 #, tcl-format msgid "push %s" msgstr "" @@ -2017,11 +2018,11 @@ msgstr "" msgid "From Repository" msgstr "" -#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:123 +#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:134 msgid "Remote:" msgstr "" -#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:138 +#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:149 msgid "Arbitrary Location:" msgstr "" @@ -2336,35 +2337,40 @@ msgstr "" msgid "Pushing changes to %s" msgstr "" -#: lib/transport.tcl:72 +#: lib/transport.tcl:64 +#, tcl-format +msgid "Mirroring to %s" +msgstr "" + +#: lib/transport.tcl:82 #, tcl-format msgid "Pushing %s %s to %s" msgstr "" -#: lib/transport.tcl:89 +#: lib/transport.tcl:100 msgid "Push Branches" msgstr "" -#: lib/transport.tcl:103 +#: lib/transport.tcl:114 msgid "Source Branches" msgstr "" -#: lib/transport.tcl:120 +#: lib/transport.tcl:131 msgid "Destination Repository" msgstr "" -#: lib/transport.tcl:158 +#: lib/transport.tcl:169 msgid "Transfer Options" msgstr "" -#: lib/transport.tcl:160 +#: lib/transport.tcl:171 msgid "Force overwrite existing branch (may discard changes)" msgstr "" -#: lib/transport.tcl:164 +#: lib/transport.tcl:175 msgid "Use thin pack (for slow network connections)" msgstr "" -#: lib/transport.tcl:168 +#: lib/transport.tcl:179 msgid "Include tags" msgstr "" diff --git a/git-gui/po/hu.po b/git-gui/po/hu.po index 8ec43392d4..f761b64152 100644 --- a/git-gui/po/hu.po +++ b/git-gui/po/hu.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: git-gui-i 18n\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-11-16 13:56-0800\n" -"PO-Revision-Date: 2008-11-17 23:03+0100\n" +"POT-Creation-Date: 2008-12-08 08:31-0800\n" +"PO-Revision-Date: 2008-12-10 15:00+0100\n" "Last-Translator: Miklos Vajna <vmiklos@frugalware.org>\n" "Language-Team: Hungarian\n" "MIME-Version: 1.0\n" @@ -241,25 +241,25 @@ msgstr "Visszavonás" msgid "Redo" msgstr "Mégis" -#: git-gui.sh:2378 git-gui.sh:2923 +#: git-gui.sh:2378 git-gui.sh:2937 msgid "Cut" msgstr "Kivágás" -#: git-gui.sh:2381 git-gui.sh:2926 git-gui.sh:3000 git-gui.sh:3082 +#: git-gui.sh:2381 git-gui.sh:2940 git-gui.sh:3014 git-gui.sh:3096 #: lib/console.tcl:69 msgid "Copy" msgstr "Másolás" -#: git-gui.sh:2384 git-gui.sh:2929 +#: git-gui.sh:2384 git-gui.sh:2943 msgid "Paste" msgstr "Beillesztés" -#: git-gui.sh:2387 git-gui.sh:2932 lib/branch_delete.tcl:26 +#: git-gui.sh:2387 git-gui.sh:2946 lib/branch_delete.tcl:26 #: lib/remote_branch_delete.tcl:38 msgid "Delete" msgstr "Törlés" -#: git-gui.sh:2391 git-gui.sh:2936 git-gui.sh:3086 lib/console.tcl:71 +#: git-gui.sh:2391 git-gui.sh:2950 git-gui.sh:3100 lib/console.tcl:71 msgid "Select All" msgstr "Mindent kiválaszt" @@ -291,15 +291,15 @@ msgstr "Kész" msgid "Commit@@verb" msgstr "Commit@@ige" -#: git-gui.sh:2443 git-gui.sh:2864 +#: git-gui.sh:2443 git-gui.sh:2878 msgid "New Commit" msgstr "Új commit" -#: git-gui.sh:2451 git-gui.sh:2871 +#: git-gui.sh:2451 git-gui.sh:2885 msgid "Amend Last Commit" msgstr "Utolsó commit javítása" -#: git-gui.sh:2461 git-gui.sh:2825 lib/remote_branch_delete.tcl:99 +#: git-gui.sh:2461 git-gui.sh:2839 lib/remote_branch_delete.tcl:99 msgid "Rescan" msgstr "Keresés újra" @@ -319,15 +319,15 @@ msgstr "Commitba való kiválasztás visszavonása" msgid "Revert Changes" msgstr "Változtatások visszaállítása" -#: git-gui.sh:2491 git-gui.sh:3069 +#: git-gui.sh:2491 git-gui.sh:3083 msgid "Show Less Context" msgstr "Kevesebb környezet mutatása" -#: git-gui.sh:2495 git-gui.sh:3073 +#: git-gui.sh:2495 git-gui.sh:3087 msgid "Show More Context" msgstr "Több környezet mutatása" -#: git-gui.sh:2502 git-gui.sh:2838 git-gui.sh:2947 +#: git-gui.sh:2502 git-gui.sh:2852 git-gui.sh:2961 msgid "Sign Off" msgstr "Aláír" @@ -361,7 +361,7 @@ msgstr "Névjegy: %s" msgid "Preferences..." msgstr "Beállítások..." -#: git-gui.sh:2565 git-gui.sh:3115 +#: git-gui.sh:2565 git-gui.sh:3129 msgid "Options..." msgstr "Opciók..." @@ -381,125 +381,125 @@ msgstr "Online dokumentáció" msgid "Show SSH Key" msgstr "SSH kulcs mutatása" -#: git-gui.sh:2707 +#: git-gui.sh:2721 #, tcl-format msgid "fatal: cannot stat path %s: No such file or directory" msgstr "" "végzetes hiba: nem érhető el a(z) %s útvonal: Nincs ilyen fájl vagy könyvtár" -#: git-gui.sh:2740 +#: git-gui.sh:2754 msgid "Current Branch:" msgstr "Jelenlegi branch:" -#: git-gui.sh:2761 +#: git-gui.sh:2775 msgid "Staged Changes (Will Commit)" msgstr "Kiválasztott változtatások (commitolva lesz)" -#: git-gui.sh:2781 +#: git-gui.sh:2795 msgid "Unstaged Changes" msgstr "Kiválasztatlan változtatások" -#: git-gui.sh:2831 +#: git-gui.sh:2845 msgid "Stage Changed" msgstr "Változtatások kiválasztása" -#: git-gui.sh:2850 lib/transport.tcl:93 lib/transport.tcl:182 +#: git-gui.sh:2864 lib/transport.tcl:104 lib/transport.tcl:193 msgid "Push" msgstr "Push" -#: git-gui.sh:2885 +#: git-gui.sh:2899 msgid "Initial Commit Message:" msgstr "Kezdeti commit üzenet:" -#: git-gui.sh:2886 +#: git-gui.sh:2900 msgid "Amended Commit Message:" msgstr "Javító commit üzenet:" -#: git-gui.sh:2887 +#: git-gui.sh:2901 msgid "Amended Initial Commit Message:" msgstr "Kezdeti javító commit üzenet:" -#: git-gui.sh:2888 +#: git-gui.sh:2902 msgid "Amended Merge Commit Message:" msgstr "Javító merge commit üzenet:" -#: git-gui.sh:2889 +#: git-gui.sh:2903 msgid "Merge Commit Message:" msgstr "Merge commit üzenet:" -#: git-gui.sh:2890 +#: git-gui.sh:2904 msgid "Commit Message:" msgstr "Commit üzenet:" -#: git-gui.sh:2939 git-gui.sh:3090 lib/console.tcl:73 +#: git-gui.sh:2953 git-gui.sh:3104 lib/console.tcl:73 msgid "Copy All" msgstr "Összes másolása" -#: git-gui.sh:2963 lib/blame.tcl:104 +#: git-gui.sh:2977 lib/blame.tcl:104 msgid "File:" msgstr "Fájl:" -#: git-gui.sh:3078 +#: git-gui.sh:3092 msgid "Refresh" msgstr "Frissítés" -#: git-gui.sh:3099 +#: git-gui.sh:3113 msgid "Decrease Font Size" msgstr "Font méret csökkentése" -#: git-gui.sh:3103 +#: git-gui.sh:3117 msgid "Increase Font Size" msgstr "Fönt méret növelése" -#: git-gui.sh:3111 lib/blame.tcl:281 +#: git-gui.sh:3125 lib/blame.tcl:281 msgid "Encoding" msgstr "Kódolás" -#: git-gui.sh:3122 +#: git-gui.sh:3136 msgid "Apply/Reverse Hunk" msgstr "Hunk alkalmazása/visszaállítása" -#: git-gui.sh:3127 +#: git-gui.sh:3141 msgid "Apply/Reverse Line" msgstr "Sor alkalmazása/visszaállítása" -#: git-gui.sh:3137 +#: git-gui.sh:3151 msgid "Run Merge Tool" msgstr "Merge eszköz futtatása" -#: git-gui.sh:3142 +#: git-gui.sh:3156 msgid "Use Remote Version" msgstr "Távoli verzió használata" -#: git-gui.sh:3146 +#: git-gui.sh:3160 msgid "Use Local Version" msgstr "Helyi verzió használata" -#: git-gui.sh:3150 +#: git-gui.sh:3164 msgid "Revert To Base" msgstr "Visszaállítás az alaphoz" -#: git-gui.sh:3169 +#: git-gui.sh:3183 msgid "Unstage Hunk From Commit" msgstr "Hunk törlése commitból" -#: git-gui.sh:3170 +#: git-gui.sh:3184 msgid "Unstage Line From Commit" msgstr "A sor kiválasztásának törlése" -#: git-gui.sh:3172 +#: git-gui.sh:3186 msgid "Stage Hunk For Commit" msgstr "Hunk kiválasztása commitba" -#: git-gui.sh:3173 +#: git-gui.sh:3187 msgid "Stage Line For Commit" msgstr "Sor kiválasztása commitba" -#: git-gui.sh:3196 +#: git-gui.sh:3210 msgid "Initializing..." msgstr "Inicializálás..." -#: git-gui.sh:3301 +#: git-gui.sh:3315 #, tcl-format msgid "" "Possible environment issues exist.\n" @@ -516,7 +516,7 @@ msgstr "" "indított folyamatok által:\n" "\n" -#: git-gui.sh:3331 +#: git-gui.sh:3345 msgid "" "\n" "This is due to a known issue with the\n" @@ -526,7 +526,7 @@ msgstr "" "Ez a Cygwin által terjesztett Tcl binárisban\n" "lévő ismert hiba miatt van." -#: git-gui.sh:3336 +#: git-gui.sh:3350 #, tcl-format msgid "" "\n" @@ -612,43 +612,43 @@ msgstr "Futtatás másolás-érzékelésen keresztül..." msgid "Loading annotation..." msgstr "Az annotáció betöltése..." -#: lib/blame.tcl:964 +#: lib/blame.tcl:963 msgid "Author:" msgstr "Szerző:" -#: lib/blame.tcl:968 +#: lib/blame.tcl:967 msgid "Committer:" msgstr "Commiter:" -#: lib/blame.tcl:973 +#: lib/blame.tcl:972 msgid "Original File:" msgstr "Eredeti fájl:" -#: lib/blame.tcl:1021 +#: lib/blame.tcl:1020 msgid "Cannot find HEAD commit:" msgstr "Nem található a HEAD commit:" -#: lib/blame.tcl:1076 +#: lib/blame.tcl:1075 msgid "Cannot find parent commit:" msgstr "Nem található a szülő commit:" -#: lib/blame.tcl:1091 +#: lib/blame.tcl:1090 msgid "Unable to display parent" msgstr "Nem lehet megjeleníteni a szülőt" -#: lib/blame.tcl:1092 lib/diff.tcl:297 +#: lib/blame.tcl:1091 lib/diff.tcl:297 msgid "Error loading diff:" msgstr "Hiba a diff betöltése közben:" -#: lib/blame.tcl:1232 +#: lib/blame.tcl:1231 msgid "Originally By:" msgstr "Eredeti szerző:" -#: lib/blame.tcl:1238 +#: lib/blame.tcl:1237 msgid "In File:" msgstr "Ebben a fájlban:" -#: lib/blame.tcl:1243 +#: lib/blame.tcl:1242 msgid "Copied Or Moved Here By:" msgstr "Ide másolta vagy helyezte:" @@ -665,7 +665,7 @@ msgstr "Checkout" #: lib/checkout_op.tcl:544 lib/choose_font.tcl:43 lib/merge.tcl:172 #: lib/option.tcl:125 lib/remote_add.tcl:32 lib/remote_branch_delete.tcl:42 #: lib/tools_dlg.tcl:40 lib/tools_dlg.tcl:204 lib/tools_dlg.tcl:352 -#: lib/transport.tcl:97 +#: lib/transport.tcl:108 msgid "Cancel" msgstr "Mégsem" @@ -1317,19 +1317,19 @@ msgstr "" "A jelenlegi merge még nem teljesen fejeződött be. Csak akkor javíthat egy " "előbbi commitot, hogyha megszakítja a jelenlegi merge folyamatot.\n" -#: lib/commit.tcl:49 +#: lib/commit.tcl:48 msgid "Error loading commit data for amend:" msgstr "Hiba a javítandó commit adat betöltése közben:" -#: lib/commit.tcl:76 +#: lib/commit.tcl:75 msgid "Unable to obtain your identity:" msgstr "Nem sikerült megállapítani az azonosítót:" -#: lib/commit.tcl:81 +#: lib/commit.tcl:80 msgid "Invalid GIT_COMMITTER_IDENT:" msgstr "Érvénytelen GIT_COMMITTER_IDENT:" -#: lib/commit.tcl:133 +#: lib/commit.tcl:132 msgid "" "Last scanned state does not match repository state.\n" "\n" @@ -1346,7 +1346,7 @@ msgstr "" "\n" "Az újrakeresés most automatikusan el fog indulni.\n" -#: lib/commit.tcl:156 +#: lib/commit.tcl:155 #, tcl-format msgid "" "Unmerged files cannot be committed.\n" @@ -1359,7 +1359,7 @@ msgstr "" "A(z) %s fájlban ütközések vannak. Egyszer azokat ki kell javítani, majd " "hozzá ki kell választani a fájlt mielőtt commitolni lehetne.\n" -#: lib/commit.tcl:164 +#: lib/commit.tcl:163 #, tcl-format msgid "" "Unknown file state %s detected.\n" @@ -1370,7 +1370,7 @@ msgstr "" "\n" "A(z) %s fájlt nem tudja ez a program commitolni.\n" -#: lib/commit.tcl:172 +#: lib/commit.tcl:171 msgid "" "No changes to commit.\n" "\n" @@ -1380,7 +1380,7 @@ msgstr "" "\n" "Legalább egy fájl ki kell választani, hogy commitolni lehessen.\n" -#: lib/commit.tcl:187 +#: lib/commit.tcl:186 msgid "" "Please supply a commit message.\n" "\n" @@ -1398,45 +1398,45 @@ msgstr "" "- Második sor: Üres\n" "- A többi sor: Leírja, hogy miért jó ez a változtatás.\n" -#: lib/commit.tcl:211 +#: lib/commit.tcl:210 #, tcl-format msgid "warning: Tcl does not support encoding '%s'." msgstr "figyelmeztetés: a Tcl nem támogatja a(z) '%s' kódolást." -#: lib/commit.tcl:227 +#: lib/commit.tcl:226 msgid "Calling pre-commit hook..." msgstr "A pre-commit hurok meghívása..." -#: lib/commit.tcl:242 +#: lib/commit.tcl:241 msgid "Commit declined by pre-commit hook." msgstr "A commitot megakadályozta a pre-commit hurok. " -#: lib/commit.tcl:265 +#: lib/commit.tcl:264 msgid "Calling commit-msg hook..." msgstr "A commit-msg hurok meghívása..." -#: lib/commit.tcl:280 +#: lib/commit.tcl:279 msgid "Commit declined by commit-msg hook." msgstr "A commiot megakadályozta a commit-msg hurok." -#: lib/commit.tcl:293 +#: lib/commit.tcl:292 msgid "Committing changes..." msgstr "A változtatások commitolása..." -#: lib/commit.tcl:309 +#: lib/commit.tcl:308 msgid "write-tree failed:" msgstr "a write-tree sikertelen:" -#: lib/commit.tcl:310 lib/commit.tcl:354 lib/commit.tcl:374 +#: lib/commit.tcl:309 lib/commit.tcl:353 lib/commit.tcl:373 msgid "Commit failed." msgstr "A commit nem sikerült." -#: lib/commit.tcl:327 +#: lib/commit.tcl:326 #, tcl-format msgid "Commit %s appears to be corrupt" msgstr "A(z) %s commit sérültnek tűnik" -#: lib/commit.tcl:332 +#: lib/commit.tcl:331 msgid "" "No changes to commit.\n" "\n" @@ -1450,19 +1450,19 @@ msgstr "" "\n" "Az újrakeresés most automatikusan el fog indulni.\n" -#: lib/commit.tcl:339 +#: lib/commit.tcl:338 msgid "No changes to commit." msgstr "Nincs commitolandó változtatás." -#: lib/commit.tcl:353 +#: lib/commit.tcl:352 msgid "commit-tree failed:" msgstr "a commit-tree sikertelen:" -#: lib/commit.tcl:373 +#: lib/commit.tcl:372 msgid "update-ref failed:" msgstr "az update-ref sikertelen:" -#: lib/commit.tcl:461 +#: lib/commit.tcl:460 #, tcl-format msgid "Created commit %s: %s" msgstr "Létrejött a %s commit: %s" @@ -2168,7 +2168,8 @@ msgstr "A(z) %s letöltése" msgid "Do not know how to initialize repository at location '%s'." msgstr "Nem tudni, hogy hogy kell a(z) '%s' helyen repót inicializálni." -#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:71 +#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63 +#: lib/transport.tcl:81 #, tcl-format msgid "push %s" msgstr "%s push-olása" @@ -2186,11 +2187,11 @@ msgstr "Távoli Branch törlése" msgid "From Repository" msgstr "Forrás repó" -#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:123 +#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:134 msgid "Remote:" msgstr "Távoli:" -#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:138 +#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:149 msgid "Arbitrary Location:" msgstr "Önkényes hely:" @@ -2519,38 +2520,43 @@ msgstr "A %s repóból törölt követő branchek törlése" msgid "Pushing changes to %s" msgstr "Változások pusholása ide: %s" -#: lib/transport.tcl:72 +#: lib/transport.tcl:64 +#, tcl-format +msgid "Mirroring to %s" +msgstr "Tükrözés a következő helyre: %s" + +#: lib/transport.tcl:82 #, tcl-format msgid "Pushing %s %s to %s" msgstr "Pusholás: %s %s, ide: %s" -#: lib/transport.tcl:89 +#: lib/transport.tcl:100 msgid "Push Branches" msgstr "Branchek pusholása" -#: lib/transport.tcl:103 +#: lib/transport.tcl:114 msgid "Source Branches" msgstr "Forrás branchek" -#: lib/transport.tcl:120 +#: lib/transport.tcl:131 msgid "Destination Repository" msgstr "Cél repó" -#: lib/transport.tcl:158 +#: lib/transport.tcl:169 msgid "Transfer Options" msgstr "Átviteli opciók" -#: lib/transport.tcl:160 +#: lib/transport.tcl:171 msgid "Force overwrite existing branch (may discard changes)" msgstr "" "Létező branch felülírásának erőltetése (lehet, hogy el fog dobni " "változtatásokat)" -#: lib/transport.tcl:164 +#: lib/transport.tcl:175 msgid "Use thin pack (for slow network connections)" msgstr "Vékony csomagok használata (lassú hálózati kapcsolatok számára)" -#: lib/transport.tcl:168 +#: lib/transport.tcl:179 msgid "Include tags" msgstr "Tageket is" diff --git a/git-gui/po/it.po b/git-gui/po/it.po index 2ee30844f8..294e595887 100644 --- a/git-gui/po/it.po +++ b/git-gui/po/it.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: git-gui\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-11-16 13:56-0800\n" -"PO-Revision-Date: 2008-11-17 16:04+0100\n" +"POT-Creation-Date: 2008-12-08 08:31-0800\n" +"PO-Revision-Date: 2008-12-09 13:04+0100\n" "Last-Translator: Michele Ballabio <barra_cuda@katamail.com>\n" "Language-Team: Italian <tp@lists.linux.it>\n" "MIME-Version: 1.0\n" @@ -242,25 +242,25 @@ msgstr "Annulla" msgid "Redo" msgstr "Ripeti" -#: git-gui.sh:2378 git-gui.sh:2923 +#: git-gui.sh:2378 git-gui.sh:2937 msgid "Cut" msgstr "Taglia" -#: git-gui.sh:2381 git-gui.sh:2926 git-gui.sh:3000 git-gui.sh:3082 +#: git-gui.sh:2381 git-gui.sh:2940 git-gui.sh:3014 git-gui.sh:3096 #: lib/console.tcl:69 msgid "Copy" msgstr "Copia" -#: git-gui.sh:2384 git-gui.sh:2929 +#: git-gui.sh:2384 git-gui.sh:2943 msgid "Paste" msgstr "Incolla" -#: git-gui.sh:2387 git-gui.sh:2932 lib/branch_delete.tcl:26 +#: git-gui.sh:2387 git-gui.sh:2946 lib/branch_delete.tcl:26 #: lib/remote_branch_delete.tcl:38 msgid "Delete" msgstr "Elimina" -#: git-gui.sh:2391 git-gui.sh:2936 git-gui.sh:3086 lib/console.tcl:71 +#: git-gui.sh:2391 git-gui.sh:2950 git-gui.sh:3100 lib/console.tcl:71 msgid "Select All" msgstr "Seleziona tutto" @@ -292,15 +292,15 @@ msgstr "Fatto" msgid "Commit@@verb" msgstr "Nuova revisione" -#: git-gui.sh:2443 git-gui.sh:2864 +#: git-gui.sh:2443 git-gui.sh:2878 msgid "New Commit" msgstr "Nuova revisione" -#: git-gui.sh:2451 git-gui.sh:2871 +#: git-gui.sh:2451 git-gui.sh:2885 msgid "Amend Last Commit" msgstr "Correggi l'ultima revisione" -#: git-gui.sh:2461 git-gui.sh:2825 lib/remote_branch_delete.tcl:99 +#: git-gui.sh:2461 git-gui.sh:2839 lib/remote_branch_delete.tcl:99 msgid "Rescan" msgstr "Analizza nuovamente" @@ -320,15 +320,15 @@ msgstr "Annulla preparazione" msgid "Revert Changes" msgstr "Annulla modifiche" -#: git-gui.sh:2491 git-gui.sh:3069 +#: git-gui.sh:2491 git-gui.sh:3083 msgid "Show Less Context" msgstr "Mostra meno contesto" -#: git-gui.sh:2495 git-gui.sh:3073 +#: git-gui.sh:2495 git-gui.sh:3087 msgid "Show More Context" msgstr "Mostra più contesto" -#: git-gui.sh:2502 git-gui.sh:2838 git-gui.sh:2947 +#: git-gui.sh:2502 git-gui.sh:2852 git-gui.sh:2961 msgid "Sign Off" msgstr "Sign Off" @@ -362,7 +362,7 @@ msgstr "Informazioni su %s" msgid "Preferences..." msgstr "Preferenze..." -#: git-gui.sh:2565 git-gui.sh:3115 +#: git-gui.sh:2565 git-gui.sh:3129 msgid "Options..." msgstr "Opzioni..." @@ -382,126 +382,126 @@ msgstr "Documentazione sul web" msgid "Show SSH Key" msgstr "Mostra chave SSH" -#: git-gui.sh:2707 +#: git-gui.sh:2721 #, tcl-format msgid "fatal: cannot stat path %s: No such file or directory" msgstr "" "errore grave: impossibile effettuare lo stat del path %s: file o directory " "non trovata" -#: git-gui.sh:2740 +#: git-gui.sh:2754 msgid "Current Branch:" msgstr "Ramo attuale:" -#: git-gui.sh:2761 +#: git-gui.sh:2775 msgid "Staged Changes (Will Commit)" msgstr "Modifiche preparate (saranno nella nuova revisione)" -#: git-gui.sh:2781 +#: git-gui.sh:2795 msgid "Unstaged Changes" msgstr "Modifiche non preparate" -#: git-gui.sh:2831 +#: git-gui.sh:2845 msgid "Stage Changed" msgstr "Prepara modificati" -#: git-gui.sh:2850 lib/transport.tcl:93 lib/transport.tcl:182 +#: git-gui.sh:2864 lib/transport.tcl:104 lib/transport.tcl:193 msgid "Push" msgstr "Propaga (Push)" -#: git-gui.sh:2885 +#: git-gui.sh:2899 msgid "Initial Commit Message:" msgstr "Messaggio di revisione iniziale:" -#: git-gui.sh:2886 +#: git-gui.sh:2900 msgid "Amended Commit Message:" msgstr "Messaggio di revisione corretto:" -#: git-gui.sh:2887 +#: git-gui.sh:2901 msgid "Amended Initial Commit Message:" msgstr "Messaggio iniziale di revisione corretto:" -#: git-gui.sh:2888 +#: git-gui.sh:2902 msgid "Amended Merge Commit Message:" msgstr "Messaggio di fusione corretto:" -#: git-gui.sh:2889 +#: git-gui.sh:2903 msgid "Merge Commit Message:" msgstr "Messaggio di fusione:" -#: git-gui.sh:2890 +#: git-gui.sh:2904 msgid "Commit Message:" msgstr "Messaggio di revisione:" -#: git-gui.sh:2939 git-gui.sh:3090 lib/console.tcl:73 +#: git-gui.sh:2953 git-gui.sh:3104 lib/console.tcl:73 msgid "Copy All" msgstr "Copia tutto" -#: git-gui.sh:2963 lib/blame.tcl:104 +#: git-gui.sh:2977 lib/blame.tcl:104 msgid "File:" msgstr "File:" -#: git-gui.sh:3078 +#: git-gui.sh:3092 msgid "Refresh" msgstr "Rinfresca" -#: git-gui.sh:3099 +#: git-gui.sh:3113 msgid "Decrease Font Size" msgstr "Diminuisci dimensione caratteri" -#: git-gui.sh:3103 +#: git-gui.sh:3117 msgid "Increase Font Size" msgstr "Aumenta dimensione caratteri" -#: git-gui.sh:3111 lib/blame.tcl:281 +#: git-gui.sh:3125 lib/blame.tcl:281 msgid "Encoding" msgstr "Codifica" -#: git-gui.sh:3122 +#: git-gui.sh:3136 msgid "Apply/Reverse Hunk" msgstr "Applica/Inverti sezione" -#: git-gui.sh:3127 +#: git-gui.sh:3141 msgid "Apply/Reverse Line" msgstr "Applica/Inverti riga" -#: git-gui.sh:3137 +#: git-gui.sh:3151 msgid "Run Merge Tool" msgstr "Avvia programma esterno per la risoluzione dei conflitti" -#: git-gui.sh:3142 +#: git-gui.sh:3156 msgid "Use Remote Version" msgstr "Usa versione remota" -#: git-gui.sh:3146 +#: git-gui.sh:3160 msgid "Use Local Version" msgstr "Usa versione locale" -#: git-gui.sh:3150 +#: git-gui.sh:3164 msgid "Revert To Base" msgstr "Ritorna alla revisione comune" -#: git-gui.sh:3169 +#: git-gui.sh:3183 msgid "Unstage Hunk From Commit" msgstr "Annulla preparazione della sezione per una nuova revisione" -#: git-gui.sh:3170 +#: git-gui.sh:3184 msgid "Unstage Line From Commit" msgstr "Annulla preparazione della linea per una nuova revisione" -#: git-gui.sh:3172 +#: git-gui.sh:3186 msgid "Stage Hunk For Commit" msgstr "Prepara sezione per una nuova revisione" -#: git-gui.sh:3173 +#: git-gui.sh:3187 msgid "Stage Line For Commit" msgstr "Prepara linea per una nuova revisione" -#: git-gui.sh:3196 +#: git-gui.sh:3210 msgid "Initializing..." msgstr "Inizializzazione..." -#: git-gui.sh:3301 +#: git-gui.sh:3315 #, tcl-format msgid "" "Possible environment issues exist.\n" @@ -518,7 +518,7 @@ msgstr "" "da %s:\n" "\n" -#: git-gui.sh:3331 +#: git-gui.sh:3345 msgid "" "\n" "This is due to a known issue with the\n" @@ -528,7 +528,7 @@ msgstr "" "Ciò è dovuto a un problema conosciuto\n" "causato dall'eseguibile Tcl distribuito da Cygwin." -#: git-gui.sh:3336 +#: git-gui.sh:3350 #, tcl-format msgid "" "\n" @@ -613,43 +613,43 @@ msgstr "Ricerca accurata delle copie in corso..." msgid "Loading annotation..." msgstr "Caricamento annotazioni..." -#: lib/blame.tcl:964 +#: lib/blame.tcl:963 msgid "Author:" msgstr "Autore:" -#: lib/blame.tcl:968 +#: lib/blame.tcl:967 msgid "Committer:" msgstr "Revisione creata da:" -#: lib/blame.tcl:973 +#: lib/blame.tcl:972 msgid "Original File:" msgstr "File originario:" -#: lib/blame.tcl:1021 +#: lib/blame.tcl:1020 msgid "Cannot find HEAD commit:" msgstr "Impossibile trovare la revisione HEAD:" -#: lib/blame.tcl:1076 +#: lib/blame.tcl:1075 msgid "Cannot find parent commit:" msgstr "Impossibile trovare la revisione precedente:" -#: lib/blame.tcl:1091 +#: lib/blame.tcl:1090 msgid "Unable to display parent" msgstr "Impossibile visualizzare la revisione precedente" -#: lib/blame.tcl:1092 lib/diff.tcl:297 +#: lib/blame.tcl:1091 lib/diff.tcl:297 msgid "Error loading diff:" msgstr "Errore nel caricamento delle differenze:" -#: lib/blame.tcl:1232 +#: lib/blame.tcl:1231 msgid "Originally By:" msgstr "In origine da:" -#: lib/blame.tcl:1238 +#: lib/blame.tcl:1237 msgid "In File:" msgstr "Nel file:" -#: lib/blame.tcl:1243 +#: lib/blame.tcl:1242 msgid "Copied Or Moved Here By:" msgstr "Copiato o spostato qui da:" @@ -666,7 +666,7 @@ msgstr "Attiva" #: lib/checkout_op.tcl:544 lib/choose_font.tcl:43 lib/merge.tcl:172 #: lib/option.tcl:125 lib/remote_add.tcl:32 lib/remote_branch_delete.tcl:42 #: lib/tools_dlg.tcl:40 lib/tools_dlg.tcl:204 lib/tools_dlg.tcl:352 -#: lib/transport.tcl:97 +#: lib/transport.tcl:108 msgid "Cancel" msgstr "Annulla" @@ -1324,19 +1324,19 @@ msgstr "" "completata. Non puoi correggere la revisione precedente a meno che prima tu " "non interrompa l'operazione di fusione in corso.\n" -#: lib/commit.tcl:49 +#: lib/commit.tcl:48 msgid "Error loading commit data for amend:" msgstr "Errore durante il caricamento dei dati della revisione da correggere:" -#: lib/commit.tcl:76 +#: lib/commit.tcl:75 msgid "Unable to obtain your identity:" msgstr "Impossibile ottenere la tua identità:" -#: lib/commit.tcl:81 +#: lib/commit.tcl:80 msgid "Invalid GIT_COMMITTER_IDENT:" msgstr "GIT_COMMITTER_IDENT non valida:" -#: lib/commit.tcl:133 +#: lib/commit.tcl:132 msgid "" "Last scanned state does not match repository state.\n" "\n" @@ -1353,7 +1353,7 @@ msgstr "" "\n" "La nuova analisi comincerà ora.\n" -#: lib/commit.tcl:156 +#: lib/commit.tcl:155 #, tcl-format msgid "" "Unmerged files cannot be committed.\n" @@ -1366,7 +1366,7 @@ msgstr "" "Il file %s presenta dei conflitti. Devi risolverli e preparare il file per " "creare una nuova revisione prima di effettuare questa azione.\n" -#: lib/commit.tcl:164 +#: lib/commit.tcl:163 #, tcl-format msgid "" "Unknown file state %s detected.\n" @@ -1377,7 +1377,7 @@ msgstr "" "\n" "Questo programma non può creare una revisione contenente il file %s.\n" -#: lib/commit.tcl:172 +#: lib/commit.tcl:171 msgid "" "No changes to commit.\n" "\n" @@ -1388,7 +1388,7 @@ msgstr "" "Devi preparare per una nuova revisione almeno 1 file prima di effettuare " "questa operazione.\n" -#: lib/commit.tcl:187 +#: lib/commit.tcl:186 msgid "" "Please supply a commit message.\n" "\n" @@ -1406,45 +1406,45 @@ msgstr "" "- Seconda linea: vuota.\n" "- Terza linea: spiega a cosa serve la tua modifica.\n" -#: lib/commit.tcl:211 +#: lib/commit.tcl:210 #, tcl-format msgid "warning: Tcl does not support encoding '%s'." msgstr "attenzione: Tcl non supporta la codifica '%s'." -#: lib/commit.tcl:227 +#: lib/commit.tcl:226 msgid "Calling pre-commit hook..." msgstr "Avvio pre-commit hook..." -#: lib/commit.tcl:242 +#: lib/commit.tcl:241 msgid "Commit declined by pre-commit hook." msgstr "Revisione rifiutata dal pre-commit hook." -#: lib/commit.tcl:265 +#: lib/commit.tcl:264 msgid "Calling commit-msg hook..." msgstr "Avvio commit-msg hook..." -#: lib/commit.tcl:280 +#: lib/commit.tcl:279 msgid "Commit declined by commit-msg hook." msgstr "Revisione rifiutata dal commit-msg hook." -#: lib/commit.tcl:293 +#: lib/commit.tcl:292 msgid "Committing changes..." msgstr "Archiviazione modifiche..." -#: lib/commit.tcl:309 +#: lib/commit.tcl:308 msgid "write-tree failed:" msgstr "write-tree non riuscito:" -#: lib/commit.tcl:310 lib/commit.tcl:354 lib/commit.tcl:374 +#: lib/commit.tcl:309 lib/commit.tcl:353 lib/commit.tcl:373 msgid "Commit failed." msgstr "Impossibile creare una nuova revisione." -#: lib/commit.tcl:327 +#: lib/commit.tcl:326 #, tcl-format msgid "Commit %s appears to be corrupt" msgstr "La revisione %s sembra essere danneggiata" -#: lib/commit.tcl:332 +#: lib/commit.tcl:331 msgid "" "No changes to commit.\n" "\n" @@ -1458,19 +1458,19 @@ msgstr "" "\n" "Si procederà subito ad una nuova analisi.\n" -#: lib/commit.tcl:339 +#: lib/commit.tcl:338 msgid "No changes to commit." msgstr "Nessuna modifica per la nuova revisione." -#: lib/commit.tcl:353 +#: lib/commit.tcl:352 msgid "commit-tree failed:" msgstr "commit-tree non riuscito:" -#: lib/commit.tcl:373 +#: lib/commit.tcl:372 msgid "update-ref failed:" msgstr "update-ref non riuscito:" -#: lib/commit.tcl:461 +#: lib/commit.tcl:460 #, tcl-format msgid "Created commit %s: %s" msgstr "Creata revisione %s: %s" @@ -2186,7 +2186,8 @@ msgstr "Recupero %s" msgid "Do not know how to initialize repository at location '%s'." msgstr "Impossibile inizializzare l'archivio posto in '%s'." -#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:71 +#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63 +#: lib/transport.tcl:81 #, tcl-format msgid "push %s" msgstr "propaga verso %s" @@ -2204,11 +2205,11 @@ msgstr "Elimina ramo remoto" msgid "From Repository" msgstr "Da archivio" -#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:123 +#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:134 msgid "Remote:" msgstr "Remoto:" -#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:138 +#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:149 msgid "Arbitrary Location:" msgstr "Posizione specifica:" @@ -2537,35 +2538,40 @@ msgstr "Effettua potatura dei duplicati locali di rami remoti cancellati da %s" msgid "Pushing changes to %s" msgstr "Propagazione modifiche a %s" -#: lib/transport.tcl:72 +#: lib/transport.tcl:64 +#, tcl-format +msgid "Mirroring to %s" +msgstr "Mirroring verso %s" + +#: lib/transport.tcl:82 #, tcl-format msgid "Pushing %s %s to %s" msgstr "Propagazione %s %s a %s" -#: lib/transport.tcl:89 +#: lib/transport.tcl:100 msgid "Push Branches" msgstr "Propaga rami" -#: lib/transport.tcl:103 +#: lib/transport.tcl:114 msgid "Source Branches" msgstr "Rami di origine" -#: lib/transport.tcl:120 +#: lib/transport.tcl:131 msgid "Destination Repository" msgstr "Archivio di destinazione" -#: lib/transport.tcl:158 +#: lib/transport.tcl:169 msgid "Transfer Options" msgstr "Opzioni di trasferimento" -#: lib/transport.tcl:160 +#: lib/transport.tcl:171 msgid "Force overwrite existing branch (may discard changes)" msgstr "Sovrascrivi ramo esistente (alcune modifiche potrebbero essere perse)" -#: lib/transport.tcl:164 +#: lib/transport.tcl:175 msgid "Use thin pack (for slow network connections)" msgstr "Utilizza 'thin pack' (per connessioni lente)" -#: lib/transport.tcl:168 +#: lib/transport.tcl:179 msgid "Include tags" msgstr "Includi etichette" diff --git a/git-gui/po/ja.po b/git-gui/po/ja.po index 8ba64177fa..09d60bef74 100644 --- a/git-gui/po/ja.po +++ b/git-gui/po/ja.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: git-gui\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-11-16 13:56-0800\n" -"PO-Revision-Date: 2008-11-26 19:17+0900\n" +"POT-Creation-Date: 2008-12-08 08:31-0800\n" +"PO-Revision-Date: 2008-12-09 06:27+0900\n" "Last-Translator: しらいし ななこ <nanako3@lavabit.com>\n" "Language-Team: Japanese\n" "MIME-Version: 1.0\n" @@ -2501,7 +2501,12 @@ msgstr "%s から削除されたトラッキング・ブランチを刈ってい msgid "Pushing changes to %s" msgstr "%s へ変更をプッシュしています" -#: lib/transport.tcl:72 +#: lib/transport.tcl:64 +#, tcl-format +msgid "Mirroring to %s" +msgstr "%s へミラーしています" + +#: lib/transport.tcl:82 #, tcl-format msgid "Pushing %s %s to %s" msgstr "%3$s へ %1$s %2$s をプッシュしています" diff --git a/git-gui/po/nb.po b/git-gui/po/nb.po new file mode 100644 index 0000000000..1c5137d84c --- /dev/null +++ b/git-gui/po/nb.po @@ -0,0 +1,2484 @@ +# Norwegian (Bokmål) translation of git-gui. +# Copyright (C) 2007-2008 Shawn Pearce, et al. +# This file is distributed under the same license as the git-gui package. +# +# Fredrik Skolmli <fredrik@frsk.net>, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: nb\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-11-16 13:56-0800\n" +"PO-Revision-Date: 2008-12-03 16:05+0100\n" +"Last-Translator: Fredrik Skolmli <fredrik@frsk.net>\n" +"Language-Team: Norwegian Bokmål\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: git-gui.sh:41 git-gui.sh:737 git-gui.sh:751 git-gui.sh:764 git-gui.sh:847 +#: git-gui.sh:866 +msgid "git-gui: fatal error" +msgstr "git-gui: Kritisk feil" + +#: git-gui.sh:689 +#, tcl-format +msgid "Invalid font specified in %s:" +msgstr "Ugyldig font spesifisert i %s:" + +#: git-gui.sh:723 +msgid "Main Font" +msgstr "Hovedskrifttype" + +#: git-gui.sh:724 +msgid "Diff/Console Font" +msgstr "Diff-/Konsollskrifttype" + +#: git-gui.sh:738 +msgid "Cannot find git in PATH." +msgstr "Kan ikke finne git i PATH" + +#: git-gui.sh:765 +msgid "Cannot parse Git version string:" +msgstr "Kan ikke tyde Git's oppgitte versjon:" + +#: git-gui.sh:783 +#, tcl-format +msgid "" +"Git version cannot be determined.\n" +"\n" +"%s claims it is version '%s'.\n" +"\n" +"%s requires at least Git 1.5.0 or later.\n" +"\n" +"Assume '%s' is version 1.5.0?\n" +msgstr "" +"Kan ikke avgjøre hvilken Git-versjon du har.\n" +"\n" +"%s sier versjonen er '%s'.\n" +"\n" +"%s krever Git versjon 1.5.0 eller nyere.\n" +"\n" +"Anta at '%s' er versjon 1.5.0?\n" + +#: git-gui.sh:1062 +msgid "Git directory not found:" +msgstr "Git-katalog ikke funnet:" + +#: git-gui.sh:1069 +msgid "Cannot move to top of working directory:" +msgstr "Kan ikke gå til toppen av arbeidskatalogen:" + +#: git-gui.sh:1076 +msgid "Cannot use funny .git directory:" +msgstr "" + +#: git-gui.sh:1081 +msgid "No working directory" +msgstr "Ingen arbeidskatalog" + +#: git-gui.sh:1247 lib/checkout_op.tcl:305 +msgid "Refreshing file status..." +msgstr "Oppdaterer filstatus..." + +#: git-gui.sh:1303 +msgid "Scanning for modified files ..." +msgstr "Søker etter endrede filer..." + +#: git-gui.sh:1367 +msgid "Calling prepare-commit-msg hook..." +msgstr "" + +#: git-gui.sh:1384 +msgid "Commit declined by prepare-commit-msg hook." +msgstr "" + +#: git-gui.sh:1542 lib/browser.tcl:246 +msgid "Ready." +msgstr "Klar." + +#: git-gui.sh:1819 +msgid "Unmodified" +msgstr "Uendret" + +#: git-gui.sh:1821 +msgid "Modified, not staged" +msgstr "Endret, ikke køet" + +#: git-gui.sh:1822 git-gui.sh:1830 +msgid "Staged for commit" +msgstr "Køet for innsjekking" + +#: git-gui.sh:1823 git-gui.sh:1831 +msgid "Portions staged for commit" +msgstr "Delvis køet for innsjekking" + +#: git-gui.sh:1824 git-gui.sh:1832 +msgid "Staged for commit, missing" +msgstr "Klar for innsjekking, fraværende" + +#: git-gui.sh:1826 +msgid "File type changed, not staged" +msgstr "Filtype endret, ikke køet" + +#: git-gui.sh:1827 +msgid "File type changed, staged" +msgstr "Filtype endret, køet" + +#: git-gui.sh:1829 +msgid "Untracked, not staged" +msgstr "Usporet, ikke køet" + +#: git-gui.sh:1834 +msgid "Missing" +msgstr "Fraværende" + +#: git-gui.sh:1835 +msgid "Staged for removal" +msgstr "Køet for fjerning" + +#: git-gui.sh:1836 +msgid "Staged for removal, still present" +msgstr "Køet for fjerning, fortsatt tilstede" + +#: git-gui.sh:1838 git-gui.sh:1839 git-gui.sh:1840 git-gui.sh:1841 +#: git-gui.sh:1842 git-gui.sh:1843 +msgid "Requires merge resolution" +msgstr "Sammenslåingen krever konflikthåndtering" + +#: git-gui.sh:1878 +msgid "Starting gitk... please wait..." +msgstr "Starter gitk... Vennligst vent..." + +#: git-gui.sh:1887 +msgid "Couldn't find gitk in PATH" +msgstr "Kunne ikke finne gitk i PATH" + +#: git-gui.sh:2280 lib/choose_repository.tcl:36 +msgid "Repository" +msgstr "Arkiv" + +#: git-gui.sh:2281 +msgid "Edit" +msgstr "Redigere" + +#: git-gui.sh:2283 lib/choose_rev.tcl:561 +msgid "Branch" +msgstr "Gren" + +#: git-gui.sh:2286 lib/choose_rev.tcl:548 +msgid "Commit@@noun" +msgstr "Innsjekking" + +#: git-gui.sh:2289 lib/merge.tcl:121 lib/merge.tcl:150 lib/merge.tcl:168 +msgid "Merge" +msgstr "Sammenslåing" + +#: git-gui.sh:2290 lib/choose_rev.tcl:557 +msgid "Remote" +msgstr "Fjernarkiv" + +#: git-gui.sh:2293 +msgid "Tools" +msgstr "Verktøy" + +#: git-gui.sh:2302 +msgid "Explore Working Copy" +msgstr "Utforsk arbeidskopien" + +#: git-gui.sh:2307 +msgid "Browse Current Branch's Files" +msgstr "Utforsk denne grens filer" + +#: git-gui.sh:2311 +msgid "Browse Branch Files..." +msgstr "Bla igjennom filer på gren..." + +#: git-gui.sh:2316 +msgid "Visualize Current Branch's History" +msgstr "Visualiser denne grens historikk" + +#: git-gui.sh:2320 +msgid "Visualize All Branch History" +msgstr "Visualiser alle greners historikk" + +#: git-gui.sh:2327 +#, tcl-format +msgid "Browse %s's Files" +msgstr "Bla i filene til %s" + +#: git-gui.sh:2329 +#, tcl-format +msgid "Visualize %s's History" +msgstr "Visualiser historien til %s" + +#: git-gui.sh:2334 lib/database.tcl:27 lib/database.tcl:67 +msgid "Database Statistics" +msgstr "Databasestatistikk" + +#: git-gui.sh:2337 lib/database.tcl:34 +msgid "Compress Database" +msgstr "Kompress databasen" + +#: git-gui.sh:2340 +msgid "Verify Database" +msgstr "Verifiser databasen" + +#: git-gui.sh:2347 git-gui.sh:2351 git-gui.sh:2355 lib/shortcut.tcl:7 +#: lib/shortcut.tcl:39 lib/shortcut.tcl:71 +msgid "Create Desktop Icon" +msgstr "Lag skrivebordsikon" + +#: git-gui.sh:2363 lib/choose_repository.tcl:183 lib/choose_repository.tcl:191 +msgid "Quit" +msgstr "Avslutt" + +#: git-gui.sh:2371 +msgid "Undo" +msgstr "Angre" + +#: git-gui.sh:2374 +msgid "Redo" +msgstr "Gjør om" + +#: git-gui.sh:2378 git-gui.sh:2923 +msgid "Cut" +msgstr "Klipp ut" + +#: git-gui.sh:2381 git-gui.sh:2926 git-gui.sh:3000 git-gui.sh:3082 +#: lib/console.tcl:69 +msgid "Copy" +msgstr "Kopier" + +#: git-gui.sh:2384 git-gui.sh:2929 +msgid "Paste" +msgstr "Lim inn" + +#: git-gui.sh:2387 git-gui.sh:2932 lib/branch_delete.tcl:26 +#: lib/remote_branch_delete.tcl:38 +msgid "Delete" +msgstr "Slett" + +#: git-gui.sh:2391 git-gui.sh:2936 git-gui.sh:3086 lib/console.tcl:71 +msgid "Select All" +msgstr "Velg alle" + +#: git-gui.sh:2400 +msgid "Create..." +msgstr "Opprett..." + +#: git-gui.sh:2406 +msgid "Checkout..." +msgstr "Sjekk ut..." + +#: git-gui.sh:2412 +msgid "Rename..." +msgstr "Endre navn..." + +#: git-gui.sh:2417 +msgid "Delete..." +msgstr "Slett..." + +#: git-gui.sh:2422 +msgid "Reset..." +msgstr "Tilbakestill..." + +#: git-gui.sh:2432 +msgid "Done" +msgstr "Ferdig" + +#: git-gui.sh:2434 +msgid "Commit@@verb" +msgstr "Sjekk inn" + +#: git-gui.sh:2443 git-gui.sh:2864 +msgid "New Commit" +msgstr "Ny innsjekking" + +#: git-gui.sh:2451 git-gui.sh:2871 +msgid "Amend Last Commit" +msgstr "Legg til forrige innsjekking" + +#: git-gui.sh:2461 git-gui.sh:2825 lib/remote_branch_delete.tcl:99 +msgid "Rescan" +msgstr "Søk på ny" + +#: git-gui.sh:2467 +msgid "Stage To Commit" +msgstr "Legg til i innsjekkingskøen" + +#: git-gui.sh:2473 +msgid "Stage Changed Files To Commit" +msgstr "Legg til endrede filer i innsjekkingskøen" + +#: git-gui.sh:2479 +msgid "Unstage From Commit" +msgstr "Fjern fra innsjekkingskøen" + +#: git-gui.sh:2484 lib/index.tcl:410 +msgid "Revert Changes" +msgstr "Tilbakestill endringer" + +#: git-gui.sh:2491 git-gui.sh:3069 +msgid "Show Less Context" +msgstr "Vis mindre innhold" + +#: git-gui.sh:2495 git-gui.sh:3073 +msgid "Show More Context" +msgstr "Vis mer innhold" + +#: git-gui.sh:2502 git-gui.sh:2838 git-gui.sh:2947 +msgid "Sign Off" +msgstr "Signér" + +#: git-gui.sh:2518 +msgid "Local Merge..." +msgstr "Lokal sammenslåing..." + +#: git-gui.sh:2523 +msgid "Abort Merge..." +msgstr "Avbryt sammenslåing..." + +#: git-gui.sh:2535 git-gui.sh:2575 +msgid "Add..." +msgstr "Legg til..." + +#: git-gui.sh:2539 +msgid "Push..." +msgstr "Send..." + +#: git-gui.sh:2543 +msgid "Delete Branch..." +msgstr "Fjern gren..." + +#: git-gui.sh:2553 git-gui.sh:2589 lib/about.tcl:14 +#: lib/choose_repository.tcl:44 lib/choose_repository.tcl:53 +#, tcl-format +msgid "About %s" +msgstr "Om %s" + +#: git-gui.sh:2557 +msgid "Preferences..." +msgstr "Innstillinger..." + +#: git-gui.sh:2565 git-gui.sh:3115 +msgid "Options..." +msgstr "Alternativer..." + +#: git-gui.sh:2576 +msgid "Remove..." +msgstr "Fjern..." + +#: git-gui.sh:2585 lib/choose_repository.tcl:50 +msgid "Help" +msgstr "Hjelp" + +#: git-gui.sh:2611 +msgid "Online Documentation" +msgstr "Online dokumentasjon" + +#: git-gui.sh:2614 lib/choose_repository.tcl:47 lib/choose_repository.tcl:56 +msgid "Show SSH Key" +msgstr "Vis SSH-nøkkel" + +#: git-gui.sh:2707 +#, tcl-format +msgid "fatal: cannot stat path %s: No such file or directory" +msgstr "" +"kritisk: kunne ikke finne status for sti %s: Ingen slik fil eller katalog" + +#: git-gui.sh:2740 +msgid "Current Branch:" +msgstr "Nåværende gren:" + +#: git-gui.sh:2761 +msgid "Staged Changes (Will Commit)" +msgstr "Køede endringer (til innsjekking)" + +#: git-gui.sh:2781 +msgid "Unstaged Changes" +msgstr "Ukøede endringer" + +#: git-gui.sh:2831 +msgid "Stage Changed" +msgstr "Kø endret" + +#: git-gui.sh:2850 lib/transport.tcl:93 lib/transport.tcl:182 +msgid "Push" +msgstr "Send" + +#: git-gui.sh:2885 +msgid "Initial Commit Message:" +msgstr "Innledende innsjekkingsmelding:" + +#: git-gui.sh:2886 +msgid "Amended Commit Message:" +msgstr "Utdypt innsjekkingsmelding" + +#: git-gui.sh:2887 +msgid "Amended Initial Commit Message:" +msgstr "Utdypt innledende innsjekkingsmelding:" + +#: git-gui.sh:2888 +msgid "Amended Merge Commit Message:" +msgstr "Utdypt innsjekkingsmelding for sammenslåing:" + +#: git-gui.sh:2889 +msgid "Merge Commit Message:" +msgstr "Revisjonsmelding for sammenslåing:" + +#: git-gui.sh:2890 +msgid "Commit Message:" +msgstr "Revisjonsmelding:" + +#: git-gui.sh:2939 git-gui.sh:3090 lib/console.tcl:73 +msgid "Copy All" +msgstr "Kopier alle" + +#: git-gui.sh:2963 lib/blame.tcl:104 +msgid "File:" +msgstr "Fil:" + +#: git-gui.sh:3078 +msgid "Refresh" +msgstr "Oppdater" + +#: git-gui.sh:3099 +msgid "Decrease Font Size" +msgstr "Gjør teksten mindre" + +#: git-gui.sh:3103 +msgid "Increase Font Size" +msgstr "Gjør teksten større" + +#: git-gui.sh:3111 lib/blame.tcl:281 +msgid "Encoding" +msgstr "Tekstkoding" + +#: git-gui.sh:3122 +msgid "Apply/Reverse Hunk" +msgstr "Bruk/tilbakestill del" + +#: git-gui.sh:3127 +msgid "Apply/Reverse Line" +msgstr "Bruk/tilbakestill linje" + +#: git-gui.sh:3137 +msgid "Run Merge Tool" +msgstr "Start sammenslåingsprosess" + +#: git-gui.sh:3142 +msgid "Use Remote Version" +msgstr "Bruk versjon fra fjernarkiv" + +#: git-gui.sh:3146 +msgid "Use Local Version" +msgstr "Bruk lokal versjon" + +#: git-gui.sh:3150 +msgid "Revert To Base" +msgstr "Tilbakestill til baseversjonen" + +#: git-gui.sh:3169 +msgid "Unstage Hunk From Commit" +msgstr "Fjern delen fra innsjekkingskøen" + +#: git-gui.sh:3170 +msgid "Unstage Line From Commit" +msgstr "Fjern linjen fra innsjekkingskøen" + +#: git-gui.sh:3172 +msgid "Stage Hunk For Commit" +msgstr "Legg del i innsjekkingskøen" + +#: git-gui.sh:3173 +msgid "Stage Line For Commit" +msgstr "Legg til linje i innsjekkingskøen" + +#: git-gui.sh:3196 +msgid "Initializing..." +msgstr "Initsialiserer..." + +#: git-gui.sh:3301 +#, tcl-format +msgid "" +"Possible environment issues exist.\n" +"\n" +"The following environment variables are probably\n" +"going to be ignored by any Git subprocess run\n" +"by %s:\n" +"\n" +msgstr "" + +#: git-gui.sh:3331 +msgid "" +"\n" +"This is due to a known issue with the\n" +"Tcl binary distributed by Cygwin." +msgstr "" + +#: git-gui.sh:3336 +#, tcl-format +msgid "" +"\n" +"\n" +"A good replacement for %s\n" +"is placing values for the user.name and\n" +"user.email settings into your personal\n" +"~/.gitconfig file.\n" +msgstr "" + +#: lib/about.tcl:26 +msgid "git-gui - a graphical user interface for Git." +msgstr "git-gui - Et grafisk brukergrensesnitt for Git." + +#: lib/blame.tcl:72 +msgid "File Viewer" +msgstr "Filviser" + +#: lib/blame.tcl:78 +msgid "Commit:" +msgstr "Innsjekking:" + +#: lib/blame.tcl:271 +msgid "Copy Commit" +msgstr "Kopier innsjekking" + +#: lib/blame.tcl:275 +msgid "Find Text..." +msgstr "Søk etter tekst..." + +#: lib/blame.tcl:284 +msgid "Do Full Copy Detection" +msgstr "Gjennomfør full deteksjon av kopieringer" + +#: lib/blame.tcl:288 +msgid "Show History Context" +msgstr "Vis historikkens innhold" + +#: lib/blame.tcl:291 +msgid "Blame Parent Commit" +msgstr "" + +#: lib/blame.tcl:450 +#, tcl-format +msgid "Reading %s..." +msgstr "Leser %s..." + +#: lib/blame.tcl:557 +msgid "Loading copy/move tracking annotations..." +msgstr "" + +#: lib/blame.tcl:577 +msgid "lines annotated" +msgstr "" + +#: lib/blame.tcl:769 +msgid "Loading original location annotations..." +msgstr "" + +#: lib/blame.tcl:772 +msgid "Annotation complete." +msgstr "" + +#: lib/blame.tcl:802 +msgid "Busy" +msgstr "Opptatt" + +#: lib/blame.tcl:803 +msgid "Annotation process is already running." +msgstr "" + +#: lib/blame.tcl:842 +msgid "Running thorough copy detection..." +msgstr "Kjører kopidetektering..." + +#: lib/blame.tcl:910 +msgid "Loading annotation..." +msgstr "" + +#: lib/blame.tcl:964 +msgid "Author:" +msgstr "Forfatter:" + +#: lib/blame.tcl:968 +msgid "Committer:" +msgstr "Innsjekker:" + +#: lib/blame.tcl:973 +msgid "Original File:" +msgstr "Opprinnelig fil:" + +#: lib/blame.tcl:1021 +msgid "Cannot find HEAD commit:" +msgstr "Finner ikke HEAD's innsjekking:" + +#: lib/blame.tcl:1076 +msgid "Cannot find parent commit:" +msgstr "Kan ikke finne innsjekkingens forelder:" + +#: lib/blame.tcl:1091 +msgid "Unable to display parent" +msgstr "Kan ikke vise forelder" + +#: lib/blame.tcl:1092 lib/diff.tcl:297 +msgid "Error loading diff:" +msgstr "Feil ved innlasting av forskjell:" + +#: lib/blame.tcl:1232 +msgid "Originally By:" +msgstr "Opprinnelig av:" + +#: lib/blame.tcl:1238 +msgid "In File:" +msgstr "I fil:" + +#: lib/blame.tcl:1243 +msgid "Copied Or Moved Here By:" +msgstr "Kopiert eller flyttet hit av:" + +#: lib/branch_checkout.tcl:14 lib/branch_checkout.tcl:19 +msgid "Checkout Branch" +msgstr "Sjekk ut gren" + +#: lib/branch_checkout.tcl:23 +msgid "Checkout" +msgstr "Utsjekking" + +#: lib/branch_checkout.tcl:27 lib/branch_create.tcl:35 +#: lib/branch_delete.tcl:32 lib/branch_rename.tcl:30 lib/browser.tcl:282 +#: lib/checkout_op.tcl:544 lib/choose_font.tcl:43 lib/merge.tcl:172 +#: lib/option.tcl:125 lib/remote_add.tcl:32 lib/remote_branch_delete.tcl:42 +#: lib/tools_dlg.tcl:40 lib/tools_dlg.tcl:204 lib/tools_dlg.tcl:352 +#: lib/transport.tcl:97 +msgid "Cancel" +msgstr "Avbryt" + +#: lib/branch_checkout.tcl:32 lib/browser.tcl:287 lib/tools_dlg.tcl:328 +msgid "Revision" +msgstr "Revisjon" + +#: lib/branch_checkout.tcl:36 lib/branch_create.tcl:69 lib/option.tcl:280 +msgid "Options" +msgstr "Valg" + +#: lib/branch_checkout.tcl:39 lib/branch_create.tcl:92 +msgid "Fetch Tracking Branch" +msgstr "Hent sporet gren" + +#: lib/branch_checkout.tcl:44 +msgid "Detach From Local Branch" +msgstr "Koble bort lokal gren" + +#: lib/branch_create.tcl:22 +msgid "Create Branch" +msgstr "Opprett gren" + +#: lib/branch_create.tcl:27 +msgid "Create New Branch" +msgstr "Opprett ny gren" + +#: lib/branch_create.tcl:31 lib/choose_repository.tcl:377 +msgid "Create" +msgstr "Opprett" + +#: lib/branch_create.tcl:40 +msgid "Branch Name" +msgstr "Navn på gren" + +#: lib/branch_create.tcl:43 lib/remote_add.tcl:39 lib/tools_dlg.tcl:50 +msgid "Name:" +msgstr "Navn:" + +#: lib/branch_create.tcl:58 +msgid "Match Tracking Branch Name" +msgstr "Bruk navn på sporet gren" + +#: lib/branch_create.tcl:66 +msgid "Starting Revision" +msgstr "Starter revisjon" + +#: lib/branch_create.tcl:72 +msgid "Update Existing Branch:" +msgstr "Oppdater eksisterende gren:" + +#: lib/branch_create.tcl:75 +msgid "No" +msgstr "Nei" + +#: lib/branch_create.tcl:80 +msgid "Fast Forward Only" +msgstr "Kun hurtigfremspoling" + +#: lib/branch_create.tcl:85 lib/checkout_op.tcl:536 +msgid "Reset" +msgstr "Tilbakestill" + +#: lib/branch_create.tcl:97 +msgid "Checkout After Creation" +msgstr "Sjekk ut etter oppretting" + +#: lib/branch_create.tcl:131 +msgid "Please select a tracking branch." +msgstr "Velg en gren som skal følges." + +#: lib/branch_create.tcl:140 +#, tcl-format +msgid "Tracking branch %s is not a branch in the remote repository." +msgstr "Den fulgte grenen %s er ikke en gren i fjernarkivet." + +#: lib/branch_create.tcl:153 lib/branch_rename.tcl:86 +msgid "Please supply a branch name." +msgstr "Angi et navn for grenen." + +#: lib/branch_create.tcl:164 lib/branch_rename.tcl:106 +#, tcl-format +msgid "'%s' is not an acceptable branch name." +msgstr "'%s' kan ikke brukes som navn på en gren." + +#: lib/branch_delete.tcl:15 +msgid "Delete Branch" +msgstr "Fjern gren" + +#: lib/branch_delete.tcl:20 +msgid "Delete Local Branch" +msgstr "Fjern lokal gren" + +#: lib/branch_delete.tcl:37 +msgid "Local Branches" +msgstr "Lokale grener" + +#: lib/branch_delete.tcl:52 +msgid "Delete Only If Merged Into" +msgstr "Fjern kun ved sammenslåing" + +#: lib/branch_delete.tcl:54 +msgid "Always (Do not perform merge test.)" +msgstr "Alltid (Ikke utfør sammenslåingstest.)" + +#: lib/branch_delete.tcl:103 +#, tcl-format +msgid "The following branches are not completely merged into %s:" +msgstr "Følgende grener er ikke fullstendig slått sammen med %s:" + +#: lib/branch_delete.tcl:115 +msgid "" +"Recovering deleted branches is difficult. \n" +"\n" +" Delete the selected branches?" +msgstr "" +"Gjenoppretting av fjernede grener er vanskelig. \n" +"\n" +" Fjern valgte grener?" + +#: lib/branch_delete.tcl:141 +#, tcl-format +msgid "" +"Failed to delete branches:\n" +"%s" +msgstr "" +"Kunne ikke fjerne grener:\n" +"%s" + +#: lib/branch_rename.tcl:14 lib/branch_rename.tcl:22 +msgid "Rename Branch" +msgstr "Gi gren nytt navn" + +#: lib/branch_rename.tcl:26 +msgid "Rename" +msgstr "Endre navn" + +#: lib/branch_rename.tcl:36 +msgid "Branch:" +msgstr "Gren:" + +#: lib/branch_rename.tcl:39 +msgid "New Name:" +msgstr "Nytt navn:" + +#: lib/branch_rename.tcl:75 +msgid "Please select a branch to rename." +msgstr "Vennligst velg grenen du vil endre navn på." + +#: lib/branch_rename.tcl:96 lib/checkout_op.tcl:201 +#, tcl-format +msgid "Branch '%s' already exists." +msgstr "Grenen '%s' eksisterer allerede." + +#: lib/branch_rename.tcl:117 +#, tcl-format +msgid "Failed to rename '%s'." +msgstr "Kunne ikke endre navnet '%s'." + +#: lib/browser.tcl:17 +msgid "Starting..." +msgstr "Starter..." + +#: lib/browser.tcl:26 +msgid "File Browser" +msgstr "Utforsker" + +#: lib/browser.tcl:126 lib/browser.tcl:143 +#, tcl-format +msgid "Loading %s..." +msgstr "Laster %s..." + +#: lib/browser.tcl:187 +msgid "[Up To Parent]" +msgstr "[Opp til forelder]" + +#: lib/browser.tcl:267 lib/browser.tcl:273 +msgid "Browse Branch Files" +msgstr "Bla igjennom grenens filer" + +#: lib/browser.tcl:278 lib/choose_repository.tcl:394 +#: lib/choose_repository.tcl:480 lib/choose_repository.tcl:491 +#: lib/choose_repository.tcl:995 +msgid "Browse" +msgstr "Bla igjennom" + +#: lib/checkout_op.tcl:84 +#, tcl-format +msgid "Fetching %s from %s" +msgstr "Henter %s fra %s" + +#: lib/checkout_op.tcl:132 +#, tcl-format +msgid "fatal: Cannot resolve %s" +msgstr "kritisk: Kan ikke åpne %s" + +#: lib/checkout_op.tcl:145 lib/console.tcl:81 lib/database.tcl:31 +#: lib/sshkey.tcl:53 +msgid "Close" +msgstr "Lukk" + +#: lib/checkout_op.tcl:174 +#, tcl-format +msgid "Branch '%s' does not exist." +msgstr "Grenen '%s' eksisterer ikke." + +#: lib/checkout_op.tcl:193 +#, tcl-format +msgid "Failed to configure simplified git-pull for '%s'." +msgstr "Kunne ikke konfigurere forenklet git-pull for '%s'." + +#: lib/checkout_op.tcl:228 +#, tcl-format +msgid "" +"Branch '%s' already exists.\n" +"\n" +"It cannot fast-forward to %s.\n" +"A merge is required." +msgstr "" +"Grenen '%s' eksisterer allerede.\n" +"\n" +"Den kan ikke hurtigfremspoles til %s.\n" +"En sammenslåing er påkrevd." + +#: lib/checkout_op.tcl:242 +#, tcl-format +msgid "Merge strategy '%s' not supported." +msgstr "Sammenslåingsstrategien '%s' er ikke støttet." + +#: lib/checkout_op.tcl:261 +#, tcl-format +msgid "Failed to update '%s'." +msgstr "Kunne ikke oppdatere '%s'." + +#: lib/checkout_op.tcl:273 +msgid "Staging area (index) is already locked." +msgstr "Køområdet (index) er allerede låst." + +#: lib/checkout_op.tcl:288 +msgid "" +"Last scanned state does not match repository state.\n" +"\n" +"Another Git program has modified this repository since the last scan. A " +"rescan must be performed before the current branch can be changed.\n" +"\n" +"The rescan will be automatically started now.\n" +msgstr "" + +#: lib/checkout_op.tcl:344 +#, tcl-format +msgid "Updating working directory to '%s'..." +msgstr "Oppdaterer arbeidskatalogen til '%s'..." + +#: lib/checkout_op.tcl:345 +msgid "files checked out" +msgstr "filer sjekket ut" + +#: lib/checkout_op.tcl:375 +#, tcl-format +msgid "Aborted checkout of '%s' (file level merging is required)." +msgstr "Avbrøt utsjekkingen av '%s' (sammenslåing på filnivå kreves)." + +#: lib/checkout_op.tcl:376 +msgid "File level merge required." +msgstr "Sammenslåing på filnivå kreves" + +#: lib/checkout_op.tcl:380 +#, tcl-format +msgid "Staying on branch '%s'." +msgstr "Blir stående på grenen '%s'." + +#: lib/checkout_op.tcl:451 +msgid "" +"You are no longer on a local branch.\n" +"\n" +"If you wanted to be on a branch, create one now starting from 'This Detached " +"Checkout'." +msgstr "" + +#: lib/checkout_op.tcl:468 lib/checkout_op.tcl:472 +#, tcl-format +msgid "Checked out '%s'." +msgstr "Sjekket ut '%s'." + +#: lib/checkout_op.tcl:500 +#, tcl-format +msgid "Resetting '%s' to '%s' will lose the following commits:" +msgstr "" +"Tilbakestilling av '%s' til '%s' vil medføre tap av følgende innsjekkinger:" + +#: lib/checkout_op.tcl:522 +msgid "Recovering lost commits may not be easy." +msgstr "" +"Det vil kanskje ikke være så enkelt å gjenopprette en tapt innsjekking." + +#: lib/checkout_op.tcl:527 +#, tcl-format +msgid "Reset '%s'?" +msgstr "Tilbakestill '%s'?" + +#: lib/checkout_op.tcl:532 lib/merge.tcl:164 lib/tools_dlg.tcl:343 +msgid "Visualize" +msgstr "Visualiser" + +#: lib/checkout_op.tcl:600 +#, tcl-format +msgid "" +"Failed to set current branch.\n" +"\n" +"This working directory is only partially switched. We successfully updated " +"your files, but failed to update an internal Git file.\n" +"\n" +"This should not have occurred. %s will now close and give up." +msgstr "" + +#: lib/choose_font.tcl:39 +msgid "Select" +msgstr "Velg" + +#: lib/choose_font.tcl:53 +msgid "Font Family" +msgstr "Skrifttype-familie" + +#: lib/choose_font.tcl:74 +msgid "Font Size" +msgstr "Skriftstørrelse" + +#: lib/choose_font.tcl:91 +msgid "Font Example" +msgstr "Skrifteksempel" + +#: lib/choose_font.tcl:103 +msgid "" +"This is example text.\n" +"If you like this text, it can be your font." +msgstr "" +"Dette er en eksempeltekst.\n" +"Hvis du liker hvordan teksten ser ut, kan du velge dette som din skrifttype." + +#: lib/choose_repository.tcl:28 +msgid "Git Gui" +msgstr "Git Gui" + +#: lib/choose_repository.tcl:87 lib/choose_repository.tcl:382 +msgid "Create New Repository" +msgstr "Opprett nytt arkiv" + +#: lib/choose_repository.tcl:93 +msgid "New..." +msgstr "Ny..." + +#: lib/choose_repository.tcl:100 lib/choose_repository.tcl:465 +msgid "Clone Existing Repository" +msgstr "Klon eksistererende arkiv" + +#: lib/choose_repository.tcl:106 +msgid "Clone..." +msgstr "Klon..." + +#: lib/choose_repository.tcl:113 lib/choose_repository.tcl:983 +msgid "Open Existing Repository" +msgstr "Åpne eksistererende arkiv" + +#: lib/choose_repository.tcl:119 +msgid "Open..." +msgstr "Åpne..." + +#: lib/choose_repository.tcl:132 +msgid "Recent Repositories" +msgstr "Nylig brukte arkiv" + +#: lib/choose_repository.tcl:138 +msgid "Open Recent Repository:" +msgstr "Åpne nylig brukt arkiv:" + +#: lib/choose_repository.tcl:302 lib/choose_repository.tcl:309 +#: lib/choose_repository.tcl:316 +#, tcl-format +msgid "Failed to create repository %s:" +msgstr "Kunne ikke opprette arkivet %s:" + +#: lib/choose_repository.tcl:387 +msgid "Directory:" +msgstr "Mappe:" + +#: lib/choose_repository.tcl:417 lib/choose_repository.tcl:544 +#: lib/choose_repository.tcl:1017 +msgid "Git Repository" +msgstr "Git arkiv" + +#: lib/choose_repository.tcl:442 +#, tcl-format +msgid "Directory %s already exists." +msgstr "Mappen %s eksisterer allerede." + +#: lib/choose_repository.tcl:446 +#, tcl-format +msgid "File %s already exists." +msgstr "Filen %s eksisterer allerede." + +#: lib/choose_repository.tcl:460 +msgid "Clone" +msgstr "Klon" + +#: lib/choose_repository.tcl:473 +msgid "Source Location:" +msgstr "Kildeplassering:" + +#: lib/choose_repository.tcl:484 +msgid "Target Directory:" +msgstr "Destinasjonsmappe:" + +#: lib/choose_repository.tcl:496 +msgid "Clone Type:" +msgstr "Klontype:" + +#: lib/choose_repository.tcl:502 +msgid "Standard (Fast, Semi-Redundant, Hardlinks)" +msgstr "Standard (rask, delvis redundant, hardlinker)" + +#: lib/choose_repository.tcl:508 +msgid "Full Copy (Slower, Redundant Backup)" +msgstr "Full kopi (tregere, redundant sikkerhetskopi)" + +#: lib/choose_repository.tcl:514 +msgid "Shared (Fastest, Not Recommended, No Backup)" +msgstr "Delt (raskest, ikke anbefalt, ingen sikkerhetskopiering)" + +#: lib/choose_repository.tcl:550 lib/choose_repository.tcl:597 +#: lib/choose_repository.tcl:743 lib/choose_repository.tcl:813 +#: lib/choose_repository.tcl:1023 lib/choose_repository.tcl:1031 +#, tcl-format +msgid "Not a Git repository: %s" +msgstr "Ikke et Git-arkiv: %s" + +#: lib/choose_repository.tcl:586 +msgid "Standard only available for local repository." +msgstr "Standard er kun tilgjengelig for lokalt arkiv." + +#: lib/choose_repository.tcl:590 +msgid "Shared only available for local repository." +msgstr "Delt er kun tilgjengelig for lokalt arkiv." + +#: lib/choose_repository.tcl:611 +#, tcl-format +msgid "Location %s already exists." +msgstr "Stedet %s eksisterer allerede." + +#: lib/choose_repository.tcl:622 +msgid "Failed to configure origin" +msgstr "Kunne ikke konfigurere kildeoppføring" + +#: lib/choose_repository.tcl:634 +msgid "Counting objects" +msgstr "Teller objekter" + +#: lib/choose_repository.tcl:635 +msgid "buckets" +msgstr "bøtter" + +#: lib/choose_repository.tcl:659 +#, tcl-format +msgid "Unable to copy objects/info/alternates: %s" +msgstr "Kunne ikke kopiere objekter/informasjon/alternativt: %s" + +#: lib/choose_repository.tcl:695 +#, tcl-format +msgid "Nothing to clone from %s." +msgstr "Ingenting å klone fra %s." + +#: lib/choose_repository.tcl:697 lib/choose_repository.tcl:911 +#: lib/choose_repository.tcl:923 +msgid "The 'master' branch has not been initialized." +msgstr "Grenen 'master' har ikke blitt initsialisert." + +#: lib/choose_repository.tcl:710 +msgid "Hardlinks are unavailable. Falling back to copying." +msgstr "Harde linker er utilgjengelig. Går tilbake til kopiering." + +#: lib/choose_repository.tcl:722 +#, tcl-format +msgid "Cloning from %s" +msgstr "Kloner fra %s" + +#: lib/choose_repository.tcl:753 +msgid "Copying objects" +msgstr "Kopierer objekter" + +#: lib/choose_repository.tcl:754 +msgid "KiB" +msgstr "kB" + +#: lib/choose_repository.tcl:778 +#, tcl-format +msgid "Unable to copy object: %s" +msgstr "Kunne ikke kopiere objekt: %s" + +#: lib/choose_repository.tcl:788 +msgid "Linking objects" +msgstr "Lenker objekter" + +#: lib/choose_repository.tcl:789 +msgid "objects" +msgstr "objekter" + +#: lib/choose_repository.tcl:797 +#, tcl-format +msgid "Unable to hardlink object: %s" +msgstr "Kunne ikke opprette hardlink med objektet: %s" + +#: lib/choose_repository.tcl:852 +msgid "Cannot fetch branches and objects. See console output for details." +msgstr "Kunne ikke hente grener og objekter. Se utdata i konsoll for detaljer." + +#: lib/choose_repository.tcl:863 +msgid "Cannot fetch tags. See console output for details." +msgstr "Kunne ikke hente tagger. Se utdata i konsoll for detaljer." + +#: lib/choose_repository.tcl:887 +msgid "Cannot determine HEAD. See console output for details." +msgstr "Kan ikke bestemme HEAD. Se utdata i konsoll for detaljer." + +#: lib/choose_repository.tcl:896 +#, tcl-format +msgid "Unable to cleanup %s" +msgstr "Kunne ikke rydde opp %s" + +#: lib/choose_repository.tcl:902 +msgid "Clone failed." +msgstr "Kloning feilet." + +#: lib/choose_repository.tcl:909 +msgid "No default branch obtained." +msgstr "Ingen standardgren hentet." + +#: lib/choose_repository.tcl:920 +#, tcl-format +msgid "Cannot resolve %s as a commit." +msgstr "Kan ikke finne %s som en innsjekking." + +#: lib/choose_repository.tcl:932 +msgid "Creating working directory" +msgstr "Oppretter arbeidskatalog" + +#: lib/choose_repository.tcl:933 lib/index.tcl:65 lib/index.tcl:128 +#: lib/index.tcl:196 +msgid "files" +msgstr "filer" + +#: lib/choose_repository.tcl:962 +msgid "Initial file checkout failed." +msgstr "Initsialiserende utsjekking feilet." + +#: lib/choose_repository.tcl:978 +msgid "Open" +msgstr "Åpne" + +#: lib/choose_repository.tcl:988 +msgid "Repository:" +msgstr "Arkiv:" + +#: lib/choose_repository.tcl:1037 +#, tcl-format +msgid "Failed to open repository %s:" +msgstr "Kunne ikke åpne arkivet %s:" + +#: lib/choose_rev.tcl:53 +msgid "This Detached Checkout" +msgstr "Denne frakoblede utsjekkingen" + +#: lib/choose_rev.tcl:60 +msgid "Revision Expression:" +msgstr "Revisjonsuttrykk:" + +#: lib/choose_rev.tcl:74 +msgid "Local Branch" +msgstr "Lokal gren" + +#: lib/choose_rev.tcl:79 +msgid "Tracking Branch" +msgstr "Sporet gren" + +#: lib/choose_rev.tcl:84 lib/choose_rev.tcl:538 +msgid "Tag" +msgstr "Tag" + +#: lib/choose_rev.tcl:317 +#, tcl-format +msgid "Invalid revision: %s" +msgstr "Ugyldig revisjon: %s" + +#: lib/choose_rev.tcl:338 +msgid "No revision selected." +msgstr "Ingen revisjoner valgt." + +#: lib/choose_rev.tcl:346 +msgid "Revision expression is empty." +msgstr "Revisjonsuttrykk er tomt." + +#: lib/choose_rev.tcl:531 +msgid "Updated" +msgstr "Oppdatert" + +#: lib/choose_rev.tcl:559 +msgid "URL" +msgstr "URL" + +#: 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 er ingenting å legge til.\n" +"\n" +"Du er i ferd med å lage den initsialiserende revisjonen. Det er ingen " +"tidligere revisjoner å tilføye.\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 ikke tilføye under sammenslåing.\n" +"\n" +"Du er for øyeblikket under en pågående sammenslåing som ikke er fullført. Du " +"kan ikke tilføye en tidligere revisjon med mindre du først avbryter denne " +"sammenslåingen.\n" + +#: lib/commit.tcl:49 +msgid "Error loading commit data for amend:" +msgstr "Feil ved innhenting av revisjonsdata for tilføying:" + +#: lib/commit.tcl:76 +msgid "Unable to obtain your identity:" +msgstr "Kunne ikke avgjøre din identitet:" + +#: lib/commit.tcl:81 +msgid "Invalid GIT_COMMITTER_IDENT:" +msgstr "Ugyldig GIT_COMMITTER_IDENT:" + +#: lib/commit.tcl:133 +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 "" + +#: lib/commit.tcl:156 +#, tcl-format +msgid "" +"Unmerged files cannot be committed.\n" +"\n" +"File %s has merge conflicts. You must resolve them and stage the file " +"before committing.\n" +msgstr "" + +#: lib/commit.tcl:164 +#, tcl-format +msgid "" +"Unknown file state %s detected.\n" +"\n" +"File %s cannot be committed by this program.\n" +msgstr "" +"Ukjent filstatus %s er funnet.\n" +"\n" +"Filen %s kan ikke sjekkes inn av dette programmet.\n" + +#: lib/commit.tcl:172 +msgid "" +"No changes to commit.\n" +"\n" +"You must stage at least 1 file before you can commit.\n" +msgstr "" +"Ingen endringer å sjekke inn.\n" +"\n" +"Du må køe minst en fil før du kan sjekke inn noe.\n" + +#: lib/commit.tcl:187 +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 "" +"Vennligst angi en revisjonsmelding.\n" +"\n" +"En god melding har følgende format:\n" +"\n" +"- Første linje: En beskrivelse av hva du har gjort i én setning.\n" +"- Andre linje: Blank\n" +"- Resterende linjer: Forklar hvorfor denne endringen er bra.\n" + +#: lib/commit.tcl:211 +#, tcl-format +msgid "warning: Tcl does not support encoding '%s'." +msgstr "advarsel: Tcl støtter ikke denne tegnkodingen '%s'." + +#: lib/commit.tcl:227 +msgid "Calling pre-commit hook..." +msgstr "" + +#: lib/commit.tcl:242 +msgid "Commit declined by pre-commit hook." +msgstr "" + +#: lib/commit.tcl:265 +msgid "Calling commit-msg hook..." +msgstr "" + +#: lib/commit.tcl:280 +msgid "Commit declined by commit-msg hook." +msgstr "" + +#: lib/commit.tcl:293 +msgid "Committing changes..." +msgstr "Sjekker inn endringer..." + +#: lib/commit.tcl:309 +msgid "write-tree failed:" +msgstr "Skriving til tre feilet:" + +#: lib/commit.tcl:310 lib/commit.tcl:354 lib/commit.tcl:374 +msgid "Commit failed." +msgstr "Innsjekking feilet." + +#: lib/commit.tcl:327 +#, tcl-format +msgid "Commit %s appears to be corrupt" +msgstr "Revisjon %s ser ut til å være korrupt" + +#: lib/commit.tcl:332 +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 "" +"Ingen endringer til innsjekking.\n" +"\n" +"Ingen filer ble endret av denne revisjonen, og det var ikke en revisjon fra " +"en sammenslåing.\n" +"\n" +"Et nytt søk vil bli startet automatisk.\n" + +#: lib/commit.tcl:339 +msgid "No changes to commit." +msgstr "Ingen endringer til innsekking." + +#: lib/commit.tcl:353 +msgid "commit-tree failed:" +msgstr "commit-tree feilet:" + +#: lib/commit.tcl:373 +msgid "update-ref failed:" +msgstr "update-ref feilet:" + +#: lib/commit.tcl:461 +#, tcl-format +msgid "Created commit %s: %s" +msgstr "Opprettet innsjekking %s: %s" + +#: lib/console.tcl:59 +msgid "Working... please wait..." +msgstr "Jobber... Vennligst vent..." + +#: lib/console.tcl:186 +msgid "Success" +msgstr "Suksess" + +#: lib/console.tcl:200 +msgid "Error: Command Failed" +msgstr "Feil: Kommandoen feilet" + +#: lib/database.tcl:43 +msgid "Number of loose objects" +msgstr "Antall løse objekter" + +#: lib/database.tcl:44 +msgid "Disk space used by loose objects" +msgstr "Diskplass brukt av løse objekter" + +#: lib/database.tcl:45 +msgid "Number of packed objects" +msgstr "Antall pakkede objekter" + +#: lib/database.tcl:46 +msgid "Number of packs" +msgstr "Antall pakker" + +#: lib/database.tcl:47 +msgid "Disk space used by packed objects" +msgstr "Diskplass brukt av pakkede objekter" + +#: lib/database.tcl:48 +msgid "Packed objects waiting for pruning" +msgstr "Pakkede objekter som avventer fjerning" + +#: lib/database.tcl:49 +msgid "Garbage files" +msgstr "Avfallsfiler" + +#: lib/database.tcl:72 +msgid "Compressing the object database" +msgstr "Komprimerer objektdatabasen" + +#: lib/database.tcl:83 +msgid "Verifying the object database with fsck-objects" +msgstr "Verifiserer objektdatabasen med fsck-objects" + +#: lib/database.tcl:108 +#, 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 when more than %i loose objects exist.\n" +"\n" +"Compress the database now?" +msgstr "" +"Dette arkivet inneholder omtrent %i 'løse' objekter.\n" +"\n" +"For å sikre en optimal ytelse er det sterkt anbefalt at du komprimerer " +"databasen når det er flere enn %i 'løse' objekter i den.\n" +"\n" +"Komprimere databasen nå?" + +#: lib/date.tcl:25 +#, tcl-format +msgid "Invalid date from Git: %s" +msgstr "Ugyldig dato fra Git: %s" + +#: lib/diff.tcl:59 +#, tcl-format +msgid "" +"No differences detected.\n" +"\n" +"%s has no changes.\n" +"\n" +"The modification date of this file was updated by another application, but " +"the content within the file was not changed.\n" +"\n" +"A rescan will be automatically started to find other files which may have " +"the same state." +msgstr "" +"Ingen forandringer funnet.\n" +"\n" +"%s har ingen endringer.\n" +"\n" +"Tidsstempelet for endring på denne filen ble oppdatert av en annen " +" applikasjon, men innholdet er uendret.\n" +"\n" +"En gjennomsøking vil nå starte automatisk for å se om andre filer har " +"status." + +#: lib/diff.tcl:99 +#, tcl-format +msgid "Loading diff of %s..." +msgstr "Laster inn forskjellene av %s..." + +#: lib/diff.tcl:120 +msgid "" +"LOCAL: deleted\n" +"REMOTE:\n" +msgstr "LOKAL: slettet\n" +"FJERN:\n" + +#: lib/diff.tcl:125 +msgid "" +"REMOTE: deleted\n" +"LOCAL:\n" +msgstr "FJERN: slettet\n" +"LOKAL:\n" + +#: lib/diff.tcl:132 +msgid "LOCAL:\n" +msgstr "LOKAL:\n" + +#: lib/diff.tcl:135 +msgid "REMOTE:\n" +msgstr "FJERN:\n" + +#: lib/diff.tcl:197 lib/diff.tcl:296 +#, tcl-format +msgid "Unable to display %s" +msgstr "Kan ikke vise %s" + +#: lib/diff.tcl:198 +msgid "Error loading file:" +msgstr "Feil ved lesing av fil: %s" + +#: lib/diff.tcl:205 +msgid "Git Repository (subproject)" +msgstr "Git-arkiv (underprosjekt)" + +#: lib/diff.tcl:217 +msgid "* Binary file (not showing content)." +msgstr "* Binærfil (viser ikke innhold)" + +#: lib/diff.tcl:222 +#, tcl-format +msgid "" +"* Untracked file is %d bytes.\n" +"* Showing only first %d bytes.\n" +msgstr "" +"* Usporet fil er %d bytes.\n" +"* Viser bare %d første bytes.\n" + +#: lib/diff.tcl:228 +#, tcl-format +msgid "" +"\n" +"* Untracked file clipped here by %s.\n" +"* To see the entire file, use an external editor.\n" +msgstr "" +"\n" +"* Usporede filer klippet her av %s.\n" +"* For å se hele filen, bruk et eksternt redigeringsverktøy.\n" + +#: lib/diff.tcl:436 +msgid "Failed to unstage selected hunk." +msgstr "Kunne ikke fjerne den valgte delen fra innsjekkingskøen." + +#: lib/diff.tcl:443 +msgid "Failed to stage selected hunk." +msgstr "Kunne ikke legge til den valgte delen i innsjekkingskøen." + +#: lib/diff.tcl:509 +msgid "Failed to unstage selected line." +msgstr "Kunne ikke fjerne den valgte linjen fra innsjekkingskøen." + +#: lib/diff.tcl:517 +msgid "Failed to stage selected line." +msgstr "Kunne ikke legge til den valgte linjen i innsjekkingskøen." + +#: lib/encoding.tcl:443 +msgid "Default" +msgstr "Standard" + +#: lib/encoding.tcl:448 +#, tcl-format +msgid "System (%s)" +msgstr "Systemets (%s)" + +#: lib/encoding.tcl:459 lib/encoding.tcl:465 +msgid "Other" +msgstr "Andre" + +#: lib/error.tcl:20 lib/error.tcl:114 +msgid "error" +msgstr "feil" + +#: lib/error.tcl:36 +msgid "warning" +msgstr "advarsel" + +#: lib/error.tcl:94 +msgid "You must correct the above errors before committing." +msgstr "Du må rette de ovenstående feilene før innsjekking." + +#: lib/index.tcl:6 +msgid "Unable to unlock the index." +msgstr "Kunne ikke låse opp indexen." + +#: lib/index.tcl:15 +msgid "Index Error" +msgstr "Feil på index" + +#: lib/index.tcl:21 +msgid "" +"Updating the Git index failed. A rescan will be automatically started to " +"resynchronize git-gui." +msgstr "" +"Oppdatering av Git's index mislyktes. Et nytt søk vil bli startet for å " +"resynkronisere git-gui." + +#: lib/index.tcl:27 +msgid "Continue" +msgstr "Fortsett" + +#: lib/index.tcl:31 +msgid "Unlock Index" +msgstr "Lås opp index" + +#: lib/index.tcl:287 +#, tcl-format +msgid "Unstaging %s from commit" +msgstr "Fjerner %s fra innsjekkingskøen" + +#: lib/index.tcl:326 +msgid "Ready to commit." +msgstr "Klar til innsjekking." + +#: lib/index.tcl:339 +#, tcl-format +msgid "Adding %s" +msgstr "Legger til %s" + +#: lib/index.tcl:396 +#, tcl-format +msgid "Revert changes in file %s?" +msgstr "Reverter endringene i filen %s?" + +#: lib/index.tcl:398 +#, tcl-format +msgid "Revert changes in these %i files?" +msgstr "Reverter endringene i disse %i filene?" + +#: lib/index.tcl:406 +msgid "Any unstaged changes will be permanently lost by the revert." +msgstr "Endringer som ikke ligger i innsjekkingskøen vil bli tapt av denne " +"reverteringen" + +#: lib/index.tcl:409 +msgid "Do Nothing" +msgstr "Ikke gjør noe" + +#: lib/index.tcl:427 +msgid "Reverting selected files" +msgstr "Reverterer valgte filer" + +#: lib/index.tcl:431 +#, tcl-format +msgid "Reverting %s" +msgstr "Reverterer %s" + +#: lib/merge.tcl:13 +msgid "" +"Cannot merge while amending.\n" +"\n" +"You must finish amending this commit before starting any type of merge.\n" +msgstr "" +"Kunne ikke slå sammen under utvidelse.\n" +"\n" +"Du må først fullføre utvidelsen av denne revisjonen før du kan starte en " +"sammenslåing.\n" + +#: lib/merge.tcl:27 +msgid "" +"Last scanned state does not match repository state.\n" +"\n" +"Another Git program has modified this repository since the last scan. A " +"rescan must be performed before a merge can be performed.\n" +"\n" +"The rescan will be automatically started now.\n" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: lib/merge.tcl:107 +#, tcl-format +msgid "%s of %s" +msgstr "%s av %s" + +#: lib/merge.tcl:120 +#, tcl-format +msgid "Merging %s and %s..." +msgstr "Slår sammen %s og %s" + +#: lib/merge.tcl:131 +msgid "Merge completed successfully." +msgstr "Vellykket sammenslåing fullført." + +#: lib/merge.tcl:133 +msgid "Merge failed. Conflict resolution is required." +msgstr "Sammenslåing feilet. Håndtering av konflikten kreves." + +#: lib/merge.tcl:158 +#, tcl-format +msgid "Merge Into %s" +msgstr "Slå sammen inn i %s" + +#: lib/merge.tcl:177 +msgid "Revision To Merge" +msgstr "Revisjon til sammenslåing" + +#: lib/merge.tcl:212 +msgid "" +"Cannot abort while amending.\n" +"\n" +"You must finish amending this commit.\n" +msgstr "" +"Kan ikke avbryte under utvidelse av revisjon.\n" +"\n" +"Du må fullføre utvidelsen av denne revisjonen.\n" + +#: 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 sammenslåing?\n" +"\n" +"Avbryting av pågående sammenslåing vil føre til at *alle* endringer som ikke " +" er sjekket inn, vil gå tapt.\n" +"\n" +"Fortsette med å avbryte den pågående sammenslåingen?" + +#: 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 "" +"Nullstill endringer?\n" +"\n" +"Nullstilling av endringer vil føre til at *alle* endringer som ikke er " +"sjekket inn går tapt.\n" +"\n" +"Fortsette med nullstilling av endringer?" + +#: lib/merge.tcl:239 +msgid "Aborting" +msgstr "Avbryter" + +#: lib/merge.tcl:239 +msgid "files reset" +msgstr "filer tilbakestilt" + +#: lib/merge.tcl:267 +msgid "Abort failed." +msgstr "Avbryting feilet." + +#: lib/merge.tcl:269 +msgid "Abort completed. Ready." +msgstr "Avbryting fullført. Klar." + +#: lib/mergetool.tcl:8 +msgid "Force resolution to the base version?" +msgstr "Tving håndtering til opprinnelig versjon?" + +#: lib/mergetool.tcl:9 +msgid "Force resolution to this branch?" +msgstr "Tving håndtering i denne grenen?" + +#: lib/mergetool.tcl:10 +msgid "Force resolution to the other branch?" +msgstr "Tving håndtering i den andre grenen?" + +#: lib/mergetool.tcl:14 +#, tcl-format +msgid "" +"Note that the diff shows only conflicting changes.\n" +"\n" +"%s will be overwritten.\n" +"\n" +"This operation can be undone only by restarting the merge." +msgstr "" +"Merk deg at endringsvisningen kun viser motstridende endringer.\n" +"\n" +"%s vil bli overskrevet.\n" +"\n" +"Denne operasjonen kan kun bli angret ved å starte sammenslåingen på ny." + +#: lib/mergetool.tcl:45 +#, tcl-format +msgid "File %s seems to have unresolved conflicts, still stage?" +msgstr "Filen %s ser ut til å ha uløste konflikter, skal filen likevel køes?" + +#: lib/mergetool.tcl:60 +#, tcl-format +msgid "Adding resolution for %s" +msgstr "Legger til løsninge på konflikt for %s" + +#: lib/mergetool.tcl:141 +msgid "Cannot resolve deletion or link conflicts using a tool" +msgstr "" + +#: lib/mergetool.tcl:146 +msgid "Conflict file does not exist" +msgstr "Konfliktfil eksisterer ikke" + +#: lib/mergetool.tcl:264 +#, tcl-format +msgid "Not a GUI merge tool: '%s'" +msgstr "" + +#: lib/mergetool.tcl:268 +#, tcl-format +msgid "Unsupported merge tool '%s'" +msgstr "" + +#: lib/mergetool.tcl:303 +msgid "Merge tool is already running, terminate it?" +msgstr "" + +#: lib/mergetool.tcl:323 +#, tcl-format +msgid "" +"Error retrieving versions:\n" +"%s" +msgstr "" +"Kunne ikke hente versjoner:\n" +"%s" + +#: lib/mergetool.tcl:343 +#, tcl-format +msgid "" +"Could not start the merge tool:\n" +"\n" +"%s" +msgstr "" + +#: lib/mergetool.tcl:347 +msgid "Running merge tool..." +msgstr "" + +#: lib/mergetool.tcl:375 lib/mergetool.tcl:383 +msgid "Merge tool failed." +msgstr "" + +#: lib/option.tcl:11 +#, tcl-format +msgid "Invalid global encoding '%s'" +msgstr "" + +#: lib/option.tcl:19 +#, tcl-format +msgid "Invalid repo encoding '%s'" +msgstr "" + +#: lib/option.tcl:117 +msgid "Restore Defaults" +msgstr "Gjennopprett standardverdier" + +#: lib/option.tcl:121 +msgid "Save" +msgstr "Lagre" + +#: lib/option.tcl:131 +#, tcl-format +msgid "%s Repository" +msgstr "%s arkiv" + +#: lib/option.tcl:132 +msgid "Global (All Repositories)" +msgstr "Globalt (alle arkiv)" + +#: lib/option.tcl:138 +msgid "User Name" +msgstr "Navn" + +#: lib/option.tcl:139 +msgid "Email Address" +msgstr "Epost-adresse" + +#: lib/option.tcl:141 +msgid "Summarize Merge Commits" +msgstr "Oppsummer innsjekkinger fra sammenslåinger" + +#: lib/option.tcl:142 +msgid "Merge Verbosity" +msgstr "Detaljenivå på sammenslåing" + +#: lib/option.tcl:143 +msgid "Show Diffstat After Merge" +msgstr "Vis endringsstatistikk etter sammenslåing" + +#: lib/option.tcl:144 +msgid "Use Merge Tool" +msgstr "Bruk sammenslåingsverktøy" + +#: lib/option.tcl:146 +msgid "Trust File Modification Timestamps" +msgstr "Stol på filers tid for endring" + +#: lib/option.tcl:147 +msgid "Prune Tracking Branches During Fetch" +msgstr "" + +#: lib/option.tcl:148 +msgid "Match Tracking Branches" +msgstr "" + +#: lib/option.tcl:149 +msgid "Blame Copy Only On Changed Files" +msgstr "" + +#: lib/option.tcl:150 +msgid "Minimum Letters To Blame Copy On" +msgstr "" + +#: lib/option.tcl:151 +msgid "Blame History Context Radius (days)" +msgstr "" + +#: lib/option.tcl:152 +msgid "Number of Diff Context Lines" +msgstr "Antall linjer sammenhengende endringer" + +#: lib/option.tcl:153 +msgid "Commit Message Text Width" +msgstr "Tekstbredde for vindu til innsjekkingsmeldinger" + +#: lib/option.tcl:154 +msgid "New Branch Name Template" +msgstr "Mal for navn på nye grener" + +#: lib/option.tcl:155 +msgid "Default File Contents Encoding" +msgstr "Standard tekstenkoding for innhold i filer" + +#: lib/option.tcl:203 +msgid "Change" +msgstr "Endre" + +#: lib/option.tcl:230 +msgid "Spelling Dictionary:" +msgstr "Stavebokordlister:" + +#: lib/option.tcl:254 +msgid "Change Font" +msgstr "Endre skrifttype" + +#: lib/option.tcl:258 +#, tcl-format +msgid "Choose %s" +msgstr "Velg %s" + +#: lib/option.tcl:264 +msgid "pt." +msgstr "pt." + +#: lib/option.tcl:278 +msgid "Preferences" +msgstr "Egenskaper" + +#: lib/option.tcl:314 +msgid "Failed to completely save options:" +msgstr "Kunne ikke lagre alternativ:" + +#: lib/remote.tcl:163 +msgid "Remove Remote" +msgstr "Fjern fjernarkiv" + +#: lib/remote.tcl:168 +msgid "Prune from" +msgstr "Fjern fra" + +#: lib/remote.tcl:173 +msgid "Fetch from" +msgstr "Hent fra" + +#: lib/remote.tcl:215 +msgid "Push to" +msgstr "Send til" + +#: lib/remote_add.tcl:19 +msgid "Add Remote" +msgstr "Legg til fjernarkiv" + +#: lib/remote_add.tcl:24 +msgid "Add New Remote" +msgstr "Legg til nytt fjernarkiv" + +#: lib/remote_add.tcl:28 lib/tools_dlg.tcl:36 +msgid "Add" +msgstr "Legg til" + +#: lib/remote_add.tcl:37 +msgid "Remote Details" +msgstr "Detaljer for fjernarkiv" + +#: lib/remote_add.tcl:50 +msgid "Location:" +msgstr "Lokasjon:" + +#: lib/remote_add.tcl:62 +msgid "Further Action" +msgstr "Videre handling" + +#: lib/remote_add.tcl:65 +msgid "Fetch Immediately" +msgstr "Hent umiddelbart" + +#: lib/remote_add.tcl:71 +msgid "Initialize Remote Repository and Push" +msgstr "Initsialiser og send til fjernarkiv" + +#: lib/remote_add.tcl:77 +msgid "Do Nothing Else Now" +msgstr "Ikke gjør mer nå" + +#: lib/remote_add.tcl:101 +msgid "Please supply a remote name." +msgstr "Vennligst angi et navn for fjernarkivet." + +#: lib/remote_add.tcl:114 +#, tcl-format +msgid "'%s' is not an acceptable remote name." +msgstr "'%s' er ikke et tillatt navn for et fjernarkiv." + +#: lib/remote_add.tcl:125 +#, tcl-format +msgid "Failed to add remote '%s' of location '%s'." +msgstr "Kunne ikke legge til fjernarkivet '%s' på '%s'." + +#: lib/remote_add.tcl:133 lib/transport.tcl:6 +#, tcl-format +msgid "fetch %s" +msgstr "hent %s" + +#: lib/remote_add.tcl:134 +#, tcl-format +msgid "Fetching the %s" +msgstr "Henter %s" + +#: lib/remote_add.tcl:157 +#, tcl-format +msgid "Do not know how to initialize repository at location '%s'." +msgstr "Vet ikke hvordan arkiv på '%s' skal opprettes." + +#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:71 +#, tcl-format +msgid "push %s" +msgstr "send %s" + +#: lib/remote_add.tcl:164 +#, tcl-format +msgid "Setting up the %s (at %s)" +msgstr "Initsialiserer %s (på %s)" + +#: lib/remote_branch_delete.tcl:29 lib/remote_branch_delete.tcl:34 +msgid "Delete Branch Remotely" +msgstr "Fjern gren fra fjernarkiv" + +#: lib/remote_branch_delete.tcl:47 +msgid "From Repository" +msgstr "Fra arkiv" + +#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:123 +msgid "Remote:" +msgstr "Fjernarkiv:" + +#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:138 +msgid "Arbitrary Location:" +msgstr "Vilkårlig lokasjon:" + +#: lib/remote_branch_delete.tcl:84 +msgid "Branches" +msgstr "Grener" + +#: lib/remote_branch_delete.tcl:109 +msgid "Delete Only If" +msgstr "Slett kun hvis" + +#: lib/remote_branch_delete.tcl:111 +msgid "Merged Into:" +msgstr "Slått sammen i:" + +#: lib/remote_branch_delete.tcl:119 +msgid "Always (Do not perform merge checks)" +msgstr "Alltid (Ikke utfør sammenslåingskontroll)" + +#: lib/remote_branch_delete.tcl:152 +msgid "A branch is required for 'Merged Into'." +msgstr "En gren kreves for 'sammenslåing i'." + +#: lib/remote_branch_delete.tcl:184 +#, tcl-format +msgid "" +"The following branches are not completely merged into %s:\n" +"\n" +" - %s" +msgstr "" +"Følgende grener er ikke fullestendig sammenslått med %s:\n" +"\n" +" - %s" + +#: lib/remote_branch_delete.tcl:189 +#, tcl-format +msgid "" +"One or more of the merge tests failed because you have not fetched the " +"necessary commits. Try fetching from %s first." +msgstr "" +"En eller flere av testene som blir kjørt under sammenslåing feilet fordi du" +"ikke har hentet inn de nødvendige innsjekkingene. Prøv å hent disse fra %s" +"først" + +#: lib/remote_branch_delete.tcl:207 +msgid "Please select one or more branches to delete." +msgstr "Velg en eller flere grener som skal fjernes." + +#: lib/remote_branch_delete.tcl:216 +msgid "" +"Recovering deleted branches is difficult.\n" +"\n" +"Delete the selected branches?" +msgstr "" +"Gjenoppretting av fjernede grener er vanskelig.\n" +"\n" +"Fjern den merkede grenen?" + +#: lib/remote_branch_delete.tcl:226 +#, tcl-format +msgid "Deleting branches from %s" +msgstr "Fjerner grenene fra %s" + +#: lib/remote_branch_delete.tcl:286 +msgid "No repository selected." +msgstr "Ingen arkiv valgt." + +#: lib/remote_branch_delete.tcl:291 +#, tcl-format +msgid "Scanning %s..." +msgstr "Søker %s..." + +#: lib/search.tcl:21 +msgid "Find:" +msgstr "Finn:" + +#: lib/search.tcl:23 +msgid "Next" +msgstr "Neste" + +#: lib/search.tcl:24 +msgid "Prev" +msgstr "Forrige" + +#: lib/search.tcl:25 +msgid "Case-Sensitive" +msgstr "Skiller på store og små bokstaver" + +#: lib/shortcut.tcl:20 lib/shortcut.tcl:61 +msgid "Cannot write shortcut:" +msgstr "Kan ikke opprette snarvei:" + +#: lib/shortcut.tcl:136 +msgid "Cannot write icon:" +msgstr "Kan ikke opprette ikon:" + +#: lib/spellcheck.tcl:57 +msgid "Unsupported spell checker" +msgstr "Stavekontrolleren er ikke støttet" + +#: lib/spellcheck.tcl:65 +msgid "Spell checking is unavailable" +msgstr "Stavekontroll er ikke tilgjengelig" + +#: lib/spellcheck.tcl:68 +msgid "Invalid spell checking configuration" +msgstr "Ugyldig stavekontroll-konfigurasjon" + +#: lib/spellcheck.tcl:70 +#, tcl-format +msgid "Reverting dictionary to %s." +msgstr "Reverterer ordbok til %s." + +#: lib/spellcheck.tcl:73 +msgid "Spell checker silently failed on startup" +msgstr "Stavekontrollen feilet stille under oppstart" + +#: lib/spellcheck.tcl:80 +msgid "Unrecognized spell checker" +msgstr "Stavekontrolleren er ukjent" + +#: lib/spellcheck.tcl:186 +msgid "No Suggestions" +msgstr "Ingen forslag" + +#: lib/spellcheck.tcl:388 +msgid "Unexpected EOF from spell checker" +msgstr "Uventet slutt på filen fra stavekontrollen" + +#: lib/spellcheck.tcl:392 +msgid "Spell Checker Failed" +msgstr "Stavekontroll mislyktes" + +#: lib/sshkey.tcl:31 +msgid "No keys found." +msgstr "Ingen nøkler funnet." + +#: lib/sshkey.tcl:34 +#, tcl-format +msgid "Found a public key in: %s" +msgstr "Funnet en offentlig nøkkel i: %s" + +#: lib/sshkey.tcl:40 +msgid "Generate Key" +msgstr "Generer nøkkel" + +#: lib/sshkey.tcl:56 +msgid "Copy To Clipboard" +msgstr "Kopier til utklippstavlen" + +#: lib/sshkey.tcl:70 +msgid "Your OpenSSH Public Key" +msgstr "Din offentlige OpenSSH-nøkkel" + +#: lib/sshkey.tcl:78 +msgid "Generating..." +msgstr "Genererer..." + +#: lib/sshkey.tcl:84 +#, tcl-format +msgid "" +"Could not start ssh-keygen:\n" +"\n" +"%s" +msgstr "" +"Kunne ikke starte ssh-keygen:\n" +"\n" +"%s" + +#: lib/sshkey.tcl:111 +msgid "Generation failed." +msgstr "Generering feilet." + +#: lib/sshkey.tcl:118 +msgid "Generation succeded, but no keys found." +msgstr "Generering vellykket, men ingen nøkler er funnet." + +#: lib/sshkey.tcl:121 +#, tcl-format +msgid "Your key is in: %s" +msgstr "Nøkkelen din ligger i: %s" + +#: lib/status_bar.tcl:83 +#, tcl-format +msgid "%s ... %*i of %*i %s (%3i%%)" +msgstr "%s ... %*i av %*i %s (%3i%%)" + +#: lib/tools.tcl:75 +#, tcl-format +msgid "Running %s requires a selected file." +msgstr "Å kjøre %s krever at en fil er valgt" + +#: lib/tools.tcl:90 +#, tcl-format +msgid "Are you sure you want to run %s?" +msgstr "Er du sikker på at du vil kjøre %s?" + +#: lib/tools.tcl:110 +#, tcl-format +msgid "Tool: %s" +msgstr "Verktøy: %s" + +#: lib/tools.tcl:111 +#, tcl-format +msgid "Running: %s" +msgstr "Kjører: %s" + +#: lib/tools.tcl:149 +#, tcl-format +msgid "Tool completed succesfully: %s" +msgstr "Verktøyet ble fullført med suksess: %s" + +#: lib/tools.tcl:151 +#, tcl-format +msgid "Tool failed: %s" +msgstr "Verktøy feilet: %s" + +#: lib/tools_dlg.tcl:22 +msgid "Add Tool" +msgstr "Legg til verktøy" + +#: lib/tools_dlg.tcl:28 +msgid "Add New Tool Command" +msgstr "Legg til ny verktøykommando" + +#: lib/tools_dlg.tcl:33 +msgid "Add globally" +msgstr "Legg til globalt" + +#: lib/tools_dlg.tcl:45 +msgid "Tool Details" +msgstr "Verktøydetaljer" + +#: lib/tools_dlg.tcl:48 +msgid "Use '/' separators to create a submenu tree:" +msgstr "Bruk '/'-separator for å lage undermenyer:" + +#: lib/tools_dlg.tcl:61 +msgid "Command:" +msgstr "Kommando:" + +#: lib/tools_dlg.tcl:74 +msgid "Show a dialog before running" +msgstr "Vis en dialog før start" + +#: lib/tools_dlg.tcl:80 +msgid "Ask the user to select a revision (sets $REVISION)" +msgstr "Spør brukeren om å velge en revisjon (setter $REVISION)" + +#: lib/tools_dlg.tcl:85 +msgid "Ask the user for additional arguments (sets $ARGS)" +msgstr "Spør brukeren for ytterligere paramtere (setter $ARGS)" + +#: lib/tools_dlg.tcl:92 +msgid "Don't show the command output window" +msgstr "Ikke vis kommandoens utdata i vinduet" + +#: lib/tools_dlg.tcl:97 +msgid "Run only if a diff is selected ($FILENAME not empty)" +msgstr "Kjør kun om forskjellene er markert ($FILENAME er ikke tom)" + +#: lib/tools_dlg.tcl:121 +msgid "Please supply a name for the tool." +msgstr "Vennligst angi et navn for dette verktøyet." + +#: lib/tools_dlg.tcl:129 +#, tcl-format +msgid "Tool '%s' already exists." +msgstr "Verktøyet '%s' eksisterer allerede." + +#: lib/tools_dlg.tcl:151 +#, tcl-format +msgid "" +"Could not add tool:\n" +"%s" +msgstr "" +"Kunne ikke legge til verktøyet:\n" +"%s" + +#: lib/tools_dlg.tcl:190 +msgid "Remove Tool" +msgstr "Fjern verktøyet" + +#: lib/tools_dlg.tcl:196 +msgid "Remove Tool Commands" +msgstr "Fjern verktøyskommandoen" + +#: lib/tools_dlg.tcl:200 +msgid "Remove" +msgstr "Fjern" + +#: lib/tools_dlg.tcl:236 +msgid "(Blue denotes repository-local tools)" +msgstr "(Blue angir lokale verktøy til arkivet)" + +#: lib/tools_dlg.tcl:297 +#, tcl-format +msgid "Run Command: %s" +msgstr "Kjør kommando: %s" + +#: lib/tools_dlg.tcl:311 +msgid "Arguments" +msgstr "Argumenter" + +#: lib/tools_dlg.tcl:348 +msgid "OK" +msgstr "OK" + +#: lib/transport.tcl:7 +#, tcl-format +msgid "Fetching new changes from %s" +msgstr "Henter nye endringer fra %s" + +#: lib/transport.tcl:18 +#, tcl-format +msgid "remote prune %s" +msgstr "slett fjernarkiv %s" + +#: lib/transport.tcl:19 +#, tcl-format +msgid "Pruning tracking branches deleted from %s" +msgstr "Fjrner sporing av grener slettet fra %s" + +#: lib/transport.tcl:26 +#, tcl-format +msgid "Pushing changes to %s" +msgstr "Sender endringer til %s" + +#: lib/transport.tcl:72 +#, tcl-format +msgid "Pushing %s %s to %s" +msgstr "Sender %s %s til %s" + +#: lib/transport.tcl:89 +msgid "Push Branches" +msgstr "Send grener" + +#: lib/transport.tcl:103 +msgid "Source Branches" +msgstr "Kildegrener" + +#: lib/transport.tcl:120 +msgid "Destination Repository" +msgstr "Destinasjonsarkiv" + +#: lib/transport.tcl:158 +msgid "Transfer Options" +msgstr "Overføringsalternativer" + +#: lib/transport.tcl:160 +msgid "Force overwrite existing branch (may discard changes)" +msgstr "Tving overskrivning av eksisterende gren (kan forkaste endringer)" + +#: lib/transport.tcl:164 +msgid "Use thin pack (for slow network connections)" +msgstr "Bruk tynne pakker (for tregere nettverkstilkoblinger)" + +#: lib/transport.tcl:168 +msgid "Include tags" +msgstr "Inkluder tagger" diff --git a/git-gui/po/sv.po b/git-gui/po/sv.po index d434220b13..167654c709 100644 --- a/git-gui/po/sv.po +++ b/git-gui/po/sv.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: sv\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-11-16 13:56-0800\n" -"PO-Revision-Date: 2008-11-21 08:35+0100\n" +"POT-Creation-Date: 2008-12-08 08:31-0800\n" +"PO-Revision-Date: 2008-12-10 09:49+0100\n" "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n" "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" "MIME-Version: 1.0\n" @@ -87,11 +87,15 @@ msgstr "Söker efter ändrade filer..." #: git-gui.sh:1367 msgid "Calling prepare-commit-msg hook..." -msgstr "Anropar kroken för förberedning av incheckningsmeddelande (prepare-commit-msg)..." +msgstr "" +"Anropar kroken för förberedelse av incheckningsmeddelande (prepare-commit-" +"msg)..." #: git-gui.sh:1384 msgid "Commit declined by prepare-commit-msg hook." -msgstr "Incheckningen avvisades av kroken för förberedning av incheckningsmeddelande (prepare-commit-msg)." +msgstr "" +"Incheckningen avvisades av kroken för förberedelse av incheckningsmeddelande " +"(prepare-commit-msg)." #: git-gui.sh:1542 lib/browser.tcl:246 msgid "Ready." @@ -241,25 +245,25 @@ msgstr "Ångra" msgid "Redo" msgstr "Gör om" -#: git-gui.sh:2378 git-gui.sh:2923 +#: git-gui.sh:2378 git-gui.sh:2937 msgid "Cut" msgstr "Klipp ut" -#: git-gui.sh:2381 git-gui.sh:2926 git-gui.sh:3000 git-gui.sh:3082 +#: git-gui.sh:2381 git-gui.sh:2940 git-gui.sh:3014 git-gui.sh:3096 #: lib/console.tcl:69 msgid "Copy" msgstr "Kopiera" -#: git-gui.sh:2384 git-gui.sh:2929 +#: git-gui.sh:2384 git-gui.sh:2943 msgid "Paste" msgstr "Klistra in" -#: git-gui.sh:2387 git-gui.sh:2932 lib/branch_delete.tcl:26 +#: git-gui.sh:2387 git-gui.sh:2946 lib/branch_delete.tcl:26 #: lib/remote_branch_delete.tcl:38 msgid "Delete" msgstr "Ta bort" -#: git-gui.sh:2391 git-gui.sh:2936 git-gui.sh:3086 lib/console.tcl:71 +#: git-gui.sh:2391 git-gui.sh:2950 git-gui.sh:3100 lib/console.tcl:71 msgid "Select All" msgstr "Markera alla" @@ -291,15 +295,15 @@ msgstr "Färdig" msgid "Commit@@verb" msgstr "Checka in" -#: git-gui.sh:2443 git-gui.sh:2864 +#: git-gui.sh:2443 git-gui.sh:2878 msgid "New Commit" msgstr "Ny incheckning" -#: git-gui.sh:2451 git-gui.sh:2871 +#: git-gui.sh:2451 git-gui.sh:2885 msgid "Amend Last Commit" msgstr "Lägg till föregående incheckning" -#: git-gui.sh:2461 git-gui.sh:2825 lib/remote_branch_delete.tcl:99 +#: git-gui.sh:2461 git-gui.sh:2839 lib/remote_branch_delete.tcl:99 msgid "Rescan" msgstr "Sök på nytt" @@ -319,15 +323,15 @@ msgstr "Ta bort från incheckningskö" msgid "Revert Changes" msgstr "Återställ ändringar" -#: git-gui.sh:2491 git-gui.sh:3069 +#: git-gui.sh:2491 git-gui.sh:3083 msgid "Show Less Context" msgstr "Visa mindre sammanhang" -#: git-gui.sh:2495 git-gui.sh:3073 +#: git-gui.sh:2495 git-gui.sh:3087 msgid "Show More Context" msgstr "Visa mer sammanhang" -#: git-gui.sh:2502 git-gui.sh:2838 git-gui.sh:2947 +#: git-gui.sh:2502 git-gui.sh:2852 git-gui.sh:2961 msgid "Sign Off" msgstr "Skriv under" @@ -361,7 +365,7 @@ msgstr "Om %s" msgid "Preferences..." msgstr "Inställningar..." -#: git-gui.sh:2565 git-gui.sh:3115 +#: git-gui.sh:2565 git-gui.sh:3129 msgid "Options..." msgstr "Alternativ..." @@ -381,125 +385,125 @@ msgstr "Webbdokumentation" msgid "Show SSH Key" msgstr "Visa SSH-nyckel" -#: git-gui.sh:2707 +#: git-gui.sh:2721 #, 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:2740 +#: git-gui.sh:2754 msgid "Current Branch:" msgstr "Aktuell gren:" -#: git-gui.sh:2761 +#: git-gui.sh:2775 msgid "Staged Changes (Will Commit)" msgstr "Köade ändringar (kommer att checkas in)" -#: git-gui.sh:2781 +#: git-gui.sh:2795 msgid "Unstaged Changes" msgstr "Oköade ändringar" -#: git-gui.sh:2831 +#: git-gui.sh:2845 msgid "Stage Changed" msgstr "Köa ändrade" -#: git-gui.sh:2850 lib/transport.tcl:93 lib/transport.tcl:182 +#: git-gui.sh:2864 lib/transport.tcl:104 lib/transport.tcl:193 msgid "Push" msgstr "Sänd" -#: git-gui.sh:2885 +#: git-gui.sh:2899 msgid "Initial Commit Message:" msgstr "Inledande incheckningsmeddelande:" -#: git-gui.sh:2886 +#: git-gui.sh:2900 msgid "Amended Commit Message:" msgstr "Utökat incheckningsmeddelande:" -#: git-gui.sh:2887 +#: git-gui.sh:2901 msgid "Amended Initial Commit Message:" msgstr "Utökat inledande incheckningsmeddelande:" -#: git-gui.sh:2888 +#: git-gui.sh:2902 msgid "Amended Merge Commit Message:" msgstr "Utökat incheckningsmeddelande för sammanslagning:" -#: git-gui.sh:2889 +#: git-gui.sh:2903 msgid "Merge Commit Message:" msgstr "Incheckningsmeddelande för sammanslagning:" -#: git-gui.sh:2890 +#: git-gui.sh:2904 msgid "Commit Message:" msgstr "Incheckningsmeddelande:" -#: git-gui.sh:2939 git-gui.sh:3090 lib/console.tcl:73 +#: git-gui.sh:2953 git-gui.sh:3104 lib/console.tcl:73 msgid "Copy All" msgstr "Kopiera alla" -#: git-gui.sh:2963 lib/blame.tcl:104 +#: git-gui.sh:2977 lib/blame.tcl:104 msgid "File:" msgstr "Fil:" -#: git-gui.sh:3078 +#: git-gui.sh:3092 msgid "Refresh" msgstr "Uppdatera" -#: git-gui.sh:3099 +#: git-gui.sh:3113 msgid "Decrease Font Size" msgstr "Minska teckensnittsstorlek" -#: git-gui.sh:3103 +#: git-gui.sh:3117 msgid "Increase Font Size" msgstr "Öka teckensnittsstorlek" -#: git-gui.sh:3111 lib/blame.tcl:281 +#: git-gui.sh:3125 lib/blame.tcl:281 msgid "Encoding" msgstr "Teckenkodning" -#: git-gui.sh:3122 +#: git-gui.sh:3136 msgid "Apply/Reverse Hunk" msgstr "Använd/återställ del" -#: git-gui.sh:3127 +#: git-gui.sh:3141 msgid "Apply/Reverse Line" msgstr "Använd/återställ rad" -#: git-gui.sh:3137 +#: git-gui.sh:3151 msgid "Run Merge Tool" msgstr "Starta verktyg för sammanslagning" -#: git-gui.sh:3142 +#: git-gui.sh:3156 msgid "Use Remote Version" msgstr "Använd versionen från fjärrarkivet" -#: git-gui.sh:3146 +#: git-gui.sh:3160 msgid "Use Local Version" msgstr "Använd lokala versionen" -#: git-gui.sh:3150 +#: git-gui.sh:3164 msgid "Revert To Base" msgstr "Återställ till basversionen" -#: git-gui.sh:3169 +#: git-gui.sh:3183 msgid "Unstage Hunk From Commit" msgstr "Ta bort del ur incheckningskö" -#: git-gui.sh:3170 +#: git-gui.sh:3184 msgid "Unstage Line From Commit" msgstr "Ta bort rad ur incheckningskö" -#: git-gui.sh:3172 +#: git-gui.sh:3186 msgid "Stage Hunk For Commit" msgstr "Ställ del i incheckningskö" -#: git-gui.sh:3173 +#: git-gui.sh:3187 msgid "Stage Line For Commit" msgstr "Ställ rad i incheckningskö" -#: git-gui.sh:3196 +#: git-gui.sh:3210 msgid "Initializing..." msgstr "Initierar..." -#: git-gui.sh:3301 +#: git-gui.sh:3315 #, tcl-format msgid "" "Possible environment issues exist.\n" @@ -516,7 +520,7 @@ msgstr "" "av %s:\n" "\n" -#: git-gui.sh:3331 +#: git-gui.sh:3345 msgid "" "\n" "This is due to a known issue with the\n" @@ -526,7 +530,7 @@ msgstr "" "Detta beror på ett känt problem med\n" "Tcl-binären som följer med Cygwin." -#: git-gui.sh:3336 +#: git-gui.sh:3350 #, tcl-format msgid "" "\n" @@ -612,43 +616,43 @@ msgstr "Kör grundlig kopieringsigenkänning..." msgid "Loading annotation..." msgstr "Läser in annotering..." -#: lib/blame.tcl:964 +#: lib/blame.tcl:963 msgid "Author:" msgstr "Författare:" -#: lib/blame.tcl:968 +#: lib/blame.tcl:967 msgid "Committer:" msgstr "Incheckare:" -#: lib/blame.tcl:973 +#: lib/blame.tcl:972 msgid "Original File:" msgstr "Ursprunglig fil:" -#: lib/blame.tcl:1021 +#: lib/blame.tcl:1020 msgid "Cannot find HEAD commit:" msgstr "Hittar inte incheckning för HEAD:" -#: lib/blame.tcl:1076 +#: lib/blame.tcl:1075 msgid "Cannot find parent commit:" msgstr "Hittar inte föräldraincheckning:" -#: lib/blame.tcl:1091 +#: lib/blame.tcl:1090 msgid "Unable to display parent" msgstr "Kan inte visa förälder" -#: lib/blame.tcl:1092 lib/diff.tcl:297 +#: lib/blame.tcl:1091 lib/diff.tcl:297 msgid "Error loading diff:" msgstr "Fel vid inläsning av differens:" -#: lib/blame.tcl:1232 +#: lib/blame.tcl:1231 msgid "Originally By:" msgstr "Ursprungligen av:" -#: lib/blame.tcl:1238 +#: lib/blame.tcl:1237 msgid "In File:" msgstr "I filen:" -#: lib/blame.tcl:1243 +#: lib/blame.tcl:1242 msgid "Copied Or Moved Here By:" msgstr "Kopierad eller flyttad hit av:" @@ -665,7 +669,7 @@ msgstr "Checka ut" #: lib/checkout_op.tcl:544 lib/choose_font.tcl:43 lib/merge.tcl:172 #: lib/option.tcl:125 lib/remote_add.tcl:32 lib/remote_branch_delete.tcl:42 #: lib/tools_dlg.tcl:40 lib/tools_dlg.tcl:204 lib/tools_dlg.tcl:352 -#: lib/transport.tcl:97 +#: lib/transport.tcl:108 msgid "Cancel" msgstr "Avbryt" @@ -1314,19 +1318,19 @@ msgstr "" "utöka tidigare incheckningar om du inte först avbryter den pågående " "sammanslagningen.\n" -#: lib/commit.tcl:49 +#: 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:76 +#: lib/commit.tcl:75 msgid "Unable to obtain your identity:" msgstr "Kunde inte hämta din identitet:" -#: lib/commit.tcl:81 +#: lib/commit.tcl:80 msgid "Invalid GIT_COMMITTER_IDENT:" msgstr "Felaktig GIT_COMMITTER_IDENT:" -#: lib/commit.tcl:133 +#: lib/commit.tcl:132 msgid "" "Last scanned state does not match repository state.\n" "\n" @@ -1342,7 +1346,7 @@ msgstr "" "\n" "Sökningen kommer att startas automatiskt nu.\n" -#: lib/commit.tcl:156 +#: lib/commit.tcl:155 #, tcl-format msgid "" "Unmerged files cannot be committed.\n" @@ -1355,7 +1359,7 @@ msgstr "" "Filen %s har sammanslagningskonflikter. Du måste lösa dem och köa filen " "innan du checkar in den.\n" -#: lib/commit.tcl:164 +#: lib/commit.tcl:163 #, tcl-format msgid "" "Unknown file state %s detected.\n" @@ -1366,7 +1370,7 @@ msgstr "" "\n" "Filen %s kan inte checkas in av programmet.\n" -#: lib/commit.tcl:172 +#: lib/commit.tcl:171 msgid "" "No changes to commit.\n" "\n" @@ -1376,7 +1380,7 @@ msgstr "" "\n" "Du måste köa åtminstone en fil innan du kan checka in.\n" -#: lib/commit.tcl:187 +#: lib/commit.tcl:186 msgid "" "Please supply a commit message.\n" "\n" @@ -1394,45 +1398,45 @@ msgstr "" "- Andra raden: Tom\n" "- Följande rader: Beskriv varför det här är en bra ändring.\n" -#: lib/commit.tcl:211 +#: lib/commit.tcl:210 #, tcl-format msgid "warning: Tcl does not support encoding '%s'." msgstr "varning: Tcl stöder inte teckenkodningen \"%s\"." -#: lib/commit.tcl:227 +#: lib/commit.tcl:226 msgid "Calling pre-commit hook..." msgstr "Anropar kroken före incheckning (pre-commit)..." -#: lib/commit.tcl:242 +#: lib/commit.tcl:241 msgid "Commit declined by pre-commit hook." msgstr "Incheckningen avvisades av kroken före incheckning (pre-commit)." -#: lib/commit.tcl:265 +#: lib/commit.tcl:264 msgid "Calling commit-msg hook..." msgstr "Anropar kroken för incheckningsmeddelande (commit-msg)..." -#: lib/commit.tcl:280 +#: lib/commit.tcl:279 msgid "Commit declined by commit-msg hook." msgstr "Incheckning avvisad av kroken för incheckningsmeddelande (commit-msg)." -#: lib/commit.tcl:293 +#: lib/commit.tcl:292 msgid "Committing changes..." msgstr "Checkar in ändringar..." -#: lib/commit.tcl:309 +#: lib/commit.tcl:308 msgid "write-tree failed:" msgstr "write-tree misslyckades:" -#: lib/commit.tcl:310 lib/commit.tcl:354 lib/commit.tcl:374 +#: lib/commit.tcl:309 lib/commit.tcl:353 lib/commit.tcl:373 msgid "Commit failed." msgstr "Incheckningen misslyckades." -#: lib/commit.tcl:327 +#: lib/commit.tcl:326 #, tcl-format msgid "Commit %s appears to be corrupt" msgstr "Incheckningen %s verkar vara trasig" -#: lib/commit.tcl:332 +#: lib/commit.tcl:331 msgid "" "No changes to commit.\n" "\n" @@ -1446,19 +1450,19 @@ msgstr "" "\n" "En sökning kommer att startas automatiskt nu.\n" -#: lib/commit.tcl:339 +#: lib/commit.tcl:338 msgid "No changes to commit." msgstr "Inga ändringar att checka in." -#: lib/commit.tcl:353 +#: lib/commit.tcl:352 msgid "commit-tree failed:" msgstr "commit-tree misslyckades:" -#: lib/commit.tcl:373 +#: lib/commit.tcl:372 msgid "update-ref failed:" msgstr "update-ref misslyckades:" -#: lib/commit.tcl:461 +#: lib/commit.tcl:460 #, tcl-format msgid "Created commit %s: %s" msgstr "Skapade incheckningen %s: %s" @@ -1565,14 +1569,16 @@ msgstr "Läser differens för %s..." msgid "" "LOCAL: deleted\n" "REMOTE:\n" -msgstr "LOKAL: borttagen\n" +msgstr "" +"LOKAL: borttagen\n" "FJÄRR:\n" #: lib/diff.tcl:125 msgid "" "REMOTE: deleted\n" "LOCAL:\n" -msgstr "FJÄRR: borttagen\n" +msgstr "" +"FJÄRR: borttagen\n" "LOKAL:\n" #: lib/diff.tcl:132 @@ -1605,7 +1611,8 @@ msgstr "* Binärfil (visar inte innehållet)." msgid "" "* Untracked file is %d bytes.\n" "* Showing only first %d bytes.\n" -msgstr "* Den ospårade filen är %d byte.\n" +msgstr "" +"* Den ospårade filen är %d byte.\n" "* Visar endast inledande %d byte.\n" #: lib/diff.tcl:228 @@ -1935,7 +1942,8 @@ msgstr "Verktyget för sammanslagning körs redan. Vill du avsluta det?" msgid "" "Error retrieving versions:\n" "%s" -msgstr "Fel vid hämtning av versioner:\n" +msgstr "" +"Fel vid hämtning av versioner:\n" "%s" #: lib/mergetool.tcl:343 @@ -1944,7 +1952,8 @@ msgid "" "Could not start the merge tool:\n" "\n" "%s" -msgstr "Kunde inte starta verktyg för sammanslagning:\n" +msgstr "" +"Kunde inte starta verktyg för sammanslagning:\n" "\n" "%s" @@ -2157,7 +2166,8 @@ msgstr "Hämtar %s" msgid "Do not know how to initialize repository at location '%s'." msgstr "Vet inte hur arkivet på platsen \"%s\" skall initieras." -#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:71 +#: lib/remote_add.tcl:163 lib/transport.tcl:25 lib/transport.tcl:63 +#: lib/transport.tcl:81 #, tcl-format msgid "push %s" msgstr "sänd %s" @@ -2175,11 +2185,11 @@ msgstr "Ta bort gren från fjärrarkiv" msgid "From Repository" msgstr "Från arkiv" -#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:123 +#: lib/remote_branch_delete.tcl:50 lib/transport.tcl:134 msgid "Remote:" msgstr "Fjärrarkiv:" -#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:138 +#: lib/remote_branch_delete.tcl:66 lib/transport.tcl:149 msgid "Arbitrary Location:" msgstr "Godtycklig plats:" @@ -2343,7 +2353,8 @@ msgid "" "Could not start ssh-keygen:\n" "\n" "%s" -msgstr "Kunde inte starta ssh-keygen:\n" +msgstr "" +"Kunde inte starta ssh-keygen:\n" "\n" "%s" @@ -2388,7 +2399,7 @@ msgstr "Exekverar: %s" #: lib/tools.tcl:149 #, tcl-format msgid "Tool completed succesfully: %s" -msgstr "Verktyget avslutades framgångsrikt." +msgstr "Verktyget avslutades framgångsrikt: %s" #: lib/tools.tcl:151 #, tcl-format @@ -2453,7 +2464,8 @@ msgstr "Verktyget \"%s\" finns redan." msgid "" "Could not add tool:\n" "%s" -msgstr "Kunde inte lägga till verktyget:\n" +msgstr "" +"Kunde inte lägga till verktyget:\n" "%s" #: lib/tools_dlg.tcl:190 @@ -2505,36 +2517,41 @@ msgstr "Tar bort spårande grenar som tagits bort från %s" msgid "Pushing changes to %s" msgstr "Sänder ändringar till %s" -#: lib/transport.tcl:72 +#: lib/transport.tcl:64 +#, tcl-format +msgid "Mirroring to %s" +msgstr "Speglar till %s" + +#: lib/transport.tcl:82 #, tcl-format msgid "Pushing %s %s to %s" msgstr "Sänder %s %s till %s" -#: lib/transport.tcl:89 +#: lib/transport.tcl:100 msgid "Push Branches" msgstr "Sänd grenar" -#: lib/transport.tcl:103 +#: lib/transport.tcl:114 msgid "Source Branches" msgstr "Källgrenar" -#: lib/transport.tcl:120 +#: lib/transport.tcl:131 msgid "Destination Repository" msgstr "Destinationsarkiv" -#: lib/transport.tcl:158 +#: lib/transport.tcl:169 msgid "Transfer Options" msgstr "Överföringsalternativ" -#: lib/transport.tcl:160 +#: lib/transport.tcl:171 msgid "Force overwrite existing branch (may discard changes)" msgstr "Tvinga överskrivning av befintlig gren (kan kasta bort ändringar)" -#: lib/transport.tcl:164 +#: lib/transport.tcl:175 msgid "Use thin pack (for slow network connections)" msgstr "Använd tunt paket (för långsamma nätverksanslutningar)" -#: lib/transport.tcl:168 +#: lib/transport.tcl:179 msgid "Include tags" msgstr "Ta med taggar" diff --git a/git-mergetool.sh b/git-mergetool.sh index 94187c306c..b2d53752ae 100755 --- a/git-mergetool.sh +++ b/git-mergetool.sh @@ -8,7 +8,7 @@ # at the discretion of Junio C Hamano. # -USAGE='[--tool=tool] [file to merge] ...' +USAGE='[--tool=tool] [-y|--no-prompt|--prompt] [file to merge] ...' SUBDIRECTORY_OK=Yes OPTIONS_SPEC= . git-sh-setup @@ -70,16 +70,16 @@ resolve_symlink_merge () { git checkout-index -f --stage=2 -- "$MERGED" git add -- "$MERGED" cleanup_temp_files --save-backup - return + return 0 ;; [rR]*) git checkout-index -f --stage=3 -- "$MERGED" git add -- "$MERGED" cleanup_temp_files --save-backup - return + return 0 ;; [aA]*) - exit 1 + return 1 ;; esac done @@ -97,15 +97,15 @@ resolve_deleted_merge () { [mMcC]*) git add -- "$MERGED" cleanup_temp_files --save-backup - return + return 0 ;; [dD]*) git rm -- "$MERGED" > /dev/null cleanup_temp_files - return + return 0 ;; [aA]*) - exit 1 + return 1 ;; esac done @@ -137,7 +137,7 @@ merge_file () { else echo "$MERGED: file does not need merging" fi - exit 1 + return 1 fi ext="$$$(expr "$MERGED" : '.*\(\.[^/]*\)$')" @@ -176,8 +176,10 @@ merge_file () { echo "Normal merge conflict for '$MERGED':" describe_file "$local_mode" "local" "$LOCAL" describe_file "$remote_mode" "remote" "$REMOTE" - printf "Hit return to start merge resolution tool (%s): " "$merge_tool" - read ans + if "$prompt" = true; then + printf "Hit return to start merge resolution tool (%s): " "$merge_tool" + read ans + fi case "$merge_tool" in kdiff3) @@ -267,7 +269,12 @@ merge_file () { if test "$status" -ne 0; then echo "merge of $MERGED failed" 1>&2 mv -- "$BACKUP" "$MERGED" - exit 1 + + if test "$merge_keep_temporaries" = "false"; then + cleanup_temp_files + fi + + return 1 fi if test "$merge_keep_backup" = "true"; then @@ -278,8 +285,11 @@ merge_file () { git add -- "$MERGED" cleanup_temp_files + return 0 } +prompt=$(git config --bool mergetool.prompt || echo true) + while test $# != 0 do case "$1" in @@ -295,7 +305,14 @@ do shift ;; esac ;; + -y|--no-prompt) + prompt=false + ;; + --prompt) + prompt=true + ;; --) + shift break ;; -*) @@ -340,6 +357,22 @@ init_merge_tool_path() { fi } +prompt_after_failed_merge() { + while true; do + printf "Continue merging other unresolved paths (y/n) ? " + read ans + case "$ans" in + + [yY]*) + return 0 + ;; + + [nN]*) + return 1 + ;; + esac + done +} if test -z "$merge_tool"; then merge_tool=`git config merge.tool` @@ -388,6 +421,7 @@ else init_merge_tool_path "$merge_tool" merge_keep_backup="$(git config --bool merge.keepBackup || echo true)" + merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)" if test -z "$merge_tool_cmd" && ! type "$merge_tool_path" > /dev/null 2>&1; then echo "The merge tool $merge_tool is not available as '$merge_tool_path'" @@ -399,27 +433,44 @@ else fi fi +last_status=0 +rollup_status=0 if test $# -eq 0 ; then - files=`git ls-files -u | sed -e 's/^[^ ]* //' | sort -u` - if test -z "$files" ; then - echo "No files need merging" - exit 0 + files=`git ls-files -u | sed -e 's/^[^ ]* //' | sort -u` + if test -z "$files" ; then + echo "No files need merging" + exit 0 + fi + echo Merging the files: "$files" + git ls-files -u | + sed -e 's/^[^ ]* //' | + sort -u | + while IFS= read i + do + if test $last_status -ne 0; then + prompt_after_failed_merge < /dev/tty || exit 1 fi - echo Merging the files: "$files" - git ls-files -u | - sed -e 's/^[^ ]* //' | - sort -u | - while IFS= read i - do - printf "\n" - merge_file "$i" < /dev/tty > /dev/tty - done + printf "\n" + merge_file "$i" < /dev/tty > /dev/tty + last_status=$? + if test $last_status -ne 0; then + rollup_status=1 + fi + done else - while test $# -gt 0; do - printf "\n" - merge_file "$1" - shift - done + while test $# -gt 0; do + if test $last_status -ne 0; then + prompt_after_failed_merge || exit 1 + fi + printf "\n" + merge_file "$1" + last_status=$? + if test $last_status -ne 0; then + rollup_status=1 + fi + shift + done fi -exit 0 + +exit $rollup_status diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 1172e47571..c8b0861c08 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -115,9 +115,18 @@ mark_action_done () { } make_patch () { - parent_sha1=$(git rev-parse --verify "$1"^) || - die "Cannot get patch for $1^" - git diff-tree -p "$parent_sha1".."$1" > "$DOTEST"/patch + sha1_and_parents="$(git rev-list --parents -1 "$1")" + case "$sha1_and_parents" in + ?*' '?*' '?*) + git diff --cc $sha1_and_parents + ;; + ?*' '?*) + git diff-tree -p "$1^!" + ;; + *) + echo "Root commit" + ;; + esac > "$DOTEST"/patch test -f "$DOTEST"/message || git cat-file commit "$1" | sed "1,/^$/d" > "$DOTEST"/message test -f "$DOTEST"/author-script || @@ -256,9 +265,8 @@ pick_one_preserving_merges () { output git merge $STRATEGY -m "$msg" \ $new_parents then - git rerere printf "%s\n" "$msg" > "$GIT_DIR"/MERGE_MSG - die Error redoing merge $sha1 + die_with_patch $sha1 "Error redoing merge $sha1" fi ;; *) diff --git a/git-send-email.perl b/git-send-email.perl index 3112f769cd..77ca8fe880 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -20,6 +20,7 @@ use strict; use warnings; use Term::ReadLine; use Getopt::Long; +use Text::ParseWords; use Data::Dumper; use Term::ANSIColor; use File::Temp qw/ tempdir /; @@ -359,6 +360,10 @@ foreach my $entry (@bcclist) { die "Comma in --bcclist entry: $entry'\n" unless $entry !~ m/,/; } +sub split_addrs { + return quotewords('\s*,\s*', 1, @_); +} + my %aliases; my %parse_alias = ( # multiline formats can be supported in the future @@ -367,7 +372,7 @@ my %parse_alias = ( my ($alias, $addr) = ($1, $2); $addr =~ s/#.*$//; # mutt allows # comments # commas delimit multiple addresses - $aliases{$alias} = [ split(/\s*,\s*/, $addr) ]; + $aliases{$alias} = [ split_addrs($addr) ]; }}}, mailrc => sub { my $fh = shift; while (<$fh>) { if (/^alias\s+(\S+)\s+(.*)$/) { @@ -379,7 +384,7 @@ my %parse_alias = ( chomp $x; $x .= $1 while(defined($_ = <$fh>) && /^ +(.*)$/); $x =~ /^(\S+)$f\t\(?([^\t]+?)\)?(:?$f){0,2}$/ or next; - $aliases{$1} = [ split(/\s*,\s*/, $2) ]; + $aliases{$1} = [ split_addrs($2) ]; }}, gnus => sub { my $fh = shift; while (<$fh>) { if (/\(define-mail-alias\s+"(\S+?)"\s+"(\S+?)"\)/) { @@ -588,7 +593,7 @@ if (!@to) { } my $to = $_; - push @to, split /,\s*/, $to; + push @to, split_addrs($to); $prompting++; } diff --git a/git-sh-setup.sh b/git-sh-setup.sh index dbdf209ec0..f07d96b9b5 100755 --- a/git-sh-setup.sh +++ b/git-sh-setup.sh @@ -85,8 +85,27 @@ cd_to_toplevel () { cdup=$(git rev-parse --show-cdup) if test ! -z "$cdup" then - cd "$cdup" || { - echo >&2 "Cannot chdir to $cdup, the toplevel of the working tree" + case "$cdup" in + /*) + # Not quite the same as if we did "cd -P '$cdup'" when + # $cdup contains ".." after symlink path components. + # Don't fix that case at least until Git switches to + # "cd -P" across the board. + phys="$cdup" + ;; + ..|../*|*/..|*/../*) + # Interpret $cdup relative to the physical, not logical, cwd. + # Probably /bin/pwd is more portable than passing -P to cd or pwd. + phys="$(/bin/pwd)/$cdup" + ;; + *) + # There's no "..", so no need to make things absolute. + phys="$cdup" + ;; + esac + + cd "$phys" || { + echo >&2 "Cannot chdir to $phys, the toplevel of the working tree" exit 1 } fi @@ -158,7 +158,7 @@ static int handle_alias(int *argcp, const char ***argv) if (ret >= 0 && WIFEXITED(ret) && WEXITSTATUS(ret) != 127) exit(WEXITSTATUS(ret)); - die("Failed to run '%s' when expanding alias '%s'\n", + die("Failed to run '%s' when expanding alias '%s'", alias_string + 1, alias_command); } count = split_cmdline(alias_string, &new_argv); @@ -428,9 +428,8 @@ int main(int argc, const char **argv) * name, and the dirname as the default exec_path * if we don't have anything better. */ - do - --slash; - while (cmd <= slash && !is_dir_sep(*slash)); + while (cmd <= slash && !is_dir_sep(*slash)) + slash--; if (cmd <= slash) { *slash++ = 0; git_set_argv0_path(cmd); diff --git a/gitk-git/gitk b/gitk-git/gitk index 64a873d2ef..dc2a439618 100644 --- a/gitk-git/gitk +++ b/gitk-git/gitk @@ -1601,13 +1601,14 @@ proc parsecommit {id contents listed} { set header [string range $contents 0 [expr {$hdrend - 1}]] set comment [string range $contents [expr {$hdrend + 2}] end] foreach line [split $header "\n"] { + set line [split $line " "] set tag [lindex $line 0] if {$tag == "author"} { set audate [lindex $line end-1] - set auname [lrange $line 1 end-2] + set auname [join [lrange $line 1 end-2] " "] } elseif {$tag == "committer"} { set comdate [lindex $line end-1] - set comname [lrange $line 1 end-2] + set comname [join [lrange $line 1 end-2] " "] } } set headline {} @@ -2279,7 +2280,7 @@ proc makewindow {} { bindkey b prevfile bindkey d "$ctext yview scroll 18 units" bindkey u "$ctext yview scroll -18 units" - bindkey / {dofind 1 1} + bindkey / {focus $fstring} bindkey <Key-Return> {dofind 1 1} bindkey ? {dofind -1 1} bindkey f nextfile @@ -2660,7 +2661,7 @@ proc keys {} { [mc "<%s-F> Find" $M1T] [mc "<%s-G> Move to next find hit" $M1T] [mc "<Return> Move to next find hit"] -[mc "/ Move to next find hit, or redo find"] +[mc "/ Focus the search box"] [mc "? Move to previous find hit"] [mc "f Scroll diff view to next file"] [mc "<%s-S> Search for next hit in diff view" $M1T] @@ -3318,8 +3319,27 @@ proc index_sha1 {fname} { return {} } +# Turn an absolute path into one relative to the current directory +proc make_relative {f} { + set elts [file split $f] + set here [file split [pwd]] + set ei 0 + set hi 0 + set res {} + foreach d $here { + if {$ei < $hi || $ei >= [llength $elts] || [lindex $elts $ei] ne $d} { + lappend res ".." + } else { + incr ei + } + incr hi + } + set elts [concat $res [lrange $elts $ei end]] + return [eval file join $elts] +} + proc external_blame {parent_idx {line {}}} { - global flist_menu_file + global flist_menu_file gitdir global nullid nullid2 global parentlist selectedline currentid @@ -3338,7 +3358,12 @@ proc external_blame {parent_idx {line {}}} { if {$line ne {} && $line > 1} { lappend cmdline "--line=$line" } - lappend cmdline $base_commit $flist_menu_file + set f [file join [file dirname $gitdir] $flist_menu_file] + # Unfortunately it seems git gui blame doesn't like + # being given an absolute path... + set f [make_relative $f] + lappend cmdline $base_commit $f + puts "cmdline={$cmdline}" if {[catch {eval exec $cmdline &} err]} { error_popup "[mc "git gui blame: command failed:"] $err" } @@ -3382,6 +3407,8 @@ proc show_line_source {} { error_popup [mc "Error reading index: %s" $err] return } + } else { + set id $parents($curview,$currentid) } } else { set id [lindex $parents($curview,$currentid) $pi] @@ -3398,7 +3425,7 @@ proc show_line_source {} { } else { lappend blameargs $id } - lappend blameargs -- $flist_menu_file + lappend blameargs -- [file join [file dirname $gitdir] $flist_menu_file] if {[catch { set f [open $blameargs r] } err]} { @@ -7953,7 +7980,7 @@ proc rowmenu {x y id} { if {$id ne $nullid && $id ne $nullid2} { set menu $rowctxmenu if {$mainhead ne {}} { - $menu entryconfigure 7 -label [mc "Reset %s branch to here" $mainhead] + $menu entryconfigure 7 -label [mc "Reset %s branch to here" $mainhead] -state normal } else { $menu entryconfigure 7 -label [mc "Detached head: can't reset" $mainhead] -state disabled } @@ -10079,15 +10106,11 @@ proc doprefs {} { -font optionfont spinbox $top.maxpct -from 1 -to 100 -width 4 -textvariable maxgraphpct grid x $top.maxpctl $top.maxpct -sticky w - frame $top.showlocal - label $top.showlocal.l -text [mc "Show local changes"] -font optionfont - checkbutton $top.showlocal.b -variable showlocalchanges - pack $top.showlocal.b $top.showlocal.l -side left + checkbutton $top.showlocal -text [mc "Show local changes"] \ + -font optionfont -variable showlocalchanges grid x $top.showlocal -sticky w - frame $top.autoselect - label $top.autoselect.l -text [mc "Auto-select SHA1"] -font optionfont - checkbutton $top.autoselect.b -variable autoselect - pack $top.autoselect.b $top.autoselect.l -side left + checkbutton $top.autoselect -text [mc "Auto-select SHA1"] \ + -font optionfont -variable autoselect grid x $top.autoselect -sticky w label $top.ddisp -text [mc "Diff display options"] @@ -10095,20 +10118,14 @@ proc doprefs {} { label $top.tabstopl -text [mc "Tab spacing"] -font optionfont spinbox $top.tabstop -from 1 -to 20 -width 4 -textvariable tabstop grid x $top.tabstopl $top.tabstop -sticky w - frame $top.ntag - label $top.ntag.l -text [mc "Display nearby tags"] -font optionfont - checkbutton $top.ntag.b -variable showneartags - pack $top.ntag.b $top.ntag.l -side left + checkbutton $top.ntag -text [mc "Display nearby tags"] \ + -font optionfont -variable showneartags grid x $top.ntag -sticky w - frame $top.ldiff - label $top.ldiff.l -text [mc "Limit diffs to listed paths"] -font optionfont - checkbutton $top.ldiff.b -variable limitdiffs - pack $top.ldiff.b $top.ldiff.l -side left + checkbutton $top.ldiff -text [mc "Limit diffs to listed paths"] \ + -font optionfont -variable limitdiffs grid x $top.ldiff -sticky w - frame $top.lattr - label $top.lattr.l -text [mc "Support per-file encodings"] -font optionfont - checkbutton $top.lattr.b -variable perfile_attrs - pack $top.lattr.b $top.lattr.l -side left + checkbutton $top.lattr -text [mc "Support per-file encodings"] \ + -font optionfont -variable perfile_attrs grid x $top.lattr -sticky w entry $top.extdifft -textvariable extdifftool @@ -10124,26 +10141,26 @@ proc doprefs {} { grid $top.cdisp - -sticky w -pady 10 label $top.bg -padx 40 -relief sunk -background $bgcolor button $top.bgbut -text [mc "Background"] -font optionfont \ - -command [list choosecolor bgcolor {} $top.bg background setbg] + -command [list choosecolor bgcolor {} $top.bg [mc "background"] setbg] grid x $top.bgbut $top.bg -sticky w label $top.fg -padx 40 -relief sunk -background $fgcolor button $top.fgbut -text [mc "Foreground"] -font optionfont \ - -command [list choosecolor fgcolor {} $top.fg foreground setfg] + -command [list choosecolor fgcolor {} $top.fg [mc "foreground"] setfg] grid x $top.fgbut $top.fg -sticky w label $top.diffold -padx 40 -relief sunk -background [lindex $diffcolors 0] button $top.diffoldbut -text [mc "Diff: old lines"] -font optionfont \ - -command [list choosecolor diffcolors 0 $top.diffold "diff old lines" \ + -command [list choosecolor diffcolors 0 $top.diffold [mc "diff old lines"] \ [list $ctext tag conf d0 -foreground]] grid x $top.diffoldbut $top.diffold -sticky w label $top.diffnew -padx 40 -relief sunk -background [lindex $diffcolors 1] button $top.diffnewbut -text [mc "Diff: new lines"] -font optionfont \ - -command [list choosecolor diffcolors 1 $top.diffnew "diff new lines" \ + -command [list choosecolor diffcolors 1 $top.diffnew [mc "diff new lines"] \ [list $ctext tag conf dresult -foreground]] grid x $top.diffnewbut $top.diffnew -sticky w label $top.hunksep -padx 40 -relief sunk -background [lindex $diffcolors 2] button $top.hunksepbut -text [mc "Diff: hunk header"] -font optionfont \ -command [list choosecolor diffcolors 2 $top.hunksep \ - "diff hunk header" \ + [mc "diff hunk header"] \ [list $ctext tag conf hunksep -foreground]] grid x $top.hunksepbut $top.hunksep -sticky w label $top.markbgsep -padx 40 -relief sunk -background $markbgcolor @@ -10154,7 +10171,7 @@ proc doprefs {} { grid x $top.markbgbut $top.markbgsep -sticky w label $top.selbgsep -padx 40 -relief sunk -background $selectbgcolor button $top.selbgbut -text [mc "Select bg"] -font optionfont \ - -command [list choosecolor selectbgcolor {} $top.selbgsep background setselbg] + -command [list choosecolor selectbgcolor {} $top.selbgsep [mc "background"] setselbg] grid x $top.selbgbut $top.selbgsep -sticky w label $top.cfont -text [mc "Fonts: press to choose"] @@ -10897,4 +10914,9 @@ if {[info exists permviews]} { addviewmenu $n } } + +if {[tk windowingsystem] eq "win32"} { + focus -force . +} + getcommits {} diff --git a/gitk-git/po/de.po b/gitk-git/po/de.po index e0a6deeded..825dc98f74 100644 --- a/gitk-git/po/de.po +++ b/gitk-git/po/de.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: git-gui\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-10-25 13:18+0200\n" -"PO-Revision-Date: 2008-10-25 13:23+0200\n" +"POT-Creation-Date: 2008-12-06 20:40+0100\n" +"PO-Revision-Date: 2008-12-06 20:45+0100\n" "Last-Translator: Christian Stimming <stimming@tuhh.de>\n" "Language-Team: German\n" "MIME-Version: 1.0\n" @@ -90,7 +90,11 @@ msgstr "Zweige neu laden" msgid "List references" msgstr "Zweige/Markierungen auflisten" -#: gitk:1815 +#: gitk:1915 +msgid "Start git gui" +msgstr "»git gui« starten" + +#: gitk:1917 msgid "Quit" msgstr "Beenden" @@ -295,7 +299,15 @@ msgstr "Externer Vergleich" msgid "Blame parent commit" msgstr "Annotieren der Elternversion" -#: gitk:2488 +#: gitk:2360 +msgid "Show origin of this line" +msgstr "Herkunft dieser Zeile anzeigen" + +#: gitk:2361 +msgid "Run git gui blame on this line" +msgstr "Annotieren (»git gui blame«) von dieser Zeile" + +#: gitk:2606 msgid "" "\n" "Gitk - a commit viewer for git\n" @@ -501,7 +513,38 @@ msgstr "Version nicht gefunden" msgid "git gui blame: command failed:" msgstr "git gui blame: Kommando fehlgeschlagen:" -#: gitk:3092 +#: gitk:3398 +#, tcl-format +msgid "Couldn't read merge head: %s" +msgstr "Zusammenführungs-Spitze konnte nicht gelesen werden: %s" + +#: gitk:3406 +#, tcl-format +msgid "Error reading index: %s" +msgstr "Fehler beim Lesen der Bereitstellung (»index«): %s" + +#: gitk:3431 +#, tcl-format +msgid "Couldn't start git blame: %s" +msgstr "»git blame« konnte nicht gestartet werden: %s" + +#: gitk:3434 gitk:6160 +msgid "Searching" +msgstr "Suchen" + +#: gitk:3466 +#, tcl-format +msgid "Error running git blame: %s" +msgstr "Fehler beim Ausführen von »git blame«: %s" + +#: gitk:3494 +#, tcl-format +msgid "That line comes from commit %s, which is not in this view" +msgstr "" +"Diese Zeile stammt aus Version %s, welche nicht in dieser Ansicht gezeigt " +"wird." + +#: gitk:3508 msgid "External diff viewer failed:" msgstr "Externes Vergleich-(Diff-)Programm fehlgeschlagen:" @@ -509,11 +552,7 @@ msgstr "Externes Vergleich-(Diff-)Programm fehlgeschlagen:" msgid "Gitk view definition" msgstr "Gitk Ansichten" -#: gitk:3225 -msgid "Name" -msgstr "Name" - -#: gitk:3228 +#: gitk:3630 msgid "Remember this view" msgstr "Diese Ansicht speichern" @@ -521,15 +560,55 @@ msgstr "Diese Ansicht speichern" msgid "Commits to include (arguments to git log):" msgstr "Versionen anzeigen (Argumente von git-log):" -#: gitk:3239 +#: gitk:3632 +msgid "Use all refs" +msgstr "Alle Zweige verwenden" + +#: gitk:3633 +msgid "Strictly sort by date" +msgstr "Streng nach Datum sortieren" + +#: gitk:3634 +msgid "Mark branch sides" +msgstr "Zweig-Seiten markieren" + +#: gitk:3635 +msgid "Since date:" +msgstr "Von Datum:" + +#: gitk:3636 +msgid "Until date:" +msgstr "Bis Datum:" + +#: gitk:3637 +msgid "Max count:" +msgstr "Max. Anzahl:" + +#: gitk:3638 +msgid "Skip:" +msgstr "Überspringen:" + +#: gitk:3639 +msgid "Limit to first parent" +msgstr "Auf erste Elternversion beschränken" + +#: gitk:3640 msgid "Command to generate more commits to include:" msgstr "Versionsliste durch folgendes Kommando erzeugen lassen:" -#: gitk:3246 +#: gitk:3749 +msgid "Name" +msgstr "Name" + +#: gitk:3797 msgid "Enter files and directories to include, one per line:" msgstr "Folgende Dateien und Verzeichnisse anzeigen (eine pro Zeile):" -#: gitk:3293 +#: gitk:3811 +msgid "Apply (F5)" +msgstr "Anwenden (F5)" + +#: gitk:3849 msgid "Error in commit selection arguments:" msgstr "Fehler in den ausgewählten Versionen:" @@ -569,11 +648,7 @@ msgstr "Lokale Änderungen bereitgestellt, aber nicht eingetragen" msgid "Local uncommitted changes, not checked in to index" msgstr "Lokale Änderungen, nicht bereitgestellt" -#: gitk:5549 -msgid "Searching" -msgstr "Suchen" - -#: gitk:6049 +#: gitk:6673 msgid "Tags:" msgstr "Markierungen:" @@ -597,11 +672,12 @@ msgstr "Folgt auf" msgid "Precedes" msgstr "Vorgänger von" -#: gitk:6378 -msgid "Error getting merge diffs:" -msgstr "Fehler beim Laden des Vergleichs:" +#: gitk:7209 +#, tcl-format +msgid "Error getting diffs: %s" +msgstr "Fehler beim Laden des Vergleichs: %s" -#: gitk:7113 +#: gitk:7748 msgid "Goto:" msgstr "Gehe zu:" @@ -722,7 +798,12 @@ msgstr "Name:" msgid "Please specify a name for the new branch" msgstr "Bitte geben Sie einen Namen für den neuen Zweig an." -#: gitk:7703 +#: gitk:8328 +#, tcl-format +msgid "Branch '%s' already exists. Overwrite?" +msgstr "Zweig »%s« existiert bereits. Soll er überschrieben werden?" + +#: gitk:8394 #, tcl-format msgid "Commit %s is already included in branch %s -- really re-apply it?" msgstr "" @@ -733,7 +814,26 @@ msgstr "" msgid "Cherry-picking" msgstr "Version pflücken" -#: gitk:7720 +#: gitk:8408 +#, tcl-format +msgid "" +"Cherry-pick failed because of local changes to file '%s'.\n" +"Please commit, reset or stash your changes and try again." +msgstr "" +"Pflücken fehlgeschlagen, da noch lokale Änderungen in Datei »%s«\n" +"vorliegen. Bitte diese Änderungen eintragen, zurücksetzen oder\n" +"zwischenspeichern (»git stash») und dann erneut versuchen." + +#: gitk:8414 +msgid "" +"Cherry-pick failed because of merge conflict.\n" +"Do you wish to run git citool to resolve it?" +msgstr "" +"Pflücken fehlgeschlagen, da ein Zusammenführungs-Konflikt aufgetreten\n" +"ist. Soll das »git citool« (Zusammenführungs-Werkzeug) aufgerufen\n" +"werden, um diesen Konflikt aufzulösen?" + +#: gitk:8430 msgid "No changes committed" msgstr "Keine Änderungen eingetragen" @@ -889,23 +989,51 @@ msgstr "Farben: Klicken zum Wählen" msgid "Background" msgstr "Hintergrund" -#: gitk:9435 +#: gitk:10153 gitk:10183 +msgid "background" +msgstr "Hintergrund" + +#: gitk:10156 msgid "Foreground" msgstr "Vordergrund" -#: gitk:9439 +#: gitk:10157 +msgid "foreground" +msgstr "Vordergrund" + +#: gitk:10160 msgid "Diff: old lines" msgstr "Vergleich: Alte Zeilen" -#: gitk:9444 +#: gitk:10161 +msgid "diff old lines" +msgstr "Vergleich - Alte Zeilen" + +#: gitk:10165 msgid "Diff: new lines" msgstr "Vergleich: Neue Zeilen" -#: gitk:9449 +#: gitk:10166 +msgid "diff new lines" +msgstr "Vergleich - Neue Zeilen" + +#: gitk:10170 msgid "Diff: hunk header" msgstr "Vergleich: Änderungstitel" -#: gitk:9455 +#: gitk:10172 +msgid "diff hunk header" +msgstr "Vergleich - Änderungstitel" + +#: gitk:10176 +msgid "Marked line bg" +msgstr "Markierte Zeile Hintergrund" + +#: gitk:10178 +msgid "marked line background" +msgstr "markierte Zeile Hintergrund" + +#: gitk:10182 msgid "Select bg" msgstr "Hintergrundfarbe Auswählen" diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index 827e5c5137..0ac84d1adf 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -2124,8 +2124,9 @@ sub git_get_projects_list { my $subdir = substr($File::Find::name, $pfxlen + 1); # we check related file in $projectroot - if (check_export_ok("$projectroot/$filter/$subdir")) { - push @list, { path => ($filter ? "$filter/" : '') . $subdir }; + my $path = ($filter ? "$filter/" : '') . $subdir; + if (check_export_ok("$projectroot/$path")) { + push @list, { path => $path }; $File::Find::prune = 1; } }, @@ -4552,28 +4553,33 @@ sub git_tag { } sub git_blame { - my $fd; - my $ftype; - + # permissions gitweb_check_feature('blame') - or die_error(403, "Blame view not allowed"); + or die_error(403, "Blame view not allowed"); + # error checking die_error(400, "No file name given") unless $file_name; $hash_base ||= git_get_head_hash($project); - die_error(404, "Couldn't find base commit") unless ($hash_base); + die_error(404, "Couldn't find base commit") unless $hash_base; my %co = parse_commit($hash_base) or die_error(404, "Commit not found"); + my $ftype = "blob"; if (!defined $hash) { $hash = git_get_hash_by_path($hash_base, $file_name, "blob") or die_error(404, "Error looking up file"); + } else { + $ftype = git_get_type($hash); + if ($ftype !~ "blob") { + die_error(400, "Object is not a blob"); + } } - $ftype = git_get_type($hash); - if ($ftype !~ "blob") { - die_error(400, "Object is not a blob"); - } - open ($fd, "-|", git_cmd(), "blame", '-p', '--', - $file_name, $hash_base) + + # run git-blame --porcelain + open my $fd, "-|", git_cmd(), "blame", '-p', + $hash_base, '--', $file_name or die_error(500, "Open git-blame failed"); + + # page header git_header_html(); my $formats_nav = $cgi->a({-href => href(action=>"blob", -replay=>1)}, @@ -4587,42 +4593,46 @@ sub git_blame { git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav); git_print_header_div('commit', esc_html($co{'title'}), $hash_base); git_print_page_path($file_name, $ftype, $hash_base); - my @rev_color = (qw(light2 dark2)); + + # page body + my @rev_color = qw(light2 dark2); my $num_colors = scalar(@rev_color); my $current_color = 0; - my $last_rev; + my %metainfo = (); + print <<HTML; <div class="page_body"> <table class="blame"> <tr><th>Commit</th><th>Line</th><th>Data</th></tr> HTML - my %metainfo = (); - while (1) { - $_ = <$fd>; - last unless defined $_; + LINE: + while (my $line = <$fd>) { + chomp $line; + # the header: <SHA-1> <src lineno> <dst lineno> [<lines in group>] + # no <lines in group> for subsequent lines in group of lines my ($full_rev, $orig_lineno, $lineno, $group_size) = - /^([0-9a-f]{40}) (\d+) (\d+)(?: (\d+))?$/; + ($line =~ /^([0-9a-f]{40}) (\d+) (\d+)(?: (\d+))?$/); if (!exists $metainfo{$full_rev}) { $metainfo{$full_rev} = {}; } my $meta = $metainfo{$full_rev}; - while (<$fd>) { - last if (s/^\t//); - if (/^(\S+) (.*)$/) { + my $data; + while ($data = <$fd>) { + chomp $data; + last if ($data =~ s/^\t//); # contents of line + if ($data =~ /^(\S+) (.*)$/) { $meta->{$1} = $2; } } - my $data = $_; - chomp $data; - my $rev = substr($full_rev, 0, 8); + my $short_rev = substr($full_rev, 0, 8); my $author = $meta->{'author'}; - my %date = parse_date($meta->{'author-time'}, - $meta->{'author-tz'}); + my %date = + parse_date($meta->{'author-time'}, $meta->{'author-tz'}); my $date = $date{'iso-tz'}; if ($group_size) { - $current_color = ++$current_color % $num_colors; + $current_color = ($current_color + 1) % $num_colors; } - print "<tr class=\"$rev_color[$current_color]\">\n"; + print "<tr id=\"l$lineno\" class=\"$rev_color[$current_color]\">\n"; if ($group_size) { print "<td class=\"sha1\""; print " title=\"". esc_html($author) . ", $date\""; @@ -4631,20 +4641,25 @@ HTML print $cgi->a({-href => href(action=>"commit", hash=>$full_rev, file_name=>$file_name)}, - esc_html($rev)); + esc_html($short_rev)); print "</td>\n"; } - open (my $dd, "-|", git_cmd(), "rev-parse", "$full_rev^") - or die_error(500, "Open git-rev-parse failed"); - my $parent_commit = <$dd>; - close $dd; - chomp($parent_commit); + my $parent_commit; + if (!exists $meta->{'parent'}) { + open (my $dd, "-|", git_cmd(), "rev-parse", "$full_rev^") + or die_error(500, "Open git-rev-parse failed"); + $parent_commit = <$dd>; + close $dd; + chomp($parent_commit); + $meta->{'parent'} = $parent_commit; + } else { + $parent_commit = $meta->{'parent'}; + } my $blamed = href(action => 'blame', file_name => $meta->{'filename'}, hash_base => $parent_commit); print "<td class=\"linenr\">"; print $cgi->a({ -href => "$blamed#l$orig_lineno", - -id => "l$lineno", -class => "linenr" }, esc_html($lineno)); print "</td>"; @@ -4655,6 +4670,8 @@ HTML print "</div>"; close $fd or print "Reading blob failed\n"; + + # page footer git_footer_html(); } @@ -5262,43 +5279,9 @@ sub git_blobdiff { or die_error(500, "Open git-diff-tree failed"); } - # old/legacy style URI - if (!%diffinfo && # if new style URI failed - defined $hash && defined $hash_parent) { - # fake git-diff-tree raw output - $diffinfo{'from_mode'} = $diffinfo{'to_mode'} = "blob"; - $diffinfo{'from_id'} = $hash_parent; - $diffinfo{'to_id'} = $hash; - if (defined $file_name) { - if (defined $file_parent) { - $diffinfo{'status'} = '2'; - $diffinfo{'from_file'} = $file_parent; - $diffinfo{'to_file'} = $file_name; - } else { # assume not renamed - $diffinfo{'status'} = '1'; - $diffinfo{'from_file'} = $file_name; - $diffinfo{'to_file'} = $file_name; - } - } else { # no filename given - $diffinfo{'status'} = '2'; - $diffinfo{'from_file'} = $hash_parent; - $diffinfo{'to_file'} = $hash; - } - - # non-textual hash id's can be cached - if ($hash =~ m/^[0-9a-fA-F]{40}$/ && - $hash_parent =~ m/^[0-9a-fA-F]{40}$/) { - $expires = '+1d'; - } - - # open patch output - open $fd, "-|", git_cmd(), "diff", @diff_opts, - '-p', ($format eq 'html' ? "--full-index" : ()), - $hash_parent, $hash, "--" - or die_error(500, "Open git-diff failed"); - } else { - die_error(400, "Missing one of the blob diff parameters") - unless %diffinfo; + # old/legacy style URI -- not generated anymore since 1.4.3. + if (!%diffinfo) { + die_error('404 Not Found', "Missing one of the blob diff parameters") } # header @@ -6156,8 +6139,8 @@ XML } my $path = esc_html(chop_str($proj{'path'}, 25, 5)); - my $rss = "$my_url?p=$proj{'path'};a=rss"; - my $html = "$my_url?p=$proj{'path'};a=summary"; + my $rss = href('project' => $proj{'path'}, 'action' => 'rss', -full => 1); + my $html = href('project' => $proj{'path'}, 'action' => 'summary', -full => 1); print "<outline type=\"rss\" text=\"$path\" title=\"$path\" xmlUrl=\"$rss\" htmlUrl=\"$html\"/>\n"; } print <<XML; @@ -395,7 +395,7 @@ static int match_expr_eval(struct grep_opt *o, h |= match_expr_eval(o, x->u.binary.right, bol, eol, ctx, 1); break; default: - die("Unexpected node type (internal error) %d\n", x->node); + die("Unexpected node type (internal error) %d", x->node); } if (collect_hits) x->hit |= h; diff --git a/http-push.c b/http-push.c index 5cecef434a..a4b7d08663 100644 --- a/http-push.c +++ b/http-push.c @@ -87,6 +87,7 @@ static struct object_list *objects; struct repo { char *url; + char *path; int path_len; int has_info_refs; int can_update_info_refs; @@ -595,7 +596,7 @@ static int refresh_lock(struct remote_lock *lock) lock->refreshing = 1; if_header = xmalloc(strlen(lock->token) + 25); - sprintf(if_header, "If: (<opaquelocktoken:%s>)", lock->token); + sprintf(if_header, "If: (<%s>)", lock->token); sprintf(timeout_header, "Timeout: Second-%ld", lock->timeout); dav_headers = curl_slist_append(dav_headers, if_header); dav_headers = curl_slist_append(dav_headers, timeout_header); @@ -1120,10 +1121,8 @@ static void handle_new_lock_ctx(struct xml_ctx *ctx, int tag_closed) lock->timeout = strtol(ctx->cdata + 7, NULL, 10); } else if (!strcmp(ctx->name, DAV_ACTIVELOCK_TOKEN)) { - if (!prefixcmp(ctx->cdata, "opaquelocktoken:")) { - lock->token = xmalloc(strlen(ctx->cdata) - 15); - strcpy(lock->token, ctx->cdata + 16); - } + lock->token = xmalloc(strlen(ctx->cdata) + 1); + strcpy(lock->token, ctx->cdata); } } } @@ -1308,7 +1307,7 @@ static int unlock_remote(struct remote_lock *lock) int rc = 0; lock_token_header = xmalloc(strlen(lock->token) + 31); - sprintf(lock_token_header, "Lock-Token: <opaquelocktoken:%s>", + sprintf(lock_token_header, "Lock-Token: <%s>", lock->token); dav_headers = curl_slist_append(dav_headers, lock_token_header); @@ -1426,9 +1425,19 @@ static void handle_remote_ls_ctx(struct xml_ctx *ctx, int tag_closed) ls->userFunc(ls); } } else if (!strcmp(ctx->name, DAV_PROPFIND_NAME) && ctx->cdata) { - ls->dentry_name = xmalloc(strlen(ctx->cdata) - + char *path = ctx->cdata; + if (*ctx->cdata == 'h') { + path = strstr(path, "//"); + if (path) { + path = strchr(path+2, '/'); + } + } + if (path) { + path += remote->path_len; + } + ls->dentry_name = xmalloc(strlen(path) - remote->path_len + 1); - strcpy(ls->dentry_name, ctx->cdata + remote->path_len); + strcpy(ls->dentry_name, path + remote->path_len); } else if (!strcmp(ctx->name, DAV_PROPFIND_COLLECTION)) { ls->dentry_flags |= IS_DIR; } @@ -1722,7 +1731,7 @@ static int update_remote(unsigned char *sha1, struct remote_lock *lock) struct curl_slist *dav_headers = NULL; if_header = xmalloc(strlen(lock->token) + 25); - sprintf(if_header, "If: (<opaquelocktoken:%s>)", lock->token); + sprintf(if_header, "If: (<%s>)", lock->token); dav_headers = curl_slist_append(dav_headers, if_header); strbuf_addf(&out_buffer.buf, "%s\n", sha1_to_hex(sha1)); @@ -1941,7 +1950,7 @@ static void update_remote_info_refs(struct remote_lock *lock) add_remote_info_ref, &buffer.buf); if (!aborted) { if_header = xmalloc(strlen(lock->token) + 25); - sprintf(if_header, "If: (<opaquelocktoken:%s>)", lock->token); + sprintf(if_header, "If: (<%s>)", lock->token); dav_headers = curl_slist_append(dav_headers, if_header); slot = get_active_slot(); @@ -2208,10 +2217,11 @@ int main(int argc, char **argv) if (!remote->url) { char *path = strstr(arg, "//"); remote->url = arg; + remote->path_len = strlen(arg); if (path) { - path = strchr(path+2, '/'); - if (path) - remote->path_len = strlen(path); + remote->path = strchr(path+2, '/'); + if (remote->path) + remote->path_len = strlen(remote->path); } continue; } @@ -2240,8 +2250,9 @@ int main(int argc, char **argv) rewritten_url = xmalloc(strlen(remote->url)+2); strcpy(rewritten_url, remote->url); strcat(rewritten_url, "/"); + remote->path = rewritten_url + (remote->path - remote->url); + remote->path_len++; remote->url = rewritten_url; - ++remote->path_len; } /* Verify DAV compliance/lock support */ diff --git a/imap-send.c b/imap-send.c index 3703dbd1af..c3fa0df855 100644 --- a/imap-send.c +++ b/imap-send.c @@ -115,9 +115,9 @@ static int nfvasprintf(char **strp, const char *fmt, va_list ap) len = vsnprintf(tmp, sizeof(tmp), fmt, ap); if (len < 0) - die("Fatal: Out of memory\n"); + die("Fatal: Out of memory"); if (len >= sizeof(tmp)) - die("imap command overflow !\n"); + die("imap command overflow!"); *strp = xmemdupz(tmp, len); return len; } @@ -482,7 +482,7 @@ static int nfsnprintf(char *buf, int blen, const char *fmt, ...) va_start(va, fmt); if (blen <= 0 || (unsigned)(ret = vsnprintf(buf, blen, fmt, va)) >= (unsigned)blen) - die("Fatal: buffer too small. Please report a bug.\n"); + die("Fatal: buffer too small. Please report a bug."); va_end(va); return ret; } diff --git a/index-pack.c b/index-pack.c index 60ed41a993..2931511e8c 100644 --- a/index-pack.c +++ b/index-pack.c @@ -178,7 +178,7 @@ static char *open_pack_file(char *pack_name) } else output_fd = open(pack_name, O_CREAT|O_EXCL|O_RDWR, 0600); if (output_fd < 0) - die("unable to create %s: %s\n", pack_name, strerror(errno)); + die("unable to create %s: %s", pack_name, strerror(errno)); pack_fd = output_fd; } else { input_fd = open(pack_name, O_RDONLY); diff --git a/lockfile.c b/lockfile.c index 6d75608693..8589155532 100644 --- a/lockfile.c +++ b/lockfile.c @@ -140,6 +140,7 @@ static int lock_file(struct lock_file *lk, const char *path, int flags) signal(SIGHUP, remove_lock_file_on_signal); signal(SIGTERM, remove_lock_file_on_signal); signal(SIGQUIT, remove_lock_file_on_signal); + signal(SIGPIPE, remove_lock_file_on_signal); atexit(remove_lock_file); } lk->owner = getpid(); diff --git a/merge-recursive.c b/merge-recursive.c index a0c804c817..2da4333439 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -447,6 +447,30 @@ static void flush_buffer(int fd, const char *buf, unsigned long size) } } +static int would_lose_untracked(const char *path) +{ + int pos = cache_name_pos(path, strlen(path)); + + if (pos < 0) + pos = -1 - pos; + while (pos < active_nr && + !strcmp(path, active_cache[pos]->name)) { + /* + * If stage #0, it is definitely tracked. + * If it has stage #2 then it was tracked + * before this merge started. All other + * cases the path was not tracked. + */ + switch (ce_stage(active_cache[pos])) { + case 0: + case 2: + return 0; + } + pos++; + } + return file_exists(path); +} + static int make_room_for_path(const char *path) { int status; @@ -462,6 +486,14 @@ static int make_room_for_path(const char *path) die(msg, path, ""); } + /* + * Do not unlink a file in the work tree if we are not + * tracking it. + */ + if (would_lose_untracked(path)) + return error("refusing to lose untracked file at '%s'", + path); + /* Successful unlink is good.. */ if (!unlink(path)) return 0; diff --git a/pack-redundant.c b/pack-redundant.c index 25b81a445c..e93eb966e2 100644 --- a/pack-redundant.c +++ b/pack-redundant.c @@ -463,7 +463,7 @@ static void minimize(struct pack_list **min) pll_free(perm_all); } if (perm_ok == NULL) - die("Internal error: No complete sets found!\n"); + die("Internal error: No complete sets found!"); /* find the permutation with the smallest size */ perm = perm_ok; @@ -573,14 +573,14 @@ static struct pack_list * add_pack_file(char *filename) struct packed_git *p = packed_git; if (strlen(filename) < 40) - die("Bad pack filename: %s\n", filename); + die("Bad pack filename: %s", filename); while (p) { if (strstr(p->pack_name, filename)) return add_pack(p); p = p->next; } - die("Filename %s not found in packed_git\n", filename); + die("Filename %s not found in packed_git", filename); } static void load_all(void) @@ -636,7 +636,7 @@ int main(int argc, char **argv) add_pack_file(*(argv + i++)); if (local_packs == NULL) - die("Zero packs found!\n"); + die("Zero packs found!"); load_all_objects(); @@ -70,7 +70,8 @@ void setup_pager(void) /* original process continues, but writes to the pipe */ dup2(pager_process.in, 1); - dup2(pager_process.in, 2); + if (isatty(2)) + dup2(pager_process.in, 2); close(pager_process.in); /* this makes sure that the parent terminates after the pager */ diff --git a/perl/Git.pm b/perl/Git.pm index dde9105df8..8392a68333 100644 --- a/perl/Git.pm +++ b/perl/Git.pm @@ -204,14 +204,14 @@ sub repository { unless (-d "$dir/refs" and -d "$dir/objects" and -e "$dir/HEAD") { # Mimick git-rev-parse --git-dir error message: - throw Error::Simple('fatal: Not a git repository'); + throw Error::Simple("fatal: Not a git repository: $dir"); } my $search = Git->repository(Repository => $dir); try { $search->command('symbolic-ref', 'HEAD'); } catch Git::Error::Command with { # Mimick git-rev-parse --git-dir error message: - throw Error::Simple('fatal: Not a git repository'); + throw Error::Simple("fatal: Not a git repository: $dir"); } $opts{Repository} = abs_path($dir); @@ -181,6 +181,20 @@ static int is_empty_line(const char *line, int *len_p) return !len; } +static const char *skip_empty_lines(const char *msg) +{ + for (;;) { + int linelen = get_one_line(msg); + int ll = linelen; + if (!linelen) + break; + if (!is_empty_line(msg, &ll)) + break; + msg += linelen; + } + return msg; +} + static void add_merge_info(enum cmit_fmt fmt, struct strbuf *sb, const struct commit *commit, int abbrev) { @@ -410,13 +424,15 @@ struct chunk { struct format_commit_context { const struct commit *commit; enum date_mode dmode; + unsigned commit_header_parsed:1; + unsigned commit_message_parsed:1; /* These offsets are relative to the start of the commit message. */ - int commit_header_parsed; - struct chunk subject; struct chunk author; struct chunk committer; struct chunk encoding; + size_t message_off; + size_t subject_off; size_t body_off; /* The following ones are relative to the result struct strbuf. */ @@ -446,23 +462,14 @@ static void parse_commit_header(struct format_commit_context *context) { const char *msg = context->commit->buffer; int i; - enum { HEADER, SUBJECT, BODY } state; - for (i = 0, state = HEADER; msg[i] && state < BODY; i++) { + for (i = 0; msg[i]; i++) { int eol; for (eol = i; msg[eol] && msg[eol] != '\n'; eol++) ; /* do nothing */ - if (state == SUBJECT) { - context->subject.off = i; - context->subject.len = eol - i; - i = eol; - } if (i == eol) { - state++; - /* strip empty lines */ - while (msg[eol] == '\n' && msg[eol + 1] == '\n') - eol++; + break; } else if (!prefixcmp(msg + i, "author ")) { context->author.off = i + 7; context->author.len = eol - i - 7; @@ -474,13 +481,50 @@ static void parse_commit_header(struct format_commit_context *context) context->encoding.len = eol - i - 9; } i = eol; - if (!msg[i]) - break; } - context->body_off = i; + context->message_off = i; context->commit_header_parsed = 1; } +static const char *format_subject(struct strbuf *sb, const char *msg, + const char *line_separator) +{ + int first = 1; + + for (;;) { + const char *line = msg; + int linelen = get_one_line(line); + + msg += linelen; + if (!linelen || is_empty_line(line, &linelen)) + break; + + if (!sb) + continue; + strbuf_grow(sb, linelen + 2); + if (!first) + strbuf_addstr(sb, line_separator); + strbuf_add(sb, line, linelen); + first = 0; + } + return msg; +} + +static void parse_commit_message(struct format_commit_context *c) +{ + const char *msg = c->commit->buffer + c->message_off; + const char *start = c->commit->buffer; + + msg = skip_empty_lines(msg); + c->subject_off = msg - start; + + msg = format_subject(NULL, msg, NULL); + msg = skip_empty_lines(msg); + c->body_off = msg - start; + + c->commit_message_parsed = 1; +} + static void format_decoration(struct strbuf *sb, const struct commit *commit) { struct name_decoration *d; @@ -600,9 +644,6 @@ static size_t format_commit_item(struct strbuf *sb, const char *placeholder, parse_commit_header(c); switch (placeholder[0]) { - case 's': /* subject */ - strbuf_add(sb, msg + c->subject.off, c->subject.len); - return 1; case 'a': /* author ... */ return format_person_part(sb, placeholder[1], msg + c->author.off, c->author.len, @@ -614,6 +655,16 @@ static size_t format_commit_item(struct strbuf *sb, const char *placeholder, case 'e': /* encoding */ strbuf_add(sb, msg + c->encoding.off, c->encoding.len); return 1; + } + + /* Now we need to parse the commit message. */ + if (!c->commit_message_parsed) + parse_commit_message(c); + + switch (placeholder[0]) { + case 's': /* subject */ + format_subject(sb, msg + c->subject_off, " "); + return 1; case 'b': /* body */ strbuf_addstr(sb, msg + c->body_off); return 1; @@ -704,27 +755,11 @@ void pp_title_line(enum cmit_fmt fmt, const char *encoding, int need_8bit_cte) { + const char *line_separator = (fmt == CMIT_FMT_EMAIL) ? "\n " : " "; struct strbuf title; strbuf_init(&title, 80); - - for (;;) { - const char *line = *msg_p; - int linelen = get_one_line(line); - - *msg_p += linelen; - if (!linelen || is_empty_line(line, &linelen)) - break; - - strbuf_grow(&title, linelen + 2); - if (title.len) { - if (fmt == CMIT_FMT_EMAIL) { - strbuf_addch(&title, '\n'); - } - strbuf_addch(&title, ' '); - } - strbuf_add(&title, line, linelen); - } + *msg_p = format_subject(&title, *msg_p, line_separator); strbuf_grow(sb, title.len + 1024); if (subject) { @@ -850,15 +885,7 @@ void pretty_print_commit(enum cmit_fmt fmt, const struct commit *commit, } /* Skip excess blank lines at the beginning of body, if any... */ - for (;;) { - int linelen = get_one_line(msg); - int ll = linelen; - if (!linelen) - break; - if (!is_empty_line(msg, &ll)) - break; - msg += linelen; - } + msg = skip_empty_lines(msg); /* These formats treat the title line specially. */ if (fmt == CMIT_FMT_ONELINE || fmt == CMIT_FMT_EMAIL) diff --git a/read-cache.c b/read-cache.c index c14b562313..b1475ffa09 100644 --- a/read-cache.c +++ b/read-cache.c @@ -99,27 +99,21 @@ static int ce_compare_data(struct cache_entry *ce, struct stat *st) static int ce_compare_link(struct cache_entry *ce, size_t expected_size) { int match = -1; - char *target; void *buffer; unsigned long size; enum object_type type; - int len; + struct strbuf sb = STRBUF_INIT; - target = xmalloc(expected_size); - len = readlink(ce->name, target, expected_size); - if (len != expected_size) { - free(target); + if (strbuf_readlink(&sb, ce->name, expected_size)) return -1; - } + buffer = read_sha1_file(ce->sha1, &type, &size); - if (!buffer) { - free(target); - return -1; + if (buffer) { + if (size == sb.len) + match = memcmp(buffer, sb.buf, size); + free(buffer); } - if (size == expected_size) - match = memcmp(buffer, target, size); - free(buffer); - free(target); + strbuf_release(&sb); return match; } @@ -468,7 +468,7 @@ const char *setup_git_directory_gently(int *nongit_ok) *nongit_ok = 1; return NULL; } - die("Not a git repository"); + die("Not a git repository (or any of the parent directories): %s", DEFAULT_GIT_DIR_ENVIRONMENT); } if (chdir("..")) die("Cannot change to %s/..: %s", cwd, strerror(errno)); diff --git a/sha1_file.c b/sha1_file.c index 0e021c5eca..52d1ead15b 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -2523,8 +2523,7 @@ int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object, int index_path(unsigned char *sha1, const char *path, struct stat *st, int write_object) { int fd; - char *target; - size_t len; + struct strbuf sb = STRBUF_INIT; switch (st->st_mode & S_IFMT) { case S_IFREG: @@ -2537,20 +2536,17 @@ int index_path(unsigned char *sha1, const char *path, struct stat *st, int write path); break; case S_IFLNK: - len = xsize_t(st->st_size); - target = xmalloc(len + 1); - if (readlink(path, target, len + 1) != st->st_size) { + if (strbuf_readlink(&sb, path, st->st_size)) { char *errstr = strerror(errno); - free(target); return error("readlink(\"%s\"): %s", path, errstr); } if (!write_object) - hash_sha1_file(target, len, blob_type, sha1); - else if (write_sha1_file(target, len, blob_type, sha1)) + hash_sha1_file(sb.buf, sb.len, blob_type, sha1); + else if (write_sha1_file(sb.buf, sb.len, blob_type, sha1)) return error("%s: failed to insert into database", path); - free(target); + strbuf_release(&sb); break; case S_IFDIR: return resolve_gitlink_ref(path, "HEAD", sha1); @@ -256,18 +256,21 @@ size_t strbuf_expand_dict_cb(struct strbuf *sb, const char *placeholder, size_t strbuf_fread(struct strbuf *sb, size_t size, FILE *f) { size_t res; + size_t oldalloc = sb->alloc; strbuf_grow(sb, size); res = fread(sb->buf + sb->len, 1, size, f); - if (res > 0) { + if (res > 0) strbuf_setlen(sb, sb->len + res); - } + else if (res < 0 && oldalloc == 0) + strbuf_release(sb); return res; } ssize_t strbuf_read(struct strbuf *sb, int fd, size_t hint) { size_t oldlen = sb->len; + size_t oldalloc = sb->alloc; strbuf_grow(sb, hint ? hint : 8192); for (;;) { @@ -275,7 +278,10 @@ ssize_t strbuf_read(struct strbuf *sb, int fd, size_t hint) cnt = xread(fd, sb->buf + sb->len, sb->alloc - sb->len - 1); if (cnt < 0) { - strbuf_setlen(sb, oldlen); + if (oldalloc == 0) + strbuf_release(sb); + else + strbuf_setlen(sb, oldlen); return -1; } if (!cnt) @@ -288,6 +294,36 @@ ssize_t strbuf_read(struct strbuf *sb, int fd, size_t hint) return sb->len - oldlen; } +#define STRBUF_MAXLINK (2*PATH_MAX) + +int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint) +{ + size_t oldalloc = sb->alloc; + + if (hint < 32) + hint = 32; + + while (hint < STRBUF_MAXLINK) { + int len; + + strbuf_grow(sb, hint); + len = readlink(path, sb->buf, hint); + if (len < 0) { + if (errno != ERANGE) + break; + } else if (len < hint) { + strbuf_setlen(sb, len); + return 0; + } + + /* .. the buffer was too small - try again */ + hint *= 2; + } + if (oldalloc == 0) + strbuf_release(sb); + return -1; +} + int strbuf_getline(struct strbuf *sb, FILE *fp, int term) { int ch; @@ -124,6 +124,7 @@ extern size_t strbuf_fread(struct strbuf *, size_t, FILE *); /* XXX: if read fails, any partial read is undone */ extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint); extern int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint); +extern int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint); extern int strbuf_getline(struct strbuf *, FILE *, int); diff --git a/t/t2011-checkout-invalid-head.sh b/t/t2011-checkout-invalid-head.sh index 764bb0a6bc..15ebdc26eb 100755 --- a/t/t2011-checkout-invalid-head.sh +++ b/t/t2011-checkout-invalid-head.sh @@ -10,6 +10,10 @@ test_expect_success 'setup' ' git commit -m initial ' +test_expect_success 'checkout should not start branch from a tree' ' + test_must_fail git checkout -b newbranch master^{tree} +' + test_expect_success 'checkout master from invalid HEAD' ' echo 0000000000000000000000000000000000000000 >.git/HEAD && git checkout master -- diff --git a/t/t2300-cd-to-toplevel.sh b/t/t2300-cd-to-toplevel.sh new file mode 100755 index 0000000000..beddb4e9f2 --- /dev/null +++ b/t/t2300-cd-to-toplevel.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +test_description='cd_to_toplevel' + +. ./test-lib.sh + +test_cd_to_toplevel () { + test_expect_success "$2" ' + ( + cd '"'$1'"' && + . git-sh-setup && + cd_to_toplevel && + [ "$(/bin/pwd)" = "$TOPLEVEL" ] + ) + ' +} + +TOPLEVEL="$(/bin/pwd)/repo" +mkdir -p repo/sub/dir +mv .git repo/ +SUBDIRECTORY_OK=1 + +test_cd_to_toplevel repo 'at physical root' + +test_cd_to_toplevel repo/sub/dir 'at physical subdir' + +ln -s repo symrepo +test_cd_to_toplevel symrepo 'at symbolic root' + +ln -s repo/sub/dir subdir-link +test_cd_to_toplevel subdir-link 'at symbolic subdir' + +cd repo +ln -s sub/dir internal-link +test_cd_to_toplevel internal-link 'at internal symbolic subdir' + +test_done diff --git a/t/t3001-ls-files-others-exclude.sh b/t/t3001-ls-files-others-exclude.sh index 8666946b02..85aef12a11 100755 --- a/t/t3001-ls-files-others-exclude.sh +++ b/t/t3001-ls-files-others-exclude.sh @@ -140,4 +140,10 @@ test_expect_success 'trailing slash in exclude forces directory match (2)' ' ' +test_expect_success 'negated exclude matches can override previous ones' ' + + git ls-files --others --exclude="a.*" --exclude="!a.1" >output && + grep "^a.1" output +' + test_done diff --git a/t/t3409-rebase-preserve-merges.sh b/t/t3409-rebase-preserve-merges.sh index 8cde40f8e8..e6c832780f 100755 --- a/t/t3409-rebase-preserve-merges.sh +++ b/t/t3409-rebase-preserve-merges.sh @@ -11,15 +11,23 @@ Run "git rebase -p" and check that merges are properly carried along GIT_AUTHOR_EMAIL=bogus_email_address export GIT_AUTHOR_EMAIL -#echo 'Setting up: +# Clone 1 (trivial merge): # -#A1--A2 <-- origin/master -# \ \ -# B1--M <-- topic -# \ -# B2 <-- origin/topic +# A1--A2 <-- origin/master +# \ \ +# B1--M <-- topic +# \ +# B2 <-- origin/topic # -#' +# Clone 2 (conflicting merge): +# +# A1--A2--B3 <-- origin/master +# \ \ +# B1------M <-- topic +# \ +# B2 <-- origin/topic +# +# In both cases, 'topic' is rebased onto 'origin/topic'. test_expect_success 'setup for merge-preserving rebase' \ 'echo First > A && @@ -37,12 +45,19 @@ test_expect_success 'setup for merge-preserving rebase' \ cd clone1 && git checkout -b topic origin/topic && git merge origin/master && - cd .. + cd .. && + + echo Fifth > B && + git add B && + git commit -m "Add different B" && - git clone ./. clone2 + git clone ./. clone2 && cd clone2 && git checkout -b topic origin/topic && - git merge origin/master && + test_must_fail git merge origin/master && + echo Resolved > B && + git add B && + git commit -m "Merge origin/master into topic" && cd .. && git checkout topic && @@ -51,11 +66,30 @@ test_expect_success 'setup for merge-preserving rebase' \ ' test_expect_success 'rebase -p fakes interactive rebase' ' - cd clone2 && + ( + cd clone1 && git fetch && git rebase -p origin/topic && test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) && test 1 = $(git rev-list --all --pretty=oneline | grep "Merge commit" | wc -l) + ) +' + +test_expect_success '--continue works after a conflict' ' + ( + cd clone2 && + git fetch && + test_must_fail git rebase -p origin/topic && + test 2 = $(git ls-files B | wc -l) && + echo Resolved again > B && + test_must_fail git rebase --continue && + grep "^@@@ " .git/rebase-merge/patch && + git add B && + git rebase --continue && + test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) && + test 1 = $(git rev-list --all --pretty=oneline | grep "Add different" | wc -l) && + test 1 = $(git rev-list --all --pretty=oneline | grep "Merge origin" | wc -l) + ) ' test_done diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh index b7d46e50a8..95542e9cfe 100755 --- a/t/t3600-rm.sh +++ b/t/t3600-rm.sh @@ -251,4 +251,21 @@ test_expect_success 'refresh index before checking if it is up-to-date' ' ' +test_expect_success 'choking "git rm" should not let it die with cruft' ' + git reset -q --hard && + H=0000000000000000000000000000000000000000 && + i=0 && + while test $i -lt 12000 + do + echo "100644 $H 0 some-file-$i" + i=$(( $i + 1 )) + done | git update-index --index-info && + git rm -n "some-file-*" | :; + test -f .git/index.lock + status=$? + rm -f .git/index.lock + git reset -q --hard + test "$status" != 0 +' + test_done diff --git a/t/t4129-apply-samemode.sh b/t/t4129-apply-samemode.sh new file mode 100755 index 0000000000..adfcbb5a3b --- /dev/null +++ b/t/t4129-apply-samemode.sh @@ -0,0 +1,62 @@ +#!/bin/sh + +test_description='applying patch with mode bits' + +. ./test-lib.sh + +test_expect_success setup ' + echo original >file && + git add file && + test_tick && + git commit -m initial && + git tag initial && + echo modified >file && + git diff --stat -p >patch-0.txt && + chmod +x file && + git diff --stat -p >patch-1.txt +' + +test_expect_success 'same mode (no index)' ' + git reset --hard && + chmod +x file && + git apply patch-0.txt && + test -x file +' + +test_expect_success 'same mode (with index)' ' + git reset --hard && + chmod +x file && + git add file && + git apply --index patch-0.txt && + test -x file && + git diff --exit-code +' + +test_expect_success 'same mode (index only)' ' + git reset --hard && + chmod +x file && + git add file && + git apply --cached patch-0.txt && + git ls-files -s file | grep "^100755" +' + +test_expect_success 'mode update (no index)' ' + git reset --hard && + git apply patch-1.txt && + test -x file +' + +test_expect_success 'mode update (with index)' ' + git reset --hard && + git apply --index patch-1.txt && + test -x file && + git diff --exit-code +' + +test_expect_success 'mode update (index only)' ' + git reset --hard && + git apply --cached patch-1.txt && + git ls-files -s file | grep "^100755" +' + +test_done diff --git a/t/t5302-pack-index.sh b/t/t5302-pack-index.sh index 884e24253a..e6f70d474f 100755 --- a/t/t5302-pack-index.sh +++ b/t/t5302-pack-index.sh @@ -10,6 +10,7 @@ test_expect_success \ 'setup' \ 'rm -rf .git git init && + git config pack.threads 1 && i=1 && while test $i -le 100 do diff --git a/t/t5521-pull-symlink.sh b/t/t5521-pull-symlink.sh new file mode 100755 index 0000000000..5672b51e2e --- /dev/null +++ b/t/t5521-pull-symlink.sh @@ -0,0 +1,78 @@ +#!/bin/sh + +test_description='pulling from symlinked subdir' + +. ./test-lib.sh + +# The scenario we are building: +# +# trash\ directory/ +# clone-repo/ +# subdir/ +# bar +# subdir-link -> clone-repo/subdir/ +# +# The working directory is subdir-link. + +mkdir subdir +echo file >subdir/file +git add subdir/file +git commit -q -m file +git clone -q . clone-repo +ln -s clone-repo/subdir/ subdir-link + + +# Demonstrate that things work if we just avoid the symlink +# +test_expect_success 'pulling from real subdir' ' + ( + echo real >subdir/file && + git commit -m real subdir/file && + cd clone-repo/subdir/ && + git pull && + test real = $(cat file) + ) +' + +# From subdir-link, pulling should work as it does from +# clone-repo/subdir/. +# +# Instead, the error pull gave was: +# +# fatal: 'origin': unable to chdir or not a git archive +# fatal: The remote end hung up unexpectedly +# +# because git would find the .git/config for the "trash directory" +# repo, not for the clone-repo repo. The "trash directory" repo +# had no entry for origin. Git found the wrong .git because +# git rev-parse --show-cdup printed a path relative to +# clone-repo/subdir/, not subdir-link/. Git rev-parse --show-cdup +# used the correct .git, but when the git pull shell script did +# "cd `git rev-parse --show-cdup`", it ended up in the wrong +# directory. A POSIX shell's "cd" works a little differently +# than chdir() in C; "cd -P" is much closer to chdir(). +# +test_expect_success 'pulling from symlinked subdir' ' + ( + echo link >subdir/file && + git commit -m link subdir/file && + cd subdir-link/ && + git pull && + test link = $(cat file) + ) +' + +# Prove that the remote end really is a repo, and other commands +# work fine in this context. It's just that "git pull" breaks. +# +test_expect_success 'pushing from symlinked subdir' ' + ( + cd subdir-link/ && + echo push >file && + git commit -m push ./file && + git push + ) && + test push = $(git show HEAD:subdir/file) +' + +test_done diff --git a/t/t6120-describe.sh b/t/t6120-describe.sh index e6c9e59b61..8c7e081c53 100755 --- a/t/t6120-describe.sh +++ b/t/t6120-describe.sh @@ -100,6 +100,12 @@ check_describe B --tags HEAD^^2^ check_describe B-0-* --long HEAD^^2^ check_describe A-3-* --long HEAD^^2 +: >err.expect +check_describe A --all A^0 +test_expect_success 'no warning was displayed for A' ' + test_cmp err.expect err.actual +' + test_expect_success 'rename tag A to Q locally' ' mv .git/refs/tags/A .git/refs/tags/Q ' diff --git a/t/t7007-show.sh b/t/t7007-show.sh new file mode 100755 index 0000000000..cce222f052 --- /dev/null +++ b/t/t7007-show.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +test_description='git show' + +. ./test-lib.sh + +test_expect_success setup ' + echo hello world >foo && + H=$(git hash-object -w foo) && + git tag -a foo-tag -m "Tags $H" $H && + HH=$(expr "$H" : "\(..\)") && + H38=$(expr "$H" : "..\(.*\)") && + rm -f .git/objects/$HH/$H38 +' + +test_expect_success 'showing a tag that point at a missing object' ' + test_must_fail git --no-pager show foo-tag +' + +test_done diff --git a/t/t7607-merge-overwrite.sh b/t/t7607-merge-overwrite.sh new file mode 100755 index 0000000000..49f4e1599a --- /dev/null +++ b/t/t7607-merge-overwrite.sh @@ -0,0 +1,87 @@ +#!/bin/sh + +test_description='git-merge + +Do not overwrite changes.' + +. ./test-lib.sh + +test_expect_success 'setup' ' + echo c0 > c0.c && + git add c0.c && + git commit -m c0 && + git tag c0 && + echo c1 > c1.c && + git add c1.c && + git commit -m c1 && + git tag c1 && + git reset --hard c0 && + echo c2 > c2.c && + git add c2.c && + git commit -m c2 && + git tag c2 && + git reset --hard c1 && + echo "c1 a" > c1.c && + git add c1.c && + git commit -m "c1 a" && + git tag c1a && + echo "VERY IMPORTANT CHANGES" > important +' + +test_expect_success 'will not overwrite untracked file' ' + git reset --hard c1 && + cat important > c2.c && + ! git merge c2 && + test_cmp important c2.c +' + +test_expect_success 'will not overwrite new file' ' + git reset --hard c1 && + cat important > c2.c && + git add c2.c && + ! git merge c2 && + test_cmp important c2.c +' + +test_expect_success 'will not overwrite staged changes' ' + git reset --hard c1 && + cat important > c2.c && + git add c2.c && + rm c2.c && + ! git merge c2 && + git checkout c2.c && + test_cmp important c2.c +' + +test_expect_success 'will not overwrite removed file' ' + git reset --hard c1 && + git rm c1.c && + git commit -m "rm c1.c" && + cat important > c1.c && + ! git merge c1a && + test_cmp important c1.c +' + +test_expect_success 'will not overwrite re-added file' ' + git reset --hard c1 && + git rm c1.c && + git commit -m "rm c1.c" && + cat important > c1.c && + git add c1.c && + ! git merge c1a && + test_cmp important c1.c +' + +test_expect_success 'will not overwrite removed file with staged changes' ' + git reset --hard c1 && + git rm c1.c && + git commit -m "rm c1.c" && + cat important > c1.c && + git add c1.c && + rm c1.c && + ! git merge c1a && + git checkout c1.c && + test_cmp important c1.c +' + +test_done diff --git a/t/t9129-git-svn-i18n-commitencoding.sh b/t/t9129-git-svn-i18n-commitencoding.sh index 938b7fe4b4..8a9dde44d5 100755 --- a/t/t9129-git-svn-i18n-commitencoding.sh +++ b/t/t9129-git-svn-i18n-commitencoding.sh @@ -60,21 +60,25 @@ do ' done -test_expect_success 'ISO-8859-1 should match UTF-8 in svn' ' -( - cd ISO-8859-1 && - compare_svn_head_with "$TEST_DIRECTORY"/t3900/1-UTF-8.txt -) -' - -for H in EUCJP ISO-2022-JP -do - test_expect_success '$H should match UTF-8 in svn' ' +if locale -a |grep -q en_US.utf8; then + test_expect_success 'ISO-8859-1 should match UTF-8 in svn' ' ( - cd $H && - compare_svn_head_with "$TEST_DIRECTORY"/t3900/2-UTF-8.txt + cd ISO-8859-1 && + compare_svn_head_with "$TEST_DIRECTORY"/t3900/1-UTF-8.txt ) ' -done + + for H in EUCJP ISO-2022-JP + do + test_expect_success '$H should match UTF-8 in svn' ' + ( + cd $H && + compare_svn_head_with "$TEST_DIRECTORY"/t3900/2-UTF-8.txt + ) + ' + done +else + say "UTF-8 locale not available, test skipped" +fi test_done diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh index 91b5aced1b..821be7ce8d 100755 --- a/t/t9300-fast-import.sh +++ b/t/t9300-fast-import.sh @@ -56,6 +56,12 @@ M 644 :2 file2 M 644 :3 file3 M 755 :4 file4 +tag series-A +from :5 +data <<EOF +An annotated tag without a tagger +EOF + INPUT_END test_expect_success \ 'A: create pack from stdin' \ @@ -102,6 +108,18 @@ test_expect_success \ 'git cat-file blob master:file4 >actual && test_cmp expect actual' cat >expect <<EOF +object $(git rev-parse refs/heads/master) +type commit +tag series-A + +An annotated tag without a tagger +EOF +test_expect_success 'A: verify tag/series-A' ' + git cat-file tag tags/series-A >actual && + test_cmp expect actual +' + +cat >expect <<EOF :2 `git rev-parse --verify master:file2` :3 `git rev-parse --verify master:file3` :4 `git rev-parse --verify master:file4` diff --git a/t/t9301-fast-export.sh b/t/t9301-fast-export.sh index 2057435462..9985721055 100755 --- a/t/t9301-fast-export.sh +++ b/t/t9301-fast-export.sh @@ -239,4 +239,24 @@ test_expect_success 'fast-export | fast-import when master is tagged' ' ' +cat > tag-content << EOF +object $(git rev-parse HEAD) +type commit +tag rosten +EOF + +test_expect_success 'cope with tagger-less tags' ' + + TAG=$(git hash-object -t tag -w tag-content) && + git update-ref refs/tags/sonnenschein $TAG && + git fast-export -C -C --signed-tags=strip --all > output && + test $(grep -c "^tag " output) = 4 && + ! grep "Unspecified Tagger" output && + git fast-export -C -C --signed-tags=strip --all \ + --fake-missing-tagger > output && + test $(grep -c "^tag " output) = 4 && + grep "Unspecified Tagger" output + +' + test_done |