diff options
315 files changed, 27130 insertions, 5870 deletions
diff --git a/.gitignore b/.gitignore index 1dbeb668db..bf66648e2c 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ /git-cherry-pick /git-clean /git-clone +/git-column /git-commit /git-commit-tree /git-config diff --git a/Documentation/Makefile b/Documentation/Makefile index 9fee0b9261..14286cb657 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -82,7 +82,7 @@ endif # ifndef ASCIIDOC7 -ASCIIDOC_EXTRA += -a asciidoc7compatible -a no-inline-literal +ASCIIDOC_EXTRA += -a asciidoc7compatible endif ifdef DOCBOOK_XSL_172 ASCIIDOC_EXTRA += -a git-asciidoc-no-roff diff --git a/Documentation/RelNotes/1.7.10.2.txt b/Documentation/RelNotes/1.7.10.2.txt new file mode 100644 index 0000000000..7a7e9d6fd1 --- /dev/null +++ b/Documentation/RelNotes/1.7.10.2.txt @@ -0,0 +1,85 @@ +Git v1.7.10.2 Release Notes +=========================== + +Fixes since v1.7.10.1 +--------------------- + + * The test scaffolding for git-daemon was flaky. + + * The test scaffolding for fast-import was flaky. + + * The filesystem boundary was not correctly reported when .git directory + discovery stopped at a mount point. + + * HTTP transport that requires authentication did not work correctly when + multiple connections are used simultaneously. + + * Minor memory leak during unpack_trees (hence "merge" and "checkout" + to check out another branch) has been plugged. + + * In the older days, the header "Conflicts:" in "cherry-pick" and "merge" + was separated by a blank line from the list of paths that follow for + readability, but when "merge" was rewritten in C, we lost it by + mistake. Remove the newline from "cherry-pick" to make them match + again. + + * The command line parser choked "git cherry-pick $name" when $name can + be both revision name and a pathname, even though $name can never be a + path in the context of the command. + + * The "include.path" facility in the configuration mechanism added in + 1.7.10 forgot to interpret "~/path" and "~user/path" as it should. + + * "git config --rename-section" to rename an existing section into a + bogus one did not check the new name. + + * The "diff --no-index" codepath used limited-length buffers, risking + pathnames getting truncated. Update it to use the strbuf API. + + * The report from "git fetch" said "new branch" even for a non branch + ref. + + * The http-backend (the server side of the smart http transfer) used + to overwrite GIT_COMMITTER_NAME and GIT_COMMITTER_EMAIL with the + value obtained from REMOTE_USER unconditionally, making it + impossible for the server side site-specific customization to use + different identity sources to affect the names logged. It now uses + REMOTE_USER only as a fallback value. + + * "log --graph" was not very friendly with "--stat" option and its + output had line breaks at wrong places. + + * Octopus merge strategy did not reduce heads that are recorded in the + final commit correctly. + + * "git push" over smart-http lost progress output a few releases ago; + this release resurrects it. + + * The error and advice messages given by "git push" when it fails due + to non-ff were not very helpful to new users; it has been broken + into three cases, and each is given a separate advice message. + + * The insn sheet given by "rebase -i" did not make it clear that the + insn lines can be re-ordered to affect the order of the commits in + the resulting history. + + * "git repack" used to write out unreachable objects as loose objects + when repacking, even if such loose objects will immediately pruned + due to its age. + + * A contrib script "rerere-train" did not work out of the box unless + user futzed with her $PATH. + + * "git rev-parse --show-prefix" used to emit nothing when run at the + top-level of the working tree, but now it gives a blank line. + + * The i18n of error message "git stash save" was not properly done. + + * "git submodule" used a sed script that some platforms mishandled. + + * When using a Perl script on a system where "perl" found on user's + $PATH could be ancient or otherwise broken, we allow builders to + specify the path to a good copy of Perl with $PERL_PATH. The + gitweb test forgot to use that Perl when running its test. + +Also contains minor fixes and documentation updates. diff --git a/Documentation/RelNotes/1.7.10.3.txt b/Documentation/RelNotes/1.7.10.3.txt new file mode 100644 index 0000000000..703fbf1d60 --- /dev/null +++ b/Documentation/RelNotes/1.7.10.3.txt @@ -0,0 +1,43 @@ +Git v1.7.10.3 Release Notes +=========================== + +Fixes since v1.7.10.2 +--------------------- + + * The message file for German translation has been updated a bit. + + * Running "git checkout" on an unborn branch used to corrupt HEAD. + + * When checking out another commit from an already detached state, we + used to report all commits that are not reachable from any of the + refs as lossage, but some of them might be reachable from the new + HEAD, and there is no need to warn about them. + + * Some time ago, "git clone" lost the progress output for its + "checkout" phase; when run without any "--quiet" option, it should + give progress to the lengthy operation. + + * The directory path used in "git diff --no-index", when it recurses + down, was broken with a recent update after v1.7.10.1 release. + + * "log -z --pretty=tformat:..." did not terminate each record with + NUL. The fix is not entirely correct when the output also asks for + --patch and/or --stat, though. + + * The DWIM behaviour for "log --pretty=format:%gd -g" was somewhat + broken and gave undue precedence to configured log.date, causing + "git stash list" to show "stash@{time stamp string}". + + * "git status --porcelain" ignored "--branch" option by mistake. The + output for "git status --branch -z" was also incorrect and did not + terminate the record for the current branch name with NUL as asked. + + * When a submodule repository uses alternate object store mechanism, + some commands that were started from the superproject did not + notice it and failed with "No such object" errors. The subcommands + of "git submodule" command that recursed into the submodule in a + separate process were OK; only the ones that cheated and peeked + directly into the submodule's repository from the primary process + were affected. + +Also contains minor fixes and documentation updates. diff --git a/Documentation/RelNotes/1.7.10.4.txt b/Documentation/RelNotes/1.7.10.4.txt new file mode 100644 index 0000000000..326670df6e --- /dev/null +++ b/Documentation/RelNotes/1.7.10.4.txt @@ -0,0 +1,29 @@ +Git v1.7.10.4 Release Notes +=========================== + +Fixes since v1.7.10.3 +--------------------- + + * The message file for Swedish translation has been updated a bit. + + * A name taken from mailmap was copied into an internal buffer + incorrectly and could overun the buffer if it is too long. + + * A malformed commit object that has a header line chomped in the + middle could kill git with a NULL pointer dereference. + + * An author/committer name that is a single character was mishandled + as an invalid name by mistake. + + * The progress indicator for a large "git checkout" was sent to + stderr even if it is not a terminal. + + * "git grep -e '$pattern'", unlike the case where the patterns are + read from a file, did not treat individual lines in the given + pattern argument as separate regular expressions as it should. + + * When "git rebase" was given a bad commit to replay the history on, + its error message did not correctly give the command line argument + it had trouble parsing. + +Also contains minor fixes and documentation updates. diff --git a/Documentation/RelNotes/1.7.11.txt b/Documentation/RelNotes/1.7.11.txt index 429f304972..f74adcc0be 100644 --- a/Documentation/RelNotes/1.7.11.txt +++ b/Documentation/RelNotes/1.7.11.txt @@ -6,6 +6,16 @@ Updates since v1.7.10 UI, Workflows & Features + * A new mode for push, "simple", which is a cross between "current" + and "upstream", has been introduced. "git push" without any refspec + will push the current branch out to the same name at the remote + repository only when it is set to track the branch with the same + name over there. The plan is to make this mode the new default + value when push.default is not configured. + + * A couple of commands learned the "--column" option to produce + columnar output. + * A third-party tool "git subtree" is distributed in contrib/ * Error messages given when @{u} is used for a branch without its @@ -15,13 +25,15 @@ UI, Workflows & Features tracking. Also "branch" learned the "-q"uiet option to squelch informational message. + * Your build platform may support hardlinks but you may prefer not to + use them, e.g. when installing to DESTDIR to make a tarball and + untarring on a filesystem that has poor support for hardlinks. + There is a Makefile option NO_INSTALL_HARDLINKS for you. + * The smart-http backend used to always override GIT_COMMITTER_* variables with REMOTE_USER and REMOTE_ADDR, but these variables are now preserved when set. - * "include.path" mechanism of the configuration files learned to - understand "~/path" and "~user/path". - * "git am" learned the "--include" option, which is an opposite of existing the "--exclude" option. @@ -30,11 +42,19 @@ UI, Workflows & Features needed such treatment are now reported to the end user, so that the result in them can be eyeballed with extra care. + * The output from "diff/log --stat" used to always allocate 4 columns + to show the number of modified lines, but not anymore. + + * "git difftool" learned the "--dir-diff" option to spawn external + diff tools that can compare two directory hierarchies at a time + after populating two temporary directories, instead of running an + instance of the external tool once per a file pair. + * The "fmt-merge-msg" command learns to list the primary contributors involved in the side topic you are merging. - * The cases "git push" fails due to non-ff can be broken into three - categories; each case is given a separate advise message. + * "git rebase" learned to optionally keep commits that do not + introduce any change in the original history. * "git push --recurse-submodules" learned to optionally look into the histories of submodules bound to the superproject and push them @@ -53,32 +73,42 @@ Foreign Interface * "git svn" learned to use platform specific authentication providers, e.g. gnome-keyring, kwallet, etc. - * "git p4" has been moved out of contrib/ area. + * "git p4" has been moved out of contrib/ area and has seen more work + on importing labels as tags from (and exporting tags as labels to) + p4. -Performance +Performance and Internal Implementation (please report possible regressions) - * "git apply" had some memory leaks plugged. + * Bash completion script (in contrib/) have been cleaned up to make + future work on it simpler. + + * An experimental "version 4" format of the index file has been + introduced to reduce on-disk footprint and I/O overhead. + + * "git archive" learned to produce its output without reading the + blob object it writes out in memory in its entirety. - * "git repack" used to write out unreachable objects as loose objects - when repacking, even if such loose objects will immediately pruned - due to its age. + * "git index-pack" that runs when fetching or pushing objects to + complete the packfile on the receiving end learned to use multiple + threads to do its job when available. + + * The code to compute hash values for lines used by the internal diff + engine was optimized on little-endian machines, using the same + trick the kernel folks came up with. + + * "git apply" had some memory leaks plugged. * Setting up a revision traversal with many starting points was inefficient as these were placed in a date-order priority queue one-by-one. Now they are collected in the queue unordered first, and sorted immediately before getting used. -Internal Implementation (please report possible regressions) - - * "git rev-parse --show-prefix" used to emit nothing when run at the - top-level of the working tree, but now it gives a blank line. - - * Minor memory leak during unpack_trees (hence "merge" and "checkout" - to check out another branch) has been plugged. - * More lower-level commands learned to use the streaming API to read from the object store without keeping everything in core. + * The weighting parameters to suggestion command name typo have been + tweaked, so that "git tags" will suggest "tag?" and not "stage?". + * Because "sh" on the user's PATH may be utterly broken on some systems, run-command API now uses SHELL_PATH, not /bin/sh, when spawning an external command (not applicable to Windows port). @@ -96,71 +126,15 @@ Unless otherwise noted, all the fixes since v1.7.10 in the maintenance releases are contained in this release (see release notes to them for details). - * The test scaffolding for git-daemon was flaky. - (merge 46e3581 js/daemon-test-race-fix later to maint). - - * The test scaffolding for fast-import was flaky. - (merge 7fb8e16 pw/t5800-import-race-fix later to maint). - - * Octopus merge strategy did not reduce heads that are recorded in the - final commit correctly. - (merge 5802f81 jc/merge-reduce-parents-early later to maint). - - * In the older days, the header "Conflicts:" in "cherry-pick" and - "merge" was separated by a blank line from the list of paths that - follow for readability, but when "merge" was rewritten in C, we lost - it by mistake. Remove the newline from "cherry-pick" to make them - match again. - (merge 5112068 rt/cherry-revert-conflict-summary later to maint). - - * The filesystem boundary was not correctly reported when .git - directory discovery stopped at a mount point. - (merge 2565b43 cb/maint-report-mount-point-correctly-in-setup later to maint). - - * The command line parser choked "git cherry-pick $name" when $name - can be both revision name and a pathname, even though $name can - never be a path in the context of the command. - (merge 6d5b93f cb/cherry-pick-rev-path-confusion later to maint). - - * HTTP transport that requires authentication did not work correctly - when multiple connections are used simultaneously. - (merge 6f4c347 cb/http-multi-curl-auth later to maint). - - * The i18n of error message "git stash save" was not properly done. - (merge ed3c400 rl/maint-stash-i18n-save-error later to maint). - - * The report from "git fetch" said "new branch" even for a non branch - ref. - (merge 0997ada mb/fetch-call-a-non-branch-a-ref later to maint). - - * The "diff --no-index" codepath used limited-length buffers, risking - pathnames getting truncated. Update it to use the strbuf API. - (merge 875b91b jm/maint-strncpy-diff-no-index later to maint). - - * The parser in "fast-import" did not diagnose ":9" style references - that is not followed by required SP/LF as an error. - (merge 06454cb pw/fast-import-dataref-parsing later to maint). - - * When "git fetch" encounters repositories with too many references, - the command line of "fetch-pack" that is run by a helper - e.g. remote-curl, may fail to hold all of them. Now such an - internal invocation can feed the references through the standard - input of "fetch-pack". - (merge 7103d25 it/fetch-pack-many-refs later to maint). - - * "git fetch" that recurses into submodules on demand did not check - if it needs to go into submodules when non branches (most notably, - tags) are fetched. - (merge a6801ad jl/maint-submodule-recurse-fetch later to maint). - - * "git blame" started missing quite a few changes from the origin - since we stopped using the diff minimalization by default in v1.7.2 - era. - (merge 059a500 jc/maint-blame-minimal later to maint). - - * "log -p --graph" used with "--stat" had a few formatting error. - (merge e2c5966 lp/maint-diff-three-dash-with-graph later to maint). - - * Giving "--continue" to a conflicted "rebase -i" session skipped a - commit that only results in changes to submodules. - (merge a6754cd jk/rebase-i-submodule-conflict-only later to maint). + * "git rebase -p" used to pay attention to rebase.autosquash which + was wrong. "git rebase -p -i" should, but "git rebase -p" by + itself should not. + (cherry-pick 8a6dae1 vr/rebase-autosquash-does-not-imply-i later to maint). + + * "git submodule init" used to report "registered for path ..." + even for submodules that were registered earlier. + (cherry-pick c1c259e jl/submodule-report-new-path-once later to maint). + + * "git diff --stat" used to fully count a binary file with modified + execution bits whose contents is unmodified, which was not quite + right. diff --git a/Documentation/config.txt b/Documentation/config.txt index 83ad8ebce0..915cb5a547 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -95,8 +95,8 @@ included file is expanded immediately, as if its contents had been found at the location of the include directive. If the value of the `include.path` variable is a relative path, the path is considered to be relative to the configuration file in which the include directive was -found. The value of `include.path` is subject to tilde expansion: `{tilde}/` -is expanded to the value of `$HOME`, and `{tilde}user/` to the specified +found. The value of `include.path` is subject to tilde expansion: `~/` +is expanded to the value of `$HOME`, and `~user/` to the specified user's home directory. See below for examples. Example @@ -481,8 +481,8 @@ Common unit suffixes of 'k', 'm', or 'g' are supported. core.excludesfile:: In addition to '.gitignore' (per-directory) and '.git/info/exclude', git looks into this file for patterns - of files which are not meant to be tracked. "{tilde}/" is expanded - to the value of `$HOME` and "{tilde}user/" to the specified user's + of files which are not meant to be tracked. "`~/`" is expanded + to the value of `$HOME` and "`~user/`" to the specified user's home directory. See linkgit:gitignore[5]. core.askpass:: @@ -856,6 +856,44 @@ color.ui:: `never` if you prefer git commands not to use color unless enabled explicitly with some other configuration or the `--color` option. +column.ui:: + Specify whether supported commands should output in columns. + This variable consists of a list of tokens separated by spaces + or commas: ++ +-- +`always`;; + always show in columns +`never`;; + never show in columns +`auto`;; + show in columns if the output is to the terminal +`column`;; + fill columns before rows (default) +`row`;; + fill rows before columns +`plain`;; + show in one column +`dense`;; + make unequal size columns to utilize more space +`nodense`;; + make equal size columns +-- ++ + This option defaults to 'never'. + +column.branch:: + Specify whether to output branch listing in `git branch` in columns. + See `column.ui` for details. + +column.status:: + Specify whether to output untracked files in `git status` in columns. + See `column.ui` for details. + +column.tag:: + Specify whether to output tag listing in `git tag` in columns. + See `column.ui` for details. + commit.status:: A boolean to enable/disable inclusion of status information in the commit message template when using an editor to prepare the commit @@ -863,7 +901,7 @@ commit.status:: commit.template:: Specify a file to use as the template for new commit messages. - "{tilde}/" is expanded to the value of `$HOME` and "{tilde}user/" to the + "`~/`" is expanded to the value of `$HOME` and "`~user/`" to the specified user's home directory. credential.helper:: @@ -988,7 +1026,7 @@ format.thread:: a boolean value, or `shallow` or `deep`. `shallow` threading makes every mail a reply to the head of the series, where the head is chosen from the cover letter, the - `\--in-reply-to`, and the first patch mail, in this order. + `--in-reply-to`, and the first patch mail, in this order. `deep` threading makes every mail a reply to the previous one. A true boolean value is the same as `shallow`, and a false value disables threading. @@ -1419,7 +1457,7 @@ instaweb.port:: interactive.singlekey:: In interactive commands, allow the user to provide one-letter input with a single key (i.e., without hitting enter). - Currently this is used by the `\--patch` mode of + Currently this is used by the `--patch` mode of linkgit:git-add[1], linkgit:git-checkout[1], linkgit:git-commit[1], linkgit:git-reset[1], and linkgit:git-stash[1]. Note that this setting is silently ignored if portable keystroke input @@ -1427,13 +1465,13 @@ interactive.singlekey:: log.abbrevCommit:: If true, makes linkgit:git-log[1], linkgit:git-show[1], and - linkgit:git-whatchanged[1] assume `\--abbrev-commit`. You may - override this option with `\--no-abbrev-commit`. + linkgit:git-whatchanged[1] assume `--abbrev-commit`. You may + override this option with `--no-abbrev-commit`. log.date:: Set the default date-time mode for the 'log' command. Setting a value for log.date is similar to using 'git log''s - `\--date` option. Possible values are `relative`, `local`, + `--date` option. Possible values are `relative`, `local`, `default`, `iso`, `rfc`, and `short`; see linkgit:git-log[1] for details. @@ -1623,18 +1661,18 @@ pack.indexVersion:: and this config option ignored whenever the corresponding pack is larger than 2 GB. + -If you have an old git that does not understand the version 2 `{asterisk}.idx` file, +If you have an old git that does not understand the version 2 `*.idx` file, cloning or fetching over a non native protocol (e.g. "http" and "rsync") -that will copy both `{asterisk}.pack` file and corresponding `{asterisk}.idx` file from the +that will copy both `*.pack` file and corresponding `*.idx` file from the other side may give you a repository that cannot be accessed with your -older version of git. If the `{asterisk}.pack` file is smaller than 2 GB, however, +older version of git. If the `*.pack` file is smaller than 2 GB, however, you can use linkgit:git-index-pack[1] on the *.pack file to regenerate -the `{asterisk}.idx` file. +the `*.idx` file. pack.packSizeLimit:: The maximum size of a pack. This setting only affects packing to a file when repacking, i.e. the git:// protocol - is unaffected. It can be overridden by the `\--max-pack-size` + is unaffected. It can be overridden by the `--max-pack-size` option of linkgit:git-repack[1]. The minimum size allowed is limited to 1 MiB. The default is unlimited. Common unit suffixes of 'k', 'm', or 'g' are @@ -1644,8 +1682,8 @@ pager.<cmd>:: If the value is boolean, turns on or off pagination of the output of a particular git subcommand when writing to a tty. Otherwise, turns on pagination for the subcommand using the - pager specified by the value of `pager.<cmd>`. If `\--paginate` - or `\--no-pager` is specified on the command line, it takes + pager specified by the value of `pager.<cmd>`. If `--paginate` + or `--no-pager` is specified on the command line, it takes precedence over this option. To disable pagination for all commands, set `core.pager` or `GIT_PAGER` to `cat`. @@ -1653,9 +1691,9 @@ pretty.<name>:: Alias for a --pretty= format string, as specified in linkgit:git-log[1]. Any aliases defined here can be used just as the built-in pretty formats could. For example, - running `git config pretty.changelog "format:{asterisk} %H %s"` + running `git config pretty.changelog "format:* %H %s"` would cause the invocation `git log --pretty=changelog` - to be equivalent to running `git log "--pretty=format:{asterisk} %H %s"`. + to be equivalent to running `git log "--pretty=format:* %H %s"`. Note that an alias with the same name as a built-in format will be silently ignored. @@ -1683,12 +1721,30 @@ push.default:: line. Possible values are: + * `nothing` - do not push anything. -* `matching` - push all matching branches. - All branches having the same name in both ends are considered to be - matching. This is the default. +* `matching` - push all branches having the same name in both ends. + This is for those who prepare all the branches into a publishable + shape and then push them out with a single command. It is not + appropriate for pushing into a repository shared by multiple users, + since locally stalled branches will attempt a non-fast forward push + if other users updated the branch. + + + This is currently the default, but Git 2.0 will change the default + to `simple`. * `upstream` - push the current branch to its upstream branch. -* `tracking` - deprecated synonym for `upstream`. + With this, `git push` will update the same remote ref as the one which + is merged by `git pull`, making `push` and `pull` symmetrical. + See "branch.<name>.merge" for how to configure the upstream branch. +* `simple` - like `upstream`, but refuses to push if the upstream + branch's name is different from the local one. This is the safest + option and is well-suited for beginners. It will become the default + in Git 2.0. * `current` - push the current branch to a branch of the same name. + + + The `simple`, `current` and `upstream` modes are for those who want to + push out a single branch after finishing work, even when the other + branches are not yet ready to be pushed out. If you are working with + other people to push into the same shared repository, you would want + to use one of these. rebase.stat:: Whether to show a diffstat of what changed upstream since the last @@ -1768,7 +1824,7 @@ remote.<name>.push:: remote.<name>.mirror:: If true, pushing to this remote will automatically behave - as if the `\--mirror` option was given on the command line. + as if the `--mirror` option was given on the command line. remote.<name>.skipDefaultUpdate:: If true, this remote will be skipped by default when updating diff --git a/Documentation/diff-generate-patch.txt b/Documentation/diff-generate-patch.txt index c57460c03d..55f499a160 100644 --- a/Documentation/diff-generate-patch.txt +++ b/Documentation/diff-generate-patch.txt @@ -175,7 +175,7 @@ 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 eight other lines are the same -from file1 but do not appear in file2 (hence prefixed with `{plus}`). +from file1 but do not appear in file2 (hence prefixed with `+`). 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 378f19f0e2..6cfedd85dc 100644 --- a/Documentation/diff-options.txt +++ b/Documentation/diff-options.txt @@ -74,7 +74,7 @@ These parameters can also be set individually with `--stat-width=<width>`, `--stat-name-width=<name-width>` and `--stat-count=<count>`. --numstat:: - Similar to `\--stat`, but shows number of added and + Similar to `--stat`, but shows number of added and deleted lines in decimal notation and pathname without abbreviation, to make it more machine friendly. For binary files, outputs two `-` instead of saying diff --git a/Documentation/everyday.txt b/Documentation/everyday.txt index ae413e52a5..048337b40f 100644 --- a/Documentation/everyday.txt +++ b/Documentation/everyday.txt @@ -98,8 +98,8 @@ you originally wrote. <9> switch to the master branch. <10> merge a topic branch into your master branch. <11> review commit logs; other forms to limit output can be -combined and include `\--max-count=10` (show 10 commits), -`\--until=2005-12-10`, etc. +combined and include `--max-count=10` (show 10 commits), +`--until=2005-12-10`, etc. <12> view only the changes that touch what's in `curses/` directory, since `v2.43` tag. diff --git a/Documentation/git-archive.txt b/Documentation/git-archive.txt index ac7006e640..59d73e532f 100644 --- a/Documentation/git-archive.txt +++ b/Documentation/git-archive.txt @@ -160,7 +160,7 @@ EXAMPLES Same as above, but the format is inferred from the output file. -`git archive --format=tar --prefix=git-1.4.0/ v1.4.0{caret}\{tree\} | gzip >git-1.4.0.tar.gz`:: +`git archive --format=tar --prefix=git-1.4.0/ v1.4.0^{tree} | gzip >git-1.4.0.tar.gz`:: Create a compressed tarball for v1.4.0 release, but without a global extended pax header. diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt index 9516914236..7ee923629e 100644 --- a/Documentation/git-blame.txt +++ b/Documentation/git-blame.txt @@ -160,7 +160,7 @@ introduced the file with: git log --diff-filter=A --pretty=short -- foo and then annotate the change between the commit and its -parents, using `commit{caret}!` notation: +parents, using `commit^!` notation: git blame -C -C -f $commit^! -- foo diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt index e71370d6b4..47235bea04 100644 --- a/Documentation/git-branch.txt +++ b/Documentation/git-branch.txt @@ -10,6 +10,7 @@ SYNOPSIS [verse] 'git branch' [--color[=<when>] | --no-color] [-r | -a] [--list] [-v [--abbrev=<length> | --no-abbrev]] + [--column[=<options>] | --no-column] [(--merged | --no-merged | --contains) [<commit>]] [<pattern>...] 'git branch' [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>] 'git branch' (-m | -M) [<oldbranch>] <newbranch> @@ -107,6 +108,14 @@ OPTIONS default to color output. Same as `--color=never`. +--column[=<options>]:: +--no-column:: + Display branch listing in columns. See configuration variable + column.branch for option syntax.`--column` and `--no-column` + without options are equivalent to 'always' and 'never' respectively. ++ +This option is only applicable in non-verbose mode. + -r:: --remotes:: List or delete (if used with -d) the remote-tracking branches. diff --git a/Documentation/git-bundle.txt b/Documentation/git-bundle.txt index 92b01ec25d..16a6b0aceb 100644 --- a/Documentation/git-bundle.txt +++ b/Documentation/git-bundle.txt @@ -61,7 +61,7 @@ unbundle <file>:: A list of arguments, acceptable to 'git rev-parse' and 'git rev-list' (and containing a named ref, see SPECIFYING REFERENCES below), that specifies the specific objects and references - to transport. For example, `master{tilde}10..master` causes the + to transport. For example, `master~10..master` causes the current master reference to be packaged along with all objects added since its 10th ancestor commit. There is no explicit limit to the number of references and objects that may be @@ -80,12 +80,12 @@ SPECIFYING REFERENCES 'git bundle' will only package references that are shown by 'git show-ref': this includes heads, tags, and remote heads. References -such as `master{tilde}1` cannot be packaged, but are perfectly suitable for +such as `master~1` cannot be packaged, but are perfectly suitable for defining the basis. More than one reference may be packaged, and more than one basis can be specified. The objects packaged are those not contained in the union of the given bases. Each basis can be -specified explicitly (e.g. `^master{tilde}10`), or implicitly (e.g. -`master{tilde}10..master`, `--since=10.days.ago master`). +specified explicitly (e.g. `^master~10`), or implicitly (e.g. +`master~10..master`, `--since=10.days.ago master`). It is very important that the basis used be held by the destination. It is okay to err on the side of caution, causing the bundle file diff --git a/Documentation/git-check-ref-format.txt b/Documentation/git-check-ref-format.txt index 103e7b128d..98009d1bd5 100644 --- a/Documentation/git-check-ref-format.txt +++ b/Documentation/git-check-ref-format.txt @@ -40,9 +40,9 @@ git imposes the following rules on how references are named: . They cannot have ASCII control characters (i.e. bytes whose values are lower than \040, or \177 `DEL`), space, tilde `~`, - caret `{caret}`, or colon `:` anywhere. + caret `^`, or colon `:` anywhere. -. They cannot have question-mark `?`, asterisk `{asterisk}`, or open +. They cannot have question-mark `?`, asterisk `*`, or open bracket `[` anywhere. See the `--refspec-pattern` option below for an exception to this rule. @@ -62,10 +62,10 @@ unquoted (by mistake), and also avoids ambiguities in certain reference name expressions (see linkgit:gitrevisions[7]): . A double-dot `..` is often used as in `ref1..ref2`, and in some - contexts this notation means `{caret}ref1 ref2` (i.e. not in + contexts this notation means `^ref1 ref2` (i.e. not in `ref1` and in `ref2`). -. A tilde `~` and caret `{caret}` are used to introduce the postfix +. A tilde `~` and caret `^` are used to introduce the postfix 'nth parent' and 'peel onion' operation. . A colon `:` is used as in `srcref:dstref` to mean "use srcref\'s @@ -92,9 +92,9 @@ OPTIONS --refspec-pattern:: Interpret <refname> as a reference name pattern for a refspec (as used with remote repositories). If this option is - enabled, <refname> is allowed to contain a single `{asterisk}` + enabled, <refname> is allowed to contain a single `*` in place of a one full pathname component (e.g., - `foo/{asterisk}/bar` but not `foo/bar{asterisk}`). + `foo/*/bar` but not `foo/bar*`). --normalize:: Normalize 'refname' by removing any leading slash (`/`) diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index c0a96e6c1e..63a251612a 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -184,7 +184,7 @@ the conflicted merge in the specified paths. + This means that you can use `git checkout -p` to selectively discard edits from your current working tree. See the ``Interactive Mode'' -section of linkgit:git-add[1] to learn how to operate the `\--patch` mode. +section of linkgit:git-add[1] to learn how to operate the `--patch` mode. <branch>:: Branch to checkout; if it refers to a branch (i.e., a name that, @@ -193,11 +193,11 @@ section of linkgit:git-add[1] to learn how to operate the `\--patch` mode. commit, your HEAD becomes "detached" and you are no longer on any branch (see below for details). + -As a special case, the `"@\{-N\}"` syntax for the N-th last branch +As a special case, the `"@{-N}"` syntax for the N-th last branch checks out the branch (instead of detaching). You may also specify -`-` which is synonymous with `"@\{-1\}"`. +`-` which is synonymous with `"@{-1}"`. + -As a further special case, you may use `"A\...B"` as a shortcut for the +As a further special case, you may use `"A...B"` as a shortcut for the merge base of `A` and `B` if there is exactly one merge base. You can leave out at most one of `A` and `B`, in which case it defaults to `HEAD`. diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt index 3d25a20b67..9f3dae631e 100644 --- a/Documentation/git-cherry-pick.txt +++ b/Documentation/git-cherry-pick.txt @@ -149,7 +149,7 @@ EXAMPLES Apply the changes introduced by all commits that are ancestors of master but not of HEAD to produce new commits. -`git cherry-pick master{tilde}4 master{tilde}2`:: +`git cherry-pick master~4 master~2`:: Apply the changes introduced by the fifth and third last commits pointed to by master and create 2 new commits with @@ -170,7 +170,7 @@ EXAMPLES are in next but not HEAD to the current branch, creating a new commit for each new change. -`git rev-list --reverse master \-- README | git cherry-pick -n --stdin`:: +`git rev-list --reverse master -- README | git cherry-pick -n --stdin`:: Apply the changes introduced by all commits on the master branch that touched README to the working tree and index, diff --git a/Documentation/git-column.txt b/Documentation/git-column.txt new file mode 100644 index 0000000000..9be16eea0e --- /dev/null +++ b/Documentation/git-column.txt @@ -0,0 +1,53 @@ +git-column(1) +============= + +NAME +---- +git-column - Display data in columns + +SYNOPSIS +-------- +[verse] +'git column' [--command=<name>] [--[raw-]mode=<mode>] [--width=<width>] + [--indent=<string>] [--nl=<string>] [--pading=<n>] + +DESCRIPTION +----------- +This command formats its input into multiple columns. + +OPTIONS +------- +--command=<name>:: + Look up layout mode using configuration variable column.<name> and + column.ui. + +--mode=<mode>:: + Specify layout mode. See configuration variable column.ui for option + syntax. + +--raw-mode=<n>:: + Same as --mode but take mode encoded as a number. This is mainly used + by other commands that have already parsed layout mode. + +--width=<width>:: + Specify the terminal width. By default 'git column' will detect the + terminal width, or fall back to 80 if it is unable to do so. + +--indent=<string>:: + String to be printed at the beginning of each line. + +--nl=<N>:: + String to be printed at the end of each line, + including newline character. + +--padding=<N>:: + The number of spaces between columns. One space by default. + + +Author +------ +Written by Nguyen Thai Ngoc Duy <pclouds@gmail.com> + +GIT +--- +Part of the linkgit:git[1] suite diff --git a/Documentation/git-commit-tree.txt b/Documentation/git-commit-tree.txt index cfb9906bb5..eb8ee9999e 100644 --- a/Documentation/git-commit-tree.txt +++ b/Documentation/git-commit-tree.txt @@ -88,15 +88,6 @@ for one to be entered and terminated with ^D. include::date-formats.txt[] -Diagnostics ------------ -You don't exist. Go away!:: - The passwd(5) gecos field couldn't be read -Your parents must have hated you!:: - The passwd(5) gecos field is longer than a giant static buffer. -Your sysadmin must hate you!:: - The passwd(5) name field is longer than a giant static buffer. - Discussion ---------- diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index 68abfcacca..2d695f619c 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -42,7 +42,7 @@ The content to be added can be specified in several ways: 5. by using the --interactive or --patch switches with the 'commit' command to decide one by one which files or hunks should be part of the commit, - before finalizing the operation. See the ``Interactive Mode`` section of + before finalizing the operation. See the ``Interactive Mode'' section of linkgit:git-add[1] to learn how to operate these modes. The `--dry-run` option can be used to obtain a @@ -287,7 +287,7 @@ When recording your own work, the contents of modified files in your working tree are temporarily stored to a staging area called the "index" with 'git add'. A file can be reverted back, only in the index but not in the working tree, -to that of the last commit with `git reset HEAD \-- <file>`, +to that of the last commit with `git reset HEAD -- <file>`, which effectively reverts 'git add' and prevents the changes to this file from participating in the next commit. After building the state to be committed incrementally with these commands, diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt index 81b03982e3..d9463cb387 100644 --- a/Documentation/git-config.txt +++ b/Documentation/git-config.txt @@ -44,11 +44,15 @@ a "true" or "false" string for bool), or '--path', which does some path expansion (see '--path' below). If no type specifier is passed, no checks or transformations are performed on the value. -The file-option can be one of '--system', '--global' or '--file' -which specify where the values will be read from or written to. -The default is to assume the config file of the current repository, -.git/config unless defined otherwise with GIT_DIR and GIT_CONFIG -(see <<FILES>>). +When reading, the values are read from the system, global and +repository local configuration files by default, and options +'--system', '--global', '--local' and '--file <filename>' can be +used to tell the command to read from only that location (see <<FILES>>). + +When writing, the new value is written to the repository local +configuration file by default, and options '--system', '--global', +'--file <filename>' can be used to tell the command to write to +that location (you can say '--local' but that is the default). This command will fail (with exit code ret) if: @@ -194,9 +198,7 @@ If not set explicitly with '--file', there are three files where 'git config' will search for configuration options: $GIT_DIR/config:: - Repository specific configuration file. (The filename is - of course relative to the repository root, not the working - directory.) + Repository specific configuration file. ~/.gitconfig:: User-specific configuration file. Also called "global" diff --git a/Documentation/git-cvsserver.txt b/Documentation/git-cvsserver.txt index 827bc988ed..88d814af0e 100644 --- a/Documentation/git-cvsserver.txt +++ b/Documentation/git-cvsserver.txt @@ -252,7 +252,7 @@ Configuring database backend 'git-cvsserver' uses the Perl DBI module. Please also read its documentation if changing these variables, especially -about `DBI\->connect()`. +about `DBI->connect()`. gitcvs.dbname:: Database name. The exact meaning depends on the diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt index fe38f667f9..31fc2e3aed 100644 --- a/Documentation/git-difftool.txt +++ b/Documentation/git-difftool.txt @@ -19,6 +19,12 @@ linkgit:git-diff[1]. OPTIONS ------- +-d:: +--dir-diff:: + Copy the modified files to a temporary location and perform + a directory diff on them. This mode never prompts before + launching the diff tool. + -y:: --no-prompt:: Do not prompt before launching a diff tool. @@ -30,11 +36,9 @@ OPTIONS -t <tool>:: --tool=<tool>:: - Use the diff tool specified by <tool>. - Valid diff tools are: - araxis, bc3, deltawalker, diffuse, emerge, ecmerge, gvimdiff, - kdiff3, kompare, meld, opendiff, p4merge, tkdiff, vimdiff and - xxdiff. + Use the diff tool specified by <tool>. Valid values include + emerge, kompare, meld, and vimdiff. Run `git difftool --tool-help` + for the list of valid <tool> settings. + If a diff tool is not specified, 'git difftool' will use the configuration variable `diff.tool`. If the @@ -62,6 +66,9 @@ of the diff post-image. `$MERGED` is the name of the file which is being compared. `$BASE` is provided for compatibility with custom merge tool commands and has the same value as `$MERGED`. +--tool-help:: + Print a list of diff tools that may be used with `--tool`. + -x <command>:: --extcmd=<command>:: Specify a custom command for viewing diffs. diff --git a/Documentation/git-fast-export.txt b/Documentation/git-fast-export.txt index f37eada63a..d6487e1ce0 100644 --- a/Documentation/git-fast-export.txt +++ b/Documentation/git-fast-export.txt @@ -104,7 +104,7 @@ marks the same across runs. [<git-rev-list-args>...]:: A list of arguments, acceptable to 'git rev-parse' and 'git rev-list', that specifies the specific objects and references - to export. For example, `master{tilde}10..master` causes the + to export. For example, `master~10..master` causes the current master reference to be exported along with all objects added since its 10th ancestor commit. diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt index b52dca5133..2620d28b4b 100644 --- a/Documentation/git-fast-import.txt +++ b/Documentation/git-fast-import.txt @@ -479,9 +479,9 @@ current branch value should be written as: ---- from refs/heads/branch^0 ---- -The `{caret}0` suffix is necessary as fast-import does not permit a branch to +The `^0` suffix is necessary as fast-import does not permit a branch to start from itself, and the branch is created in memory before the -`from` command is even read from the input. Adding `{caret}0` will force +`from` command is even read from the input. Adding `^0` will force fast-import to resolve the commit through Git's revision parsing library, rather than its internal branch table, thereby loading in the existing value of the branch. @@ -979,7 +979,7 @@ Reading from a named tree:: See `filemodify` above for a detailed description of `<path>`. -Output uses the same format as `git ls-tree <tree> {litdd} <path>`: +Output uses the same format as `git ls-tree <tree> -- <path>`: ==== <mode> SP ('blob' | 'tree' | 'commit') SP <dataref> HT <path> LF diff --git a/Documentation/git-filter-branch.txt b/Documentation/git-filter-branch.txt index 0f2f117383..81f58234a7 100644 --- a/Documentation/git-filter-branch.txt +++ b/Documentation/git-filter-branch.txt @@ -96,8 +96,8 @@ OPTIONS --index-filter <command>:: This is the filter for rewriting the index. It is similar to the tree filter but does not check out the tree, which makes it much - faster. Frequently used with `git rm \--cached - \--ignore-unmatch ...`, see EXAMPLES below. For hairy + faster. Frequently used with `git rm --cached + --ignore-unmatch ...`, see EXAMPLES below. For hairy cases, see linkgit:git-update-index[1]. --parent-filter <command>:: @@ -222,11 +222,11 @@ However, if the file is absent from the tree of some commit, a simple `rm filename` will fail for that tree and commit. Thus you may instead want to use `rm -f filename` as the script. -Using `\--index-filter` with 'git rm' yields a significantly faster +Using `--index-filter` with 'git rm' yields a significantly faster version. Like with using `rm filename`, `git rm --cached filename` will fail if the file is absent from the tree of a commit. If you want to "completely forget" a file, it does not matter when it entered -history, so we also add `\--ignore-unmatch`: +history, so we also add `--ignore-unmatch`: -------------------------------------------------------------------------- git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD @@ -242,8 +242,8 @@ git filter-branch --subdirectory-filter foodir -- --all ------------------------------------------------------- Thus you can, e.g., turn a library subdirectory into a repository of -its own. Note the `\--` that separates 'filter-branch' options from -revision options, and the `\--all` to rewrite all branches and tags. +its own. Note the `--` that separates 'filter-branch' options from +revision options, and the `--all` to rewrite all branches and tags. To set a commit (which typically is at the tip of another history) to be the parent of the current initial commit, in @@ -371,23 +371,23 @@ Checklist for Shrinking a Repository ------------------------------------ git-filter-branch is often used to get rid of a subset of files, -usually with some combination of `\--index-filter` and -`\--subdirectory-filter`. People expect the resulting repository to +usually with some combination of `--index-filter` and +`--subdirectory-filter`. People expect the resulting repository to be smaller than the original, but you need a few more steps to actually make it smaller, because git tries hard not to lose your objects until you tell it to. First make sure that: * You really removed all variants of a filename, if a blob was moved - over its lifetime. `git log \--name-only \--follow \--all \-- - filename` can help you find renames. + over its lifetime. `git log --name-only --follow --all -- filename` + can help you find renames. -* You really filtered all refs: use `\--tag-name-filter cat \-- - \--all` when calling git-filter-branch. +* You really filtered all refs: use `--tag-name-filter cat -- --all` + when calling git-filter-branch. Then there are two ways to get a smaller repository. A safer way is to clone, that keeps your original intact. -* Clone it with `git clone +++file:///path/to/repo+++`. The clone +* Clone it with `git clone file:///path/to/repo`. The clone will not have the removed objects. See linkgit:git-clone[1]. (Note that cloning with a plain path just hardlinks everything!) @@ -397,14 +397,14 @@ approach, so *make a backup* or go back to cloning it. You have been warned. * Remove the original refs backed up by git-filter-branch: say `git - for-each-ref \--format="%(refname)" refs/original/ | xargs -n 1 git + for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d`. -* Expire all reflogs with `git reflog expire \--expire=now \--all`. +* Expire all reflogs with `git reflog expire --expire=now --all`. -* Garbage collect all unreferenced objects with `git gc \--prune=now` +* Garbage collect all unreferenced objects with `git gc --prune=now` (or if your git-gc is not new enough to support arguments to - `\--prune`, use `git repack -ad; git prune` instead). + `--prune`, use `git repack -ad; git prune` instead). GIT --- diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index 6ea9be775c..04c7346e3e 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -45,7 +45,7 @@ There are two ways to specify which commits to operate on. The first rule takes precedence in the case of a single <commit>. To apply the second rule, i.e., format everything since the beginning of history up until <commit>, use the '\--root' option: `git format-patch -\--root <commit>`. If you want to format only <commit> itself, you +--root <commit>`. If you want to format only <commit> itself, you can do this with `git format-patch -1 <commit>`. By default, each output file is numbered sequentially from 1, and uses the @@ -134,7 +134,7 @@ include::diff-options.txt[] The optional <style> argument can be either `shallow` or `deep`. 'shallow' threading makes every mail a reply to the head of the series, where the head is chosen from the cover letter, the -`\--in-reply-to`, and the first patch mail, in this order. 'deep' +`--in-reply-to`, and the first patch mail, in this order. 'deep' threading makes every mail a reply to the previous one. + The default is `--no-thread`, unless the 'format.thread' configuration diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt index 815afcb922..b370b025b8 100644 --- a/Documentation/git-gc.txt +++ b/Documentation/git-gc.txt @@ -84,7 +84,7 @@ The optional configuration variable 'gc.reflogExpireUnreachable' can be set to indicate how long historical reflog entries which are not part of the current branch should remain available in this repository. These types of entries are generally created as -a result of using `git commit \--amend` or `git rebase` and are the +a result of using `git commit --amend` or `git rebase` and are the commits prior to the amend or rebase occurring. Since these changes are not part of the current project most users will want to expire them sooner. This option defaults to '30 days'. diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt index 343eadd407..3bec036883 100644 --- a/Documentation/git-grep.txt +++ b/Documentation/git-grep.txt @@ -31,7 +31,9 @@ SYNOPSIS DESCRIPTION ----------- Look for specified patterns in the tracked files in the work tree, blobs -registered in the index file, or blobs in given tree objects. +registered in the index file, or blobs in given tree objects. Patterns +are lists of one or more search expressions separated by newline +characters. An empty string as search expression matches all lines. CONFIGURATION @@ -247,11 +249,11 @@ OPTIONS Examples -------- -`git grep {apostrophe}time_t{apostrophe} \-- {apostrophe}*.[ch]{apostrophe}`:: +`git grep 'time_t' -- '*.[ch]'`:: Looks for `time_t` in all tracked .c and .h files in the working directory and its subdirectories. -`git grep -e {apostrophe}#define{apostrophe} --and \( -e MAX_PATH -e PATH_MAX \)`:: +`git grep -e '#define' --and \( -e MAX_PATH -e PATH_MAX \)`:: Looks for a line that has `#define` and either `MAX_PATH` or `PATH_MAX`. diff --git a/Documentation/git-index-pack.txt b/Documentation/git-index-pack.txt index 909687fed4..39e6d0ddd8 100644 --- a/Documentation/git-index-pack.txt +++ b/Documentation/git-index-pack.txt @@ -74,6 +74,16 @@ OPTIONS --strict:: Die, if the pack contains broken objects or links. +--threads=<n>:: + Specifies the number of threads to spawn when resolving + deltas. This requires that index-pack be compiled with + pthreads otherwise this option is ignored with a warning. + This is meant to reduce packing time on multiprocessor + machines. The required amount of memory for the delta search + window is however multiplied by the number of threads. + Specifying 0 will cause git to auto-detect the number of CPU's + and use maximum 3 threads. + Note ---- diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt index 249fc878ec..1f906208f9 100644 --- a/Documentation/git-log.txt +++ b/Documentation/git-log.txt @@ -100,7 +100,7 @@ Examples Show all commits since version 'v2.6.12' that changed any file in the include/scsi or drivers/scsi subdirectories -`git log --since="2 weeks ago" \-- gitk`:: +`git log --since="2 weeks ago" -- gitk`:: Show the changes during the last two weeks to the file 'gitk'. The "--" is necessary to avoid confusion with the *branch* named diff --git a/Documentation/git-notes.txt b/Documentation/git-notes.txt index e8319eac69..b95aafae2d 100644 --- a/Documentation/git-notes.txt +++ b/Documentation/git-notes.txt @@ -70,7 +70,7 @@ copy:: second object). This subcommand is equivalent to: `git notes add [-f] -C $(git notes list <from-object>) <to-object>` + -In `\--stdin` mode, take lines in the format +In `--stdin` mode, take lines in the format + ---------- <from-object> SP <to-object> [ SP <rest> ] LF diff --git a/Documentation/git-p4.txt b/Documentation/git-p4.txt index 51955a5f7c..fe1f49bc6f 100644 --- a/Documentation/git-p4.txt +++ b/Documentation/git-p4.txt @@ -179,6 +179,7 @@ subsequent 'sync' operations. + This example imports a new remote "p4/proj2" into an existing git repository: ++ ---- $ git init $ git p4 sync --branch=refs/remotes/p4/proj2 //depot/proj2 @@ -438,7 +439,7 @@ git-p4.branchList:: enabled. Each entry should be a pair of branch names separated by a colon (:). This example declares that both branchA and branchB were created from main: - ++ ------------- git config git-p4.branchList main:branchA git config --add git-p4.branchList main:branchB @@ -503,7 +504,7 @@ git-p4.skipUserNameCheck:: user map, 'git p4' exits. This option can be used to force submission regardless. -git-p4.attemptRCSCleanup: +git-p4.attemptRCSCleanup:: If enabled, 'git p4 submit' will attempt to cleanup RCS keywords ($Header$, etc). These would otherwise cause merge conflicts and prevent the submit going ahead. This option should be considered experimental at diff --git a/Documentation/git-pack-refs.txt b/Documentation/git-pack-refs.txt index a3c6677bfa..10afd4edfe 100644 --- a/Documentation/git-pack-refs.txt +++ b/Documentation/git-pack-refs.txt @@ -32,7 +32,7 @@ Subsequent updates to branches always create new files under A recommended practice to deal with a repository with too many refs is to pack its refs with `--all --prune` once, and -occasionally run `git pack-refs \--prune`. Tags are by +occasionally run `git pack-refs --prune`. Tags are by definition stationary and are not expected to change. Branch heads will be packed with the initial `pack-refs --all`, but only the currently active branch heads will become unpacked, diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt index 0f18ec891a..defb544ed0 100644 --- a/Documentation/git-pull.txt +++ b/Documentation/git-pull.txt @@ -110,7 +110,7 @@ include::merge-options.txt[] + See `pull.rebase`, `branch.<name>.rebase` and `branch.autosetuprebase` in linkgit:git-config[1] if you want to make `git pull` always use -`{litdd}rebase` instead of merging. +`--rebase` instead of merging. + [NOTE] This is a potentially _dangerous_ mode of operation. diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt index a52b7b1a19..cb97cc1c3b 100644 --- a/Documentation/git-push.txt +++ b/Documentation/git-push.txt @@ -34,7 +34,7 @@ OPTIONS[[OPTIONS]] <refspec>...:: The format of a <refspec> parameter is an optional plus - `{plus}`, followed by the source ref <src>, followed + `+`, followed by the source ref <src>, followed by a colon `:`, followed by the destination ref <dst>. It is used to specify with what <src> object the <dst> ref in the remote repository is to be updated. @@ -50,7 +50,7 @@ updated. + The object referenced by <src> is used to update the <dst> reference on the remote side, but by default this is only allowed if the -update can fast-forward <dst>. By having the optional leading `{plus}`, +update can fast-forward <dst>. By having the optional leading `+`, you can tell git to update the <dst> ref even when the update is not a fast-forward. This does *not* attempt to merge <src> into <dst>. See EXAMPLES below for details. @@ -60,7 +60,7 @@ EXAMPLES below for details. Pushing an empty <src> allows you to delete the <dst> ref from the remote repository. + -The special refspec `:` (or `{plus}:` to allow non-fast-forward updates) +The special refspec `:` (or `+:` to allow non-fast-forward updates) directs git to push "matching" branches: for every branch that exists on the local side, the remote side is updated if a branch of the same name already exists on the remote side. This is the default operation mode @@ -75,7 +75,7 @@ nor in any Push line of the corresponding remotes file---see below). Remove remote branches that don't have a local counterpart. For example a remote branch `tmp` will be removed if a local branch with the same name doesn't exist any more. This also respects refspecs, e.g. - `git push --prune remote refs/heads/{asterisk}:refs/tmp/{asterisk}` would + `git push --prune remote refs/heads/*:refs/tmp/*` would make sure that remote `refs/tmp/foo` will be removed if `refs/heads/foo` doesn't exist. @@ -210,7 +210,7 @@ option is used. flag:: A single character indicating the status of the ref: (space);; for a successfully pushed fast-forward; -`{plus}`;; for a successful forced update; +`+`;; for a successful forced update; `-`;; for a successfully deleted ref; `*`;; for a successfully pushed new ref; `!`;; for a ref that was rejected or failed to push; and @@ -220,7 +220,7 @@ summary:: For a successfully pushed ref, the summary shows the old and new values of the ref in a form suitable for using as an argument to `git log` (this is `<old>..<new>` in most cases, and - `<old>\...<new>` for forced non-fast-forward updates). + `<old>...<new>` for forced non-fast-forward updates). + For a failed update, more details are given: + @@ -402,7 +402,7 @@ the ones in the examples below) can be configured as the default for Find a ref that matches `experimental` in the `origin` repository (e.g. `refs/heads/experimental`), and delete it. -`git push origin {plus}dev:master`:: +`git push origin +dev:master`:: Update the origin repository's master branch with the dev branch, allowing non-fast-forward updates. *This can leave unreferenced commits dangling in the origin repository.* Consider the diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index 841ebd6a9f..147fa1a8e0 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -271,7 +271,7 @@ which makes little sense. -X <strategy-option>:: --strategy-option=<strategy-option>:: Pass the <strategy-option> through to the merge strategy. - This implies `\--merge` and, if no strategy has been + This implies `--merge` and, if no strategy has been specified, `-s recursive`. Note the reversal of 'ours' and 'theirs' as noted in above for the `-m` option. @@ -615,8 +615,8 @@ Easy case: The changes are literally the same.:: Hard case: The changes are not the same.:: This happens if the 'subsystem' rebase had conflicts, or used - `\--interactive` to omit, edit, squash, or fixup commits; or - if the upstream used one of `commit \--amend`, `reset`, or + `--interactive` to omit, edit, squash, or fixup commits; or + if the upstream used one of `commit --amend`, `reset`, or `filter-branch`. @@ -652,7 +652,7 @@ correspond to the ones before the rebase. NOTE: While an "easy case recovery" sometimes appears to be successful even in the hard case, it may have unintended consequences. For example, a commit that was removed via `git rebase - \--interactive` will be **resurrected**! + --interactive` will be **resurrected**! The idea is to manually tell 'git rebase' "where the old 'subsystem' ended and your 'topic' began", that is, what the old merge-base @@ -660,7 +660,7 @@ between them was. You will have to find a way to name the last commit of the old 'subsystem', for example: * With the 'subsystem' reflog: after 'git fetch', the old tip of - 'subsystem' is at `subsystem@\{1}`. Subsequent fetches will + 'subsystem' is at `subsystem@{1}`. Subsequent fetches will increase the number. (See linkgit:git-reflog[1].) * Relative to the tip of 'topic': knowing that your 'topic' has three diff --git a/Documentation/git-reflog.txt b/Documentation/git-reflog.txt index 976dc14937..7fe2d2247b 100644 --- a/Documentation/git-reflog.txt +++ b/Documentation/git-reflog.txt @@ -39,13 +39,13 @@ as well). It is an alias for `git log -g --abbrev-commit --pretty=oneline`; see linkgit:git-log[1]. The reflog is useful in various git commands, to specify the old value -of a reference. For example, `HEAD@\{2\}` means "where HEAD used to be -two moves ago", `master@\{one.week.ago\}` means "where master used to +of a reference. For example, `HEAD@{2}` means "where HEAD used to be +two moves ago", `master@{one.week.ago}` means "where master used to point to one week ago", and so on. See linkgit:gitrevisions[7] for more details. To delete single entries from the reflog, use the subcommand "delete" -and specify the _exact_ entry (e.g. "`git reflog delete master@\{2\}`"). +and specify the _exact_ entry (e.g. "`git reflog delete master@{2}`"). OPTIONS diff --git a/Documentation/git-remote-helpers.txt b/Documentation/git-remote-helpers.txt index 674797cd83..f5836e46d0 100644 --- a/Documentation/git-remote-helpers.txt +++ b/Documentation/git-remote-helpers.txt @@ -87,7 +87,7 @@ to the `capabilities` command (see COMMANDS, below). capability use this. + A helper advertising the capability -`refspec refs/heads/{asterisk}:refs/svn/origin/branches/{asterisk}` +`refspec refs/heads/*:refs/svn/origin/branches/*` is saying that, when it is asked to `import refs/heads/topic`, the stream it outputs will update the `refs/svn/origin/branches/topic` ref. @@ -96,7 +96,7 @@ This capability can be advertised multiple times. The first applicable refspec takes precedence. The left-hand of refspecs advertised with this capability must cover all refs reported by the list command. If no 'refspec' capability is advertised, -there is an implied `refspec {asterisk}:{asterisk}`. +there is an implied `refspec *:*`. Capabilities for Pushing ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -148,7 +148,7 @@ Other frontends may have some other order of preference. This modifies the 'import' capability. + A helper advertising -`refspec refs/heads/{asterisk}:refs/svn/origin/branches/{asterisk}` +`refspec refs/heads/*:refs/svn/origin/branches/*` in its capabilities is saying that, when it handles `import refs/heads/topic`, the stream it outputs will update the `refs/svn/origin/branches/topic` ref. @@ -157,7 +157,7 @@ This capability can be advertised multiple times. The first applicable refspec takes precedence. The left-hand of refspecs advertised with this capability must cover all refs reported by the list command. If no 'refspec' capability is advertised, -there is an implied `refspec {asterisk}:{asterisk}`. +there is an implied `refspec *:*`. INVOCATION ---------- diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt index d376d19ef7..a308f4c79f 100644 --- a/Documentation/git-remote.txt +++ b/Documentation/git-remote.txt @@ -67,14 +67,14 @@ multiple branches without grabbing all branches. With `-m <master>` option, a symbolic-ref `refs/remotes/<name>/HEAD` is set up to point at remote's `<master>` branch. See also the set-head command. + -When a fetch mirror is created with `\--mirror=fetch`, the refs will not +When a fetch mirror is created with `--mirror=fetch`, the refs will not be stored in the 'refs/remotes/' namespace, but rather everything in 'refs/' on the remote will be directly mirrored into 'refs/' in the local repository. This option only makes sense in bare repositories, because a fetch would overwrite any local commits. + -When a push mirror is created with `\--mirror=push`, then `git push` -will always behave as if `\--mirror` was passed. +When a push mirror is created with `--mirror=push`, then `git push` +will always behave as if `--mirror` was passed. 'rename':: diff --git a/Documentation/git-rerere.txt b/Documentation/git-rerere.txt index b43b7c8c0e..a62227f84e 100644 --- a/Documentation/git-rerere.txt +++ b/Documentation/git-rerere.txt @@ -101,15 +101,15 @@ One way to do it is to pull master into the topic branch: The commits marked with `*` touch the same area in the same file; you need to resolve the conflicts when creating the commit -marked with `{plus}`. Then you can test the result to make sure your +marked with `+`. Then you can test the result to make sure your work-in-progress still works with what is in the latest master. After this test merge, there are two ways to continue your work on the topic. The easiest is to build on top of the test merge -commit `{plus}`, and when your work in the topic branch is finally +commit `+`, and when your work in the topic branch is finally ready, pull the topic branch into master, and/or ask the upstream to pull from you. By that time, however, the master or -the upstream might have been advanced since the test merge `{plus}`, +the upstream might have been advanced since the test merge `+`, in which case the final commit graph would look like this: ------------ diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.txt index b674866e6d..117e3743a6 100644 --- a/Documentation/git-reset.txt +++ b/Documentation/git-reset.txt @@ -41,7 +41,7 @@ working tree in one go. + This means that `git reset -p` is the opposite of `git add -p`, i.e. you can use it to selectively reset hunks. See the ``Interactive Mode'' -section of linkgit:git-add[1] to learn how to operate the `\--patch` mode. +section of linkgit:git-add[1] to learn how to operate the `--patch` mode. 'git reset' --<mode> [<commit>]:: This form resets the current branch head to <commit> and diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt index 8023dc086d..4cc3e9586f 100644 --- a/Documentation/git-rev-parse.txt +++ b/Documentation/git-rev-parse.txt @@ -113,15 +113,14 @@ OPTIONS + If a `pattern` is given, only refs matching the given shell glob are shown. If the pattern does not contain a globbing character (`?`, -`{asterisk}`, or `[`), it is turned into a prefix match by -appending `/{asterisk}`. +`*`, or `[`), it is turned into a prefix match by appending `/*`. --glob=pattern:: Show all refs matching the shell glob pattern `pattern`. If the pattern does not start with `refs/`, this is automatically prepended. If the pattern does not contain a globbing - character (`?`, `{asterisk}`, or `[`), it is turned into a prefix - match by appending `/{asterisk}`. + character (`?`, `*`, or `[`), it is turned into a prefix + match by appending `/*`. --show-toplevel:: Show the absolute path of the top-level directory. @@ -138,7 +137,8 @@ appending `/{asterisk}`. --git-dir:: Show `$GIT_DIR` if defined. Otherwise show the path to - the .git directory, relative to the current directory. + the .git directory. The path shown, when relative, is + relative to the current working directory. + If `$GIT_DIR` is not defined and the current directory is not detected to lie in a git repository or work tree diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt index b699a3458e..70152e8b1e 100644 --- a/Documentation/git-revert.txt +++ b/Documentation/git-revert.txt @@ -27,7 +27,7 @@ throw away all uncommitted changes in your working directory, you should see linkgit:git-reset[1], particularly the '--hard' option. If you want to extract specific files as they were in another commit, you should see linkgit:git-checkout[1], specifically the `git checkout -<commit> \-- <filename>` syntax. Take care with these alternatives as +<commit> -- <filename>` syntax. Take care with these alternatives as both will discard uncommitted changes in your working directory. OPTIONS @@ -105,7 +105,7 @@ EXAMPLES Revert the changes specified by the fourth last commit in HEAD and create a new commit with the reverted changes. -`git revert -n master{tilde}5..master{tilde}2`:: +`git revert -n master~5..master~2`:: Revert the changes done by commits from the fifth last commit in master (included) to the third last commit in master diff --git a/Documentation/git-rm.txt b/Documentation/git-rm.txt index 665ad4ddab..5d31860eb1 100644 --- a/Documentation/git-rm.txt +++ b/Documentation/git-rm.txt @@ -79,8 +79,7 @@ a file that you have not told git about does not remove that file. File globbing matches across directory boundaries. Thus, given two directories `d` and `d2`, there is a difference between -using `git rm {apostrophe}d{asterisk}{apostrophe}` and -`git rm {apostrophe}d/{asterisk}{apostrophe}`, as the former will +using `git rm 'd*'` and `git rm 'd/*'`, as the former will also remove all of directory `d2`. REMOVING FILES THAT HAVE DISAPPEARED FROM THE FILESYSTEM diff --git a/Documentation/git-shortlog.txt b/Documentation/git-shortlog.txt index ff3755b4c7..01d8417316 100644 --- a/Documentation/git-shortlog.txt +++ b/Documentation/git-shortlog.txt @@ -47,7 +47,7 @@ OPTIONS --format[=<format>]:: Instead of the commit subject, use some other information to describe each commit. '<format>' can be any string accepted - by the `--format` option of 'git log', such as '{asterisk} [%h] %s'. + by the `--format` option of 'git log', such as '* [%h] %s'. (See the "PRETTY FORMATS" section of linkgit:git-log[1].) Each pretty-printed commit will be rewrapped before it is shown. diff --git a/Documentation/git-show-ref.txt b/Documentation/git-show-ref.txt index fcee0008a9..5dbcd47fec 100644 --- a/Documentation/git-show-ref.txt +++ b/Documentation/git-show-ref.txt @@ -73,7 +73,7 @@ OPTIONS --exclude-existing[=<pattern>]:: Make 'git show-ref' act as a filter that reads refs from stdin of the - form "`{caret}(?:<anything>\s)?<refname>(?:{backslash}{caret}{})?$`" + form "`^(?:<anything>\s)?<refname>(?:\^{})?$`" and performs the following actions on each: (1) strip "{caret}{}" at the end of line if any; (2) ignore if pattern is provided and does not head-match refname; diff --git a/Documentation/git-show.txt b/Documentation/git-show.txt index 1e38819e67..ae4edcccfb 100644 --- a/Documentation/git-show.txt +++ b/Documentation/git-show.txt @@ -52,10 +52,10 @@ EXAMPLES Shows the tag `v1.0.0`, along with the object the tags points at. -`git show v1.0.0^\{tree\}`:: +`git show v1.0.0^{tree}`:: Shows the tree pointed to by the tag `v1.0.0`. -`git show -s --format=%s v1.0.0^\{commit\}`:: +`git show -s --format=%s v1.0.0^{commit}`:: Shows the subject of the commit pointed to by the tag `v1.0.0`. diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt index 43af38aa4b..0aa4e20eae 100644 --- a/Documentation/git-stash.txt +++ b/Documentation/git-stash.txt @@ -36,8 +36,8 @@ you create one. The latest stash you created is stored in `refs/stash`; older stashes are found in the reflog of this reference and can be named using -the usual reflog syntax (e.g. `stash@\{0}` is the most recently -created stash, `stash@\{1}` is the one before it, `stash@\{2.hours.ago}` +the usual reflog syntax (e.g. `stash@{0}` is the most recently +created stash, `stash@{1}` is the one before it, `stash@{2.hours.ago}` is also possible). OPTIONS @@ -66,7 +66,7 @@ constructed such that its index state is the same as the index state of your repository, and its worktree contains only the changes you selected interactively. The selected changes are then rolled back from your worktree. See the ``Interactive Mode'' section of -linkgit:git-add[1] to learn how to operate the `\--patch` mode. +linkgit:git-add[1] to learn how to operate the `--patch` mode. + The `--patch` option implies `--keep-index`. You can use `--no-keep-index` to override this. @@ -74,7 +74,7 @@ The `--patch` option implies `--keep-index`. You can use list [<options>]:: List the stashes that you currently have. Each 'stash' is listed - with its name (e.g. `stash@\{0}` is the latest stash, `stash@\{1}` is + with its name (e.g. `stash@{0}` is the latest stash, `stash@{1}` is the one before, etc.), the name of the branch that was current when the stash was made, and a short description of the commit the stash was based on. @@ -93,7 +93,7 @@ show [<stash>]:: stashed state and its original parent. When no `<stash>` is given, shows the latest one. By default, the command shows the diffstat, but it will accept any format known to 'git diff' (e.g., `git stash show - -p stash@\{1}` to view the second most recent stash in patch form). + -p stash@{1}` to view the second most recent stash in patch form). pop [--index] [-q|--quiet] [<stash>]:: @@ -111,8 +111,8 @@ tree's changes, but also the index's ones. However, this can fail, when you have conflicts (which are stored in the index, where you therefore can no longer apply the changes as they were originally). + -When no `<stash>` is given, `stash@\{0}` is assumed, otherwise `<stash>` must -be a reference of the form `stash@\{<revision>}`. +When no `<stash>` is given, `stash@{0}` is assumed, otherwise `<stash>` must +be a reference of the form `stash@{<revision>}`. apply [--index] [-q|--quiet] [<stash>]:: @@ -143,9 +143,9 @@ clear:: drop [-q|--quiet] [<stash>]:: Remove a single stashed state from the stash list. When no `<stash>` - is given, it removes the latest one. i.e. `stash@\{0}`, otherwise + is given, it removes the latest one. i.e. `stash@{0}`, otherwise `<stash>` must a valid stash log reference of the form - `stash@\{<revision>}`. + `stash@{<revision>}`. create:: diff --git a/Documentation/git-status.txt b/Documentation/git-status.txt index 3d51717bbe..67e5f53a9e 100644 --- a/Documentation/git-status.txt +++ b/Documentation/git-status.txt @@ -77,6 +77,13 @@ configuration variable documented in linkgit:git-config[1]. Terminate entries with NUL, instead of LF. This implies the `--porcelain` output format if no other format is given. +--column[=<options>]:: +--no-column:: + Display untracked files in columns. See configuration variable + column.status for option syntax.`--column` and `--no-column` + without options are equivalent to 'always' and 'never' + respectively. + OUTPUT ------ @@ -98,12 +105,12 @@ In the short-format, the status of each path is shown as XY PATH1 -> PATH2 -where `PATH1` is the path in the `HEAD`, and the ` \-> PATH2` part is +where `PATH1` is the path in the `HEAD`, and the " `-> PATH2`" part is shown only when `PATH1` corresponds to a different path in the index/worktree (i.e. the file is renamed). The 'XY' is a two-letter status code. -The fields (including the `\->`) are separated from each other by a +The fields (including the `->`) are separated from each other by a single space. If a filename contains whitespace or other nonprintable characters, that field will be quoted in the manner of a C string literal: surrounded by ASCII double quote (34) characters, and with @@ -177,7 +184,7 @@ order is reversed (e.g 'from \-> to' becomes 'to from'). Second, a NUL and the terminating newline (but a space still separates the status field from the first filename). Third, filenames containing special characters are not specially formatted; no quoting or -backslash-escaping is performed. Fourth, there is no branch line. +backslash-escaping is performed. CONFIGURATION ------------- diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index c243ee552b..9e488c0aad 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -43,9 +43,9 @@ if you choose to go that route. Submodules are composed from a so-called `gitlink` tree entry in the main repository that refers to a particular commit object within the inner repository that is completely separate. -A record in the `.gitmodules` file at the root of the source -tree assigns a logical name to the submodule and describes -the default URL the submodule shall be cloned from. +A record in the `.gitmodules` (see linkgit:gitmodules[5]) file at the +root of the source tree assigns a logical name to the submodule and +describes the default URL the submodule shall be cloned from. The logical name can be used for overriding this URL within your local repository configuration (see 'submodule init'). @@ -140,7 +140,8 @@ update:: checkout the commit specified in the index of the containing repository. This will make the submodules HEAD be detached unless `--rebase` or `--merge` is specified or the key `submodule.$name.update` is set to - `rebase`, `merge` or `none`. + `rebase`, `merge` or `none`. `none` can be overriden by specifying + `--checkout`. + If the submodule is not yet initialized, and you just want to use the setting as stored in .gitmodules, you can automatically initialize the @@ -148,10 +149,6 @@ submodule with the `--init` option. + If `--recursive` is specified, this command will recurse into the registered submodules, and update any nested submodules within. -+ -If the configuration key `submodule.$name.update` is set to `none` the -submodule with name `$name` will not be updated by default. This can be -overriden by adding `--checkout` to the command. summary:: Show commit summary between the given commit (defaults to HEAD) and diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt index 34ee785064..cfe8d2b5df 100644 --- a/Documentation/git-svn.txt +++ b/Documentation/git-svn.txt @@ -189,18 +189,16 @@ and have no uncommitted changes. last fetched commit from the upstream SVN. 'dcommit':: - Commit each diff from a specified head directly to the SVN + Commit each diff from the current branch directly to the SVN repository, and then rebase or reset (depending on whether or not there is a diff between SVN and head). This will create a revision in SVN for each commit in git. - It is recommended that you run 'git svn' fetch and rebase (not - pull or merge) your commits against the latest changes in the - SVN repository. - An optional revision or branch argument may be specified, and - causes 'git svn' to do all work on that revision/branch - instead of HEAD. - This is advantageous over 'set-tree' (below) because it produces - cleaner, more linear history. ++ +When an optional git branch name (or a git commit object name) +is specified as an argument, the subcommand works on the specified +branch, not on the current branch. ++ +Use of 'dcommit' is preferred to 'set-tree' (below). + --no-rebase;; After committing, do not rebase or reset. @@ -572,6 +570,8 @@ config key: svn.repackflags --merge:: -s<strategy>:: --strategy=<strategy>:: +-p:: +--preserve-merges:: These are only used with the 'dcommit' and 'rebase' commands. + Passed directly to 'git rebase' when using 'dcommit' if a @@ -800,18 +800,19 @@ have each person clone that repository with 'git clone': REBASE VS. PULL/MERGE --------------------- - -Originally, 'git svn' recommended that the 'remotes/git-svn' branch be -pulled or merged from. This is because the author favored +Prefer to use 'git svn rebase' or 'git rebase', rather than +'git pull' or 'git merge' to synchronize unintegrated commits with a 'git svn' +branch. Doing so will keep the history of unintegrated commits linear with +respect to the upstream SVN repository and allow the use of the preferred +'git svn dcommit' subcommand to push unintegrated commits back into SVN. + +Originally, 'git svn' recommended that developers pulled or merged from +the 'git svn' branch. This was because the author favored `git svn set-tree B` to commit a single head rather than the -`git svn set-tree A..B` notation to commit multiple commits. - -If you use `git svn set-tree A..B` to commit several diffs and you do -not have the latest remotes/git-svn merged into my-branch, you should -use `git svn rebase` to update your work branch instead of `git pull` or -`git merge`. `pull`/`merge` can cause non-linear history to be flattened -when committing into SVN, which can lead to merge commits reversing -previous commits in SVN. +`git svn set-tree A..B` notation to commit multiple commits. Use of +'git pull' or 'git merge' with `git svn set-tree A..B` will cause non-linear +history to be flattened when committing into SVN and this can lead to merge +commits unexpectedly reversing previous commits in SVN. MERGE TRACKING -------------- diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt index 8d32b9a814..e36a7c3d1e 100644 --- a/Documentation/git-tag.txt +++ b/Documentation/git-tag.txt @@ -13,6 +13,7 @@ SYNOPSIS <tagname> [<commit> | <object>] 'git tag' -d <tagname>... 'git tag' [-n[<num>]] -l [--contains <commit>] [--points-at <object>] + [--column[=<options>] | --no-column] [<pattern>...] [<pattern>...] 'git tag' -v <tagname>... @@ -84,6 +85,14 @@ OPTIONS using fnmatch(3)). Multiple patterns may be given; if any of them matches, the tag is shown. +--column[=<options>]:: +--no-column:: + Display tag listing in columns. See configuration variable + column.tag for option syntax.`--column` and `--no-column` + without options are equivalent to 'always' and 'never' respectively. ++ +This option is only applicable when listing tags without annotation lines. + --contains <commit>:: Only list tags which contain the specified commit. diff --git a/Documentation/git-tar-tree.txt b/Documentation/git-tar-tree.txt index 346e7a2079..f7362dc2d1 100644 --- a/Documentation/git-tar-tree.txt +++ b/Documentation/git-tar-tree.txt @@ -63,7 +63,7 @@ EXAMPLES Create a tarball for v1.4.0 release. -`git tar-tree v1.4.0{caret}\{tree\} git-1.4.0 | gzip >git-1.4.0.tar.gz`:: +`git tar-tree v1.4.0^{tree} git-1.4.0 | gzip >git-1.4.0.tar.gz`:: Create a tarball for v1.4.0 release, but without a global extended pax header. diff --git a/Documentation/git-update-index.txt b/Documentation/git-update-index.txt index a3081f4e23..9d0b1515c5 100644 --- a/Documentation/git-update-index.txt +++ b/Documentation/git-update-index.txt @@ -19,7 +19,7 @@ SYNOPSIS [--ignore-submodules] [--really-refresh] [--unresolve] [--again | -g] [--info-only] [--index-info] - [-z] [--stdin] + [-z] [--stdin] [--index-version <n>] [--verbose] [--] [<file>...] @@ -143,6 +143,10 @@ you will need to handle the situation manually. --verbose:: Report what is being added and removed from index. +--index-version <n>:: + Write the resulting index out in the named on-disk format version. + The current default version is 2. + -z:: Only meaningful with `--stdin` or `--index-info`; paths are separated with NUL character instead of LF. diff --git a/Documentation/git-var.txt b/Documentation/git-var.txt index 988a3234f4..67edf58689 100644 --- a/Documentation/git-var.txt +++ b/Documentation/git-var.txt @@ -59,15 +59,6 @@ ifdef::git-default-pager[] The build you are using chose '{git-default-pager}' as the default. endif::git-default-pager[] -Diagnostics ------------ -You don't exist. Go away!:: - The passwd(5) gecos field couldn't be read -Your parents must have hated you!:: - The passwd(5) gecos field is longer than a giant static buffer. -Your sysadmin must hate you!:: - The passwd(5) name field is longer than a giant static buffer. - SEE ALSO -------- linkgit:git-commit-tree[1] diff --git a/Documentation/git-whatchanged.txt b/Documentation/git-whatchanged.txt index 76c7f7eec5..6c8f510c3f 100644 --- a/Documentation/git-whatchanged.txt +++ b/Documentation/git-whatchanged.txt @@ -58,7 +58,7 @@ Examples Show as patches the commits since version 'v2.6.12' that changed any file in the include/scsi or drivers/scsi subdirectories -`git whatchanged --since="2 weeks ago" \-- gitk`:: +`git whatchanged --since="2 weeks ago" -- gitk`:: Show the changes during the last two weeks to the file 'gitk'. The "--" is necessary to avoid confusion with the *branch* named diff --git a/Documentation/git.txt b/Documentation/git.txt index 8527775988..55e405d644 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -44,9 +44,12 @@ unreleased) version of git, that is available from 'master' branch of the `git.git` repository. Documentation for older releases are available here: -* link:v1.7.10.1/git.html[documentation for release 1.7.10.1] +* link:v1.7.10.4/git.html[documentation for release 1.7.10.4] * release notes for + link:RelNotes/1.7.10.4.txt[1.7.10.4], + link:RelNotes/1.7.10.3.txt[1.7.10.3], + link:RelNotes/1.7.10.2.txt[1.7.10.2], link:RelNotes/1.7.10.1.txt[1.7.10.1], link:RelNotes/1.7.10.txt[1.7.10]. diff --git a/Documentation/gitcli.txt b/Documentation/gitcli.txt index f734f97b8e..ea17f7a53b 100644 --- a/Documentation/gitcli.txt +++ b/Documentation/gitcli.txt @@ -25,22 +25,22 @@ arguments. Here are the rules: are paths. * When an argument can be misunderstood as either a revision or a path, - they can be disambiguated by placing `\--` between them. - E.g. `git diff \-- HEAD` is, "I have a file called HEAD in my work + they can be disambiguated by placing `--` between them. + E.g. `git diff -- HEAD` is, "I have a file called HEAD in my work tree. Please show changes between the version I staged in the index and what I have in the work tree for that file". not "show difference between the HEAD commit and the work tree as a whole". You can say - `git diff HEAD \--` to ask for the latter. + `git diff HEAD --` to ask for the latter. - * Without disambiguating `\--`, git makes a reasonable guess, but errors + * Without disambiguating `--`, git makes a reasonable guess, but errors out and asking you to disambiguate when ambiguous. E.g. if you have a file called HEAD in your work tree, `git diff HEAD` is ambiguous, and - you have to say either `git diff HEAD \--` or `git diff \-- HEAD` to + you have to say either `git diff HEAD --` or `git diff -- HEAD` to disambiguate. When writing a script that is expected to handle random user-input, it is a good practice to make it explicit which arguments are which by placing -disambiguating `\--` at appropriate places. +disambiguating `--` at appropriate places. Here are the rules regarding the "flags" that you should follow when you are scripting git: diff --git a/Documentation/gitcore-tutorial.txt b/Documentation/gitcore-tutorial.txt index fb0d5692a4..9d893369a0 100644 --- a/Documentation/gitcore-tutorial.txt +++ b/Documentation/gitcore-tutorial.txt @@ -151,8 +151,8 @@ to your working tree, you use the 'git update-index' program. That program normally just takes a list of filenames you want to update, but to avoid trivial mistakes, it refuses to add new entries to the index (or remove existing ones) unless you explicitly tell it that you're -adding a new entry with the `\--add` flag (or removing an entry with the -`\--remove`) flag. +adding a new entry with the `--add` flag (or removing an entry with the +`--remove`) flag. So to populate the index with the two files you just created, you can do @@ -399,10 +399,10 @@ $ git diff HEAD which ends up doing the above for you. In other words, 'git diff-index' normally compares a tree against the -working tree, but when given the `\--cached` flag, it is told to +working tree, but when given the `--cached` flag, it is told to instead compare against just the index cache contents, and ignore the current working tree state entirely. Since we just wrote the index -file to HEAD, doing `git diff-index \--cached -p HEAD` should thus return +file to HEAD, doing `git diff-index --cached -p HEAD` should thus return an empty set of differences, and that's exactly what it does. [NOTE] @@ -411,7 +411,7 @@ an empty set of differences, and that's exactly what it does. comparisons, and saying that it compares a tree against the working tree is thus not strictly accurate. In particular, the list of files to compare (the "meta-data") *always* comes from the index file, -regardless of whether the `\--cached` flag is used or not. The `\--cached` +regardless of whether the `--cached` flag is used or not. The `--cached` flag really only determines whether the file *contents* to be compared come from the working tree or not. @@ -433,7 +433,7 @@ update the index cache: $ git update-index hello ------------------------------------------------ -(note how we didn't need the `\--add` flag this time, since git knew +(note how we didn't need the `--add` flag this time, since git knew about the file already). Note what happens to the different 'git diff-{asterisk}' versions here. @@ -560,7 +560,7 @@ short history. When using the above two commands, the initial commit will be shown. If this is a problem because it is huge, you can hide it by setting the log.showroot configuration variable to false. Having this, you -can still show it for each command just adding the `\--root` option, +can still show it for each command just adding the `--root` option, which is a flag for 'git diff-tree' accepted by both commands. With that, you should now be having some inkling of what git does, and @@ -881,7 +881,7 @@ helps you view what's going on: $ gitk --all ---------------- -will show you graphically both of your branches (that's what the `\--all` +will show you graphically both of your branches (that's what the `--all` means: normally it will just show you your current `HEAD`) and their histories. You can also see exactly how they came to be from a common source. @@ -935,7 +935,7 @@ which will very loudly warn you that you're now committing a merge (which is correct, so never mind), and you can write a small merge message about your adventures in 'git merge'-land. -After you're done, start up `gitk \--all` to see graphically what the +After you're done, start up `gitk --all` to see graphically what the history looks like. Notice that `mybranch` still exists, and you can switch to it, and continue to work with it if you want to. The `mybranch` branch will not contain the merge, but next time you merge it @@ -958,11 +958,11 @@ $ git show-branch --topo-order --more=1 master mybranch The first two lines indicate that it is showing the two branches and the first line of the commit log message from their top-of-the-tree commits, you are currently on `master` branch -(notice the asterisk `{asterisk}` character), and the first column for +(notice the asterisk `*` character), and the first column for the later output lines is used to show commits contained in the `master` branch, and the second column for the `mybranch` branch. Three commits are shown along with their log messages. -All of them have non blank characters in the first column (`{asterisk}` +All of them have non blank characters in the first column (`*` shows an ordinary commit on the current branch, `-` is a merge commit), which means they are now part of the `master` branch. Only the "Some work" commit has the plus `+` character in the second column, @@ -1002,8 +1002,8 @@ would be different) ---------------- Updating from ae3a2da... to a80b4aa.... Fast-forward (no commit created; -m option ignored) - example | 1 + - hello | 1 + + example | 1 + + hello | 1 + 2 files changed, 2 insertions(+) ---------------- @@ -1013,7 +1013,7 @@ 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. -You can run `gitk \--all` again to see how the commit ancestry +You can run `gitk --all` again to see how the commit ancestry looks like, or run 'show-branch', which tells you this. ------------------------------------------------ @@ -1257,7 +1257,7 @@ this 'collapsing' tends to trivially merge most of the paths fairly quickly, leaving only a handful of real changes in non-zero stages. -To look at only non-zero stages, use `\--unmerged` flag: +To look at only non-zero stages, use `--unmerged` flag: ------------ $ git ls-files --unmerged @@ -1420,7 +1420,7 @@ packed, and stores the packed file in `.git/objects/pack` directory. [NOTE] -You will see two files, `pack-{asterisk}.pack` and `pack-{asterisk}.idx`, +You will see two files, `pack-*.pack` and `pack-*.idx`, in `.git/objects/pack` directory. They are closely related to each other, and if you ever copy them by hand to a different repository for whatever reason, you should make sure you copy diff --git a/Documentation/gitcredentials.txt b/Documentation/gitcredentials.txt index 066f825f2e..7dfffc0046 100644 --- a/Documentation/gitcredentials.txt +++ b/Documentation/gitcredentials.txt @@ -143,8 +143,8 @@ CONFIGURATION OPTIONS --------------------- Options for a credential context can be configured either in -`credential.\*` (which applies to all credentials), or -`credential.<url>.\*`, where <url> matches the context as described +`credential.*` (which applies to all credentials), or +`credential.<url>.*`, where <url> matches the context as described above. The following options are available in either location: diff --git a/Documentation/gitdiffcore.txt b/Documentation/gitdiffcore.txt index 370624c171..daf1782a31 100644 --- a/Documentation/gitdiffcore.txt +++ b/Documentation/gitdiffcore.txt @@ -168,11 +168,11 @@ a similarity score different from the default of 50% by giving a number after the "-M" or "-C" option (e.g. "-M8" to tell it to use 8/10 = 80%). -Note. When the "-C" option is used with `\--find-copies-harder` +Note. When the "-C" option is used with `--find-copies-harder` option, 'git diff-{asterisk}' commands feed unmodified filepairs to diffcore mechanism as well as modified ones. This lets the copy detector consider unmodified files as copy source candidates at -the expense of making it slower. Without `\--find-copies-harder`, +the expense of making it slower. Without `--find-copies-harder`, 'git diff-{asterisk}' commands can detect copies only if the file that was copied happened to have been modified in the same changeset. @@ -224,7 +224,7 @@ diffcore-pickaxe: For Detecting Addition/Deletion of Specified String This transformation is used to find filepairs that represent changes that touch a specified string, and is controlled by the --S option and the `\--pickaxe-all` option to the 'git diff-{asterisk}' +-S option and the `--pickaxe-all` option to the 'git diff-*' commands. When diffcore-pickaxe is in use, it checks if there are @@ -233,9 +233,9 @@ different number of specified string. Such a filepair represents "the string appeared in this changeset". It also checks for the opposite case that loses the specified string. -When `\--pickaxe-all` is not in effect, diffcore-pickaxe leaves +When `--pickaxe-all` is not in effect, diffcore-pickaxe leaves only such filepairs that touch the specified string in its -output. When `\--pickaxe-all` is used, diffcore-pickaxe leaves all +output. When `--pickaxe-all` is used, diffcore-pickaxe leaves all filepairs intact if there is such a filepair, or makes the output empty otherwise. The latter behaviour is designed to make reviewing of the changes in the context of the whole diff --git a/Documentation/githooks.txt b/Documentation/githooks.txt index 28edefa202..b9003fed24 100644 --- a/Documentation/githooks.txt +++ b/Documentation/githooks.txt @@ -73,7 +73,7 @@ pre-commit ~~~~~~~~~~ This hook is invoked by 'git commit', and can be bypassed -with `\--no-verify` option. It takes no parameter, and is +with `--no-verify` option. It takes no parameter, and is invoked before obtaining the proposed commit log message and making a commit. Exiting with non-zero status from this script causes the 'git commit' to abort. @@ -99,12 +99,12 @@ given); `template` (if a `-t` option was given or the configuration option `commit.template` is set); `merge` (if the commit is a merge or a `.git/MERGE_MSG` file exists); `squash` (if a `.git/SQUASH_MSG` file exists); or `commit`, followed by -a commit SHA1 (if a `-c`, `-C` or `\--amend` option was given). +a commit SHA1 (if a `-c`, `-C` or `--amend` option was given). If the exit status is non-zero, 'git commit' will abort. The purpose of the hook is to edit the message file in place, and -it is not suppressed by the `\--no-verify` option. A non-zero exit +it is not suppressed by the `--no-verify` option. A non-zero exit means a failure of the hook and aborts the commit. It should not be used as replacement for pre-commit hook. @@ -115,7 +115,7 @@ commit-msg ~~~~~~~~~~ This hook is invoked by 'git commit', and can be bypassed -with `\--no-verify` option. It takes a single parameter, the +with `--no-verify` option. It takes a single parameter, the name of the file that holds the proposed commit log message. Exiting with non-zero status causes the 'git commit' to abort. diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt index 4e1fd52e7d..4effd78902 100644 --- a/Documentation/gitmodules.txt +++ b/Documentation/gitmodules.txt @@ -41,8 +41,11 @@ submodule.<name>.update:: the commit specified in the superproject. If 'merge', the commit specified in the superproject will be merged into the current branch in the submodule. + If 'none', the submodule with name `$name` will not be updated + by default. + This config option is overridden if 'git submodule update' is given - the '--merge' or '--rebase' options. + the '--merge', '--rebase' or '--checkout' options. submodule.<name>.fetchRecurseSubmodules:: This option can be used to control recursive fetching of this diff --git a/Documentation/gitweb.conf.txt b/Documentation/gitweb.conf.txt index 4b8d1b1d4c..b9dd56753a 100644 --- a/Documentation/gitweb.conf.txt +++ b/Documentation/gitweb.conf.txt @@ -756,14 +756,14 @@ Project specific override is not supported. forks:: If this feature is enabled, gitweb considers projects in subdirectories of project root (basename) to be forks of existing - projects. For each project `$projname.git`, projects in the - `$projname/` directory and its subdirectories will not be - shown in the main projects list. Instead, a \'+' mark is shown - next to `$projname`, which links to a "forks" view that lists all - the forks (all projects in `$projname/` subdirectory). Additionally + projects. For each project +$projname.git+, projects in the + +$projname/+ directory and its subdirectories will not be + shown in the main projects list. Instead, a \'\+' mark is shown + next to +$projname+, which links to a "forks" view that lists all + the forks (all projects in +$projname/+ subdirectory). Additionally a "forks" view for a project is linked from project summary page. + -If the project list is taken from a file (`$projects_list` points to a +If the project list is taken from a file (+$projects_list+ points to a file), forks are only recognized if they are listed after the main project in that file. + diff --git a/Documentation/gitworkflows.txt b/Documentation/gitworkflows.txt index 5e4f362ff8..8b8c6ae5d3 100644 --- a/Documentation/gitworkflows.txt +++ b/Documentation/gitworkflows.txt @@ -39,8 +39,8 @@ To achieve this, try to split your work into small steps from the very beginning. It is always easier to squash a few commits together than to split one big commit into several. Don't be afraid of making too small or imperfect steps along the way. You can always go back later -and edit the commits with `git rebase \--interactive` before you -publish them. You can use `git stash save \--keep-index` to run the +and edit the commits with `git rebase --interactive` before you +publish them. You can use `git stash save --keep-index` to run the test suite independent of other uncommitted changes; see the EXAMPLES section of linkgit:git-stash[1]. diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index 880b6f2e6f..e3d8a83b23 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -130,8 +130,8 @@ The placeholders are: - '%b': body - '%B': raw body (unwrapped subject and body) - '%N': commit notes -- '%gD': reflog selector, e.g., `refs/stash@\{1\}` -- '%gd': shortened reflog selector, e.g., `stash@\{1\}` +- '%gD': reflog selector, e.g., `refs/stash@{1}` +- '%gd': shortened reflog selector, e.g., `stash@{1}` - '%gn': reflog identity name - '%gN': reflog identity name (respecting .mailmap, see linkgit:git-shortlog[1] or linkgit:git-blame[1]) - '%ge': reflog identity email @@ -155,7 +155,7 @@ insert an empty string unless we are traversing reflog entries (e.g., by `git log -g`). The `%d` placeholder will use the "short" decoration format if `--decorate` was not already provided on the command line. -If you add a `{plus}` (plus sign) after '%' of a placeholder, a line-feed +If you add a `+` (plus sign) after '%' of a placeholder, a line-feed is inserted immediately before the expansion if and only if the placeholder expands to a non-empty string. diff --git a/Documentation/pull-fetch-param.txt b/Documentation/pull-fetch-param.txt index 5dd6e5a0c7..94a9d32f1d 100644 --- a/Documentation/pull-fetch-param.txt +++ b/Documentation/pull-fetch-param.txt @@ -13,7 +13,7 @@ endif::git-pull[] <refspec>:: The format of a <refspec> parameter is an optional plus - `{plus}`, followed by the source ref <src>, followed + `+`, followed by the source ref <src>, followed by a colon `:`, followed by the destination ref <dst>. + The remote ref that matches <src> diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt index 6a4b6355ba..1ae3c899ef 100644 --- a/Documentation/rev-list-options.txt +++ b/Documentation/rev-list-options.txt @@ -198,7 +198,7 @@ excluded from the output. + For example, `--cherry-pick --right-only A...B` omits those commits from `B` which are in `A` or are patch-equivalent to a commit in -`A`. In other words, this lists the `{plus}` commits from `git cherry A B`. +`A`. In other words, this lists the `+` commits from `git cherry A B`. More precisely, `--cherry-pick --right-only --no-merges` gives the exact list. @@ -455,7 +455,7 @@ The effect of this is best shown by way of comparing to `---------' ----------------------------------------------------------------------- + -Note the major differences in `N` and `P` over '\--full-history': +Note the major differences in `N` and `P` over '--full-history': + -- * `N`'s parent list had `I` removed, because it is an ancestor of the @@ -494,7 +494,7 @@ of course). When we want to find out what commits in `M` are contaminated with the bug introduced by `D` and need fixing, however, we might want to view only the subset of 'D..M' that are actually descendants of `D`, i.e. -excluding `C` and `K`. This is exactly what the '\--ancestry-path' +excluding `C` and `K`. This is exactly what the '--ancestry-path' option does. Applied to the 'D..M' range, it results in: + ----------------------------------------------------------------------- diff --git a/Documentation/technical/api-parse-options.txt b/Documentation/technical/api-parse-options.txt index 2527b7e8d7..3062389404 100644 --- a/Documentation/technical/api-parse-options.txt +++ b/Documentation/technical/api-parse-options.txt @@ -21,7 +21,7 @@ that allow to change the behavior of a command. * There are basically two forms of options: 'Short options' consist of one dash (`-`) and one alphanumeric character. - 'Long options' begin with two dashes (`\--`) and some + 'Long options' begin with two dashes (`--`) and some alphanumeric characters. * Options are case-sensitive. @@ -31,7 +31,7 @@ The parse-options API allows: * 'sticked' and 'separate form' of options with arguments. `-oArg` is sticked, `-o Arg` is separate form. - `\--option=Arg` is sticked, `\--option Arg` is separate form. + `--option=Arg` is sticked, `--option Arg` is separate form. * Long options may be 'abbreviated', as long as the abbreviation is unambiguous. @@ -39,12 +39,12 @@ The parse-options API allows: * Short options may be bundled, e.g. `-a -b` can be specified as `-ab`. * Boolean long options can be 'negated' (or 'unset') by prepending - `no-`, e.g. `\--no-abbrev` instead of `\--abbrev`. Conversely, + `no-`, e.g. `--no-abbrev` instead of `--abbrev`. Conversely, options that begin with `no-` can be 'negated' by removing it. -* Options and non-option arguments can clearly be separated using the `\--` - option, e.g. `-a -b \--option \-- \--this-is-a-file` indicates that - `\--this-is-a-file` must not be processed as an option. +* Options and non-option arguments can clearly be separated using the `--` + option, e.g. `-a -b --option -- --this-is-a-file` indicates that + `--this-is-a-file` must not be processed as an option. Steps to parse options ---------------------- @@ -76,7 +76,7 @@ before the full parser, which in turn shows the full help message. Flags are the bitwise-or of: `PARSE_OPT_KEEP_DASHDASH`:: - Keep the `\--` that usually separates options from + Keep the `--` that usually separates options from non-option arguments. `PARSE_OPT_STOP_AT_NON_OPTION`:: @@ -114,22 +114,22 @@ say `static struct option builtin_add_options[]`. There are some macros to easily define options: `OPT__ABBREV(&int_var)`:: - Add `\--abbrev[=<n>]`. + Add `--abbrev[=<n>]`. `OPT__COLOR(&int_var, description)`:: - Add `\--color[=<when>]` and `--no-color`. + Add `--color[=<when>]` and `--no-color`. `OPT__DRY_RUN(&int_var, description)`:: - Add `-n, \--dry-run`. + Add `-n, --dry-run`. `OPT__FORCE(&int_var, description)`:: - Add `-f, \--force`. + Add `-f, --force`. `OPT__QUIET(&int_var, description)`:: - Add `-q, \--quiet`. + Add `-q, --quiet`. `OPT__VERBOSE(&int_var, description)`:: - Add `-v, \--verbose`. + Add `-v, --verbose`. `OPT_GROUP(description)`:: Start an option group. `description` is a short string that @@ -216,10 +216,10 @@ The last element of the array must be `OPT_END()`. If not stated otherwise, interpret the arguments as follows: * `short` is a character for the short option - (e.g. `{apostrophe}e{apostrophe}` for `-e`, use `0` to omit), + (e.g. `'e'` for `-e`, use `0` to omit), * `long` is a string for the long option - (e.g. `"example"` for `\--example`, use `NULL` to omit), + (e.g. `"example"` for `--example`, use `NULL` to omit), * `int_var` is an integer variable, @@ -243,10 +243,10 @@ The function must be defined in this form: The callback mechanism is as follows: * Inside `func`, the only interesting member of the structure - given by `opt` is the void pointer `opt\->value`. - `\*opt\->value` will be the value that is saved into `var`, if you + given by `opt` is the void pointer `opt->value`. + `*opt->value` will be the value that is saved into `var`, if you use `OPT_CALLBACK()`. - For example, do `*(unsigned long *)opt\->value = 42;` to get 42 + For example, do `*(unsigned long *)opt->value = 42;` to get 42 into an `unsigned long` variable. * Return value `0` indicates success and non-zero return diff --git a/Documentation/technical/index-format.txt b/Documentation/technical/index-format.txt index 8930b3fabc..9d25b30178 100644 --- a/Documentation/technical/index-format.txt +++ b/Documentation/technical/index-format.txt @@ -113,9 +113,22 @@ GIT index format are encoded in 7-bit ASCII and the encoding cannot contain a NUL byte (iow, this is a UNIX pathname). + (Version 4) In version 4, the entry path name is prefix-compressed + relative to the path name for the previous entry (the very first + entry is encoded as if the path name for the previous entry is an + empty string). At the beginning of an entry, an integer N in the + variable width encoding (the same encoding as the offset is encoded + for OFS_DELTA pack entries; see pack-format.txt) is stored, followed + by a NUL-terminated string S. Removing N bytes from the end of the + path name for the previous entry, and replacing it with the string S + yields the path name for this entry. + 1-8 nul bytes as necessary to pad the entry to a multiple of eight bytes while keeping the name NUL-terminated. + (Version 4) In version 4, the padding after the pathname does not + exist. + == Extensions === Cached tree diff --git a/Documentation/technical/pack-protocol.txt b/Documentation/technical/pack-protocol.txt index 546980c0a4..49cdc571cd 100644 --- a/Documentation/technical/pack-protocol.txt +++ b/Documentation/technical/pack-protocol.txt @@ -351,7 +351,7 @@ Then the server will start sending its packfile data. A simple clone may look like this (with no 'have' lines): ---- - C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d\0multi_ack \ + C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \ side-band-64k ofs-delta\n C: 0032want 7d1665144a3a975c05f1f43902ddaf084e784dbe\n C: 0032want 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a\n @@ -367,7 +367,7 @@ A simple clone may look like this (with no 'have' lines): An incremental update (fetch) response might look like this: ---- - C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d\0multi_ack \ + C: 0054want 74730d410fcb6603ace96f1dc55ea6196122532d multi_ack \ side-band-64k ofs-delta\n C: 0032want 7d1665144a3a975c05f1f43902ddaf084e784dbe\n C: 0032want 5a3f6be755bbb7deae50065988cbfa1ffa9ab68a\n diff --git a/Documentation/technical/protocol-common.txt b/Documentation/technical/protocol-common.txt index d30a1b9510..fb7ff084f8 100644 --- a/Documentation/technical/protocol-common.txt +++ b/Documentation/technical/protocol-common.txt @@ -36,7 +36,7 @@ More specifically, they: . They cannot have ASCII control characters (i.e. bytes whose values are lower than \040, or \177 `DEL`), space, tilde `~`, - caret `{caret}`, colon `:`, question-mark `?`, asterisk `*`, + caret `^`, colon `:`, question-mark `?`, asterisk `*`, or open bracket `[` anywhere. . They cannot end with a slash `/` nor a dot `.`. diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt index 6c7fee7ef7..1b942074b6 100644 --- a/Documentation/user-manual.txt +++ b/Documentation/user-manual.txt @@ -1611,7 +1611,7 @@ Recovering lost changes Reflogs ^^^^^^^ -Say you modify a branch with `linkgit:git-reset[1] --hard`, and then +Say you modify a branch with +linkgit:git-reset[1] \--hard+, and then realize that the branch was the only reference you had to that point in history. @@ -4207,7 +4207,7 @@ commits one by one with the function `get_revision()`. If you are interested in more details of the revision walking process, just have a look at the first implementation of `cmd_log()`; call -`git show v1.3.0{tilde}155^2{tilde}4` and scroll down to that function (note that you +`git show v1.3.0~155^2~4` and scroll down to that function (note that you no longer need to call `setup_pager()` directly). Nowadays, `git log` is a builtin, which means that it is _contained_ in the @@ -4270,9 +4270,9 @@ Two things are interesting here: negative numbers in case of different errors--and 0 on success. - the variable `sha1` in the function signature of `get_sha1()` is `unsigned - char {asterisk}`, but is actually expected to be a pointer to `unsigned + char *`, but is actually expected to be a pointer to `unsigned char[20]`. This variable will contain the 160-bit SHA-1 of the given - commit. Note that whenever a SHA-1 is passed as `unsigned char {asterisk}`, it + commit. Note that whenever a SHA-1 is passed as `unsigned char *`, it is the binary representation, as opposed to the ASCII representation in hex characters, which is passed as `char *`. diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index c92dbed2ec..955b02b480 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v1.7.10.GIT +DEF_VER=v1.7.11-rc1 LF=' ' @@ -161,11 +161,9 @@ Issues of note: 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. + dblatex. Version >= 0.2.7 is known to work. - The documentation is written for AsciiDoc 7, but by default - uses some compatibility wrappers to work on AsciiDoc 8. If you have - AsciiDoc 7, try "make ASCIIDOC7=YesPlease". + All formats require at least asciidoc 8.4.1. There are also "make quick-install-doc", "make quick-install-man" and "make quick-install-html" which install preformatted man pages @@ -247,6 +247,9 @@ all:: # Define NO_CROSS_DIRECTORY_HARDLINKS if you plan to distribute the installed # programs as a tar, where bin/ and libexec/ might be on different file systems. # +# Define NO_INSTALL_HARDLINKS if you prefer to use either symbolic links or +# copies to install built-in git commands e.g. git-cat-file. +# # Define USE_NED_ALLOCATOR if you want to replace the platforms default # memory allocators with the nedmalloc allocator written by Niall Douglas. # @@ -288,6 +291,11 @@ all:: # dependency rules. # # Define NATIVE_CRLF if your platform uses CRLF for line endings. +# +# Define XDL_FAST_HASH to use an alternative line-hashing method in +# the diff algorithm. It gives a nice speedup if your processor has +# fast unaligned word loads. Does NOT work on big-endian systems! +# Enabled by default on x86_64. GIT-VERSION-FILE: FORCE @$(SHELL_PATH) ./GIT-VERSION-GEN @@ -386,6 +394,7 @@ XDIFF_OBJS = VCSSVN_H = VCSSVN_OBJS = VCSSVN_TEST_OBJS = +MISC_H = EXTRA_CPPFLAGS = LIB_H = LIB_OBJS = @@ -455,15 +464,15 @@ EXTRA_PROGRAMS = # ... and all the rest that could be moved out of bindir to gitexecdir PROGRAMS += $(EXTRA_PROGRAMS) +PROGRAM_OBJS += credential-store.o PROGRAM_OBJS += daemon.o PROGRAM_OBJS += fast-import.o +PROGRAM_OBJS += http-backend.o PROGRAM_OBJS += imap-send.o +PROGRAM_OBJS += sh-i18n--envsubst.o PROGRAM_OBJS += shell.o PROGRAM_OBJS += show-index.o PROGRAM_OBJS += upload-pack.o -PROGRAM_OBJS += http-backend.o -PROGRAM_OBJS += sh-i18n--envsubst.o -PROGRAM_OBJS += credential-store.o # Binary suffix, set to .exe for Windows builds X = @@ -476,7 +485,6 @@ TEST_PROGRAMS_NEED_X += test-ctype TEST_PROGRAMS_NEED_X += test-date TEST_PROGRAMS_NEED_X += test-delta TEST_PROGRAMS_NEED_X += test-dump-cache-tree -TEST_PROGRAMS_NEED_X += test-scrap-cache-tree TEST_PROGRAMS_NEED_X += test-genrandom TEST_PROGRAMS_NEED_X += test-index-version TEST_PROGRAMS_NEED_X += test-line-buffer @@ -487,6 +495,7 @@ TEST_PROGRAMS_NEED_X += test-parse-options TEST_PROGRAMS_NEED_X += test-path-utils TEST_PROGRAMS_NEED_X += test-revision-walking TEST_PROGRAMS_NEED_X += test-run-command +TEST_PROGRAMS_NEED_X += test-scrap-cache-tree TEST_PROGRAMS_NEED_X += test-sha1 TEST_PROGRAMS_NEED_X += test-sigchain TEST_PROGRAMS_NEED_X += test-subprocess @@ -546,6 +555,36 @@ LIB_FILE=libgit.a XDIFF_LIB=xdiff/lib.a VCSSVN_LIB=vcs-svn/lib.a +XDIFF_H += xdiff/xinclude.h +XDIFF_H += xdiff/xmacros.h +XDIFF_H += xdiff/xdiff.h +XDIFF_H += xdiff/xtypes.h +XDIFF_H += xdiff/xutils.h +XDIFF_H += xdiff/xprepare.h +XDIFF_H += xdiff/xdiffi.h +XDIFF_H += xdiff/xemit.h + +VCSSVN_H += vcs-svn/line_buffer.h +VCSSVN_H += vcs-svn/sliding_window.h +VCSSVN_H += vcs-svn/repo_tree.h +VCSSVN_H += vcs-svn/fast_export.h +VCSSVN_H += vcs-svn/svndiff.h +VCSSVN_H += vcs-svn/svndump.h + +MISC_H += bisect.h +MISC_H += branch.h +MISC_H += bundle.h +MISC_H += common-cmds.h +MISC_H += fetch-pack.h +MISC_H += reachable.h +MISC_H += send-pack.h +MISC_H += shortlog.h +MISC_H += tar.h +MISC_H += thread-utils.h +MISC_H += url.h +MISC_H += walker.h +MISC_H += wt-status.h + LIB_H += advice.h LIB_H += archive.h LIB_H += argv-array.h @@ -562,18 +601,18 @@ LIB_H += compat/cygwin.h LIB_H += compat/mingw.h LIB_H += compat/obstack.h LIB_H += compat/terminal.h +LIB_H += compat/win32/dirent.h +LIB_H += compat/win32/poll.h LIB_H += compat/win32/pthread.h LIB_H += compat/win32/syslog.h -LIB_H += compat/win32/poll.h -LIB_H += compat/win32/dirent.h LIB_H += connected.h LIB_H += convert.h LIB_H += credential.h LIB_H += csum-file.h LIB_H += decorate.h LIB_H += delta.h -LIB_H += diffcore.h LIB_H += diff.h +LIB_H += diffcore.h LIB_H += dir.h LIB_H += exec_cmd.h LIB_H += fmt-merge-msg.h @@ -631,6 +670,7 @@ LIB_H += tree-walk.h LIB_H += unpack-trees.h LIB_H += userdiff.h LIB_H += utf8.h +LIB_H += varint.h LIB_H += xdiff-interface.h LIB_H += xdiff/xdiff.h @@ -651,6 +691,7 @@ LIB_OBJS += bulk-checkin.o LIB_OBJS += bundle.o LIB_OBJS += cache-tree.o LIB_OBJS += color.o +LIB_OBJS += column.o LIB_OBJS += combine-diff.o LIB_OBJS += commit.o LIB_OBJS += compat/obstack.o @@ -680,8 +721,8 @@ LIB_OBJS += entry.o LIB_OBJS += environment.o LIB_OBJS += exec_cmd.o LIB_OBJS += fsck.o -LIB_OBJS += gpg-interface.o LIB_OBJS += gettext.o +LIB_OBJS += gpg-interface.o LIB_OBJS += graph.o LIB_OBJS += grep.o LIB_OBJS += hash.o @@ -730,9 +771,9 @@ LIB_OBJS += rerere.o LIB_OBJS += resolve-undo.o LIB_OBJS += revision.o LIB_OBJS += run-command.o +LIB_OBJS += sequencer.o LIB_OBJS += server-info.o LIB_OBJS += setup.o -LIB_OBJS += sequencer.o LIB_OBJS += sha1-array.o LIB_OBJS += sha1-lookup.o LIB_OBJS += sha1_file.o @@ -757,6 +798,7 @@ LIB_OBJS += url.o LIB_OBJS += usage.o LIB_OBJS += userdiff.o LIB_OBJS += utf8.o +LIB_OBJS += varint.o LIB_OBJS += walker.o LIB_OBJS += wrapper.o LIB_OBJS += write_or_die.o @@ -780,6 +822,7 @@ BUILTIN_OBJS += builtin/checkout-index.o BUILTIN_OBJS += builtin/checkout.o BUILTIN_OBJS += builtin/clean.o BUILTIN_OBJS += builtin/clone.o +BUILTIN_OBJS += builtin/column.o BUILTIN_OBJS += builtin/commit-tree.o BUILTIN_OBJS += builtin/commit.o BUILTIN_OBJS += builtin/config.o @@ -869,6 +912,9 @@ EXTLIBS = # because maintaining the nesting to match is a pain. If # we had "elif" things would have been much nicer... +ifeq ($(uname_M),x86_64) + XDL_FAST_HASH = YesPlease +endif ifeq ($(uname_S),OSF1) # Need this for u_short definitions et al BASIC_CFLAGS += -D_OSF_SOURCE @@ -1742,6 +1788,10 @@ ifndef NO_MSGFMT_EXTENDED_OPTIONS MSGFMT += --check --statistics endif +ifneq (,$(XDL_FAST_HASH)) + BASIC_CFLAGS += -DXDL_FAST_HASH +endif + ifeq ($(TCLTK_PATH),) NO_TCLTK=NoThanks endif @@ -1788,6 +1838,10 @@ ifdef ASCIIDOC7 export ASCIIDOC7 endif +ifdef NO_INSTALL_HARDLINKS + export NO_INSTALL_HARDLINKS +endif + ### profile feedback build # @@ -2035,7 +2089,7 @@ configure: configure.ac $(RM) $<+ # These can record GIT_VERSION -git.o git.spec \ +git.o git.spec http.o \ $(patsubst %.sh,%,$(SCRIPT_SH)) \ $(patsubst %.perl,%,$(SCRIPT_PERL)) \ : GIT-VERSION-FILE @@ -2172,34 +2226,19 @@ builtin/branch.o builtin/checkout.o builtin/clone.o builtin/reset.o branch.o tra builtin/bundle.o bundle.o transport.o: bundle.h builtin/bisect--helper.o builtin/rev-list.o bisect.o: bisect.h builtin/clone.o builtin/fetch-pack.o transport.o: fetch-pack.h -builtin/grep.o builtin/pack-objects.o transport-helper.o thread-utils.o: thread-utils.h +builtin/index-pack.o builtin/grep.o builtin/pack-objects.o transport-helper.o thread-utils.o: thread-utils.h builtin/send-pack.o transport.o: send-pack.h builtin/log.o builtin/shortlog.o: shortlog.h builtin/prune.o builtin/reflog.o reachable.o: reachable.h builtin/commit.o builtin/revert.o wt-status.o: wt-status.h builtin/tar-tree.o archive-tar.o: tar.h connect.o transport.o url.o http-backend.o: url.h +builtin/branch.o builtin/commit.o builtin/tag.o column.o help.o pager.o: column.h http-fetch.o http-walker.o remote-curl.o transport.o walker.o: walker.h http.o http-walker.o http-push.o http-fetch.o remote-curl.o: http.h url.h -XDIFF_H += xdiff/xinclude.h -XDIFF_H += xdiff/xmacros.h -XDIFF_H += xdiff/xdiff.h -XDIFF_H += xdiff/xtypes.h -XDIFF_H += xdiff/xutils.h -XDIFF_H += xdiff/xprepare.h -XDIFF_H += xdiff/xdiffi.h -XDIFF_H += xdiff/xemit.h - xdiff-interface.o $(XDIFF_OBJS): $(XDIFF_H) -VCSSVN_H += vcs-svn/line_buffer.h -VCSSVN_H += vcs-svn/sliding_window.h -VCSSVN_H += vcs-svn/repo_tree.h -VCSSVN_H += vcs-svn/fast_export.h -VCSSVN_H += vcs-svn/svndiff.h -VCSSVN_H += vcs-svn/svndump.h - $(VCSSVN_OBJS) $(VCSSVN_TEST_OBJS): $(LIB_H) $(VCSSVN_H) endif @@ -2296,7 +2335,7 @@ XGETTEXT_FLAGS_C = $(XGETTEXT_FLAGS) --language=C \ --keyword=_ --keyword=N_ --keyword="Q_:1,2" XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) --language=Shell XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl -LOCALIZED_C := $(C_OBJ:o=c) +LOCALIZED_C := $(C_OBJ:o=c) $(LIB_H) $(XDIFF_H) $(VCSSVN_H) $(MISC_H) LOCALIZED_SH := $(SCRIPT_SH) LOCALIZED_PERL := $(SCRIPT_PERL) @@ -2542,19 +2581,21 @@ endif { test "$$bindir/" = "$$execdir/" || \ for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \ $(RM) "$$execdir/$$p" && \ - test -z "$(NO_CROSS_DIRECTORY_HARDLINKS)" && \ + test -z "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \ ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \ cp "$$bindir/$$p" "$$execdir/$$p" || exit; \ done; \ } && \ for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \ $(RM) "$$bindir/$$p" && \ + test -z "$(NO_INSTALL_HARDLINKS)" && \ ln "$$bindir/git$X" "$$bindir/$$p" 2>/dev/null || \ ln -s "git$X" "$$bindir/$$p" 2>/dev/null || \ cp "$$bindir/git$X" "$$bindir/$$p" || exit; \ done && \ for p in $(BUILT_INS); do \ $(RM) "$$execdir/$$p" && \ + test -z "$(NO_INSTALL_HARDLINKS)" && \ ln "$$execdir/git$X" "$$execdir/$$p" 2>/dev/null || \ ln -s "git$X" "$$execdir/$$p" 2>/dev/null || \ cp "$$execdir/git$X" "$$execdir/$$p" || exit; \ @@ -2562,6 +2603,7 @@ endif remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \ for p in $$remote_curl_aliases; do \ $(RM) "$$execdir/$$p" && \ + test -z "$(NO_INSTALL_HARDLINKS)" && \ ln "$$execdir/git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \ ln -s "git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \ cp "$$execdir/git-remote-http$X" "$$execdir/$$p" || exit; \ diff --git a/archive-tar.c b/archive-tar.c index 20af0051a3..dc91c6b50d 100644 --- a/archive-tar.c +++ b/archive-tar.c @@ -4,6 +4,7 @@ #include "cache.h" #include "tar.h" #include "archive.h" +#include "streaming.h" #include "run-command.h" #define RECORDSIZE (512) @@ -30,10 +31,9 @@ static void write_if_needed(void) * queues up writes, so that all our write(2) calls write exactly one * full block; pads writes to RECORDSIZE */ -static void write_blocked(const void *data, unsigned long size) +static void do_write_blocked(const void *data, unsigned long size) { const char *buf = data; - unsigned long tail; if (offset) { unsigned long chunk = BLOCKSIZE - offset; @@ -54,6 +54,11 @@ static void write_blocked(const void *data, unsigned long size) memcpy(block + offset, buf, size); offset += size; } +} + +static void finish_record(void) +{ + unsigned long tail; tail = offset % RECORDSIZE; if (tail) { memset(block + offset, 0, RECORDSIZE - tail); @@ -62,6 +67,12 @@ static void write_blocked(const void *data, unsigned long size) write_if_needed(); } +static void write_blocked(const void *data, unsigned long size) +{ + do_write_blocked(data, size); + finish_record(); +} + /* * The end of tar archives is marked by 2*512 nul bytes and after that * follows the rest of the block (if any). @@ -78,6 +89,33 @@ static void write_trailer(void) } /* + * queues up writes, so that all our write(2) calls write exactly one + * full block; pads writes to RECORDSIZE + */ +static int stream_blocked(const unsigned char *sha1) +{ + struct git_istream *st; + enum object_type type; + unsigned long sz; + char buf[BLOCKSIZE]; + ssize_t readlen; + + st = open_istream(sha1, &type, &sz, NULL); + if (!st) + return error("cannot stream blob %s", sha1_to_hex(sha1)); + for (;;) { + readlen = read_istream(st, buf, sizeof(buf)); + if (readlen <= 0) + break; + do_write_blocked(buf, readlen); + } + close_istream(st); + if (!readlen) + finish_record(); + return readlen; +} + +/* * pax extended header records have the format "%u %s=%s\n". %u contains * the size of the whole string (including the %u), the first %s is the * keyword, the second one is the value. This function constructs such a @@ -101,13 +139,13 @@ static void strbuf_append_ext_header(struct strbuf *sb, const char *keyword, static unsigned int ustar_header_chksum(const struct ustar_header *header) { - char *p = (char *)header; + const char *p = (const char *)header; unsigned int chksum = 0; while (p < header->chksum) chksum += *p++; chksum += sizeof(header->chksum) * ' '; p += sizeof(header->chksum); - while (p < (char *)header + sizeof(struct ustar_header)) + while (p < (const char *)header + sizeof(struct ustar_header)) chksum += *p++; return chksum; } @@ -123,56 +161,101 @@ static size_t get_path_prefix(const char *path, size_t pathlen, size_t maxlen) return i; } +static void prepare_header(struct archiver_args *args, + struct ustar_header *header, + unsigned int mode, unsigned long size) +{ + sprintf(header->mode, "%07o", mode & 07777); + sprintf(header->size, "%011lo", S_ISREG(mode) ? size : 0); + sprintf(header->mtime, "%011lo", (unsigned long) args->time); + + sprintf(header->uid, "%07o", 0); + sprintf(header->gid, "%07o", 0); + strlcpy(header->uname, "root", sizeof(header->uname)); + strlcpy(header->gname, "root", sizeof(header->gname)); + sprintf(header->devmajor, "%07o", 0); + sprintf(header->devminor, "%07o", 0); + + memcpy(header->magic, "ustar", 6); + memcpy(header->version, "00", 2); + + sprintf(header->chksum, "%07o", ustar_header_chksum(header)); +} + +static int write_extended_header(struct archiver_args *args, + const unsigned char *sha1, + const void *buffer, unsigned long size) +{ + struct ustar_header header; + unsigned int mode; + memset(&header, 0, sizeof(header)); + *header.typeflag = TYPEFLAG_EXT_HEADER; + mode = 0100666; + sprintf(header.name, "%s.paxheader", sha1_to_hex(sha1)); + prepare_header(args, &header, mode, size); + write_blocked(&header, sizeof(header)); + write_blocked(buffer, size); + return 0; +} + static int write_tar_entry(struct archiver_args *args, - const unsigned char *sha1, const char *path, size_t pathlen, - unsigned int mode, void *buffer, unsigned long size) + const unsigned char *sha1, + const char *path, size_t pathlen, + unsigned int mode) { struct ustar_header header; struct strbuf ext_header = STRBUF_INIT; + unsigned int old_mode = mode; + unsigned long size; + void *buffer; int err = 0; memset(&header, 0, sizeof(header)); - if (!sha1) { - *header.typeflag = TYPEFLAG_GLOBAL_HEADER; - mode = 0100666; - strcpy(header.name, "pax_global_header"); - } else if (!path) { - *header.typeflag = TYPEFLAG_EXT_HEADER; - mode = 0100666; - sprintf(header.name, "%s.paxheader", sha1_to_hex(sha1)); + if (S_ISDIR(mode) || S_ISGITLINK(mode)) { + *header.typeflag = TYPEFLAG_DIR; + mode = (mode | 0777) & ~tar_umask; + } else if (S_ISLNK(mode)) { + *header.typeflag = TYPEFLAG_LNK; + mode |= 0777; + } else if (S_ISREG(mode)) { + *header.typeflag = TYPEFLAG_REG; + mode = (mode | ((mode & 0100) ? 0777 : 0666)) & ~tar_umask; } else { - if (S_ISDIR(mode) || S_ISGITLINK(mode)) { - *header.typeflag = TYPEFLAG_DIR; - mode = (mode | 0777) & ~tar_umask; - } else if (S_ISLNK(mode)) { - *header.typeflag = TYPEFLAG_LNK; - mode |= 0777; - } else if (S_ISREG(mode)) { - *header.typeflag = TYPEFLAG_REG; - mode = (mode | ((mode & 0100) ? 0777 : 0666)) & ~tar_umask; + return error("unsupported file mode: 0%o (SHA1: %s)", + mode, sha1_to_hex(sha1)); + } + if (pathlen > sizeof(header.name)) { + size_t plen = get_path_prefix(path, pathlen, + sizeof(header.prefix)); + size_t rest = pathlen - plen - 1; + if (plen > 0 && rest <= sizeof(header.name)) { + memcpy(header.prefix, path, plen); + memcpy(header.name, path + plen + 1, rest); } else { - return error("unsupported file mode: 0%o (SHA1: %s)", - mode, sha1_to_hex(sha1)); + sprintf(header.name, "%s.data", + sha1_to_hex(sha1)); + strbuf_append_ext_header(&ext_header, "path", + path, pathlen); } - if (pathlen > sizeof(header.name)) { - size_t plen = get_path_prefix(path, pathlen, - sizeof(header.prefix)); - size_t rest = pathlen - plen - 1; - if (plen > 0 && rest <= sizeof(header.name)) { - memcpy(header.prefix, path, plen); - memcpy(header.name, path + plen + 1, rest); - } else { - sprintf(header.name, "%s.data", - sha1_to_hex(sha1)); - strbuf_append_ext_header(&ext_header, "path", - path, pathlen); - } - } else - memcpy(header.name, path, pathlen); + } else + memcpy(header.name, path, pathlen); + + if (S_ISREG(mode) && !args->convert && + sha1_object_info(sha1, &size) == OBJ_BLOB && + size > big_file_threshold) + buffer = NULL; + else if (S_ISLNK(mode) || S_ISREG(mode)) { + enum object_type type; + buffer = sha1_file_to_archive(args, path, sha1, old_mode, &type, &size); + if (!buffer) + return error("cannot read %s", sha1_to_hex(sha1)); + } else { + buffer = NULL; + size = 0; } - if (S_ISLNK(mode) && buffer) { + if (S_ISLNK(mode)) { if (size > sizeof(header.linkname)) { sprintf(header.linkname, "see %s.paxheader", sha1_to_hex(sha1)); @@ -182,32 +265,25 @@ static int write_tar_entry(struct archiver_args *args, memcpy(header.linkname, buffer, size); } - sprintf(header.mode, "%07o", mode & 07777); - sprintf(header.size, "%011lo", S_ISREG(mode) ? size : 0); - sprintf(header.mtime, "%011lo", (unsigned long) args->time); - - sprintf(header.uid, "%07o", 0); - sprintf(header.gid, "%07o", 0); - strlcpy(header.uname, "root", sizeof(header.uname)); - strlcpy(header.gname, "root", sizeof(header.gname)); - sprintf(header.devmajor, "%07o", 0); - sprintf(header.devminor, "%07o", 0); - - memcpy(header.magic, "ustar", 6); - memcpy(header.version, "00", 2); - - sprintf(header.chksum, "%07o", ustar_header_chksum(&header)); + prepare_header(args, &header, mode, size); if (ext_header.len > 0) { - err = write_tar_entry(args, sha1, NULL, 0, 0, ext_header.buf, - ext_header.len); - if (err) + err = write_extended_header(args, sha1, ext_header.buf, + ext_header.len); + if (err) { + free(buffer); return err; + } } strbuf_release(&ext_header); write_blocked(&header, sizeof(header)); - if (S_ISREG(mode) && buffer && size > 0) - write_blocked(buffer, size); + if (S_ISREG(mode) && size > 0) { + if (buffer) + write_blocked(buffer, size); + else + err = stream_blocked(sha1); + } + free(buffer); return err; } @@ -215,11 +291,18 @@ static int write_global_extended_header(struct archiver_args *args) { const unsigned char *sha1 = args->commit_sha1; struct strbuf ext_header = STRBUF_INIT; - int err; + struct ustar_header header; + unsigned int mode; + int err = 0; strbuf_append_ext_header(&ext_header, "comment", sha1_to_hex(sha1), 40); - err = write_tar_entry(args, NULL, NULL, 0, 0, ext_header.buf, - ext_header.len); + memset(&header, 0, sizeof(header)); + *header.typeflag = TYPEFLAG_GLOBAL_HEADER; + mode = 0100666; + strcpy(header.name, "pax_global_header"); + prepare_header(args, &header, mode, ext_header.len); + write_blocked(&header, sizeof(header)); + write_blocked(ext_header.buf, ext_header.len); strbuf_release(&ext_header); return err; } diff --git a/archive-zip.c b/archive-zip.c index 02d1f3787a..f5af81f904 100644 --- a/archive-zip.c +++ b/archive-zip.c @@ -3,6 +3,7 @@ */ #include "cache.h" #include "archive.h" +#include "streaming.h" static int zip_date; static int zip_time; @@ -15,6 +16,7 @@ static unsigned int zip_dir_offset; static unsigned int zip_dir_entries; #define ZIP_DIRECTORY_MIN_SIZE (1024 * 1024) +#define ZIP_STREAM (8) struct zip_local_header { unsigned char magic[4]; @@ -31,6 +33,14 @@ struct zip_local_header { unsigned char _end[1]; }; +struct zip_data_desc { + unsigned char magic[4]; + unsigned char crc32[4]; + unsigned char compressed_size[4]; + unsigned char size[4]; + unsigned char _end[1]; +}; + struct zip_dir_header { unsigned char magic[4]; unsigned char creator_version[2]; @@ -70,6 +80,7 @@ struct zip_dir_trailer { * we're interested in. */ #define ZIP_LOCAL_HEADER_SIZE offsetof(struct zip_local_header, _end) +#define ZIP_DATA_DESC_SIZE offsetof(struct zip_data_desc, _end) #define ZIP_DIR_HEADER_SIZE offsetof(struct zip_dir_header, _end) #define ZIP_DIR_TRAILER_SIZE offsetof(struct zip_dir_trailer, _end) @@ -120,20 +131,59 @@ static void *zlib_deflate(void *data, unsigned long size, return buffer; } +static void write_zip_data_desc(unsigned long size, + unsigned long compressed_size, + unsigned long crc) +{ + struct zip_data_desc trailer; + + copy_le32(trailer.magic, 0x08074b50); + copy_le32(trailer.crc32, crc); + copy_le32(trailer.compressed_size, compressed_size); + copy_le32(trailer.size, size); + write_or_die(1, &trailer, ZIP_DATA_DESC_SIZE); +} + +static void set_zip_dir_data_desc(struct zip_dir_header *header, + unsigned long size, + unsigned long compressed_size, + unsigned long crc) +{ + copy_le32(header->crc32, crc); + copy_le32(header->compressed_size, compressed_size); + copy_le32(header->size, size); +} + +static void set_zip_header_data_desc(struct zip_local_header *header, + unsigned long size, + unsigned long compressed_size, + unsigned long crc) +{ + copy_le32(header->crc32, crc); + copy_le32(header->compressed_size, compressed_size); + copy_le32(header->size, size); +} + +#define STREAM_BUFFER_SIZE (1024 * 16) + static int write_zip_entry(struct archiver_args *args, - const unsigned char *sha1, const char *path, size_t pathlen, - unsigned int mode, void *buffer, unsigned long size) + const unsigned char *sha1, + const char *path, size_t pathlen, + unsigned int mode) { struct zip_local_header header; struct zip_dir_header dirent; unsigned long attr2; unsigned long compressed_size; - unsigned long uncompressed_size; unsigned long crc; unsigned long direntsize; int method; unsigned char *out; void *deflated = NULL; + void *buffer; + struct git_istream *stream = NULL; + unsigned long flags = 0; + unsigned long size; crc = crc32(0, NULL, 0); @@ -146,24 +196,43 @@ static int write_zip_entry(struct archiver_args *args, method = 0; attr2 = 16; out = NULL; - uncompressed_size = 0; + size = 0; compressed_size = 0; + buffer = NULL; + size = 0; } else if (S_ISREG(mode) || S_ISLNK(mode)) { + enum object_type type = sha1_object_info(sha1, &size); + method = 0; attr2 = S_ISLNK(mode) ? ((mode | 0777) << 16) : (mode & 0111) ? ((mode) << 16) : 0; - if (S_ISREG(mode) && args->compression_level != 0) + if (S_ISREG(mode) && args->compression_level != 0 && size > 0) method = 8; - crc = crc32(crc, buffer, size); - out = buffer; - uncompressed_size = size; compressed_size = size; + + if (S_ISREG(mode) && type == OBJ_BLOB && !args->convert && + size > big_file_threshold) { + stream = open_istream(sha1, &type, &size, NULL); + if (!stream) + return error("cannot stream blob %s", + sha1_to_hex(sha1)); + flags |= ZIP_STREAM; + out = buffer = NULL; + } else { + buffer = sha1_file_to_archive(args, path, sha1, mode, + &type, &size); + if (!buffer) + return error("cannot read %s", + sha1_to_hex(sha1)); + crc = crc32(crc, buffer, size); + out = buffer; + } } else { return error("unsupported file mode: 0%o (SHA1: %s)", mode, sha1_to_hex(sha1)); } - if (method == 8) { + if (buffer && method == 8) { deflated = zlib_deflate(buffer, size, args->compression_level, &compressed_size); if (deflated && compressed_size - 6 < size) { @@ -188,13 +257,11 @@ static int write_zip_entry(struct archiver_args *args, copy_le16(dirent.creator_version, S_ISLNK(mode) || (S_ISREG(mode) && (mode & 0111)) ? 0x0317 : 0); copy_le16(dirent.version, 10); - copy_le16(dirent.flags, 0); + copy_le16(dirent.flags, flags); copy_le16(dirent.compression_method, method); copy_le16(dirent.mtime, zip_time); copy_le16(dirent.mdate, zip_date); - copy_le32(dirent.crc32, crc); - copy_le32(dirent.compressed_size, compressed_size); - copy_le32(dirent.size, uncompressed_size); + set_zip_dir_data_desc(&dirent, size, compressed_size, crc); copy_le16(dirent.filename_length, pathlen); copy_le16(dirent.extra_length, 0); copy_le16(dirent.comment_length, 0); @@ -202,33 +269,120 @@ static int write_zip_entry(struct archiver_args *args, copy_le16(dirent.attr1, 0); copy_le32(dirent.attr2, attr2); copy_le32(dirent.offset, zip_offset); - memcpy(zip_dir + zip_dir_offset, &dirent, ZIP_DIR_HEADER_SIZE); - zip_dir_offset += ZIP_DIR_HEADER_SIZE; - memcpy(zip_dir + zip_dir_offset, path, pathlen); - zip_dir_offset += pathlen; - zip_dir_entries++; copy_le32(header.magic, 0x04034b50); copy_le16(header.version, 10); - copy_le16(header.flags, 0); + copy_le16(header.flags, flags); copy_le16(header.compression_method, method); copy_le16(header.mtime, zip_time); copy_le16(header.mdate, zip_date); - copy_le32(header.crc32, crc); - copy_le32(header.compressed_size, compressed_size); - copy_le32(header.size, uncompressed_size); + if (flags & ZIP_STREAM) + set_zip_header_data_desc(&header, 0, 0, 0); + else + set_zip_header_data_desc(&header, size, compressed_size, crc); copy_le16(header.filename_length, pathlen); copy_le16(header.extra_length, 0); write_or_die(1, &header, ZIP_LOCAL_HEADER_SIZE); zip_offset += ZIP_LOCAL_HEADER_SIZE; write_or_die(1, path, pathlen); zip_offset += pathlen; - if (compressed_size > 0) { + if (stream && method == 0) { + unsigned char buf[STREAM_BUFFER_SIZE]; + ssize_t readlen; + + for (;;) { + readlen = read_istream(stream, buf, sizeof(buf)); + if (readlen <= 0) + break; + crc = crc32(crc, buf, readlen); + write_or_die(1, buf, readlen); + } + close_istream(stream); + if (readlen) + return readlen; + + compressed_size = size; + zip_offset += compressed_size; + + write_zip_data_desc(size, compressed_size, crc); + zip_offset += ZIP_DATA_DESC_SIZE; + + set_zip_dir_data_desc(&dirent, size, compressed_size, crc); + } else if (stream && method == 8) { + unsigned char buf[STREAM_BUFFER_SIZE]; + ssize_t readlen; + git_zstream zstream; + int result; + size_t out_len; + unsigned char compressed[STREAM_BUFFER_SIZE * 2]; + + memset(&zstream, 0, sizeof(zstream)); + git_deflate_init(&zstream, args->compression_level); + + compressed_size = 0; + zstream.next_out = compressed; + zstream.avail_out = sizeof(compressed); + + for (;;) { + readlen = read_istream(stream, buf, sizeof(buf)); + if (readlen <= 0) + break; + crc = crc32(crc, buf, readlen); + + zstream.next_in = buf; + zstream.avail_in = readlen; + result = git_deflate(&zstream, 0); + if (result != Z_OK) + die("deflate error (%d)", result); + out = compressed; + if (!compressed_size) + out += 2; + out_len = zstream.next_out - out; + + if (out_len > 0) { + write_or_die(1, out, out_len); + compressed_size += out_len; + zstream.next_out = compressed; + zstream.avail_out = sizeof(compressed); + } + + } + close_istream(stream); + if (readlen) + return readlen; + + zstream.next_in = buf; + zstream.avail_in = 0; + result = git_deflate(&zstream, Z_FINISH); + if (result != Z_STREAM_END) + die("deflate error (%d)", result); + + git_deflate_end(&zstream); + out = compressed; + if (!compressed_size) + out += 2; + out_len = zstream.next_out - out - 4; + write_or_die(1, out, out_len); + compressed_size += out_len; + zip_offset += compressed_size; + + write_zip_data_desc(size, compressed_size, crc); + zip_offset += ZIP_DATA_DESC_SIZE; + + set_zip_dir_data_desc(&dirent, size, compressed_size, crc); + } else if (compressed_size > 0) { write_or_die(1, out, compressed_size); zip_offset += compressed_size; } free(deflated); + free(buffer); + + memcpy(zip_dir + zip_dir_offset, &dirent, ZIP_DIR_HEADER_SIZE); + zip_dir_offset += ZIP_DIR_HEADER_SIZE; + memcpy(zip_dir + zip_dir_offset, path, pathlen); + zip_dir_offset += pathlen; + zip_dir_entries++; return 0; } @@ -59,12 +59,15 @@ static void format_subst(const struct commit *commit, free(to_free); } -static void *sha1_file_to_archive(const char *path, const unsigned char *sha1, - unsigned int mode, enum object_type *type, - unsigned long *sizep, const struct commit *commit) +void *sha1_file_to_archive(const struct archiver_args *args, + const char *path, const unsigned char *sha1, + unsigned int mode, enum object_type *type, + unsigned long *sizep) { void *buffer; + const struct commit *commit = args->convert ? args->commit : NULL; + path += args->baselen; buffer = read_sha1_file(sha1, type, sizep); if (buffer && S_ISREG(mode)) { struct strbuf buf = STRBUF_INIT; @@ -109,12 +112,9 @@ static int write_archive_entry(const unsigned char *sha1, const char *base, write_archive_entry_fn_t write_entry = c->write_entry; struct git_attr_check check[2]; const char *path_without_prefix; - int convert = 0; int err; - enum object_type type; - unsigned long size; - void *buffer; + args->convert = 0; strbuf_reset(&path); strbuf_grow(&path, PATH_MAX); strbuf_add(&path, args->base, args->baselen); @@ -126,28 +126,22 @@ static int write_archive_entry(const unsigned char *sha1, const char *base, if (!git_check_attr(path_without_prefix, ARRAY_SIZE(check), check)) { if (ATTR_TRUE(check[0].value)) return 0; - convert = ATTR_TRUE(check[1].value); + args->convert = ATTR_TRUE(check[1].value); } if (S_ISDIR(mode) || S_ISGITLINK(mode)) { strbuf_addch(&path, '/'); if (args->verbose) fprintf(stderr, "%.*s\n", (int)path.len, path.buf); - err = write_entry(args, sha1, path.buf, path.len, mode, NULL, 0); + err = write_entry(args, sha1, path.buf, path.len, mode); if (err) return err; return (S_ISDIR(mode) ? READ_TREE_RECURSIVE : 0); } - buffer = sha1_file_to_archive(path_without_prefix, sha1, mode, - &type, &size, convert ? args->commit : NULL); - if (!buffer) - return error("cannot read %s", sha1_to_hex(sha1)); if (args->verbose) fprintf(stderr, "%.*s\n", (int)path.len, path.buf); - err = write_entry(args, sha1, path.buf, path.len, mode, buffer, size); - free(buffer); - return err; + return write_entry(args, sha1, path.buf, path.len, mode); } int write_archive_entries(struct archiver_args *args, @@ -167,7 +161,7 @@ int write_archive_entries(struct archiver_args *args, if (args->verbose) fprintf(stderr, "%.*s\n", (int)len, args->base); err = write_entry(args, args->tree->object.sha1, args->base, - len, 040777, NULL, 0); + len, 040777); if (err) return err; } @@ -260,18 +254,11 @@ static void parse_treeish_arg(const char **argv, /* Remotes are only allowed to fetch actual refs */ if (remote) { char *ref = NULL; - const char *refname, *colon = NULL; - - colon = strchr(name, ':'); - if (colon) - refname = xstrndup(name, colon - name); - else - refname = name; - - if (!dwim_ref(refname, strlen(refname), sha1, &ref)) - die("no such ref: %s", refname); - if (refname != name) - free((void *)refname); + const char *colon = strchr(name, ':'); + int refnamelen = colon ? colon - name : strlen(name); + + if (!dwim_ref(name, refnamelen, sha1, &ref)) + die("no such ref: %.*s", refnamelen, name); free(ref); } @@ -11,6 +11,7 @@ struct archiver_args { const char **pathspec; unsigned int verbose : 1; unsigned int worktree_attributes : 1; + unsigned int convert : 1; int compression_level; }; @@ -27,11 +28,18 @@ extern void register_archiver(struct archiver *); extern void init_tar_archiver(void); extern void init_zip_archiver(void); -typedef int (*write_archive_entry_fn_t)(struct archiver_args *args, const unsigned char *sha1, const char *path, size_t pathlen, unsigned int mode, void *buffer, unsigned long size); +typedef int (*write_archive_entry_fn_t)(struct archiver_args *args, + const unsigned char *sha1, + const char *path, size_t pathlen, + unsigned int mode); extern int write_archive_entries(struct archiver_args *args, write_archive_entry_fn_t write_entry); extern int write_archive(int argc, const char **argv, const char *prefix, int setup_prefix, const char *name_hint, int remote); const char *archive_format_from_filename(const char *filename); +extern void *sha1_file_to_archive(const struct archiver_args *args, + const char *path, const unsigned char *sha1, + unsigned int mode, enum object_type *type, + unsigned long *sizep); #endif /* ARCHIVE_H */ @@ -833,7 +833,7 @@ static int check_ancestors(const char *prefix) */ static void check_good_are_ancestors_of_bad(const char *prefix, int no_checkout) { - const char *filename = git_path("BISECT_ANCESTORS_OK"); + char *filename = xstrdup(git_path("BISECT_ANCESTORS_OK")); struct stat st; int fd; @@ -842,11 +842,11 @@ static void check_good_are_ancestors_of_bad(const char *prefix, int no_checkout) /* Check if file BISECT_ANCESTORS_OK exists. */ if (!stat(filename, &st) && S_ISREG(st.st_mode)) - return; + goto done; /* Bisecting with no good rev is ok. */ if (good_revs.nr == 0) - return; + goto done; /* Check if all good revs are ancestor of the bad rev. */ if (check_ancestors(prefix)) @@ -859,6 +859,8 @@ static void check_good_are_ancestors_of_bad(const char *prefix, int no_checkout) filename, strerror(errno)); else close(fd); + done: + free(filename); } /* @@ -61,6 +61,7 @@ extern int cmd_cherry(int argc, const char **argv, const char *prefix); extern int cmd_cherry_pick(int argc, const char **argv, const char *prefix); extern int cmd_clone(int argc, const char **argv, const char *prefix); extern int cmd_clean(int argc, const char **argv, const char *prefix); +extern int cmd_column(int argc, const char **argv, const char *prefix); extern int cmd_commit(int argc, const char **argv, const char *prefix); extern int cmd_commit_tree(int argc, const char **argv, const char *prefix); extern int cmd_config(int argc, const char **argv, const char *prefix); diff --git a/builtin/apply.c b/builtin/apply.c index 799bb5e906..b4428ea34f 100644 --- a/builtin/apply.c +++ b/builtin/apply.c @@ -50,7 +50,7 @@ static const char *fake_ancestor; static int line_termination = '\n'; static unsigned int p_context = UINT_MAX; static const char * const apply_usage[] = { - "git apply [options] [<patch>...]", + N_("git apply [options] [<patch>...]"), NULL }; @@ -103,7 +103,7 @@ static void parse_whitespace_option(const char *option) ws_error_action = correct_ws_error; return; } - die("unrecognized whitespace option '%s'", option); + die(_("unrecognized whitespace option '%s'"), option); } static void parse_ignorewhitespace_option(const char *option) @@ -118,7 +118,7 @@ static void parse_ignorewhitespace_option(const char *option) ws_ignore_action = ignore_ws_change; return; } - die("unrecognized whitespace ignore option '%s'", option); + die(_("unrecognized whitespace ignore option '%s'"), option); } static void set_default_whitespace_mode(const char *whitespace_option) @@ -375,22 +375,25 @@ static void clear_image(struct image *image) image->len = 0; } -static void say_patch_name(FILE *output, const char *pre, - struct patch *patch, const char *post) +/* fmt must contain _one_ %s and no other substitution */ +static void say_patch_name(FILE *output, const char *fmt, struct patch *patch) { - fputs(pre, output); + struct strbuf sb = STRBUF_INIT; + if (patch->old_name && patch->new_name && strcmp(patch->old_name, patch->new_name)) { - quote_c_style(patch->old_name, NULL, output, 0); - fputs(" => ", output); - quote_c_style(patch->new_name, NULL, output, 0); + quote_c_style(patch->old_name, &sb, NULL, 0); + strbuf_addstr(&sb, " => "); + quote_c_style(patch->new_name, &sb, NULL, 0); } else { const char *n = patch->new_name; if (!n) n = patch->old_name; - quote_c_style(n, NULL, output, 0); + quote_c_style(n, &sb, NULL, 0); } - fputs(post, output); + fprintf(output, fmt, sb.buf); + fputc('\n', output); + strbuf_release(&sb); } #define SLOP (16) @@ -809,7 +812,7 @@ static int has_epoch_timestamp(const char *nameline) if (!stamp) { stamp = xmalloc(sizeof(*stamp)); if (regcomp(stamp, stamp_regexp, REG_EXTENDED)) { - warning("Cannot prepare timestamp regexp %s", + warning(_("Cannot prepare timestamp regexp %s"), stamp_regexp); return 0; } @@ -818,7 +821,7 @@ static int has_epoch_timestamp(const char *nameline) status = regexec(stamp, timestamp, ARRAY_SIZE(m), m, 0); if (status) { if (status != REG_NOMATCH) - warning("regexec returned %d for input: %s", + warning(_("regexec returned %d for input: %s"), status, timestamp); return 0; } @@ -899,7 +902,7 @@ static void parse_traditional_patch(const char *first, const char *second, struc } } if (!name) - die("unable to find filename in patch at line %d", linenr); + die(_("unable to find filename in patch at line %d"), linenr); } static int gitdiff_hdrend(const char *line, struct patch *patch) @@ -916,7 +919,10 @@ static int gitdiff_hdrend(const char *line, struct patch *patch) * their names against any previous information, just * to make sure.. */ -static char *gitdiff_verify_name(const char *line, int isnull, char *orig_name, const char *oldnew) +#define DIFF_OLD_NAME 0 +#define DIFF_NEW_NAME 1 + +static char *gitdiff_verify_name(const char *line, int isnull, char *orig_name, int side) { if (!orig_name && !isnull) return find_name(line, NULL, p_value, TERM_TAB); @@ -928,17 +934,19 @@ static char *gitdiff_verify_name(const char *line, int isnull, char *orig_name, name = orig_name; len = strlen(name); if (isnull) - die("git apply: bad git-diff - expected /dev/null, got %s on line %d", name, linenr); + die(_("git apply: bad git-diff - expected /dev/null, got %s on line %d"), name, linenr); another = find_name(line, NULL, p_value, TERM_TAB); if (!another || memcmp(another, name, len + 1)) - die("git apply: bad git-diff - inconsistent %s filename on line %d", oldnew, linenr); + die((side == DIFF_NEW_NAME) ? + _("git apply: bad git-diff - inconsistent new filename on line %d") : + _("git apply: bad git-diff - inconsistent old filename on line %d"), linenr); free(another); return orig_name; } else { /* expect "/dev/null" */ if (memcmp("/dev/null", line, 9) || line[9] != '\n') - die("git apply: bad git-diff - expected /dev/null on line %d", linenr); + die(_("git apply: bad git-diff - expected /dev/null on line %d"), linenr); return NULL; } } @@ -946,7 +954,8 @@ static char *gitdiff_verify_name(const char *line, int isnull, char *orig_name, static int gitdiff_oldname(const char *line, struct patch *patch) { char *orig = patch->old_name; - patch->old_name = gitdiff_verify_name(line, patch->is_new, patch->old_name, "old"); + patch->old_name = gitdiff_verify_name(line, patch->is_new, patch->old_name, + DIFF_OLD_NAME); if (orig != patch->old_name) free(orig); return 0; @@ -955,7 +964,8 @@ static int gitdiff_oldname(const char *line, struct patch *patch) static int gitdiff_newname(const char *line, struct patch *patch) { char *orig = patch->new_name; - patch->new_name = gitdiff_verify_name(line, patch->is_delete, patch->new_name, "new"); + patch->new_name = gitdiff_verify_name(line, patch->is_delete, patch->new_name, + DIFF_NEW_NAME); if (orig != patch->new_name) free(orig); return 0; @@ -1381,7 +1391,7 @@ static void recount_diff(const char *line, int size, struct fragment *fragment) break; } if (ret) { - warning("recount: unexpected line: %.*s", + warning(_("recount: unexpected line: %.*s"), (int)linelen(line, size), line); return; } @@ -1438,7 +1448,7 @@ static int find_header(const char *line, unsigned long size, int *hdrsize, struc struct fragment dummy; if (parse_fragment_header(line, len, &dummy) < 0) continue; - die("patch fragment without header at line %d: %.*s", + die(_("patch fragment without header at line %d: %.*s"), linenr, (int)len-1, line); } @@ -1455,8 +1465,12 @@ static int find_header(const char *line, unsigned long size, int *hdrsize, struc continue; if (!patch->old_name && !patch->new_name) { if (!patch->def_name) - die("git diff header lacks filename information when removing " - "%d leading pathname components (line %d)" , p_value, linenr); + die(Q_("git diff header lacks filename information when removing " + "%d leading pathname component (line %d)", + "git diff header lacks filename information when removing " + "%d leading pathname components (line %d)", + p_value), + p_value, linenr); patch->old_name = xstrdup(patch->def_name); patch->new_name = xstrdup(patch->def_name); } @@ -1611,9 +1625,9 @@ static int parse_fragment(const char *line, unsigned long size, patch->lines_deleted += deleted; if (0 < patch->is_new && oldlines) - return error("new file depends on old contents"); + return error(_("new file depends on old contents")); if (0 < patch->is_delete && newlines) - return error("deleted file still has contents"); + return error(_("deleted file still has contents")); return offset; } @@ -1639,7 +1653,7 @@ static int parse_single_patch(const char *line, unsigned long size, struct patch fragment->linenr = linenr; len = parse_fragment(line, size, patch, fragment); if (len <= 0) - die("corrupt patch at line %d", linenr); + die(_("corrupt patch at line %d"), linenr); fragment->patch = line; fragment->size = len; oldlines += fragment->oldlines; @@ -1675,12 +1689,14 @@ static int parse_single_patch(const char *line, unsigned long size, struct patch patch->is_delete = 0; if (0 < patch->is_new && oldlines) - die("new file %s depends on old contents", patch->new_name); + die(_("new file %s depends on old contents"), patch->new_name); if (0 < patch->is_delete && newlines) - die("deleted file %s still has contents", patch->old_name); + die(_("deleted file %s still has contents"), patch->old_name); if (!patch->is_delete && !newlines && context) - fprintf(stderr, "** warning: file %s becomes empty but " - "is not deleted\n", patch->new_name); + fprintf_ln(stderr, + _("** warning: " + "file %s becomes empty but is not deleted"), + patch->new_name); return offset; } @@ -1824,7 +1840,7 @@ static struct fragment *parse_binary_hunk(char **buf_p, corrupt: free(data); *status_p = -1; - error("corrupt binary patch at line %d: %.*s", + error(_("corrupt binary patch at line %d: %.*s"), linenr-1, llen-1, buffer); return NULL; } @@ -1853,7 +1869,7 @@ static int parse_binary(char *buffer, unsigned long size, struct patch *patch) forward = parse_binary_hunk(&buffer, &size, &status, &used); if (!forward && !status) /* there has to be one hunk (forward hunk) */ - return error("unrecognized binary patch at line %d", linenr-1); + return error(_("unrecognized binary patch at line %d"), linenr-1); if (status) /* otherwise we already gave an error message */ return status; @@ -1939,7 +1955,7 @@ static int parse_chunk(char *buffer, unsigned long size, struct patch *patch) */ if ((apply || check) && (!patch->is_binary && !metadata_changes(patch))) - die("patch with only garbage at line %d", linenr); + die(_("patch with only garbage at line %d"), linenr); } return offset + hdrsize + patchsize; @@ -2029,11 +2045,11 @@ static int read_old_data(struct stat *st, const char *path, struct strbuf *buf) switch (st->st_mode & S_IFMT) { case S_IFLNK: if (strbuf_readlink(buf, path, st->st_size) < 0) - return error("unable to read symlink %s", path); + 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) - return error("unable to open or read %s", path); + return error(_("unable to open or read %s"), path); convert_to_git(path, buf->buf, buf->len, buf, 0); return 0; default: @@ -2104,7 +2120,7 @@ static void update_pre_post_images(struct image *preimage, ctx++; } if (preimage->nr <= ctx) - die("oops"); + die(_("oops")); /* and copy it in, while fixing the line length */ len = preimage->line[ctx].len; @@ -2626,7 +2642,7 @@ static int apply_one_fragment(struct image *img, struct fragment *frag, break; default: if (apply_verbosely) - error("invalid start of line: '%c'", first); + error(_("invalid start of line: '%c'"), first); return -1; } if (added_blank_line) { @@ -2743,9 +2759,11 @@ static int apply_one_fragment(struct image *img, struct fragment *frag, int offset = applied_pos - pos; if (apply_in_reverse) offset = 0 - offset; - fprintf(stderr, - "Hunk #%d succeeded at %d (offset %d lines).\n", - nth_fragment, applied_pos + 1, offset); + fprintf_ln(stderr, + Q_("Hunk #%d succeeded at %d (offset %d line).", + "Hunk #%d succeeded at %d (offset %d lines).", + offset), + nth_fragment, applied_pos + 1, offset); } /* @@ -2754,13 +2772,13 @@ static int apply_one_fragment(struct image *img, struct fragment *frag, */ if ((leading != frag->leading) || (trailing != frag->trailing)) - fprintf(stderr, "Context reduced to (%ld/%ld)" - " to apply fragment at %d\n", - leading, trailing, applied_pos+1); + fprintf_ln(stderr, _("Context reduced to (%ld/%ld)" + " to apply fragment at %d"), + leading, trailing, applied_pos+1); update_image(img, applied_pos, &preimage, &postimage); } else { if (apply_verbosely) - error("while searching for:\n%.*s", + error(_("while searching for:\n%.*s"), (int)(old - oldlines), oldlines); } @@ -2779,7 +2797,7 @@ static int apply_binary_fragment(struct image *img, struct patch *patch) void *dst; if (!fragment) - return error("missing binary patch data for '%s'", + return error(_("missing binary patch data for '%s'"), patch->new_name ? patch->new_name : patch->old_name); @@ -2882,13 +2900,13 @@ static int apply_binary(struct image *img, struct patch *patch) * in the patch->fragments->{patch,size}. */ if (apply_binary_fragment(img, patch)) - return error("binary patch does not apply to '%s'", + return error(_("binary patch does not apply to '%s'"), name); /* verify that the result matches */ hash_sha1_file(img->buf, img->len, blob_type, sha1); if (strcmp(sha1_to_hex(sha1), patch->new_sha1_prefix)) - return error("binary patch to '%s' creates incorrect result (expecting %s, got %s)", + return error(_("binary patch to '%s' creates incorrect result (expecting %s, got %s)"), name, patch->new_sha1_prefix, sha1_to_hex(sha1)); } @@ -2909,7 +2927,7 @@ static int apply_fragments(struct image *img, struct patch *patch) while (frag) { nth++; if (apply_one_fragment(img, frag, inaccurate_eof, ws_rule, nth)) { - error("patch failed: %s:%ld", name, frag->oldpos); + error(_("patch failed: %s:%ld"), name, frag->oldpos); if (!apply_with_reject) return -1; frag->rejected = 1; @@ -3024,14 +3042,14 @@ static int apply_data(struct patch *patch, struct stat *st, struct cache_entry * if (!(patch->is_copy || patch->is_rename) && (tpatch = in_fn_table(patch->old_name)) != NULL && !to_be_deleted(tpatch)) { if (was_deleted(tpatch)) { - return error("patch %s has been renamed/deleted", + return error(_("patch %s has been renamed/deleted"), patch->old_name); } /* We have a patched copy in memory; use that. */ strbuf_add(&buf, tpatch->result, tpatch->resultsize); } else if (cached) { if (read_file_or_gitlink(ce, &buf)) - return error("read of %s failed", patch->old_name); + return error(_("read of %s failed"), patch->old_name); } else if (patch->old_name) { if (S_ISGITLINK(patch->old_mode)) { if (ce) { @@ -3048,7 +3066,7 @@ static int apply_data(struct patch *patch, struct stat *st, struct cache_entry * } } else { if (read_old_data(st, patch->old_name, &buf)) - return error("read of %s failed", patch->old_name); + return error(_("read of %s failed"), patch->old_name); } } @@ -3063,7 +3081,7 @@ static int apply_data(struct patch *patch, struct stat *st, struct cache_entry * free(image.line_allocated); if (0 < patch->is_delete && patch->resultsize) - return error("removal patch leaves file contents"); + return error(_("removal patch leaves file contents")); return 0; } @@ -3084,7 +3102,7 @@ static int check_to_create_blob(const char *new_name, int ok_if_exists) if (has_symlink_leading_path(new_name, strlen(new_name))) return 0; - return error("%s: already exists in working directory", new_name); + return error(_("%s: already exists in working directory"), new_name); } else if ((errno != ENOENT) && (errno != ENOTDIR)) return error("%s: %s", new_name, strerror(errno)); @@ -3122,12 +3140,12 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s if (!(patch->is_copy || patch->is_rename) && (tpatch = in_fn_table(old_name)) != NULL && !to_be_deleted(tpatch)) { if (was_deleted(tpatch)) - return error("%s: has been deleted/renamed", old_name); + return error(_("%s: has been deleted/renamed"), old_name); st_mode = tpatch->new_mode; } else if (!cached) { stat_ret = lstat(old_name, st); if (stat_ret && errno != ENOENT) - return error("%s: %s", old_name, strerror(errno)); + return error(_("%s: %s"), old_name, strerror(errno)); } if (to_be_deleted(tpatch)) @@ -3138,7 +3156,7 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s if (pos < 0) { if (patch->is_new < 0) goto is_new; - return error("%s: does not exist in index", old_name); + return error(_("%s: does not exist in index"), old_name); } *ce = active_cache[pos]; if (stat_ret < 0) { @@ -3152,13 +3170,13 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s return -1; } if (!cached && verify_index_match(*ce, st)) - return error("%s: does not match index", old_name); + return error(_("%s: does not match index"), old_name); if (cached) st_mode = (*ce)->ce_mode; } else if (stat_ret < 0) { if (patch->is_new < 0) goto is_new; - return error("%s: %s", old_name, strerror(errno)); + return error(_("%s: %s"), old_name, strerror(errno)); } if (!cached && !tpatch) @@ -3169,9 +3187,9 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s if (!patch->old_mode) patch->old_mode = st_mode; if ((st_mode ^ patch->old_mode) & S_IFMT) - return error("%s: wrong type", old_name); + return error(_("%s: wrong type"), old_name); if (st_mode != patch->old_mode) - warning("%s has type %o, expected %o", + warning(_("%s has type %o, expected %o"), old_name, st_mode, patch->old_mode); if (!patch->new_mode && !patch->is_delete) patch->new_mode = st_mode; @@ -3226,7 +3244,7 @@ static int check_patch(struct patch *patch) if (check_index && cache_name_pos(new_name, strlen(new_name)) >= 0 && !ok_if_exists) - return error("%s: already exists in index", new_name); + return error(_("%s: already exists in index"), new_name); if (!cached) { int err = check_to_create_blob(new_name, ok_if_exists); if (err) @@ -3244,14 +3262,22 @@ static int check_patch(struct patch *patch) int same = !strcmp(old_name, new_name); if (!patch->new_mode) patch->new_mode = patch->old_mode; - if ((patch->old_mode ^ patch->new_mode) & S_IFMT) - return error("new mode (%o) of %s does not match old mode (%o)%s%s", - patch->new_mode, new_name, patch->old_mode, - same ? "" : " of ", same ? "" : old_name); + if ((patch->old_mode ^ patch->new_mode) & S_IFMT) { + if (same) + return error(_("new mode (%o) of %s does not " + "match old mode (%o)"), + patch->new_mode, new_name, + patch->old_mode); + else + return error(_("new mode (%o) of %s does not " + "match old mode (%o) of %s"), + patch->new_mode, new_name, + patch->old_mode, old_name); + } } if (apply_data(patch, &st, ce) < 0) - return error("%s: patch does not apply", name); + return error(_("%s: patch does not apply"), name); patch->rejected = 0; return 0; } @@ -3264,7 +3290,7 @@ static int check_patch_list(struct patch *patch) while (patch) { if (apply_verbosely) say_patch_name(stderr, - "Checking patch ", patch, "...\n"); + _("Checking patch %s..."), patch); err |= check_patch(patch); patch = patch->next; } @@ -3319,7 +3345,7 @@ static void build_fake_ancestor(struct patch *list, const char *filename) ce = make_cache_entry(patch->old_mode, sha1_ptr, name, 0, 0); if (!ce) - die("make_cache_entry failed for path '%s'", name); + die(_("make_cache_entry failed for path '%s'"), name); if (add_index_entry(&result, ce, ADD_CACHE_OK_TO_ADD)) die ("Could not add %s to temporary index", name); } @@ -3462,7 +3488,7 @@ static void remove_file(struct patch *patch, int rmdir_empty) { if (update_index) { if (remove_file_from_cache(patch->old_name) < 0) - die("unable to remove %s from index", patch->old_name); + die(_("unable to remove %s from index"), patch->old_name); } if (!cached) { if (!remove_or_warn(patch->old_mode, patch->old_name) && rmdir_empty) { @@ -3489,19 +3515,19 @@ static void add_index_file(const char *path, unsigned mode, void *buf, unsigned const char *s = buf; if (get_sha1_hex(s + strlen("Subproject commit "), ce->sha1)) - die("corrupt patch for subproject %s", path); + die(_("corrupt patch for subproject %s"), path); } else { if (!cached) { if (lstat(path, &st) < 0) - die_errno("unable to stat newly created file '%s'", + die_errno(_("unable to stat newly created file '%s'"), path); fill_stat_cache_info(ce, &st); } if (write_sha1_file(buf, size, blob_type, ce->sha1) < 0) - die("unable to create backing store for newly created file %s", path); + die(_("unable to create backing store for newly created file %s"), path); } if (add_cache_entry(ce, ADD_CACHE_OK_TO_ADD) < 0) - die("unable to add cache entry for %s", path); + die(_("unable to add cache entry for %s"), path); } static int try_create_file(const char *path, unsigned int mode, const char *buf, unsigned long size) @@ -3534,7 +3560,7 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf, strbuf_release(&nbuf); if (close(fd) < 0) - die_errno("closing file '%s'", path); + die_errno(_("closing file '%s'"), path); return 0; } @@ -3583,7 +3609,7 @@ static void create_one_file(char *path, unsigned mode, const char *buf, unsigned ++nr; } } - die_errno("unable to write file '%s' mode %o", path, mode); + die_errno(_("unable to write file '%s' mode %o"), path, mode); } static void create_file(struct patch *patch) @@ -3628,6 +3654,7 @@ static int write_out_one_reject(struct patch *patch) char namebuf[PATH_MAX]; struct fragment *frag; int cnt = 0; + struct strbuf sb = STRBUF_INIT; for (cnt = 0, frag = patch->fragments; frag; frag = frag->next) { if (!frag->rejected) @@ -3638,7 +3665,7 @@ static int write_out_one_reject(struct patch *patch) if (!cnt) { if (apply_verbosely) say_patch_name(stderr, - "Applied patch ", patch, " cleanly.\n"); + _("Applied patch %s cleanly."), patch); return 0; } @@ -3646,16 +3673,20 @@ static int write_out_one_reject(struct patch *patch) * contents are marked "rejected" at the patch level. */ if (!patch->new_name) - die("internal error"); + die(_("internal error")); /* Say this even without --verbose */ - say_patch_name(stderr, "Applying patch ", patch, " with"); - fprintf(stderr, " %d rejects...\n", cnt); + strbuf_addf(&sb, Q_("Applying patch %%s with %d reject...", + "Applying patch %%s with %d rejects...", + cnt), + cnt); + say_patch_name(stderr, sb.buf, patch); + strbuf_release(&sb); cnt = strlen(patch->new_name); if (ARRAY_SIZE(namebuf) <= cnt + 5) { cnt = ARRAY_SIZE(namebuf) - 5; - warning("truncating .rej filename to %.*s.rej", + warning(_("truncating .rej filename to %.*s.rej"), cnt - 1, patch->new_name); } memcpy(namebuf, patch->new_name, cnt); @@ -3663,7 +3694,7 @@ static int write_out_one_reject(struct patch *patch) rej = fopen(namebuf, "w"); if (!rej) - return error("cannot open %s: %s", namebuf, strerror(errno)); + return error(_("cannot open %s: %s"), namebuf, strerror(errno)); /* Normal git tools never deal with .rej, so do not pretend * this is a git patch by saying --git nor give extended @@ -3676,10 +3707,10 @@ static int write_out_one_reject(struct patch *patch) frag; cnt++, frag = frag->next) { if (!frag->rejected) { - fprintf(stderr, "Hunk #%d applied cleanly.\n", cnt); + fprintf_ln(stderr, _("Hunk #%d applied cleanly."), cnt); continue; } - fprintf(stderr, "Rejected hunk #%d.\n", cnt); + fprintf_ln(stderr, _("Rejected hunk #%d."), cnt); fprintf(rej, "%.*s", frag->size, frag->patch); if (frag->patch[frag->size-1] != '\n') fputc('\n', rej); @@ -3810,7 +3841,7 @@ static int apply_patch(int fd, const char *filename, int options) } if (!list && !skipped_patch) - die("unrecognized input"); + die(_("unrecognized input")); if (whitespace_error && (ws_error_action == die_on_ws_error)) apply = 0; @@ -3821,7 +3852,7 @@ static int apply_patch(int fd, const char *filename, int options) if (check_index) { if (read_cache() < 0) - die("unable to read index file"); + die(_("unable to read index file")); } if ((check || apply) && @@ -3936,66 +3967,66 @@ int cmd_apply(int argc, const char **argv, const char *prefix_) const char *whitespace_option = NULL; struct option builtin_apply_options[] = { - { OPTION_CALLBACK, 0, "exclude", NULL, "path", - "don't apply changes matching the given path", + { OPTION_CALLBACK, 0, "exclude", NULL, N_("path"), + N_("don't apply changes matching the given path"), 0, option_parse_exclude }, - { OPTION_CALLBACK, 0, "include", NULL, "path", - "apply changes matching the given path", + { OPTION_CALLBACK, 0, "include", NULL, N_("path"), + N_("apply changes matching the given path"), 0, option_parse_include }, - { OPTION_CALLBACK, 'p', NULL, NULL, "num", - "remove <num> leading slashes from traditional diff paths", + { OPTION_CALLBACK, 'p', NULL, NULL, N_("num"), + N_("remove <num> leading slashes from traditional diff paths"), 0, option_parse_p }, OPT_BOOLEAN(0, "no-add", &no_add, - "ignore additions made by the patch"), + N_("ignore additions made by the patch")), OPT_BOOLEAN(0, "stat", &diffstat, - "instead of applying the patch, output diffstat for the input"), + N_("instead of applying the patch, output diffstat for the input")), OPT_NOOP_NOARG(0, "allow-binary-replacement"), OPT_NOOP_NOARG(0, "binary"), OPT_BOOLEAN(0, "numstat", &numstat, - "shows number of added and deleted lines in decimal notation"), + N_("shows number of added and deleted lines in decimal notation")), OPT_BOOLEAN(0, "summary", &summary, - "instead of applying the patch, output a summary for the input"), + N_("instead of applying the patch, output a summary for the input")), OPT_BOOLEAN(0, "check", &check, - "instead of applying the patch, see if the patch is applicable"), + N_("instead of applying the patch, see if the patch is applicable")), OPT_BOOLEAN(0, "index", &check_index, - "make sure the patch is applicable to the current index"), + N_("make sure the patch is applicable to the current index")), OPT_BOOLEAN(0, "cached", &cached, - "apply a patch without touching the working tree"), + N_("apply a patch without touching the working tree")), OPT_BOOLEAN(0, "apply", &force_apply, - "also apply the patch (use with --stat/--summary/--check)"), + N_("also apply the patch (use with --stat/--summary/--check)")), OPT_FILENAME(0, "build-fake-ancestor", &fake_ancestor, - "build a temporary index based on embedded index information"), + N_("build a temporary index based on embedded index information")), { OPTION_CALLBACK, 'z', NULL, NULL, NULL, - "paths are separated with NUL character", + N_("paths are separated with NUL character"), PARSE_OPT_NOARG, option_parse_z }, OPT_INTEGER('C', NULL, &p_context, - "ensure at least <n> lines of context match"), - { OPTION_CALLBACK, 0, "whitespace", &whitespace_option, "action", - "detect new or modified lines that have whitespace errors", + N_("ensure at least <n> lines of context match")), + { OPTION_CALLBACK, 0, "whitespace", &whitespace_option, N_("action"), + N_("detect new or modified lines that have whitespace errors"), 0, option_parse_whitespace }, { OPTION_CALLBACK, 0, "ignore-space-change", NULL, NULL, - "ignore changes in whitespace when finding context", + N_("ignore changes in whitespace when finding context"), PARSE_OPT_NOARG, option_parse_space_change }, { OPTION_CALLBACK, 0, "ignore-whitespace", NULL, NULL, - "ignore changes in whitespace when finding context", + N_("ignore changes in whitespace when finding context"), PARSE_OPT_NOARG, option_parse_space_change }, OPT_BOOLEAN('R', "reverse", &apply_in_reverse, - "apply the patch in reverse"), + N_("apply the patch in reverse")), OPT_BOOLEAN(0, "unidiff-zero", &unidiff_zero, - "don't expect at least one line of context"), + N_("don't expect at least one line of context")), OPT_BOOLEAN(0, "reject", &apply_with_reject, - "leave the rejected hunks in corresponding *.rej files"), + N_("leave the rejected hunks in corresponding *.rej files")), OPT_BOOLEAN(0, "allow-overlap", &allow_overlap, - "allow overlapping hunks"), - OPT__VERBOSE(&apply_verbosely, "be verbose"), + N_("allow overlapping hunks")), + OPT__VERBOSE(&apply_verbosely, N_("be verbose")), OPT_BIT(0, "inaccurate-eof", &options, - "tolerate incorrectly detected missing new-line at the end of file", + N_("tolerate incorrectly detected missing new-line at the end of file"), INACCURATE_EOF), OPT_BIT(0, "recount", &options, - "do not trust the line counts in the hunk headers", + N_("do not trust the line counts in the hunk headers"), RECOUNT), - { OPTION_CALLBACK, 0, "directory", NULL, "root", - "prepend <root> to all filenames", + { OPTION_CALLBACK, 0, "directory", NULL, N_("root"), + N_("prepend <root> to all filenames"), 0, option_parse_directory }, OPT_END() }; @@ -4016,10 +4047,10 @@ int cmd_apply(int argc, const char **argv, const char *prefix_) if (!force_apply && (diffstat || numstat || summary || check || fake_ancestor)) apply = 0; if (check_index && is_not_gitdir) - die("--index outside a repository"); + die(_("--index outside a repository")); if (cached) { if (is_not_gitdir) - die("--cached outside a repository"); + die(_("--cached outside a repository")); check_index = 1; } for (i = 0; i < argc; i++) { @@ -4035,7 +4066,7 @@ int cmd_apply(int argc, const char **argv, const char *prefix_) fd = open(arg, O_RDONLY); if (fd < 0) - die_errno("can't open patch '%s'", arg); + die_errno(_("can't open patch '%s'"), arg); read_stdin = 0; set_default_whitespace_mode(whitespace_option); errs |= apply_patch(fd, arg, options); @@ -4049,32 +4080,32 @@ int cmd_apply(int argc, const char **argv, const char *prefix_) squelch_whitespace_errors < whitespace_error) { int squelched = whitespace_error - squelch_whitespace_errors; - warning("squelched %d " - "whitespace error%s", - squelched, - squelched == 1 ? "" : "s"); + warning(Q_("squelched %d whitespace error", + "squelched %d whitespace errors", + squelched), + squelched); } if (ws_error_action == die_on_ws_error) - die("%d line%s add%s whitespace errors.", - whitespace_error, - whitespace_error == 1 ? "" : "s", - whitespace_error == 1 ? "s" : ""); + die(Q_("%d line adds whitespace errors.", + "%d lines add whitespace errors.", + whitespace_error), + whitespace_error); if (applied_after_fixing_ws && apply) warning("%d line%s applied after" " fixing whitespace errors.", applied_after_fixing_ws, applied_after_fixing_ws == 1 ? "" : "s"); else if (whitespace_error) - warning("%d line%s add%s whitespace errors.", - whitespace_error, - whitespace_error == 1 ? "" : "s", - whitespace_error == 1 ? "s" : ""); + warning(Q_("%d line adds whitespace errors.", + "%d lines add whitespace errors.", + whitespace_error), + whitespace_error); } if (update_index) { if (write_cache(newfd, active_cache, active_nr) || commit_locked_index(&lock_file)) - die("Unable to write new index file"); + die(_("Unable to write new index file")); } return !!errs; diff --git a/builtin/blame.c b/builtin/blame.c index 324d476abf..24d3dd5292 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -88,6 +88,20 @@ struct origin { char path[FLEX_ARRAY]; }; +static int diff_hunks(mmfile_t *file_a, mmfile_t *file_b, long ctxlen, + xdl_emit_hunk_consume_func_t hunk_func, void *cb_data) +{ + xpparam_t xpp = {0}; + xdemitconf_t xecfg = {0}; + xdemitcb_t ecb = {NULL}; + + xpp.flags = xdl_opts; + xecfg.ctxlen = ctxlen; + xecfg.hunk_func = hunk_func; + ecb.priv = cb_data; + return xdi_diff(file_a, file_b, &xpp, &xecfg, &ecb); +} + /* * Prepare diff_filespec and convert it using diff textconv API * if the textconv driver exists. @@ -759,12 +773,14 @@ struct blame_chunk_cb_data { long tlno; }; -static void blame_chunk_cb(void *data, long same, long p_next, long t_next) +static int blame_chunk_cb(long start_a, long count_a, + long start_b, long count_b, void *data) { struct blame_chunk_cb_data *d = data; - blame_chunk(d->sb, d->tlno, d->plno, same, d->target, d->parent); - d->plno = p_next; - d->tlno = t_next; + blame_chunk(d->sb, d->tlno, d->plno, start_b, d->target, d->parent); + d->plno = start_a + count_a; + d->tlno = start_b + count_b; + return 0; } /* @@ -779,8 +795,7 @@ static int pass_blame_to_parent(struct scoreboard *sb, int last_in_target; mmfile_t file_p, file_o; struct blame_chunk_cb_data d; - xpparam_t xpp; - xdemitconf_t xecfg; + memset(&d, 0, sizeof(d)); d.sb = sb; d.target = target; d.parent = parent; last_in_target = find_last_in_target(sb, target); @@ -791,11 +806,7 @@ static int pass_blame_to_parent(struct scoreboard *sb, fill_origin_blob(&sb->revs->diffopt, target, &file_o); num_get_patch++; - memset(&xpp, 0, sizeof(xpp)); - xpp.flags = xdl_opts; - memset(&xecfg, 0, sizeof(xecfg)); - xecfg.ctxlen = 0; - xdi_diff_hunks(&file_p, &file_o, blame_chunk_cb, &d, &xpp, &xecfg); + diff_hunks(&file_p, &file_o, 0, blame_chunk_cb, &d); /* The rest (i.e. anything after tlno) are the same as the parent */ blame_chunk(sb, d.tlno, d.plno, last_in_target, target, parent); @@ -899,12 +910,15 @@ struct handle_split_cb_data { long tlno; }; -static void handle_split_cb(void *data, long same, long p_next, long t_next) +static int handle_split_cb(long start_a, long count_a, + long start_b, long count_b, void *data) { struct handle_split_cb_data *d = data; - handle_split(d->sb, d->ent, d->tlno, d->plno, same, d->parent, d->split); - d->plno = p_next; - d->tlno = t_next; + handle_split(d->sb, d->ent, d->tlno, d->plno, start_b, d->parent, + d->split); + d->plno = start_a + count_a; + d->tlno = start_b + count_b; + return 0; } /* @@ -922,8 +936,7 @@ static void find_copy_in_blob(struct scoreboard *sb, int cnt; mmfile_t file_o; struct handle_split_cb_data d; - xpparam_t xpp; - xdemitconf_t xecfg; + memset(&d, 0, sizeof(d)); d.sb = sb; d.ent = ent; d.parent = parent; d.split = split; /* @@ -943,12 +956,8 @@ static void find_copy_in_blob(struct scoreboard *sb, * file_o is a part of final image we are annotating. * file_p partially may match that image. */ - memset(&xpp, 0, sizeof(xpp)); - xpp.flags = xdl_opts; - memset(&xecfg, 0, sizeof(xecfg)); - xecfg.ctxlen = 1; memset(split, 0, sizeof(struct blame_entry [3])); - xdi_diff_hunks(file_p, &file_o, handle_split_cb, &d, &xpp, &xecfg); + diff_hunks(file_p, &file_o, 1, handle_split_cb, &d); /* remainder, if any, all match the preimage */ handle_split(sb, ent, d.tlno, d.plno, ent->num_lines, parent, split); } diff --git a/builtin/branch.c b/builtin/branch.c index 5f150b4e8a..0e060f2e4a 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -15,6 +15,8 @@ #include "branch.h" #include "diff.h" #include "revision.h" +#include "string-list.h" +#include "column.h" static const char * const builtin_branch_usage[] = { "git branch [options] [-r | -a] [--merged | --no-merged]", @@ -53,6 +55,9 @@ static enum merge_filter { } merge_filter; static unsigned char merge_filter_ref[20]; +static struct string_list output = STRING_LIST_INIT_DUP; +static unsigned int colopts; + static int parse_branch_color_slot(const char *var, int ofs) { if (!strcasecmp(var+ofs, "plain")) @@ -70,6 +75,8 @@ static int parse_branch_color_slot(const char *var, int ofs) static int git_branch_config(const char *var, const char *value, void *cb) { + if (!prefixcmp(var, "column.")) + return git_column_config(var, value, "branch", &colopts); if (!strcmp(var, "color.branch")) { branch_use_color = git_config_colorbool(var, value); return 0; @@ -152,21 +159,22 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, struct commit *rev, *head_rev = NULL; unsigned char sha1[20]; char *name = NULL; - const char *fmt, *remote; + const char *fmt; int i; int ret = 0; + int remote_branch = 0; struct strbuf bname = STRBUF_INIT; switch (kinds) { case REF_REMOTE_BRANCH: fmt = "refs/remotes/%s"; - /* TRANSLATORS: This is "remote " in "remote branch '%s' not found" */ - remote = _("remote "); + /* For subsequent UI messages */ + remote_branch = 1; + force = 1; break; case REF_LOCAL_BRANCH: fmt = "refs/heads/%s"; - remote = ""; break; default: die(_("cannot use -a with -d")); @@ -190,8 +198,9 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, name = xstrdup(mkpath(fmt, bname.buf)); if (read_ref(name, sha1)) { - error(_("%sbranch '%s' not found."), - remote, bname.buf); + error(remote_branch + ? _("remote branch '%s' not found.") + : _("branch '%s' not found."), bname.buf); ret = 1; continue; } @@ -212,14 +221,18 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, } if (delete_ref(name, sha1, 0)) { - error(_("Error deleting %sbranch '%s'"), remote, + error(remote_branch + ? _("Error deleting remote branch '%s'") + : _("Error deleting branch '%s'"), bname.buf); ret = 1; } else { struct strbuf buf = STRBUF_INIT; if (!quiet) - printf(_("Deleted %sbranch %s (was %s).\n"), - remote, bname.buf, + printf(remote_branch + ? _("Deleted remote branch %s (was %s).\n") + : _("Deleted branch %s (was %s).\n"), + bname.buf, find_unique_abbrev(sha1, DEFAULT_ABBREV)); strbuf_addf(&buf, "branch.%s", bname.buf); if (git_config_rename_section(buf.buf, NULL) < 0) @@ -378,6 +391,7 @@ static void fill_tracking_info(struct strbuf *stat, const char *branch_name, int show_upstream_ref) { int ours, theirs; + char *ref = NULL; struct branch *branch = branch_get(branch_name); if (!stat_tracking_info(branch, &ours, &theirs)) { @@ -388,16 +402,29 @@ static void fill_tracking_info(struct strbuf *stat, const char *branch_name, return; } - strbuf_addch(stat, '['); if (show_upstream_ref) - strbuf_addf(stat, "%s: ", - shorten_unambiguous_ref(branch->merge[0]->dst, 0)); - if (!ours) - strbuf_addf(stat, _("behind %d] "), theirs); - else if (!theirs) - strbuf_addf(stat, _("ahead %d] "), ours); - else - strbuf_addf(stat, _("ahead %d, behind %d] "), ours, theirs); + ref = shorten_unambiguous_ref(branch->merge[0]->dst, 0); + if (!ours) { + if (ref) + strbuf_addf(stat, _("[%s: behind %d]"), ref, theirs); + else + strbuf_addf(stat, _("[behind %d]"), theirs); + + } else if (!theirs) { + if (ref) + strbuf_addf(stat, _("[%s: ahead %d]"), ref, ours); + else + strbuf_addf(stat, _("[ahead %d]"), ours); + } else { + if (ref) + strbuf_addf(stat, _("[%s: ahead %d, behind %d]"), + ref, ours, theirs); + else + strbuf_addf(stat, _("[ahead %d, behind %d]"), + ours, theirs); + } + strbuf_addch(stat, ' '); + free(ref); } static int matches_merge_filter(struct commit *commit) @@ -476,7 +503,12 @@ static void print_ref_item(struct ref_item *item, int maxwidth, int verbose, else if (verbose) /* " f7c0c00 [ahead 58, behind 197] vcs-svn: drop obj_pool.h" */ add_verbose_info(&out, item, verbose, abbrev); - printf("%s\n", out.buf); + if (column_active(colopts)) { + assert(!verbose && "--column and --verbose are incompatible"); + string_list_append(&output, out.buf); + } else { + printf("%s\n", out.buf); + } strbuf_release(&name); strbuf_release(&out); } @@ -657,7 +689,7 @@ static int edit_branch_description(const char *branch_name) fp = fopen(git_path(edit_description), "w"); if ((fwrite(buf.buf, 1, buf.len, fp) < buf.len) || fclose(fp)) { strbuf_release(&buf); - return error(_("could not write branch description template: %s\n"), + return error(_("could not write branch description template: %s"), strerror(errno)); } strbuf_reset(&buf); @@ -735,6 +767,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix) PARSE_OPT_LASTARG_DEFAULT | PARSE_OPT_NONEG, opt_parse_merge_filter, (intptr_t) "HEAD", }, + OPT_COLUMN(0, "column", &colopts, "list branches in columns"), OPT_END(), }; @@ -757,6 +790,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix) } hashcpy(merge_filter_ref, head_sha1); + argc = parse_options(argc, argv, prefix, options, builtin_branch_usage, 0); @@ -768,12 +802,22 @@ int cmd_branch(int argc, const char **argv, const char *prefix) if (abbrev == -1) abbrev = DEFAULT_ABBREV; + finalize_colopts(&colopts, -1); + if (verbose) { + if (explicitly_enable_column(colopts)) + die(_("--column and --verbose are incompatible")); + colopts = 0; + } if (delete) return delete_branches(argc, argv, delete > 1, kinds, quiet); - else if (list) - return print_ref_list(kinds, detached, verbose, abbrev, - with_commit, argv); + else if (list) { + int ret = print_ref_list(kinds, detached, verbose, abbrev, + with_commit, argv); + print_columns(&output, colopts, NULL); + string_list_clear(&output, 0); + return ret; + } else if (edit_description) { const char *branch_name; struct strbuf branch_ref = STRBUF_INIT; diff --git a/builtin/checkout.c b/builtin/checkout.c index 23fc56d88d..e8c1b1f189 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -343,7 +343,7 @@ static int reset_tree(struct tree *tree, struct checkout_opts *o, int worktree) opts.reset = 1; opts.merge = 1; opts.fn = oneway_merge; - opts.verbose_update = !o->quiet; + opts.verbose_update = !o->quiet && isatty(2); opts.src_index = &the_index; opts.dst_index = &the_index; parse_tree(tree); @@ -420,7 +420,7 @@ static int merge_working_tree(struct checkout_opts *opts, topts.update = 1; topts.merge = 1; topts.gently = opts->merge && old->commit; - topts.verbose_update = !opts->quiet; + topts.verbose_update = !opts->quiet && isatty(2); topts.fn = twoway_merge; if (opts->overwrite_ignore) { topts.dir = xcalloc(1, sizeof(*topts.dir)); @@ -672,10 +672,10 @@ static void suggest_reattach(struct commit *commit, struct rev_info *revs) * HEAD. If it is not reachable from any ref, this is the last chance * for the user to do so without resorting to reflog. */ -static void orphaned_commit_warning(struct commit *commit) +static void orphaned_commit_warning(struct commit *old, struct commit *new) { struct rev_info revs; - struct object *object = &commit->object; + struct object *object = &old->object; struct object_array refs; init_revisions(&revs, NULL); @@ -685,16 +685,17 @@ static void orphaned_commit_warning(struct commit *commit) add_pending_object(&revs, object, sha1_to_hex(object->sha1)); for_each_ref(add_pending_uninteresting_ref, &revs); + add_pending_sha1(&revs, "HEAD", new->object.sha1, UNINTERESTING); refs = revs.pending; revs.leak_pending = 1; if (prepare_revision_walk(&revs)) die(_("internal error in revision walk")); - if (!(commit->object.flags & UNINTERESTING)) - suggest_reattach(commit, &revs); + if (!(old->object.flags & UNINTERESTING)) + suggest_reattach(old, &revs); else - describe_detached_head(_("Previous HEAD position was"), commit); + describe_detached_head(_("Previous HEAD position was"), old); clear_commit_marks_for_object_array(&refs, ALL_REV_FLAGS); free(refs.objects); @@ -731,7 +732,7 @@ static int switch_branches(struct checkout_opts *opts, struct branch_info *new) } if (!opts->quiet && !old.path && old.commit && new->commit != old.commit) - orphaned_commit_warning(old.commit); + orphaned_commit_warning(old.commit, new->commit); update_refs_for_switch(opts, &old, new); @@ -1091,7 +1092,7 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) if (opts.writeout_stage) die(_("--ours/--theirs is incompatible with switching branches.")); - if (!new.commit) { + if (!new.commit && opts.new_branch) { unsigned char rev[20]; int flag; diff --git a/builtin/clone.c b/builtin/clone.c index bbd5c96237..a4d8d25ee3 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -569,7 +569,7 @@ static int checkout(void) opts.update = 1; opts.merge = 1; opts.fn = oneway_merge; - opts.verbose_update = (option_verbosity > 0); + opts.verbose_update = (option_verbosity >= 0); opts.src_index = &the_index; opts.dst_index = &the_index; diff --git a/builtin/column.c b/builtin/column.c new file mode 100644 index 0000000000..5ea798a7ca --- /dev/null +++ b/builtin/column.c @@ -0,0 +1,59 @@ +#include "builtin.h" +#include "cache.h" +#include "strbuf.h" +#include "parse-options.h" +#include "string-list.h" +#include "column.h" + +static const char * const builtin_column_usage[] = { + "git column [options]", + NULL +}; +static unsigned int colopts; + +static int column_config(const char *var, const char *value, void *cb) +{ + return git_column_config(var, value, cb, &colopts); +} + +int cmd_column(int argc, const char **argv, const char *prefix) +{ + struct string_list list = STRING_LIST_INIT_DUP; + struct strbuf sb = STRBUF_INIT; + struct column_options copts; + const char *command = NULL, *real_command = NULL; + struct option options[] = { + OPT_STRING(0, "command", &real_command, "name", "lookup config vars"), + OPT_COLUMN(0, "mode", &colopts, "layout to use"), + OPT_INTEGER(0, "raw-mode", &colopts, "layout to use"), + OPT_INTEGER(0, "width", &copts.width, "Maximum width"), + OPT_STRING(0, "indent", &copts.indent, "string", "Padding space on left border"), + OPT_INTEGER(0, "nl", &copts.nl, "Padding space on right border"), + OPT_INTEGER(0, "padding", &copts.padding, "Padding space between columns"), + OPT_END() + }; + + /* This one is special and must be the first one */ + if (argc > 1 && !prefixcmp(argv[1], "--command=")) { + command = argv[1] + 10; + git_config(column_config, (void *)command); + } else + git_config(column_config, NULL); + + memset(&copts, 0, sizeof(copts)); + copts.width = term_columns(); + copts.padding = 1; + argc = parse_options(argc, argv, "", options, builtin_column_usage, 0); + if (argc) + usage_with_options(builtin_column_usage, options); + if (real_command || command) { + if (!real_command || !command || strcmp(real_command, command)) + die(_("--command must be the first argument")); + } + finalize_colopts(&colopts, -1); + while (!strbuf_getline(&sb, stdin, '\n')) + string_list_append(&list, sb.buf); + + print_columns(&list, colopts, &copts); + return 0; +} diff --git a/builtin/commit.c b/builtin/commit.c index b257ae8774..f43eaafb3b 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -27,6 +27,7 @@ #include "quote.h" #include "submodule.h" #include "gpg-interface.h" +#include "column.h" static const char * const builtin_commit_usage[] = { "git commit [options] [--] <filepattern>...", @@ -109,13 +110,11 @@ static int show_ignored_in_status; static const char *only_include_assumed; static struct strbuf message = STRBUF_INIT; -static int null_termination; static enum { STATUS_FORMAT_LONG, STATUS_FORMAT_SHORT, STATUS_FORMAT_PORCELAIN } status_format = STATUS_FORMAT_LONG; -static int status_show_branch; static int opt_parse_m(const struct option *opt, const char *arg, int unset) { @@ -129,59 +128,6 @@ static int opt_parse_m(const struct option *opt, const char *arg, int unset) return 0; } -static struct option builtin_commit_options[] = { - OPT__QUIET(&quiet, "suppress summary after successful commit"), - OPT__VERBOSE(&verbose, "show diff in commit message template"), - - OPT_GROUP("Commit message options"), - OPT_FILENAME('F', "file", &logfile, "read message from file"), - OPT_STRING(0, "author", &force_author, "author", "override author for commit"), - OPT_STRING(0, "date", &force_date, "date", "override date for commit"), - OPT_CALLBACK('m', "message", &message, "message", "commit message", opt_parse_m), - OPT_STRING('c', "reedit-message", &edit_message, "commit", "reuse and edit message from specified commit"), - OPT_STRING('C', "reuse-message", &use_message, "commit", "reuse message from specified commit"), - OPT_STRING(0, "fixup", &fixup_message, "commit", "use autosquash formatted message to fixup specified commit"), - OPT_STRING(0, "squash", &squash_message, "commit", "use autosquash formatted message to squash specified commit"), - OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C/-c/--amend)"), - OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"), - OPT_FILENAME('t', "template", &template_file, "use specified template file"), - OPT_BOOL('e', "edit", &edit_flag, "force edit of commit"), - OPT_STRING(0, "cleanup", &cleanup_arg, "default", "how to strip spaces and #comments from message"), - OPT_BOOLEAN(0, "status", &include_status, "include status in commit message template"), - { OPTION_STRING, 'S', "gpg-sign", &sign_commit, "key id", - "GPG sign commit", PARSE_OPT_OPTARG, NULL, (intptr_t) "" }, - /* end commit message options */ - - OPT_GROUP("Commit contents options"), - OPT_BOOLEAN('a', "all", &all, "commit all changed files"), - OPT_BOOLEAN('i', "include", &also, "add specified files to index for commit"), - OPT_BOOLEAN(0, "interactive", &interactive, "interactively add files"), - OPT_BOOLEAN('p', "patch", &patch_interactive, "interactively add changes"), - OPT_BOOLEAN('o', "only", &only, "commit only specified files"), - OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"), - OPT_BOOLEAN(0, "dry-run", &dry_run, "show what would be committed"), - OPT_SET_INT(0, "short", &status_format, "show status concisely", - STATUS_FORMAT_SHORT), - OPT_BOOLEAN(0, "branch", &status_show_branch, "show branch information"), - OPT_SET_INT(0, "porcelain", &status_format, - "machine-readable output", STATUS_FORMAT_PORCELAIN), - OPT_BOOLEAN('z', "null", &null_termination, - "terminate entries with NUL"), - OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"), - OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, "bypass post-rewrite hook"), - { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" }, - /* end commit contents options */ - - { OPTION_BOOLEAN, 0, "allow-empty", &allow_empty, NULL, - "ok to record an empty change", - PARSE_OPT_NOARG | PARSE_OPT_HIDDEN }, - { OPTION_BOOLEAN, 0, "allow-empty-message", &allow_empty_message, NULL, - "ok to record a change with an empty message", - PARSE_OPT_NOARG | PARSE_OPT_HIDDEN }, - - OPT_END() -}; - static void determine_whence(struct wt_status *s) { if (file_exists(git_path("MERGE_HEAD"))) @@ -194,24 +140,6 @@ static void determine_whence(struct wt_status *s) s->whence = whence; } -static const char *whence_s(void) -{ - const char *s = ""; - - switch (whence) { - case FROM_COMMIT: - break; - case FROM_MERGE: - s = _("merge"); - break; - case FROM_CHERRY_PICK: - s = _("cherry-pick"); - break; - } - - return s; -} - static void rollback_index_files(void) { switch (commit_style) { @@ -453,8 +381,12 @@ static char *prepare_index(int argc, const char **argv, const char *prefix, */ commit_style = COMMIT_PARTIAL; - if (whence != FROM_COMMIT) - die(_("cannot do a partial commit during a %s."), whence_s()); + if (whence != FROM_COMMIT) { + if (whence == FROM_MERGE) + die(_("cannot do a partial commit during a merge.")); + else if (whence == FROM_CHERRY_PICK) + die(_("cannot do a partial commit during a cherry-pick.")); + } memset(&partial, 0, sizeof(partial)); partial.strdup_strings = 1; @@ -513,10 +445,10 @@ static int run_status(FILE *fp, const char *index_file, const char *prefix, int switch (status_format) { case STATUS_FORMAT_SHORT: - wt_shortstatus_print(s, null_termination, status_show_branch); + wt_shortstatus_print(s); break; case STATUS_FORMAT_PORCELAIN: - wt_porcelain_print(s, null_termination); + wt_porcelain_print(s); break; case STATUS_FORMAT_LONG: wt_status_print(s); @@ -594,8 +526,7 @@ static void determine_author_info(struct strbuf *author_ident) if (force_date) date = force_date; - strbuf_addstr(author_ident, fmt_ident(name, email, date, - IDENT_ERROR_ON_NO_NAME)); + strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_STRICT)); if (!split_ident_line(&author, author_ident->buf, author_ident->len)) { export_one("GIT_AUTHOR_NAME", author.name_begin, author.name_end, 0); export_one("GIT_AUTHOR_EMAIL", author.mail_begin, author.mail_end, 0); @@ -796,28 +727,31 @@ static int prepare_to_commit(const char *index_file, const char *prefix, char *ai_tmp, *ci_tmp; if (whence != FROM_COMMIT) status_printf_ln(s, GIT_COLOR_NORMAL, - _("\n" - "It looks like you may be committing a %s.\n" - "If this is not correct, please remove the file\n" - " %s\n" - "and try again.\n" - ""), - whence_s(), + whence == FROM_MERGE + ? _("\n" + "It looks like you may be committing a merge.\n" + "If this is not correct, please remove the file\n" + " %s\n" + "and try again.\n") + : _("\n" + "It looks like you may be committing a cherry-pick.\n" + "If this is not correct, please remove the file\n" + " %s\n" + "and try again.\n"), git_path(whence == FROM_MERGE ? "MERGE_HEAD" : "CHERRY_PICK_HEAD")); fprintf(s->fp, "\n"); - status_printf(s, GIT_COLOR_NORMAL, - _("Please enter the commit message for your changes.")); if (cleanup_mode == CLEANUP_ALL) - status_printf_more(s, GIT_COLOR_NORMAL, - _(" Lines starting\n" - "with '#' will be ignored, and an empty" + status_printf(s, GIT_COLOR_NORMAL, + _("Please enter the commit message for your changes." + " Lines starting\nwith '#' will be ignored, and an empty" " message aborts the commit.\n")); else /* CLEANUP_SPACE, that is. */ - status_printf_more(s, GIT_COLOR_NORMAL, - _(" Lines starting\n" + status_printf(s, GIT_COLOR_NORMAL, + _("Please enter the commit message for your changes." + " Lines starting\n" "with '#' will be kept; you may remove them" " yourself if you want to.\n" "An empty message aborts the commit.\n")); @@ -1046,6 +980,7 @@ static const char *read_commit_message(const char *name) } static int parse_and_validate_options(int argc, const char *argv[], + const struct option *options, const char * const usage[], const char *prefix, struct commit *current_head, @@ -1053,8 +988,7 @@ static int parse_and_validate_options(int argc, const char *argv[], { int f = 0; - argc = parse_options(argc, argv, prefix, builtin_commit_options, usage, - 0); + argc = parse_options(argc, argv, prefix, options, usage, 0); if (force_author && !strchr(force_author, '>')) force_author = find_author_by_nickname(force_author); @@ -1072,8 +1006,12 @@ static int parse_and_validate_options(int argc, const char *argv[], /* Sanity check options */ if (amend && !current_head) die(_("You have nothing to amend.")); - if (amend && whence != FROM_COMMIT) - die(_("You are in the middle of a %s -- cannot amend."), whence_s()); + if (amend && whence != FROM_COMMIT) { + if (whence == FROM_MERGE) + die(_("You are in the middle of a merge -- cannot amend.")); + else if (whence == FROM_CHERRY_PICK) + die(_("You are in the middle of a cherry-pick -- cannot amend.")); + } if (fixup_message && squash_message) die(_("Options --squash and --fixup cannot be used together")); if (use_message) @@ -1135,7 +1073,7 @@ static int parse_and_validate_options(int argc, const char *argv[], if (all && argc > 0) die(_("Paths with -a does not make sense.")); - if (null_termination && status_format == STATUS_FORMAT_LONG) + if (s->null_termination && status_format == STATUS_FORMAT_LONG) status_format = STATUS_FORMAT_PORCELAIN; if (status_format != STATUS_FORMAT_LONG) dry_run = 1; @@ -1180,6 +1118,8 @@ static int git_status_config(const char *k, const char *v, void *cb) { struct wt_status *s = cb; + if (!prefixcmp(k, "column.")) + return git_column_config(k, v, "status", &s->colopts); if (!strcmp(k, "status.submodulesummary")) { int is_bool; s->submodule_summary = git_config_bool_or_int(k, v, &is_bool); @@ -1222,19 +1162,19 @@ static int git_status_config(const char *k, const char *v, void *cb) int cmd_status(int argc, const char **argv, const char *prefix) { - struct wt_status s; + static struct wt_status s; int fd; unsigned char sha1[20]; static struct option builtin_status_options[] = { OPT__VERBOSE(&verbose, "be verbose"), OPT_SET_INT('s', "short", &status_format, "show status concisely", STATUS_FORMAT_SHORT), - OPT_BOOLEAN('b', "branch", &status_show_branch, + OPT_BOOLEAN('b', "branch", &s.show_branch, "show branch information"), OPT_SET_INT(0, "porcelain", &status_format, "machine-readable output", STATUS_FORMAT_PORCELAIN), - OPT_BOOLEAN('z', "null", &null_termination, + OPT_BOOLEAN('z', "null", &s.null_termination, "terminate entries with NUL"), { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", @@ -1245,6 +1185,7 @@ int cmd_status(int argc, const char **argv, const char *prefix) { OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, "when", "ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" }, + OPT_COLUMN(0, "column", &s.colopts, "list untracked files in columns"), OPT_END(), }; @@ -1258,8 +1199,9 @@ int cmd_status(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, prefix, builtin_status_options, builtin_status_usage, 0); + finalize_colopts(&s.colopts, -1); - if (null_termination && status_format == STATUS_FORMAT_LONG) + if (s.null_termination && status_format == STATUS_FORMAT_LONG) status_format = STATUS_FORMAT_PORCELAIN; handle_untracked_files_arg(&s); @@ -1284,10 +1226,10 @@ int cmd_status(int argc, const char **argv, const char *prefix) switch (status_format) { case STATUS_FORMAT_SHORT: - wt_shortstatus_print(&s, null_termination, status_show_branch); + wt_shortstatus_print(&s); break; case STATUS_FORMAT_PORCELAIN: - wt_porcelain_print(&s, null_termination); + wt_porcelain_print(&s); break; case STATUS_FORMAT_LONG: s.verbose = verbose; @@ -1422,6 +1364,60 @@ static int run_rewrite_hook(const unsigned char *oldsha1, int cmd_commit(int argc, const char **argv, const char *prefix) { + static struct wt_status s; + static struct option builtin_commit_options[] = { + OPT__QUIET(&quiet, "suppress summary after successful commit"), + OPT__VERBOSE(&verbose, "show diff in commit message template"), + + OPT_GROUP("Commit message options"), + OPT_FILENAME('F', "file", &logfile, "read message from file"), + OPT_STRING(0, "author", &force_author, "author", "override author for commit"), + OPT_STRING(0, "date", &force_date, "date", "override date for commit"), + OPT_CALLBACK('m', "message", &message, "message", "commit message", opt_parse_m), + OPT_STRING('c', "reedit-message", &edit_message, "commit", "reuse and edit message from specified commit"), + OPT_STRING('C', "reuse-message", &use_message, "commit", "reuse message from specified commit"), + OPT_STRING(0, "fixup", &fixup_message, "commit", "use autosquash formatted message to fixup specified commit"), + OPT_STRING(0, "squash", &squash_message, "commit", "use autosquash formatted message to squash specified commit"), + OPT_BOOLEAN(0, "reset-author", &renew_authorship, "the commit is authored by me now (used with -C/-c/--amend)"), + OPT_BOOLEAN('s', "signoff", &signoff, "add Signed-off-by:"), + OPT_FILENAME('t', "template", &template_file, "use specified template file"), + OPT_BOOL('e', "edit", &edit_flag, "force edit of commit"), + OPT_STRING(0, "cleanup", &cleanup_arg, "default", "how to strip spaces and #comments from message"), + OPT_BOOLEAN(0, "status", &include_status, "include status in commit message template"), + { OPTION_STRING, 'S', "gpg-sign", &sign_commit, "key id", + "GPG sign commit", PARSE_OPT_OPTARG, NULL, (intptr_t) "" }, + /* end commit message options */ + + OPT_GROUP("Commit contents options"), + OPT_BOOLEAN('a', "all", &all, "commit all changed files"), + OPT_BOOLEAN('i', "include", &also, "add specified files to index for commit"), + OPT_BOOLEAN(0, "interactive", &interactive, "interactively add files"), + OPT_BOOLEAN('p', "patch", &patch_interactive, "interactively add changes"), + OPT_BOOLEAN('o', "only", &only, "commit only specified files"), + OPT_BOOLEAN('n', "no-verify", &no_verify, "bypass pre-commit hook"), + OPT_BOOLEAN(0, "dry-run", &dry_run, "show what would be committed"), + OPT_SET_INT(0, "short", &status_format, "show status concisely", + STATUS_FORMAT_SHORT), + OPT_BOOLEAN(0, "branch", &s.show_branch, "show branch information"), + OPT_SET_INT(0, "porcelain", &status_format, + "machine-readable output", STATUS_FORMAT_PORCELAIN), + OPT_BOOLEAN('z', "null", &s.null_termination, + "terminate entries with NUL"), + OPT_BOOLEAN(0, "amend", &amend, "amend previous commit"), + OPT_BOOLEAN(0, "no-post-rewrite", &no_post_rewrite, "bypass post-rewrite hook"), + { OPTION_STRING, 'u', "untracked-files", &untracked_files_arg, "mode", "show untracked files, optional modes: all, normal, no. (Default: all)", PARSE_OPT_OPTARG, NULL, (intptr_t)"all" }, + /* end commit contents options */ + + { OPTION_BOOLEAN, 0, "allow-empty", &allow_empty, NULL, + "ok to record an empty change", + PARSE_OPT_NOARG | PARSE_OPT_HIDDEN }, + { OPTION_BOOLEAN, 0, "allow-empty-message", &allow_empty_message, NULL, + "ok to record a change with an empty message", + PARSE_OPT_NOARG | PARSE_OPT_HIDDEN }, + + OPT_END() + }; + struct strbuf sb = STRBUF_INIT; struct strbuf author_ident = STRBUF_INIT; const char *index_file, *reflog_msg; @@ -1431,7 +1427,6 @@ int cmd_commit(int argc, const char **argv, const char *prefix) struct commit_list *parents = NULL, **pptr = &parents; struct stat statbuf; int allow_fast_forward = 1; - struct wt_status s; struct commit *current_head = NULL; struct commit_extra_header *extra = NULL; @@ -1441,6 +1436,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix) wt_status_prepare(&s); git_config(git_commit_config, &s); determine_whence(&s); + s.colopts = 0; if (get_sha1("HEAD", sha1)) current_head = NULL; @@ -1449,7 +1445,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix) if (!current_head || parse_commit(current_head)) die(_("could not parse HEAD commit")); } - argc = parse_and_validate_options(argc, argv, builtin_commit_usage, + argc = parse_and_validate_options(argc, argv, builtin_commit_options, + builtin_commit_usage, prefix, current_head, &s); if (dry_run) return dry_run_commit(argc, argv, prefix, current_head, &s); diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c index 10db15b184..149db88726 100644 --- a/builtin/fetch-pack.c +++ b/builtin/fetch-pack.c @@ -528,6 +528,7 @@ static void filter_refs(struct ref **refs, int nr_match, char **match) struct ref **newtail = &newlist; struct ref *ref, *next; struct ref *fastarray[32]; + int match_pos; if (nr_match && !args.fetch_all) { if (ARRAY_SIZE(fastarray) < nr_match) @@ -540,6 +541,7 @@ static void filter_refs(struct ref **refs, int nr_match, char **match) else return_refs = NULL; + match_pos = 0; for (ref = *refs; ref; ref = next) { next = ref->next; if (!memcmp(ref->name, "refs/", 5) && @@ -553,15 +555,20 @@ static void filter_refs(struct ref **refs, int nr_match, char **match) continue; } else { - int i; - for (i = 0; i < nr_match; i++) { - if (!strcmp(ref->name, match[i])) { - match[i][0] = '\0'; - return_refs[i] = ref; + int cmp = -1; + while (match_pos < nr_match) { + cmp = strcmp(ref->name, match[match_pos]); + if (cmp < 0) /* definitely do not have it */ + break; + else if (cmp == 0) { /* definitely have it */ + match[match_pos][0] = '\0'; + return_refs[match_pos] = ref; break; } + else /* might have it; keep looking */ + match_pos++; } - if (i < nr_match) + if (!cmp) continue; /* we will link it later */ } free(ref); @@ -777,6 +784,8 @@ static struct ref *do_fetch_pack(int fd[2], struct ref *ref = copy_ref_list(orig_ref); unsigned char sha1[20]; + sort_ref_list(&ref, ref_compare_name); + if (is_repository_shallow() && !server_supports("shallow")) die("Server does not support shallow clients"); if (server_supports("multi_ack_detailed")) { @@ -834,21 +843,12 @@ static int remove_duplicates(int nr_heads, char **heads) { int src, dst; - for (src = dst = 0; src < nr_heads; src++) { - /* If heads[src] is different from any of - * heads[0..dst], push it in. - */ - int i; - for (i = 0; i < dst; i++) { - if (!strcmp(heads[i], heads[src])) - break; - } - if (i < dst) - continue; - if (src != dst) - heads[dst] = heads[src]; - dst++; - } + if (!nr_heads) + return 0; + + for (src = dst = 1; src < nr_heads; src++) + if (strcmp(heads[src], heads[dst-1])) + heads[dst++] = heads[src]; return dst; } @@ -899,9 +899,11 @@ static void fetch_pack_setup(void) int cmd_fetch_pack(int argc, const char **argv, const char *prefix) { - int i, ret, nr_heads; + int i, ret; struct ref *ref = NULL; - char *dest = NULL, **heads; + const char *dest = NULL; + int alloc_heads = 0, nr_heads = 0; + char **heads = NULL; int fd[2]; char *pack_lockfile = NULL; char **pack_lockfile_ptr = NULL; @@ -909,84 +911,79 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) packet_trace_identity("fetch-pack"); - nr_heads = 0; - heads = NULL; - for (i = 1; i < argc; i++) { + for (i = 1; i < argc && *argv[i] == '-'; i++) { const char *arg = argv[i]; - if (*arg == '-') { - if (!prefixcmp(arg, "--upload-pack=")) { - args.uploadpack = arg + 14; - continue; - } - if (!prefixcmp(arg, "--exec=")) { - args.uploadpack = arg + 7; - continue; - } - if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) { - args.quiet = 1; - continue; - } - if (!strcmp("--keep", arg) || !strcmp("-k", arg)) { - args.lock_pack = args.keep_pack; - args.keep_pack = 1; - continue; - } - if (!strcmp("--thin", arg)) { - args.use_thin_pack = 1; - continue; - } - if (!strcmp("--include-tag", arg)) { - args.include_tag = 1; - continue; - } - if (!strcmp("--all", arg)) { - args.fetch_all = 1; - continue; - } - if (!strcmp("--stdin", arg)) { - args.stdin_refs = 1; - continue; - } - if (!strcmp("-v", arg)) { - args.verbose = 1; - continue; - } - if (!prefixcmp(arg, "--depth=")) { - args.depth = strtol(arg + 8, NULL, 0); - continue; - } - if (!strcmp("--no-progress", arg)) { - args.no_progress = 1; - continue; - } - if (!strcmp("--stateless-rpc", arg)) { - args.stateless_rpc = 1; - continue; - } - if (!strcmp("--lock-pack", arg)) { - args.lock_pack = 1; - pack_lockfile_ptr = &pack_lockfile; - continue; - } - usage(fetch_pack_usage); + if (!prefixcmp(arg, "--upload-pack=")) { + args.uploadpack = arg + 14; + continue; } - dest = (char *)arg; - heads = (char **)(argv + i + 1); - nr_heads = argc - i - 1; - break; + if (!prefixcmp(arg, "--exec=")) { + args.uploadpack = arg + 7; + continue; + } + if (!strcmp("--quiet", arg) || !strcmp("-q", arg)) { + args.quiet = 1; + continue; + } + if (!strcmp("--keep", arg) || !strcmp("-k", arg)) { + args.lock_pack = args.keep_pack; + args.keep_pack = 1; + continue; + } + if (!strcmp("--thin", arg)) { + args.use_thin_pack = 1; + continue; + } + if (!strcmp("--include-tag", arg)) { + args.include_tag = 1; + continue; + } + if (!strcmp("--all", arg)) { + args.fetch_all = 1; + continue; + } + if (!strcmp("--stdin", arg)) { + args.stdin_refs = 1; + continue; + } + if (!strcmp("-v", arg)) { + args.verbose = 1; + continue; + } + if (!prefixcmp(arg, "--depth=")) { + args.depth = strtol(arg + 8, NULL, 0); + continue; + } + if (!strcmp("--no-progress", arg)) { + args.no_progress = 1; + continue; + } + if (!strcmp("--stateless-rpc", arg)) { + args.stateless_rpc = 1; + continue; + } + if (!strcmp("--lock-pack", arg)) { + args.lock_pack = 1; + pack_lockfile_ptr = &pack_lockfile; + continue; + } + usage(fetch_pack_usage); } - if (!dest) + + if (i < argc) + dest = argv[i++]; + else usage(fetch_pack_usage); + /* + * Copy refs from cmdline to growable list, then append any + * refs from the standard input: + */ + ALLOC_GROW(heads, argc - i, alloc_heads); + for (; i < argc; i++) + heads[nr_heads++] = xstrdup(argv[i]); if (args.stdin_refs) { - /* - * Copy refs from cmdline to new growable list, then - * append the refs from the standard input. - */ - int alloc_heads = nr_heads; - int size = nr_heads * sizeof(*heads); - heads = memcpy(xmalloc(size), heads, size); if (args.stateless_rpc) { /* in stateless RPC mode we use pkt-line to read * from stdin, until we get a flush packet @@ -1018,7 +1015,7 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) fd[0] = 0; fd[1] = 1; } else { - conn = git_connect(fd, (char *)dest, args.uploadpack, + conn = git_connect(fd, dest, args.uploadpack, args.verbose ? CONNECT_VERBOSE : 0); } @@ -1057,6 +1054,11 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix) return ret; } +static int compare_heads(const void *a, const void *b) +{ + return strcmp(*(const char **)a, *(const char **)b); +} + struct ref *fetch_pack(struct fetch_pack_args *my_args, int fd[], struct child_process *conn, const struct ref *ref, @@ -1076,8 +1078,11 @@ struct ref *fetch_pack(struct fetch_pack_args *my_args, st.st_mtime = 0; } - if (heads && nr_heads) + if (heads && nr_heads) { + qsort(heads, nr_heads, sizeof(*heads), compare_heads); nr_heads = remove_duplicates(nr_heads, heads); + } + if (!ref) { packet_flush(fd[1]); die("no matching remote head"); diff --git a/builtin/fetch.c b/builtin/fetch.c index 1c8cb62445..bb9a0743ff 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -546,8 +546,8 @@ static int prune_refs(struct refspec *refs, int ref_count, struct ref *ref_map) int result = 0; struct ref *ref, *stale_refs = get_stale_heads(refs, ref_count, ref_map); const char *dangling_msg = dry_run - ? _(" (%s will become dangling)\n") - : _(" (%s has become dangling)\n"); + ? _(" (%s will become dangling)") + : _(" (%s has become dangling)"); for (ref = stale_refs; ref; ref = ref->next) { if (!dry_run) diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c index a517f1794a..bf93b043b7 100644 --- a/builtin/fmt-merge-msg.c +++ b/builtin/fmt-merge-msg.c @@ -230,7 +230,7 @@ static void add_branch_desc(struct strbuf *out, const char *name) static void record_person(int which, struct string_list *people, struct commit *commit) { - char name_buf[MAX_GITNAME], *name, *name_end; + char *name_buf, *name, *name_end; struct string_list_item *elem; const char *field = (which == 'a') ? "\nauthor " : "\ncommitter "; @@ -243,10 +243,9 @@ static void record_person(int which, struct string_list *people, name_end--; while (isspace(*name_end) && name <= name_end) name_end--; - if (name_end < name || name + MAX_GITNAME <= name_end) + if (name_end < name) return; - memcpy(name_buf, name, name_end - name + 1); - name_buf[name_end - name + 1] = '\0'; + name_buf = xmemdupz(name, name_end - name + 1); elem = string_list_lookup(people, name_buf); if (!elem) { @@ -254,6 +253,7 @@ static void record_person(int which, struct string_list *people, elem->util = (void *)0; } elem->util = (void*)(util_as_integral(elem) + 1); + free(name_buf); } static int cmp_string_list_util_as_integral(const void *a_, const void *b_) @@ -462,7 +462,10 @@ static void fmt_tag_signature(struct strbuf *tagbuf, strbuf_add(tagbuf, tag_body, buf + len - tag_body); } strbuf_complete_line(tagbuf); - strbuf_add_lines(tagbuf, "# ", sig->buf, sig->len); + if (sig->len) { + strbuf_addch(tagbuf, '\n'); + strbuf_add_lines(tagbuf, "# ", sig->buf, sig->len); + } } static void fmt_merge_msg_sigs(struct strbuf *out) @@ -627,8 +630,7 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out, rev.ignore_merges = 1; rev.limited = 1; - if (suffixcmp(out->buf, "\n")) - strbuf_addch(out, '\n'); + strbuf_complete_line(out); for (i = 0; i < origins.nr; i++) shortlog(origins.items[i].string, diff --git a/builtin/grep.c b/builtin/grep.c index 643938d905..fe1726f5ef 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -600,15 +600,12 @@ static int file_callback(const struct option *opt, const char *arg, int unset) if (!patterns) die_errno(_("cannot open '%s'"), arg); while (strbuf_getline(&sb, patterns, '\n') == 0) { - char *s; - size_t len; - /* ignore empty line like grep does */ if (sb.len == 0) continue; - s = strbuf_detach(&sb, &len); - append_grep_pat(grep_opt, s, len, arg, ++lno, GREP_PATTERN); + append_grep_pat(grep_opt, sb.buf, sb.len, arg, ++lno, + GREP_PATTERN); } if (!from_stdin) fclose(patterns); diff --git a/builtin/help.c b/builtin/help.c index 61ff79839b..43d3c84449 100644 --- a/builtin/help.c +++ b/builtin/help.c @@ -9,6 +9,7 @@ #include "common-cmds.h" #include "parse-options.h" #include "run-command.h" +#include "column.h" #include "help.h" static struct man_viewer_list { @@ -30,6 +31,7 @@ enum help_format { }; static int show_all = 0; +static unsigned int colopts; static enum help_format help_format = HELP_FORMAT_NONE; static struct option builtin_help_options[] = { OPT_BOOLEAN('a', "all", &show_all, "print all available commands"), @@ -54,7 +56,7 @@ static enum help_format parse_help_format(const char *format) return HELP_FORMAT_INFO; if (!strcmp(format, "web") || !strcmp(format, "html")) return HELP_FORMAT_WEB; - die("unrecognized help format '%s'", format); + die(_("unrecognized help format '%s'"), format); } static const char *get_man_viewer_info(const char *name) @@ -82,7 +84,7 @@ static int check_emacsclient_version(void) ec_process.err = -1; ec_process.stdout_to_stderr = 1; if (start_command(&ec_process)) - return error("Failed to start emacsclient."); + return error(_("Failed to start emacsclient.")); strbuf_read(&buffer, ec_process.err, 20); close(ec_process.err); @@ -95,7 +97,7 @@ static int check_emacsclient_version(void) if (prefixcmp(buffer.buf, "emacsclient")) { strbuf_release(&buffer); - return error("Failed to parse emacsclient version."); + return error(_("Failed to parse emacsclient version.")); } strbuf_remove(&buffer, 0, strlen("emacsclient")); @@ -103,7 +105,7 @@ static int check_emacsclient_version(void) if (version < 22) { strbuf_release(&buffer); - return error("emacsclient version '%d' too old (< 22).", + return error(_("emacsclient version '%d' too old (< 22)."), version); } @@ -121,7 +123,7 @@ static void exec_woman_emacs(const char *path, const char *page) path = "emacsclient"; strbuf_addf(&man_page, "(woman \"%s\")", page); execlp(path, "emacsclient", "-e", man_page.buf, (char *)NULL); - warning("failed to exec '%s': %s", path, strerror(errno)); + warning(_("failed to exec '%s': %s"), path, strerror(errno)); } } @@ -149,7 +151,7 @@ static void exec_man_konqueror(const char *path, const char *page) path = "kfmclient"; strbuf_addf(&man_page, "man:%s(1)", page); execlp(path, filename, "newTab", man_page.buf, (char *)NULL); - warning("failed to exec '%s': %s", path, strerror(errno)); + warning(_("failed to exec '%s': %s"), path, strerror(errno)); } } @@ -158,7 +160,7 @@ static void exec_man_man(const char *path, const char *page) if (!path) path = "man"; execlp(path, "man", page, (char *)NULL); - warning("failed to exec '%s': %s", path, strerror(errno)); + warning(_("failed to exec '%s': %s"), path, strerror(errno)); } static void exec_man_cmd(const char *cmd, const char *page) @@ -166,7 +168,7 @@ static void exec_man_cmd(const char *cmd, const char *page) struct strbuf shell_cmd = STRBUF_INIT; strbuf_addf(&shell_cmd, "%s %s", cmd, page); execl("/bin/sh", "sh", "-c", shell_cmd.buf, (char *)NULL); - warning("failed to exec '%s': %s", cmd, strerror(errno)); + warning(_("failed to exec '%s': %s"), cmd, strerror(errno)); } static void add_man_viewer(const char *name) @@ -206,8 +208,8 @@ static int add_man_viewer_path(const char *name, if (supported_man_viewer(name, len)) do_add_man_viewer_info(name, len, value); else - warning("'%s': path for unsupported man viewer.\n" - "Please consider using 'man.<tool>.cmd' instead.", + warning(_("'%s': path for unsupported man viewer.\n" + "Please consider using 'man.<tool>.cmd' instead."), name); return 0; @@ -218,8 +220,8 @@ static int add_man_viewer_cmd(const char *name, const char *value) { if (supported_man_viewer(name, len)) - warning("'%s': cmd for supported man viewer.\n" - "Please consider using 'man.<tool>.path' instead.", + warning(_("'%s': cmd for supported man viewer.\n" + "Please consider using 'man.<tool>.path' instead."), name); else do_add_man_viewer_info(name, len, value); @@ -251,6 +253,8 @@ static int add_man_viewer_info(const char *var, const char *value) static int git_help_config(const char *var, const char *value, void *cb) { + if (!prefixcmp(var, "column.")) + return git_column_config(var, value, "help", &colopts); if (!strcmp(var, "help.format")) { if (!value) return config_error_nonbool(var); @@ -280,11 +284,11 @@ void list_common_cmds_help(void) longest = strlen(common_cmds[i].name); } - puts("The most commonly used git commands are:"); + puts(_("The most commonly used git commands are:")); for (i = 0; i < ARRAY_SIZE(common_cmds); i++) { printf(" %s ", common_cmds[i].name); mput_char(' ', longest - strlen(common_cmds[i].name)); - puts(common_cmds[i].help); + puts(_(common_cmds[i].help)); } } @@ -348,7 +352,7 @@ static void exec_viewer(const char *name, const char *page) else if (info) exec_man_cmd(info, page); else - warning("'%s': unknown man viewer.", name); + warning(_("'%s': unknown man viewer."), name); } static void show_man_page(const char *git_cmd) @@ -365,7 +369,7 @@ static void show_man_page(const char *git_cmd) if (fallback) exec_viewer(fallback, page); exec_viewer("man", page); - die("no man viewer handled the request"); + die(_("no man viewer handled the request")); } static void show_info_page(const char *git_cmd) @@ -373,7 +377,7 @@ static void show_info_page(const char *git_cmd) const char *page = cmd_to_page(git_cmd); setenv("INFOPATH", system_path(GIT_INFO_PATH), 1); execlp("info", "info", "gitman", page, (char *)NULL); - die("no info viewer handled the request"); + die(_("no info viewer handled the request")); } static void get_html_page_path(struct strbuf *page_path, const char *page) @@ -384,7 +388,7 @@ static void get_html_page_path(struct strbuf *page_path, const char *page) /* Check that we have a git documentation directory. */ if (stat(mkpath("%s/git.html", html_path), &st) || !S_ISREG(st.st_mode)) - die("'%s': not a documentation directory.", html_path); + die(_("'%s': not a documentation directory."), html_path); strbuf_init(page_path, 0); strbuf_addf(page_path, "%s/%s.html", html_path, page); @@ -424,16 +428,17 @@ int cmd_help(int argc, const char **argv, const char *prefix) parsed_help_format = help_format; if (show_all) { - printf("usage: %s\n\n", git_usage_string); - list_commands("git commands", &main_cmds, &other_cmds); - printf("%s\n", git_more_info_string); + git_config(git_help_config, NULL); + printf(_("usage: %s%s"), _(git_usage_string), "\n\n"); + list_commands(colopts, &main_cmds, &other_cmds); + printf("%s\n", _(git_more_info_string)); return 0; } if (!argv[0]) { - printf("usage: %s\n\n", git_usage_string); + printf(_("usage: %s%s"), _(git_usage_string), "\n\n"); list_common_cmds_help(); - printf("\n%s\n", git_more_info_string); + printf("\n%s\n", _(git_more_info_string)); return 0; } @@ -445,7 +450,7 @@ int cmd_help(int argc, const char **argv, const char *prefix) alias = alias_lookup(argv[0]); if (alias && !is_git_command(argv[0])) { - printf("`git %s' is aliased to `%s'\n", argv[0], alias); + printf_ln(_("`git %s' is aliased to `%s'"), argv[0], alias); return 0; } diff --git a/builtin/index-pack.c b/builtin/index-pack.c index dd1c5c961d..dc2cfe6e6f 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -9,6 +9,7 @@ #include "progress.h" #include "fsck.h" #include "exec_cmd.h" +#include "thread-utils.h" static const char index_pack_usage[] = "git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--verify] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])"; @@ -38,6 +39,19 @@ struct base_data { int ofs_first, ofs_last; }; +#if !defined(NO_PTHREADS) && defined(NO_PREAD) +/* NO_PREAD uses compat/pread.c, which is not thread-safe. Disable threading. */ +#define NO_PTHREADS +#endif + +struct thread_local { +#ifndef NO_PTHREADS + pthread_t thread; +#endif + struct base_data *base_cache; + size_t base_cache_used; +}; + /* * Even if sizeof(union delta_base) == 24 on 64-bit archs, we really want * to memcmp() only the first 20 bytes. @@ -54,11 +68,11 @@ struct delta_entry { static struct object_entry *objects; static struct delta_entry *deltas; -static struct base_data *base_cache; -static size_t base_cache_used; +static struct thread_local nothread_data; static int nr_objects; static int nr_deltas; static int nr_resolved_deltas; +static int nr_threads; static int from_stdin; static int strict; @@ -75,13 +89,84 @@ static git_SHA_CTX input_ctx; static uint32_t input_crc32; static int input_fd, output_fd, pack_fd; +#ifndef NO_PTHREADS + +static struct thread_local *thread_data; +static int nr_dispatched; +static int threads_active; + +static pthread_mutex_t read_mutex; +#define read_lock() lock_mutex(&read_mutex) +#define read_unlock() unlock_mutex(&read_mutex) + +static pthread_mutex_t counter_mutex; +#define counter_lock() lock_mutex(&counter_mutex) +#define counter_unlock() unlock_mutex(&counter_mutex) + +static pthread_mutex_t work_mutex; +#define work_lock() lock_mutex(&work_mutex) +#define work_unlock() unlock_mutex(&work_mutex) + +static pthread_key_t key; + +static inline void lock_mutex(pthread_mutex_t *mutex) +{ + if (threads_active) + pthread_mutex_lock(mutex); +} + +static inline void unlock_mutex(pthread_mutex_t *mutex) +{ + if (threads_active) + pthread_mutex_unlock(mutex); +} + +/* + * Mutex and conditional variable can't be statically-initialized on Windows. + */ +static void init_thread(void) +{ + init_recursive_mutex(&read_mutex); + pthread_mutex_init(&counter_mutex, NULL); + pthread_mutex_init(&work_mutex, NULL); + pthread_key_create(&key, NULL); + thread_data = xcalloc(nr_threads, sizeof(*thread_data)); + threads_active = 1; +} + +static void cleanup_thread(void) +{ + if (!threads_active) + return; + threads_active = 0; + pthread_mutex_destroy(&read_mutex); + pthread_mutex_destroy(&counter_mutex); + pthread_mutex_destroy(&work_mutex); + pthread_key_delete(key); + free(thread_data); +} + +#else + +#define read_lock() +#define read_unlock() + +#define counter_lock() +#define counter_unlock() + +#define work_lock() +#define work_unlock() + +#endif + + static int mark_link(struct object *obj, int type, void *data) { if (!obj) return -1; if (type != OBJ_ANY && obj->type != type) - die("object type mismatch at %s", sha1_to_hex(obj->sha1)); + die(_("object type mismatch at %s"), sha1_to_hex(obj->sha1)); obj->flags |= FLAG_LINK; return 0; @@ -101,7 +186,7 @@ static void check_object(struct object *obj) unsigned long size; int type = sha1_object_info(obj->sha1, &size); if (type != obj->type || type <= 0) - die("object of unexpected type"); + die(_("object of unexpected type")); obj->flags |= FLAG_CHECKED; return; } @@ -138,15 +223,18 @@ static void *fill(int min) if (min <= input_len) return input_buffer + input_offset; if (min > sizeof(input_buffer)) - die("cannot fill %d bytes", min); + die(Q_("cannot fill %d byte", + "cannot fill %d bytes", + min), + min); flush(); do { ssize_t ret = xread(input_fd, input_buffer + input_len, sizeof(input_buffer) - input_len); if (ret <= 0) { if (!ret) - die("early EOF"); - die_errno("read error on input"); + die(_("early EOF")); + die_errno(_("read error on input")); } input_len += ret; if (from_stdin) @@ -158,14 +246,14 @@ static void *fill(int min) static void use(int bytes) { if (bytes > input_len) - die("used more bytes than were available"); + die(_("used more bytes than were available")); input_crc32 = crc32(input_crc32, input_buffer + input_offset, bytes); input_len -= bytes; input_offset += bytes; /* make sure off_t is sufficiently large not to wrap */ if (signed_add_overflows(consumed_bytes, bytes)) - die("pack too large for current definition of off_t"); + die(_("pack too large for current definition of off_t")); consumed_bytes += bytes; } @@ -181,12 +269,12 @@ static const char *open_pack_file(const char *pack_name) } else output_fd = open(pack_name, O_CREAT|O_EXCL|O_RDWR, 0600); if (output_fd < 0) - die_errno("unable to create '%s'", pack_name); + die_errno(_("unable to create '%s'"), pack_name); pack_fd = output_fd; } else { input_fd = open(pack_name, O_RDONLY); if (input_fd < 0) - die_errno("cannot open packfile '%s'", pack_name); + die_errno(_("cannot open packfile '%s'"), pack_name); output_fd = -1; pack_fd = input_fd; } @@ -200,7 +288,7 @@ static void parse_pack_header(void) /* Header consistency check */ if (hdr->hdr_signature != htonl(PACK_SIGNATURE)) - die("pack signature mismatch"); + die(_("pack signature mismatch")); if (!pack_version_ok(hdr->hdr_version)) die("pack version %"PRIu32" unsupported", ntohl(hdr->hdr_version)); @@ -220,8 +308,27 @@ static NORETURN void bad_object(unsigned long offset, const char *format, ...) va_start(params, format); vsnprintf(buf, sizeof(buf), format, params); va_end(params); - die("pack has bad object at offset %lu: %s", offset, buf); + die(_("pack has bad object at offset %lu: %s"), offset, buf); +} + +static inline struct thread_local *get_thread_data(void) +{ +#ifndef NO_PTHREADS + if (threads_active) + return pthread_getspecific(key); + assert(!threads_active && + "This should only be reached when all threads are gone"); +#endif + return ¬hread_data; +} + +#ifndef NO_PTHREADS +static void set_thread_data(struct thread_local *data) +{ + if (threads_active) + pthread_setspecific(key, data); } +#endif static struct base_data *alloc_base_data(void) { @@ -237,15 +344,16 @@ static void free_base_data(struct base_data *c) if (c->data) { free(c->data); c->data = NULL; - base_cache_used -= c->size; + get_thread_data()->base_cache_used -= c->size; } } static void prune_base_data(struct base_data *retain) { struct base_data *b; - for (b = base_cache; - base_cache_used > delta_base_cache_limit && b; + struct thread_local *data = get_thread_data(); + for (b = data->base_cache; + data->base_cache_used > delta_base_cache_limit && b; b = b->child) { if (b->data && b != retain) free_base_data(b); @@ -257,12 +365,12 @@ static void link_base_data(struct base_data *base, struct base_data *c) if (base) base->child = c; else - base_cache = c; + get_thread_data()->base_cache = c; c->base = base; c->child = NULL; if (c->data) - base_cache_used += c->size; + get_thread_data()->base_cache_used += c->size; prune_base_data(c); } @@ -272,7 +380,7 @@ static void unlink_base_data(struct base_data *c) if (base) base->child = NULL; else - base_cache = NULL; + get_thread_data()->base_cache = NULL; free_base_data(c); } @@ -294,7 +402,7 @@ static void *unpack_entry_data(unsigned long offset, unsigned long size) use(input_len - stream.avail_in); } while (status == Z_OK); if (stream.total_out != size || status != Z_STREAM_END) - bad_object(offset, "inflate returned %d", status); + bad_object(offset, _("inflate returned %d"), status); git_inflate_end(&stream); return buf; } @@ -339,7 +447,7 @@ static void *unpack_raw_entry(struct object_entry *obj, union delta_base *delta_ while (c & 128) { base_offset += 1; if (!base_offset || MSB(base_offset, 7)) - bad_object(obj->idx.offset, "offset value overflow for delta base object"); + bad_object(obj->idx.offset, _("offset value overflow for delta base object")); p = fill(1); c = *p; use(1); @@ -347,7 +455,7 @@ static void *unpack_raw_entry(struct object_entry *obj, union delta_base *delta_ } delta_base->offset = obj->idx.offset - base_offset; if (delta_base->offset <= 0 || delta_base->offset >= obj->idx.offset) - bad_object(obj->idx.offset, "delta base offset is out of bound"); + bad_object(obj->idx.offset, _("delta base offset is out of bound")); break; case OBJ_COMMIT: case OBJ_TREE: @@ -355,7 +463,7 @@ static void *unpack_raw_entry(struct object_entry *obj, union delta_base *delta_ case OBJ_TAG: break; default: - bad_object(obj->idx.offset, "unknown object type %d", obj->type); + bad_object(obj->idx.offset, _("unknown object type %d"), obj->type); } obj->hdr_size = consumed_bytes - obj->idx.offset; @@ -384,9 +492,12 @@ static void *get_data_from_pack(struct object_entry *obj) ssize_t n = (len < 64*1024) ? len : 64*1024; n = pread(pack_fd, inbuf, n, from); if (n < 0) - die_errno("cannot pread pack file"); + die_errno(_("cannot pread pack file")); if (!n) - die("premature end of pack file, %lu bytes missing", len); + die(Q_("premature end of pack file, %lu byte missing", + "premature end of pack file, %lu bytes missing", + len), + len); from += n; len -= n; stream.next_in = inbuf; @@ -396,7 +507,7 @@ static void *get_data_from_pack(struct object_entry *obj) /* This has been inflated OK when first encountered, so... */ if (status != Z_STREAM_END || stream.total_out != obj->size) - die("serious inflate inconsistency"); + die(_("serious inflate inconsistency")); git_inflate_end(&stream); free(inbuf); @@ -461,25 +572,30 @@ static void sha1_object(const void *data, unsigned long size, enum object_type type, unsigned char *sha1) { hash_sha1_file(data, size, typename(type), sha1); + read_lock(); if (has_sha1_file(sha1)) { void *has_data; enum object_type has_type; unsigned long has_size; has_data = read_sha1_file(sha1, &has_type, &has_size); + read_unlock(); if (!has_data) - die("cannot read existing object %s", sha1_to_hex(sha1)); + die(_("cannot read existing object %s"), sha1_to_hex(sha1)); if (size != has_size || type != has_type || memcmp(data, has_data, size) != 0) - die("SHA1 COLLISION FOUND WITH %s !", sha1_to_hex(sha1)); + die(_("SHA1 COLLISION FOUND WITH %s !"), sha1_to_hex(sha1)); free(has_data); - } + } else + read_unlock(); + if (strict) { + read_lock(); if (type == OBJ_BLOB) { struct blob *blob = lookup_blob(sha1); if (blob) blob->object.flags |= FLAG_CHECKED; else - die("invalid blob object %s", sha1_to_hex(sha1)); + die(_("invalid blob object %s"), sha1_to_hex(sha1)); } else { struct object *obj; int eaten; @@ -491,11 +607,11 @@ static void sha1_object(const void *data, unsigned long size, */ obj = parse_object_buffer(sha1, type, size, buf, &eaten); if (!obj) - die("invalid %s", typename(type)); + die(_("invalid %s"), typename(type)); if (fsck_object(obj, 1, fsck_error_function)) - die("Error in object"); + die(_("Error in object")); if (fsck_walk(obj, mark_link, NULL)) - die("Not all child objects of %s are reachable", sha1_to_hex(obj->sha1)); + die(_("Not all child objects of %s are reachable"), sha1_to_hex(obj->sha1)); if (obj->type == OBJ_TREE) { struct tree *item = (struct tree *) obj; @@ -507,6 +623,7 @@ static void sha1_object(const void *data, unsigned long size, } obj->flags |= FLAG_CHECKED; } + read_unlock(); } } @@ -552,7 +669,7 @@ static void *get_base_data(struct base_data *c) if (!delta_nr) { c->data = get_data_from_pack(obj); c->size = obj->size; - base_cache_used += c->size; + get_thread_data()->base_cache_used += c->size; prune_base_data(c); } for (; delta_nr > 0; delta_nr--) { @@ -567,8 +684,8 @@ static void *get_base_data(struct base_data *c) &c->size); free(raw); if (!c->data) - bad_object(obj->idx.offset, "failed to apply delta"); - base_cache_used += c->size; + bad_object(obj->idx.offset, _("failed to apply delta")); + get_thread_data()->base_cache_used += c->size; prune_base_data(c); } free(delta); @@ -593,10 +710,12 @@ static void resolve_delta(struct object_entry *delta_obj, delta_data, delta_obj->size, &result->size); free(delta_data); if (!result->data) - bad_object(delta_obj->idx.offset, "failed to apply delta"); + bad_object(delta_obj->idx.offset, _("failed to apply delta")); sha1_object(result->data, result->size, delta_obj->real_type, delta_obj->idx.sha1); + counter_lock(); nr_resolved_deltas++; + counter_unlock(); } static struct base_data *find_unresolved_deltas_1(struct base_data *base, @@ -682,22 +801,53 @@ static int compare_delta_entry(const void *a, const void *b) objects[delta_b->obj_no].type); } -/* Parse all objects and return the pack content SHA1 hash */ +static void resolve_base(struct object_entry *obj) +{ + struct base_data *base_obj = alloc_base_data(); + base_obj->obj = obj; + base_obj->data = NULL; + find_unresolved_deltas(base_obj); +} + +#ifndef NO_PTHREADS +static void *threaded_second_pass(void *data) +{ + set_thread_data(data); + for (;;) { + int i; + work_lock(); + display_progress(progress, nr_resolved_deltas); + while (nr_dispatched < nr_objects && + is_delta_type(objects[nr_dispatched].type)) + nr_dispatched++; + if (nr_dispatched >= nr_objects) { + work_unlock(); + break; + } + i = nr_dispatched++; + work_unlock(); + + resolve_base(&objects[i]); + } + return NULL; +} +#endif + +/* + * First pass: + * - find locations of all objects; + * - calculate SHA1 of all non-delta objects; + * - remember base (SHA1 or offset) for all deltas. + */ static void parse_pack_objects(unsigned char *sha1) { int i; struct delta_entry *delta = deltas; struct stat st; - /* - * First pass: - * - find locations of all objects; - * - calculate SHA1 of all non-delta objects; - * - remember base (SHA1 or offset) for all deltas. - */ if (verbose) progress = start_progress( - from_stdin ? "Receiving objects" : "Indexing objects", + from_stdin ? _("Receiving objects") : _("Indexing objects"), nr_objects); for (i = 0; i < nr_objects; i++) { struct object_entry *obj = &objects[i]; @@ -719,15 +869,28 @@ static void parse_pack_objects(unsigned char *sha1) flush(); git_SHA1_Final(sha1, &input_ctx); if (hashcmp(fill(20), sha1)) - die("pack is corrupted (SHA1 mismatch)"); + die(_("pack is corrupted (SHA1 mismatch)")); use(20); /* If input_fd is a file, we should have reached its end now. */ if (fstat(input_fd, &st)) - die_errno("cannot fstat packfile"); + die_errno(_("cannot fstat packfile")); if (S_ISREG(st.st_mode) && lseek(input_fd, 0, SEEK_CUR) - input_len != st.st_size) - die("pack has junk at the end"); + die(_("pack has junk at the end")); +} + +/* + * Second pass: + * - for all non-delta objects, look if it is used as a base for + * deltas; + * - if used as a base, uncompress the object and apply all deltas, + * recursively checking if the resulting object is used as a base + * for some more deltas. + */ +static void resolve_deltas(void) +{ + int i; if (!nr_deltas) return; @@ -736,29 +899,83 @@ static void parse_pack_objects(unsigned char *sha1) qsort(deltas, nr_deltas, sizeof(struct delta_entry), compare_delta_entry); - /* - * Second pass: - * - for all non-delta objects, look if it is used as a base for - * deltas; - * - if used as a base, uncompress the object and apply all deltas, - * recursively checking if the resulting object is used as a base - * for some more deltas. - */ if (verbose) - progress = start_progress("Resolving deltas", nr_deltas); + progress = start_progress(_("Resolving deltas"), nr_deltas); + +#ifndef NO_PTHREADS + nr_dispatched = 0; + if (nr_threads > 1 || getenv("GIT_FORCE_THREADS")) { + init_thread(); + for (i = 0; i < nr_threads; i++) { + int ret = pthread_create(&thread_data[i].thread, NULL, + threaded_second_pass, thread_data + i); + if (ret) + die("unable to create thread: %s", strerror(ret)); + } + for (i = 0; i < nr_threads; i++) + pthread_join(thread_data[i].thread, NULL); + cleanup_thread(); + return; + } +#endif + for (i = 0; i < nr_objects; i++) { struct object_entry *obj = &objects[i]; - struct base_data *base_obj = alloc_base_data(); if (is_delta_type(obj->type)) continue; - base_obj->obj = obj; - base_obj->data = NULL; - find_unresolved_deltas(base_obj); + resolve_base(obj); display_progress(progress, nr_resolved_deltas); } } +/* + * Third pass: + * - append objects to convert thin pack to full pack if required + * - write the final 20-byte SHA-1 + */ +static void fix_unresolved_deltas(struct sha1file *f, int nr_unresolved); +static void conclude_pack(int fix_thin_pack, const char *curr_pack, unsigned char *pack_sha1) +{ + if (nr_deltas == nr_resolved_deltas) { + stop_progress(&progress); + /* Flush remaining pack final 20-byte SHA1. */ + flush(); + return; + } + + if (fix_thin_pack) { + struct sha1file *f; + unsigned char read_sha1[20], tail_sha1[20]; + char msg[48]; + int nr_unresolved = nr_deltas - nr_resolved_deltas; + int nr_objects_initial = nr_objects; + if (nr_unresolved <= 0) + die(_("confusion beyond insanity")); + objects = xrealloc(objects, + (nr_objects + nr_unresolved + 1) + * sizeof(*objects)); + f = sha1fd(output_fd, curr_pack); + fix_unresolved_deltas(f, nr_unresolved); + sprintf(msg, "completed with %d local objects", + nr_objects - nr_objects_initial); + stop_progress_msg(&progress, msg); + sha1close(f, tail_sha1, 0); + hashcpy(read_sha1, pack_sha1); + fixup_pack_header_footer(output_fd, pack_sha1, + curr_pack, nr_objects, + read_sha1, consumed_bytes-20); + if (hashcmp(read_sha1, tail_sha1) != 0) + die("Unexpected tail checksum for %s " + "(disk corruption?)", curr_pack); + } + if (nr_deltas != nr_resolved_deltas) + die(Q_("pack has %d unresolved delta", + "pack has %d unresolved deltas", + nr_deltas - nr_resolved_deltas), + nr_deltas - nr_resolved_deltas); +} + static int write_compressed(struct sha1file *f, void *in, unsigned int size) { git_zstream stream; @@ -778,7 +995,7 @@ static int write_compressed(struct sha1file *f, void *in, unsigned int size) } while (status == Z_OK); if (status != Z_STREAM_END) - die("unable to deflate appended object (%d)", status); + die(_("unable to deflate appended object (%d)"), status); size = stream.total_out; git_deflate_end(&stream); return size; @@ -857,7 +1074,7 @@ static void fix_unresolved_deltas(struct sha1file *f, int nr_unresolved) if (check_sha1_signature(d->base.sha1, base_obj->data, base_obj->size, typename(type))) - die("local object %s is corrupt", sha1_to_hex(d->base.sha1)); + die(_("local object %s is corrupt"), sha1_to_hex(d->base.sha1)); base_obj->obj = append_obj_to_pack(f, d->base.sha1, base_obj->data, base_obj->size, type); find_unresolved_deltas(base_obj); @@ -881,7 +1098,7 @@ static void final(const char *final_pack_name, const char *curr_pack_name, fsync_or_die(output_fd, curr_pack_name); err = close(output_fd); if (err) - die_errno("error while closing pack file"); + die_errno(_("error while closing pack file")); } if (keep_msg) { @@ -894,7 +1111,7 @@ static void final(const char *final_pack_name, const char *curr_pack_name, if (keep_fd < 0) { if (errno != EEXIST) - die_errno("cannot write keep file '%s'", + die_errno(_("cannot write keep file '%s'"), keep_name); } else { if (keep_msg_len > 0) { @@ -902,7 +1119,7 @@ static void final(const char *final_pack_name, const char *curr_pack_name, write_or_die(keep_fd, "\n", 1); } if (close(keep_fd) != 0) - die_errno("cannot close written keep file '%s'", + die_errno(_("cannot close written keep file '%s'"), keep_name); report = "keep"; } @@ -915,7 +1132,7 @@ static void final(const char *final_pack_name, const char *curr_pack_name, final_pack_name = name; } if (move_temp_to_file(curr_pack_name, final_pack_name)) - die("cannot store pack file"); + die(_("cannot store pack file")); } else if (from_stdin) chmod(final_pack_name, 0444); @@ -926,7 +1143,7 @@ static void final(const char *final_pack_name, const char *curr_pack_name, final_index_name = name; } if (move_temp_to_file(curr_index_name, final_index_name)) - die("cannot store index file"); + die(_("cannot store index file")); } else chmod(final_index_name, 0444); @@ -962,6 +1179,18 @@ static int git_index_pack_config(const char *k, const char *v, void *cb) die("bad pack.indexversion=%"PRIu32, opts->version); return 0; } + if (!strcmp(k, "pack.threads")) { + nr_threads = git_config_int(k, v); + if (nr_threads < 0) + die("invalid number of threads specified (%d)", + nr_threads); +#ifdef NO_PTHREADS + if (nr_threads != 1) + warning("no threads support, ignoring %s", k); + nr_threads = 1; +#endif + return 0; + } return git_default_config(k, v, cb); } @@ -1015,9 +1244,9 @@ static void read_idx_option(struct pack_idx_option *opts, const char *pack_name) struct packed_git *p = add_packed_git(pack_name, strlen(pack_name), 1); if (!p) - die("Cannot open existing pack file '%s'", pack_name); + die(_("Cannot open existing pack file '%s'"), pack_name); if (open_pack_index(p)) - die("Cannot open existing pack idx file for '%s'", pack_name); + die(_("Cannot open existing pack idx file for '%s'"), pack_name); /* Read the attributes from the existing idx file */ opts->version = p->index_version; @@ -1064,15 +1293,18 @@ static void show_pack_info(int stat_only) } if (baseobjects) - printf("non delta: %d object%s\n", - baseobjects, baseobjects > 1 ? "s" : ""); + printf_ln(Q_("non delta: %d object", + "non delta: %d objects", + baseobjects), + baseobjects); for (i = 0; i < deepest_delta; i++) { if (!chain_histogram[i]) continue; - printf("chain length = %d: %lu object%s\n", - i + 1, - chain_histogram[i], - chain_histogram[i] > 1 ? "s" : ""); + printf_ln(Q_("chain length = %d: %lu object", + "chain length = %d: %lu objects", + chain_histogram[i]), + i + 1, + chain_histogram[i]); } } @@ -1095,7 +1327,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) reset_pack_idx_option(&opts); git_config(git_index_pack_config, &opts); if (prefix && chdir(prefix)) - die("Cannot come back to cwd"); + die(_("Cannot come back to cwd")); for (i = 1; i < argc; i++) { const char *arg = argv[i]; @@ -1120,6 +1352,17 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) keep_msg = ""; } else if (!prefixcmp(arg, "--keep=")) { keep_msg = arg + 7; + } else if (!prefixcmp(arg, "--threads=")) { + char *end; + nr_threads = strtoul(arg+10, &end, 0); + if (!arg[10] || *end || nr_threads < 0) + usage(index_pack_usage); +#ifdef NO_PTHREADS + if (nr_threads != 1) + warning("no threads support, " + "ignoring %s", arg); + nr_threads = 1; +#endif } else if (!prefixcmp(arg, "--pack_header=")) { struct pack_header *hdr; char *c; @@ -1128,10 +1371,10 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) hdr->hdr_signature = htonl(PACK_SIGNATURE); hdr->hdr_version = htonl(strtoul(arg + 14, &c, 10)); if (*c != ',') - die("bad %s", arg); + die(_("bad %s"), arg); hdr->hdr_entries = htonl(strtoul(c + 1, &c, 10)); if (*c) - die("bad %s", arg); + die(_("bad %s"), arg); input_len = sizeof(*hdr); } else if (!strcmp(arg, "-v")) { verbose = 1; @@ -1143,11 +1386,11 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) char *c; opts.version = strtoul(arg + 16, &c, 10); if (opts.version > 2) - die("bad %s", arg); + die(_("bad %s"), arg); if (*c == ',') opts.off32_limit = strtoul(c+1, &c, 0); if (*c || opts.off32_limit & 0x80000000) - die("bad %s", arg); + die(_("bad %s"), arg); } else usage(index_pack_usage); continue; @@ -1161,11 +1404,11 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) if (!pack_name && !from_stdin) usage(index_pack_usage); if (fix_thin_pack && !from_stdin) - die("--fix-thin cannot be used without --stdin"); + die(_("--fix-thin cannot be used without --stdin")); if (!index_name && pack_name) { int len = strlen(pack_name); if (!has_extension(pack_name, ".pack")) - die("packfile name '%s' does not end with '.pack'", + die(_("packfile name '%s' does not end with '.pack'"), pack_name); index_name_buf = xmalloc(len); memcpy(index_name_buf, pack_name, len - 5); @@ -1175,7 +1418,7 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) if (keep_msg && !keep_name && pack_name) { int len = strlen(pack_name); if (!has_extension(pack_name, ".pack")) - die("packfile name '%s' does not end with '.pack'", + die(_("packfile name '%s' does not end with '.pack'"), pack_name); keep_name_buf = xmalloc(len); memcpy(keep_name_buf, pack_name, len - 5); @@ -1184,52 +1427,29 @@ int cmd_index_pack(int argc, const char **argv, const char *prefix) } if (verify) { if (!index_name) - die("--verify with no packfile name given"); + die(_("--verify with no packfile name given")); read_idx_option(&opts, index_name); opts.flags |= WRITE_IDX_VERIFY | WRITE_IDX_STRICT; } if (strict) opts.flags |= WRITE_IDX_STRICT; +#ifndef NO_PTHREADS + if (!nr_threads) { + nr_threads = online_cpus(); + /* An experiment showed that more threads does not mean faster */ + if (nr_threads > 3) + nr_threads = 3; + } +#endif + curr_pack = open_pack_file(pack_name); parse_pack_header(); objects = xcalloc(nr_objects + 1, sizeof(struct object_entry)); deltas = xcalloc(nr_objects, sizeof(struct delta_entry)); parse_pack_objects(pack_sha1); - if (nr_deltas == nr_resolved_deltas) { - stop_progress(&progress); - /* Flush remaining pack final 20-byte SHA1. */ - flush(); - } else { - if (fix_thin_pack) { - struct sha1file *f; - unsigned char read_sha1[20], tail_sha1[20]; - char msg[48]; - int nr_unresolved = nr_deltas - nr_resolved_deltas; - int nr_objects_initial = nr_objects; - if (nr_unresolved <= 0) - die("confusion beyond insanity"); - objects = xrealloc(objects, - (nr_objects + nr_unresolved + 1) - * sizeof(*objects)); - f = sha1fd(output_fd, curr_pack); - fix_unresolved_deltas(f, nr_unresolved); - sprintf(msg, "completed with %d local objects", - nr_objects - nr_objects_initial); - stop_progress_msg(&progress, msg); - sha1close(f, tail_sha1, 0); - hashcpy(read_sha1, pack_sha1); - fixup_pack_header_footer(output_fd, pack_sha1, - curr_pack, nr_objects, - read_sha1, consumed_bytes-20); - if (hashcmp(read_sha1, tail_sha1) != 0) - die("Unexpected tail checksum for %s " - "(disk corruption?)", curr_pack); - } - if (nr_deltas != nr_resolved_deltas) - die("pack has %d unresolved deltas", - nr_deltas - nr_resolved_deltas); - } + resolve_deltas(); + conclude_pack(fix_thin_pack, curr_pack, pack_sha1); free(deltas); if (strict) check_objects(); diff --git a/builtin/log.c b/builtin/log.c index 690caa7830..906dca475a 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -663,7 +663,8 @@ static FILE *realstdout = NULL; static const char *output_directory = NULL; static int outdir_offset; -static int reopen_stdout(struct commit *commit, struct rev_info *rev, int quiet) +static int reopen_stdout(struct commit *commit, const char *subject, + struct rev_info *rev, int quiet) { struct strbuf filename = STRBUF_INIT; int suffix_len = strlen(fmt_patch_suffix) + 1; @@ -677,7 +678,7 @@ static int reopen_stdout(struct commit *commit, struct rev_info *rev, int quiet) strbuf_addch(&filename, '/'); } - get_patch_filename(commit, rev->nr, fmt_patch_suffix, &filename); + get_patch_filename(commit, subject, rev->nr, fmt_patch_suffix, &filename); if (!quiet) fprintf(realstdout, "%s\n", filename.buf + outdir_offset); @@ -737,15 +738,10 @@ static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids, const cha static void gen_message_id(struct rev_info *info, char *base) { - const char *committer = git_committer_info(IDENT_WARN_ON_NO_NAME); - const char *email_start = strrchr(committer, '<'); - const char *email_end = strrchr(committer, '>'); struct strbuf buf = STRBUF_INIT; - if (!email_start || !email_end || email_start > email_end - 1) - die(_("Could not extract email from committer identity.")); - strbuf_addf(&buf, "%s.%lu.git.%.*s", base, + strbuf_addf(&buf, "%s.%lu.git.%s", base, (unsigned long) time(NULL), - (int)(email_end - email_start - 1), email_start + 1); + git_committer_info(IDENT_NO_NAME|IDENT_NO_DATE|IDENT_STRICT)); info->message_id = strbuf_detach(&buf, NULL); } @@ -784,7 +780,6 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout, const char *encoding = "UTF-8"; struct diff_options opts; int need_8bit_cte = 0; - struct commit *commit = NULL; struct pretty_print_context pp = {0}; if (rev->commit_format != CMIT_FMT_EMAIL) @@ -792,31 +787,10 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout, committer = git_committer_info(0); - if (!numbered_files) { - /* - * We fake a commit for the cover letter so we get the filename - * desired. - */ - commit = xcalloc(1, sizeof(*commit)); - commit->buffer = xmalloc(400); - snprintf(commit->buffer, 400, - "tree 0000000000000000000000000000000000000000\n" - "parent %s\n" - "author %s\n" - "committer %s\n\n" - "cover letter\n", - sha1_to_hex(head->object.sha1), committer, committer); - } - - if (!use_stdout && reopen_stdout(commit, rev, quiet)) + if (!use_stdout && + reopen_stdout(NULL, numbered_files ? NULL : "cover-letter", rev, quiet)) return; - if (commit) { - - free(commit->buffer); - free(commit); - } - log_write_email_headers(rev, head, &pp.subject, &pp.after_subject, &need_8bit_cte); @@ -1173,7 +1147,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) if (do_signoff) { const char *committer; const char *endpos; - committer = git_committer_info(IDENT_ERROR_ON_NO_NAME); + committer = git_committer_info(IDENT_STRICT); endpos = strchr(committer, '>'); if (!endpos) die(_("bogus committer info %s"), committer); @@ -1411,8 +1385,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) gen_message_id(&rev, sha1_to_hex(commit->object.sha1)); } - if (!use_stdout && reopen_stdout(numbered_files ? NULL : commit, - &rev, quiet)) + if (!use_stdout && + reopen_stdout(numbered_files ? NULL : commit, NULL, &rev, quiet)) die(_("Failed to create output files")); shown = log_tree_commit(&rev, commit); free(commit->buffer); diff --git a/builtin/merge-file.c b/builtin/merge-file.c index 237abd3c0b..6f0efef43c 100644 --- a/builtin/merge-file.c +++ b/builtin/merge-file.c @@ -63,7 +63,7 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix) if (quiet) { if (!freopen("/dev/null", "w", stderr)) return error("failed to redirect stderr to /dev/null: " - "%s\n", strerror(errno)); + "%s", strerror(errno)); } if (prefix) @@ -76,7 +76,7 @@ int cmd_merge_file(int argc, const char **argv, const char *prefix) if (read_mmfile(mmfs + i, fname)) return -1; if (buffer_is_binary(mmfs[i].ptr, mmfs[i].size)) - return error("Cannot merge binary files: %s\n", + return error("Cannot merge binary files: %s", argv[i]); } diff --git a/builtin/merge.c b/builtin/merge.c index 470fc57c5d..dd50a0c57b 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -1447,7 +1447,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) refresh_cache(REFRESH_QUIET); if (allow_trivial && !fast_forward_only) { /* See if it is really trivial. */ - git_committer_info(IDENT_ERROR_ON_NO_NAME); + git_committer_info(IDENT_STRICT); printf(_("Trying really trivial in-index merge...\n")); if (!read_tree_trivial(common->item->object.sha1, head_commit->object.sha1, @@ -1490,7 +1490,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) die(_("Not possible to fast-forward, aborting.")); /* We are going to make a new commit. */ - git_committer_info(IDENT_ERROR_ON_NO_NAME); + git_committer_info(IDENT_STRICT); /* * At this point, we need a real merge. No matter what strategy diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index 1861093e9d..ccfcbad146 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -200,22 +200,178 @@ static void copy_pack_data(struct sha1file *f, } /* Return 0 if we will bust the pack-size limit */ -static unsigned long write_object(struct sha1file *f, - struct object_entry *entry, - off_t write_offset) +static unsigned long write_no_reuse_object(struct sha1file *f, struct object_entry *entry, + unsigned long limit, int usable_delta) { - unsigned long size, limit, datalen; - void *buf; + unsigned long size, datalen; unsigned char header[10], dheader[10]; unsigned hdrlen; enum object_type type; + void *buf; + + if (!usable_delta) { + buf = read_sha1_file(entry->idx.sha1, &type, &size); + if (!buf) + die("unable to read %s", sha1_to_hex(entry->idx.sha1)); + /* + * make sure no cached delta data remains from a + * previous attempt before a pack split occurred. + */ + free(entry->delta_data); + entry->delta_data = NULL; + entry->z_delta_size = 0; + } else if (entry->delta_data) { + size = entry->delta_size; + buf = entry->delta_data; + entry->delta_data = NULL; + type = (allow_ofs_delta && entry->delta->idx.offset) ? + OBJ_OFS_DELTA : OBJ_REF_DELTA; + } else { + buf = get_delta(entry); + size = entry->delta_size; + type = (allow_ofs_delta && entry->delta->idx.offset) ? + OBJ_OFS_DELTA : OBJ_REF_DELTA; + } + + if (entry->z_delta_size) + datalen = entry->z_delta_size; + else + datalen = do_compress(&buf, size); + + /* + * The object header is a byte of 'type' followed by zero or + * more bytes of length. + */ + hdrlen = encode_in_pack_object_header(type, size, header); + + if (type == OBJ_OFS_DELTA) { + /* + * Deltas with relative base contain an additional + * encoding of the relative offset for the delta + * base from this object's position in the pack. + */ + off_t ofs = entry->idx.offset - entry->delta->idx.offset; + unsigned pos = sizeof(dheader) - 1; + dheader[pos] = ofs & 127; + while (ofs >>= 7) + dheader[--pos] = 128 | (--ofs & 127); + if (limit && hdrlen + sizeof(dheader) - pos + datalen + 20 >= limit) { + free(buf); + return 0; + } + sha1write(f, header, hdrlen); + sha1write(f, dheader + pos, sizeof(dheader) - pos); + hdrlen += sizeof(dheader) - pos; + } else if (type == OBJ_REF_DELTA) { + /* + * Deltas with a base reference contain + * an additional 20 bytes for the base sha1. + */ + if (limit && hdrlen + 20 + datalen + 20 >= limit) { + free(buf); + return 0; + } + sha1write(f, header, hdrlen); + sha1write(f, entry->delta->idx.sha1, 20); + hdrlen += 20; + } else { + if (limit && hdrlen + datalen + 20 >= limit) { + free(buf); + return 0; + } + sha1write(f, header, hdrlen); + } + sha1write(f, buf, datalen); + free(buf); + + return hdrlen + datalen; +} + +/* Return 0 if we will bust the pack-size limit */ +static unsigned long write_reuse_object(struct sha1file *f, struct object_entry *entry, + unsigned long limit, int usable_delta) +{ + struct packed_git *p = entry->in_pack; + struct pack_window *w_curs = NULL; + struct revindex_entry *revidx; + off_t offset; + enum object_type type = entry->type; + unsigned long datalen; + unsigned char header[10], dheader[10]; + unsigned hdrlen; + + if (entry->delta) + type = (allow_ofs_delta && entry->delta->idx.offset) ? + OBJ_OFS_DELTA : OBJ_REF_DELTA; + hdrlen = encode_in_pack_object_header(type, entry->size, header); + + offset = entry->in_pack_offset; + revidx = find_pack_revindex(p, offset); + datalen = revidx[1].offset - offset; + if (!pack_to_stdout && p->index_version > 1 && + check_pack_crc(p, &w_curs, offset, datalen, revidx->nr)) { + error("bad packed object CRC for %s", sha1_to_hex(entry->idx.sha1)); + unuse_pack(&w_curs); + return write_no_reuse_object(f, entry, limit, usable_delta); + } + + offset += entry->in_pack_header_size; + datalen -= entry->in_pack_header_size; + + if (!pack_to_stdout && p->index_version == 1 && + check_pack_inflate(p, &w_curs, offset, datalen, entry->size)) { + error("corrupt packed object for %s", sha1_to_hex(entry->idx.sha1)); + unuse_pack(&w_curs); + return write_no_reuse_object(f, entry, limit, usable_delta); + } + + if (type == OBJ_OFS_DELTA) { + off_t ofs = entry->idx.offset - entry->delta->idx.offset; + unsigned pos = sizeof(dheader) - 1; + dheader[pos] = ofs & 127; + while (ofs >>= 7) + dheader[--pos] = 128 | (--ofs & 127); + if (limit && hdrlen + sizeof(dheader) - pos + datalen + 20 >= limit) { + unuse_pack(&w_curs); + return 0; + } + sha1write(f, header, hdrlen); + sha1write(f, dheader + pos, sizeof(dheader) - pos); + hdrlen += sizeof(dheader) - pos; + reused_delta++; + } else if (type == OBJ_REF_DELTA) { + if (limit && hdrlen + 20 + datalen + 20 >= limit) { + unuse_pack(&w_curs); + return 0; + } + sha1write(f, header, hdrlen); + sha1write(f, entry->delta->idx.sha1, 20); + hdrlen += 20; + reused_delta++; + } else { + if (limit && hdrlen + datalen + 20 >= limit) { + unuse_pack(&w_curs); + return 0; + } + sha1write(f, header, hdrlen); + } + copy_pack_data(f, p, &w_curs, offset, datalen); + unuse_pack(&w_curs); + reused++; + return hdrlen + datalen; +} + +/* Return 0 if we will bust the pack-size limit */ +static unsigned long write_object(struct sha1file *f, + struct object_entry *entry, + off_t write_offset) +{ + unsigned long limit, len; int usable_delta, to_reuse; if (!pack_to_stdout) crc32_begin(f); - type = entry->type; - /* apply size limit if limited packsize and not first object */ if (!pack_size_limit || !nr_written) limit = 0; @@ -243,11 +399,11 @@ static unsigned long write_object(struct sha1file *f, to_reuse = 0; /* explicit */ else if (!entry->in_pack) to_reuse = 0; /* can't reuse what we don't have */ - else if (type == OBJ_REF_DELTA || type == OBJ_OFS_DELTA) + else if (entry->type == OBJ_REF_DELTA || entry->type == OBJ_OFS_DELTA) /* check_object() decided it for us ... */ to_reuse = usable_delta; /* ... but pack split may override that */ - else if (type != entry->in_pack_type) + else if (entry->type != entry->in_pack_type) to_reuse = 0; /* pack has delta which is unusable */ else if (entry->delta) to_reuse = 0; /* we want to pack afresh */ @@ -256,153 +412,19 @@ static unsigned long write_object(struct sha1file *f, * and we do not need to deltify it. */ - if (!to_reuse) { - no_reuse: - if (!usable_delta) { - buf = read_sha1_file(entry->idx.sha1, &type, &size); - if (!buf) - die("unable to read %s", sha1_to_hex(entry->idx.sha1)); - /* - * make sure no cached delta data remains from a - * previous attempt before a pack split occurred. - */ - free(entry->delta_data); - entry->delta_data = NULL; - entry->z_delta_size = 0; - } else if (entry->delta_data) { - size = entry->delta_size; - buf = entry->delta_data; - entry->delta_data = NULL; - type = (allow_ofs_delta && entry->delta->idx.offset) ? - OBJ_OFS_DELTA : OBJ_REF_DELTA; - } else { - buf = get_delta(entry); - size = entry->delta_size; - type = (allow_ofs_delta && entry->delta->idx.offset) ? - OBJ_OFS_DELTA : OBJ_REF_DELTA; - } - - if (entry->z_delta_size) - datalen = entry->z_delta_size; - else - datalen = do_compress(&buf, size); - - /* - * The object header is a byte of 'type' followed by zero or - * more bytes of length. - */ - hdrlen = encode_in_pack_object_header(type, size, header); - - if (type == OBJ_OFS_DELTA) { - /* - * Deltas with relative base contain an additional - * encoding of the relative offset for the delta - * base from this object's position in the pack. - */ - off_t ofs = entry->idx.offset - entry->delta->idx.offset; - unsigned pos = sizeof(dheader) - 1; - dheader[pos] = ofs & 127; - while (ofs >>= 7) - dheader[--pos] = 128 | (--ofs & 127); - if (limit && hdrlen + sizeof(dheader) - pos + datalen + 20 >= limit) { - free(buf); - return 0; - } - sha1write(f, header, hdrlen); - sha1write(f, dheader + pos, sizeof(dheader) - pos); - hdrlen += sizeof(dheader) - pos; - } else if (type == OBJ_REF_DELTA) { - /* - * Deltas with a base reference contain - * an additional 20 bytes for the base sha1. - */ - if (limit && hdrlen + 20 + datalen + 20 >= limit) { - free(buf); - return 0; - } - sha1write(f, header, hdrlen); - sha1write(f, entry->delta->idx.sha1, 20); - hdrlen += 20; - } else { - if (limit && hdrlen + datalen + 20 >= limit) { - free(buf); - return 0; - } - sha1write(f, header, hdrlen); - } - sha1write(f, buf, datalen); - free(buf); - } - else { - struct packed_git *p = entry->in_pack; - struct pack_window *w_curs = NULL; - struct revindex_entry *revidx; - off_t offset; - - if (entry->delta) - type = (allow_ofs_delta && entry->delta->idx.offset) ? - OBJ_OFS_DELTA : OBJ_REF_DELTA; - hdrlen = encode_in_pack_object_header(type, entry->size, header); - - offset = entry->in_pack_offset; - revidx = find_pack_revindex(p, offset); - datalen = revidx[1].offset - offset; - if (!pack_to_stdout && p->index_version > 1 && - check_pack_crc(p, &w_curs, offset, datalen, revidx->nr)) { - error("bad packed object CRC for %s", sha1_to_hex(entry->idx.sha1)); - unuse_pack(&w_curs); - goto no_reuse; - } - - offset += entry->in_pack_header_size; - datalen -= entry->in_pack_header_size; - if (!pack_to_stdout && p->index_version == 1 && - check_pack_inflate(p, &w_curs, offset, datalen, entry->size)) { - error("corrupt packed object for %s", sha1_to_hex(entry->idx.sha1)); - unuse_pack(&w_curs); - goto no_reuse; - } + if (!to_reuse) + len = write_no_reuse_object(f, entry, limit, usable_delta); + else + len = write_reuse_object(f, entry, limit, usable_delta); + if (!len) + return 0; - if (type == OBJ_OFS_DELTA) { - off_t ofs = entry->idx.offset - entry->delta->idx.offset; - unsigned pos = sizeof(dheader) - 1; - dheader[pos] = ofs & 127; - while (ofs >>= 7) - dheader[--pos] = 128 | (--ofs & 127); - if (limit && hdrlen + sizeof(dheader) - pos + datalen + 20 >= limit) { - unuse_pack(&w_curs); - return 0; - } - sha1write(f, header, hdrlen); - sha1write(f, dheader + pos, sizeof(dheader) - pos); - hdrlen += sizeof(dheader) - pos; - reused_delta++; - } else if (type == OBJ_REF_DELTA) { - if (limit && hdrlen + 20 + datalen + 20 >= limit) { - unuse_pack(&w_curs); - return 0; - } - sha1write(f, header, hdrlen); - sha1write(f, entry->delta->idx.sha1, 20); - hdrlen += 20; - reused_delta++; - } else { - if (limit && hdrlen + datalen + 20 >= limit) { - unuse_pack(&w_curs); - return 0; - } - sha1write(f, header, hdrlen); - } - copy_pack_data(f, p, &w_curs, offset, datalen); - unuse_pack(&w_curs); - reused++; - } if (usable_delta) written_delta++; written++; if (!pack_to_stdout) entry->idx.crc32 = crc32_end(f); - return hdrlen + datalen; + return len; } enum write_one_status { @@ -1327,7 +1349,7 @@ static void get_object_details(void) for (i = 0; i < nr_objects; i++) { struct object_entry *entry = sorted_by_offset[i]; check_object(entry); - if (big_file_threshold <= entry->size) + if (big_file_threshold < entry->size) entry->no_try_delta = 1; } diff --git a/builtin/push.c b/builtin/push.c index 19c40d7a55..fdfcc6c716 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -76,7 +76,44 @@ static int push_url_of_remote(struct remote *remote, const char ***url_p) return remote->url_nr; } -static void setup_push_upstream(struct remote *remote) +static NORETURN int die_push_simple(struct branch *branch, struct remote *remote) { + /* + * There's no point in using shorten_unambiguous_ref here, + * as the ambiguity would be on the remote side, not what + * we have locally. Plus, this is supposed to be the simple + * mode. If the user is doing something crazy like setting + * upstream to a non-branch, we should probably be showing + * them the big ugly fully qualified ref. + */ + const char *advice_maybe = ""; + const char *short_upstream = + skip_prefix(branch->merge[0]->src, "refs/heads/"); + + if (!short_upstream) + short_upstream = branch->merge[0]->src; + /* + * Don't show advice for people who explicitely set + * push.default. + */ + if (push_default == PUSH_DEFAULT_UNSPECIFIED) + advice_maybe = _("\n" + "To choose either option permanently, " + "see push.default in 'git help config'."); + die(_("The upstream branch of your current branch does not match\n" + "the name of your current branch. To push to the upstream branch\n" + "on the remote, use\n" + "\n" + " git push %s HEAD:%s\n" + "\n" + "To push to the branch of the same name on the remote, use\n" + "\n" + " git push %s %s\n" + "%s"), + remote->name, short_upstream, + remote->name, branch->name, advice_maybe); +} + +static void setup_push_upstream(struct remote *remote, int simple) { struct strbuf refspec = STRBUF_INIT; struct branch *branch = branch_get(NULL); @@ -103,6 +140,8 @@ static void setup_push_upstream(struct remote *remote) "your current branch '%s', without telling me what to push\n" "to update which remote branch."), remote->name, branch->name); + if (simple && strcmp(branch->refname, branch->merge[0]->src)) + die_push_simple(branch, remote); strbuf_addf(&refspec, "%s:%s", branch->name, branch->merge[0]->src); add_refspec(refspec.buf); @@ -119,8 +158,12 @@ static void setup_default_push_refspecs(struct remote *remote) add_refspec(":"); break; + case PUSH_DEFAULT_SIMPLE: + setup_push_upstream(remote, 1); + break; + case PUSH_DEFAULT_UPSTREAM: - setup_push_upstream(remote); + setup_push_upstream(remote, 0); break; case PUSH_DEFAULT_CURRENT: diff --git a/builtin/remote.c b/builtin/remote.c index b5645fe0ae..920262d76e 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -95,9 +95,9 @@ static int fetch_remote(const char *name) argv[1] = "-v"; argv[2] = name; } - printf("Updating %s\n", name); + printf_ln(_("Updating %s"), name); if (run_command_v_opt(argv, RUN_GIT_CMD)) - return error("Could not fetch %s", name); + return error(_("Could not fetch %s"), name); return 0; } @@ -127,8 +127,8 @@ static int add_branch(const char *key, const char *branchname, } static const char mirror_advice[] = -"--mirror is dangerous and deprecated; please\n" -"\t use --mirror=fetch or --mirror=push instead"; +N_("--mirror is dangerous and deprecated; please\n" + "\t use --mirror=fetch or --mirror=push instead"); static int parse_mirror_opt(const struct option *opt, const char *arg, int not) { @@ -136,7 +136,7 @@ static int parse_mirror_opt(const struct option *opt, const char *arg, int not) if (not) *mirror = MIRROR_NONE; else if (!arg) { - warning("%s", mirror_advice); + warning("%s", _(mirror_advice)); *mirror = MIRROR_BOTH; } else if (!strcmp(arg, "fetch")) @@ -144,7 +144,7 @@ static int parse_mirror_opt(const struct option *opt, const char *arg, int not) else if (!strcmp(arg, "push")) *mirror = MIRROR_PUSH; else - return error("unknown mirror argument: %s", arg); + return error(_("unknown mirror argument: %s"), arg); return 0; } @@ -182,9 +182,9 @@ static int add(int argc, const char **argv) usage_with_options(builtin_remote_add_usage, options); if (mirror && master) - die("specifying a master branch makes no sense with --mirror"); + die(_("specifying a master branch makes no sense with --mirror")); if (mirror && !(mirror & MIRROR_FETCH) && track.nr) - die("specifying branches to track makes sense only with fetch mirrors"); + die(_("specifying branches to track makes sense only with fetch mirrors")); name = argv[0]; url = argv[1]; @@ -192,11 +192,11 @@ static int add(int argc, const char **argv) remote = remote_get(name); if (remote && (remote->url_nr > 1 || strcmp(name, remote->url[0]) || remote->fetch_refspec_nr)) - die("remote %s already exists.", name); + die(_("remote %s already exists."), name); strbuf_addf(&buf2, "refs/heads/test:refs/remotes/%s/test", name); if (!valid_fetch_refspec(buf2.buf)) - die("'%s' is not a valid remote name", name); + die(_("'%s' is not a valid remote name"), name); strbuf_addf(&buf, "remote.%s.url", name); if (git_config_set(buf.buf, url)) @@ -240,7 +240,7 @@ static int add(int argc, const char **argv) strbuf_addf(&buf2, "refs/remotes/%s/%s", name, master); if (create_symref(buf.buf, buf2.buf, "remote add")) - return error("Could not setup master '%s'", master); + return error(_("Could not setup master '%s'"), master); } strbuf_release(&buf); @@ -296,7 +296,7 @@ static int config_read_branches(const char *key, const char *value, void *cb) info = item->util; if (type == REMOTE) { if (info->remote_name) - warning("more than one %s", orig_key); + warning(_("more than one %s"), orig_key); info->remote_name = xstrdup(value); } else if (type == MERGE) { char *space = strchr(value, ' '); @@ -336,7 +336,7 @@ static int get_ref_states(const struct ref *remote_refs, struct ref_states *stat for (i = 0; i < states->remote->fetch_refspec_nr; i++) if (get_fetch_map(remote_refs, states->remote->fetch + i, &tail, 1)) - die("Could not get fetch map for refspec %s", + die(_("Could not get fetch map for refspec %s"), states->remote->fetch_refspec[i]); states->new.strdup_strings = 1; @@ -437,7 +437,7 @@ static int get_push_ref_states_noquery(struct ref_states *states) states->push.strdup_strings = 1; if (!remote->push_refspec_nr) { - item = string_list_append(&states->push, "(matching)"); + item = string_list_append(&states->push, _("(matching)")); info = item->util = xcalloc(sizeof(struct push_info), 1); info->status = PUSH_STATUS_NOTQUERIED; info->dest = xstrdup(item->string); @@ -445,11 +445,11 @@ static int get_push_ref_states_noquery(struct ref_states *states) for (i = 0; i < remote->push_refspec_nr; i++) { struct refspec *spec = remote->push + i; if (spec->matching) - item = string_list_append(&states->push, "(matching)"); + item = string_list_append(&states->push, _("(matching)")); else if (strlen(spec->src)) item = string_list_append(&states->push, spec->src); else - item = string_list_append(&states->push, "(delete)"); + item = string_list_append(&states->push, _("(delete)")); info = item->util = xcalloc(sizeof(struct push_info), 1); info->forced = spec->force; @@ -592,19 +592,19 @@ static int migrate_file(struct remote *remote) strbuf_addf(&buf, "remote.%s.url", remote->name); for (i = 0; i < remote->url_nr; i++) if (git_config_set_multivar(buf.buf, remote->url[i], "^$", 0)) - return error("Could not append '%s' to '%s'", + return error(_("Could not append '%s' to '%s'"), remote->url[i], buf.buf); strbuf_reset(&buf); strbuf_addf(&buf, "remote.%s.push", remote->name); for (i = 0; i < remote->push_refspec_nr; i++) if (git_config_set_multivar(buf.buf, remote->push_refspec[i], "^$", 0)) - return error("Could not append '%s' to '%s'", + return error(_("Could not append '%s' to '%s'"), remote->push_refspec[i], buf.buf); strbuf_reset(&buf); strbuf_addf(&buf, "remote.%s.fetch", remote->name); for (i = 0; i < remote->fetch_refspec_nr; i++) if (git_config_set_multivar(buf.buf, remote->fetch_refspec[i], "^$", 0)) - return error("Could not append '%s' to '%s'", + return error(_("Could not append '%s' to '%s'"), remote->fetch_refspec[i], buf.buf); if (remote->origin == REMOTE_REMOTES) path = git_path("remotes/%s", remote->name); @@ -636,30 +636,30 @@ static int mv(int argc, const char **argv) oldremote = remote_get(rename.old); if (!oldremote) - die("No such remote: %s", rename.old); + die(_("No such remote: %s"), rename.old); if (!strcmp(rename.old, rename.new) && oldremote->origin != REMOTE_CONFIG) return migrate_file(oldremote); newremote = remote_get(rename.new); if (newremote && (newremote->url_nr > 1 || newremote->fetch_refspec_nr)) - die("remote %s already exists.", rename.new); + die(_("remote %s already exists."), rename.new); strbuf_addf(&buf, "refs/heads/test:refs/remotes/%s/test", rename.new); if (!valid_fetch_refspec(buf.buf)) - die("'%s' is not a valid remote name", rename.new); + die(_("'%s' is not a valid remote name"), rename.new); strbuf_reset(&buf); strbuf_addf(&buf, "remote.%s", rename.old); strbuf_addf(&buf2, "remote.%s", rename.new); if (git_config_rename_section(buf.buf, buf2.buf) < 1) - return error("Could not rename config section '%s' to '%s'", + return error(_("Could not rename config section '%s' to '%s'"), buf.buf, buf2.buf); strbuf_reset(&buf); strbuf_addf(&buf, "remote.%s.fetch", rename.new); if (git_config_set_multivar(buf.buf, NULL, NULL, 1)) - return error("Could not remove config section '%s'", buf.buf); + return error(_("Could not remove config section '%s'"), buf.buf); strbuf_addf(&old_remote_context, ":refs/remotes/%s/", rename.old); for (i = 0; i < oldremote->fetch_refspec_nr; i++) { char *ptr; @@ -674,13 +674,13 @@ static int mv(int argc, const char **argv) strlen(rename.old), rename.new, strlen(rename.new)); } else - warning("Not updating non-default fetch respec\n" - "\t%s\n" - "\tPlease update the configuration manually if necessary.", + warning(_("Not updating non-default fetch refspec\n" + "\t%s\n" + "\tPlease update the configuration manually if necessary."), buf2.buf); if (git_config_set_multivar(buf.buf, buf2.buf, "^$", 0)) - return error("Could not append '%s'", buf.buf); + return error(_("Could not append '%s'"), buf.buf); } read_branches(); @@ -691,7 +691,7 @@ static int mv(int argc, const char **argv) strbuf_reset(&buf); strbuf_addf(&buf, "branch.%s.remote", item->string); if (git_config_set(buf.buf, rename.new)) { - return error("Could not set '%s'", buf.buf); + return error(_("Could not set '%s'"), buf.buf); } } } @@ -713,7 +713,7 @@ static int mv(int argc, const char **argv) if (!(flag & REF_ISSYMREF)) continue; if (delete_ref(item->string, NULL, REF_NODEREF)) - die("deleting '%s' failed", item->string); + die(_("deleting '%s' failed"), item->string); } for (i = 0; i < remote_branches.nr; i++) { struct string_list_item *item = remote_branches.items + i; @@ -728,7 +728,7 @@ static int mv(int argc, const char **argv) strbuf_addf(&buf2, "remote: renamed %s to %s", item->string, buf.buf); if (rename_ref(item->string, buf.buf, buf2.buf)) - die("renaming '%s' failed", item->string); + die(_("renaming '%s' failed"), item->string); } for (i = 0; i < remote_branches.nr; i++) { struct string_list_item *item = remote_branches.items + i; @@ -747,7 +747,7 @@ static int mv(int argc, const char **argv) strbuf_addf(&buf3, "remote: renamed %s to %s", item->string, buf.buf); if (create_symref(buf.buf, buf2.buf, buf3.buf)) - die("creating '%s' failed", buf.buf); + die(_("creating '%s' failed"), buf.buf); } return 0; } @@ -761,7 +761,7 @@ static int remove_branches(struct string_list *branches) unsigned char *sha1 = item->util; if (delete_ref(refname, sha1, 0)) - result |= error("Could not remove branch %s", refname); + result |= error(_("Could not remove branch %s"), refname); } return result; } @@ -789,14 +789,14 @@ static int rm(int argc, const char **argv) remote = remote_get(argv[1]); if (!remote) - die("No such remote: %s", argv[1]); + die(_("No such remote: %s"), argv[1]); known_remotes.to_delete = remote; for_each_remote(add_known_remote, &known_remotes); strbuf_addf(&buf, "remote.%s", remote->name); if (git_config_rename_section(buf.buf, NULL) < 1) - return error("Could not remove config section '%s'", buf.buf); + return error(_("Could not remove config section '%s'"), buf.buf); read_branches(); for (i = 0; i < branch_list.nr; i++) { @@ -830,11 +830,12 @@ static int rm(int argc, const char **argv) string_list_clear(&branches, 1); if (skipped.nr) { - fprintf(stderr, skipped.nr == 1 ? - "Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" - "to delete it, use:\n" : - "Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n" - "to delete them, use:\n"); + fprintf_ln(stderr, + Q_("Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" + "to delete it, use:", + "Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n" + "to delete them, use:", + skipped.nr)); for (i = 0; i < skipped.nr; i++) fprintf(stderr, " git branch -d %s\n", skipped.items[i].string); @@ -886,7 +887,7 @@ static int get_remote_ref_states(const char *name, states->remote = remote_get(name); if (!states->remote) - return error("No such remote: %s", name); + return error(_("No such remote: %s"), name); read_branches(); @@ -939,14 +940,14 @@ static int show_remote_info_item(struct string_list_item *item, void *cb_data) const char *fmt = "%s"; const char *arg = ""; if (string_list_has_string(&states->new, name)) { - fmt = " new (next fetch will store in remotes/%s)"; + fmt = _(" new (next fetch will store in remotes/%s)"); arg = states->remote->name; } else if (string_list_has_string(&states->tracked, name)) - arg = " tracked"; + arg = _(" tracked"); else if (string_list_has_string(&states->stale, name)) - arg = " stale (use 'git remote prune' to remove)"; + arg = _(" stale (use 'git remote prune' to remove)"); else - arg = " ???"; + arg = _(" ???"); printf(" %-*s", info->width, name); printf(fmt, arg); printf("\n"); @@ -987,21 +988,21 @@ static int show_local_info_item(struct string_list_item *item, void *cb_data) int i; if (branch_info->rebase && branch_info->merge.nr > 1) { - error("invalid branch.%s.merge; cannot rebase onto > 1 branch", + error(_("invalid branch.%s.merge; cannot rebase onto > 1 branch"), item->string); return 0; } printf(" %-*s ", show_info->width, item->string); if (branch_info->rebase) { - printf("rebases onto remote %s\n", merge->items[0].string); + printf_ln(_("rebases onto remote %s"), merge->items[0].string); return 0; } else if (show_info->any_rebase) { - printf(" merges with remote %s\n", merge->items[0].string); - also = " and with remote"; + printf_ln(_(" merges with remote %s"), merge->items[0].string); + also = _(" and with remote"); } else { - printf("merges with remote %s\n", merge->items[0].string); - also = " and with remote"; + printf_ln(_("merges with remote %s"), merge->items[0].string); + also = _(" and with remote"); } for (i = 1; i < merge->nr; i++) printf(" %-*s %s %s\n", show_info->width, "", also, @@ -1043,36 +1044,43 @@ static int show_push_info_item(struct string_list_item *item, void *cb_data) { struct show_info *show_info = cb_data; struct push_info *push_info = item->util; - char *src = item->string, *status = NULL; + const char *src = item->string, *status = NULL; switch (push_info->status) { case PUSH_STATUS_CREATE: - status = "create"; + status = _("create"); break; case PUSH_STATUS_DELETE: - status = "delete"; - src = "(none)"; + status = _("delete"); + src = _("(none)"); break; case PUSH_STATUS_UPTODATE: - status = "up to date"; + status = _("up to date"); break; case PUSH_STATUS_FASTFORWARD: - status = "fast-forwardable"; + status = _("fast-forwardable"); break; case PUSH_STATUS_OUTOFDATE: - status = "local out of date"; + status = _("local out of date"); break; case PUSH_STATUS_NOTQUERIED: break; } - if (status) - printf(" %-*s %s to %-*s (%s)\n", show_info->width, src, - push_info->forced ? "forces" : "pushes", - show_info->width2, push_info->dest, status); - else - printf(" %-*s %s to %s\n", show_info->width, src, - push_info->forced ? "forces" : "pushes", - push_info->dest); + if (status) { + if (push_info->forced) + printf_ln(_(" %-*s forces to %-*s (%s)"), show_info->width, src, + show_info->width2, push_info->dest, status); + else + printf_ln(_(" %-*s pushes to %-*s (%s)"), show_info->width, src, + show_info->width2, push_info->dest, status); + } else { + if (push_info->forced) + printf_ln(_(" %-*s forces to %s"), show_info->width, src, + push_info->dest); + else + printf_ln(_(" %-*s pushes to %s"), show_info->width, src, + push_info->dest); + } return 0; } @@ -1107,9 +1115,9 @@ static int show(int argc, const char **argv) get_remote_ref_states(*argv, &states, query_flag); - printf("* remote %s\n", *argv); - printf(" Fetch URL: %s\n", states.remote->url_nr > 0 ? - states.remote->url[0] : "(no URL)"); + printf_ln(_("* remote %s"), *argv); + printf_ln(_(" Fetch URL: %s"), states.remote->url_nr > 0 ? + states.remote->url[0] : _("(no URL)")); if (states.remote->pushurl_nr) { url = states.remote->pushurl; url_nr = states.remote->pushurl_nr; @@ -1118,18 +1126,18 @@ static int show(int argc, const char **argv) url_nr = states.remote->url_nr; } for (i = 0; i < url_nr; i++) - printf(" Push URL: %s\n", url[i]); + printf_ln(_(" Push URL: %s"), url[i]); if (!i) - printf(" Push URL: %s\n", "(no URL)"); + printf_ln(_(" Push URL: %s"), "(no URL)"); if (no_query) - printf(" HEAD branch: (not queried)\n"); + printf_ln(_(" HEAD branch: %s"), "(not queried)"); else if (!states.heads.nr) - printf(" HEAD branch: (unknown)\n"); + printf_ln(_(" HEAD branch: %s"), "(unknown)"); else if (states.heads.nr == 1) - printf(" HEAD branch: %s\n", states.heads.items[0].string); + printf_ln(_(" HEAD branch: %s"), states.heads.items[0].string); else { - printf(" HEAD branch (remote HEAD is ambiguous," - " may be one of the following):\n"); + printf(_(" HEAD branch (remote HEAD is ambiguous," + " may be one of the following):\n")); for (i = 0; i < states.heads.nr; i++) printf(" %s\n", states.heads.items[i].string); } @@ -1140,9 +1148,10 @@ static int show(int argc, const char **argv) for_each_string_list(&states.tracked, add_remote_to_show_info, &info); for_each_string_list(&states.stale, add_remote_to_show_info, &info); if (info.list->nr) - printf(" Remote branch%s:%s\n", - info.list->nr > 1 ? "es" : "", - no_query ? " (status not queried)" : ""); + printf_ln(Q_(" Remote branch:%s", + " Remote branches:%s", + info.list->nr), + no_query ? _(" (status not queried)") : ""); for_each_string_list(info.list, show_remote_info_item, &info); string_list_clear(info.list, 0); @@ -1151,23 +1160,25 @@ static int show(int argc, const char **argv) info.any_rebase = 0; for_each_string_list(&branch_list, add_local_to_show_info, &info); if (info.list->nr) - printf(" Local branch%s configured for 'git pull':\n", - info.list->nr > 1 ? "es" : ""); + printf_ln(Q_(" Local branch configured for 'git pull':", + " Local branches configured for 'git pull':", + info.list->nr)); for_each_string_list(info.list, show_local_info_item, &info); string_list_clear(info.list, 0); /* git push info */ if (states.remote->mirror) - printf(" Local refs will be mirrored by 'git push'\n"); + printf_ln(_(" Local refs will be mirrored by 'git push'")); info.width = info.width2 = 0; for_each_string_list(&states.push, add_push_to_show_info, &info); qsort(info.list->items, info.list->nr, sizeof(*info.list->items), cmp_string_with_push); if (info.list->nr) - printf(" Local ref%s configured for 'git push'%s:\n", - info.list->nr > 1 ? "s" : "", - no_query ? " (status not queried)" : ""); + printf_ln(Q_(" Local ref configured for 'git push'%s:", + " Local refs configured for 'git push'%s:", + info.list->nr), + no_query ? _(" (status not queried)") : ""); for_each_string_list(info.list, show_push_info_item, &info); string_list_clear(info.list, 0); @@ -1202,10 +1213,10 @@ static int set_head(int argc, const char **argv) memset(&states, 0, sizeof(states)); get_remote_ref_states(argv[0], &states, GET_HEAD_NAMES); if (!states.heads.nr) - result |= error("Cannot determine remote HEAD"); + result |= error(_("Cannot determine remote HEAD")); else if (states.heads.nr > 1) { - result |= error("Multiple remote HEAD branches. " - "Please choose one explicitly with:"); + result |= error(_("Multiple remote HEAD branches. " + "Please choose one explicitly with:")); for (i = 0; i < states.heads.nr; i++) fprintf(stderr, " git remote set-head %s %s\n", argv[0], states.heads.items[i].string); @@ -1214,7 +1225,7 @@ static int set_head(int argc, const char **argv) free_remote_ref_states(&states); } else if (opt_d && !opt_a && argc == 1) { if (delete_ref(buf.buf, NULL, REF_NODEREF)) - result |= error("Could not delete %s", buf.buf); + result |= error(_("Could not delete %s"), buf.buf); } else usage_with_options(builtin_remote_sethead_usage, options); @@ -1222,9 +1233,9 @@ static int set_head(int argc, const char **argv) strbuf_addf(&buf2, "refs/remotes/%s/%s", argv[0], head_name); /* make sure it's valid */ if (!ref_exists(buf2.buf)) - result |= error("Not a valid ref: %s", buf2.buf); + result |= error(_("Not a valid ref: %s"), buf2.buf); else if (create_symref(buf.buf, buf2.buf, "remote set-head")) - result |= error("Could not setup %s", buf.buf); + result |= error(_("Could not setup %s"), buf.buf); if (opt_a) printf("%s/HEAD set to %s\n", argv[0], head_name); free(head_name); @@ -1260,18 +1271,18 @@ static int prune_remote(const char *remote, int dry_run) int result = 0, i; struct ref_states states; const char *dangling_msg = dry_run - ? " %s will become dangling!\n" - : " %s has become dangling!\n"; + ? _(" %s will become dangling!") + : _(" %s has become dangling!"); memset(&states, 0, sizeof(states)); get_remote_ref_states(remote, &states, GET_REF_STATES); if (states.stale.nr) { - printf("Pruning %s\n", remote); - printf("URL: %s\n", + printf_ln(_("Pruning %s"), remote); + printf_ln(_("URL: %s"), states.remote->url_nr ? states.remote->url[0] - : "(no URL)"); + : _("(no URL)")); } for (i = 0; i < states.stale.nr; i++) { @@ -1280,8 +1291,12 @@ static int prune_remote(const char *remote, int dry_run) if (!dry_run) result |= delete_ref(refname, NULL, 0); - printf(" * [%s] %s\n", dry_run ? "would prune" : "pruned", - abbrev_ref(refname, "refs/remotes/")); + if (dry_run) + printf_ln(_(" * [would prune] %s"), + abbrev_ref(refname, "refs/remotes/")); + else + printf_ln(_(" * [pruned] %s"), + abbrev_ref(refname, "refs/remotes/")); warn_dangling_symref(stdout, dangling_msg, refname); } @@ -1369,7 +1384,7 @@ static int set_remote_branches(const char *remotename, const char **branches, strbuf_addf(&key, "remote.%s.fetch", remotename); if (!remote_is_configured(remotename)) - die("No such remote '%s'", remotename); + die(_("No such remote '%s'"), remotename); remote = remote_get(remotename); if (!add_mode && remove_all_fetch_refspecs(remotename, key.buf)) { @@ -1396,7 +1411,7 @@ static int set_branches(int argc, const char **argv) argc = parse_options(argc, argv, NULL, options, builtin_remote_setbranches_usage, 0); if (argc == 0) { - error("no remote specified"); + error(_("no remote specified")); usage_with_options(builtin_remote_setbranches_usage, options); } argv[argc] = NULL; @@ -1429,7 +1444,7 @@ static int set_url(int argc, const char **argv) PARSE_OPT_KEEP_ARGV0); if (add_mode && delete_mode) - die("--add --delete doesn't make sense"); + die(_("--add --delete doesn't make sense")); if (argc < 3 || argc > 4 || ((add_mode || delete_mode) && argc != 3)) usage_with_options(builtin_remote_seturl_usage, options); @@ -1443,7 +1458,7 @@ static int set_url(int argc, const char **argv) oldurl = newurl; if (!remote_is_configured(remotename)) - die("No such remote '%s'", remotename); + die(_("No such remote '%s'"), remotename); remote = remote_get(remotename); if (push_mode) { @@ -1469,7 +1484,7 @@ static int set_url(int argc, const char **argv) /* Old URL specified. Demand that one matches. */ if (regcomp(&old_regex, oldurl, REG_EXTENDED)) - die("Invalid old URL pattern: %s", oldurl); + die(_("Invalid old URL pattern: %s"), oldurl); for (i = 0; i < urlset_nr; i++) if (!regexec(&old_regex, urlset[i], 0, NULL, 0)) @@ -1477,9 +1492,9 @@ static int set_url(int argc, const char **argv) else negative_matches++; if (!delete_mode && !matches) - die("No such URL found: %s", oldurl); + die(_("No such URL found: %s"), oldurl); if (delete_mode && !negative_matches && !push_mode) - die("Will not delete all non-push URLs"); + die(_("Will not delete all non-push URLs")); regfree(&old_regex); @@ -1580,7 +1595,7 @@ int cmd_remote(int argc, const char **argv, const char *prefix) else if (!strcmp(argv[0], "update")) result = update(argc, argv); else { - error("Unknown subcommand: %s", argv[0]); + error(_("Unknown subcommand: %s"), argv[0]); usage_with_options(builtin_remote_usage, options); } diff --git a/builtin/rev-list.c b/builtin/rev-list.c index 4c4d404afc..ff5a38372d 100644 --- a/builtin/rev-list.c +++ b/builtin/rev-list.c @@ -109,6 +109,7 @@ static void show_commit(struct commit *commit, void *data) struct pretty_print_context ctx = {0}; ctx.abbrev = revs->abbrev; ctx.date_mode = revs->date_mode; + ctx.date_mode_explicit = revs->date_mode_explicit; ctx.fmt = revs->commit_format; pretty_print_commit(&ctx, commit, &buf); if (revs->graph) { diff --git a/builtin/send-pack.c b/builtin/send-pack.c index 9df341c793..d5d7105ba2 100644 --- a/builtin/send-pack.c +++ b/builtin/send-pack.c @@ -410,6 +410,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) const char *receivepack = "git-receive-pack"; int flags; int nonfastforward = 0; + int progress = -1; argv++; for (i = 1; i < argc; i++, argv++) { @@ -452,6 +453,14 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) args.verbose = 1; continue; } + if (!strcmp(arg, "--progress")) { + progress = 1; + continue; + } + if (!strcmp(arg, "--no-progress")) { + progress = 0; + continue; + } if (!strcmp(arg, "--thin")) { args.use_thin_pack = 1; continue; @@ -492,6 +501,10 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix) } } + if (progress == -1) + progress = !args.quiet && isatty(2); + args.progress = progress; + if (args.stateless_rpc) { conn = NULL; fd[0] = 0; diff --git a/builtin/tag.c b/builtin/tag.c index fe7e5e5b3d..7b1be85e48 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -16,6 +16,7 @@ #include "revision.h" #include "gpg-interface.h" #include "sha1-array.h" +#include "column.h" static const char * const git_tag_usage[] = { "git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]", @@ -33,6 +34,7 @@ struct tag_filter { }; static struct sha1_array points_at; +static unsigned int colopts; static int match_pattern(const char **patterns, const char *ref) { @@ -263,6 +265,8 @@ static int git_tag_config(const char *var, const char *value, void *cb) int status = git_gpg_config(var, value, cb); if (status) return status; + if (!prefixcmp(var, "column.")) + return git_column_config(var, value, "tag", &colopts); return git_default_config(var, value, cb); } @@ -328,7 +332,7 @@ static void create_tag(const unsigned char *object, const char *tag, sha1_to_hex(object), typename(type), tag, - git_committer_info(IDENT_ERROR_ON_NO_NAME)); + git_committer_info(IDENT_STRICT)); if (header_len > sizeof(header_buf) - 1) die(_("tag header too big.")); @@ -459,6 +463,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix) OPT_STRING('u', "local-user", &keyid, "key-id", "use another key to sign the tag"), OPT__FORCE(&force, "replace the tag if exists"), + OPT_COLUMN(0, "column", &colopts, "show tag list in columns"), OPT_GROUP("Tag listing options"), { @@ -495,9 +500,25 @@ int cmd_tag(int argc, const char **argv, const char *prefix) if (list + delete + verify > 1) usage_with_options(git_tag_usage, options); - if (list) - return list_tags(argv, lines == -1 ? 0 : lines, - with_commit); + finalize_colopts(&colopts, -1); + if (list && lines != -1) { + if (explicitly_enable_column(colopts)) + die(_("--column and -n are incompatible")); + colopts = 0; + } + if (list) { + int ret; + if (column_active(colopts)) { + struct column_options copts; + memset(&copts, 0, sizeof(copts)); + copts.padding = 2; + run_column_filter(colopts, &copts); + } + ret = list_tags(argv, lines == -1 ? 0 : lines, with_commit); + if (column_active(colopts)) + stop_column_filter(); + return ret; + } if (lines != -1) die(_("-n option is only allowed with -l.")); if (with_commit) diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c index 14e04e6795..2217d7b3ae 100644 --- a/builtin/unpack-objects.c +++ b/builtin/unpack-objects.c @@ -107,7 +107,7 @@ static void *get_data(unsigned long size) if (stream.total_out == size && ret == Z_STREAM_END) break; if (ret != Z_OK) { - error("inflate returned %d\n", ret); + error("inflate returned %d", ret); free(buf); buf = NULL; if (!recover) diff --git a/builtin/update-index.c b/builtin/update-index.c index a6a23fa1f3..5f038d64da 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -708,6 +708,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) int newfd, entries, has_errors = 0, line_termination = '\n'; int read_from_stdin = 0; int prefix_length = prefix ? strlen(prefix) : 0; + int preferred_index_format = 0; char set_executable_bit = 0; struct refresh_params refresh_args = {0, &has_errors}; int lock_error = 0; @@ -791,6 +792,8 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) "(for porcelains) forget saved unresolved conflicts", PARSE_OPT_NOARG | PARSE_OPT_NONEG, resolve_undo_clear_callback}, + OPT_INTEGER(0, "index-version", &preferred_index_format, + "write index in this format"), OPT_END() }; @@ -851,6 +854,17 @@ int cmd_update_index(int argc, const char **argv, const char *prefix) } } argc = parse_options_end(&ctx); + if (preferred_index_format) { + if (preferred_index_format < INDEX_FORMAT_LB || + INDEX_FORMAT_UB < preferred_index_format) + die("index-version %d not in range: %d..%d", + preferred_index_format, + INDEX_FORMAT_LB, INDEX_FORMAT_UB); + + if (the_index.version != preferred_index_format) + active_cache_changed = 1; + the_index.version = preferred_index_format; + } if (read_from_stdin) { struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT; diff --git a/builtin/var.c b/builtin/var.c index 99d068a532..aedbb53a2d 100644 --- a/builtin/var.c +++ b/builtin/var.c @@ -11,7 +11,7 @@ static const char *editor(int flag) { const char *pgm = git_editor(); - if (!pgm && flag & IDENT_ERROR_ON_NO_NAME) + if (!pgm && flag & IDENT_STRICT) die("Terminal is dumb, but EDITOR unset"); return pgm; @@ -55,7 +55,7 @@ static const char *read_var(const char *var) val = NULL; for (ptr = git_vars; ptr->read; ptr++) { if (strcmp(var, ptr->name) == 0) { - val = ptr->read(IDENT_ERROR_ON_NO_NAME); + val = ptr->read(IDENT_STRICT); break; } } @@ -33,7 +33,7 @@ static int parse_bundle_header(int fd, struct bundle_header *header, if (strbuf_getwholeline_fd(&buf, fd, '\n') || strcmp(buf.buf, bundle_signature)) { if (report_path) - error("'%s' does not look like a v2 bundle file", + error(_("'%s' does not look like a v2 bundle file"), report_path); status = -1; goto abort; @@ -60,7 +60,7 @@ static int parse_bundle_header(int fd, struct bundle_header *header, (40 <= buf.len && !isspace(buf.buf[40])) || (!is_prereq && buf.len <= 40)) { if (report_path) - error("unrecognized header: %s%s (%d)", + error(_("unrecognized header: %s%s (%d)"), (is_prereq ? "-" : ""), buf.buf, (int)buf.len); status = -1; break; @@ -86,7 +86,7 @@ int read_bundle_header(const char *path, struct bundle_header *header) int fd = open(path, O_RDONLY); if (fd < 0) - return error("could not open '%s'", path); + return error(_("could not open '%s'"), path); return parse_bundle_header(fd, header, path); } @@ -137,7 +137,7 @@ int verify_bundle(struct bundle_header *header, int verbose) struct object_array refs; struct commit *commit; int i, ret = 0, req_nr; - const char *message = "Repository lacks these prerequisite commits:"; + const char *message = _("Repository lacks these prerequisite commits:"); init_revisions(&revs, NULL); for (i = 0; i < p->nr; i++) { @@ -161,7 +161,7 @@ int verify_bundle(struct bundle_header *header, int verbose) revs.leak_pending = 1; if (prepare_revision_walk(&revs)) - die("revision walk setup failed"); + die(_("revision walk setup failed")); i = req_nr; while (i && (commit = get_revision(&revs))) @@ -183,12 +183,16 @@ int verify_bundle(struct bundle_header *header, int verbose) struct ref_list *r; r = &header->references; - printf("The bundle contains %d ref%s\n", - r->nr, (1 < r->nr) ? "s" : ""); + printf_ln(Q_("The bundle contains %d ref", + "The bundle contains %d refs", + r->nr), + r->nr); list_refs(r, 0, NULL); r = &header->prerequisites; - printf("The bundle requires these %d ref%s\n", - r->nr, (1 < r->nr) ? "s" : ""); + printf_ln(Q_("The bundle requires this ref", + "The bundle requires these %d refs", + r->nr), + r->nr); list_refs(r, 0, NULL); } return ret; @@ -283,13 +287,13 @@ int create_bundle(struct bundle_header *header, const char *path, strbuf_release(&buf); fclose(rls_fout); if (finish_command(&rls)) - return error("rev-list died"); + return error(_("rev-list died")); /* write references */ argc = setup_revisions(argc, argv, &revs, NULL); if (argc > 1) - return error("unrecognized argument: %s", argv[1]); + return error(_("unrecognized argument: %s"), argv[1]); object_array_remove_duplicates(&revs.pending); @@ -324,7 +328,7 @@ int create_bundle(struct bundle_header *header, const char *path, * constraints. */ if (!(e->item->flags & SHOWN) && e->item->type == OBJ_COMMIT) { - warning("ref '%s' is excluded by the rev-list options", + warning(_("ref '%s' is excluded by the rev-list options"), e->name); free(ref); continue; @@ -369,7 +373,7 @@ int create_bundle(struct bundle_header *header, const char *path, free(ref); } if (!ref_count) - die ("Refusing to create empty bundle."); + die(_("Refusing to create empty bundle.")); /* end header */ write_or_die(bundle_fd, "\n", 1); @@ -387,7 +391,7 @@ int create_bundle(struct bundle_header *header, const char *path, rls.out = bundle_fd; rls.git_cmd = 1; if (start_command(&rls)) - return error("Could not spawn pack-objects"); + return error(_("Could not spawn pack-objects")); /* * start_command closed bundle_fd if it was > 1 @@ -405,10 +409,10 @@ int create_bundle(struct bundle_header *header, const char *path, } close(rls.in); if (finish_command(&rls)) - return error ("pack-objects died"); + return error(_("pack-objects died")); if (!bundle_to_stdout) { if (commit_lock_file(&lock)) - die_errno("cannot create '%s'", path); + die_errno(_("cannot create '%s'"), path); } return 0; } @@ -430,6 +434,6 @@ int unbundle(struct bundle_header *header, int bundle_fd, int flags) ip.no_stdout = 1; ip.git_cmd = 1; if (run_command(&ip)) - return error("index-pack died"); + return error(_("index-pack died")); return 0; } @@ -105,6 +105,9 @@ struct cache_header { unsigned int hdr_entries; }; +#define INDEX_FORMAT_LB 2 +#define INDEX_FORMAT_UB 4 + /* * The "cache_time" is just the low 32 bits of the * time. It doesn't matter if it overflows - we only @@ -115,48 +118,6 @@ struct cache_time { unsigned int nsec; }; -/* - * dev/ino/uid/gid/size are also just tracked to the low 32 bits - * Again - this is just a (very strong in practice) heuristic that - * the inode hasn't changed. - * - * We save the fields in big-endian order to allow using the - * index file over NFS transparently. - */ -struct ondisk_cache_entry { - struct cache_time ctime; - struct cache_time mtime; - unsigned int dev; - unsigned int ino; - unsigned int mode; - unsigned int uid; - unsigned int gid; - unsigned int size; - unsigned char sha1[20]; - unsigned short flags; - char name[FLEX_ARRAY]; /* more */ -}; - -/* - * This struct is used when CE_EXTENDED bit is 1 - * The struct must match ondisk_cache_entry exactly from - * ctime till flags - */ -struct ondisk_cache_entry_extended { - struct cache_time ctime; - struct cache_time mtime; - unsigned int dev; - unsigned int ino; - unsigned int mode; - unsigned int uid; - unsigned int gid; - unsigned int size; - unsigned char sha1[20]; - unsigned short flags; - unsigned short flags2; - char name[FLEX_ARRAY]; /* more */ -}; - struct cache_entry { struct cache_time ce_ctime; struct cache_time ce_mtime; @@ -253,9 +214,6 @@ static inline size_t ce_namelen(const struct cache_entry *ce) } #define ce_size(ce) cache_entry_size(ce_namelen(ce)) -#define ondisk_ce_size(ce) (((ce)->ce_flags & CE_EXTENDED) ? \ - ondisk_cache_entry_extended_size(ce_namelen(ce)) : \ - ondisk_cache_entry_size(ce_namelen(ce))) #define ce_stage(ce) ((CE_STAGEMASK & (ce)->ce_flags) >> CE_STAGESHIFT) #define ce_uptodate(ce) ((ce)->ce_flags & CE_UPTODATE) #define ce_skip_worktree(ce) ((ce)->ce_flags & CE_SKIP_WORKTREE) @@ -306,13 +264,11 @@ static inline unsigned int canon_mode(unsigned int mode) return S_IFGITLINK; } -#define flexible_size(STRUCT,len) ((offsetof(struct STRUCT,name) + (len) + 8) & ~7) #define cache_entry_size(len) (offsetof(struct cache_entry,name) + (len) + 1) -#define ondisk_cache_entry_size(len) flexible_size(ondisk_cache_entry,len) -#define ondisk_cache_entry_extended_size(len) flexible_size(ondisk_cache_entry_extended,len) struct index_state { struct cache_entry **cache; + unsigned int version; unsigned int cache_nr, cache_alloc, cache_changed; struct string_list *resolve_undo; struct cache_tree *cache_tree; @@ -624,6 +580,7 @@ enum rebase_setup_type { enum push_default_type { PUSH_DEFAULT_NOTHING = 0, PUSH_DEFAULT_MATCHING, + PUSH_DEFAULT_SIMPLE, PUSH_DEFAULT_UPSTREAM, PUSH_DEFAULT_CURRENT, PUSH_DEFAULT_UNSPECIFIED @@ -920,10 +877,8 @@ enum date_mode { }; const char *show_date(unsigned long time, int timezone, enum date_mode mode); -const char *show_date_relative(unsigned long time, int tz, - const struct timeval *now, - char *timebuf, - size_t timebuf_size); +void show_date_relative(unsigned long time, int tz, const struct timeval *now, + struct strbuf *timebuf); int parse_date(const char *date, char *buf, int bufsize); int parse_date_basic(const char *date, unsigned long *timestamp, int *offset); void datestamp(char *buf, int bufsize); @@ -932,15 +887,19 @@ unsigned long approxidate_careful(const char *, int *); unsigned long approxidate_relative(const char *date, const struct timeval *now); enum date_mode parse_date_format(const char *format); -#define IDENT_WARN_ON_NO_NAME 1 -#define IDENT_ERROR_ON_NO_NAME 2 -#define IDENT_NO_DATE 4 +#define IDENT_STRICT 1 +#define IDENT_NO_DATE 2 +#define IDENT_NO_NAME 4 extern const char *git_author_info(int); extern const char *git_committer_info(int); extern const char *fmt_ident(const char *name, const char *email, const char *date_str, int); extern const char *fmt_name(const char *name, const char *email); +extern const char *ident_default_name(void); +extern const char *ident_default_email(void); +extern const char *ident_default_date(void); extern const char *git_editor(void); extern const char *git_pager(int stdout_is_tty); +extern int git_ident_config(const char *, const char *, void *); struct ident_split { const char *name_begin; @@ -992,6 +951,7 @@ extern struct alternate_object_database { char base[FLEX_ARRAY]; /* more */ } *alt_odb_list; extern void prepare_alt_odb(void); +extern void read_info_alternates(const char * relative_base, int depth); extern void add_to_alternates_file(const char *reference); typedef int alt_odb_fn(struct alternate_object_database *, void *); extern void foreach_alt_odb(alt_odb_fn, void*); @@ -1183,9 +1143,6 @@ struct config_include_data { #define CONFIG_INCLUDE_INIT { 0 } extern int git_config_include(const char *name, const char *value, void *data); -#define MAX_GITNAME (1000) -extern char git_default_email[MAX_GITNAME]; -extern char git_default_name[MAX_GITNAME]; #define IDENT_NAME_GIVEN 01 #define IDENT_MAIL_GIVEN 02 #define IDENT_ALL_GIVEN (IDENT_NAME_GIVEN|IDENT_MAIL_GIVEN) diff --git a/column.c b/column.c new file mode 100644 index 0000000000..9367ba5db5 --- /dev/null +++ b/column.c @@ -0,0 +1,434 @@ +#include "cache.h" +#include "column.h" +#include "string-list.h" +#include "parse-options.h" +#include "run-command.h" +#include "utf8.h" + +#define XY2LINEAR(d, x, y) (COL_LAYOUT((d)->colopts) == COL_COLUMN ? \ + (x) * (d)->rows + (y) : \ + (y) * (d)->cols + (x)) + +struct column_data { + const struct string_list *list; + unsigned int colopts; + struct column_options opts; + + int rows, cols; + int *len; /* cell length */ + int *width; /* index to the longest row in column */ +}; + +/* return length of 's' in letters, ANSI escapes stripped */ +static int item_length(unsigned int colopts, const char *s) +{ + int len, i = 0; + struct strbuf str = STRBUF_INIT; + + strbuf_addstr(&str, s); + while ((s = strstr(str.buf + i, "\033[")) != NULL) { + int len = strspn(s + 2, "0123456789;"); + i = s - str.buf; + strbuf_remove(&str, i, len + 3); /* \033[<len><func char> */ + } + len = utf8_strwidth(str.buf); + strbuf_release(&str); + return len; +} + +/* + * Calculate cell width, rows and cols for a table of equal cells, given + * table width and how many spaces between cells. + */ +static void layout(struct column_data *data, int *width) +{ + int i; + + *width = 0; + for (i = 0; i < data->list->nr; i++) + if (*width < data->len[i]) + *width = data->len[i]; + + *width += data->opts.padding; + + data->cols = (data->opts.width - strlen(data->opts.indent)) / *width; + if (data->cols == 0) + data->cols = 1; + + data->rows = DIV_ROUND_UP(data->list->nr, data->cols); +} + +static void compute_column_width(struct column_data *data) +{ + int i, x, y; + for (x = 0; x < data->cols; x++) { + data->width[x] = XY2LINEAR(data, x, 0); + for (y = 0; y < data->rows; y++) { + i = XY2LINEAR(data, x, y); + if (i < data->list->nr && + data->len[data->width[x]] < data->len[i]) + data->width[x] = i; + } + } +} + +/* + * Shrink all columns by shortening them one row each time (and adding + * more columns along the way). Hopefully the longest cell will be + * moved to the next column, column is shrunk so we have more space + * for new columns. The process ends when the whole thing no longer + * fits in data->total_width. + */ +static void shrink_columns(struct column_data *data) +{ + data->width = xrealloc(data->width, + sizeof(*data->width) * data->cols); + while (data->rows > 1) { + int x, total_width, cols, rows; + rows = data->rows; + cols = data->cols; + + data->rows--; + data->cols = DIV_ROUND_UP(data->list->nr, data->rows); + if (data->cols != cols) + data->width = xrealloc(data->width, + sizeof(*data->width) * data->cols); + compute_column_width(data); + + total_width = strlen(data->opts.indent); + for (x = 0; x < data->cols; x++) { + total_width += data->len[data->width[x]]; + total_width += data->opts.padding; + } + if (total_width > data->opts.width) { + data->rows = rows; + data->cols = cols; + break; + } + } + compute_column_width(data); +} + +/* Display without layout when not enabled */ +static void display_plain(const struct string_list *list, + const char *indent, const char *nl) +{ + int i; + + for (i = 0; i < list->nr; i++) + printf("%s%s%s", indent, list->items[i].string, nl); +} + +/* Print a cell to stdout with all necessary leading/traling space */ +static int display_cell(struct column_data *data, int initial_width, + const char *empty_cell, int x, int y) +{ + int i, len, newline; + + i = XY2LINEAR(data, x, y); + if (i >= data->list->nr) + return -1; + + len = data->len[i]; + if (data->width && data->len[data->width[x]] < initial_width) { + /* + * empty_cell has initial_width chars, if real column + * is narrower, increase len a bit so we fill less + * space. + */ + len += initial_width - data->len[data->width[x]]; + len -= data->opts.padding; + } + + if (COL_LAYOUT(data->colopts) == COL_COLUMN) + newline = i + data->rows >= data->list->nr; + else + newline = x == data->cols - 1 || i == data->list->nr - 1; + + printf("%s%s%s", + x == 0 ? data->opts.indent : "", + data->list->items[i].string, + newline ? data->opts.nl : empty_cell + len); + return 0; +} + +/* Display COL_COLUMN or COL_ROW */ +static void display_table(const struct string_list *list, + unsigned int colopts, + const struct column_options *opts) +{ + struct column_data data; + int x, y, i, initial_width; + char *empty_cell; + + memset(&data, 0, sizeof(data)); + data.list = list; + data.colopts = colopts; + data.opts = *opts; + + data.len = xmalloc(sizeof(*data.len) * list->nr); + for (i = 0; i < list->nr; i++) + data.len[i] = item_length(colopts, list->items[i].string); + + layout(&data, &initial_width); + + if (colopts & COL_DENSE) + shrink_columns(&data); + + empty_cell = xmalloc(initial_width + 1); + memset(empty_cell, ' ', initial_width); + empty_cell[initial_width] = '\0'; + for (y = 0; y < data.rows; y++) { + for (x = 0; x < data.cols; x++) + if (display_cell(&data, initial_width, empty_cell, x, y)) + break; + } + + free(data.len); + free(data.width); + free(empty_cell); +} + +void print_columns(const struct string_list *list, unsigned int colopts, + const struct column_options *opts) +{ + struct column_options nopts; + + if (!list->nr) + return; + assert((colopts & COL_ENABLE_MASK) != COL_AUTO); + + memset(&nopts, 0, sizeof(nopts)); + nopts.indent = opts && opts->indent ? opts->indent : ""; + nopts.nl = opts && opts->nl ? opts->nl : "\n"; + nopts.padding = opts ? opts->padding : 1; + nopts.width = opts && opts->width ? opts->width : term_columns() - 1; + if (!column_active(colopts)) { + display_plain(list, "", "\n"); + return; + } + switch (COL_LAYOUT(colopts)) { + case COL_PLAIN: + display_plain(list, nopts.indent, nopts.nl); + break; + case COL_ROW: + case COL_COLUMN: + display_table(list, colopts, &nopts); + break; + default: + die("BUG: invalid layout mode %d", COL_LAYOUT(colopts)); + } +} + +int finalize_colopts(unsigned int *colopts, int stdout_is_tty) +{ + if ((*colopts & COL_ENABLE_MASK) == COL_AUTO) { + if (stdout_is_tty < 0) + stdout_is_tty = isatty(1); + *colopts &= ~COL_ENABLE_MASK; + if (stdout_is_tty) + *colopts |= COL_ENABLED; + } + return 0; +} + +struct colopt { + const char *name; + unsigned int value; + unsigned int mask; +}; + +#define LAYOUT_SET 1 +#define ENABLE_SET 2 + +static int parse_option(const char *arg, int len, unsigned int *colopts, + int *group_set) +{ + struct colopt opts[] = { + { "always", COL_ENABLED, COL_ENABLE_MASK }, + { "never", COL_DISABLED, COL_ENABLE_MASK }, + { "auto", COL_AUTO, COL_ENABLE_MASK }, + { "plain", COL_PLAIN, COL_LAYOUT_MASK }, + { "column", COL_COLUMN, COL_LAYOUT_MASK }, + { "row", COL_ROW, COL_LAYOUT_MASK }, + { "dense", COL_DENSE, 0 }, + }; + int i; + + for (i = 0; i < ARRAY_SIZE(opts); i++) { + int set = 1, arg_len = len, name_len; + const char *arg_str = arg; + + if (!opts[i].mask) { + if (arg_len > 2 && !strncmp(arg_str, "no", 2)) { + arg_str += 2; + arg_len -= 2; + set = 0; + } + } + + name_len = strlen(opts[i].name); + if (arg_len != name_len || + strncmp(arg_str, opts[i].name, name_len)) + continue; + + switch (opts[i].mask) { + case COL_ENABLE_MASK: + *group_set |= ENABLE_SET; + break; + case COL_LAYOUT_MASK: + *group_set |= LAYOUT_SET; + break; + } + + if (opts[i].mask) + *colopts = (*colopts & ~opts[i].mask) | opts[i].value; + else { + if (set) + *colopts |= opts[i].value; + else + *colopts &= ~opts[i].value; + } + return 0; + } + + return error("unsupported option '%s'", arg); +} + +static int parse_config(unsigned int *colopts, const char *value) +{ + const char *sep = " ,"; + int group_set = 0; + + while (*value) { + int len = strcspn(value, sep); + if (len) { + if (parse_option(value, len, colopts, &group_set)) + return -1; + + value += len; + } + value += strspn(value, sep); + } + /* + * Setting layout implies "always" if neither always, never + * nor auto is specified. + * + * Current value in COL_ENABLE_MASK is disregarded. This means if + * you set column.ui = auto and pass --column=row, then "auto" + * will become "always". + */ + if ((group_set & LAYOUT_SET) && !(group_set & ENABLE_SET)) + *colopts = (*colopts & ~COL_ENABLE_MASK) | COL_ENABLED; + return 0; +} + +static int column_config(const char *var, const char *value, + const char *key, unsigned int *colopts) +{ + if (!value) + return config_error_nonbool(var); + if (parse_config(colopts, value)) + return error("invalid column.%s mode %s", key, value); + return 0; +} + +int git_column_config(const char *var, const char *value, + const char *command, unsigned int *colopts) +{ + const char *it = skip_prefix(var, "column."); + if (!it) + return 0; + + if (!strcmp(it, "ui")) + return column_config(var, value, "ui", colopts); + + if (command && !strcmp(it, command)) + return column_config(var, value, it, colopts); + + return 0; +} + +int parseopt_column_callback(const struct option *opt, + const char *arg, int unset) +{ + unsigned int *colopts = opt->value; + *colopts |= COL_PARSEOPT; + *colopts &= ~COL_ENABLE_MASK; + if (unset) /* --no-column == never */ + return 0; + /* --column == always unless "arg" states otherwise */ + *colopts |= COL_ENABLED; + if (arg) + return parse_config(colopts, arg); + + return 0; +} + +static int fd_out = -1; +static struct child_process column_process; + +int run_column_filter(int colopts, const struct column_options *opts) +{ + const char *av[10]; + int ret, ac = 0; + struct strbuf sb_colopt = STRBUF_INIT; + struct strbuf sb_width = STRBUF_INIT; + struct strbuf sb_padding = STRBUF_INIT; + + if (fd_out != -1) + return -1; + + av[ac++] = "column"; + strbuf_addf(&sb_colopt, "--raw-mode=%d", colopts); + av[ac++] = sb_colopt.buf; + if (opts && opts->width) { + strbuf_addf(&sb_width, "--width=%d", opts->width); + av[ac++] = sb_width.buf; + } + if (opts && opts->indent) { + av[ac++] = "--indent"; + av[ac++] = opts->indent; + } + if (opts && opts->padding) { + strbuf_addf(&sb_padding, "--padding=%d", opts->padding); + av[ac++] = sb_padding.buf; + } + av[ac] = NULL; + + fflush(stdout); + memset(&column_process, 0, sizeof(column_process)); + column_process.in = -1; + column_process.out = dup(1); + column_process.git_cmd = 1; + column_process.argv = av; + + ret = start_command(&column_process); + + strbuf_release(&sb_colopt); + strbuf_release(&sb_width); + strbuf_release(&sb_padding); + + if (ret) + return -2; + + fd_out = dup(1); + close(1); + dup2(column_process.in, 1); + close(column_process.in); + return 0; +} + +int stop_column_filter(void) +{ + if (fd_out == -1) + return -1; + + fflush(stdout); + close(1); + finish_command(&column_process); + dup2(fd_out, 1); + close(fd_out); + fd_out = -1; + return 0; +} diff --git a/column.h b/column.h new file mode 100644 index 0000000000..0a61917fa7 --- /dev/null +++ b/column.h @@ -0,0 +1,45 @@ +#ifndef COLUMN_H +#define COLUMN_H + +#define COL_LAYOUT_MASK 0x000F +#define COL_ENABLE_MASK 0x0030 /* always, never or auto */ +#define COL_PARSEOPT 0x0040 /* --column is given from cmdline */ +#define COL_DENSE 0x0080 /* Shrink columns when possible, + making space for more columns */ + +#define COL_DISABLED 0x0000 /* must be zero */ +#define COL_ENABLED 0x0010 +#define COL_AUTO 0x0020 + +#define COL_LAYOUT(c) ((c) & COL_LAYOUT_MASK) +#define COL_COLUMN 0 /* Fill columns before rows */ +#define COL_ROW 1 /* Fill rows before columns */ +#define COL_PLAIN 15 /* one column */ + +#define explicitly_enable_column(c) \ + (((c) & COL_PARSEOPT) && column_active(c)) + +struct column_options { + int width; + int padding; + const char *indent; + const char *nl; +}; + +struct option; +extern int parseopt_column_callback(const struct option *, const char *, int); +extern int git_column_config(const char *var, const char *value, + const char *command, unsigned int *colopts); +extern int finalize_colopts(unsigned int *colopts, int stdout_is_tty); +static inline int column_active(unsigned int colopts) +{ + return (colopts & COL_ENABLE_MASK) == COL_ENABLED; +} + +extern void print_columns(const struct string_list *list, unsigned int colopts, + const struct column_options *opts); + +extern int run_column_filter(int colopts, const struct column_options *); +extern int stop_column_filter(void); + +#endif diff --git a/command-list.txt b/command-list.txt index 38ec5f7b86..14ea67af03 100644 --- a/command-list.txt +++ b/command-list.txt @@ -20,6 +20,7 @@ git-cherry-pick mainporcelain git-citool mainporcelain git-clean mainporcelain git-clone mainporcelain common +git-column purehelpers git-commit mainporcelain common git-commit-tree plumbingmanipulators git-config ancillarymanipulators @@ -1154,9 +1154,9 @@ int commit_tree_extended(const struct strbuf *msg, unsigned char *tree, /* Person/date information */ if (!author) - author = git_author_info(IDENT_ERROR_ON_NO_NAME); + author = git_author_info(IDENT_STRICT); strbuf_addf(&buffer, "author %s\n", author); - strbuf_addf(&buffer, "committer %s\n", git_committer_info(IDENT_ERROR_ON_NO_NAME)); + strbuf_addf(&buffer, "committer %s\n", git_committer_info(IDENT_STRICT)); if (!encoding_is_utf8) strbuf_addf(&buffer, "encoding %s\n", git_commit_encoding); @@ -84,6 +84,7 @@ struct pretty_print_context { const char *after_subject; int preserve_subject; enum date_mode date_mode; + unsigned date_mode_explicit:1; int need_8bit_cte; int show_notes; struct reflog_walk_info *reflog_info; diff --git a/compat/win32/pthread.h b/compat/win32/pthread.h index 2e20548557..8ad187344f 100644 --- a/compat/win32/pthread.h +++ b/compat/win32/pthread.h @@ -86,6 +86,11 @@ static inline int pthread_key_create(pthread_key_t *keyp, void (*destructor)(voi return (*keyp = TlsAlloc()) == TLS_OUT_OF_INDEXES ? EAGAIN : 0; } +static inline int pthread_key_delete(pthread_key_t key) +{ + return TlsFree(key) ? 0 : EINVAL; +} + static inline int pthread_setspecific(pthread_key_t key, const void *value) { return TlsSetValue(key, (void *)value) ? 0 : EINVAL; diff --git a/compat/win32mmap.c b/compat/win32mmap.c index b58aa69fa0..61d2ef8e46 100644 --- a/compat/win32mmap.c +++ b/compat/win32mmap.c @@ -30,7 +30,7 @@ void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t of temp = MapViewOfFileEx(hmap, FILE_MAP_COPY, h, l, length, start); if (!CloseHandle(hmap)) - warning("unable to close file mapping handle\n"); + warning("unable to close file mapping handle"); return temp ? temp : MAP_FAILED; } @@ -762,28 +762,6 @@ static int git_default_core_config(const char *var, const char *value) return 0; } -static int git_default_user_config(const char *var, const char *value) -{ - if (!strcmp(var, "user.name")) { - if (!value) - return config_error_nonbool(var); - strlcpy(git_default_name, value, sizeof(git_default_name)); - user_ident_explicitly_given |= IDENT_NAME_GIVEN; - return 0; - } - - if (!strcmp(var, "user.email")) { - if (!value) - return config_error_nonbool(var); - strlcpy(git_default_email, value, sizeof(git_default_email)); - user_ident_explicitly_given |= IDENT_MAIL_GIVEN; - return 0; - } - - /* Add other config variables here and to Documentation/config.txt. */ - return 0; -} - static int git_default_i18n_config(const char *var, const char *value) { if (!strcmp(var, "i18n.commitencoding")) @@ -835,6 +813,8 @@ static int git_default_push_config(const char *var, const char *value) push_default = PUSH_DEFAULT_NOTHING; else if (!strcmp(value, "matching")) push_default = PUSH_DEFAULT_MATCHING; + else if (!strcmp(value, "simple")) + push_default = PUSH_DEFAULT_SIMPLE; else if (!strcmp(value, "upstream")) push_default = PUSH_DEFAULT_UPSTREAM; else if (!strcmp(value, "tracking")) /* deprecated */ @@ -843,8 +823,8 @@ static int git_default_push_config(const char *var, const char *value) push_default = PUSH_DEFAULT_CURRENT; else { error("Malformed value for %s: %s", var, value); - return error("Must be one of nothing, matching, " - "tracking or current."); + return error("Must be one of nothing, matching, simple, " + "upstream or current."); } return 0; } @@ -868,7 +848,7 @@ int git_default_config(const char *var, const char *value, void *dummy) return git_default_core_config(var, value); if (!prefixcmp(var, "user.")) - return git_default_user_config(var, value); + return git_ident_config(var, value, dummy); if (!prefixcmp(var, "i18n.")) return git_default_i18n_config(var, value); diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 9f56ec7a6b..1689f99539 100755 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -676,9 +676,7 @@ __git_complete_revlist_file () *) pfx="$ref:$pfx" ;; esac - local IFS=$'\n' - COMPREPLY=($(compgen -P "$pfx" \ - -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \ + __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \ | sed '/^100... blob /{ s,^.* ,, s,$, , @@ -692,7 +690,7 @@ __git_complete_revlist_file () s,$,/, } s/^.* //')" \ - -- "$cur_")) + "$pfx" "$cur_" "" ;; *...*) pfx="${cur_%...*}..." @@ -2599,25 +2597,10 @@ _git_whatchanged () _git_log } -_git () +_main_git () { local i c=1 command __git_dir - if [[ -n ${ZSH_VERSION-} ]]; then - emulate -L bash - setopt KSH_TYPESET - - # workaround zsh's bug that leaves 'words' as a special - # variable in versions < 4.3.12 - typeset -h words - - # workaround zsh's bug that quotes spaces in the COMPREPLY - # array if IFS doesn't contain spaces. - typeset -h IFS - fi - - local cur words cword prev - _get_comp_words_by_ref -n =: cur words cword prev while [ $c -lt $cword ]; do i="${words[c]}" case "$i" in @@ -2665,24 +2648,8 @@ _git () fi } -_gitk () +_main_gitk () { - if [[ -n ${ZSH_VERSION-} ]]; then - emulate -L bash - setopt KSH_TYPESET - - # workaround zsh's bug that leaves 'words' as a special - # variable in versions < 4.3.12 - typeset -h words - - # workaround zsh's bug that quotes spaces in the COMPREPLY - # array if IFS doesn't contain spaces. - typeset -h IFS - fi - - local cur words cword prev - _get_comp_words_by_ref -n =: cur words cword prev - __git_has_doubledash && return local g="$(__gitdir)" @@ -2703,16 +2670,55 @@ _gitk () __git_complete_revlist } -complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \ - || complete -o default -o nospace -F _git git -complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \ - || complete -o default -o nospace -F _gitk gitk +__git_func_wrap () +{ + if [[ -n ${ZSH_VERSION-} ]]; then + emulate -L bash + setopt KSH_TYPESET + + # workaround zsh's bug that leaves 'words' as a special + # variable in versions < 4.3.12 + typeset -h words + + # workaround zsh's bug that quotes spaces in the COMPREPLY + # array if IFS doesn't contain spaces. + typeset -h IFS + fi + local cur words cword prev + _get_comp_words_by_ref -n =: cur words cword prev + $1 +} + +# Setup completion for certain functions defined above by setting common +# variables and workarounds. +# This is NOT a public function; use at your own risk. +__git_complete () +{ + local wrapper="__git_wrap${2}" + eval "$wrapper () { __git_func_wrap $2 ; }" + complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \ + || complete -o default -o nospace -F $wrapper $1 +} + +# wrapper for backwards compatibility +_git () +{ + __git_wrap_main_git +} + +# wrapper for backwards compatibility +_gitk () +{ + __git_wrap_main_gitk +} + +__git_complete git _main_git +__git_complete gitk _main_gitk # The following are necessary only for Cygwin, and only are needed # when the user has tab-completed the executable name and consequently # included the '.exe' suffix. # if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then -complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \ - || complete -o default -o nospace -F _git git.exe +__git_complete git.exe _main_git fi diff --git a/contrib/credential/osxkeychain/Makefile b/contrib/credential/osxkeychain/Makefile index 75c07f8be4..4b3a08a2ba 100644 --- a/contrib/credential/osxkeychain/Makefile +++ b/contrib/credential/osxkeychain/Makefile @@ -2,10 +2,13 @@ all:: git-credential-osxkeychain CC = gcc RM = rm -f -CFLAGS = -g -Wall +CFLAGS = -g -O2 -Wall + +-include ../../../config.mak.autogen +-include ../../../config.mak git-credential-osxkeychain: git-credential-osxkeychain.o - $(CC) -o $@ $< -Wl,-framework -Wl,Security + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) -Wl,-framework -Wl,Security git-credential-osxkeychain.o: git-credential-osxkeychain.c $(CC) -c $(CFLAGS) $< diff --git a/contrib/examples/builtin-fetch--tool.c b/contrib/examples/builtin-fetch--tool.c index 3140e405fa..0d54aa7061 100644 --- a/contrib/examples/builtin-fetch--tool.c +++ b/contrib/examples/builtin-fetch--tool.c @@ -518,7 +518,7 @@ int cmd_fetch__tool(int argc, const char **argv, const char *prefix) filename = git_path("FETCH_HEAD"); fp = fopen(filename, "a"); if (!fp) - return error("cannot open %s: %s\n", filename, strerror(errno)); + return error("cannot open %s: %s", filename, strerror(errno)); result = append_fetch_head(fp, argv[2], argv[3], argv[4], argv[5], argv[6], !!argv[7][0], @@ -536,7 +536,7 @@ int cmd_fetch__tool(int argc, const char **argv, const char *prefix) filename = git_path("FETCH_HEAD"); fp = fopen(filename, "a"); if (!fp) - return error("cannot open %s: %s\n", filename, strerror(errno)); + return error("cannot open %s: %s", filename, strerror(errno)); result = fetch_native_store(fp, argv[2], argv[3], argv[4], verbose, force); fclose(fp); diff --git a/contrib/persistent-https/LICENSE b/contrib/persistent-https/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/contrib/persistent-https/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/contrib/persistent-https/Makefile b/contrib/persistent-https/Makefile new file mode 100644 index 0000000000..92baa3beee --- /dev/null +++ b/contrib/persistent-https/Makefile @@ -0,0 +1,38 @@ +# Copyright 2012 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +BUILD_LABEL=$(shell date +"%s") +TAR_OUT=$(shell go env GOOS)_$(shell go env GOARCH).tar.gz + +all: git-remote-persistent-https git-remote-persistent-https--proxy \ + git-remote-persistent-http + +git-remote-persistent-https--proxy: git-remote-persistent-https + ln -f -s git-remote-persistent-https git-remote-persistent-https--proxy + +git-remote-persistent-http: git-remote-persistent-https + ln -f -s git-remote-persistent-https git-remote-persistent-http + +git-remote-persistent-https: + go build -o git-remote-persistent-https \ + -ldflags "-X main._BUILD_EMBED_LABEL $(BUILD_LABEL)" + +clean: + rm -f git-remote-persistent-http* *.tar.gz + +tar: clean all + @chmod 555 git-remote-persistent-https + @tar -czf $(TAR_OUT) git-remote-persistent-http* README LICENSE + @echo + @echo "Created $(TAR_OUT)" diff --git a/contrib/persistent-https/README b/contrib/persistent-https/README new file mode 100644 index 0000000000..f784dd2e66 --- /dev/null +++ b/contrib/persistent-https/README @@ -0,0 +1,62 @@ +git-remote-persistent-https + +The git-remote-persistent-https binary speeds up SSL operations +by running a daemon job (git-remote-persistent-https--proxy) that +keeps a connection open to a server. + + +PRE-BUILT BINARIES + +Darwin amd64: +https://commondatastorage.googleapis.com/git-remote-persistent-https/darwin_amd64.tar.gz + +Linux amd64: +https://commondatastorage.googleapis.com/git-remote-persistent-https/linux_amd64.tar.gz + + +INSTALLING + +Move all of the git-remote-persistent-http* binaries to a directory +in PATH. + + +USAGE + +HTTPS requests can be delegated to the proxy by using the +"persistent-https" scheme, e.g. + +git clone persistent-https://kernel.googlesource.com/pub/scm/git/git + +Likewise, .gitconfig can be updated as follows to rewrite https urls +to use persistent-https: + +[url "persistent-https"] + insteadof = https +[url "persistent-http"] + insteadof = http + + +##################################################################### +# BUILDING FROM SOURCE +##################################################################### + +LOCATION + +The source is available in the contrib/persistent-https directory of +the Git source repository. The Git source repository is available at +git://git.kernel.org/pub/scm/git/git.git/ +https://kernel.googlesource.com/pub/scm/git/git + + +PREREQUISITES + +The code is written in Go (http://golang.org/) and the Go compiler is +required. Currently, the compiler must be built and installed from tip +of source, in order to include a fix in the reverse http proxy: +http://code.google.com/p/go/source/detail?r=a615b796570a2cd8591884767a7d67ede74f6648 + + +BUILDING + +Run "make" to build the binaries. See the section on +INSTALLING above. diff --git a/contrib/persistent-https/client.go b/contrib/persistent-https/client.go new file mode 100644 index 0000000000..71125b5832 --- /dev/null +++ b/contrib/persistent-https/client.go @@ -0,0 +1,189 @@ +// Copyright 2012 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "bufio" + "errors" + "fmt" + "net" + "net/url" + "os" + "os/exec" + "strings" + "syscall" + "time" +) + +type Client struct { + ProxyBin string + Args []string + + insecure bool +} + +func (c *Client) Run() error { + if err := c.resolveArgs(); err != nil { + return fmt.Errorf("resolveArgs() got error: %v", err) + } + + // Connect to the proxy. + uconn, hconn, addr, err := c.connect() + if err != nil { + return fmt.Errorf("connect() got error: %v", err) + } + // Keep the unix socket connection open for the duration of the request. + defer uconn.Close() + // Keep a connection to the HTTP server open, so no other user can + // bind on the same address so long as the process is running. + defer hconn.Close() + + // Start the git-remote-http subprocess. + cargs := []string{"-c", fmt.Sprintf("http.proxy=%v", addr), "remote-http"} + cargs = append(cargs, c.Args...) + cmd := exec.Command("git", cargs...) + + for _, v := range os.Environ() { + if !strings.HasPrefix(v, "GIT_PERSISTENT_HTTPS_SECURE=") { + cmd.Env = append(cmd.Env, v) + } + } + // Set the GIT_PERSISTENT_HTTPS_SECURE environment variable when + // the proxy is using a SSL connection. This allows credential helpers + // to identify secure proxy connections, despite being passed an HTTP + // scheme. + if !c.insecure { + cmd.Env = append(cmd.Env, "GIT_PERSISTENT_HTTPS_SECURE=1") + } + + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + if eerr, ok := err.(*exec.ExitError); ok { + if stat, ok := eerr.ProcessState.Sys().(syscall.WaitStatus); ok && stat.ExitStatus() != 0 { + os.Exit(stat.ExitStatus()) + } + } + return fmt.Errorf("git-remote-http subprocess got error: %v", err) + } + return nil +} + +func (c *Client) connect() (uconn net.Conn, hconn net.Conn, addr string, err error) { + uconn, err = DefaultSocket.Dial() + if err != nil { + if e, ok := err.(*net.OpError); ok && (os.IsNotExist(e.Err) || e.Err == syscall.ECONNREFUSED) { + if err = c.startProxy(); err == nil { + uconn, err = DefaultSocket.Dial() + } + } + if err != nil { + return + } + } + + if addr, err = c.readAddr(uconn); err != nil { + return + } + + // Open a tcp connection to the proxy. + if hconn, err = net.Dial("tcp", addr); err != nil { + return + } + + // Verify the address hasn't changed ownership. + var addr2 string + if addr2, err = c.readAddr(uconn); err != nil { + return + } else if addr != addr2 { + err = fmt.Errorf("address changed after connect. got %q, want %q", addr2, addr) + return + } + return +} + +func (c *Client) readAddr(conn net.Conn) (string, error) { + conn.SetDeadline(time.Now().Add(5 * time.Second)) + data := make([]byte, 100) + n, err := conn.Read(data) + if err != nil { + return "", fmt.Errorf("error reading unix socket: %v", err) + } else if n == 0 { + return "", errors.New("empty data response") + } + conn.Write([]byte{1}) // Ack + + var addr string + if addrs := strings.Split(string(data[:n]), "\n"); len(addrs) != 2 { + return "", fmt.Errorf("got %q, wanted 2 addresses", data[:n]) + } else if c.insecure { + addr = addrs[1] + } else { + addr = addrs[0] + } + return addr, nil +} + +func (c *Client) startProxy() error { + cmd := exec.Command(c.ProxyBin) + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + stdout, err := cmd.StdoutPipe() + if err != nil { + return err + } + defer stdout.Close() + if err := cmd.Start(); err != nil { + return err + } + result := make(chan error) + go func() { + bytes, _, err := bufio.NewReader(stdout).ReadLine() + if line := string(bytes); err == nil && line != "OK" { + err = fmt.Errorf("proxy returned %q, want \"OK\"", line) + } + result <- err + }() + select { + case err := <-result: + return err + case <-time.After(5 * time.Second): + return errors.New("timeout waiting for proxy to start") + } + panic("not reachable") +} + +func (c *Client) resolveArgs() error { + if nargs := len(c.Args); nargs == 0 { + return errors.New("remote needed") + } else if nargs > 2 { + return fmt.Errorf("want at most 2 args, got %v", c.Args) + } + + // Rewrite the url scheme to be http. + idx := len(c.Args) - 1 + rawurl := c.Args[idx] + rurl, err := url.Parse(rawurl) + if err != nil { + return fmt.Errorf("invalid remote: %v", err) + } + c.insecure = rurl.Scheme == "persistent-http" + rurl.Scheme = "http" + c.Args[idx] = rurl.String() + if idx != 0 && c.Args[0] == rawurl { + c.Args[0] = c.Args[idx] + } + return nil +} diff --git a/contrib/persistent-https/main.go b/contrib/persistent-https/main.go new file mode 100644 index 0000000000..fd1b107743 --- /dev/null +++ b/contrib/persistent-https/main.go @@ -0,0 +1,82 @@ +// Copyright 2012 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// The git-remote-persistent-https binary speeds up SSL operations by running +// a daemon job that keeps a connection open to a Git server. This ensures the +// git-remote-persistent-https--proxy is running and delegating execution +// to the git-remote-http binary with the http_proxy set to the daemon job. +// A unix socket is used to authenticate the proxy and discover the +// HTTP address. Note, both the client and proxy are included in the same +// binary. +package main + +import ( + "flag" + "fmt" + "log" + "os" + "strings" + "time" +) + +var ( + forceProxy = flag.Bool("proxy", false, "Whether to start the binary in proxy mode") + proxyBin = flag.String("proxy_bin", "git-remote-persistent-https--proxy", "Path to the proxy binary") + printLabel = flag.Bool("print_label", false, "Prints the build label for the binary") + + // Variable that should be defined through the -X linker flag. + _BUILD_EMBED_LABEL string +) + +const ( + defaultMaxIdleDuration = 24 * time.Hour + defaultPollUpdateInterval = 15 * time.Minute +) + +func main() { + flag.Parse() + if *printLabel { + // Short circuit execution to print the build label + fmt.Println(buildLabel()) + return + } + + var err error + if *forceProxy || strings.HasSuffix(os.Args[0], "--proxy") { + log.SetPrefix("git-remote-persistent-https--proxy: ") + proxy := &Proxy{ + BuildLabel: buildLabel(), + MaxIdleDuration: defaultMaxIdleDuration, + PollUpdateInterval: defaultPollUpdateInterval, + } + err = proxy.Run() + } else { + log.SetPrefix("git-remote-persistent-https: ") + client := &Client{ + ProxyBin: *proxyBin, + Args: flag.Args(), + } + err = client.Run() + } + if err != nil { + log.Fatalln(err) + } +} + +func buildLabel() string { + if _BUILD_EMBED_LABEL == "" { + log.Println(`unlabeled build; build with "make" to label`) + } + return _BUILD_EMBED_LABEL +} diff --git a/contrib/persistent-https/proxy.go b/contrib/persistent-https/proxy.go new file mode 100644 index 0000000000..bb0cdba386 --- /dev/null +++ b/contrib/persistent-https/proxy.go @@ -0,0 +1,190 @@ +// Copyright 2012 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "fmt" + "log" + "net" + "net/http" + "net/http/httputil" + "os" + "os/exec" + "os/signal" + "sync" + "syscall" + "time" +) + +type Proxy struct { + BuildLabel string + MaxIdleDuration time.Duration + PollUpdateInterval time.Duration + + ul net.Listener + httpAddr string + httpsAddr string +} + +func (p *Proxy) Run() error { + hl, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + return fmt.Errorf("http listen failed: %v", err) + } + defer hl.Close() + + hsl, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + return fmt.Errorf("https listen failed: %v", err) + } + defer hsl.Close() + + p.ul, err = DefaultSocket.Listen() + if err != nil { + c, derr := DefaultSocket.Dial() + if derr == nil { + c.Close() + fmt.Println("OK\nA proxy is already running... exiting") + return nil + } else if e, ok := derr.(*net.OpError); ok && e.Err == syscall.ECONNREFUSED { + // Nothing is listening on the socket, unlink it and try again. + syscall.Unlink(DefaultSocket.Path()) + p.ul, err = DefaultSocket.Listen() + } + if err != nil { + return fmt.Errorf("unix listen failed on %v: %v", DefaultSocket.Path(), err) + } + } + defer p.ul.Close() + go p.closeOnSignal() + go p.closeOnUpdate() + + p.httpAddr = hl.Addr().String() + p.httpsAddr = hsl.Addr().String() + fmt.Printf("OK\nListening on unix socket=%v http=%v https=%v\n", + p.ul.Addr(), p.httpAddr, p.httpsAddr) + + result := make(chan error, 2) + go p.serveUnix(result) + go func() { + result <- http.Serve(hl, &httputil.ReverseProxy{ + FlushInterval: 500 * time.Millisecond, + Director: func(r *http.Request) {}, + }) + }() + go func() { + result <- http.Serve(hsl, &httputil.ReverseProxy{ + FlushInterval: 500 * time.Millisecond, + Director: func(r *http.Request) { + r.URL.Scheme = "https" + }, + }) + }() + return <-result +} + +type socketContext struct { + sync.WaitGroup + mutex sync.Mutex + last time.Time +} + +func (sc *socketContext) Done() { + sc.mutex.Lock() + defer sc.mutex.Unlock() + sc.last = time.Now() + sc.WaitGroup.Done() +} + +func (p *Proxy) serveUnix(result chan<- error) { + sockCtx := &socketContext{} + go p.closeOnIdle(sockCtx) + + var err error + for { + var uconn net.Conn + uconn, err = p.ul.Accept() + if err != nil { + err = fmt.Errorf("accept failed: %v", err) + break + } + sockCtx.Add(1) + go p.handleUnixConn(sockCtx, uconn) + } + sockCtx.Wait() + result <- err +} + +func (p *Proxy) handleUnixConn(sockCtx *socketContext, uconn net.Conn) { + defer sockCtx.Done() + defer uconn.Close() + data := []byte(fmt.Sprintf("%v\n%v", p.httpsAddr, p.httpAddr)) + uconn.SetDeadline(time.Now().Add(5 * time.Second)) + for i := 0; i < 2; i++ { + if n, err := uconn.Write(data); err != nil { + log.Printf("error sending http addresses: %+v\n", err) + return + } else if n != len(data) { + log.Printf("sent %d data bytes, wanted %d\n", n, len(data)) + return + } + if _, err := uconn.Read([]byte{0, 0, 0, 0}); err != nil { + log.Printf("error waiting for Ack: %+v\n", err) + return + } + } + // Wait without a deadline for the client to finish via EOF + uconn.SetDeadline(time.Time{}) + uconn.Read([]byte{0, 0, 0, 0}) +} + +func (p *Proxy) closeOnIdle(sockCtx *socketContext) { + for d := p.MaxIdleDuration; d > 0; { + time.Sleep(d) + sockCtx.Wait() + sockCtx.mutex.Lock() + if d = sockCtx.last.Add(p.MaxIdleDuration).Sub(time.Now()); d <= 0 { + log.Println("graceful shutdown from idle timeout") + p.ul.Close() + } + sockCtx.mutex.Unlock() + } +} + +func (p *Proxy) closeOnUpdate() { + for { + time.Sleep(p.PollUpdateInterval) + if out, err := exec.Command(os.Args[0], "--print_label").Output(); err != nil { + log.Printf("error polling for updated binary: %v\n", err) + } else if s := string(out[:len(out)-1]); p.BuildLabel != s { + log.Printf("graceful shutdown from updated binary: %q --> %q\n", p.BuildLabel, s) + p.ul.Close() + break + } + } +} + +func (p *Proxy) closeOnSignal() { + ch := make(chan os.Signal, 10) + signal.Notify(ch, os.Interrupt, os.Kill, os.Signal(syscall.SIGTERM), os.Signal(syscall.SIGHUP)) + sig := <-ch + p.ul.Close() + switch sig { + case os.Signal(syscall.SIGHUP): + log.Printf("graceful shutdown from signal: %v\n", sig) + default: + log.Fatalf("exiting from signal: %v\n", sig) + } +} diff --git a/contrib/persistent-https/socket.go b/contrib/persistent-https/socket.go new file mode 100644 index 0000000000..193b911dd1 --- /dev/null +++ b/contrib/persistent-https/socket.go @@ -0,0 +1,97 @@ +// Copyright 2012 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "fmt" + "log" + "net" + "os" + "path/filepath" + "syscall" +) + +// A Socket is a wrapper around a Unix socket that verifies directory +// permissions. +type Socket struct { + Dir string +} + +func defaultDir() string { + sockPath := ".git-credential-cache" + if home := os.Getenv("HOME"); home != "" { + return filepath.Join(home, sockPath) + } + log.Printf("socket: cannot find HOME path. using relative directory %q for socket", sockPath) + return sockPath +} + +// DefaultSocket is a Socket in the $HOME/.git-credential-cache directory. +var DefaultSocket = Socket{Dir: defaultDir()} + +// Listen announces the local network address of the unix socket. The +// permissions on the socket directory are verified before attempting +// the actual listen. +func (s Socket) Listen() (net.Listener, error) { + network, addr := "unix", s.Path() + if err := s.mkdir(); err != nil { + return nil, &net.OpError{Op: "listen", Net: network, Addr: &net.UnixAddr{Name: addr, Net: network}, Err: err} + } + return net.Listen(network, addr) +} + +// Dial connects to the unix socket. The permissions on the socket directory +// are verified before attempting the actual dial. +func (s Socket) Dial() (net.Conn, error) { + network, addr := "unix", s.Path() + if err := s.checkPermissions(); err != nil { + return nil, &net.OpError{Op: "dial", Net: network, Addr: &net.UnixAddr{Name: addr, Net: network}, Err: err} + } + return net.Dial(network, addr) +} + +// Path returns the fully specified file name of the unix socket. +func (s Socket) Path() string { + return filepath.Join(s.Dir, "persistent-https-proxy-socket") +} + +func (s Socket) mkdir() error { + if err := s.checkPermissions(); err == nil { + return nil + } else if !os.IsNotExist(err) { + return err + } + if err := os.MkdirAll(s.Dir, 0700); err != nil { + return err + } + return s.checkPermissions() +} + +func (s Socket) checkPermissions() error { + fi, err := os.Stat(s.Dir) + if err != nil { + return err + } + if !fi.IsDir() { + return fmt.Errorf("socket: got file, want directory for %q", s.Dir) + } + if fi.Mode().Perm() != 0700 { + return fmt.Errorf("socket: got perm %o, want 700 for %q", fi.Mode().Perm(), s.Dir) + } + if st := fi.Sys().(*syscall.Stat_t); int(st.Uid) != os.Getuid() { + return fmt.Errorf("socket: got uid %d, want %d for %q", st.Uid, os.Getuid(), s.Dir) + } + return nil +} diff --git a/contrib/rerere-train.sh b/contrib/rerere-train.sh index 2cfe1b936b..36b6feebe0 100755 --- a/contrib/rerere-train.sh +++ b/contrib/rerere-train.sh @@ -7,7 +7,7 @@ USAGE="$me rev-list-args" SUBDIRECTORY_OK=Yes OPTIONS_SPEC= -. git-sh-setup +. $(git --exec-path)/git-sh-setup require_work_tree cd_to_toplevel @@ -86,83 +86,98 @@ static int local_tzoffset(unsigned long time) return offset * eastwest; } -const char *show_date_relative(unsigned long time, int tz, +void show_date_relative(unsigned long time, int tz, const struct timeval *now, - char *timebuf, - size_t timebuf_size) + struct strbuf *timebuf) { unsigned long diff; - if (now->tv_sec < time) - return "in the future"; + if (now->tv_sec < time) { + strbuf_addstr(timebuf, _("in the future")); + return; + } diff = now->tv_sec - time; if (diff < 90) { - snprintf(timebuf, timebuf_size, "%lu seconds ago", diff); - return timebuf; + strbuf_addf(timebuf, + Q_("%lu second ago", "%lu seconds ago", diff), diff); + return; } /* Turn it into minutes */ diff = (diff + 30) / 60; if (diff < 90) { - snprintf(timebuf, timebuf_size, "%lu minutes ago", diff); - return timebuf; + strbuf_addf(timebuf, + Q_("%lu minute ago", "%lu minutes ago", diff), diff); + return; } /* Turn it into hours */ diff = (diff + 30) / 60; if (diff < 36) { - snprintf(timebuf, timebuf_size, "%lu hours ago", diff); - return timebuf; + strbuf_addf(timebuf, + Q_("%lu hour ago", "%lu hours ago", diff), diff); + return; } /* We deal with number of days from here on */ diff = (diff + 12) / 24; if (diff < 14) { - snprintf(timebuf, timebuf_size, "%lu days ago", diff); - return timebuf; + strbuf_addf(timebuf, + Q_("%lu day ago", "%lu days ago", diff), diff); + return; } /* Say weeks for the past 10 weeks or so */ if (diff < 70) { - snprintf(timebuf, timebuf_size, "%lu weeks ago", (diff + 3) / 7); - return timebuf; + strbuf_addf(timebuf, + Q_("%lu week ago", "%lu weeks ago", (diff + 3) / 7), + (diff + 3) / 7); + return; } /* Say months for the past 12 months or so */ if (diff < 365) { - snprintf(timebuf, timebuf_size, "%lu months ago", (diff + 15) / 30); - return timebuf; + strbuf_addf(timebuf, + Q_("%lu month ago", "%lu months ago", (diff + 15) / 30), + (diff + 15) / 30); + return; } /* Give years and months for 5 years or so */ if (diff < 1825) { unsigned long totalmonths = (diff * 12 * 2 + 365) / (365 * 2); unsigned long years = totalmonths / 12; unsigned long months = totalmonths % 12; - int n; - n = snprintf(timebuf, timebuf_size, "%lu year%s", - years, (years > 1 ? "s" : "")); - if (months) - snprintf(timebuf + n, timebuf_size - n, - ", %lu month%s ago", - months, (months > 1 ? "s" : "")); - else - snprintf(timebuf + n, timebuf_size - n, " ago"); - return timebuf; + if (months) { + struct strbuf sb = STRBUF_INIT; + strbuf_addf(&sb, Q_("%lu year", "%lu years", years), years); + /* TRANSLATORS: "%s" is "<n> years" */ + strbuf_addf(timebuf, + Q_("%s, %lu month ago", "%s, %lu months ago", months), + sb.buf, months); + strbuf_release(&sb); + } else + strbuf_addf(timebuf, + Q_("%lu year ago", "%lu years ago", years), years); + return; } /* Otherwise, just years. Centuries is probably overkill. */ - snprintf(timebuf, timebuf_size, "%lu years ago", (diff + 183) / 365); - return timebuf; + strbuf_addf(timebuf, + Q_("%lu year ago", "%lu years ago", (diff + 183) / 365), + (diff + 183) / 365); } const char *show_date(unsigned long time, int tz, enum date_mode mode) { struct tm *tm; - static char timebuf[200]; + static struct strbuf timebuf = STRBUF_INIT; if (mode == DATE_RAW) { - snprintf(timebuf, sizeof(timebuf), "%lu %+05d", time, tz); - return timebuf; + strbuf_reset(&timebuf); + strbuf_addf(&timebuf, "%lu %+05d", time, tz); + return timebuf.buf; } if (mode == DATE_RELATIVE) { struct timeval now; + + strbuf_reset(&timebuf); gettimeofday(&now, NULL); - return show_date_relative(time, tz, &now, - timebuf, sizeof(timebuf)); + show_date_relative(time, tz, &now, &timebuf); + return timebuf.buf; } if (mode == DATE_LOCAL) @@ -171,23 +186,25 @@ const char *show_date(unsigned long time, int tz, enum date_mode mode) tm = time_to_tm(time, tz); if (!tm) return NULL; + + strbuf_reset(&timebuf); if (mode == DATE_SHORT) - sprintf(timebuf, "%04d-%02d-%02d", tm->tm_year + 1900, + strbuf_addf(&timebuf, "%04d-%02d-%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); else if (mode == DATE_ISO8601) - sprintf(timebuf, "%04d-%02d-%02d %02d:%02d:%02d %+05d", + strbuf_addf(&timebuf, "%04d-%02d-%02d %02d:%02d:%02d %+05d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tz); else if (mode == DATE_RFC2822) - sprintf(timebuf, "%.3s, %d %.3s %d %02d:%02d:%02d %+05d", + strbuf_addf(&timebuf, "%.3s, %d %.3s %d %02d:%02d:%02d %+05d", weekday_names[tm->tm_wday], tm->tm_mday, month_names[tm->tm_mon], tm->tm_year + 1900, tm->tm_hour, tm->tm_min, tm->tm_sec, tz); else - sprintf(timebuf, "%.3s %.3s %d %02d:%02d:%02d %d%c%+05d", + strbuf_addf(&timebuf, "%.3s %.3s %d %02d:%02d:%02d %d%c%+05d", weekday_names[tm->tm_wday], month_names[tm->tm_mon], tm->tm_mday, @@ -195,7 +212,7 @@ const char *show_date(unsigned long time, int tz, enum date_mode mode) tm->tm_year + 1900, (mode == DATE_LOCAL) ? 0 : ' ', tz); - return timebuf; + return timebuf.buf; } /* diff --git a/diff-no-index.c b/diff-no-index.c index b44473e3c1..f0b0010aed 100644 --- a/diff-no-index.c +++ b/diff-no-index.c @@ -68,6 +68,7 @@ static int queue_diff(struct diff_options *o, struct string_list p1 = STRING_LIST_INIT_DUP; struct string_list p2 = STRING_LIST_INIT_DUP; int i1, i2, ret = 0; + size_t len1 = 0, len2 = 0; if (name1 && read_directory(name1, &p1)) return -1; @@ -80,18 +81,23 @@ static int queue_diff(struct diff_options *o, strbuf_addstr(&buffer1, name1); if (buffer1.len && buffer1.buf[buffer1.len - 1] != '/') strbuf_addch(&buffer1, '/'); + len1 = buffer1.len; } if (name2) { strbuf_addstr(&buffer2, name2); if (buffer2.len && buffer2.buf[buffer2.len - 1] != '/') strbuf_addch(&buffer2, '/'); + len2 = buffer2.len; } for (i1 = i2 = 0; !ret && (i1 < p1.nr || i2 < p2.nr); ) { const char *n1, *n2; int comp; + strbuf_setlen(&buffer1, len1); + strbuf_setlen(&buffer2, len2); + if (i1 == p1.nr) comp = 1; else if (i2 == p2.nr) @@ -117,8 +123,8 @@ static int queue_diff(struct diff_options *o, } string_list_clear(&p1, 0); string_list_clear(&p2, 0); - strbuf_reset(&buffer1); - strbuf_reset(&buffer2); + strbuf_release(&buffer1); + strbuf_release(&buffer2); return ret; } else { @@ -1443,8 +1443,8 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) { int i, len, add, del, adds = 0, dels = 0; uintmax_t max_change = 0, max_len = 0; - int total_files = data->nr; - int width, name_width, graph_width, number_width = 4, count; + int total_files = data->nr, count; + int width, name_width, graph_width, number_width = 0, bin_width = 0; const char *reset, *add_c, *del_c; const char *line_prefix = ""; int extra_shown = 0; @@ -1480,8 +1480,21 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) if (max_len < len) max_len = len; - if (file->is_binary || file->is_unmerged) + if (file->is_unmerged) { + /* "Unmerged" is 8 characters */ + bin_width = bin_width < 8 ? 8 : bin_width; continue; + } + if (file->is_binary) { + /* "Bin XXX -> YYY bytes" */ + int w = 14 + decimal_width(file->added) + + decimal_width(file->deleted); + bin_width = bin_width < w ? w : bin_width; + /* Display change counts aligned with "Bin" */ + number_width = 3; + continue; + } + if (max_change < change) max_change = change; } @@ -1506,12 +1519,22 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) * stat_name_width fixes the maximum width of the filename, * and is also used to divide available columns if there * aren't enough. + * + * Binary files are displayed with "Bin XXX -> YYY bytes" + * instead of the change count and graph. This part is treated + * similarly to the graph part, except that it is not + * "scaled". If total width is too small to accomodate the + * guaranteed minimum width of the filename part and the + * separators and this message, this message will "overflow" + * making the line longer than the maximum width. */ if (options->stat_width == -1) - width = term_columns(); + width = term_columns() - options->output_prefix_length; else width = options->stat_width ? options->stat_width : 80; + number_width = decimal_width(max_change) > number_width ? + decimal_width(max_change) : number_width; if (options->stat_graph_width == -1) options->stat_graph_width = diff_stat_graph_width; @@ -1525,10 +1548,14 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) /* * First assign sizes that are wanted, ignoring available width. + * strlen("Bin XXX -> YYY bytes") == bin_width, and the part + * starting from "XXX" should fit in graph_width. */ - graph_width = (options->stat_graph_width && - options->stat_graph_width < max_change) ? - options->stat_graph_width : max_change; + graph_width = max_change + 4 > bin_width ? max_change : bin_width - 4; + if (options->stat_graph_width && + options->stat_graph_width < graph_width) + graph_width = options->stat_graph_width; + name_width = (options->stat_name_width > 0 && options->stat_name_width < max_len) ? options->stat_name_width : max_len; @@ -1537,8 +1564,12 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) * Adjust adjustable widths not to exceed maximum width */ if (name_width + number_width + 6 + graph_width > width) { - if (graph_width > width * 3/8 - number_width - 6) + if (graph_width > width * 3/8 - number_width - 6) { graph_width = width * 3/8 - number_width - 6; + if (graph_width < 6) + graph_width = 6; + } + if (options->stat_graph_width && graph_width > options->stat_graph_width) graph_width = options->stat_graph_width; @@ -1583,8 +1614,12 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) if (data->files[i]->is_binary) { fprintf(options->file, "%s", line_prefix); show_name(options->file, prefix, name, len); - fprintf(options->file, " Bin "); - fprintf(options->file, "%s%"PRIuMAX"%s", + fprintf(options->file, " %*s", number_width, "Bin"); + if (!added && !deleted) { + putc('\n', options->file); + continue; + } + fprintf(options->file, " %s%"PRIuMAX"%s", del_c, deleted, reset); fprintf(options->file, " -> "); fprintf(options->file, "%s%"PRIuMAX"%s", @@ -1596,7 +1631,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) else if (data->files[i]->is_unmerged) { fprintf(options->file, "%s", line_prefix); show_name(options->file, prefix, name, len); - fprintf(options->file, " Unmerged\n"); + fprintf(options->file, " Unmerged\n"); continue; } @@ -1625,8 +1660,9 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options) } fprintf(options->file, "%s", line_prefix); show_name(options->file, prefix, name, len); - fprintf(options->file, "%5"PRIuMAX"%s", added + deleted, - added + deleted ? " " : ""); + fprintf(options->file, " %*"PRIuMAX"%s", + number_width, added + deleted, + added + deleted ? " " : ""); show_graph(options->file, '+', add, add_c, reset); show_graph(options->file, '-', del, del_c, reset); fprintf(options->file, "\n"); @@ -1657,17 +1693,16 @@ static void show_shortstats(struct diffstat_t *data, struct diff_options *option return; for (i = 0; i < data->nr; i++) { - if (!data->files[i]->is_binary && - !data->files[i]->is_unmerged) { - int added = data->files[i]->added; - int deleted= data->files[i]->deleted; - if (!data->files[i]->is_renamed && - (added + deleted == 0)) { - total_files--; - } else { - adds += added; - dels += deleted; - } + int added = data->files[i]->added; + int deleted= data->files[i]->deleted; + + if (data->files[i]->is_unmerged) + continue; + if (!data->files[i]->is_renamed && (added + deleted == 0)) { + total_files--; + } else { + adds += added; + dels += deleted; } } if (options->output_prefix) { @@ -2367,6 +2402,7 @@ static void builtin_diffstat(const char *name_a, const char *name_b, { mmfile_t mf1, mf2; struct diffstat_file *data; + int same_contents; data = diffstat_add(diffstat, name_a, name_b); @@ -2375,10 +2411,17 @@ static void builtin_diffstat(const char *name_a, const char *name_b, return; } + same_contents = !hashcmp(one->sha1, two->sha1); + if (diff_filespec_is_binary(one) || diff_filespec_is_binary(two)) { data->is_binary = 1; - data->added = diff_filespec_size(two); - data->deleted = diff_filespec_size(one); + if (same_contents) { + data->added = 0; + data->deleted = 0; + } else { + data->added = diff_filespec_size(two); + data->deleted = diff_filespec_size(one); + } } else if (complete_rewrite) { @@ -2388,7 +2431,7 @@ static void builtin_diffstat(const char *name_a, const char *name_b, data->added = count_lines(two->data, two->size); } - else { + else if (!same_contents) { /* Crazy xdl interfaces.. */ xpparam_t xpp; xdemitconf_t xecfg; @@ -152,6 +152,7 @@ struct diff_options { diff_format_fn_t format_callback; void *format_callback_data; diff_prefix_fn_t output_prefix; + int output_prefix_length; void *output_prefix_data; }; @@ -74,7 +74,6 @@ char *common_prefix(const char **pathspec) int fill_directory(struct dir_struct *dir, const char **pathspec) { - const char *path; size_t len; /* @@ -82,15 +81,9 @@ int fill_directory(struct dir_struct *dir, const char **pathspec) * use that to optimize the directory walk */ len = common_prefix_len(pathspec); - path = ""; - - if (len) - path = xmemdupz(*pathspec, len); /* Read the directory and prune it */ - read_directory(dir, path, len, pathspec); - if (*path) - free((char *)path); + read_directory(dir, pathspec ? *pathspec : "", len, pathspec); return len; } @@ -873,14 +866,14 @@ enum path_treatment { }; static enum path_treatment treat_one_path(struct dir_struct *dir, - char *path, int *len, + struct strbuf *path, const struct path_simplify *simplify, int dtype, struct dirent *de) { - int exclude = excluded(dir, path, &dtype); + int exclude = excluded(dir, path->buf, &dtype); if (exclude && (dir->flags & DIR_COLLECT_IGNORED) - && exclude_matches_pathspec(path, *len, simplify)) - dir_add_ignored(dir, path, *len); + && exclude_matches_pathspec(path->buf, path->len, simplify)) + dir_add_ignored(dir, path->buf, path->len); /* * Excluded? If we don't explicitly want to show @@ -890,7 +883,7 @@ static enum path_treatment treat_one_path(struct dir_struct *dir, return path_ignored; if (dtype == DT_UNKNOWN) - dtype = get_dtype(de, path, *len); + dtype = get_dtype(de, path->buf, path->len); /* * Do we want to see just the ignored files? @@ -907,9 +900,8 @@ static enum path_treatment treat_one_path(struct dir_struct *dir, default: return path_ignored; case DT_DIR: - memcpy(path + *len, "/", 2); - (*len)++; - switch (treat_directory(dir, path, *len, simplify)) { + strbuf_addch(path, '/'); + switch (treat_directory(dir, path->buf, path->len, simplify)) { case show_directory: if (exclude != !!(dir->flags & DIR_SHOW_IGNORED)) @@ -930,26 +922,21 @@ static enum path_treatment treat_one_path(struct dir_struct *dir, static enum path_treatment treat_path(struct dir_struct *dir, struct dirent *de, - char *path, int path_max, + struct strbuf *path, int baselen, - const struct path_simplify *simplify, - int *len) + const struct path_simplify *simplify) { int dtype; if (is_dot_or_dotdot(de->d_name) || !strcmp(de->d_name, ".git")) return path_ignored; - *len = strlen(de->d_name); - /* Ignore overly long pathnames! */ - if (*len + baselen + 8 > path_max) - return path_ignored; - memcpy(path + baselen, de->d_name, *len + 1); - *len += baselen; - if (simplify_away(path, *len, simplify)) + strbuf_setlen(path, baselen); + strbuf_addstr(path, de->d_name); + if (simplify_away(path->buf, path->len, simplify)) return path_ignored; dtype = DTYPE(de); - return treat_one_path(dir, path, len, simplify, dtype, de); + return treat_one_path(dir, path, simplify, dtype, de); } /* @@ -966,22 +953,23 @@ static int read_directory_recursive(struct dir_struct *dir, int check_only, const struct path_simplify *simplify) { - DIR *fdir = opendir(*base ? base : "."); + DIR *fdir; int contents = 0; struct dirent *de; - char path[PATH_MAX + 1]; + struct strbuf path = STRBUF_INIT; - if (!fdir) - return 0; + strbuf_add(&path, base, baselen); - memcpy(path, base, baselen); + fdir = opendir(path.len ? path.buf : "."); + if (!fdir) + goto out; while ((de = readdir(fdir)) != NULL) { - int len; - switch (treat_path(dir, de, path, sizeof(path), - baselen, simplify, &len)) { + switch (treat_path(dir, de, &path, baselen, simplify)) { case path_recurse: - contents += read_directory_recursive(dir, path, len, 0, simplify); + contents += read_directory_recursive(dir, path.buf, + path.len, 0, + simplify); continue; case path_ignored: continue; @@ -990,12 +978,12 @@ static int read_directory_recursive(struct dir_struct *dir, } contents++; if (check_only) - goto exit_early; - else - dir_add_name(dir, path, len); + break; + dir_add_name(dir, path.buf, path.len); } -exit_early: closedir(fdir); + out: + strbuf_release(&path); return contents; } @@ -1058,8 +1046,8 @@ static int treat_leading_path(struct dir_struct *dir, const char *path, int len, const struct path_simplify *simplify) { - char pathbuf[PATH_MAX]; - int baselen, blen; + struct strbuf sb = STRBUF_INIT; + int baselen, rc = 0; const char *cp; while (len && path[len - 1] == '/') @@ -1074,19 +1062,22 @@ static int treat_leading_path(struct dir_struct *dir, baselen = len; else baselen = cp - path; - memcpy(pathbuf, path, baselen); - pathbuf[baselen] = '\0'; - if (!is_directory(pathbuf)) - return 0; - if (simplify_away(pathbuf, baselen, simplify)) - return 0; - blen = baselen; - if (treat_one_path(dir, pathbuf, &blen, simplify, + strbuf_setlen(&sb, 0); + strbuf_add(&sb, path, baselen); + if (!is_directory(sb.buf)) + break; + if (simplify_away(sb.buf, sb.len, simplify)) + break; + if (treat_one_path(dir, &sb, simplify, DT_DIR, NULL) == path_ignored) - return 0; /* do not recurse into it */ - if (len <= baselen) - return 1; /* finished checking */ + break; /* do not recurse into it */ + if (len <= baselen) { + rc = 1; + break; /* finished checking */ + } } + strbuf_release(&sb); + return rc; } int read_directory(struct dir_struct *dir, const char *path, int len, const char **pathspec) diff --git a/environment.c b/environment.c index d7e6c65763..669e498f5a 100644 --- a/environment.c +++ b/environment.c @@ -11,9 +11,6 @@ #include "refs.h" #include "fmt-merge-msg.h" -char git_default_email[MAX_GITNAME]; -char git_default_name[MAX_GITNAME]; -int user_ident_explicitly_given; int trust_executable_bit = 1; int trust_ctime = 1; int has_symlinks = 1; @@ -27,7 +27,7 @@ static int fsck_walk_tree(struct tree *tree, fsck_walk_func walk, void *data) else if (S_ISREG(entry.mode) || S_ISLNK(entry.mode)) result = walk(&lookup_blob(entry.sha1)->object, OBJ_BLOB, data); else { - result = error("in tree %s: entry %s has bad mode %.6o\n", + result = error("in tree %s: entry %s has bad mode %.6o", sha1_to_hex(tree->object.sha1), entry.path, entry.mode); } if (result < 0) diff --git a/generate-cmdlist.sh b/generate-cmdlist.sh index 1093ef4ad6..9a4c9b94e6 100755 --- a/generate-cmdlist.sh +++ b/generate-cmdlist.sh @@ -16,7 +16,7 @@ do /^NAME/,/git-'"$cmd"'/H ${ x - s/.*git-'"$cmd"' - \(.*\)/ {"'"$cmd"'", "\1"},/ + s/.*git-'"$cmd"' - \(.*\)/ {"'"$cmd"'", N_("\1")},/ p }' "Documentation/git-$cmd.txt" done diff --git a/git-compat-util.h b/git-compat-util.h index ed11ad8119..5bd9ad7d2a 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -595,4 +595,7 @@ int rmdir_or_warn(const char *path); */ int remove_or_warn(unsigned int mode, const char *path); +/* Get the passwd entry for the UID of the current process. */ +struct passwd *xgetpwuid_self(void); + #endif diff --git a/git-difftool--helper.sh b/git-difftool--helper.sh index e6558d1010..3d0fe0cd93 100755 --- a/git-difftool--helper.sh +++ b/git-difftool--helper.sh @@ -73,9 +73,16 @@ then fi fi -# Launch the merge tool on each path provided by 'git diff' -while test $# -gt 6 -do - launch_merge_tool "$1" "$2" "$5" - shift 7 -done +if test -n "$GIT_DIFFTOOL_DIRDIFF" +then + LOCAL="$1" + REMOTE="$2" + run_merge_tool "$merge_tool" false +else + # Launch the merge tool on each path provided by 'git diff' + while test $# -gt 6 + do + launch_merge_tool "$1" "$2" "$5" + shift 7 + done +fi diff --git a/git-difftool.perl b/git-difftool.perl index 09b65f1770..ae1e0525d8 100755 --- a/git-difftool.perl +++ b/git-difftool.perl @@ -1,121 +1,361 @@ -#!/usr/bin/env perl +#!/usr/bin/perl # Copyright (c) 2009, 2010 David Aguilar +# Copyright (c) 2012 Tim Henigan # # This is a wrapper around the GIT_EXTERNAL_DIFF-compatible # git-difftool--helper script. # # This script exports GIT_EXTERNAL_DIFF and GIT_PAGER for use by git. -# GIT_DIFFTOOL_NO_PROMPT, GIT_DIFFTOOL_PROMPT, and GIT_DIFF_TOOL -# are exported for use by git-difftool--helper. +# The GIT_DIFF* variables are exported for use by git-difftool--helper. # # Any arguments that are unknown to this script are forwarded to 'git diff'. use 5.008; use strict; use warnings; -use Cwd qw(abs_path); use File::Basename qw(dirname); +use File::Copy; +use File::Find; +use File::stat; +use File::Path qw(mkpath); +use File::Temp qw(tempdir); +use Getopt::Long qw(:config pass_through); +use Git; -require Git; - -my $DIR = abs_path(dirname($0)); - +my @tools; +my @working_tree; +my $rc; +my $repo = Git->repository(); +my $repo_path = $repo->repo_path(); sub usage { + my $exitcode = shift; print << 'USAGE'; -usage: git difftool [-t|--tool=<tool>] [-x|--extcmd=<cmd>] - [-y|--no-prompt] [-g|--gui] +usage: git difftool [-t|--tool=<tool>] [--tool-help] + [-x|--extcmd=<cmd>] + [-g|--gui] [--no-gui] + [--prompt] [-y|--no-prompt] + [-d|--dir-diff] ['git diff' options] USAGE - exit 1; + exit($exitcode); } -sub setup_environment +sub find_worktree { - $ENV{PATH} = "$DIR:$ENV{PATH}"; - $ENV{GIT_PAGER} = ''; - $ENV{GIT_EXTERNAL_DIFF} = 'git-difftool--helper'; + # Git->repository->wc_path() does not honor changes to the working + # tree location made by $ENV{GIT_WORK_TREE} or the 'core.worktree' + # config variable. + my $worktree; + my $env_worktree = $ENV{GIT_WORK_TREE}; + my $core_worktree = Git::config('core.worktree'); + + if (defined($env_worktree) and (length($env_worktree) > 0)) { + $worktree = $env_worktree; + } elsif (defined($core_worktree) and (length($core_worktree) > 0)) { + $worktree = $core_worktree; + } else { + $worktree = $repo->wc_path(); + } + + return $worktree; } -sub exe +my $workdir = find_worktree(); + +sub filter_tool_scripts { - my $exe = shift; - if ($^O eq 'MSWin32' || $^O eq 'msys') { - return "$exe.exe"; + if (-d $_) { + if ($_ ne ".") { + # Ignore files in subdirectories + $File::Find::prune = 1; + } + } else { + if ((-f $_) && ($_ ne "defaults")) { + push(@tools, $_); + } } - return $exe; } -sub generate_command +sub print_tool_help { - my @command = (exe('git'), 'diff'); - my $skip_next = 0; - my $idx = -1; - my $prompt = ''; - for my $arg (@ARGV) { - $idx++; - if ($skip_next) { - $skip_next = 0; - next; + my ($cmd, @found, @notfound); + my $gitpath = Git::exec_path(); + + find(\&filter_tool_scripts, "$gitpath/mergetools"); + + foreach my $tool (@tools) { + $cmd = "TOOL_MODE=diff"; + $cmd .= ' && . "$(git --exec-path)/git-mergetool--lib"'; + $cmd .= " && get_merge_tool_path $tool >/dev/null 2>&1"; + $cmd .= " && can_diff >/dev/null 2>&1"; + if (system('sh', '-c', $cmd) == 0) { + push(@found, $tool); + } else { + push(@notfound, $tool); } - if ($arg eq '-t' || $arg eq '--tool') { - usage() if $#ARGV <= $idx; - $ENV{GIT_DIFF_TOOL} = $ARGV[$idx + 1]; - $skip_next = 1; - next; + } + + print "'git difftool --tool=<tool>' may be set to one of the following:\n"; + print "\t$_\n" for (sort(@found)); + + print "\nThe following tools are valid, but not currently available:\n"; + print "\t$_\n" for (sort(@notfound)); + + print "\nNOTE: Some of the tools listed above only work in a windowed\n"; + print "environment. If run in a terminal-only session, they will fail.\n"; + + exit(0); +} + +sub setup_dir_diff +{ + # Run the diff; exit immediately if no diff found + # 'Repository' and 'WorkingCopy' must be explicitly set to insure that + # if $GIT_DIR and $GIT_WORK_TREE are set in ENV, they are actually used + # by Git->repository->command*. + my $diffrepo = Git->repository(Repository => $repo_path, WorkingCopy => $workdir); + my $diffrtn = $diffrepo->command_oneline('diff', '--raw', '--no-abbrev', '-z', @ARGV); + exit(0) if (length($diffrtn) == 0); + + # Setup temp directories + my $tmpdir = tempdir('git-diffall.XXXXX', CLEANUP => 1, TMPDIR => 1); + my $ldir = "$tmpdir/left"; + my $rdir = "$tmpdir/right"; + mkpath($ldir) or die $!; + mkpath($rdir) or die $!; + + # Build index info for left and right sides of the diff + my $submodule_mode = '160000'; + my $symlink_mode = '120000'; + my $null_mode = '0' x 6; + my $null_sha1 = '0' x 40; + my $lindex = ''; + my $rindex = ''; + my %submodule; + my %symlink; + my @rawdiff = split('\0', $diffrtn); + + my $i = 0; + while ($i < $#rawdiff) { + if ($rawdiff[$i] =~ /^::/) { + print "Combined diff formats ('-c' and '--cc') are not supported in directory diff mode.\n"; + exit(1); } - if ($arg =~ /^--tool=/) { - $ENV{GIT_DIFF_TOOL} = substr($arg, 7); - next; + + my ($lmode, $rmode, $lsha1, $rsha1, $status) = split(' ', substr($rawdiff[$i], 1)); + my $src_path = $rawdiff[$i + 1]; + my $dst_path; + + if ($status =~ /^[CR]/) { + $dst_path = $rawdiff[$i + 2]; + $i += 3; + } else { + $dst_path = $src_path; + $i += 2; } - if ($arg eq '-x' || $arg eq '--extcmd') { - usage() if $#ARGV <= $idx; - $ENV{GIT_DIFFTOOL_EXTCMD} = $ARGV[$idx + 1]; - $skip_next = 1; + + if (($lmode eq $submodule_mode) or ($rmode eq $submodule_mode)) { + $submodule{$src_path}{left} = $lsha1; + if ($lsha1 ne $rsha1) { + $submodule{$dst_path}{right} = $rsha1; + } else { + $submodule{$dst_path}{right} = "$rsha1-dirty"; + } next; } - if ($arg =~ /^--extcmd=/) { - $ENV{GIT_DIFFTOOL_EXTCMD} = substr($arg, 9); - next; + + if ($lmode eq $symlink_mode) { + $symlink{$src_path}{left} = $diffrepo->command_oneline('show', "$lsha1"); } - if ($arg eq '-g' || $arg eq '--gui') { - eval { - my $tool = Git::command_oneline('config', - 'diff.guitool'); - if (length($tool)) { - $ENV{GIT_DIFF_TOOL} = $tool; - } - }; - next; + + if ($rmode eq $symlink_mode) { + $symlink{$dst_path}{right} = $diffrepo->command_oneline('show', "$rsha1"); } - if ($arg eq '-y' || $arg eq '--no-prompt') { - $prompt = 'no'; - next; + + if (($lmode ne $null_mode) and ($status !~ /^C/)) { + $lindex .= "$lmode $lsha1\t$src_path\0"; } - if ($arg eq '--prompt') { - $prompt = 'yes'; - next; + + if ($rmode ne $null_mode) { + if ($rsha1 ne $null_sha1) { + $rindex .= "$rmode $rsha1\t$dst_path\0"; + } else { + push(@working_tree, $dst_path); + } } - if ($arg eq '-h') { - usage(); + } + + # If $GIT_DIR is not set prior to calling 'git update-index' and + # 'git checkout-index', then those commands will fail if difftool + # is called from a directory other than the repo root. + my $must_unset_git_dir = 0; + if (not defined($ENV{GIT_DIR})) { + $must_unset_git_dir = 1; + $ENV{GIT_DIR} = $repo_path; + } + + # Populate the left and right directories based on each index file + my ($inpipe, $ctx); + $ENV{GIT_INDEX_FILE} = "$tmpdir/lindex"; + ($inpipe, $ctx) = $repo->command_input_pipe(qw/update-index -z --index-info/); + print($inpipe $lindex); + $repo->command_close_pipe($inpipe, $ctx); + $rc = system('git', 'checkout-index', '--all', "--prefix=$ldir/"); + exit($rc | ($rc >> 8)) if ($rc != 0); + + $ENV{GIT_INDEX_FILE} = "$tmpdir/rindex"; + ($inpipe, $ctx) = $repo->command_input_pipe(qw/update-index -z --index-info/); + print($inpipe $rindex); + $repo->command_close_pipe($inpipe, $ctx); + $rc = system('git', 'checkout-index', '--all', "--prefix=$rdir/"); + exit($rc | ($rc >> 8)) if ($rc != 0); + + # If $GIT_DIR was explicitly set just for the update/checkout + # commands, then it should be unset before continuing. + delete($ENV{GIT_DIR}) if ($must_unset_git_dir); + delete($ENV{GIT_INDEX_FILE}); + + # Changes in the working tree need special treatment since they are + # not part of the index + for my $file (@working_tree) { + my $dir = dirname($file); + unless (-d "$rdir/$dir") { + mkpath("$rdir/$dir") or die $!; + } + copy("$workdir/$file", "$rdir/$file") or die $!; + chmod(stat("$workdir/$file")->mode, "$rdir/$file") or die $!; + } + + # Changes to submodules require special treatment. This loop writes a + # temporary file to both the left and right directories to show the + # change in the recorded SHA1 for the submodule. + for my $path (keys %submodule) { + if (defined($submodule{$path}{left})) { + write_to_file("$ldir/$path", "Subproject commit $submodule{$path}{left}"); + } + if (defined($submodule{$path}{right})) { + write_to_file("$rdir/$path", "Subproject commit $submodule{$path}{right}"); + } + } + + # Symbolic links require special treatment. The standard "git diff" + # shows only the link itself, not the contents of the link target. + # This loop replicates that behavior. + for my $path (keys %symlink) { + if (defined($symlink{$path}{left})) { + write_to_file("$ldir/$path", $symlink{$path}{left}); + } + if (defined($symlink{$path}{right})) { + write_to_file("$rdir/$path", $symlink{$path}{right}); } - push @command, $arg; } - if ($prompt eq 'yes') { - $ENV{GIT_DIFFTOOL_PROMPT} = 'true'; - } elsif ($prompt eq 'no') { - $ENV{GIT_DIFFTOOL_NO_PROMPT} = 'true'; + + return ($ldir, $rdir); +} + +sub write_to_file +{ + my $path = shift; + my $value = shift; + + # Make sure the path to the file exists + my $dir = dirname($path); + unless (-d "$dir") { + mkpath("$dir") or die $!; } - return @command + + # If the file already exists in that location, delete it. This + # is required in the case of symbolic links. + unlink("$path"); + + open(my $fh, '>', "$path") or die $!; + print($fh $value); + close($fh); } -setup_environment(); +# parse command-line options. all unrecognized options and arguments +# are passed through to the 'git diff' command. +my ($difftool_cmd, $dirdiff, $extcmd, $gui, $help, $prompt, $tool_help); +GetOptions('g|gui!' => \$gui, + 'd|dir-diff' => \$dirdiff, + 'h' => \$help, + 'prompt!' => \$prompt, + 'y' => sub { $prompt = 0; }, + 't|tool:s' => \$difftool_cmd, + 'tool-help' => \$tool_help, + 'x|extcmd:s' => \$extcmd); -# ActiveState Perl for Win32 does not implement POSIX semantics of -# exec* system call. It just spawns the given executable and finishes -# the starting program, exiting with code 0. -# system will at least catch the errors returned by git diff, -# allowing the caller of git difftool better handling of failures. -my $rc = system(generate_command()); -exit($rc | ($rc >> 8)); +if (defined($help)) { + usage(0); +} +if (defined($tool_help)) { + print_tool_help(); +} +if (defined($difftool_cmd)) { + if (length($difftool_cmd) > 0) { + $ENV{GIT_DIFF_TOOL} = $difftool_cmd; + } else { + print "No <tool> given for --tool=<tool>\n"; + usage(1); + } +} +if (defined($extcmd)) { + if (length($extcmd) > 0) { + $ENV{GIT_DIFFTOOL_EXTCMD} = $extcmd; + } else { + print "No <cmd> given for --extcmd=<cmd>\n"; + usage(1); + } +} +if ($gui) { + my $guitool = ''; + $guitool = Git::config('diff.guitool'); + if (length($guitool) > 0) { + $ENV{GIT_DIFF_TOOL} = $guitool; + } +} + +# In directory diff mode, 'git-difftool--helper' is called once +# to compare the a/b directories. In file diff mode, 'git diff' +# will invoke a separate instance of 'git-difftool--helper' for +# each file that changed. +if (defined($dirdiff)) { + my ($a, $b) = setup_dir_diff(); + if (defined($extcmd)) { + $rc = system($extcmd, $a, $b); + } else { + $ENV{GIT_DIFFTOOL_DIRDIFF} = 'true'; + $rc = system('git', 'difftool--helper', $a, $b); + } + + exit($rc | ($rc >> 8)) if ($rc != 0); + + # If the diff including working copy files and those + # files were modified during the diff, then the changes + # should be copied back to the working tree + for my $file (@working_tree) { + copy("$b/$file", "$workdir/$file") or die $!; + chmod(stat("$b/$file")->mode, "$workdir/$file") or die $!; + } +} else { + if (defined($prompt)) { + if ($prompt) { + $ENV{GIT_DIFFTOOL_PROMPT} = 'true'; + } else { + $ENV{GIT_DIFFTOOL_NO_PROMPT} = 'true'; + } + } + + $ENV{GIT_PAGER} = ''; + $ENV{GIT_EXTERNAL_DIFF} = 'git-difftool--helper'; + + # ActiveState Perl for Win32 does not implement POSIX semantics of + # exec* system call. It just spawns the given executable and finishes + # the starting program, exiting with code 0. + # system will at least catch the errors returned by git diff, + # allowing the caller of git difftool better handling of failures. + my $rc = system('git', 'diff', @ARGV); + exit($rc | ($rc >> 8)); +} @@ -133,25 +133,29 @@ def p4_system(cmd): subprocess.check_call(real_cmd, shell=expand) def p4_integrate(src, dest): - p4_system(["integrate", "-Dt", src, dest]) + p4_system(["integrate", "-Dt", wildcard_encode(src), wildcard_encode(dest)]) -def p4_sync(path): - p4_system(["sync", path]) +def p4_sync(f, *options): + p4_system(["sync"] + list(options) + [wildcard_encode(f)]) def p4_add(f): - p4_system(["add", f]) + # forcibly add file names with wildcards + if wildcard_present(f): + p4_system(["add", "-f", f]) + else: + p4_system(["add", f]) def p4_delete(f): - p4_system(["delete", f]) + p4_system(["delete", wildcard_encode(f)]) def p4_edit(f): - p4_system(["edit", f]) + p4_system(["edit", wildcard_encode(f)]) def p4_revert(f): - p4_system(["revert", f]) + p4_system(["revert", wildcard_encode(f)]) -def p4_reopen(type, file): - p4_system(["reopen", "-t", type, file]) +def p4_reopen(type, f): + p4_system(["reopen", "-t", type, wildcard_encode(f)]) # # Canonicalize the p4 type and return a tuple of the @@ -248,7 +252,7 @@ def setP4ExecBit(file, mode): def getP4OpenedType(file): # Returns the perforce file type for the given file. - result = p4_read_pipe(["opened", file]) + result = p4_read_pipe(["opened", wildcard_encode(file)]) match = re.match(".*\((.+)\)\r?$", result) if match: return match.group(1) @@ -658,6 +662,34 @@ def getClientRoot(): return entry["Root"] +# +# P4 wildcards are not allowed in filenames. P4 complains +# if you simply add them, but you can force it with "-f", in +# which case it translates them into %xx encoding internally. +# +def wildcard_decode(path): + # Search for and fix just these four characters. Do % last so + # that fixing it does not inadvertently create new %-escapes. + # Cannot have * in a filename in windows; untested as to + # what p4 would do in such a case. + if not platform.system() == "Windows": + path = path.replace("%2A", "*") + path = path.replace("%23", "#") \ + .replace("%40", "@") \ + .replace("%25", "%") + return path + +def wildcard_encode(path): + # do % first to avoid double-encoding the %s introduced here + path = path.replace("%", "%25") \ + .replace("*", "%2A") \ + .replace("#", "%23") \ + .replace("@", "%40") + return path + +def wildcard_present(path): + return path.translate(None, "*#@%") != path + class Command: def __init__(self): self.usage = "usage: %prog [options]" @@ -1038,6 +1070,7 @@ class P4Submit(Command, P4UserMap): filesToAdd = set() filesToDelete = set() editedFiles = set() + pureRenameCopy = set() filesToChangeExecBit = {} for line in diff: @@ -1061,10 +1094,13 @@ class P4Submit(Command, P4UserMap): elif modifier == "C": src, dest = diff['src'], diff['dst'] p4_integrate(src, dest) + pureRenameCopy.add(dest) if diff['src_sha1'] != diff['dst_sha1']: p4_edit(dest) + pureRenameCopy.discard(dest) if isModeExecChanged(diff['src_mode'], diff['dst_mode']): p4_edit(dest) + pureRenameCopy.discard(dest) filesToChangeExecBit[dest] = diff['dst_mode'] os.unlink(dest) editedFiles.add(dest) @@ -1073,6 +1109,8 @@ class P4Submit(Command, P4UserMap): p4_integrate(src, dest) if diff['src_sha1'] != diff['dst_sha1']: p4_edit(dest) + else: + pureRenameCopy.add(dest) if isModeExecChanged(diff['src_mode'], diff['dst_mode']): p4_edit(dest) filesToChangeExecBit[dest] = diff['dst_mode'] @@ -1181,7 +1219,8 @@ class P4Submit(Command, P4UserMap): del(os.environ["P4DIFF"]) diff = "" for editedFile in editedFiles: - diff += p4_read_pipe(['diff', '-du', editedFile]) + diff += p4_read_pipe(['diff', '-du', + wildcard_encode(editedFile)]) newdiff = "" for newFile in filesToAdd: @@ -1226,6 +1265,12 @@ class P4Submit(Command, P4UserMap): # unmarshalled. changelist = self.lastP4Changelist() self.modifyChangelistUser(changelist, p4User) + + # The rename/copy happened by applying a patch that created a + # new file. This leaves it writable, which confuses p4. + for f in pureRenameCopy: + p4_sync(f, "-f") + else: # skip this patch print "Submission cancelled, undoing p4 changes." @@ -1257,7 +1302,7 @@ class P4Submit(Command, P4UserMap): if not m.match(name): if verbose: - print "tag %s does not match regexp %s" % (name, validTagRegexp) + print "tag %s does not match regexp %s" % (name, validLabelRegexp) continue # Get the p4 commit this corresponds to @@ -1361,12 +1406,18 @@ class P4Submit(Command, P4UserMap): self.oldWorkingDirectory = os.getcwd() # ensure the clientPath exists + new_client_dir = False if not os.path.exists(self.clientPath): + new_client_dir = True os.makedirs(self.clientPath) chdir(self.clientPath) print "Synchronizing p4 checkout..." - p4_sync("...") + if new_client_dir: + # old one was destroyed, and maybe nobody told p4 + p4_sync("...", "-f") + else: + p4_sync("...") self.check() commits = [] @@ -1400,7 +1451,7 @@ class P4Submit(Command, P4UserMap): rebase.rebase() if gitConfig("git-p4.exportLabels", "--bool") == "true": - self.exportLabels = true + self.exportLabels = True if self.exportLabels: p4Labels = getP4Labels(self.depotPath) @@ -1679,23 +1730,6 @@ class P4Sync(Command, P4UserMap): if gitConfig("git-p4.syncFromOrigin") == "false": self.syncWithOrigin = False - # - # P4 wildcards are not allowed in filenames. P4 complains - # if you simply add them, but you can force it with "-f", in - # which case it translates them into %xx encoding internally. - # Search for and fix just these four characters. Do % last so - # that fixing it does not inadvertently create new %-escapes. - # - def wildcard_decode(self, path): - # Cannot have * in a filename in windows; untested as to - # what p4 would do in such a case. - if not self.isWindows: - path = path.replace("%2A", "*") - path = path.replace("%23", "#") \ - .replace("%40", "@") \ - .replace("%25", "%") - return path - # Force a checkpoint in fast-import and wait for it to finish def checkpoint(self): self.gitStream.write("checkpoint\n\n") @@ -1763,6 +1797,7 @@ class P4Sync(Command, P4UserMap): fnum = fnum + 1 relPath = self.stripRepoPath(path, self.depotPaths) + relPath = wildcard_decode(relPath) for branch in self.knownBranches.keys(): @@ -1780,7 +1815,7 @@ class P4Sync(Command, P4UserMap): def streamOneP4File(self, file, contents): relPath = self.stripRepoPath(file['depotFile'], self.branchPrefixes) - relPath = self.wildcard_decode(relPath) + relPath = wildcard_decode(relPath) if verbose: sys.stderr.write("%s\n" % relPath) @@ -1849,6 +1884,7 @@ class P4Sync(Command, P4UserMap): def streamOneP4Deletion(self, file): relPath = self.stripRepoPath(file['path'], self.branchPrefixes) + relPath = wildcard_decode(relPath) if verbose: sys.stderr.write("delete %s\n" % relPath) self.gitStream.write("D %s\n" % relPath) @@ -2675,7 +2711,7 @@ class P4Sync(Command, P4UserMap): sys.stdout.write("\n") if gitConfig("git-p4.importLabels", "--bool") == "true": - self.importLabels = true + self.importLabels = True if self.importLabels: p4Labels = getP4Labels(self.depotPaths) diff --git a/git-rebase.sh b/git-rebase.sh index 24a2840033..e616737444 100755 --- a/git-rebase.sh +++ b/git-rebase.sh @@ -167,6 +167,7 @@ run_specific_rebase () { if [ "$interactive_rebase" = implied ]; then GIT_EDITOR=: export GIT_EDITOR + autosquash= fi . git-rebase--$type } @@ -423,7 +424,7 @@ case "$onto_name" in ;; *) onto=$(git rev-parse --verify "${onto_name}^0") || - die "Does not point to a valid commit: $1" + die "Does not point to a valid commit: $onto_name" ;; esac diff --git a/git-relink.perl b/git-relink.perl index e136732cea..f29285c411 100755 --- a/git-relink.perl +++ b/git-relink.perl @@ -1,4 +1,4 @@ -#!/usr/bin/env perl +#!/usr/bin/perl # Copyright 2005, Ryan Anderson <ryan@michonline.com> # Distribution permitted under the GPL v2, as distributed # by the Free Software Foundation. diff --git a/git-sh-setup.sh b/git-sh-setup.sh index 7b3ae75d7a..770a86e2b7 100644 --- a/git-sh-setup.sh +++ b/git-sh-setup.sh @@ -218,27 +218,8 @@ clear_local_git_env() { unset $(git rev-parse --local-env-vars) } -# Make sure we are in a valid repository of a vintage we understand, -# if we require to be in a git repository. -if test -z "$NONGIT_OK" -then - GIT_DIR=$(git rev-parse --git-dir) || exit - if [ -z "$SUBDIRECTORY_OK" ] - then - test -z "$(git rev-parse --show-cdup)" || { - exit=$? - echo >&2 "You need to run this command from the toplevel of the working tree." - exit $exit - } - fi - test -n "$GIT_DIR" && GIT_DIR=$(cd "$GIT_DIR" && pwd) || { - echo >&2 "Unable to determine absolute path of git directory" - exit 1 - } - : ${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"} -fi -# Fix some commands on Windows +# Platform specific tweaks to work around some commands case $(uname -s) in *MINGW*) # Windows has its own (incompatible) sort and find @@ -269,3 +250,23 @@ case $(uname -s) in return 1 } esac + +# Make sure we are in a valid repository of a vintage we understand, +# if we require to be in a git repository. +if test -z "$NONGIT_OK" +then + GIT_DIR=$(git rev-parse --git-dir) || exit + if [ -z "$SUBDIRECTORY_OK" ] + then + test -z "$(git rev-parse --show-cdup)" || { + exit=$? + echo >&2 "You need to run this command from the toplevel of the working tree." + exit $exit + } + fi + test -n "$GIT_DIR" && GIT_DIR=$(cd "$GIT_DIR" && pwd) || { + echo >&2 "Unable to determine absolute path of git directory" + exit 1 + } + : ${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"} +fi diff --git a/git-submodule.sh b/git-submodule.sh index 64a70d621a..5c61ae2b43 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -396,8 +396,9 @@ cmd_init() module_list "$@" | while read mode sha1 stage sm_path do - # Skip already registered paths name=$(module_name "$sm_path") || exit + + # Copy url setting when it is not set yet if test -z "$(git config "submodule.$name.url")" then url=$(git config -f .gitmodules submodule."$name".url) @@ -412,6 +413,8 @@ cmd_init() esac git config submodule."$name".url "$url" || die "$(eval_gettext "Failed to register url for submodule path '\$sm_path'")" + + say "$(eval_gettext "Submodule '\$name' (\$url) registered for path '\$sm_path'")" fi # Copy "update" setting when it is not set yet @@ -420,8 +423,6 @@ cmd_init() test -n "$(git config submodule."$name".update)" || git config submodule."$name".update "$upd" || die "$(eval_gettext "Failed to register update mode for submodule path '\$sm_path'")" - - say "$(eval_gettext "Submodule '\$name' (\$url) registered for path '\$sm_path'")" done } diff --git a/git-svn.perl b/git-svn.perl index abbd6b8460..3dc492d44d 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -1,4 +1,4 @@ -#!/usr/bin/env perl +#!/usr/bin/perl # Copyright (C) 2006, Eric Wong <normalperson@yhbt.net> # License: GPL v2 or later use 5.008; @@ -68,8 +68,7 @@ sub _req_svn { } my $can_compress = eval { require Compress::Zlib; 1}; push @Git::SVN::Ra::ISA, 'SVN::Ra'; -push @SVN::Git::Editor::ISA, 'SVN::Delta::Editor'; -push @SVN::Git::Fetcher::ISA, 'SVN::Delta::Editor'; +push @Git::SVN::Editor::ISA, 'SVN::Delta::Editor'; use Carp qw/croak/; use Digest::MD5; use IO::File qw//; @@ -80,6 +79,8 @@ use File::Find; use Getopt::Long qw/:config gnu_getopt no_ignore_case auto_abbrev/; use IPC::Open3; use Git; +use Git::SVN::Fetcher qw//; +use Git::SVN::Prompt qw//; use Memoize; # core since 5.8.0, Jul 2002 BEGIN { @@ -88,7 +89,7 @@ BEGIN { foreach (qw/command command_oneline command_noisy command_output_pipe command_input_pipe command_close_pipe command_bidi_pipe command_close_bidi_pipe/) { - for my $package ( qw(SVN::Git::Editor SVN::Git::Fetcher + for my $package ( qw(Git::SVN::Editor Git::SVN::Migration Git::SVN::Log Git::SVN), __PACKAGE__) { *{"${package}::$_"} = \&{"Git::$_"}; @@ -106,16 +107,16 @@ my ($_stdin, $_help, $_edit, $_message, $_file, $_branch_dest, $_template, $_shared, $_version, $_fetch_all, $_no_rebase, $_fetch_parent, - $_merge, $_strategy, $_dry_run, $_local, + $_merge, $_strategy, $_preserve_merges, $_dry_run, $_local, $_prefix, $_no_checkout, $_url, $_verbose, $_git_format, $_commit_url, $_tag, $_merge_info, $_interactive); $Git::SVN::_follow_parent = 1; -$SVN::Git::Fetcher::_placeholder_filename = ".gitignore"; +$Git::SVN::Fetcher::_placeholder_filename = ".gitignore"; $_q ||= 0; my %remote_opts = ( 'username=s' => \$Git::SVN::Prompt::_username, 'config-dir=s' => \$Git::SVN::Ra::config_dir, 'no-auth-cache' => \$Git::SVN::Prompt::_no_auth_cache, - 'ignore-paths=s' => \$SVN::Git::Fetcher::_ignore_regex, + 'ignore-paths=s' => \$Git::SVN::Fetcher::_ignore_regex, 'ignore-refs=s' => \$Git::SVN::Ra::_ignore_refs_regex ); my %fc_opts = ( 'follow-parent|follow!' => \$Git::SVN::_follow_parent, 'authors-file|A=s' => \$_authors, @@ -148,10 +149,10 @@ my %init_opts = ( 'template=s' => \$_template, 'shared:s' => \$_shared, 'rewrite-uuid=s' => sub { $icv{rewriteUUID} = $_[1] }, %remote_opts ); my %cmt_opts = ( 'edit|e' => \$_edit, - 'rmdir' => \$SVN::Git::Editor::_rmdir, - 'find-copies-harder' => \$SVN::Git::Editor::_find_copies_harder, - 'l=i' => \$SVN::Git::Editor::_rename_limit, - 'copy-similarity|C=i'=> \$SVN::Git::Editor::_cp_similarity + 'rmdir' => \$Git::SVN::Editor::_rmdir, + 'find-copies-harder' => \$Git::SVN::Editor::_find_copies_harder, + 'l=i' => \$Git::SVN::Editor::_rename_limit, + 'copy-similarity|C=i'=> \$Git::SVN::Editor::_cp_similarity ); my %cmd = ( @@ -163,9 +164,9 @@ my %cmd = ( clone => [ \&cmd_clone, "Initialize and fetch revisions", { 'revision|r=s' => \$_revision, 'preserve-empty-dirs' => - \$SVN::Git::Fetcher::_preserve_empty_dirs, + \$Git::SVN::Fetcher::_preserve_empty_dirs, 'placeholder-filename=s' => - \$SVN::Git::Fetcher::_placeholder_filename, + \$Git::SVN::Fetcher::_placeholder_filename, %fc_opts, %init_opts } ], init => [ \&cmd_init, "Initialize a repo for tracking" . " (requires URL argument)", @@ -255,6 +256,7 @@ my %cmd = ( 'local|l' => \$_local, 'fetch-all|all' => \$_fetch_all, 'dry-run|n' => \$_dry_run, + 'preserve-merges|p' => \$_preserve_merges, %fc_opts } ], 'commit-diff' => [ \&cmd_commit_diff, 'Commit a diff between two trees', @@ -462,15 +464,15 @@ sub do_git_init_db { command_noisy('config', "$pfx.$i", $icv{$i}); $set = $i; } - my $ignore_paths_regex = \$SVN::Git::Fetcher::_ignore_regex; + my $ignore_paths_regex = \$Git::SVN::Fetcher::_ignore_regex; command_noisy('config', "$pfx.ignore-paths", $$ignore_paths_regex) if defined $$ignore_paths_regex; my $ignore_refs_regex = \$Git::SVN::Ra::_ignore_refs_regex; command_noisy('config', "$pfx.ignore-refs", $$ignore_refs_regex) if defined $$ignore_refs_regex; - if (defined $SVN::Git::Fetcher::_preserve_empty_dirs) { - my $fname = \$SVN::Git::Fetcher::_placeholder_filename; + if (defined $Git::SVN::Fetcher::_preserve_empty_dirs) { + my $fname = \$Git::SVN::Fetcher::_placeholder_filename; command_noisy('config', "$pfx.preserve-empty-dirs", 'true'); command_noisy('config', "$pfx.placeholder-filename", $$fname); } @@ -940,7 +942,7 @@ sub cmd_dcommit { }, mergeinfo => $_merge_info, svn_path => ''); - if (!SVN::Git::Editor->new(\%ed_opts)->apply_diff) { + if (!Git::SVN::Editor->new(\%ed_opts)->apply_diff) { print "No changes\n$d~1 == $d\n"; } elsif ($parents->{$d} && @{$parents->{$d}}) { $gs->{inject_parents_dcommit}->{$cmt_rev} = @@ -1064,8 +1066,8 @@ sub cmd_branch { " with the --destination argument.\n"; } foreach my $g (@{$allglobs}) { - # SVN::Git::Editor could probably be moved to Git.pm.. - my $re = SVN::Git::Editor::glob2pat($g->{path}->{left}); + # Git::SVN::Editor could probably be moved to Git.pm.. + my $re = Git::SVN::Editor::glob2pat($g->{path}->{left}); if ($_branch_dest =~ /$re/) { $glob = $g; last; @@ -1423,7 +1425,7 @@ sub cmd_commit_diff { tree_b => $tb, editor_cb => sub { print "Committed r$_[0]\n" }, svn_path => $svn_path ); - if (!SVN::Git::Editor->new(\%ed_opts)->apply_diff) { + if (!Git::SVN::Editor->new(\%ed_opts)->apply_diff) { print "No changes\n$ta == $tb\n"; } } @@ -1592,6 +1594,7 @@ sub rebase_cmd { push @cmd, '-v' if $_verbose; push @cmd, qw/--merge/ if $_merge; push @cmd, "--strategy=$_strategy" if $_strategy; + push @cmd, "--preserve-merges" if $_preserve_merges; @cmd; } @@ -3154,7 +3157,7 @@ sub find_parent_branch { # at the moment), so we can't rely on it $self->{last_rev} = $r0; $self->{last_commit} = $parent; - $ed = SVN::Git::Fetcher->new($self, $gs->{path}); + $ed = Git::SVN::Fetcher->new($self, $gs->{path}); $gs->ra->gs_do_switch($r0, $rev, $gs, $self->full_url, $ed) or die "SVN connection failed somewhere...\n"; @@ -3172,7 +3175,7 @@ sub find_parent_branch { } else { print STDERR "Following parent with do_update\n" unless $::_q > 1; - $ed = SVN::Git::Fetcher->new($self); + $ed = Git::SVN::Fetcher->new($self); $self->ra->gs_do_update($rev, $rev, $self, $ed) or die "SVN connection failed somewhere...\n"; } @@ -3195,7 +3198,7 @@ sub do_fetch { push @{$log_entry->{parents}}, $lc; return $log_entry; } - $ed = SVN::Git::Fetcher->new($self); + $ed = Git::SVN::Fetcher->new($self); $last_rev = $self->{last_rev}; $ed->{c} = $lc; @parents = ($lc); @@ -3204,7 +3207,7 @@ sub do_fetch { if (my $log_entry = $self->find_parent_branch($paths, $rev)) { return $log_entry; } - $ed = SVN::Git::Fetcher->new($self); + $ed = Git::SVN::Fetcher->new($self); } unless ($self->ra->gs_do_update($last_rev, $rev, $self, $ed)) { die "SVN connection failed somewhere...\n"; @@ -3909,7 +3912,7 @@ sub set_tree { editor_cb => sub { $self->set_tree_cb($log_entry, $tree, @_) }, svn_path => $self->{path} ); - if (!SVN::Git::Editor->new(\%ed_opts)->apply_diff) { + if (!Git::SVN::Editor->new(\%ed_opts)->apply_diff) { print "No changes\nr$self->{last_rev} = $tree\n"; } } @@ -4325,654 +4328,7 @@ sub remove_username { $_[0] =~ s{^([^:]*://)[^@]+@}{$1}; } -package Git::SVN::Prompt; -use strict; -use warnings; -require SVN::Core; -use vars qw/$_no_auth_cache $_username/; - -sub simple { - my ($cred, $realm, $default_username, $may_save, $pool) = @_; - $may_save = undef if $_no_auth_cache; - $default_username = $_username if defined $_username; - if (defined $default_username && length $default_username) { - if (defined $realm && length $realm) { - print STDERR "Authentication realm: $realm\n"; - STDERR->flush; - } - $cred->username($default_username); - } else { - username($cred, $realm, $may_save, $pool); - } - $cred->password(_read_password("Password for '" . - $cred->username . "': ", $realm)); - $cred->may_save($may_save); - $SVN::_Core::SVN_NO_ERROR; -} - -sub ssl_server_trust { - my ($cred, $realm, $failures, $cert_info, $may_save, $pool) = @_; - $may_save = undef if $_no_auth_cache; - print STDERR "Error validating server certificate for '$realm':\n"; - { - no warnings 'once'; - # All variables SVN::Auth::SSL::* are used only once, - # so we're shutting up Perl warnings about this. - if ($failures & $SVN::Auth::SSL::UNKNOWNCA) { - print STDERR " - The certificate is not issued ", - "by a trusted authority. Use the\n", - " fingerprint to validate ", - "the certificate manually!\n"; - } - if ($failures & $SVN::Auth::SSL::CNMISMATCH) { - print STDERR " - The certificate hostname ", - "does not match.\n"; - } - if ($failures & $SVN::Auth::SSL::NOTYETVALID) { - print STDERR " - The certificate is not yet valid.\n"; - } - if ($failures & $SVN::Auth::SSL::EXPIRED) { - print STDERR " - The certificate has expired.\n"; - } - if ($failures & $SVN::Auth::SSL::OTHER) { - print STDERR " - The certificate has ", - "an unknown error.\n"; - } - } # no warnings 'once' - printf STDERR - "Certificate information:\n". - " - Hostname: %s\n". - " - Valid: from %s until %s\n". - " - Issuer: %s\n". - " - Fingerprint: %s\n", - map $cert_info->$_, qw(hostname valid_from valid_until - issuer_dname fingerprint); - my $choice; -prompt: - print STDERR $may_save ? - "(R)eject, accept (t)emporarily or accept (p)ermanently? " : - "(R)eject or accept (t)emporarily? "; - STDERR->flush; - $choice = lc(substr(<STDIN> || 'R', 0, 1)); - if ($choice =~ /^t$/i) { - $cred->may_save(undef); - } elsif ($choice =~ /^r$/i) { - return -1; - } elsif ($may_save && $choice =~ /^p$/i) { - $cred->may_save($may_save); - } else { - goto prompt; - } - $cred->accepted_failures($failures); - $SVN::_Core::SVN_NO_ERROR; -} - -sub ssl_client_cert { - my ($cred, $realm, $may_save, $pool) = @_; - $may_save = undef if $_no_auth_cache; - print STDERR "Client certificate filename: "; - STDERR->flush; - chomp(my $filename = <STDIN>); - $cred->cert_file($filename); - $cred->may_save($may_save); - $SVN::_Core::SVN_NO_ERROR; -} - -sub ssl_client_cert_pw { - my ($cred, $realm, $may_save, $pool) = @_; - $may_save = undef if $_no_auth_cache; - $cred->password(_read_password("Password: ", $realm)); - $cred->may_save($may_save); - $SVN::_Core::SVN_NO_ERROR; -} - -sub username { - my ($cred, $realm, $may_save, $pool) = @_; - $may_save = undef if $_no_auth_cache; - if (defined $realm && length $realm) { - print STDERR "Authentication realm: $realm\n"; - } - my $username; - if (defined $_username) { - $username = $_username; - } else { - print STDERR "Username: "; - STDERR->flush; - chomp($username = <STDIN>); - } - $cred->username($username); - $cred->may_save($may_save); - $SVN::_Core::SVN_NO_ERROR; -} - -sub _read_password { - my ($prompt, $realm) = @_; - my $password = ''; - if (exists $ENV{GIT_ASKPASS}) { - open(PH, "-|", $ENV{GIT_ASKPASS}, $prompt); - $password = <PH>; - $password =~ s/[\012\015]//; # \n\r - close(PH); - } else { - print STDERR $prompt; - STDERR->flush; - require Term::ReadKey; - Term::ReadKey::ReadMode('noecho'); - while (defined(my $key = Term::ReadKey::ReadKey(0))) { - last if $key =~ /[\012\015]/; # \n\r - $password .= $key; - } - Term::ReadKey::ReadMode('restore'); - print STDERR "\n"; - STDERR->flush; - } - $password; -} - -package SVN::Git::Fetcher; -use vars qw/@ISA $_ignore_regex $_preserve_empty_dirs $_placeholder_filename - @deleted_gpath %added_placeholder $repo_id/; -use strict; -use warnings; -use Carp qw/croak/; -use File::Basename qw/dirname/; -use IO::File qw//; - -# file baton members: path, mode_a, mode_b, pool, fh, blob, base -sub new { - my ($class, $git_svn, $switch_path) = @_; - my $self = SVN::Delta::Editor->new; - bless $self, $class; - if (exists $git_svn->{last_commit}) { - $self->{c} = $git_svn->{last_commit}; - $self->{empty_symlinks} = - _mark_empty_symlinks($git_svn, $switch_path); - } - - # some options are read globally, but can be overridden locally - # per [svn-remote "..."] section. Command-line options will *NOT* - # override options set in an [svn-remote "..."] section - $repo_id = $git_svn->{repo_id}; - my $k = "svn-remote.$repo_id.ignore-paths"; - my $v = eval { command_oneline('config', '--get', $k) }; - $self->{ignore_regex} = $v; - - $k = "svn-remote.$repo_id.preserve-empty-dirs"; - $v = eval { command_oneline('config', '--get', '--bool', $k) }; - if ($v && $v eq 'true') { - $_preserve_empty_dirs = 1; - $k = "svn-remote.$repo_id.placeholder-filename"; - $v = eval { command_oneline('config', '--get', $k) }; - $_placeholder_filename = $v; - } - - # Load the list of placeholder files added during previous invocations. - $k = "svn-remote.$repo_id.added-placeholder"; - $v = eval { command_oneline('config', '--get-all', $k) }; - if ($_preserve_empty_dirs && $v) { - # command() prints errors to stderr, so we only call it if - # command_oneline() succeeded. - my @v = command('config', '--get-all', $k); - $added_placeholder{ dirname($_) } = $_ foreach @v; - } - - $self->{empty} = {}; - $self->{dir_prop} = {}; - $self->{file_prop} = {}; - $self->{absent_dir} = {}; - $self->{absent_file} = {}; - $self->{gii} = $git_svn->tmp_index_do(sub { Git::IndexInfo->new }); - $self->{pathnameencoding} = Git::config('svn.pathnameencoding'); - $self; -} - -# this uses the Ra object, so it must be called before do_{switch,update}, -# not inside them (when the Git::SVN::Fetcher object is passed) to -# do_{switch,update} -sub _mark_empty_symlinks { - my ($git_svn, $switch_path) = @_; - my $bool = Git::config_bool('svn.brokenSymlinkWorkaround'); - return {} if (!defined($bool)) || (defined($bool) && ! $bool); - - my %ret; - my ($rev, $cmt) = $git_svn->last_rev_commit; - return {} unless ($rev && $cmt); - - # allow the warning to be printed for each revision we fetch to - # ensure the user sees it. The user can also disable the workaround - # on the repository even while git svn is running and the next - # revision fetched will skip this expensive function. - my $printed_warning; - chomp(my $empty_blob = `git hash-object -t blob --stdin < /dev/null`); - my ($ls, $ctx) = command_output_pipe(qw/ls-tree -r -z/, $cmt); - local $/ = "\0"; - my $pfx = defined($switch_path) ? $switch_path : $git_svn->{path}; - $pfx .= '/' if length($pfx); - while (<$ls>) { - chomp; - s/\A100644 blob $empty_blob\t//o or next; - unless ($printed_warning) { - print STDERR "Scanning for empty symlinks, ", - "this may take a while if you have ", - "many empty files\n", - "You may disable this with `", - "git config svn.brokenSymlinkWorkaround ", - "false'.\n", - "This may be done in a different ", - "terminal without restarting ", - "git svn\n"; - $printed_warning = 1; - } - my $path = $_; - my (undef, $props) = - $git_svn->ra->get_file($pfx.$path, $rev, undef); - if ($props->{'svn:special'}) { - $ret{$path} = 1; - } - } - command_close_pipe($ls, $ctx); - \%ret; -} - -# returns true if a given path is inside a ".git" directory -sub in_dot_git { - $_[0] =~ m{(?:^|/)\.git(?:/|$)}; -} - -# return value: 0 -- don't ignore, 1 -- ignore -sub is_path_ignored { - my ($self, $path) = @_; - return 1 if in_dot_git($path); - return 1 if defined($self->{ignore_regex}) && - $path =~ m!$self->{ignore_regex}!; - return 0 unless defined($_ignore_regex); - return 1 if $path =~ m!$_ignore_regex!o; - return 0; -} - -sub set_path_strip { - my ($self, $path) = @_; - $self->{path_strip} = qr/^\Q$path\E(\/|$)/ if length $path; -} - -sub open_root { - { path => '' }; -} - -sub open_directory { - my ($self, $path, $pb, $rev) = @_; - { path => $path }; -} - -sub git_path { - my ($self, $path) = @_; - if (my $enc = $self->{pathnameencoding}) { - require Encode; - Encode::from_to($path, 'UTF-8', $enc); - } - if ($self->{path_strip}) { - $path =~ s!$self->{path_strip}!! or - die "Failed to strip path '$path' ($self->{path_strip})\n"; - } - $path; -} - -sub delete_entry { - my ($self, $path, $rev, $pb) = @_; - return undef if $self->is_path_ignored($path); - - my $gpath = $self->git_path($path); - return undef if ($gpath eq ''); - - # remove entire directories. - my ($tree) = (command('ls-tree', '-z', $self->{c}, "./$gpath") - =~ /\A040000 tree ([a-f\d]{40})\t\Q$gpath\E\0/); - if ($tree) { - my ($ls, $ctx) = command_output_pipe(qw/ls-tree - -r --name-only -z/, - $tree); - local $/ = "\0"; - while (<$ls>) { - chomp; - my $rmpath = "$gpath/$_"; - $self->{gii}->remove($rmpath); - print "\tD\t$rmpath\n" unless $::_q; - } - print "\tD\t$gpath/\n" unless $::_q; - command_close_pipe($ls, $ctx); - } else { - $self->{gii}->remove($gpath); - print "\tD\t$gpath\n" unless $::_q; - } - # Don't add to @deleted_gpath if we're deleting a placeholder file. - push @deleted_gpath, $gpath unless $added_placeholder{dirname($path)}; - $self->{empty}->{$path} = 0; - undef; -} - -sub open_file { - my ($self, $path, $pb, $rev) = @_; - my ($mode, $blob); - - goto out if $self->is_path_ignored($path); - - my $gpath = $self->git_path($path); - ($mode, $blob) = (command('ls-tree', '-z', $self->{c}, "./$gpath") - =~ /\A(\d{6}) blob ([a-f\d]{40})\t\Q$gpath\E\0/); - unless (defined $mode && defined $blob) { - die "$path was not found in commit $self->{c} (r$rev)\n"; - } - if ($mode eq '100644' && $self->{empty_symlinks}->{$path}) { - $mode = '120000'; - } -out: - { path => $path, mode_a => $mode, mode_b => $mode, blob => $blob, - pool => SVN::Pool->new, action => 'M' }; -} - -sub add_file { - my ($self, $path, $pb, $cp_path, $cp_rev) = @_; - my $mode; - - if (!$self->is_path_ignored($path)) { - my ($dir, $file) = ($path =~ m#^(.*?)/?([^/]+)$#); - delete $self->{empty}->{$dir}; - $mode = '100644'; - - if ($added_placeholder{$dir}) { - # Remove our placeholder file, if we created one. - delete_entry($self, $added_placeholder{$dir}) - unless $path eq $added_placeholder{$dir}; - delete $added_placeholder{$dir} - } - } - - { path => $path, mode_a => $mode, mode_b => $mode, - pool => SVN::Pool->new, action => 'A' }; -} - -sub add_directory { - my ($self, $path, $cp_path, $cp_rev) = @_; - goto out if $self->is_path_ignored($path); - my $gpath = $self->git_path($path); - if ($gpath eq '') { - my ($ls, $ctx) = command_output_pipe(qw/ls-tree - -r --name-only -z/, - $self->{c}); - local $/ = "\0"; - while (<$ls>) { - chomp; - $self->{gii}->remove($_); - print "\tD\t$_\n" unless $::_q; - push @deleted_gpath, $gpath; - } - command_close_pipe($ls, $ctx); - $self->{empty}->{$path} = 0; - } - my ($dir, $file) = ($path =~ m#^(.*?)/?([^/]+)$#); - delete $self->{empty}->{$dir}; - $self->{empty}->{$path} = 1; - - if ($added_placeholder{$dir}) { - # Remove our placeholder file, if we created one. - delete_entry($self, $added_placeholder{$dir}); - delete $added_placeholder{$dir} - } - -out: - { path => $path }; -} - -sub change_dir_prop { - my ($self, $db, $prop, $value) = @_; - return undef if $self->is_path_ignored($db->{path}); - $self->{dir_prop}->{$db->{path}} ||= {}; - $self->{dir_prop}->{$db->{path}}->{$prop} = $value; - undef; -} - -sub absent_directory { - my ($self, $path, $pb) = @_; - return undef if $self->is_path_ignored($path); - $self->{absent_dir}->{$pb->{path}} ||= []; - push @{$self->{absent_dir}->{$pb->{path}}}, $path; - undef; -} - -sub absent_file { - my ($self, $path, $pb) = @_; - return undef if $self->is_path_ignored($path); - $self->{absent_file}->{$pb->{path}} ||= []; - push @{$self->{absent_file}->{$pb->{path}}}, $path; - undef; -} - -sub change_file_prop { - my ($self, $fb, $prop, $value) = @_; - return undef if $self->is_path_ignored($fb->{path}); - if ($prop eq 'svn:executable') { - if ($fb->{mode_b} != 120000) { - $fb->{mode_b} = defined $value ? 100755 : 100644; - } - } elsif ($prop eq 'svn:special') { - $fb->{mode_b} = defined $value ? 120000 : 100644; - } else { - $self->{file_prop}->{$fb->{path}} ||= {}; - $self->{file_prop}->{$fb->{path}}->{$prop} = $value; - } - undef; -} - -sub apply_textdelta { - my ($self, $fb, $exp) = @_; - return undef if $self->is_path_ignored($fb->{path}); - my $fh = $::_repository->temp_acquire('svn_delta'); - # $fh gets auto-closed() by SVN::TxDelta::apply(), - # (but $base does not,) so dup() it for reading in close_file - open my $dup, '<&', $fh or croak $!; - my $base = $::_repository->temp_acquire('git_blob'); - - if ($fb->{blob}) { - my ($base_is_link, $size); - - if ($fb->{mode_a} eq '120000' && - ! $self->{empty_symlinks}->{$fb->{path}}) { - print $base 'link ' or die "print $!\n"; - $base_is_link = 1; - } - retry: - $size = $::_repository->cat_blob($fb->{blob}, $base); - die "Failed to read object $fb->{blob}" if ($size < 0); - - if (defined $exp) { - seek $base, 0, 0 or croak $!; - my $got = ::md5sum($base); - if ($got ne $exp) { - my $err = "Checksum mismatch: ". - "$fb->{path} $fb->{blob}\n" . - "expected: $exp\n" . - " got: $got\n"; - if ($base_is_link) { - warn $err, - "Retrying... (possibly ", - "a bad symlink from SVN)\n"; - $::_repository->temp_reset($base); - $base_is_link = 0; - goto retry; - } - die $err; - } - } - } - seek $base, 0, 0 or croak $!; - $fb->{fh} = $fh; - $fb->{base} = $base; - [ SVN::TxDelta::apply($base, $dup, undef, $fb->{path}, $fb->{pool}) ]; -} - -sub close_file { - my ($self, $fb, $exp) = @_; - return undef if $self->is_path_ignored($fb->{path}); - - my $hash; - my $path = $self->git_path($fb->{path}); - if (my $fh = $fb->{fh}) { - if (defined $exp) { - seek($fh, 0, 0) or croak $!; - my $got = ::md5sum($fh); - if ($got ne $exp) { - die "Checksum mismatch: $path\n", - "expected: $exp\n got: $got\n"; - } - } - if ($fb->{mode_b} == 120000) { - sysseek($fh, 0, 0) or croak $!; - my $rd = sysread($fh, my $buf, 5); - - if (!defined $rd) { - croak "sysread: $!\n"; - } elsif ($rd == 0) { - warn "$path has mode 120000", - " but it points to nothing\n", - "converting to an empty file with mode", - " 100644\n"; - $fb->{mode_b} = '100644'; - } elsif ($buf ne 'link ') { - warn "$path has mode 120000", - " but is not a link\n"; - } else { - my $tmp_fh = $::_repository->temp_acquire( - 'svn_hash'); - my $res; - while ($res = sysread($fh, my $str, 1024)) { - my $out = syswrite($tmp_fh, $str, $res); - defined($out) && $out == $res - or croak("write ", - Git::temp_path($tmp_fh), - ": $!\n"); - } - defined $res or croak $!; - - ($fh, $tmp_fh) = ($tmp_fh, $fh); - Git::temp_release($tmp_fh, 1); - } - } - - $hash = $::_repository->hash_and_insert_object( - Git::temp_path($fh)); - $hash =~ /^[a-f\d]{40}$/ or die "not a sha1: $hash\n"; - - Git::temp_release($fb->{base}, 1); - Git::temp_release($fh, 1); - } else { - $hash = $fb->{blob} or die "no blob information\n"; - } - $fb->{pool}->clear; - $self->{gii}->update($fb->{mode_b}, $hash, $path) or croak $!; - print "\t$fb->{action}\t$path\n" if $fb->{action} && ! $::_q; - undef; -} - -sub abort_edit { - my $self = shift; - $self->{nr} = $self->{gii}->{nr}; - delete $self->{gii}; - $self->SUPER::abort_edit(@_); -} - -sub close_edit { - my $self = shift; - - if ($_preserve_empty_dirs) { - my @empty_dirs; - - # Any entry flagged as empty that also has an associated - # dir_prop represents a newly created empty directory. - foreach my $i (keys %{$self->{empty}}) { - push @empty_dirs, $i if exists $self->{dir_prop}->{$i}; - } - - # Search for directories that have become empty due subsequent - # file deletes. - push @empty_dirs, $self->find_empty_directories(); - - # Finally, add a placeholder file to each empty directory. - $self->add_placeholder_file($_) foreach (@empty_dirs); - - $self->stash_placeholder_list(); - } - - $self->{git_commit_ok} = 1; - $self->{nr} = $self->{gii}->{nr}; - delete $self->{gii}; - $self->SUPER::close_edit(@_); -} - -sub find_empty_directories { - my ($self) = @_; - my @empty_dirs; - my %dirs = map { dirname($_) => 1 } @deleted_gpath; - - foreach my $dir (sort keys %dirs) { - next if $dir eq "."; - - # If there have been any additions to this directory, there is - # no reason to check if it is empty. - my $skip_added = 0; - foreach my $t (qw/dir_prop file_prop/) { - foreach my $path (keys %{ $self->{$t} }) { - if (exists $self->{$t}->{dirname($path)}) { - $skip_added = 1; - last; - } - } - last if $skip_added; - } - next if $skip_added; - - # Use `git ls-tree` to get the filenames of this directory - # that existed prior to this particular commit. - my $ls = command('ls-tree', '-z', '--name-only', - $self->{c}, "$dir/"); - my %files = map { $_ => 1 } split(/\0/, $ls); - - # Remove the filenames that were deleted during this commit. - delete $files{$_} foreach (@deleted_gpath); - - # Report the directory if there are no filenames left. - push @empty_dirs, $dir unless (scalar %files); - } - @empty_dirs; -} - -sub add_placeholder_file { - my ($self, $dir) = @_; - my $path = "$dir/$_placeholder_filename"; - my $gpath = $self->git_path($path); - - my $fh = $::_repository->temp_acquire($gpath); - my $hash = $::_repository->hash_and_insert_object(Git::temp_path($fh)); - Git::temp_release($fh, 1); - $self->{gii}->update('100644', $hash, $gpath) or croak $!; - - # The directory should no longer be considered empty. - delete $self->{empty}->{$dir} if exists $self->{empty}->{$dir}; - - # Keep track of any placeholder files we create. - $added_placeholder{$dir} = $path; -} - -sub stash_placeholder_list { - my ($self) = @_; - my $k = "svn-remote.$repo_id.added-placeholder"; - my $v = eval { command_oneline('config', '--get-all', $k) }; - command_noisy('config', '--unset-all', $k) if $v; - foreach (values %added_placeholder) { - command_noisy('config', '--add', $k, $_); - } -} - -package SVN::Git::Editor; +package Git::SVN::Editor; use vars qw/@ISA $_rmdir $_cp_similarity $_find_copies_harder $_rename_limit/; use strict; use warnings; @@ -13,7 +13,7 @@ const char git_usage_string[] = " <command> [<args>]"; const char git_more_info_string[] = - "See 'git help <command>' for more information on a specific command."; + N_("See 'git help <command>' for more information on a specific command."); static struct startup_info git_startup_info; static int use_pager = -1; @@ -348,6 +348,7 @@ static void handle_internal_command(int argc, const char **argv) { "cherry-pick", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE }, { "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE }, { "clone", cmd_clone }, + { "column", cmd_column, RUN_SETUP_GENTLY }, { "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE }, { "commit-tree", cmd_commit_tree, RUN_SETUP }, { "config", cmd_config, RUN_SETUP_GENTLY }, diff --git a/gpg-interface.c b/gpg-interface.c index 09ab64aa24..0863c61800 100644 --- a/gpg-interface.c +++ b/gpg-interface.c @@ -30,7 +30,7 @@ const char *get_signing_key(void) { if (configured_signing_key) return configured_signing_key; - return git_committer_info(IDENT_ERROR_ON_NO_NAME|IDENT_NO_DATE); + return git_committer_info(IDENT_STRICT|IDENT_NO_DATE); } /* @@ -194,8 +194,10 @@ static struct strbuf *diff_output_prefix_callback(struct diff_options *opt, void struct git_graph *graph = data; static struct strbuf msgbuf = STRBUF_INIT; + assert(opt); assert(graph); + opt->output_prefix_length = graph->width; strbuf_reset(&msgbuf); graph_padding_line(graph, &msgbuf); return &msgbuf; @@ -245,6 +247,7 @@ struct git_graph *graph_init(struct rev_info *opt) */ opt->diffopt.output_prefix = diff_output_prefix_callback; opt->diffopt.output_prefix_data = graph; + opt->diffopt.output_prefix_length = 0; return graph; } @@ -3,18 +3,64 @@ #include "userdiff.h" #include "xdiff-interface.h" -void append_header_grep_pattern(struct grep_opt *opt, enum grep_header_field field, const char *pat) +static struct grep_pat *create_grep_pat(const char *pat, size_t patlen, + const char *origin, int no, + enum grep_pat_token t, + enum grep_header_field field) { struct grep_pat *p = xcalloc(1, sizeof(*p)); - p->pattern = pat; - p->patternlen = strlen(pat); - p->origin = "header"; - p->no = 0; - p->token = GREP_PATTERN_HEAD; + p->pattern = xmemdupz(pat, patlen); + p->patternlen = patlen; + p->origin = origin; + p->no = no; + p->token = t; p->field = field; - *opt->header_tail = p; - opt->header_tail = &p->next; + return p; +} + +static void do_append_grep_pat(struct grep_pat ***tail, struct grep_pat *p) +{ + **tail = p; + *tail = &p->next; p->next = NULL; + + switch (p->token) { + case GREP_PATTERN: /* atom */ + case GREP_PATTERN_HEAD: + case GREP_PATTERN_BODY: + for (;;) { + struct grep_pat *new_pat; + size_t len = 0; + char *cp = p->pattern + p->patternlen, *nl = NULL; + while (++len <= p->patternlen) { + if (*(--cp) == '\n') { + nl = cp; + break; + } + } + if (!nl) + break; + new_pat = create_grep_pat(nl + 1, len - 1, p->origin, + p->no, p->token, p->field); + new_pat->next = p->next; + if (!p->next) + *tail = &new_pat->next; + p->next = new_pat; + *nl = '\0'; + p->patternlen -= len; + } + break; + default: + break; + } +} + +void append_header_grep_pattern(struct grep_opt *opt, + enum grep_header_field field, const char *pat) +{ + struct grep_pat *p = create_grep_pat(pat, strlen(pat), "header", 0, + GREP_PATTERN_HEAD, field); + do_append_grep_pat(&opt->header_tail, p); } void append_grep_pattern(struct grep_opt *opt, const char *pat, @@ -26,15 +72,8 @@ void append_grep_pattern(struct grep_opt *opt, const char *pat, void append_grep_pat(struct grep_opt *opt, const char *pat, size_t patlen, const char *origin, int no, enum grep_pat_token t) { - struct grep_pat *p = xcalloc(1, sizeof(*p)); - p->pattern = pat; - p->patternlen = patlen; - p->origin = origin; - p->no = no; - p->token = t; - *opt->pattern_tail = p; - opt->pattern_tail = &p->next; - p->next = NULL; + struct grep_pat *p = create_grep_pat(pat, patlen, origin, no, t, 0); + do_append_grep_pat(&opt->pattern_tail, p); } struct grep_opt *grep_opt_dup(const struct grep_opt *opt) @@ -318,7 +357,7 @@ static struct grep_expr *prep_header_patterns(struct grep_opt *opt) if (!opt->header_list) return NULL; - p = opt->header_list; + for (p = opt->header_list; p; p = p->next) { if (p->token != GREP_PATTERN_HEAD) die("bug: a non-header pattern in grep header list."); @@ -430,6 +469,7 @@ void free_grep_patterns(struct grep_opt *opt) free_pcre_regexp(p); else regfree(&p->regexp); + free(p->pattern); break; default: break; @@ -38,7 +38,7 @@ struct grep_pat { const char *origin; int no; enum grep_pat_token token; - const char *pattern; + char *pattern; size_t patternlen; enum grep_header_field field; regex_t regexp; @@ -4,6 +4,8 @@ #include "levenshtein.h" #include "help.h" #include "common-cmds.h" +#include "string-list.h" +#include "column.h" void add_cmdname(struct cmdnames *cmds, const char *name, int len) { @@ -70,31 +72,25 @@ void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes) cmds->cnt = cj; } -static void pretty_print_string_list(struct cmdnames *cmds, int longest) +static void pretty_print_string_list(struct cmdnames *cmds, + unsigned int colopts) { - int cols = 1, rows; - int space = longest + 1; /* min 1 SP between words */ - int max_cols = term_columns() - 1; /* don't print *on* the edge */ - int i, j; - - if (space < max_cols) - cols = max_cols / space; - rows = DIV_ROUND_UP(cmds->cnt, cols); - - for (i = 0; i < rows; i++) { - printf(" "); + struct string_list list = STRING_LIST_INIT_NODUP; + struct column_options copts; + int i; - for (j = 0; j < cols; j++) { - int n = j * rows + i; - int size = space; - if (n >= cmds->cnt) - break; - if (j == cols-1 || n + rows >= cmds->cnt) - size = 1; - printf("%-*s", size, cmds->names[n]->name); - } - putchar('\n'); - } + for (i = 0; i < cmds->cnt; i++) + string_list_append(&list, cmds->names[i]->name); + /* + * always enable column display, we only consult column.* + * about layout strategy and stuff + */ + colopts = (colopts & ~COL_ENABLE_MASK) | COL_ENABLED; + memset(&copts, 0, sizeof(copts)); + copts.indent = " "; + copts.padding = 2; + print_columns(&list, colopts, &copts); + string_list_clear(&list, 0); } static int is_executable(const char *name) @@ -203,34 +199,21 @@ void load_command_list(const char *prefix, exclude_cmds(other_cmds, main_cmds); } -void list_commands(const char *title, struct cmdnames *main_cmds, - struct cmdnames *other_cmds) +void list_commands(unsigned int colopts, + struct cmdnames *main_cmds, struct cmdnames *other_cmds) { - int i, longest = 0; - - for (i = 0; i < main_cmds->cnt; i++) - if (longest < main_cmds->names[i]->len) - longest = main_cmds->names[i]->len; - for (i = 0; i < other_cmds->cnt; i++) - if (longest < other_cmds->names[i]->len) - longest = other_cmds->names[i]->len; - if (main_cmds->cnt) { const char *exec_path = git_exec_path(); - printf("available %s in '%s'\n", title, exec_path); - printf("----------------"); - mput_char('-', strlen(title) + strlen(exec_path)); + printf_ln(_("available git commands in '%s'"), exec_path); putchar('\n'); - pretty_print_string_list(main_cmds, longest); + pretty_print_string_list(main_cmds, colopts); putchar('\n'); } if (other_cmds->cnt) { - printf("%s available from elsewhere on your $PATH\n", title); - printf("---------------------------------------"); - mput_char('-', strlen(title)); + printf_ln(_("git commands available from elsewhere on your $PATH")); putchar('\n'); - pretty_print_string_list(other_cmds, longest); + pretty_print_string_list(other_cmds, colopts); putchar('\n'); } } @@ -334,14 +317,14 @@ const char *help_unknown_cmd(const char *cmd) } main_cmds.names[i]->len = - levenshtein(cmd, candidate, 0, 2, 1, 4) + 1; + levenshtein(cmd, candidate, 0, 2, 1, 3) + 1; } qsort(main_cmds.names, main_cmds.cnt, sizeof(*main_cmds.names), levenshtein_compare); if (!main_cmds.cnt) - die ("Uh oh. Your system reports no Git commands at all."); + die(_("Uh oh. Your system reports no Git commands at all.")); /* skip and count prefix matches */ for (n = 0; n < main_cmds.cnt && !main_cmds.names[n]->len; n++) @@ -362,23 +345,26 @@ const char *help_unknown_cmd(const char *cmd) const char *assumed = main_cmds.names[0]->name; main_cmds.names[0] = NULL; clean_cmdnames(&main_cmds); - fprintf(stderr, "WARNING: You called a Git command named '%s', " - "which does not exist.\n" - "Continuing under the assumption that you meant '%s'\n", + fprintf_ln(stderr, + _("WARNING: You called a Git command named '%s', " + "which does not exist.\n" + "Continuing under the assumption that you meant '%s'"), cmd, assumed); if (autocorrect > 0) { - fprintf(stderr, "in %0.1f seconds automatically...\n", + fprintf_ln(stderr, _("in %0.1f seconds automatically..."), (float)autocorrect/10.0); poll(NULL, 0, autocorrect * 100); } return assumed; } - fprintf(stderr, "git: '%s' is not a git command. See 'git --help'.\n", cmd); + fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd); if (SIMILAR_ENOUGH(best_similarity)) { - fprintf(stderr, "\nDid you mean %s?\n", - n < 2 ? "this": "one of these"); + fprintf_ln(stderr, + Q_("\nDid you mean this?", + "\nDid you mean one of these?", + n)); for (i = 0; i < n; i++) fprintf(stderr, "\t%s\n", main_cmds.names[i]->name); @@ -25,8 +25,6 @@ extern void add_cmdname(struct cmdnames *cmds, const char *name, int len); /* Here we require that excludes is a sorted list. */ extern void exclude_cmds(struct cmdnames *cmds, struct cmdnames *excludes); extern int is_in_cmdlist(struct cmdnames *cmds, const char *name); -extern void list_commands(const char *title, - struct cmdnames *main_cmds, - struct cmdnames *other_cmds); +extern void list_commands(unsigned int colopts, struct cmdnames *main_cmds, struct cmdnames *other_cmds); #endif /* HELP_H */ diff --git a/http-push.c b/http-push.c index f22f7e43ca..a832ca77a3 100644 --- a/http-push.c +++ b/http-push.c @@ -904,7 +904,7 @@ static struct remote_lock *lock_remote(const char *path, long timeout) ep = strchr(ep + 1, '/'); } - escaped = xml_entities(git_default_email); + escaped = xml_entities(ident_default_email()); strbuf_addf(&out_buffer.buf, LOCK_REQUEST, escaped); free(escaped); @@ -1108,7 +1108,7 @@ static void handle_remote_ls_ctx(struct xml_ctx *ctx, int tag_closed) if (repo->path) url = repo->path; if (strncmp(path, url, repo->path_len)) - error("Parsed path '%s' does not match url: '%s'\n", + error("Parsed path '%s' does not match url: '%s'", path, url); else { path += repo->path_len; @@ -1702,7 +1702,7 @@ static int delete_remote_branch(const char *pattern, int force) run_active_slot(slot); free(url); if (results.curl_result != CURLE_OK) - return error("DELETE request failed (%d/%ld)\n", + return error("DELETE request failed (%d/%ld)", results.curl_result, results.http_code); } else { free(url); @@ -917,7 +917,7 @@ static char *fetch_pack_index(unsigned char *sha1, const char *base_url) tmp = strbuf_detach(&buf, NULL); if (http_get_file(url, tmp, 0) != HTTP_OK) { - error("Unable to get pack index %s\n", url); + error("Unable to get pack index %s", url); free(tmp); tmp = NULL; } @@ -7,7 +7,10 @@ */ #include "cache.h" +static struct strbuf git_default_name = STRBUF_INIT; +static struct strbuf git_default_email = STRBUF_INIT; static char git_default_date[50]; +int user_ident_explicitly_given; #ifdef NO_GECOS_IN_PWENT #define get_gecos(ignored) "&" @@ -15,42 +18,27 @@ static char git_default_date[50]; #define get_gecos(struct_passwd) ((struct_passwd)->pw_gecos) #endif -static void copy_gecos(const struct passwd *w, char *name, size_t sz) +static void copy_gecos(const struct passwd *w, struct strbuf *name) { - char *src, *dst; - size_t len, nlen; - - nlen = strlen(w->pw_name); + char *src; /* Traditionally GECOS field had office phone numbers etc, separated * with commas. Also & stands for capitalized form of the login name. */ - for (len = 0, dst = name, src = get_gecos(w); len < sz; src++) { + for (src = get_gecos(w); *src && *src != ','; src++) { int ch = *src; - if (ch != '&') { - *dst++ = ch; - if (ch == 0 || ch == ',') - break; - len++; - continue; - } - if (len + nlen < sz) { + if (ch != '&') + strbuf_addch(name, ch); + else { /* Sorry, Mr. McDonald... */ - *dst++ = toupper(*w->pw_name); - memcpy(dst, w->pw_name + 1, nlen - 1); - dst += nlen - 1; - len += nlen; + strbuf_addch(name, toupper(*w->pw_name)); + strbuf_addstr(name, w->pw_name + 1); } } - if (len < sz) - name[len] = 0; - else - die("Your parents must have hated you!"); - } -static int add_mailname_host(char *buf, size_t len) +static int add_mailname_host(struct strbuf *buf) { FILE *mailname; @@ -61,7 +49,7 @@ static int add_mailname_host(char *buf, size_t len) strerror(errno)); return -1; } - if (!fgets(buf, len, mailname)) { + if (strbuf_getline(buf, mailname, '\n') == EOF) { if (ferror(mailname)) warning("cannot read /etc/mailname: %s", strerror(errno)); @@ -73,94 +61,67 @@ static int add_mailname_host(char *buf, size_t len) return 0; } -static void add_domainname(char *buf, size_t len) +static void add_domainname(struct strbuf *out) { + char buf[1024]; struct hostent *he; - size_t namelen; - const char *domainname; - if (gethostname(buf, len)) { + if (gethostname(buf, sizeof(buf))) { warning("cannot get host name: %s", strerror(errno)); - strlcpy(buf, "(none)", len); + strbuf_addstr(out, "(none)"); return; } - namelen = strlen(buf); - if (memchr(buf, '.', namelen)) - return; - - he = gethostbyname(buf); - buf[namelen++] = '.'; - buf += namelen; - len -= namelen; - if (he && (domainname = strchr(he->h_name, '.'))) - strlcpy(buf, domainname + 1, len); + if (strchr(buf, '.')) + strbuf_addstr(out, buf); + else if ((he = gethostbyname(buf)) && strchr(he->h_name, '.')) + strbuf_addstr(out, he->h_name); else - strlcpy(buf, "(none)", len); + strbuf_addf(out, "%s.(none)", buf); } -static void copy_email(const struct passwd *pw) +static void copy_email(const struct passwd *pw, struct strbuf *email) { /* * Make up a fake email address * (name + '@' + hostname [+ '.' + domainname]) */ - size_t len = strlen(pw->pw_name); - if (len > sizeof(git_default_email)/2) - die("Your sysadmin must hate you!"); - memcpy(git_default_email, pw->pw_name, len); - git_default_email[len++] = '@'; - - if (!add_mailname_host(git_default_email + len, - sizeof(git_default_email) - len)) + strbuf_addstr(email, pw->pw_name); + strbuf_addch(email, '@'); + + if (!add_mailname_host(email)) return; /* read from "/etc/mailname" (Debian) */ - add_domainname(git_default_email + len, - sizeof(git_default_email) - len); + add_domainname(email); } -static void setup_ident(const char **name, const char **emailp) +const char *ident_default_name(void) { - struct passwd *pw = NULL; - - /* Get the name ("gecos") */ - if (!*name && !git_default_name[0]) { - pw = getpwuid(getuid()); - if (!pw) - die("You don't exist. Go away!"); - copy_gecos(pw, git_default_name, sizeof(git_default_name)); + if (!git_default_name.len) { + copy_gecos(xgetpwuid_self(), &git_default_name); + strbuf_trim(&git_default_name); } - if (!*name) - *name = git_default_name; + return git_default_name.buf; +} - if (!*emailp && !git_default_email[0]) { +const char *ident_default_email(void) +{ + if (!git_default_email.len) { const char *email = getenv("EMAIL"); if (email && email[0]) { - strlcpy(git_default_email, email, - sizeof(git_default_email)); + strbuf_addstr(&git_default_email, email); user_ident_explicitly_given |= IDENT_MAIL_GIVEN; - } else { - if (!pw) - pw = getpwuid(getuid()); - if (!pw) - die("You don't exist. Go away!"); - copy_email(pw); - } + } else + copy_email(xgetpwuid_self(), &git_default_email); + strbuf_trim(&git_default_email); } - if (!*emailp) - *emailp = git_default_email; - - /* And set the default date */ - if (!git_default_date[0]) - datestamp(git_default_date, sizeof(git_default_date)); + return git_default_email.buf; } -static int add_raw(char *buf, size_t size, int offset, const char *str) +const char *ident_default_date(void) { - size_t len = strlen(str); - if (offset + len > size) - return size; - memcpy(buf + offset, str, len); - return offset + len; + if (!git_default_date[0]) + datestamp(git_default_date, sizeof(git_default_date)); + return git_default_date; } static int crud(unsigned char c) @@ -181,7 +142,7 @@ static int crud(unsigned char c) * Copy over a string to the destination, but avoid special * characters ('\n', '<' and '>') and remove crud at the end */ -static int copy(char *buf, size_t size, int offset, const char *src) +static void strbuf_addstr_without_crud(struct strbuf *sb, const char *src) { size_t i, len; unsigned char c; @@ -205,19 +166,19 @@ static int copy(char *buf, size_t size, int offset, const char *src) /* * Copy the rest to the buffer, but avoid the special * characters '\n' '<' and '>' that act as delimiters on - * an identification line + * an identification line. We can only remove crud, never add it, + * so 'len' is our maximum. */ + strbuf_grow(sb, len); for (i = 0; i < len; i++) { c = *src++; switch (c) { case '\n': case '<': case '>': continue; } - if (offset >= size) - return size; - buf[offset++] = c; + sb->buf[sb->len++] = c; } - return offset; + sb->buf[sb->len] = '\0'; } /* @@ -244,7 +205,7 @@ int split_ident_line(struct ident_split *split, const char *line, int len) if (!split->mail_begin) return status; - for (cp = split->mail_begin - 2; line < cp; cp--) + for (cp = split->mail_begin - 2; line <= cp; cp--) if (!isspace(*cp)) { split->name_end = cp + 1; break; @@ -304,57 +265,62 @@ static const char *env_hint = const char *fmt_ident(const char *name, const char *email, const char *date_str, int flag) { - static char buffer[1000]; + static struct strbuf ident = STRBUF_INIT; char date[50]; - int i; - int error_on_no_name = (flag & IDENT_ERROR_ON_NO_NAME); - int warn_on_no_name = (flag & IDENT_WARN_ON_NO_NAME); - int name_addr_only = (flag & IDENT_NO_DATE); + int strict = (flag & IDENT_STRICT); + int want_date = !(flag & IDENT_NO_DATE); + int want_name = !(flag & IDENT_NO_NAME); - setup_ident(&name, &email); + if (want_name && !name) + name = ident_default_name(); + if (!email) + email = ident_default_email(); - if (!*name) { + if (want_name && !*name) { struct passwd *pw; - if ((warn_on_no_name || error_on_no_name) && - name == git_default_name && env_hint) { - fputs(env_hint, stderr); - env_hint = NULL; /* warn only once */ + if (strict) { + if (name == git_default_name.buf) + fputs(env_hint, stderr); + die("empty ident name (for <%s>) not allowed", email); } - if (error_on_no_name) - die("empty ident %s <%s> not allowed", name, email); - pw = getpwuid(getuid()); - if (!pw) - die("You don't exist. Go away!"); - strlcpy(git_default_name, pw->pw_name, - sizeof(git_default_name)); - name = git_default_name; + pw = xgetpwuid_self(); + name = pw->pw_name; + } + + if (strict && email == git_default_email.buf && + strstr(email, "(none)")) { + fputs(env_hint, stderr); + die("unable to auto-detect email address (got '%s')", email); } - strcpy(date, git_default_date); - if (!name_addr_only && date_str && date_str[0]) { - if (parse_date(date_str, date, sizeof(date)) < 0) - die("invalid date format: %s", date_str); + if (want_date) { + if (date_str && date_str[0]) { + if (parse_date(date_str, date, sizeof(date)) < 0) + die("invalid date format: %s", date_str); + } + else + strcpy(date, ident_default_date()); } - i = copy(buffer, sizeof(buffer), 0, name); - i = add_raw(buffer, sizeof(buffer), i, " <"); - i = copy(buffer, sizeof(buffer), i, email); - if (!name_addr_only) { - i = add_raw(buffer, sizeof(buffer), i, "> "); - i = copy(buffer, sizeof(buffer), i, date); - } else { - i = add_raw(buffer, sizeof(buffer), i, ">"); + strbuf_reset(&ident); + if (want_name) { + strbuf_addstr_without_crud(&ident, name); + strbuf_addstr(&ident, " <"); } - if (i >= sizeof(buffer)) - die("Impossibly long personal identifier"); - buffer[i] = 0; - return buffer; + strbuf_addstr_without_crud(&ident, email); + if (want_name) + strbuf_addch(&ident, '>'); + if (want_date) { + strbuf_addch(&ident, ' '); + strbuf_addstr_without_crud(&ident, date); + } + return ident.buf; } const char *fmt_name(const char *name, const char *email) { - return fmt_ident(name, email, NULL, IDENT_ERROR_ON_NO_NAME | IDENT_NO_DATE); + return fmt_ident(name, email, NULL, IDENT_STRICT | IDENT_NO_DATE); } const char *git_author_info(int flag) @@ -385,3 +351,26 @@ int user_ident_sufficiently_given(void) return (user_ident_explicitly_given == IDENT_ALL_GIVEN); #endif } + +int git_ident_config(const char *var, const char *value, void *data) +{ + if (!strcmp(var, "user.name")) { + if (!value) + return config_error_nonbool(var); + strbuf_reset(&git_default_name); + strbuf_addstr(&git_default_name, value); + user_ident_explicitly_given |= IDENT_NAME_GIVEN; + return 0; + } + + if (!strcmp(var, "user.email")) { + if (!value) + return config_error_nonbool(var); + strbuf_reset(&git_default_email); + strbuf_addstr(&git_default_email, value); + user_ident_explicitly_given |= IDENT_MAIL_GIVEN; + return 0; + } + + return 0; +} diff --git a/imap-send.c b/imap-send.c index 972ad62cd9..d42e471297 100644 --- a/imap-send.c +++ b/imap-send.c @@ -1022,7 +1022,7 @@ static int auth_cram_md5(struct imap_store *ctx, struct imap_cmd *cmd, const cha ret = socket_write(&ctx->imap->buf.sock, response, strlen(response)); if (ret != strlen(response)) - return error("IMAP error: sending response failed\n"); + return error("IMAP error: sending response failed"); free(response); diff --git a/ll-merge.c b/ll-merge.c index da59738c9b..f3f7692158 100644 --- a/ll-merge.c +++ b/ll-merge.c @@ -73,7 +73,7 @@ static int ll_xdl_merge(const struct ll_merge_driver *drv_unused, if (buffer_is_binary(orig->ptr, orig->size) || buffer_is_binary(src1->ptr, src1->size) || buffer_is_binary(src2->ptr, src2->size)) { - warning("Cannot merge binary files: %s (%s vs. %s)\n", + warning("Cannot merge binary files: %s (%s vs. %s)", path, name1, name2); return ll_binary_merge(drv_unused, result, path, diff --git a/log-tree.c b/log-tree.c index 34c49e7b33..c894930c18 100644 --- a/log-tree.c +++ b/log-tree.c @@ -299,19 +299,22 @@ static unsigned int digits_in_number(unsigned int number) return result; } -void get_patch_filename(struct commit *commit, int nr, const char *suffix, - struct strbuf *buf) +void get_patch_filename(struct commit *commit, const char *subject, int nr, + const char *suffix, struct strbuf *buf) { int suffix_len = strlen(suffix) + 1; int start_len = buf->len; - strbuf_addf(buf, commit ? "%04d-" : "%d", nr); - if (commit) { + strbuf_addf(buf, commit || subject ? "%04d-" : "%d", nr); + if (commit || subject) { int max_len = start_len + FORMAT_PATCH_NAME_MAX - suffix_len; struct pretty_print_context ctx = {0}; - ctx.date_mode = DATE_NORMAL; - format_commit_message(commit, "%f", buf, &ctx); + if (subject) + strbuf_addstr(buf, subject); + else if (commit) + format_commit_message(commit, "%f", buf, &ctx); + if (max_len < buf->len) strbuf_setlen(buf, max_len); strbuf_addstr(buf, suffix); @@ -384,8 +387,8 @@ void log_write_email_headers(struct rev_info *opt, struct commit *commit, mime_boundary_leader, opt->mime_boundary); extra_headers = subject_buffer; - get_patch_filename(opt->numbered_files ? NULL : commit, opt->nr, - opt->patch_suffix, &filename); + get_patch_filename(opt->numbered_files ? NULL : commit, NULL, + opt->nr, opt->patch_suffix, &filename); snprintf(buffer, sizeof(buffer) - 1, "\n--%s%s\n" "Content-Type: text/x-patch;" @@ -629,10 +632,9 @@ void show_log(struct rev_info *opt) * graph info here. */ show_reflog_message(opt->reflog_info, - opt->commit_format == CMIT_FMT_ONELINE, - opt->date_mode_explicit ? - opt->date_mode : - DATE_NORMAL); + opt->commit_format == CMIT_FMT_ONELINE, + opt->date_mode, + opt->date_mode_explicit); if (opt->commit_format == CMIT_FMT_ONELINE) return; } @@ -652,6 +654,7 @@ void show_log(struct rev_info *opt) if (ctx.need_8bit_cte >= 0) ctx.need_8bit_cte = has_non_ascii(opt->add_signoff); ctx.date_mode = opt->date_mode; + ctx.date_mode_explicit = opt->date_mode_explicit; ctx.abbrev = opt->diffopt.abbrev; ctx.after_subject = extra_headers; ctx.preserve_subject = opt->preserve_subject; @@ -682,7 +685,7 @@ void show_log(struct rev_info *opt) if (opt->use_terminator) { if (!opt->missing_newline) graph_show_padding(opt->graph); - putchar('\n'); + putchar(opt->diffopt.line_termination); } strbuf_release(&msgbuf); diff --git a/log-tree.h b/log-tree.h index 5c4cf7cac3..f5ac238bba 100644 --- a/log-tree.h +++ b/log-tree.h @@ -21,7 +21,7 @@ void log_write_email_headers(struct rev_info *opt, struct commit *commit, void load_ref_decorations(int flags); #define FORMAT_PATCH_NAME_MAX 64 -void get_patch_filename(struct commit *commit, int nr, const char *suffix, - struct strbuf *buf); +void get_patch_filename(struct commit *commit, const char *subject, int nr, + const char *suffix, struct strbuf *buf); #endif @@ -176,7 +176,7 @@ struct object *parse_object_buffer(const unsigned char *sha1, enum object_type t obj = &tag->object; } } else { - warning("object %s has unknown type id %d\n", sha1_to_hex(sha1), type); + warning("object %s has unknown type id %d", sha1_to_hex(sha1), type); obj = NULL; } if (obj && obj->type == OBJ_NONE) @@ -202,7 +202,7 @@ struct object *parse_object(const unsigned char *sha1) (!obj && has_sha1_file(sha1) && sha1_object_info(sha1, NULL) == OBJ_BLOB)) { if (check_sha1_signature(repl, NULL, 0, NULL) < 0) { - error("sha1 mismatch %s\n", sha1_to_hex(repl)); + error("sha1 mismatch %s", sha1_to_hex(repl)); return NULL; } parse_blob_buffer(lookup_blob(sha1), NULL, 0); @@ -213,7 +213,7 @@ struct object *parse_object(const unsigned char *sha1) if (buffer) { if (check_sha1_signature(repl, buffer, size, typename(type)) < 0) { free(buffer); - error("sha1 mismatch %s\n", sha1_to_hex(repl)); + error("sha1 mismatch %s", sha1_to_hex(repl)); return NULL; } @@ -73,7 +73,7 @@ void setup_pager(void) { const char *pager = git_pager(isatty(1)); - if (!pager) + if (!pager || pager_in_use()) return; /* diff --git a/parse-options.c b/parse-options.c index 850cfa78c9..ab70c29c49 100644 --- a/parse-options.c +++ b/parse-options.c @@ -490,7 +490,7 @@ static int usage_argh(const struct option *opts, FILE *outfile) s = literal ? "[%s]" : "[<%s>]"; else s = literal ? " %s" : " <%s>"; - return fprintf(outfile, s, opts->argh ? opts->argh : "..."); + return fprintf(outfile, s, opts->argh ? _(opts->argh) : _("...")); } #define USAGE_OPTS_WIDTH 24 @@ -508,13 +508,16 @@ static int usage_with_options_internal(struct parse_opt_ctx_t *ctx, if (!err && ctx && ctx->flags & PARSE_OPT_SHELL_EVAL) fprintf(outfile, "cat <<\\EOF\n"); - fprintf(outfile, "usage: %s\n", *usagestr++); + fprintf_ln(outfile, _("usage: %s"), _(*usagestr++)); while (*usagestr && **usagestr) - fprintf(outfile, " or: %s\n", *usagestr++); + /* TRANSLATORS: the colon here should align with the + one in "usage: %s" translation */ + fprintf_ln(outfile, _(" or: %s"), _(*usagestr++)); while (*usagestr) { - fprintf(outfile, "%s%s\n", - **usagestr ? " " : "", - *usagestr); + if (**usagestr) + fprintf_ln(outfile, _(" %s"), _(*usagestr)); + else + putchar('\n'); usagestr++; } @@ -528,7 +531,7 @@ static int usage_with_options_internal(struct parse_opt_ctx_t *ctx, if (opts->type == OPTION_GROUP) { fputc('\n', outfile); if (*opts->help) - fprintf(outfile, "%s\n", opts->help); + fprintf(outfile, "%s\n", _(opts->help)); continue; } if (!full && (opts->flags & PARSE_OPT_HIDDEN)) @@ -558,7 +561,7 @@ static int usage_with_options_internal(struct parse_opt_ctx_t *ctx, fputc('\n', outfile); pad = USAGE_OPTS_WIDTH; } - fprintf(outfile, "%*s%s\n", pad + USAGE_GAP, "", opts->help); + fprintf(outfile, "%*s%s\n", pad + USAGE_GAP, "", _(opts->help)); } fputc('\n', outfile); diff --git a/parse-options.h b/parse-options.h index def9ced739..77a4a8b2e6 100644 --- a/parse-options.h +++ b/parse-options.h @@ -66,12 +66,14 @@ typedef int parse_opt_ll_cb(struct parse_opt_ctx_t *ctx, * * `argh`:: * token to explain the kind of argument this option wants. Keep it - * homogeneous across the repository. + * homogeneous across the repository. Should be wrapped by N_() for + * translation. * * `help`:: * the short help associated to what the option does. * Must never be NULL (except for OPTION_END). * OPTION_GROUP uses this pointer to store the group header. + * Should be wrapped by N_() for translation. * * `flags`:: * mask of parse_opt_option_flags. @@ -128,7 +130,7 @@ struct option { #define OPT_BOOL(s, l, v, h) OPT_SET_INT(s, l, v, h, 1) #define OPT_SET_PTR(s, l, v, h, p) { OPTION_SET_PTR, (s), (l), (v), NULL, \ (h), PARSE_OPT_NOARG, NULL, (p) } -#define OPT_INTEGER(s, l, v, h) { OPTION_INTEGER, (s), (l), (v), "n", (h) } +#define OPT_INTEGER(s, l, v, h) { OPTION_INTEGER, (s), (l), (v), N_("n"), (h) } #define OPT_STRING(s, l, v, a, h) { OPTION_STRING, (s), (l), (v), (a), (h) } #define OPT_STRING_LIST(s, l, v, a, h) \ { OPTION_CALLBACK, (s), (l), (v), (a), \ @@ -136,7 +138,7 @@ struct option { #define OPT_UYN(s, l, v, h) { OPTION_CALLBACK, (s), (l), (v), NULL, \ (h), PARSE_OPT_NOARG, &parse_opt_tertiary } #define OPT_DATE(s, l, v, h) \ - { OPTION_CALLBACK, (s), (l), (v), "time",(h), 0, \ + { OPTION_CALLBACK, (s), (l), (v), N_("time"),(h), 0, \ parse_opt_approxidate_cb } #define OPT_CALLBACK(s, l, v, a, h, f) \ { OPTION_CALLBACK, (s), (l), (v), (a), (h), 0, (f) } @@ -144,21 +146,22 @@ struct option { { OPTION_NUMBER, 0, NULL, (v), NULL, (h), \ PARSE_OPT_NOARG | PARSE_OPT_NONEG, (f) } #define OPT_FILENAME(s, l, v, h) { OPTION_FILENAME, (s), (l), (v), \ - "file", (h) } + N_("file"), (h) } #define OPT_COLOR_FLAG(s, l, v, h) \ - { OPTION_CALLBACK, (s), (l), (v), "when", (h), PARSE_OPT_OPTARG, \ + { OPTION_CALLBACK, (s), (l), (v), N_("when"), (h), PARSE_OPT_OPTARG, \ parse_opt_color_flag_cb, (intptr_t)"always" } #define OPT_NOOP_NOARG(s, l) \ { OPTION_CALLBACK, (s), (l), NULL, NULL, \ - "no-op (backward compatibility)", \ + N_("no-op (backward compatibility)"), \ PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, parse_opt_noop_cb } /* Deprecated synonym */ #define OPT_BOOLEAN OPT_COUNTUP /* parse_options() will filter out the processed options and leave the - * non-option arguments in argv[]. + * non-option arguments in argv[]. usagestr strings should be marked + * for translation with N_(). * Returns the number of arguments left in argv[]. */ extern int parse_options(int argc, const char **argv, const char *prefix, @@ -222,17 +225,19 @@ extern int parse_opt_noop_cb(const struct option *, const char *, int); #define OPT__VERBOSE(var, h) OPT_BOOLEAN('v', "verbose", (var), (h)) #define OPT__QUIET(var, h) OPT_BOOLEAN('q', "quiet", (var), (h)) #define OPT__VERBOSITY(var) \ - { OPTION_CALLBACK, 'v', "verbose", (var), NULL, "be more verbose", \ + { OPTION_CALLBACK, 'v', "verbose", (var), NULL, N_("be more verbose"), \ PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }, \ - { OPTION_CALLBACK, 'q', "quiet", (var), NULL, "be more quiet", \ + { OPTION_CALLBACK, 'q', "quiet", (var), NULL, N_("be more quiet"), \ PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 } #define OPT__DRY_RUN(var, h) OPT_BOOLEAN('n', "dry-run", (var), (h)) #define OPT__FORCE(var, h) OPT_BOOLEAN('f', "force", (var), (h)) #define OPT__ABBREV(var) \ - { OPTION_CALLBACK, 0, "abbrev", (var), "n", \ - "use <n> digits to display SHA-1s", \ + { OPTION_CALLBACK, 0, "abbrev", (var), N_("n"), \ + N_("use <n> digits to display SHA-1s"), \ PARSE_OPT_OPTARG, &parse_opt_abbrev_cb, 0 } #define OPT__COLOR(var, h) \ OPT_COLOR_FLAG(0, "color", (var), (h)) +#define OPT_COLUMN(s, l, v, h) \ + { OPTION_CALLBACK, (s), (l), (v), "style", (h), PARSE_OPT_OPTARG, parseopt_column_callback } #endif diff --git a/perl/Git/SVN/Fetcher.pm b/perl/Git/SVN/Fetcher.pm new file mode 100644 index 0000000000..4e9c77d757 --- /dev/null +++ b/perl/Git/SVN/Fetcher.pm @@ -0,0 +1,602 @@ +package Git::SVN::Fetcher; +use vars qw/@ISA $_ignore_regex $_preserve_empty_dirs $_placeholder_filename + @deleted_gpath %added_placeholder $repo_id/; +use strict; +use warnings; +use SVN::Delta; +use Carp qw/croak/; +use File::Basename qw/dirname/; +use IO::File qw//; +use Git qw/command command_oneline command_noisy command_output_pipe + command_input_pipe command_close_pipe + command_bidi_pipe command_close_bidi_pipe/; +BEGIN { + @ISA = qw(SVN::Delta::Editor); +} + +# file baton members: path, mode_a, mode_b, pool, fh, blob, base +sub new { + my ($class, $git_svn, $switch_path) = @_; + my $self = SVN::Delta::Editor->new; + bless $self, $class; + if (exists $git_svn->{last_commit}) { + $self->{c} = $git_svn->{last_commit}; + $self->{empty_symlinks} = + _mark_empty_symlinks($git_svn, $switch_path); + } + + # some options are read globally, but can be overridden locally + # per [svn-remote "..."] section. Command-line options will *NOT* + # override options set in an [svn-remote "..."] section + $repo_id = $git_svn->{repo_id}; + my $k = "svn-remote.$repo_id.ignore-paths"; + my $v = eval { command_oneline('config', '--get', $k) }; + $self->{ignore_regex} = $v; + + $k = "svn-remote.$repo_id.preserve-empty-dirs"; + $v = eval { command_oneline('config', '--get', '--bool', $k) }; + if ($v && $v eq 'true') { + $_preserve_empty_dirs = 1; + $k = "svn-remote.$repo_id.placeholder-filename"; + $v = eval { command_oneline('config', '--get', $k) }; + $_placeholder_filename = $v; + } + + # Load the list of placeholder files added during previous invocations. + $k = "svn-remote.$repo_id.added-placeholder"; + $v = eval { command_oneline('config', '--get-all', $k) }; + if ($_preserve_empty_dirs && $v) { + # command() prints errors to stderr, so we only call it if + # command_oneline() succeeded. + my @v = command('config', '--get-all', $k); + $added_placeholder{ dirname($_) } = $_ foreach @v; + } + + $self->{empty} = {}; + $self->{dir_prop} = {}; + $self->{file_prop} = {}; + $self->{absent_dir} = {}; + $self->{absent_file} = {}; + $self->{gii} = $git_svn->tmp_index_do(sub { Git::IndexInfo->new }); + $self->{pathnameencoding} = Git::config('svn.pathnameencoding'); + $self; +} + +# this uses the Ra object, so it must be called before do_{switch,update}, +# not inside them (when the Git::SVN::Fetcher object is passed) to +# do_{switch,update} +sub _mark_empty_symlinks { + my ($git_svn, $switch_path) = @_; + my $bool = Git::config_bool('svn.brokenSymlinkWorkaround'); + return {} if (!defined($bool)) || (defined($bool) && ! $bool); + + my %ret; + my ($rev, $cmt) = $git_svn->last_rev_commit; + return {} unless ($rev && $cmt); + + # allow the warning to be printed for each revision we fetch to + # ensure the user sees it. The user can also disable the workaround + # on the repository even while git svn is running and the next + # revision fetched will skip this expensive function. + my $printed_warning; + chomp(my $empty_blob = `git hash-object -t blob --stdin < /dev/null`); + my ($ls, $ctx) = command_output_pipe(qw/ls-tree -r -z/, $cmt); + local $/ = "\0"; + my $pfx = defined($switch_path) ? $switch_path : $git_svn->{path}; + $pfx .= '/' if length($pfx); + while (<$ls>) { + chomp; + s/\A100644 blob $empty_blob\t//o or next; + unless ($printed_warning) { + print STDERR "Scanning for empty symlinks, ", + "this may take a while if you have ", + "many empty files\n", + "You may disable this with `", + "git config svn.brokenSymlinkWorkaround ", + "false'.\n", + "This may be done in a different ", + "terminal without restarting ", + "git svn\n"; + $printed_warning = 1; + } + my $path = $_; + my (undef, $props) = + $git_svn->ra->get_file($pfx.$path, $rev, undef); + if ($props->{'svn:special'}) { + $ret{$path} = 1; + } + } + command_close_pipe($ls, $ctx); + \%ret; +} + +# returns true if a given path is inside a ".git" directory +sub in_dot_git { + $_[0] =~ m{(?:^|/)\.git(?:/|$)}; +} + +# return value: 0 -- don't ignore, 1 -- ignore +sub is_path_ignored { + my ($self, $path) = @_; + return 1 if in_dot_git($path); + return 1 if defined($self->{ignore_regex}) && + $path =~ m!$self->{ignore_regex}!; + return 0 unless defined($_ignore_regex); + return 1 if $path =~ m!$_ignore_regex!o; + return 0; +} + +sub set_path_strip { + my ($self, $path) = @_; + $self->{path_strip} = qr/^\Q$path\E(\/|$)/ if length $path; +} + +sub open_root { + { path => '' }; +} + +sub open_directory { + my ($self, $path, $pb, $rev) = @_; + { path => $path }; +} + +sub git_path { + my ($self, $path) = @_; + if (my $enc = $self->{pathnameencoding}) { + require Encode; + Encode::from_to($path, 'UTF-8', $enc); + } + if ($self->{path_strip}) { + $path =~ s!$self->{path_strip}!! or + die "Failed to strip path '$path' ($self->{path_strip})\n"; + } + $path; +} + +sub delete_entry { + my ($self, $path, $rev, $pb) = @_; + return undef if $self->is_path_ignored($path); + + my $gpath = $self->git_path($path); + return undef if ($gpath eq ''); + + # remove entire directories. + my ($tree) = (command('ls-tree', '-z', $self->{c}, "./$gpath") + =~ /\A040000 tree ([a-f\d]{40})\t\Q$gpath\E\0/); + if ($tree) { + my ($ls, $ctx) = command_output_pipe(qw/ls-tree + -r --name-only -z/, + $tree); + local $/ = "\0"; + while (<$ls>) { + chomp; + my $rmpath = "$gpath/$_"; + $self->{gii}->remove($rmpath); + print "\tD\t$rmpath\n" unless $::_q; + } + print "\tD\t$gpath/\n" unless $::_q; + command_close_pipe($ls, $ctx); + } else { + $self->{gii}->remove($gpath); + print "\tD\t$gpath\n" unless $::_q; + } + # Don't add to @deleted_gpath if we're deleting a placeholder file. + push @deleted_gpath, $gpath unless $added_placeholder{dirname($path)}; + $self->{empty}->{$path} = 0; + undef; +} + +sub open_file { + my ($self, $path, $pb, $rev) = @_; + my ($mode, $blob); + + goto out if $self->is_path_ignored($path); + + my $gpath = $self->git_path($path); + ($mode, $blob) = (command('ls-tree', '-z', $self->{c}, "./$gpath") + =~ /\A(\d{6}) blob ([a-f\d]{40})\t\Q$gpath\E\0/); + unless (defined $mode && defined $blob) { + die "$path was not found in commit $self->{c} (r$rev)\n"; + } + if ($mode eq '100644' && $self->{empty_symlinks}->{$path}) { + $mode = '120000'; + } +out: + { path => $path, mode_a => $mode, mode_b => $mode, blob => $blob, + pool => SVN::Pool->new, action => 'M' }; +} + +sub add_file { + my ($self, $path, $pb, $cp_path, $cp_rev) = @_; + my $mode; + + if (!$self->is_path_ignored($path)) { + my ($dir, $file) = ($path =~ m#^(.*?)/?([^/]+)$#); + delete $self->{empty}->{$dir}; + $mode = '100644'; + + if ($added_placeholder{$dir}) { + # Remove our placeholder file, if we created one. + delete_entry($self, $added_placeholder{$dir}) + unless $path eq $added_placeholder{$dir}; + delete $added_placeholder{$dir} + } + } + + { path => $path, mode_a => $mode, mode_b => $mode, + pool => SVN::Pool->new, action => 'A' }; +} + +sub add_directory { + my ($self, $path, $cp_path, $cp_rev) = @_; + goto out if $self->is_path_ignored($path); + my $gpath = $self->git_path($path); + if ($gpath eq '') { + my ($ls, $ctx) = command_output_pipe(qw/ls-tree + -r --name-only -z/, + $self->{c}); + local $/ = "\0"; + while (<$ls>) { + chomp; + $self->{gii}->remove($_); + print "\tD\t$_\n" unless $::_q; + push @deleted_gpath, $gpath; + } + command_close_pipe($ls, $ctx); + $self->{empty}->{$path} = 0; + } + my ($dir, $file) = ($path =~ m#^(.*?)/?([^/]+)$#); + delete $self->{empty}->{$dir}; + $self->{empty}->{$path} = 1; + + if ($added_placeholder{$dir}) { + # Remove our placeholder file, if we created one. + delete_entry($self, $added_placeholder{$dir}); + delete $added_placeholder{$dir} + } + +out: + { path => $path }; +} + +sub change_dir_prop { + my ($self, $db, $prop, $value) = @_; + return undef if $self->is_path_ignored($db->{path}); + $self->{dir_prop}->{$db->{path}} ||= {}; + $self->{dir_prop}->{$db->{path}}->{$prop} = $value; + undef; +} + +sub absent_directory { + my ($self, $path, $pb) = @_; + return undef if $self->is_path_ignored($path); + $self->{absent_dir}->{$pb->{path}} ||= []; + push @{$self->{absent_dir}->{$pb->{path}}}, $path; + undef; +} + +sub absent_file { + my ($self, $path, $pb) = @_; + return undef if $self->is_path_ignored($path); + $self->{absent_file}->{$pb->{path}} ||= []; + push @{$self->{absent_file}->{$pb->{path}}}, $path; + undef; +} + +sub change_file_prop { + my ($self, $fb, $prop, $value) = @_; + return undef if $self->is_path_ignored($fb->{path}); + if ($prop eq 'svn:executable') { + if ($fb->{mode_b} != 120000) { + $fb->{mode_b} = defined $value ? 100755 : 100644; + } + } elsif ($prop eq 'svn:special') { + $fb->{mode_b} = defined $value ? 120000 : 100644; + } else { + $self->{file_prop}->{$fb->{path}} ||= {}; + $self->{file_prop}->{$fb->{path}}->{$prop} = $value; + } + undef; +} + +sub apply_textdelta { + my ($self, $fb, $exp) = @_; + return undef if $self->is_path_ignored($fb->{path}); + my $fh = $::_repository->temp_acquire('svn_delta'); + # $fh gets auto-closed() by SVN::TxDelta::apply(), + # (but $base does not,) so dup() it for reading in close_file + open my $dup, '<&', $fh or croak $!; + my $base = $::_repository->temp_acquire('git_blob'); + + if ($fb->{blob}) { + my ($base_is_link, $size); + + if ($fb->{mode_a} eq '120000' && + ! $self->{empty_symlinks}->{$fb->{path}}) { + print $base 'link ' or die "print $!\n"; + $base_is_link = 1; + } + retry: + $size = $::_repository->cat_blob($fb->{blob}, $base); + die "Failed to read object $fb->{blob}" if ($size < 0); + + if (defined $exp) { + seek $base, 0, 0 or croak $!; + my $got = ::md5sum($base); + if ($got ne $exp) { + my $err = "Checksum mismatch: ". + "$fb->{path} $fb->{blob}\n" . + "expected: $exp\n" . + " got: $got\n"; + if ($base_is_link) { + warn $err, + "Retrying... (possibly ", + "a bad symlink from SVN)\n"; + $::_repository->temp_reset($base); + $base_is_link = 0; + goto retry; + } + die $err; + } + } + } + seek $base, 0, 0 or croak $!; + $fb->{fh} = $fh; + $fb->{base} = $base; + [ SVN::TxDelta::apply($base, $dup, undef, $fb->{path}, $fb->{pool}) ]; +} + +sub close_file { + my ($self, $fb, $exp) = @_; + return undef if $self->is_path_ignored($fb->{path}); + + my $hash; + my $path = $self->git_path($fb->{path}); + if (my $fh = $fb->{fh}) { + if (defined $exp) { + seek($fh, 0, 0) or croak $!; + my $got = ::md5sum($fh); + if ($got ne $exp) { + die "Checksum mismatch: $path\n", + "expected: $exp\n got: $got\n"; + } + } + if ($fb->{mode_b} == 120000) { + sysseek($fh, 0, 0) or croak $!; + my $rd = sysread($fh, my $buf, 5); + + if (!defined $rd) { + croak "sysread: $!\n"; + } elsif ($rd == 0) { + warn "$path has mode 120000", + " but it points to nothing\n", + "converting to an empty file with mode", + " 100644\n"; + $fb->{mode_b} = '100644'; + } elsif ($buf ne 'link ') { + warn "$path has mode 120000", + " but is not a link\n"; + } else { + my $tmp_fh = $::_repository->temp_acquire( + 'svn_hash'); + my $res; + while ($res = sysread($fh, my $str, 1024)) { + my $out = syswrite($tmp_fh, $str, $res); + defined($out) && $out == $res + or croak("write ", + Git::temp_path($tmp_fh), + ": $!\n"); + } + defined $res or croak $!; + + ($fh, $tmp_fh) = ($tmp_fh, $fh); + Git::temp_release($tmp_fh, 1); + } + } + + $hash = $::_repository->hash_and_insert_object( + Git::temp_path($fh)); + $hash =~ /^[a-f\d]{40}$/ or die "not a sha1: $hash\n"; + + Git::temp_release($fb->{base}, 1); + Git::temp_release($fh, 1); + } else { + $hash = $fb->{blob} or die "no blob information\n"; + } + $fb->{pool}->clear; + $self->{gii}->update($fb->{mode_b}, $hash, $path) or croak $!; + print "\t$fb->{action}\t$path\n" if $fb->{action} && ! $::_q; + undef; +} + +sub abort_edit { + my $self = shift; + $self->{nr} = $self->{gii}->{nr}; + delete $self->{gii}; + $self->SUPER::abort_edit(@_); +} + +sub close_edit { + my $self = shift; + + if ($_preserve_empty_dirs) { + my @empty_dirs; + + # Any entry flagged as empty that also has an associated + # dir_prop represents a newly created empty directory. + foreach my $i (keys %{$self->{empty}}) { + push @empty_dirs, $i if exists $self->{dir_prop}->{$i}; + } + + # Search for directories that have become empty due subsequent + # file deletes. + push @empty_dirs, $self->find_empty_directories(); + + # Finally, add a placeholder file to each empty directory. + $self->add_placeholder_file($_) foreach (@empty_dirs); + + $self->stash_placeholder_list(); + } + + $self->{git_commit_ok} = 1; + $self->{nr} = $self->{gii}->{nr}; + delete $self->{gii}; + $self->SUPER::close_edit(@_); +} + +sub find_empty_directories { + my ($self) = @_; + my @empty_dirs; + my %dirs = map { dirname($_) => 1 } @deleted_gpath; + + foreach my $dir (sort keys %dirs) { + next if $dir eq "."; + + # If there have been any additions to this directory, there is + # no reason to check if it is empty. + my $skip_added = 0; + foreach my $t (qw/dir_prop file_prop/) { + foreach my $path (keys %{ $self->{$t} }) { + if (exists $self->{$t}->{dirname($path)}) { + $skip_added = 1; + last; + } + } + last if $skip_added; + } + next if $skip_added; + + # Use `git ls-tree` to get the filenames of this directory + # that existed prior to this particular commit. + my $ls = command('ls-tree', '-z', '--name-only', + $self->{c}, "$dir/"); + my %files = map { $_ => 1 } split(/\0/, $ls); + + # Remove the filenames that were deleted during this commit. + delete $files{$_} foreach (@deleted_gpath); + + # Report the directory if there are no filenames left. + push @empty_dirs, $dir unless (scalar %files); + } + @empty_dirs; +} + +sub add_placeholder_file { + my ($self, $dir) = @_; + my $path = "$dir/$_placeholder_filename"; + my $gpath = $self->git_path($path); + + my $fh = $::_repository->temp_acquire($gpath); + my $hash = $::_repository->hash_and_insert_object(Git::temp_path($fh)); + Git::temp_release($fh, 1); + $self->{gii}->update('100644', $hash, $gpath) or croak $!; + + # The directory should no longer be considered empty. + delete $self->{empty}->{$dir} if exists $self->{empty}->{$dir}; + + # Keep track of any placeholder files we create. + $added_placeholder{$dir} = $path; +} + +sub stash_placeholder_list { + my ($self) = @_; + my $k = "svn-remote.$repo_id.added-placeholder"; + my $v = eval { command_oneline('config', '--get-all', $k) }; + command_noisy('config', '--unset-all', $k) if $v; + foreach (values %added_placeholder) { + command_noisy('config', '--add', $k, $_); + } +} + +1; +__END__ + +Git::SVN::Fetcher - tree delta consumer for "git svn fetch" + +=head1 SYNOPSIS + + use SVN::Core; + use SVN::Ra; + use Git::SVN; + use Git::SVN::Fetcher; + use Git; + + my $gs = Git::SVN->find_by_url($url); + my $ra = SVN::Ra->new(url => $url); + my $editor = Git::SVN::Fetcher->new($gs); + my $reporter = $ra->do_update($SVN::Core::INVALID_REVNUM, '', + 1, $editor); + $reporter->set_path('', $old_rev, 0); + $reporter->finish_report; + my $tree = $gs->tmp_index_do(sub { command_oneline('write-tree') }); + + foreach my $path (keys %{$editor->{dir_prop}) { + my $props = $editor->{dir_prop}{$path}; + foreach my $prop (keys %$props) { + print "property $prop at $path changed to $props->{$prop}\n"; + } + } + foreach my $path (keys %{$editor->{empty}) { + my $action = $editor->{empty}{$path} ? 'added' : 'removed'; + print "empty directory $path $action\n"; + } + foreach my $path (keys %{$editor->{file_prop}) { ... } + foreach my $parent (keys %{$editor->{absent_dir}}) { + my @children = @{$editor->{abstent_dir}{$parent}}; + print "cannot fetch directory $parent/$_: not authorized?\n" + foreach @children; + } + foreach my $parent (keys %{$editor->{absent_file}) { ... } + +=head1 DESCRIPTION + +This is a subclass of C<SVN::Delta::Editor>, which means it implements +callbacks to act as a consumer of Subversion tree deltas. This +particular implementation of those callbacks is meant to store +information about the resulting content which B<git svn fetch> could +use to populate new commits and new entries for F<unhandled.log>. +More specifically: + +=over + +=item * Additions, removals, and modifications of files are propagated +to git-svn's index file F<$GIT_DIR/svn/$refname/index> using +B<git update-index>. + +=item * Changes in Subversion path properties are recorded in the +C<dir_prop> and C<file_prop> fields (which are hashes). + +=item * Addition and removal of empty directories are indicated by +entries with value 1 and 0 respectively in the C<empty> hash. + +=item * Paths that are present but cannot be conveyed (presumably due +to permissions) are recorded in the C<absent_file> and +C<absent_dirs> hashes. For each key, the corresponding value is +a list of paths under that directory that were present but +could not be conveyed. + +=back + +The interface is unstable. Do not use this module unless you are +developing git-svn. + +=head1 DEPENDENCIES + +L<SVN::Delta> from the Subversion perl bindings, +the core L<Carp>, L<File::Basename>, and L<IO::File> modules, +and git's L<Git> helper module. + +C<Git::SVN::Fetcher> has not been tested using callers other than +B<git-svn> itself. + +=head1 SEE ALSO + +L<SVN::Delta>. + +=head1 INCOMPATIBILITIES + +None reported. + +=head1 BUGS + +None. diff --git a/perl/Git/SVN/Prompt.pm b/perl/Git/SVN/Prompt.pm new file mode 100644 index 0000000000..3a6f8af0d9 --- /dev/null +++ b/perl/Git/SVN/Prompt.pm @@ -0,0 +1,202 @@ +package Git::SVN::Prompt; +use strict; +use warnings; +require SVN::Core; +use vars qw/$_no_auth_cache $_username/; + +sub simple { + my ($cred, $realm, $default_username, $may_save, $pool) = @_; + $may_save = undef if $_no_auth_cache; + $default_username = $_username if defined $_username; + if (defined $default_username && length $default_username) { + if (defined $realm && length $realm) { + print STDERR "Authentication realm: $realm\n"; + STDERR->flush; + } + $cred->username($default_username); + } else { + username($cred, $realm, $may_save, $pool); + } + $cred->password(_read_password("Password for '" . + $cred->username . "': ", $realm)); + $cred->may_save($may_save); + $SVN::_Core::SVN_NO_ERROR; +} + +sub ssl_server_trust { + my ($cred, $realm, $failures, $cert_info, $may_save, $pool) = @_; + $may_save = undef if $_no_auth_cache; + print STDERR "Error validating server certificate for '$realm':\n"; + { + no warnings 'once'; + # All variables SVN::Auth::SSL::* are used only once, + # so we're shutting up Perl warnings about this. + if ($failures & $SVN::Auth::SSL::UNKNOWNCA) { + print STDERR " - The certificate is not issued ", + "by a trusted authority. Use the\n", + " fingerprint to validate ", + "the certificate manually!\n"; + } + if ($failures & $SVN::Auth::SSL::CNMISMATCH) { + print STDERR " - The certificate hostname ", + "does not match.\n"; + } + if ($failures & $SVN::Auth::SSL::NOTYETVALID) { + print STDERR " - The certificate is not yet valid.\n"; + } + if ($failures & $SVN::Auth::SSL::EXPIRED) { + print STDERR " - The certificate has expired.\n"; + } + if ($failures & $SVN::Auth::SSL::OTHER) { + print STDERR " - The certificate has ", + "an unknown error.\n"; + } + } # no warnings 'once' + printf STDERR + "Certificate information:\n". + " - Hostname: %s\n". + " - Valid: from %s until %s\n". + " - Issuer: %s\n". + " - Fingerprint: %s\n", + map $cert_info->$_, qw(hostname valid_from valid_until + issuer_dname fingerprint); + my $choice; +prompt: + print STDERR $may_save ? + "(R)eject, accept (t)emporarily or accept (p)ermanently? " : + "(R)eject or accept (t)emporarily? "; + STDERR->flush; + $choice = lc(substr(<STDIN> || 'R', 0, 1)); + if ($choice =~ /^t$/i) { + $cred->may_save(undef); + } elsif ($choice =~ /^r$/i) { + return -1; + } elsif ($may_save && $choice =~ /^p$/i) { + $cred->may_save($may_save); + } else { + goto prompt; + } + $cred->accepted_failures($failures); + $SVN::_Core::SVN_NO_ERROR; +} + +sub ssl_client_cert { + my ($cred, $realm, $may_save, $pool) = @_; + $may_save = undef if $_no_auth_cache; + print STDERR "Client certificate filename: "; + STDERR->flush; + chomp(my $filename = <STDIN>); + $cred->cert_file($filename); + $cred->may_save($may_save); + $SVN::_Core::SVN_NO_ERROR; +} + +sub ssl_client_cert_pw { + my ($cred, $realm, $may_save, $pool) = @_; + $may_save = undef if $_no_auth_cache; + $cred->password(_read_password("Password: ", $realm)); + $cred->may_save($may_save); + $SVN::_Core::SVN_NO_ERROR; +} + +sub username { + my ($cred, $realm, $may_save, $pool) = @_; + $may_save = undef if $_no_auth_cache; + if (defined $realm && length $realm) { + print STDERR "Authentication realm: $realm\n"; + } + my $username; + if (defined $_username) { + $username = $_username; + } else { + print STDERR "Username: "; + STDERR->flush; + chomp($username = <STDIN>); + } + $cred->username($username); + $cred->may_save($may_save); + $SVN::_Core::SVN_NO_ERROR; +} + +sub _read_password { + my ($prompt, $realm) = @_; + my $password = ''; + if (exists $ENV{GIT_ASKPASS}) { + open(PH, "-|", $ENV{GIT_ASKPASS}, $prompt); + $password = <PH>; + $password =~ s/[\012\015]//; # \n\r + close(PH); + } else { + print STDERR $prompt; + STDERR->flush; + require Term::ReadKey; + Term::ReadKey::ReadMode('noecho'); + while (defined(my $key = Term::ReadKey::ReadKey(0))) { + last if $key =~ /[\012\015]/; # \n\r + $password .= $key; + } + Term::ReadKey::ReadMode('restore'); + print STDERR "\n"; + STDERR->flush; + } + $password; +} + +1; +__END__ + +Git::SVN::Prompt - authentication callbacks for git-svn + +=head1 SYNOPSIS + + use Git::SVN::Prompt qw(simple ssl_client_cert ssl_client_cert_pw + ssl_server_trust username); + use SVN::Client (); + + my $cached_simple = SVN::Client::get_simple_provider(); + my $git_simple = SVN::Client::get_simple_prompt_provider(\&simple, 2); + my $cached_ssl = SVN::Client::get_ssl_server_trust_file_provider(); + my $git_ssl = SVN::Client::get_ssl_server_trust_prompt_provider( + \&ssl_server_trust); + my $cached_cert = SVN::Client::get_ssl_client_cert_file_provider(); + my $git_cert = SVN::Client::get_ssl_client_cert_prompt_provider( + \&ssl_client_cert, 2); + my $cached_cert_pw = SVN::Client::get_ssl_client_cert_pw_file_provider(); + my $git_cert_pw = SVN::Client::get_ssl_client_cert_pw_prompt_provider( + \&ssl_client_cert_pw, 2); + my $cached_username = SVN::Client::get_username_provider(); + my $git_username = SVN::Client::get_username_prompt_provider( + \&username, 2); + + my $ctx = new SVN::Client( + auth => [ + $cached_simple, $git_simple, + $cached_ssl, $git_ssl, + $cached_cert, $git_cert, + $cached_cert_pw, $git_cert_pw, + $cached_username, $git_username + ]); + +=head1 DESCRIPTION + +This module is an implementation detail of the "git svn" command. +It implements git-svn's authentication policy. Do not use it unless +you are developing git-svn. + +The interface will change as git-svn evolves. + +=head1 DEPENDENCIES + +L<SVN::Core>. + +=head1 SEE ALSO + +L<SVN::Client>. + +=head1 INCOMPATIBILITIES + +None reported. + +=head1 BUGS + +None. diff --git a/perl/Makefile.PL b/perl/Makefile.PL index 456d45bf40..424890a1a4 100644 --- a/perl/Makefile.PL +++ b/perl/Makefile.PL @@ -27,6 +27,8 @@ MAKE_FRAG my %pm = ( 'Git.pm' => '$(INST_LIBDIR)/Git.pm', 'Git/I18N.pm' => '$(INST_LIBDIR)/Git/I18N.pm', + 'Git/SVN/Fetcher.pm' => '$(INST_LIBDIR)/Git/SVN/Fetcher.pm', + 'Git/SVN/Prompt.pm' => '$(INST_LIBDIR)/Git/SVN/Prompt.pm', ); # We come with our own bundled Error.pm. It's not in the set of default @@ -8,10 +8,17 @@ Leader: Byrial Jensen <byrial@vip.cybercity.dk> Language: de (German) Repository: https://github.com/ralfth/git-po-de Leader: Ralf Thielow <ralf.thielow@googlemail.com> +Members: Thomas Rast <trast@student.ethz.ch> + Jan Krüger <jk@jk.gs> + Christian Stimming <stimming@tuhh.de> Language: is (Icelandic) Leader: Ævar Arnfjörð Bjarmason <avarab@gmail.com> +Language: it (Italian) +Repository: https://github.com/quizzlo/git-po-it/ +Leader: Marco Paolone <marcopaolone@gmail.com> + Language: nl (Dutch) Repository: https://github.com/vfr-nl/git-po/ Leader: Vincent van Ravesteijn <vfr@lyx.org> @@ -24,6 +31,10 @@ Language: sv (Swedish) Repository: https://github.com/nafmo/git-l10n-sv/ Leader: Peter Krefting <peter@softwolves.pp.se> +Language: vi (Vietnamese) +Repository: https://github.com/vnwildman/git.git +Leader: Trần Ngọc Quân <vnwildman AT gmail.com> + Language: zh_CN (Simplified Chinese) Repository: https://github.com/gotgit/git-po-zh_CN/ Leader: Jiang Xin <worldhello.net@gmail.com> @@ -5,9 +5,9 @@ # msgid "" msgstr "" -"Project-Id-Version: git 1.7.10\n" +"Project-Id-Version: git 1.7.11\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2012-04-28 20:17+0800\n" +"POT-Creation-Date: 2012-06-02 07:03+0800\n" "PO-Revision-Date: 2012-03-28 18:46+0200\n" "Last-Translator: Ralf Thielow <ralf.thielow@googlemail.com>\n" "Language-Team: German\n" @@ -34,10 +34,84 @@ msgid "" "or use 'git commit -a'." msgstr "" "Korrigiere dies im Arbeitsbaum,\n" -"und benutze dann 'git add/rm <Datei>' wie\n" -"vorgesehen, um die Auflösung zu markieren und dann einzutragen,\n" +"und benutze dann 'git add/rm <Datei>'\n" +"um die Auflösung entsprechend zu markieren und einzutragen,\n" "oder benutze 'git commit -a'." +#: bundle.c:36 +#, c-format +msgid "'%s' does not look like a v2 bundle file" +msgstr "'%s' sieht nicht wie eine v2 Paketdatei aus" + +#: bundle.c:63 +#, c-format +msgid "unrecognized header: %s%s (%d)" +msgstr "nicht erkannter Kopfbereich: %s%s (%d)" + +#: bundle.c:89 builtin/commit.c:696 +#, c-format +msgid "could not open '%s'" +msgstr "Konnte '%s' nicht öffnen" + +#: bundle.c:140 +msgid "Repository lacks these prerequisite commits:" +msgstr "Dem Projektarchiv fehlen folgende vorrausgesetzte Versionen:" + +#: bundle.c:164 sequencer.c:550 sequencer.c:982 builtin/log.c:289 +#: builtin/log.c:720 builtin/log.c:1309 builtin/log.c:1528 builtin/merge.c:347 +#: builtin/shortlog.c:181 +msgid "revision walk setup failed" +msgstr "Einrichtung des Revisionsgangs fehlgeschlagen" + +#: bundle.c:186 +#, c-format +msgid "The bundle contains %d ref" +msgid_plural "The bundle contains %d refs" +msgstr[0] "Das Paket enthält %d Referenz" +msgstr[1] "Das Paket enthält %d Referenzen" + +#: bundle.c:192 +#, c-format +msgid "The bundle requires this ref" +msgid_plural "The bundle requires these %d refs" +msgstr[0] "Das Paket benötigt diese Referenz" +msgstr[1] "Das Paket benötigt diese %d Referenzen" + +#: bundle.c:290 +msgid "rev-list died" +msgstr "\"rev-list\" abgebrochen" + +#: bundle.c:296 builtin/log.c:1205 builtin/shortlog.c:284 +#, c-format +msgid "unrecognized argument: %s" +msgstr "nicht erkanntes Argument: %s" + +#: bundle.c:331 +#, c-format +msgid "ref '%s' is excluded by the rev-list options" +msgstr "Referenz '%s' wird durch \"rev-list\" Optionen ausgeschlossen" + +#: bundle.c:376 +msgid "Refusing to create empty bundle." +msgstr "Erstellung eines leeren Pakets zurückgewiesen." + +#: bundle.c:394 +msgid "Could not spawn pack-objects" +msgstr "Konnte Paketobjekte nicht erstellen" + +#: bundle.c:412 +msgid "pack-objects died" +msgstr "Erstellung der Paketobjekte abgebrochen" + +#: bundle.c:415 +#, c-format +msgid "cannot create '%s'" +msgstr "kann '%s' nicht erstellen" + +#: bundle.c:437 +msgid "index-pack died" +msgstr "Erstellung der Paketindexdatei abgebrochen" + #: commit.c:48 #, c-format msgid "could not parse %s" @@ -54,7 +128,7 @@ msgstr "Speicher verbraucht" #: connected.c:39 msgid "Could not run 'git rev-list'" -msgstr "'git rev-list' konnte nicht ausgeführt werden" +msgstr "Konnte 'git rev-list' nicht ausführen" #: connected.c:48 #, c-format @@ -66,6 +140,73 @@ msgstr "Fehler beim Schreiben nach rev-list: %s" msgid "failed to close rev-list's stdin: %s" msgstr "Fehler beim Schließen von rev-list's Standard-Eingabe: %s" +#: date.c:95 +msgid "in the future" +msgstr "in der Zukunft" + +#: date.c:101 +#, c-format +msgid "%lu second ago" +msgid_plural "%lu seconds ago" +msgstr[0] "vor %lu Sekunde" +msgstr[1] "vor %lu Sekunden" + +#: date.c:108 +#, c-format +msgid "%lu minute ago" +msgid_plural "%lu minutes ago" +msgstr[0] "vor %lu Minute" +msgstr[1] "vor %lu Minuten" + +#: date.c:115 +#, c-format +msgid "%lu hour ago" +msgid_plural "%lu hours ago" +msgstr[0] "vor %lu Stunde" +msgstr[1] "vor %lu Stunden" + +#: date.c:122 +#, c-format +msgid "%lu day ago" +msgid_plural "%lu days ago" +msgstr[0] "vor %lu Tag" +msgstr[1] "vor %lu Tagen" + +#: date.c:128 +#, c-format +msgid "%lu week ago" +msgid_plural "%lu weeks ago" +msgstr[0] "vor %lu Woche" +msgstr[1] "vor %lu Wochen" + +#: date.c:135 +#, c-format +msgid "%lu month ago" +msgid_plural "%lu months ago" +msgstr[0] "vor %lu Monat" +msgstr[1] "vor %lu Monaten" + +#: date.c:146 +#, c-format +msgid "%lu year" +msgid_plural "%lu years" +msgstr[0] "vor %lu Jahr" +msgstr[1] "vor %lu Jahren" + +#: date.c:149 +#, c-format +msgid "%s, %lu month ago" +msgid_plural "%s, %lu months ago" +msgstr[0] "%s, und %lu Monat" +msgstr[1] "%s, und %lu Monaten" + +#: date.c:154 date.c:159 +#, c-format +msgid "%lu year ago" +msgid_plural "%lu years ago" +msgstr[0] "vor %lu Jahr" +msgstr[1] "vor %lu Jahren" + #: diff.c:105 #, c-format msgid " Failed to parse dirstat cut-off percentage '%.*s'\n" @@ -111,7 +252,7 @@ msgid_plural ", %d deletions(-)" msgstr[0] ", %d Zeile entfernt(-)" msgstr[1] ", %d Zeilen entfernt(-)" -#: diff.c:3435 +#: diff.c:3478 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -122,7 +263,7 @@ msgstr "" #: gpg-interface.c:59 msgid "could not run gpg." -msgstr "gpg konnte nicht ausgeführt werden" +msgstr "konnte gpg nicht ausführen" #: gpg-interface.c:71 msgid "gpg did not accept the data" @@ -132,22 +273,31 @@ msgstr "gpg hat die Daten nicht akzeptiert" msgid "gpg failed to sign the data" msgstr "gpg beim Signieren der Daten fehlgeschlagen" -#: grep.c:1280 +#: grep.c:1320 #, c-format msgid "'%s': unable to read %s" msgstr "'%s': konnte nicht lesen %s" -#: grep.c:1297 +#: grep.c:1337 #, c-format msgid "'%s': %s" msgstr "'%s': %s" -#: grep.c:1308 +#: grep.c:1348 #, c-format msgid "'%s': short read %s" -msgstr "'%s': kurz gelesen %s" +msgstr "'%s': read() zu kurz %s" -#: help.c:287 +#: help.c:207 +#, c-format +msgid "available git commands in '%s'" +msgstr "Vorhandene Git-Kommandos in '%s'" + +#: help.c:214 +msgid "git commands available from elsewhere on your $PATH" +msgstr "Vorhandene Git-Kommandos irgendwo in deinem $PATH" + +#: help.c:270 #, c-format msgid "" "'%s' appears to be a git command, but we were not\n" @@ -156,24 +306,83 @@ msgstr "" "'%s' scheint ein git-Kommando zu sein, konnte aber\n" "nicht ausgeführt werden. Vielleicht ist git-%s fehlerhaft?" -#: remote.c:1607 +#: help.c:327 +msgid "Uh oh. Your system reports no Git commands at all." +msgstr "Uh oh. Keine Git-Kommandos auf deinem System vorhanden." + +#: help.c:349 +#, c-format +msgid "" +"WARNING: You called a Git command named '%s', which does not exist.\n" +"Continuing under the assumption that you meant '%s'" +msgstr "" +"Warnung: Du hast das nicht existierende Git-Kommando '%s' ausgeführt.\n" +"Setze fort unter der Annahme das du '%s' gemeint hast" + +#: help.c:354 +#, c-format +msgid "in %0.1f seconds automatically..." +msgstr "automatisch in %0.1f Sekunden..." + +#: help.c:361 +#, c-format +msgid "git: '%s' is not a git command. See 'git --help'." +msgstr "git: '%s' ist kein Git-Kommando. Siehe 'git --help'." + +#: help.c:365 +msgid "" +"\n" +"Did you mean this?" +msgid_plural "" +"\n" +"Did you mean one of these?" +msgstr[0] "" +"\n" +"Hast du das gemeint?" +msgstr[1] "" +"\n" +"Hast du eines von diesen gemeint?" + +#: parse-options.c:493 +msgid "..." +msgstr "..." + +#: parse-options.c:511 +#, c-format +msgid "usage: %s" +msgstr "Verwendung: %s" + +#. TRANSLATORS: the colon here should align with the +#. one in "usage: %s" translation +#: parse-options.c:515 +#, c-format +msgid " or: %s" +msgstr " oder: %s" + +#: parse-options.c:518 +#, c-format +msgid " %s" +msgstr " %s" + +#: remote.c:1629 #, c-format msgid "Your branch is ahead of '%s' by %d commit.\n" msgid_plural "Your branch is ahead of '%s' by %d commits.\n" msgstr[0] "Dein Zweig ist vor '%s' um %d Version.\n" msgstr[1] "Dein Zweig ist vor '%s' um %d Versionen.\n" -#: remote.c:1613 +#: remote.c:1635 #, c-format msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n" msgid_plural "" "Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n" msgstr[0] "" -"Dein Zweig ist hinter '%s' um %d Version, und kann vorgespult werden.\n" +"Dein Zweig ist zu '%s' um %d Version hinterher, und kann vorgespult werden.\n" msgstr[1] "" -"Dein Zweig ist hinter '%s' um %d Versionen, und kann vorgespult werden.\n" +"Dein Zweig ist zu '%s' um %d Versionen hinterher, und kann vorgespult " +"werden.\n" -#: remote.c:1621 +#: remote.c:1643 #, c-format msgid "" "Your branch and '%s' have diverged,\n" @@ -188,19 +397,19 @@ msgstr[1] "" "Dein Zweig und '%s' sind divergiert,\n" "und haben jeweils %d und %d unterschiedliche Versionen.\n" -#: sequencer.c:120 builtin/merge.c:865 builtin/merge.c:978 +#: sequencer.c:121 builtin/merge.c:865 builtin/merge.c:978 #: builtin/merge.c:1088 builtin/merge.c:1098 #, c-format msgid "Could not open '%s' for writing" msgstr "Konnte '%s' nicht zum Schreiben öffnen." -#: sequencer.c:122 builtin/merge.c:333 builtin/merge.c:868 +#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:868 #: builtin/merge.c:1090 builtin/merge.c:1103 #, c-format msgid "Could not write to '%s'" msgstr "Konnte nicht nach '%s' schreiben." -#: sequencer.c:143 +#: sequencer.c:144 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add <paths>' or 'git rm <paths>'" @@ -208,7 +417,7 @@ msgstr "" "nach Auflösung der Konflikte, markiere die korrigierten Pfade\n" "mit 'git add <Pfade>' oder 'git rm <Pfade>'" -#: sequencer.c:146 +#: sequencer.c:147 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add <paths>' or 'git rm <paths>'\n" @@ -218,55 +427,74 @@ msgstr "" "mit 'git add <Pfade>' oder 'git rm <Pfade>'und trage das Ergebnis ein mit " "'git commit'" -#: sequencer.c:159 sequencer.c:685 sequencer.c:768 +#: sequencer.c:160 sequencer.c:758 sequencer.c:841 #, c-format msgid "Could not write to %s" msgstr "Konnte nicht nach %s schreiben" -#: sequencer.c:162 +#: sequencer.c:163 #, c-format msgid "Error wrapping up %s" msgstr "Fehler bei Nachbereitung von %s" -#: sequencer.c:177 +#: sequencer.c:178 msgid "Your local changes would be overwritten by cherry-pick." msgstr "" "Deine lokalen Änderungen würden von \"cherry-pick\" überschrieben werden." -#: sequencer.c:179 +#: sequencer.c:180 msgid "Your local changes would be overwritten by revert." msgstr "Deine lokalen Änderungen würden von \"revert\" überschrieben werden." -#: sequencer.c:182 +#: sequencer.c:183 msgid "Commit your changes or stash them to proceed." msgstr "Trage deine Änderungen ein oder benutze \"stash\" um fortzufahren." #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:232 +#: sequencer.c:233 #, c-format msgid "%s: Unable to write new index file" msgstr "%s: Konnte neue Bereitstellungsdatei nicht schreiben" -#: sequencer.c:298 +#: sequencer.c:261 +msgid "Could not resolve HEAD commit\n" +msgstr "Konnte Version der Zweigspitze (HEAD) nicht auflösen\n" + +#: sequencer.c:282 +msgid "Unable to update cache tree\n" +msgstr "Konnte zwischengespeicherten Baum nicht aktualisieren\n" + +#: sequencer.c:324 +#, c-format +msgid "Could not parse commit %s\n" +msgstr "Konnte Version %s nicht parsen\n" + +#: sequencer.c:329 +#, c-format +msgid "Could not parse parent commit %s\n" +msgstr "Konnte Elternversion %s nicht parsen\n" + +#: sequencer.c:395 msgid "Your index file is unmerged." msgstr "Deine Bereitstellungsdatei ist nicht zusammengeführt." -#: sequencer.c:301 +#: sequencer.c:398 msgid "You do not have a valid HEAD" msgstr "Du hast keine gültige Zweigspitze (HEAD)" -#: sequencer.c:316 +#: sequencer.c:413 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "" -"Version %s ist eine Zusammenführung, aber es wurde keine Option -m angegeben." +"Version %s ist eine Zusammenführung, aber die Option -m wurde nicht " +"angegeben." -#: sequencer.c:324 +#: sequencer.c:421 #, c-format msgid "Commit %s does not have parent %d" msgstr "Version %s hat keinen Elternteil %d" -#: sequencer.c:328 +#: sequencer.c:425 #, c-format msgid "Mainline was specified but commit %s is not a merge." msgstr "" @@ -274,151 +502,145 @@ msgstr "" #. TRANSLATORS: The first %s will be "revert" or #. "cherry-pick", the second %s a SHA1 -#: sequencer.c:339 +#: sequencer.c:436 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "%s: kann Elternversion %s nicht parsen" -#: sequencer.c:343 +#: sequencer.c:440 #, c-format msgid "Cannot get commit message for %s" msgstr "Kann keine Versionsbeschreibung für %s bekommen" -#: sequencer.c:427 +#: sequencer.c:524 #, c-format msgid "could not revert %s... %s" msgstr "Konnte %s nicht zurücksetzen... %s" -#: sequencer.c:428 +#: sequencer.c:525 #, c-format msgid "could not apply %s... %s" msgstr "Konnte %s nicht anwenden... %s" -#: sequencer.c:450 sequencer.c:909 builtin/log.c:289 builtin/log.c:719 -#: builtin/log.c:1335 builtin/log.c:1554 builtin/merge.c:347 -#: builtin/shortlog.c:181 -msgid "revision walk setup failed" -msgstr "Einrichtung des Revisionsgangs fehlgeschlagen" - -#: sequencer.c:453 +#: sequencer.c:553 msgid "empty commit set passed" msgstr "leere Menge von Versionen übergeben" -#: sequencer.c:461 +#: sequencer.c:561 #, c-format msgid "git %s: failed to read the index" msgstr "git %s: Fehler beim Lesen der Bereitstellung" -#: sequencer.c:466 +#: sequencer.c:566 #, c-format msgid "git %s: failed to refresh the index" msgstr "git %s: Fehler beim Aktualisieren der Bereitstellung" -#: sequencer.c:551 +#: sequencer.c:624 #, c-format msgid "Cannot %s during a %s" msgstr "Kann %s nicht während eines %s durchführen" -#: sequencer.c:573 +#: sequencer.c:646 #, c-format msgid "Could not parse line %d." msgstr "Konnte Zeile %d nicht parsen." -#: sequencer.c:578 +#: sequencer.c:651 msgid "No commits parsed." msgstr "Keine Versionen geparst." -#: sequencer.c:591 +#: sequencer.c:664 #, c-format msgid "Could not open %s" -msgstr "%s konnte nicht geöffnet werden." +msgstr "Konnte %s nicht öffnen" -#: sequencer.c:595 +#: sequencer.c:668 #, c-format msgid "Could not read %s." -msgstr "%s konnte nicht gelesen werden." +msgstr "Konnte %s nicht lesen." -#: sequencer.c:602 +#: sequencer.c:675 #, c-format msgid "Unusable instruction sheet: %s" msgstr "Unbenutzbares Instruktionsblatt: %s" -#: sequencer.c:630 +#: sequencer.c:703 #, c-format msgid "Invalid key: %s" msgstr "Ungültiger Schlüssel: %s" -#: sequencer.c:633 +#: sequencer.c:706 #, c-format msgid "Invalid value for %s: %s" msgstr "Ungültiger Wert für %s: %s" -#: sequencer.c:645 +#: sequencer.c:718 #, c-format msgid "Malformed options sheet: %s" msgstr "Fehlerhaftes Optionsblatt: %s" -#: sequencer.c:666 +#: sequencer.c:739 msgid "a cherry-pick or revert is already in progress" -msgstr "\"cherry-pick\" oder \"revert\" wird bereits ausgeführt" +msgstr "\"cherry-pick\" oder \"revert\" ist bereits im Gang" -#: sequencer.c:667 +#: sequencer.c:740 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "versuche \"git cherry-pick (--continue | --quit | --abort)\"" -#: sequencer.c:671 +#: sequencer.c:744 #, c-format msgid "Could not create sequencer directory %s" msgstr "Konnte \"sequencer\"-Verzeichnis %s nicht erstellen" -#: sequencer.c:687 sequencer.c:772 +#: sequencer.c:760 sequencer.c:845 #, c-format msgid "Error wrapping up %s." msgstr "Fehler beim Einpacken von %s." -#: sequencer.c:706 sequencer.c:840 +#: sequencer.c:779 sequencer.c:913 msgid "no cherry-pick or revert in progress" -msgstr "kein \"cherry-pick\" oder \"revert\" in Ausführung" +msgstr "kein \"cherry-pick\" oder \"revert\" im Gang" -#: sequencer.c:708 +#: sequencer.c:781 msgid "cannot resolve HEAD" msgstr "kann Zweigspitze (HEAD) nicht auflösen" -#: sequencer.c:710 +#: sequencer.c:783 msgid "cannot abort from a branch yet to be born" -msgstr "kann nicht von einem Zweig abbrechen, der noch geboren wird" +msgstr "kann nicht abbrechen: bin auf einem Zweig, der noch geboren wird" -#: sequencer.c:732 +#: sequencer.c:805 builtin/apply.c:3697 #, c-format msgid "cannot open %s: %s" msgstr "Kann %s nicht öffnen: %s" -#: sequencer.c:735 +#: sequencer.c:808 #, c-format msgid "cannot read %s: %s" msgstr "Kann %s nicht lesen: %s" -#: sequencer.c:736 +#: sequencer.c:809 msgid "unexpected end of file" msgstr "Unerwartetes Dateiende" -#: sequencer.c:742 +#: sequencer.c:815 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "" "gespeicherte \"pre-cherry-pick\" Datei der Zweigspitze (HEAD) '%s' ist " "beschädigt" -#: sequencer.c:765 +#: sequencer.c:838 #, c-format msgid "Could not format %s." msgstr "Konnte %s nicht formatieren." -#: sequencer.c:927 +#: sequencer.c:1000 msgid "Can't revert as initial commit" msgstr "Kann nicht zu initialer Version zurücksetzen." -#: sequencer.c:928 +#: sequencer.c:1001 msgid "Can't cherry-pick into empty head" msgstr "Kann \"cherry-pick\" nicht in einem leerem Kopf ausführen." @@ -439,257 +661,266 @@ msgstr "Kein entferntes Projektarchiv für Zweig '%s' konfiguriert." #: sha1_name.c:872 #, c-format msgid "Upstream branch '%s' not stored as a remote-tracking branch" -msgstr "Zweig '%s' des entfernten Projektarchivs ist nicht als entfernter " -"Übernahmezweig gespeichert" +msgstr "" +"Zweig '%s' des entfernten Projektarchivs ist kein gefolgter Übernahmezweig" -#: wt-status.c:134 +#: wrapper.c:413 +#, c-format +msgid "unable to look up current user in the passwd file: %s" +msgstr "konnte aktuellen Benutzer nicht in Passwort-Datei finden: %s" + +#: wrapper.c:414 +msgid "no such user" +msgstr "kein solcher Benutzer" + +#: wt-status.c:135 msgid "Unmerged paths:" msgstr "Nicht zusammengeführte Pfade:" -#: wt-status.c:140 wt-status.c:157 +#: wt-status.c:141 wt-status.c:158 #, c-format msgid " (use \"git reset %s <file>...\" to unstage)" msgstr "" " (benutze \"git reset %s <Datei>...\" zum Herausnehmen aus der " "Bereitstellung)" -#: wt-status.c:142 wt-status.c:159 +#: wt-status.c:143 wt-status.c:160 msgid " (use \"git rm --cached <file>...\" to unstage)" msgstr "" " (benutze \"git rm --cached <Datei>...\" zum Herausnehmen aus der " "Bereitstellung)" -#: wt-status.c:143 +#: wt-status.c:144 msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" msgstr "" -" (benutze \"git add/rm <Datei>...\" wie vorgesehen, um die Auflösung zu " +" (benutze \"git add/rm <Datei>...\" um die Auflösung entsprechend zu " "markieren)" -#: wt-status.c:151 +#: wt-status.c:152 msgid "Changes to be committed:" msgstr "zum Eintragen bereitgestellte Änderungen:" -#: wt-status.c:169 +#: wt-status.c:170 msgid "Changes not staged for commit:" msgstr "Änderungen, die nicht zum Eintragen bereitgestellt sind:" -#: wt-status.c:173 +#: wt-status.c:174 msgid " (use \"git add <file>...\" to update what will be committed)" -msgstr " (benutze \"git add <Datei>...\" zur Aktualisierung der Eintragung)" +msgstr " (benutze \"git add <Datei>...\" zum Bereitstellen)" -#: wt-status.c:175 +#: wt-status.c:176 msgid " (use \"git add/rm <file>...\" to update what will be committed)" -msgstr "" -" (benutze \"git add/rm <Datei>...\" zur Aktualisierung der Eintragung)" +msgstr " (benutze \"git add/rm <Datei>...\" zum Bereitstellen)" -#: wt-status.c:176 +#: wt-status.c:177 msgid "" " (use \"git checkout -- <file>...\" to discard changes in working directory)" msgstr "" " (benutze \"git checkout -- <Datei>...\" um die Änderungen im " "Arbeitsverzeichnis zu verwerfen)" -#: wt-status.c:178 +#: wt-status.c:179 msgid " (commit or discard the untracked or modified content in submodules)" msgstr "" -" (trage ein oder verwerfe den ungefolgten oder geänderten Inhalt in den " +" (trage ein oder verwerfe den unbeobachteten oder geänderten Inhalt in den " "Unterprojekten)" -#: wt-status.c:187 +#: wt-status.c:188 #, c-format msgid "%s files:" msgstr "%s Dateien:" -#: wt-status.c:190 +#: wt-status.c:191 #, c-format msgid " (use \"git %s <file>...\" to include in what will be committed)" msgstr " (benutze \"git %s <Datei>...\" zum Einfügen in die Eintragung)" -#: wt-status.c:207 +#: wt-status.c:208 msgid "bug" msgstr "Fehler" -#: wt-status.c:212 +#: wt-status.c:213 msgid "both deleted:" msgstr "beide gelöscht:" -#: wt-status.c:213 +#: wt-status.c:214 msgid "added by us:" msgstr "von uns hinzugefügt:" -#: wt-status.c:214 +#: wt-status.c:215 msgid "deleted by them:" msgstr "von denen gelöscht:" -#: wt-status.c:215 +#: wt-status.c:216 msgid "added by them:" msgstr "von denen hinzugefügt:" -#: wt-status.c:216 +#: wt-status.c:217 msgid "deleted by us:" msgstr "von uns gelöscht:" -#: wt-status.c:217 +#: wt-status.c:218 msgid "both added:" msgstr "von beiden hinzugefügt:" -#: wt-status.c:218 +#: wt-status.c:219 msgid "both modified:" msgstr "von beiden geändert:" -#: wt-status.c:248 +#: wt-status.c:249 msgid "new commits, " msgstr "neue Versionen, " -#: wt-status.c:250 +#: wt-status.c:251 msgid "modified content, " msgstr "geänderter Inhalt, " -#: wt-status.c:252 +#: wt-status.c:253 msgid "untracked content, " -msgstr "unverfolgter Inhalt, " +msgstr "unbeobachteter Inhalt, " -#: wt-status.c:266 +#: wt-status.c:267 #, c-format msgid "new file: %s" msgstr "neue Datei: %s" -#: wt-status.c:269 +#: wt-status.c:270 #, c-format msgid "copied: %s -> %s" msgstr "kopiert: %s -> %s" -#: wt-status.c:272 +#: wt-status.c:273 #, c-format msgid "deleted: %s" msgstr "gelöscht: %s" -#: wt-status.c:275 +#: wt-status.c:276 #, c-format msgid "modified: %s" msgstr "geändert: %s" -#: wt-status.c:278 +#: wt-status.c:279 #, c-format msgid "renamed: %s -> %s" msgstr "umbenannt: %s -> %s" -#: wt-status.c:281 +#: wt-status.c:282 #, c-format msgid "typechange: %s" msgstr "Typänderung: %s" -#: wt-status.c:284 +#: wt-status.c:285 #, c-format msgid "unknown: %s" msgstr "unbekannt: %s" -#: wt-status.c:287 +#: wt-status.c:288 #, c-format msgid "unmerged: %s" msgstr "nicht zusammengeführt: %s" -#: wt-status.c:290 +#: wt-status.c:291 #, c-format msgid "bug: unhandled diff status %c" msgstr "Fehler: unbehandelter Differenz-Status %c" -#: wt-status.c:713 +#: wt-status.c:737 msgid "On branch " msgstr "Auf Zweig " -#: wt-status.c:720 +#: wt-status.c:744 msgid "Not currently on any branch." msgstr "Im Moment auf keinem Zweig." -#: wt-status.c:731 +#: wt-status.c:755 msgid "Initial commit" msgstr "Initiale Version" -#: wt-status.c:745 +#: wt-status.c:769 msgid "Untracked" -msgstr "Unverfolgte" +msgstr "Unbeobachtete" -#: wt-status.c:747 +#: wt-status.c:771 msgid "Ignored" msgstr "Ignorierte" -#: wt-status.c:749 +#: wt-status.c:773 #, c-format msgid "Untracked files not listed%s" -msgstr "Unverfolgte Dateien nicht aufgelistet%s" +msgstr "Unbeobachtete Dateien nicht aufgelistet%s" -#: wt-status.c:751 +#: wt-status.c:775 msgid " (use -u option to show untracked files)" -msgstr " (benutze die Option -u um unverfolgte Dateien anzuzeigen)" +msgstr " (benutze die Option -u um unbeobachteten Dateien anzuzeigen)" -#: wt-status.c:757 +#: wt-status.c:781 msgid "No changes" msgstr "Keine Änderungen" -#: wt-status.c:761 +#: wt-status.c:785 #, c-format msgid "no changes added to commit%s\n" msgstr "keine Änderungen zum Eintragen hinzugefügt%s\n" -#: wt-status.c:763 +#: wt-status.c:787 msgid " (use \"git add\" and/or \"git commit -a\")" msgstr " (benutze \"git add\" und/oder \"git commit -a\")" -#: wt-status.c:765 +#: wt-status.c:789 #, c-format msgid "nothing added to commit but untracked files present%s\n" -msgstr "nichts zum Eintragen hinzugefügt, aber es gibt unverfolgte Dateien%s\n" +msgstr "" +"nichts zum Eintragen hinzugefügt, aber es gibt unbeobachtete Dateien%s\n" -#: wt-status.c:767 +#: wt-status.c:791 msgid " (use \"git add\" to track)" -msgstr " (benutze \"git add\" zum Verfolgen)" +msgstr " (benutze \"git add\" zum Beobachten)" -#: wt-status.c:769 wt-status.c:772 wt-status.c:775 +#: wt-status.c:793 wt-status.c:796 wt-status.c:799 #, c-format msgid "nothing to commit%s\n" msgstr "nichts zum Eintragen%s\n" -#: wt-status.c:770 +#: wt-status.c:794 msgid " (create/copy files and use \"git add\" to track)" -msgstr " (Erstelle/Kopiere Dateien und benutze \"git add\" zum Verfolgen)" +msgstr " (Erstelle/Kopiere Dateien und benutze \"git add\" zum Beobachten)" -#: wt-status.c:773 +#: wt-status.c:797 msgid " (use -u to show untracked files)" -msgstr " (benutze -u um unverfolgte Dateien anzuzeigen)" +msgstr " (benutze die Option -u um unbeobachtete Dateien anzuzeigen)" -#: wt-status.c:776 +#: wt-status.c:800 msgid " (working directory clean)" msgstr " (Arbeitsverzeichnis sauber)" -#: wt-status.c:884 +#: wt-status.c:908 msgid "HEAD (no branch)" msgstr "HEAD (kein Zweig)" -#: wt-status.c:890 +#: wt-status.c:914 msgid "Initial commit on " msgstr "Initiale Version auf " -#: wt-status.c:905 +#: wt-status.c:929 msgid "behind " -msgstr "hinter " +msgstr "hinterher " -#: wt-status.c:908 wt-status.c:911 +#: wt-status.c:932 wt-status.c:935 msgid "ahead " -msgstr "über " +msgstr "voraus " -#: wt-status.c:913 +#: wt-status.c:937 msgid ", behind " -msgstr ", hinter " +msgstr ", hinterher " #: builtin/add.c:62 #, c-format msgid "unexpected diff status %c" msgstr "unerwarteter Differenz-Status %c" -#: builtin/add.c:67 builtin/commit.c:298 +#: builtin/add.c:67 builtin/commit.c:226 msgid "updating files failed" -msgstr "Aktualisierung von Dateien fehlgeschlagen" +msgstr "Aktualisierung der Dateien fehlgeschlagen" #: builtin/add.c:77 #, c-format @@ -732,7 +963,7 @@ msgstr "Konnte Patch nicht schreiben" #: builtin/add.c:295 #, c-format msgid "Could not stat '%s'" -msgstr "Verzeichnis '%s' konnte nicht gelesen werden" +msgstr "Konnte Verzeichnis '%s' nicht lesen" #: builtin/add.c:297 msgid "Empty patch. Aborted." @@ -779,17 +1010,509 @@ msgstr "Nichts spezifiziert, nichts hinzugefügt.\n" #: builtin/add.c:414 #, c-format msgid "Maybe you wanted to say 'git add .'?\n" -msgstr "Wolltest du vieleicht 'git add .' sagen?\n" +msgstr "Wolltest du vielleicht 'git add .' sagen?\n" -#: builtin/add.c:420 builtin/clean.c:95 builtin/commit.c:358 builtin/mv.c:82 +#: builtin/add.c:420 builtin/clean.c:95 builtin/commit.c:286 builtin/mv.c:82 #: builtin/rm.c:162 msgid "index file corrupt" msgstr "Bereitstellungsdatei beschädigt" -#: builtin/add.c:476 builtin/mv.c:229 builtin/rm.c:260 +#: builtin/add.c:476 builtin/apply.c:4108 builtin/mv.c:229 builtin/rm.c:260 msgid "Unable to write new index file" msgstr "Konnte neue Bereitstellungsdatei nicht schreiben." +#: builtin/apply.c:53 +msgid "git apply [options] [<patch>...]" +msgstr "git apply [Optionen] [<Patch>...]" + +#: builtin/apply.c:106 +#, c-format +msgid "unrecognized whitespace option '%s'" +msgstr "nicht erkannte Option für Leerzeichen: '%s'" + +#: builtin/apply.c:121 +#, c-format +msgid "unrecognized whitespace ignore option '%s'" +msgstr "nicht erkannte Option zum Ignorieren von Leerzeichen: '%s'" + +#: builtin/apply.c:815 +#, c-format +msgid "Cannot prepare timestamp regexp %s" +msgstr "Kann regulären Ausdruck für Zeitstempel %s nicht verarbeiten" + +#: builtin/apply.c:824 +#, c-format +msgid "regexec returned %d for input: %s" +msgstr "Ausführung des regulären Ausdrucks gab %d zurück. Eingabe: %s" + +#: builtin/apply.c:905 +#, c-format +msgid "unable to find filename in patch at line %d" +msgstr "Konnte keinen Dateinamen in Zeile %d des Patches finden." + +#: builtin/apply.c:937 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" +msgstr "" +"git apply: ungültiges 'git-diff' - erwartete /dev/null, erhielt %s in Zeile " +"%d" + +#: builtin/apply.c:941 +#, c-format +msgid "git apply: bad git-diff - inconsistent new filename on line %d" +msgstr "" +"git apply: ungültiges 'git-diff' - Inkonsistenter neuer Dateiname in Zeile %d" + +#: builtin/apply.c:942 +#, c-format +msgid "git apply: bad git-diff - inconsistent old filename on line %d" +msgstr "" +"git apply: ungültiges 'git-diff' - Inkonsistenter alter Dateiname in Zeile %d" + +#: builtin/apply.c:949 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null on line %d" +msgstr "git apply: ungültiges 'git-diff' - erwartete /dev/null in Zeile %d" + +#: builtin/apply.c:1394 +#, c-format +msgid "recount: unexpected line: %.*s" +msgstr "recount: unerwartete Zeile: %.*s" + +#: builtin/apply.c:1451 +#, c-format +msgid "patch fragment without header at line %d: %.*s" +msgstr "Patch-Fragment ohne Kopfbereich bei Zeile %d: %.*s" + +#: builtin/apply.c:1468 +#, c-format +msgid "" +"git diff header lacks filename information when removing %d leading pathname " +"component (line %d)" +msgid_plural "" +"git diff header lacks filename information when removing %d leading pathname " +"components (line %d)" +msgstr[0] "" +"Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen, wenn " +"%d vorangestellter Teil des Pfades entfernt wird (Zeile %d)" +msgstr[1] "" +"Dem Kopfbereich von \"git diff\" fehlen Informationen zum Dateinamen, wenn " +"%d vorangestellte Teile des Pfades entfernt werden (Zeile %d)" + +#: builtin/apply.c:1628 +msgid "new file depends on old contents" +msgstr "neue Datei hängt von alten Inhalten ab" + +#: builtin/apply.c:1630 +msgid "deleted file still has contents" +msgstr "entfernte Datei hat noch Inhalte" + +#: builtin/apply.c:1656 +#, c-format +msgid "corrupt patch at line %d" +msgstr "fehlerhafter Patch bei Zeile %d" + +#: builtin/apply.c:1692 +#, c-format +msgid "new file %s depends on old contents" +msgstr "neue Datei %s hängt von alten Inhalten ab" + +#: builtin/apply.c:1694 +#, c-format +msgid "deleted file %s still has contents" +msgstr "entfernte Datei %s hat noch Inhalte" + +#: builtin/apply.c:1697 +#, c-format +msgid "** warning: file %s becomes empty but is not deleted" +msgstr "** Warnung: Datei %s wird leer, aber nicht entfernt." + +#: builtin/apply.c:1843 +#, c-format +msgid "corrupt binary patch at line %d: %.*s" +msgstr "fehlerhafter Binär-Patch bei Zeile %d: %.*s" + +#. there has to be one hunk (forward hunk) +#: builtin/apply.c:1872 +#, c-format +msgid "unrecognized binary patch at line %d" +msgstr "nicht erkannter Binär-Patch bei Zeile %d" + +#: builtin/apply.c:1958 +#, c-format +msgid "patch with only garbage at line %d" +msgstr "Patch mit nutzlosen Informationen bei Zeile %d" + +#: builtin/apply.c:2048 +#, c-format +msgid "unable to read symlink %s" +msgstr "konnte symbolische Verknüpfung %s nicht lesen" + +#: builtin/apply.c:2052 +#, c-format +msgid "unable to open or read %s" +msgstr "konnte %s nicht öffnen oder lesen" + +#: builtin/apply.c:2123 +msgid "oops" +msgstr "Ups" + +#: builtin/apply.c:2645 +#, c-format +msgid "invalid start of line: '%c'" +msgstr "Ungültiger Zeilenanfang: '%c'" + +#: builtin/apply.c:2763 +#, c-format +msgid "Hunk #%d succeeded at %d (offset %d line)." +msgid_plural "Hunk #%d succeeded at %d (offset %d lines)." +msgstr[0] "Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeile versetzt)" +msgstr[1] "" +"Patch-Bereich #%d erfolgreich angewendet bei %d (%d Zeilen versetzt)" + +#: builtin/apply.c:2775 +#, c-format +msgid "Context reduced to (%ld/%ld) to apply fragment at %d" +msgstr "Kontext reduziert zu (%ld/%ld) um Patch-Bereich bei %d anzuwenden" + +#: builtin/apply.c:2781 +#, c-format +msgid "" +"while searching for:\n" +"%.*s" +msgstr "" +"bei der Suche nach:\n" +"%.*s" + +#: builtin/apply.c:2800 +#, c-format +msgid "missing binary patch data for '%s'" +msgstr "keine Daten in Binär-Patch für '%s'" + +#: builtin/apply.c:2903 +#, c-format +msgid "binary patch does not apply to '%s'" +msgstr "Konnte Binär-Patch nicht auf '%s' anwenden" + +#: builtin/apply.c:2909 +#, c-format +msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" +msgstr "" +"Binär-Patch für '%s' erzeugt falsches Ergebnis (erwartete %s, bekam %s)" + +#: builtin/apply.c:2930 +#, c-format +msgid "patch failed: %s:%ld" +msgstr "Anwendung des Patches fehlgeschlagen: %s:%ld" + +#: builtin/apply.c:3045 +#, c-format +msgid "patch %s has been renamed/deleted" +msgstr "Patch %s wurde umbenannt/gelöscht" + +#: builtin/apply.c:3052 builtin/apply.c:3069 +#, c-format +msgid "read of %s failed" +msgstr "Konnte %s nicht lesen" + +#: builtin/apply.c:3084 +msgid "removal patch leaves file contents" +msgstr "Lösch-Patch hinterlässt Dateiinhalte" + +#: builtin/apply.c:3105 +#, c-format +msgid "%s: already exists in working directory" +msgstr "%s existiert bereits im Arbeitsverzeichnis" + +#: builtin/apply.c:3143 +#, c-format +msgid "%s: has been deleted/renamed" +msgstr "%s wurde gelöscht/umbenannt" + +#: builtin/apply.c:3148 builtin/apply.c:3179 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: builtin/apply.c:3159 +#, c-format +msgid "%s: does not exist in index" +msgstr "%s ist nicht bereitgestellt" + +#: builtin/apply.c:3173 +#, c-format +msgid "%s: does not match index" +msgstr "%s entspricht nicht der Bereitstellung" + +#: builtin/apply.c:3190 +#, c-format +msgid "%s: wrong type" +msgstr "%s: falscher Typ" + +#: builtin/apply.c:3192 +#, c-format +msgid "%s has type %o, expected %o" +msgstr "%s ist vom Typ %o, erwartete %o" + +#: builtin/apply.c:3247 +#, c-format +msgid "%s: already exists in index" +msgstr "%s ist bereits bereitgestellt" + +#: builtin/apply.c:3267 +#, c-format +msgid "new mode (%o) of %s does not match old mode (%o)" +msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o)" + +#: builtin/apply.c:3272 +#, c-format +msgid "new mode (%o) of %s does not match old mode (%o) of %s" +msgstr "neuer Modus (%o) von %s entspricht nicht dem alten Modus (%o) von %s" + +#: builtin/apply.c:3280 +#, c-format +msgid "%s: patch does not apply" +msgstr "%s: Patch konnte nicht angewendet werden" + +#: builtin/apply.c:3293 +#, c-format +msgid "Checking patch %s..." +msgstr "Prüfe Patch %s..." + +#: builtin/apply.c:3348 builtin/checkout.c:212 builtin/reset.c:158 +#, c-format +msgid "make_cache_entry failed for path '%s'" +msgstr "make_cache_entry für Pfad '%s' fehlgeschlagen" + +#: builtin/apply.c:3491 +#, c-format +msgid "unable to remove %s from index" +msgstr "konnte %s nicht aus der Bereitstellung entfernen" + +#: builtin/apply.c:3518 +#, c-format +msgid "corrupt patch for subproject %s" +msgstr "fehlerhafter Patch für Unterprojekt %s" + +#: builtin/apply.c:3522 +#, c-format +msgid "unable to stat newly created file '%s'" +msgstr "konnte neu erstellte Datei '%s' nicht lesen" + +#: builtin/apply.c:3527 +#, c-format +msgid "unable to create backing store for newly created file %s" +msgstr "kann internen Speicher für eben erstellte Datei %s nicht erzeugen" + +#: builtin/apply.c:3530 +#, c-format +msgid "unable to add cache entry for %s" +msgstr "kann für %s keinen Eintrag in den Zwischenspeicher hinzufügen" + +#: builtin/apply.c:3563 +#, c-format +msgid "closing file '%s'" +msgstr "schließe Datei '%s'" + +#: builtin/apply.c:3612 +#, c-format +msgid "unable to write file '%s' mode %o" +msgstr "konnte Datei '%s' mit Modus %o nicht schreiben" + +#: builtin/apply.c:3668 +#, c-format +msgid "Applied patch %s cleanly." +msgstr "Patch %s sauber angewendet" + +#: builtin/apply.c:3676 +msgid "internal error" +msgstr "interner Fehler" + +#. Say this even without --verbose +#: builtin/apply.c:3679 +#, c-format +msgid "Applying patch %%s with %d reject..." +msgid_plural "Applying patch %%s with %d rejects..." +msgstr[0] "Wende Patch %%s mit %d Zurückweisung an..." +msgstr[1] "Wende Patch %%s mit %d Zurückweisungen an..." + +#: builtin/apply.c:3689 +#, c-format +msgid "truncating .rej filename to %.*s.rej" +msgstr "Verkürze Name von .rej Datei zu %.*s.rej" + +#: builtin/apply.c:3710 +#, c-format +msgid "Hunk #%d applied cleanly." +msgstr "Patch-Bereich #%d sauber angewendet." + +#: builtin/apply.c:3713 +#, c-format +msgid "Rejected hunk #%d." +msgstr "Patch-Bereich #%d zurückgewiesen." + +#: builtin/apply.c:3844 +msgid "unrecognized input" +msgstr "nicht erkannte Eingabe" + +#: builtin/apply.c:3855 +msgid "unable to read index file" +msgstr "Konnte Bereitstellungsdatei nicht lesen" + +#: builtin/apply.c:3970 builtin/apply.c:3973 +msgid "path" +msgstr "Pfad" + +#: builtin/apply.c:3971 +msgid "don't apply changes matching the given path" +msgstr "wendet keine Änderungen im angegebenen Pfad an" + +#: builtin/apply.c:3974 +msgid "apply changes matching the given path" +msgstr "wendet Änderungen nur im angegebenen Pfad an" + +#: builtin/apply.c:3976 +msgid "num" +msgstr "Anzahl" + +#: builtin/apply.c:3977 +msgid "remove <num> leading slashes from traditional diff paths" +msgstr "" +"entfernt <Anzahl> vorrangestellte Schrägstriche von herkömmlichen " +"Differenzpfaden" + +#: builtin/apply.c:3980 +msgid "ignore additions made by the patch" +msgstr "ignoriert hinzugefügte Zeilen des Patches" + +#: builtin/apply.c:3982 +msgid "instead of applying the patch, output diffstat for the input" +msgstr "" +"anstatt der Anwendung des Patches, wird der \"diffstat\" für die Eingabe " +"ausgegeben" + +#: builtin/apply.c:3986 +msgid "shows number of added and deleted lines in decimal notation" +msgstr "" +"zeigt die Anzahl von hinzugefügten/entfernten Zeilen in Dezimalnotation" + +#: builtin/apply.c:3988 +msgid "instead of applying the patch, output a summary for the input" +msgstr "" +"anstatt der Anwendung des Patches, wird eine Zusammenfassung für die Eingabe " +"ausgegeben" + +#: builtin/apply.c:3990 +msgid "instead of applying the patch, see if the patch is applicable" +msgstr "" +"anstatt der Anwendung des Patches, zeige ob Patch angewendet werden kann" + +#: builtin/apply.c:3992 +msgid "make sure the patch is applicable to the current index" +msgstr "" +"stellt sicher, dass der Patch in der aktuellen Bereitstellung angewendet " +"werden kann" + +#: builtin/apply.c:3994 +msgid "apply a patch without touching the working tree" +msgstr "wendet einen Patch an, ohne Änderungen im Arbeitszweig vorzunehmen" + +#: builtin/apply.c:3996 +msgid "also apply the patch (use with --stat/--summary/--check)" +msgstr "wendet den Patch an (Benutzung mit --stat/--summary/--check)" + +#: builtin/apply.c:3998 +msgid "build a temporary index based on embedded index information" +msgstr "" +"erstellt eine temporäre Bereitstellung basierend auf den integrierten " +"Bereitstellungsinformationen" + +#: builtin/apply.c:4000 +msgid "paths are separated with NUL character" +msgstr "Pfade sind getrennt durch NUL Zeichen" + +#: builtin/apply.c:4003 +msgid "ensure at least <n> lines of context match" +msgstr "" +"stellt sicher, dass mindestens <Anzahl> Zeilen des Kontextes übereinstimmen" + +#: builtin/apply.c:4004 +msgid "action" +msgstr "Aktion" + +#: builtin/apply.c:4005 +msgid "detect new or modified lines that have whitespace errors" +msgstr "ermittelt neue oder geänderte Zeilen die Fehler in Leerzeichen haben" + +#: builtin/apply.c:4008 builtin/apply.c:4011 +msgid "ignore changes in whitespace when finding context" +msgstr "ignoriert Änderungen in Leerzeichen bei der Suche des Kontextes" + +#: builtin/apply.c:4014 +msgid "apply the patch in reverse" +msgstr "wendet den Patch in umgekehrter Reihenfolge an" + +#: builtin/apply.c:4016 +msgid "don't expect at least one line of context" +msgstr "erwartet keinen Kontext" + +#: builtin/apply.c:4018 +msgid "leave the rejected hunks in corresponding *.rej files" +msgstr "" +"hinterlässt zurückgewiesene Patch-Bereiche in den entsprechenden *.rej " +"Dateien" + +#: builtin/apply.c:4020 +msgid "allow overlapping hunks" +msgstr "erlaubt sich überlappende Patch-Bereiche" + +#: builtin/apply.c:4021 +msgid "be verbose" +msgstr "erweiterte Ausgaben" + +#: builtin/apply.c:4023 +msgid "tolerate incorrectly detected missing new-line at the end of file" +msgstr "toleriert fehlerhaft erkannten fehlenden Zeilenumbruch am Dateiende" + +#: builtin/apply.c:4026 +msgid "do not trust the line counts in the hunk headers" +msgstr "vertraut nicht den Zeilennummern im Kopf des Patch-Bereiches" + +#: builtin/apply.c:4028 +msgid "root" +msgstr "Wurzelverzeichnis" + +#: builtin/apply.c:4029 +msgid "prepend <root> to all filenames" +msgstr "stellt <Wurzelverzeichnis> vor alle Dateinamen" + +#: builtin/apply.c:4050 +msgid "--index outside a repository" +msgstr "--index außerhalb eines Projektarchivs" + +#: builtin/apply.c:4053 +msgid "--cached outside a repository" +msgstr "--cached außerhalb eines Projektarchivs" + +#: builtin/apply.c:4069 +#, c-format +msgid "can't open patch '%s'" +msgstr "kann Patch '%s' nicht öffnen" + +#: builtin/apply.c:4083 +#, c-format +msgid "squelched %d whitespace error" +msgid_plural "squelched %d whitespace errors" +msgstr[0] "unterdrückte %d Fehler in Leerzeichen" +msgstr[1] "unterdrückte %d Fehler in Leerzeichen" + +#: builtin/apply.c:4089 builtin/apply.c:4099 +#, c-format +msgid "%d line adds whitespace errors." +msgid_plural "%d lines add whitespace errors." +msgstr[0] "%d Zeile fügt Fehler in Leerzeichen hinzu." +msgstr[1] "%d Zeilen fügen Fehler in Leerzeichen hinzu." + #: builtin/archive.c:17 #, c-format msgid "could not create archive file '%s'" @@ -801,7 +1524,7 @@ msgstr "Konnte Ausgabe nicht umleiten." #: builtin/archive.c:37 msgid "git archive: Remote with no URL" -msgstr "git archive: Anderes Archiv ohne URL" +msgstr "git archive: Externes Archiv ohne URL" #: builtin/archive.c:58 msgid "git archive: expected ACK/NAK, got EOF" @@ -815,7 +1538,7 @@ msgstr "git archive: NACK %s" #: builtin/archive.c:65 #, c-format msgid "remote error: %s" -msgstr "Versandfehler: %s" +msgstr "Fehler am anderen Ende: %s" #: builtin/archive.c:66 msgid "git archive: protocol error" @@ -825,54 +1548,55 @@ msgstr "git archive: Protokollfehler" msgid "git archive: expected a flush" msgstr "git archive: erwartete eine Spülung (flush)" -#: builtin/branch.c:137 +#: builtin/branch.c:144 #, c-format msgid "" "deleting branch '%s' that has been merged to\n" " '%s', but not yet merged to HEAD." msgstr "" -"entferne Zweig '%s' der zusammengeführt wurde mit\n" +"entferne Zweig '%s', der zusammengeführt wurde mit\n" " '%s', aber noch nicht mit der Zweigspitze (HEAD) zusammengeführt " "wurde." -#: builtin/branch.c:141 +#: builtin/branch.c:148 #, c-format msgid "" "not deleting branch '%s' that is not yet merged to\n" " '%s', even though it is merged to HEAD." msgstr "" -"entferne nicht Zweig '%s' der noch nicht zusammengeführt wurde mit\n" +"entferne Zweig '%s' nicht, der noch nicht zusammengeführt wurde mit\n" " '%s', obwohl er mit der Zweigspitze (HEAD) zusammengeführt wurde." -#. TRANSLATORS: This is "remote " in "remote branch '%s' not found" -#: builtin/branch.c:164 -msgid "remote " -msgstr "entfernter " - -#: builtin/branch.c:172 +#: builtin/branch.c:180 msgid "cannot use -a with -d" msgstr "kann -a nicht mit -d benutzen" -#: builtin/branch.c:178 +#: builtin/branch.c:186 msgid "Couldn't look up commit object for HEAD" msgstr "Konnte Versionsobjekt für Zweigspitze (HEAD) nicht nachschlagen." -#: builtin/branch.c:183 +#: builtin/branch.c:191 #, c-format msgid "Cannot delete the branch '%s' which you are currently on." -msgstr "Kann Zweig '%s' nicht entfernen auf dem du dich gerade befindest." +msgstr "" +"Kann Zweig '%s' nicht entfernen, da du dich gerade auf diesem befindest." -#: builtin/branch.c:193 +#: builtin/branch.c:202 #, c-format -msgid "%sbranch '%s' not found." -msgstr "%sZweig '%s' nicht gefunden." +msgid "remote branch '%s' not found." +msgstr "externer Zweig '%s' nicht gefunden" -#: builtin/branch.c:201 +#: builtin/branch.c:203 +#, c-format +msgid "branch '%s' not found." +msgstr "Zweig '%s' nicht gefunden." + +#: builtin/branch.c:210 #, c-format msgid "Couldn't look up commit object for '%s'" msgstr "Konnte Versionsobjekt für '%s' nicht nachschlagen." -#: builtin/branch.c:207 +#: builtin/branch.c:216 #, c-format msgid "" "The branch '%s' is not fully merged.\n" @@ -881,97 +1605,126 @@ msgstr "" "Der Zweig '%s' ist nicht vollständig zusammengeführt.\n" "Wenn du sicher bist diesen Zweig zu entfernen, führe 'git branch -D %s' aus." -#: builtin/branch.c:215 +#: builtin/branch.c:225 +#, c-format +msgid "Error deleting remote branch '%s'" +msgstr "Fehler beim Entfernen des externen Zweiges '%s'" + +#: builtin/branch.c:226 #, c-format -msgid "Error deleting %sbranch '%s'" -msgstr "Fehler beim Löschen von %sZweig '%s'" +msgid "Error deleting branch '%s'" +msgstr "Fehler beim Entfernen des Zweiges '%s'" -#: builtin/branch.c:221 +#: builtin/branch.c:233 #, c-format -msgid "Deleted %sbranch %s (was %s).\n" -msgstr "Entferne %sZweig %s (war %s).\n" +msgid "Deleted remote branch %s (was %s).\n" +msgstr "Externer Zweig %s entfernt (war %s).\n" -#: builtin/branch.c:226 +#: builtin/branch.c:234 +#, c-format +msgid "Deleted branch %s (was %s).\n" +msgstr "Zweig %s entfernt (war %s).\n" + +#: builtin/branch.c:239 msgid "Update of config-file failed" msgstr "Aktualisierung der Konfigurationsdatei fehlgeschlagen." -#: builtin/branch.c:324 +#: builtin/branch.c:337 #, c-format msgid "branch '%s' does not point at a commit" msgstr "Zweig '%s' zeigt auf keine Version" -#: builtin/branch.c:396 +#: builtin/branch.c:409 +#, c-format +msgid "[%s: behind %d]" +msgstr "[%s: %d hinterher]" + +#: builtin/branch.c:411 +#, c-format +msgid "[behind %d]" +msgstr "[%d hinterher]" + +#: builtin/branch.c:415 +#, c-format +msgid "[%s: ahead %d]" +msgstr "[%s: %d voraus]" + +#: builtin/branch.c:417 #, c-format -msgid "behind %d] " -msgstr "hinter %d] " +msgid "[ahead %d]" +msgstr "[%d voraus]" -#: builtin/branch.c:398 +#: builtin/branch.c:420 #, c-format -msgid "ahead %d] " -msgstr "vor %d] " +msgid "[%s: ahead %d, behind %d]" +msgstr "[%s: %d voraus, %d hinterher]" -#: builtin/branch.c:400 +#: builtin/branch.c:423 #, c-format -msgid "ahead %d, behind %d] " -msgstr "vor %d, hinter %d] " +msgid "[ahead %d, behind %d]" +msgstr "[%d voraus, %d hinterher]" -#: builtin/branch.c:503 +#: builtin/branch.c:535 msgid "(no branch)" msgstr "(kein Zweig)" -#: builtin/branch.c:568 +#: builtin/branch.c:600 msgid "some refs could not be read" -msgstr "einige Referenzen konnten nicht gelesen werden" +msgstr "Konnte einige Referenzen nicht lesen" -#: builtin/branch.c:581 +#: builtin/branch.c:613 msgid "cannot rename the current branch while not on any." msgstr "" "Kann aktuellen Zweig nicht umbennen, solange du dich auf keinem befindest." -#: builtin/branch.c:591 +#: builtin/branch.c:623 #, c-format msgid "Invalid branch name: '%s'" msgstr "Ungültiger Zweig-Name: '%s'" -#: builtin/branch.c:606 +#: builtin/branch.c:638 msgid "Branch rename failed" msgstr "Umbenennung des Zweiges fehlgeschlagen" -#: builtin/branch.c:610 +#: builtin/branch.c:642 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "falsch benannten Zweig '%s' umbenannt" -#: builtin/branch.c:614 +#: builtin/branch.c:646 #, c-format msgid "Branch renamed to %s, but HEAD is not updated!" msgstr "Zweig umbenannt zu %s, aber Zweigspitze (HEAD) ist nicht aktualisiert!" -#: builtin/branch.c:621 +#: builtin/branch.c:653 msgid "Branch is renamed, but update of config-file failed" msgstr "" "Zweig ist umbenannt, aber die Aktualisierung der Konfigurationsdatei ist " "fehlgeschlagen." -#: builtin/branch.c:636 +#: builtin/branch.c:668 #, c-format msgid "malformed object name %s" msgstr "Missgebildeter Objektname %s" -#: builtin/branch.c:660 +#: builtin/branch.c:692 #, c-format -msgid "could not write branch description template: %s\n" -msgstr "Konnte Beschreibungsvorlage für Zweig nicht schreiben: %s\n" +msgid "could not write branch description template: %s" +msgstr "Konnte Beschreibungsvorlage für Zweig nicht schreiben: %s" -#: builtin/branch.c:750 +#: builtin/branch.c:783 msgid "Failed to resolve HEAD as a valid ref." -msgstr "Zweigspitze (HEAD) konnte nicht als gültige Referenz aufgelöst werden." +msgstr "Konnte Zweigspitze (HEAD) nicht als gültige Referenz auflösen." -#: builtin/branch.c:755 builtin/clone.c:558 +#: builtin/branch.c:788 builtin/clone.c:558 msgid "HEAD not found below refs/heads!" msgstr "Zweigspitze (HEAD) wurde nicht unter \"refs/heads\" gefunden!" -#: builtin/branch.c:813 +#: builtin/branch.c:808 +msgid "--column and --verbose are incompatible" +msgstr "--column und --verbose sind inkompatibel" + +#: builtin/branch.c:857 msgid "-a and -r options to 'git branch' do not make sense with a branch name" msgstr "" "Die Optionen -a und -r bei 'git branch' machen mit einem Zweignamen keinen " @@ -988,7 +1741,7 @@ msgstr "Um ein Paket zu erstellen wird ein Projektarchiv benötigt." #: builtin/bundle.c:60 msgid "Need a repository to unbundle." -msgstr "Zum Zerlegen wird ein Projektarchiv benötigt." +msgstr "Zum Entpacken wird ein Projektarchiv benötigt." #: builtin/checkout.c:113 builtin/checkout.c:146 #, c-format @@ -1020,11 +1773,6 @@ msgstr "Pfad '%s': kann nicht zusammenführen" msgid "Unable to add merge result for '%s'" msgstr "Konnte Ergebnis der Zusammenführung von '%s' nicht hinzufügen." -#: builtin/checkout.c:212 builtin/reset.c:158 -#, c-format -msgid "make_cache_entry failed for path '%s'" -msgstr "make_cache_entry für Pfad '%s' fehlgeschlagen" - #: builtin/checkout.c:234 builtin/checkout.c:392 msgid "corrupt index file" msgstr "beschädigte Bereitstellungsdatei" @@ -1100,12 +1848,12 @@ msgid_plural "" "\n" "%s\n" msgstr[0] "" -"Warnung: Du verlässt %d Version zurückliegend, nicht verbunden zu\n" +"Warnung: Du bist um %d Version hinterher, nicht verbunden zu\n" "einem deiner Zweige:\n" "\n" "%s\n" msgstr[1] "" -"Warnung: Du verlässt %d Versionen zurückliegend, nicht verbunden zu\n" +"Warnung: Du bist um %d Versionen hinterher, nicht verbunden zu\n" "einem deiner Zweige:\n" "\n" "%s\n" @@ -1125,104 +1873,104 @@ msgstr "" " git branch neuer_zweig_name %s\n" "\n" -#: builtin/checkout.c:693 +#: builtin/checkout.c:694 msgid "internal error in revision walk" msgstr "interner Fehler im Revisionsgang" -#: builtin/checkout.c:697 +#: builtin/checkout.c:698 msgid "Previous HEAD position was" msgstr "Vorherige Position der Zweigspitze (HEAD) war" -#: builtin/checkout.c:723 +#: builtin/checkout.c:724 msgid "You are on a branch yet to be born" -msgstr "Du bist auf einem Zweig, der noch nicht geboren wurde." +msgstr "du bist auf einem Zweig, der noch geboren wird" #. case (1) -#: builtin/checkout.c:854 +#: builtin/checkout.c:855 #, c-format msgid "invalid reference: %s" msgstr "Ungültige Referenz: %s" #. case (1): want a tree -#: builtin/checkout.c:893 +#: builtin/checkout.c:894 #, c-format msgid "reference is not a tree: %s" msgstr "Referenz ist kein Baum: %s" -#: builtin/checkout.c:973 +#: builtin/checkout.c:974 msgid "-B cannot be used with -b" msgstr "-B kann nicht mit -b benutzt werden" -#: builtin/checkout.c:982 +#: builtin/checkout.c:983 msgid "--patch is incompatible with all other options" msgstr "--patch ist inkompatibel mit allen anderen Optionen" -#: builtin/checkout.c:985 +#: builtin/checkout.c:986 msgid "--detach cannot be used with -b/-B/--orphan" msgstr "--detach kann nicht mit -b/-B/--orphan benutzt werden" -#: builtin/checkout.c:987 +#: builtin/checkout.c:988 msgid "--detach cannot be used with -t" msgstr "--detach kann nicht mit -t benutzt werden" -#: builtin/checkout.c:993 +#: builtin/checkout.c:994 msgid "--track needs a branch name" msgstr "--track benötigt einen Zweignamen" -#: builtin/checkout.c:1000 +#: builtin/checkout.c:1001 msgid "Missing branch name; try -b" msgstr "Vermisse Zweignamen; versuche -b" -#: builtin/checkout.c:1006 +#: builtin/checkout.c:1007 msgid "--orphan and -b|-B are mutually exclusive" msgstr "--orphan und -b|-B sind gegenseitig exklusiv" -#: builtin/checkout.c:1008 +#: builtin/checkout.c:1009 msgid "--orphan cannot be used with -t" msgstr "--orphan kann nicht mit -t benutzt werden" -#: builtin/checkout.c:1018 +#: builtin/checkout.c:1019 msgid "git checkout: -f and -m are incompatible" msgstr "git checkout: -f und -m sind inkompatibel" -#: builtin/checkout.c:1052 +#: builtin/checkout.c:1053 msgid "invalid path specification" msgstr "ungültige Pfadspezifikation" -#: builtin/checkout.c:1060 +#: builtin/checkout.c:1061 #, c-format msgid "" "git checkout: updating paths is incompatible with switching branches.\n" "Did you intend to checkout '%s' which can not be resolved as commit?" msgstr "" -"git checkout: Aktualisierung der Pfade ist inkompatibel mit dem Wechsel von " -"Zweigen.\n" +"git checkout: Die Aktualisierung von Pfaden ist inkompatibel mit dem Wechsel " +"von Zweigen.\n" "Hast du beabsichtigt '%s' auszuchecken, welcher nicht als Version aufgelöst " "werden kann?" -#: builtin/checkout.c:1062 +#: builtin/checkout.c:1063 msgid "git checkout: updating paths is incompatible with switching branches." msgstr "" -"git checkout: Aktualisierung von Pfaden ist inkompatibel mit dem Wechsel von " -"Zweigen." +"git checkout: Die Aktualisierung von Pfaden ist inkompatibel mit dem Wechsel " +"von Zweigen." -#: builtin/checkout.c:1067 +#: builtin/checkout.c:1068 msgid "git checkout: --detach does not take a path argument" msgstr "git checkout: --detach nimmt kein Pfad-Argument" -#: builtin/checkout.c:1070 +#: builtin/checkout.c:1071 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." msgstr "" "git checkout: --ours/--theirs, --force and --merge sind inkompatibel wenn\n" -"du außerhalb der Bereitstellung auscheckst." +"du aus der Bereitstellung auscheckst." -#: builtin/checkout.c:1089 +#: builtin/checkout.c:1090 msgid "Cannot switch branch to a non-commit." msgstr "Kann Zweig nur zu einer Version wechseln." -#: builtin/checkout.c:1092 +#: builtin/checkout.c:1093 msgid "--ours/--theirs is incompatible with switching branches." msgstr "--ours/--theirs ist inkompatibel mit den Wechseln von Zweigen." @@ -1235,7 +1983,7 @@ msgid "" "clean.requireForce set to true and neither -n nor -f given; refusing to clean" msgstr "" "clean.requireForce auf \"true\" gesetzt und weder -n noch -f gegeben; " -"Ablehnung der Reinigung" +"Säuberung verweigert" #: builtin/clean.c:85 msgid "" @@ -1243,12 +1991,12 @@ msgid "" "clean" msgstr "" "clean.requireForce standardmäßig auf \"true\" gesetzt und weder -n noch -f " -"gegeben; Ablehnung der Reinigung" +"gegeben; Säuberung verweigert" #: builtin/clean.c:155 builtin/clean.c:176 #, c-format msgid "Would remove %s\n" -msgstr "Würde entfernen %s\n" +msgstr "Würde %s entfernen\n" #: builtin/clean.c:159 builtin/clean.c:179 #, c-format @@ -1288,7 +2036,7 @@ msgstr "Fehler beim Erstellen von Verzeichnis '%s'" #: builtin/clone.c:308 builtin/diff.c:75 #, c-format msgid "failed to stat '%s'" -msgstr "'%s' konnte nicht gelesen werden" +msgstr "Konnte '%s' nicht lesen" #: builtin/clone.c:310 #, c-format @@ -1298,22 +2046,22 @@ msgstr "%s existiert und ist kein Verzeichnis" #: builtin/clone.c:324 #, c-format msgid "failed to stat %s\n" -msgstr "%s konnte nicht gelesen werden\n" +msgstr "Konnte %s nicht lesen\n" #: builtin/clone.c:341 #, c-format msgid "failed to unlink '%s'" -msgstr "Verknüpfung von '%s' konnte nicht aufgehoben werden." +msgstr "Konnte '%s' nicht entfernen" #: builtin/clone.c:346 #, c-format msgid "failed to create link '%s'" -msgstr "Verknüpfung '%s' konnte nicht erstellt werden." +msgstr "Konnte Verknüpfung '%s' nicht erstellen" #: builtin/clone.c:350 #, c-format msgid "failed to copy file to '%s'" -msgstr "Datei konnte nicht nach '%s' kopiert werden." +msgstr "Konnte Datei nicht nach '%s' kopieren" #: builtin/clone.c:373 #, c-format @@ -1323,13 +2071,13 @@ msgstr "Fertig.\n" #: builtin/clone.c:440 #, c-format msgid "Could not find remote branch %s to clone." -msgstr "Entfernter Zweig %s konnte nicht zum Klonen gefunden werden." +msgstr "Konnte zu klonenden externer Zweig %s nicht finden." #: builtin/clone.c:549 msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" msgstr "" -"Entfernte Zweigspitze (HEAD) bezieht sich auf eine nicht existierende " -"Referenz und kann nicht ausgecheckt werden.\n" +"Externe Zweigspitze (HEAD) bezieht sich auf eine nicht existierende Referenz " +"und kann nicht ausgecheckt werden.\n" #: builtin/clone.c:639 msgid "Too many arguments." @@ -1337,7 +2085,7 @@ msgstr "Zu viele Argumente." #: builtin/clone.c:643 msgid "You must specify a repository to clone." -msgstr "Du musst ein Projektarchiv zum Klonen spezifizieren." +msgstr "Du musst ein Projektarchiv zum Klonen angeben." #: builtin/clone.c:654 #, c-format @@ -1376,7 +2124,7 @@ msgstr "Konnte Arbeitsverzeichnis '%s' nicht erstellen." #: builtin/clone.c:728 #, c-format msgid "Cloning into bare repository '%s'...\n" -msgstr "Klone in leeres Projektarchiv '%s'...\n" +msgstr "Klone in bloßes Projektarchiv '%s'...\n" #: builtin/clone.c:730 #, c-format @@ -1391,13 +2139,17 @@ msgstr "Weiß nicht wie %s zu klonen ist." #: builtin/clone.c:835 #, c-format msgid "Remote branch %s not found in upstream %s" -msgstr "entfernter Zweig %s nicht im anderen Projektarchiv gefunden %s" +msgstr "externer Zweig %s nicht im anderen Projektarchiv %s gefunden" #: builtin/clone.c:842 msgid "You appear to have cloned an empty repository." msgstr "Du scheinst ein leeres Projektarchiv geklont zu haben." -#: builtin/commit.c:42 +#: builtin/column.c:51 +msgid "--command must be the first argument" +msgstr "Option --command muss zuerst angegeben werden" + +#: builtin/commit.c:43 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -1423,7 +2175,7 @@ msgstr "" "\n" " git commit --amend --reset-author\n" -#: builtin/commit.c:54 +#: builtin/commit.c:55 msgid "" "You asked to amend the most recent commit, but doing so would make\n" "it empty. You can repeat your command with --allow-empty, or you can\n" @@ -1433,7 +2185,7 @@ msgstr "" "machen. Du kannst Dein Kommando mit --allow-empty wiederholen, oder die\n" "Version mit \"git reset HEAD^\" vollständig entfernen.\n" -#: builtin/commit.c:59 +#: builtin/commit.c:60 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -1450,295 +2202,304 @@ msgstr "" "\n" "Andernfalls benutze bitte 'git reset'\n" -#: builtin/commit.c:205 builtin/reset.c:33 -msgid "merge" -msgstr "zusammenführen" - -#: builtin/commit.c:208 -msgid "cherry-pick" -msgstr "cherry-pick" - -#: builtin/commit.c:325 +#: builtin/commit.c:253 msgid "failed to unpack HEAD tree object" msgstr "Fehler beim Entpacken des Baum-Objektes der Zweigspitze (HEAD)." -#: builtin/commit.c:367 +#: builtin/commit.c:295 msgid "unable to create temporary index" msgstr "Konnte temporäre Bereitstellung nicht erstellen." -#: builtin/commit.c:373 +#: builtin/commit.c:301 msgid "interactive add failed" msgstr "interaktives Hinzufügen fehlgeschlagen" -#: builtin/commit.c:406 builtin/commit.c:427 builtin/commit.c:473 +#: builtin/commit.c:334 builtin/commit.c:355 builtin/commit.c:405 msgid "unable to write new_index file" msgstr "Konnte new_index Datei nicht schreiben" -#: builtin/commit.c:457 -#, c-format -msgid "cannot do a partial commit during a %s." -msgstr "Kann keine partielle Eintragung während eines %s durchführen." +#: builtin/commit.c:386 +msgid "cannot do a partial commit during a merge." +msgstr "" +"Kann keine partielle Eintragung durchführen, während eine Zusammenführung im " +"Gange ist." -#: builtin/commit.c:466 +#: builtin/commit.c:388 +msgid "cannot do a partial commit during a cherry-pick." +msgstr "" +"Kann keine partielle Eintragung durchführen, während \"cherry-pick\" im " +"Gange ist." + +#: builtin/commit.c:398 msgid "cannot read the index" msgstr "Kann Bereitstellung nicht lesen" -#: builtin/commit.c:486 +#: builtin/commit.c:418 msgid "unable to write temporary index file" msgstr "Konnte temporäre Bereitstellungsdatei nicht schreiben." -#: builtin/commit.c:561 builtin/commit.c:567 +#: builtin/commit.c:493 builtin/commit.c:499 #, c-format msgid "invalid commit: %s" msgstr "Ungültige Version: %s" -#: builtin/commit.c:590 +#: builtin/commit.c:522 msgid "malformed --author parameter" msgstr "Fehlerhafter --author Parameter" -#: builtin/commit.c:651 +#: builtin/commit.c:582 #, c-format msgid "Malformed ident string: '%s'" msgstr "Fehlerhafte Identifikations-String: '%s'" -#: builtin/commit.c:689 builtin/commit.c:722 builtin/commit.c:1033 +#: builtin/commit.c:620 builtin/commit.c:653 builtin/commit.c:967 #, c-format msgid "could not lookup commit %s" msgstr "Konnte Version %s nicht nachschlagen" -#: builtin/commit.c:701 builtin/shortlog.c:296 +#: builtin/commit.c:632 builtin/shortlog.c:296 #, c-format msgid "(reading log message from standard input)\n" msgstr "(lese Log-Nachricht von Standard-Eingabe)\n" -#: builtin/commit.c:703 +#: builtin/commit.c:634 msgid "could not read log from standard input" msgstr "Konnte Log nicht von Standard-Eingabe lesen." -#: builtin/commit.c:707 +#: builtin/commit.c:638 #, c-format msgid "could not read log file '%s'" msgstr "Konnte Log-Datei '%s' nicht lesen" -#: builtin/commit.c:713 +#: builtin/commit.c:644 msgid "commit has empty message" msgstr "Version hat eine leere Beschreibung" -#: builtin/commit.c:729 +#: builtin/commit.c:660 msgid "could not read MERGE_MSG" msgstr "Konnte MERGE_MSG nicht lesen" -#: builtin/commit.c:733 +#: builtin/commit.c:664 msgid "could not read SQUASH_MSG" msgstr "Konnte SQUASH_MSG nicht lesen" -#: builtin/commit.c:737 +#: builtin/commit.c:668 #, c-format msgid "could not read '%s'" msgstr "Konnte '%s' nicht lesen" -#: builtin/commit.c:765 -#, c-format -msgid "could not open '%s'" -msgstr "Konnte '%s' nicht öffnen" - -#: builtin/commit.c:789 +#: builtin/commit.c:720 msgid "could not write commit template" msgstr "Konnte Versionsvorlage nicht schreiben" -#: builtin/commit.c:799 +#: builtin/commit.c:731 #, c-format msgid "" "\n" -"It looks like you may be committing a %s.\n" +"It looks like you may be committing a merge.\n" "If this is not correct, please remove the file\n" "\t%s\n" "and try again.\n" msgstr "" "\n" -"Es sieht so aus, als trägst du ein '%s' ein.\n" +"Es sieht so aus, als trägst du eine Zusammenführung ein.\n" "Falls das nicht korrekt ist, entferne bitte die Datei\n" "\t%s\n" "und versuche es erneut.\n" -#: builtin/commit.c:812 -msgid "Please enter the commit message for your changes." -msgstr "Bitte gebe die Versionsbeschreibung für deine Änderungen ein." +#: builtin/commit.c:736 +#, c-format +msgid "" +"\n" +"It looks like you may be committing a cherry-pick.\n" +"If this is not correct, please remove the file\n" +"\t%s\n" +"and try again.\n" +msgstr "" +"\n" +"Es sieht so aus, als trägst du ein \"cherry-pick\" ein.\n" +"Falls das nicht korrekt ist, entferne bitte die Datei\n" +"\t%s\n" +"und versuche es erneut.\n" -#: builtin/commit.c:815 +#: builtin/commit.c:748 msgid "" -" Lines starting\n" +"Please enter the commit message for your changes. Lines starting\n" "with '#' will be ignored, and an empty message aborts the commit.\n" msgstr "" -" Zeilen beginnend\n" -"mit '#' werden ignoriert, und eine leere Versionsbeschreibung bricht die " -"Eintragung ab.\n" +"Bitte gebe eine Versionsbeschreibung für deine Änderungen ein. Zeilen,\n" +"die mit '#' beginnen, werden ignoriert, und eine leere Versionsbeschreibung\n" +"bricht die Eintragung ab.\n" -#: builtin/commit.c:820 +#: builtin/commit.c:753 msgid "" -" Lines starting\n" +"Please enter the commit message for your changes. Lines starting\n" "with '#' will be kept; you may remove them yourself if you want to.\n" "An empty message aborts the commit.\n" msgstr "" -" Zeilen beginnend\n" -"mit '#' werden beibehalten; wenn du möchtest, kannst du diese entfernen.\n" +"Bitte gebe eine Versionsbeschreibung für deine Änderungen ein. Zeilen, die\n" +"mit '#' beginnen, werden beibehalten; wenn du möchtest, kannst du diese " +"entfernen.\n" "Eine leere Versionsbeschreibung bricht die Eintragung ab.\n" -#: builtin/commit.c:832 +#: builtin/commit.c:766 #, c-format msgid "%sAuthor: %s" msgstr "%sAutor: %s" -#: builtin/commit.c:839 +#: builtin/commit.c:773 #, c-format msgid "%sCommitter: %s" msgstr "%sEintragender: %s" -#: builtin/commit.c:859 +#: builtin/commit.c:793 msgid "Cannot read index" msgstr "Kann Bereitstellung nicht lesen" -#: builtin/commit.c:896 +#: builtin/commit.c:830 msgid "Error building trees" -msgstr "Fehler beim Erzeugen der Bäume" +msgstr "Fehler beim Erzeugen der Zweige" -#: builtin/commit.c:911 builtin/tag.c:357 +#: builtin/commit.c:845 builtin/tag.c:361 #, c-format msgid "Please supply the message using either -m or -F option.\n" -msgstr "Bitte liefere die Beschreibung entweder mit der Option -m oder -F.\n" +msgstr "Bitte liefere eine Beschreibung entweder mit der Option -m oder -F.\n" -#: builtin/commit.c:1008 +#: builtin/commit.c:942 #, c-format msgid "No existing author found with '%s'" msgstr "Kein existierender Autor mit '%s' gefunden." -#: builtin/commit.c:1023 builtin/commit.c:1217 +#: builtin/commit.c:957 builtin/commit.c:1157 #, c-format msgid "Invalid untracked files mode '%s'" -msgstr "Ungültiger Modus '%s' für unverfolgte Dateien" +msgstr "Ungültiger Modus '%s' für unbeobachtete Dateien" -#: builtin/commit.c:1063 +#: builtin/commit.c:997 msgid "Using both --reset-author and --author does not make sense" msgstr "Verwendung von --reset-author und --author macht keinen Sinn." -#: builtin/commit.c:1074 +#: builtin/commit.c:1008 msgid "You have nothing to amend." msgstr "Du hast nichts zum nachbessern." -#: builtin/commit.c:1076 -#, c-format -msgid "You are in the middle of a %s -- cannot amend." -msgstr "Du bist in der Mitte eines %s -- kann nicht nachbessern." +#: builtin/commit.c:1011 +msgid "You are in the middle of a merge -- cannot amend." +msgstr "Eine Zusammenführung ist im Gange -- kann nicht nachbessern." + +#: builtin/commit.c:1013 +msgid "You are in the middle of a cherry-pick -- cannot amend." +msgstr "\"cherry-pick\" ist im Gange -- kann nicht nachbessern." -#: builtin/commit.c:1078 +#: builtin/commit.c:1016 msgid "Options --squash and --fixup cannot be used together" msgstr "" "Die Optionen --squash und --fixup können nicht gemeinsam benutzt werden." -#: builtin/commit.c:1088 +#: builtin/commit.c:1026 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "Nur eines von -c/-C/-F/--fixup kann benutzt werden." -#: builtin/commit.c:1090 +#: builtin/commit.c:1028 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "Option -m kann nicht mit -c/-C/-F/--fixup kombiniert werden" -#: builtin/commit.c:1098 +#: builtin/commit.c:1036 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "--reset--author kann nur mit -C, -c oder --amend benutzt werden" -#: builtin/commit.c:1115 +#: builtin/commit.c:1053 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "" "Nur eines von --include/--only/--all/--interactive/--patch kann benutzt " "werden." -#: builtin/commit.c:1117 +#: builtin/commit.c:1055 msgid "No paths with --include/--only does not make sense." msgstr "--include/--only machen ohne Pfade keinen Sinn." -#: builtin/commit.c:1119 +#: builtin/commit.c:1057 msgid "Clever... amending the last one with dirty index." msgstr "" -"Klug... nachbessern der letzten Version mit einem unsauberen Bereitstellung." +"Klug... die letzte Version mit einer unsauberen Bereitstellung nachbessern." -#: builtin/commit.c:1121 +#: builtin/commit.c:1059 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "" -"Explizite Pfade ohne -i oder -o spezifiziert; unter der Annahme von --only " +"Explizite Pfade ohne -i oder -o angegeben; unter der Annahme von --only " "Pfaden..." -#: builtin/commit.c:1131 builtin/tag.c:556 +#: builtin/commit.c:1069 builtin/tag.c:577 #, c-format msgid "Invalid cleanup mode %s" msgstr "Ungültiger \"cleanup\" Modus %s" -#: builtin/commit.c:1136 +#: builtin/commit.c:1074 msgid "Paths with -a does not make sense." msgstr "Pfade mit -a machen keinen Sinn." -#: builtin/commit.c:1315 +#: builtin/commit.c:1257 msgid "couldn't look up newly created commit" msgstr "Konnte neu erstellte Version nicht nachschlagen." -#: builtin/commit.c:1317 +#: builtin/commit.c:1259 msgid "could not parse newly created commit" msgstr "Konnte neulich erstellte Version nicht analysieren." -#: builtin/commit.c:1358 +#: builtin/commit.c:1300 msgid "detached HEAD" msgstr "losgelöste Zweigspitze (HEAD)" -#: builtin/commit.c:1360 +#: builtin/commit.c:1302 msgid " (root-commit)" msgstr " (Basis-Version)" -#: builtin/commit.c:1450 +#: builtin/commit.c:1446 msgid "could not parse HEAD commit" msgstr "Konnte Version der Zweigspitze (HEAD) nicht analysieren." -#: builtin/commit.c:1487 builtin/merge.c:509 +#: builtin/commit.c:1484 builtin/merge.c:509 #, c-format msgid "could not open '%s' for reading" msgstr "Konnte '%s' nicht zum Lesen öffnen." -#: builtin/commit.c:1494 +#: builtin/commit.c:1491 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "Beschädigte MERGE_HEAD-Datei (%s)" -#: builtin/commit.c:1501 +#: builtin/commit.c:1498 msgid "could not read MERGE_MODE" msgstr "Konnte MERGE_MODE nicht lesen" -#: builtin/commit.c:1520 +#: builtin/commit.c:1517 #, c-format msgid "could not read commit message: %s" msgstr "Konnte Versionsbeschreibung nicht lesen: %s" -#: builtin/commit.c:1534 +#: builtin/commit.c:1531 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "Eintragung abgebrochen; du hast die Beschreibung nicht editiert.\n" -#: builtin/commit.c:1539 +#: builtin/commit.c:1536 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "Eintragung aufgrund leerer Versionsbeschreibung abgebrochen.\n" -#: builtin/commit.c:1554 builtin/merge.c:936 builtin/merge.c:961 +#: builtin/commit.c:1551 builtin/merge.c:936 builtin/merge.c:961 msgid "failed to write commit object" msgstr "Fehler beim Schreiben des Versionsobjektes." -#: builtin/commit.c:1575 +#: builtin/commit.c:1572 msgid "cannot lock HEAD ref" msgstr "Kann Referenz der Zweigspitze (HEAD) nicht sperren." -#: builtin/commit.c:1579 +#: builtin/commit.c:1576 msgid "cannot update HEAD ref" msgstr "Kann Referenz der Zweigspitze (HEAD) nicht aktualisieren." -#: builtin/commit.c:1590 +#: builtin/commit.c:1587 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -1762,12 +2523,12 @@ msgstr "annotierte Markierung %s hat keinen eingebetteten Namen" #: builtin/describe.c:240 #, c-format msgid "tag '%s' is really '%s' here" -msgstr "Markierung '%s' ist wirklich '%s' hier" +msgstr "Markierung '%s' ist eigentlich '%s' hier" #: builtin/describe.c:267 #, c-format msgid "Not a valid object name %s" -msgstr "kein gültiger Objekt-Name %s" +msgstr "%s ist kein gültiger Objekt-Name" #: builtin/describe.c:270 #, c-format @@ -1782,7 +2543,7 @@ msgstr "kein Markierung entspricht exakt '%s'" #: builtin/describe.c:289 #, c-format msgid "searching to describe %s\n" -msgstr "suche um zu beschreiben %s\n" +msgstr "suche zur Beschreibung von %s\n" #: builtin/describe.c:329 #, c-format @@ -1810,7 +2571,7 @@ msgstr "" #: builtin/describe.c:378 #, c-format msgid "traversed %lu commits\n" -msgstr "verarbeitete %lu Versionen\n" +msgstr "%lu Versionen durchlaufen\n" #: builtin/describe.c:381 #, c-format @@ -1818,7 +2579,7 @@ msgid "" "more than %i tags found; listed %i most recent\n" "gave up search at %s\n" msgstr "" -"mehr als %i Markierungen gefunden; Führe die %i jüngsten auf\n" +"mehr als %i Markierungen gefunden; Führe die ersten %i auf\n" "Suche bei %s aufgegeben\n" #: builtin/describe.c:436 @@ -1831,7 +2592,7 @@ msgstr "Keine Namen gefunden, kann nichts beschreiben." #: builtin/describe.c:482 msgid "--dirty is incompatible with committishes" -msgstr "--dirty ist inkompatibel mit \"committish\"-Werten" +msgstr "--dirty ist inkompatibel mit Versionen" #: builtin/diff.c:77 #, c-format @@ -1850,26 +2611,26 @@ msgstr "Kein Git-Projektarchiv" #: builtin/diff.c:347 #, c-format msgid "invalid object '%s' given." -msgstr "Ungültiges Objekt '%s' gegeben." +msgstr "Objekt '%s' ist ungültig." #: builtin/diff.c:352 #, c-format msgid "more than %d trees given: '%s'" -msgstr "Mehr als %d Bäume gegeben: '%s'" +msgstr "Mehr als %d Zweige angegeben: '%s'" #: builtin/diff.c:362 #, c-format msgid "more than two blobs given: '%s'" -msgstr "Mehr als zwei Blobs gegeben: '%s'" +msgstr "Mehr als zwei Blobs angegeben: '%s'" #: builtin/diff.c:370 #, c-format msgid "unhandled object '%s' given." -msgstr "unbehandeltes Objekt '%s' gegeben" +msgstr "unbehandeltes Objekt '%s' angegeben" #: builtin/fetch.c:200 msgid "Couldn't find remote ref HEAD" -msgstr "Konnte entfernte Referenz der Zweigspitze (HEAD) nicht finden." +msgstr "Konnte externe Referenz der Zweigspitze (HEAD) nicht finden." #: builtin/fetch.c:253 #, c-format @@ -1947,28 +2708,28 @@ msgstr "" #: builtin/fetch.c:549 #, c-format -msgid " (%s will become dangling)\n" -msgstr " (%s wird unreferenziert werden)\n" +msgid " (%s will become dangling)" +msgstr " (%s wird unreferenziert)" #: builtin/fetch.c:550 #, c-format -msgid " (%s has become dangling)\n" -msgstr " (%s wurde unreferenziert)\n" +msgid " (%s has become dangling)" +msgstr " (%s wurde unreferenziert)" #: builtin/fetch.c:557 msgid "[deleted]" msgstr "[gelöscht]" -#: builtin/fetch.c:558 +#: builtin/fetch.c:558 builtin/remote.c:1055 msgid "(none)" -msgstr "(keine)" +msgstr "(nichts)" #: builtin/fetch.c:675 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" msgstr "" -"Ablehnung des Anforderns in aktuellen Zweig %s von einem nicht-leeren " -"Projektarchiv" +"Das Anfordern in den aktuellen Zweig %s von einem nicht-bloßen Projektarchiv " +"wurde verweigert." #: builtin/fetch.c:709 #, c-format @@ -1988,29 +2749,29 @@ msgstr "Option \"%s\" wird ignoriert für %s\n" #: builtin/fetch.c:888 #, c-format msgid "Fetching %s\n" -msgstr "Hole %s ab\n" +msgstr "Fordere an von %s\n" -#: builtin/fetch.c:890 +#: builtin/fetch.c:890 builtin/remote.c:100 #, c-format msgid "Could not fetch %s" -msgstr "Konnte %s nicht anfordern" +msgstr "Konnte nicht von %s anfordern" #: builtin/fetch.c:907 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." msgstr "" -"Kein entferntes Projektarchiv spezifiziert. Bitte spezifiziere entweder\n" -"eine URL oder einen Entfernungsname, von welchem neue Revisionen angefordert " -"werden sollen." +"Kein externes Projektarchiv angegeben. Bitte gebe entweder eine URL\n" +"oder den Namen des externen Archivs an, von welchem neue\n" +"Versionen angefordert werden sollen." #: builtin/fetch.c:927 msgid "You need to specify a tag name." -msgstr "Du musst den Namen der Markierung spezifizieren." +msgstr "Du musst den Namen der Markierung angeben." #: builtin/fetch.c:979 msgid "fetch --all does not take a repository argument" -msgstr "fetch -all nimmt kein Projektarchiv als Argument" +msgstr "fetch --all akzeptiert kein Projektarchiv als Argument" #: builtin/fetch.c:981 msgid "fetch --all does not make sense with refspecs" @@ -2019,50 +2780,47 @@ msgstr "fetch --all macht keinen Sinn mit Referenzspezifikationen" #: builtin/fetch.c:992 #, c-format msgid "No such remote or remote group: %s" -msgstr "Keine solche Entfernung oder Entfernungsgruppe: %s" +msgstr "Kein externes Archiv (einzeln oder Gruppe): %s" #: builtin/fetch.c:1000 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "" -"Abholen einer Gruppe und Spezifizieren von Referenzspezifikationen macht " -"keinen Sinn." +"Abholen einer Gruppe mit Angabe von Referenzspezifikationen macht keinen " +"Sinn." #: builtin/gc.c:63 #, c-format msgid "Invalid %s: '%s'" msgstr "Ungültiger %s: '%s'" -#: builtin/gc.c:78 -msgid "Too many options specified" -msgstr "Zu viele Optionen spezifiziert" - -#: builtin/gc.c:103 +#: builtin/gc.c:90 #, c-format msgid "insanely long object directory %.*s" -msgstr "wahnsinnig langes Objekt-Verzeichnis %.*s" +msgstr "zu langes Objekt-Verzeichnis %.*s" -#: builtin/gc.c:223 +#: builtin/gc.c:221 #, c-format msgid "Auto packing the repository for optimum performance.\n" -msgstr "Automatische Paketierung des Repositories für optimale Leitung.\n" +msgstr "" +"Die Datenbank des Projektarchivs wird für eine optimale Performance " +"komprimiert.\n" -#: builtin/gc.c:226 +#: builtin/gc.c:224 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" "run \"git gc\" manually. See \"git help gc\" for more information.\n" msgstr "" -"Automatische Paketierung des Repositories für optimale Leitung. Du darfst " -"auch\n" -"\"git gc\" manuell ausführen. Siehe \"git help gc\" für weitere " -"Informationen.\n" +"Die Datenbank des Projektarchivs wird für eine optimale Performance\n" +"komprimiert. Du kannst auch \"git gc\" manuell ausführen.\n" +"Siehe \"git help gc\" für weitere Informationen.\n" -#: builtin/gc.c:256 +#: builtin/gc.c:251 msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "" -"Es gibt zu viele unerreichbare, verlorene Objekte; führe 'git prune' aus um " -"diese zu entfernen." +"Es gibt zu viele unerreichbare lose Objekte; führe 'git prune' aus, um diese " +"zu entfernen." #: builtin/grep.c:216 #, c-format @@ -2077,12 +2835,12 @@ msgstr "Fehler beim Verzeichniswechsel: %s" #: builtin/grep.c:478 builtin/grep.c:512 #, c-format msgid "unable to read tree (%s)" -msgstr "konnte Baum (%s) nicht lesen" +msgstr "konnte Zweig (%s) nicht lesen" #: builtin/grep.c:526 #, c-format msgid "unable to grep from object of type %s" -msgstr "kann \"grep\" nicht mit Objekt des Typs \"%s\" durchführen" +msgstr "kann \"grep\" nicht mit Objekten des Typs %s durchführen" #: builtin/grep.c:584 #, c-format @@ -2094,50 +2852,355 @@ msgstr "Schalter '%c' erwartet einen numerischen Wert" msgid "cannot open '%s'" msgstr "kann '%s' nicht öffnen" -#: builtin/grep.c:888 +#: builtin/grep.c:885 msgid "no pattern given." -msgstr "keine Muster gegeben" +msgstr "keine Muster angegeben" -#: builtin/grep.c:902 +#: builtin/grep.c:899 #, c-format msgid "bad object %s" -msgstr "schlechtes Objekt %s" +msgstr "ungültiges Objekt %s" -#: builtin/grep.c:943 +#: builtin/grep.c:940 msgid "--open-files-in-pager only works on the worktree" -msgstr "--open-files-in-pager arbeitet nur auf dem Arbeitsbaum" +msgstr "--open-files-in-pager arbeitet nur innerhalb des Arbeitsbaums" -#: builtin/grep.c:966 +#: builtin/grep.c:963 msgid "--cached or --untracked cannot be used with --no-index." msgstr "--cached oder --untracked kann nicht mit --no-index benutzt werden" -#: builtin/grep.c:971 +#: builtin/grep.c:968 msgid "--no-index or --untracked cannot be used with revs." -msgstr "--no-index oder --untracked kann nicht mit Revisionen benutzt werden" +msgstr "--no-index oder --untracked kann nicht mit Versionen benutzt werden" -#: builtin/grep.c:974 +#: builtin/grep.c:971 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "" -"--[no-]exlude-standard kann nicht mit verfolgten Inhalten benutzt werden" +"--[no-]exlude-standard kann nicht mit beobachteten Inhalten benutzt werden" -#: builtin/grep.c:982 +#: builtin/grep.c:979 msgid "both --cached and trees are given." -msgstr "sowohl --cached als auch Bäume gegeben" +msgstr "sowohl --cached als auch Zweige gegeben" + +#: builtin/help.c:59 +#, c-format +msgid "unrecognized help format '%s'" +msgstr "nicht erkanntes Hilfeformat: %s" + +#: builtin/help.c:87 +msgid "Failed to start emacsclient." +msgstr "Konnte emacsclient nicht starten." + +#: builtin/help.c:100 +msgid "Failed to parse emacsclient version." +msgstr "Konnte Version des emacsclient nicht parsen." + +#: builtin/help.c:108 +#, c-format +msgid "emacsclient version '%d' too old (< 22)." +msgstr "Version des emacsclient '%d' ist zu alt (< 22)." + +#: builtin/help.c:126 builtin/help.c:154 builtin/help.c:163 builtin/help.c:171 +#, c-format +msgid "failed to exec '%s': %s" +msgstr "Fehler beim Ausführen von '%s': %s" + +#: builtin/help.c:211 +#, c-format +msgid "" +"'%s': path for unsupported man viewer.\n" +"Please consider using 'man.<tool>.cmd' instead." +msgstr "" +"'%s': Pfad für nicht unterstützten Handbuchbetrachter.\n" +"Du könntest stattdessen 'man.<Werkzeug>.cmd' benutzen." + +#: builtin/help.c:223 +#, c-format +msgid "" +"'%s': cmd for supported man viewer.\n" +"Please consider using 'man.<tool>.path' instead." +msgstr "" +"'%s': Kommando für unterstützten Handbuchbetrachter.\n" +"Du könntest stattdessen 'man.<Werkzeug>.path' benutzen." + +#: builtin/help.c:287 +msgid "The most commonly used git commands are:" +msgstr "Die allgemein verwendeten Git-Kommandos sind:" + +#: builtin/help.c:355 +#, c-format +msgid "'%s': unknown man viewer." +msgstr "'%s': unbekannter Handbuch-Betrachter." + +#: builtin/help.c:372 +msgid "no man viewer handled the request" +msgstr "kein Handbuch-Betrachter konnte mit dieser Anfrage umgehen" + +#: builtin/help.c:380 +msgid "no info viewer handled the request" +msgstr "kein Informations-Betrachter konnte mit dieser Anfrage umgehen" + +#: builtin/help.c:391 +#, c-format +msgid "'%s': not a documentation directory." +msgstr "'%s' ist kein Dokumentationsverzeichnis" + +#: builtin/help.c:432 builtin/help.c:439 +#, c-format +msgid "usage: %s%s" +msgstr "Verwendung: %s%s" + +#: builtin/help.c:453 +#, c-format +msgid "`git %s' is aliased to `%s'" +msgstr "für `git %s' wurde der Alias `%s' angelegt" + +#: builtin/index-pack.c:169 +#, c-format +msgid "object type mismatch at %s" +msgstr "Objekt-Typen passen bei %s nicht zusammen" + +#: builtin/index-pack.c:189 +msgid "object of unexpected type" +msgstr "Objekt hat unerwarteten Typ" + +#: builtin/index-pack.c:226 +#, c-format +msgid "cannot fill %d byte" +msgid_plural "cannot fill %d bytes" +msgstr[0] "kann %d Byte nicht lesen" +msgstr[1] "kann %d Bytes nicht lesen" + +#: builtin/index-pack.c:236 +msgid "early EOF" +msgstr "zu frühes Dateiende" + +#: builtin/index-pack.c:237 +msgid "read error on input" +msgstr "Fehler beim Lesen der Eingabe" + +#: builtin/index-pack.c:249 +msgid "used more bytes than were available" +msgstr "verwendete mehr Bytes als verfügbar waren" + +#: builtin/index-pack.c:256 +msgid "pack too large for current definition of off_t" +msgstr "Paket ist zu groß für die aktuelle Definition von off_t" + +#: builtin/index-pack.c:272 +#, c-format +msgid "unable to create '%s'" +msgstr "konnte '%s' nicht erstellen" + +#: builtin/index-pack.c:277 +#, c-format +msgid "cannot open packfile '%s'" +msgstr "Kann Paketdatei '%s' nicht öffnen" + +#: builtin/index-pack.c:291 +msgid "pack signature mismatch" +msgstr "Paketsignatur stimmt nicht überein" + +#: builtin/index-pack.c:311 +#, c-format +msgid "pack has bad object at offset %lu: %s" +msgstr "Paket hat ein ungültiges Objekt bei Versatz %lu: %s" + +#: builtin/index-pack.c:405 +#, c-format +msgid "inflate returned %d" +msgstr "Dekomprimierung gab %d zurück" + +#: builtin/index-pack.c:450 +msgid "offset value overflow for delta base object" +msgstr "Wert für Versatz bei Differenzobjekt übergelaufen" + +#: builtin/index-pack.c:458 +msgid "delta base offset is out of bound" +msgstr "" +"Wert für Versatz bei Differenzobjekt liegt außerhalb des gültigen Bereichs" + +#: builtin/index-pack.c:466 +#, c-format +msgid "unknown object type %d" +msgstr "Unbekannter Objekt-Typ %d" + +#: builtin/index-pack.c:495 +msgid "cannot pread pack file" +msgstr "Kann Paketdatei %s nicht lesen" + +#: builtin/index-pack.c:497 +#, c-format +msgid "premature end of pack file, %lu byte missing" +msgid_plural "premature end of pack file, %lu bytes missing" +msgstr[0] "frühzeitiges Ende der Paketdatei, vermisse %lu Byte" +msgstr[1] "frühzeitiges Ende der Paketdatei, vermisse %lu Bytes" + +#: builtin/index-pack.c:510 +msgid "serious inflate inconsistency" +msgstr "ernsthafte Inkonsistenz nach Dekomprimierung" + +#: builtin/index-pack.c:583 +#, c-format +msgid "cannot read existing object %s" +msgstr "Kann existierendes Objekt %s nicht lesen." + +#: builtin/index-pack.c:586 +#, c-format +msgid "SHA1 COLLISION FOUND WITH %s !" +msgstr "SHA1 KOLLISION MIT %s GEFUNDEN !" + +#: builtin/index-pack.c:598 +#, c-format +msgid "invalid blob object %s" +msgstr "ungültiges Blob-Objekt %s" + +#: builtin/index-pack.c:610 +#, c-format +msgid "invalid %s" +msgstr "Ungültiger Objekt-Typ %s" + +#: builtin/index-pack.c:612 +msgid "Error in object" +msgstr "Fehler in Objekt" + +#: builtin/index-pack.c:614 +#, c-format +msgid "Not all child objects of %s are reachable" +msgstr "Nicht alle Kind-Objekte von %s sind erreichbar" + +#: builtin/index-pack.c:687 builtin/index-pack.c:713 +msgid "failed to apply delta" +msgstr "Konnte Dateiunterschied nicht anwenden" + +#: builtin/index-pack.c:850 +msgid "Receiving objects" +msgstr "Empfange Objekte" + +#: builtin/index-pack.c:850 +msgid "Indexing objects" +msgstr "Indiziere Objekte" + +#: builtin/index-pack.c:872 +msgid "pack is corrupted (SHA1 mismatch)" +msgstr "Paket ist beschädigt (SHA1 unterschiedlich)" + +#: builtin/index-pack.c:877 +msgid "cannot fstat packfile" +msgstr "kann Paketdatei nicht lesen" + +#: builtin/index-pack.c:880 +msgid "pack has junk at the end" +msgstr "Paketende enthält nicht verwendbaren Inhalt" + +#: builtin/index-pack.c:903 +msgid "Resolving deltas" +msgstr "Löse Unterschiede auf" + +#: builtin/index-pack.c:954 +msgid "confusion beyond insanity" +msgstr "Fehler beim Auflösen der Unterschiede" + +#: builtin/index-pack.c:973 +#, c-format +msgid "pack has %d unresolved delta" +msgid_plural "pack has %d unresolved deltas" +msgstr[0] "Paket hat %d unaufgelöste Unterschied" +msgstr[1] "Paket hat %d unaufgelöste Unterschiede" + +#: builtin/index-pack.c:998 +#, c-format +msgid "unable to deflate appended object (%d)" +msgstr "Konnte angehängtes Objekt (%d) nicht komprimieren" + +#: builtin/index-pack.c:1077 +#, c-format +msgid "local object %s is corrupt" +msgstr "lokales Objekt %s ist beschädigt" + +#: builtin/index-pack.c:1101 +msgid "error while closing pack file" +msgstr "Fehler beim Schließen der Paketdatei" + +#: builtin/index-pack.c:1114 +#, c-format +msgid "cannot write keep file '%s'" +msgstr "Kann Paketbeschreibungsdatei '%s' nicht schreiben" + +#: builtin/index-pack.c:1122 +#, c-format +msgid "cannot close written keep file '%s'" +msgstr "Kann eben erstellte Paketbeschreibungsdatei '%s' nicht schließen" + +#: builtin/index-pack.c:1135 +msgid "cannot store pack file" +msgstr "Kann Paketdatei nicht speichern" + +#: builtin/index-pack.c:1146 +msgid "cannot store index file" +msgstr "Kann Indexdatei nicht speichern" + +#: builtin/index-pack.c:1247 +#, c-format +msgid "Cannot open existing pack file '%s'" +msgstr "Kann existierende Paketdatei '%s' nicht öffnen" + +#: builtin/index-pack.c:1249 +#, c-format +msgid "Cannot open existing pack idx file for '%s'" +msgstr "Kann existierende Indexdatei für Paket '%s' nicht öffnen" + +#: builtin/index-pack.c:1296 +#, c-format +msgid "non delta: %d object" +msgid_plural "non delta: %d objects" +msgstr[0] "kein Unterschied: %d Objekt" +msgstr[1] "kein Unterschied: %d Objekte" + +#: builtin/index-pack.c:1303 +#, c-format +msgid "chain length = %d: %lu object" +msgid_plural "chain length = %d: %lu objects" +msgstr[0] "Länge der Objekt-Liste = %d: %lu Objekt" +msgstr[1] "Länge der Objekt-Liste = %d: %lu Objekte" + +#: builtin/index-pack.c:1330 +msgid "Cannot come back to cwd" +msgstr "Kann nicht zurück zu Arbeitsverzeichnis wechseln" + +#: builtin/index-pack.c:1374 builtin/index-pack.c:1377 +#: builtin/index-pack.c:1389 builtin/index-pack.c:1393 +#, c-format +msgid "bad %s" +msgstr "%s ist ungültig" + +#: builtin/index-pack.c:1407 +msgid "--fix-thin cannot be used without --stdin" +msgstr "--fix-thin kann nicht ohne --stdin benutzt werden" + +#: builtin/index-pack.c:1411 builtin/index-pack.c:1421 +#, c-format +msgid "packfile name '%s' does not end with '.pack'" +msgstr "Name der Paketdatei '%s' endet nicht mit '.pack'" + +#: builtin/index-pack.c:1430 +msgid "--verify with no packfile name given" +msgstr "--verify ohne Name der Paketdatei angegeben" #: builtin/init-db.c:35 #, c-format msgid "Could not make %s writable by group" -msgstr "Konnte %s nicht schreibbar für Gruppen machen" +msgstr "Konnte Gruppenschreibrecht für %s nicht setzen." #: builtin/init-db.c:62 #, c-format msgid "insanely long template name %s" -msgstr "verrückt langer Vorlagen-Name %s" +msgstr "zu langer Vorlagen-Name %s" #: builtin/init-db.c:67 #, c-format msgid "cannot stat '%s'" -msgstr "'%s' kann nicht gelesen werden" +msgstr "Kann '%s' nicht lesen" #: builtin/init-db.c:73 #, c-format @@ -2152,17 +3215,17 @@ msgstr "kann Verzeichnis '%s' nicht öffnen" #: builtin/init-db.c:97 #, c-format msgid "cannot readlink '%s'" -msgstr "kann Verknüfpung '%s' nicht lesen" +msgstr "kann Verknüpfung '%s' nicht lesen" #: builtin/init-db.c:99 #, c-format msgid "insanely long symlink %s" -msgstr "verrückt lange symbolische Verknüpfung %s" +msgstr "zu lange symbolische Verknüpfung %s" #: builtin/init-db.c:102 #, c-format msgid "cannot symlink '%s' '%s'" -msgstr "kann '%s' '%s' nicht symbolisch verknüpfen" +msgstr "kann '%s' nicht mit '%s' symbolisch verknüpfen" #: builtin/init-db.c:106 #, c-format @@ -2177,12 +3240,12 @@ msgstr "ignoriere Vorlage %s" #: builtin/init-db.c:133 #, c-format msgid "insanely long template path %s" -msgstr "verrückt langer Vorlagen-Pfad %s" +msgstr "zu langer Vorlagen-Pfad %s" #: builtin/init-db.c:141 #, c-format msgid "templates not found %s" -msgstr "Vorlagen nicht gefunden %s" +msgstr "keine Vorlagen in '%s' gefunden" #: builtin/init-db.c:154 #, c-format @@ -2192,7 +3255,7 @@ msgstr "kopiere keine Vorlagen mit einer falschen Formatversion %d von '%s'" #: builtin/init-db.c:192 #, c-format msgid "insane git directory %s" -msgstr "verrücktes git Verzeichnis %s" +msgstr "ungültiges Git-Verzeichnis %s" #: builtin/init-db.c:322 builtin/init-db.c:325 #, c-format @@ -2202,12 +3265,12 @@ msgstr "%s existiert bereits" #: builtin/init-db.c:354 #, c-format msgid "unable to handle file type %d" -msgstr "kann Dateityp %d nicht behandeln" +msgstr "kann nicht mit Dateityp %d umgehen" #: builtin/init-db.c:357 #, c-format msgid "unable to move %s to %s" -msgstr "konnte %s nicht nach %s verschieben" +msgstr "Konnte %s nicht nach %s verschieben" #: builtin/init-db.c:362 #, c-format @@ -2234,11 +3297,11 @@ msgstr "Initialisierte leeres" #: builtin/init-db.c:421 msgid " shared" -msgstr " geteilt" +msgstr " gemeinsames" #: builtin/init-db.c:440 msgid "cannot tell cwd" -msgstr "kann nicht \"cwd\" sagen" +msgstr "kann aktuelles Arbeitsverzeichnis nicht ermitteln" #: builtin/init-db.c:521 builtin/init-db.c:528 #, c-format @@ -2248,7 +3311,7 @@ msgstr "kann Verzeichnis %s nicht erstellen" #: builtin/init-db.c:532 #, c-format msgid "cannot chdir to %s" -msgstr "kann nicht zu Verzeichnis %s wechseln" +msgstr "kann nicht in Verzeichnis %s wechseln" #: builtin/init-db.c:554 #, c-format @@ -2287,92 +3350,83 @@ msgstr "Unbekannter Typ: %d" msgid "format.headers without value" msgstr "format.headers ohne Wert" -#: builtin/log.c:675 +#: builtin/log.c:676 msgid "name of output directory is too long" msgstr "Name des Ausgabeverzeichnisses ist zu lang." -#: builtin/log.c:686 +#: builtin/log.c:687 #, c-format msgid "Cannot open patch file %s" msgstr "Kann Patch-Datei %s nicht öffnen" -#: builtin/log.c:700 +#: builtin/log.c:701 msgid "Need exactly one range." -msgstr "Brauche genau einen Bereich." +msgstr "Brauche genau einen Versionsbereich." -#: builtin/log.c:708 +#: builtin/log.c:709 msgid "Not a range." -msgstr "Kein Bereich." - -#: builtin/log.c:745 -msgid "Could not extract email from committer identity." -msgstr "Konnte E-Mail von der Intentität des Einreichers nicht extrahieren." +msgstr "Kein Versionsbereich." -#: builtin/log.c:791 +#: builtin/log.c:786 msgid "Cover letter needs email format" msgstr "Anschreiben benötigt E-Mail-Format" -#: builtin/log.c:885 +#: builtin/log.c:859 #, c-format msgid "insane in-reply-to: %s" -msgstr "verrücktes in-reply-to: %s" +msgstr "ungültiges in-reply-to: %s" -#: builtin/log.c:958 +#: builtin/log.c:932 msgid "Two output directories?" msgstr "Zwei Ausgabeverzeichnisse?" -#: builtin/log.c:1179 +#: builtin/log.c:1153 #, c-format msgid "bogus committer info %s" msgstr "unechte Einreicher-Informationen %s" -#: builtin/log.c:1224 +#: builtin/log.c:1198 msgid "-n and -k are mutually exclusive." -msgstr "-n und -k sind zueinander exklusiv" +msgstr "-n und -k schliessen sich gegenseitig aus" -#: builtin/log.c:1226 +#: builtin/log.c:1200 msgid "--subject-prefix and -k are mutually exclusive." -msgstr "--subject-prefix und -k sind zueinander exklusiv" +msgstr "--subject-prefix und -k schliessen sich gegenseitig aus" -#: builtin/log.c:1231 builtin/shortlog.c:284 -#, c-format -msgid "unrecognized argument: %s" -msgstr "nicht erkanntes Argument: %s" - -#: builtin/log.c:1234 +#: builtin/log.c:1208 msgid "--name-only does not make sense" msgstr "--name-only macht keinen Sinn" -#: builtin/log.c:1236 +#: builtin/log.c:1210 msgid "--name-status does not make sense" msgstr "--name-status macht keinen Sinn" -#: builtin/log.c:1238 +#: builtin/log.c:1212 msgid "--check does not make sense" msgstr "--check macht keinen Sinn" -#: builtin/log.c:1261 +#: builtin/log.c:1235 msgid "standard output, or directory, which one?" msgstr "Standard-Ausgabe oder Verzeichnis, welches von beidem?" -#: builtin/log.c:1263 +#: builtin/log.c:1237 #, c-format msgid "Could not create directory '%s'" msgstr "Konnte Verzeichnis '%s' nicht erstellen." -#: builtin/log.c:1416 +#: builtin/log.c:1390 msgid "Failed to create output files" msgstr "Fehler beim Erstellen der Ausgabedateien." -#: builtin/log.c:1520 +#: builtin/log.c:1494 #, c-format msgid "" "Could not find a tracked remote branch, please specify <upstream> manually.\n" msgstr "" -"Konnte gefolgten, entfernten Zweig nicht finden, bitte spezifiziere " -"<upstream> manuell.\n" +"Konnte gefolgten, externen Zweig nicht finden, bitte gebe <upstream> manuell " +"an.\n" -#: builtin/log.c:1536 builtin/log.c:1538 builtin/log.c:1550 +#: builtin/log.c:1510 builtin/log.c:1512 builtin/log.c:1524 #, c-format msgid "Unknown commit %s" msgstr "Unbekannte Version %s" @@ -2420,7 +3474,7 @@ msgstr " (nichts zu quetschen)" #: builtin/merge.c:329 #, c-format msgid "Squash commit -- not updating HEAD\n" -msgstr "Quetsche Version -- aktualisiere Zweigspitze (HEAD) nicht\n" +msgstr "Quetsche Version -- Zweigspitze (HEAD) wird nicht aktualisiert\n" #: builtin/merge.c:361 msgid "Writing SQUASH_MSG" @@ -2434,7 +3488,8 @@ msgstr "Schließe SQUASH_MSG ab" #, c-format msgid "No merge message -- not updating HEAD\n" msgstr "" -"Keine Zusammenführungsbeschreibung -- aktualisiere Zweigspitze (HEAD) nicht\n" +"Keine Zusammenführungsbeschreibung -- Zweigspitze (HEAD) wird nicht " +"aktualisiert\n" #: builtin/merge.c:437 #, c-format @@ -2444,7 +3499,7 @@ msgstr "'%s' zeigt auf keine Version" #: builtin/merge.c:536 #, c-format msgid "Bad branch.%s.mergeoptions string: %s" -msgstr "Schlechter branch.%s.mergeoptions String: %s" +msgstr "Ungültiger branch.%s.mergeoptions String: %s" #: builtin/merge.c:629 msgid "git write-tree failed to write a tree" @@ -2460,7 +3515,7 @@ msgstr "Konnte Bereitstellung nicht schreiben." #: builtin/merge.c:710 msgid "Not handling anything other than two heads merge." -msgstr "Behandle nichts anderes als die Zusammenführung von zwei Köpfen." +msgstr "Es wird nur die Zusammenführung von zwei Zweigen behandelt." #: builtin/merge.c:724 #, c-format @@ -2481,7 +3536,7 @@ msgstr "konnte nicht von '%s' lesen" #, c-format msgid "Not committing merge; use 'git commit' to complete the merge.\n" msgstr "" -"Zusammenführung nicht eingetragen; benutze 'git commit' um die " +"Zusammenführung wurde nicht eingetragen; benutze 'git commit' um die " "Zusammenführung abzuschließen.\n" #: builtin/merge.c:892 @@ -2494,7 +3549,7 @@ msgid "" msgstr "" "Bitte gebe eine Versionsbeschreibung ein um zu erklären, warum diese " "Zusammenführung erforderlich ist,\n" -"insbesondere wenn es einen aktualisierten entfernten Zweig mit einem Thema-" +"insbesondere wenn es einen aktualisierten, externen Zweig mit einem Thema-" "Zweig zusammenführt.\n" "\n" "Zeilen beginnend mit '#' werden ignoriert, und eine leere Beschreibung " @@ -2523,21 +3578,22 @@ msgstr "'%s' ist keine Version" #: builtin/merge.c:1050 msgid "No current branch." -msgstr "Kein aktueller Zweig." +msgstr "Du befindest dich auf keinem Zweig." #: builtin/merge.c:1052 msgid "No remote for the current branch." -msgstr "Kein anderes Archiv für den aktuellen Zweig." +msgstr "Kein externes Archiv für den aktuellen Zweig." #: builtin/merge.c:1054 msgid "No default upstream defined for the current branch." msgstr "" -"Kein entferntes Standard-Projektarchiv für den aktuellen Zweig definiert." +"Es ist kein externes Standard-Projektarchiv für den aktuellen Zweig " +"definiert." #: builtin/merge.c:1059 #, c-format msgid "No remote tracking branch for %s from %s" -msgstr "Kein entfernter Übernahmezweig für %s von %s" +msgstr "Kein externer Übernahmezweig für %s von %s" #: builtin/merge.c:1146 builtin/merge.c:1303 #, c-format @@ -2566,15 +3622,13 @@ msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you can merge." msgstr "" -"Du hast deinen \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD " -"existiert).\n" +"Du hast \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD existiert).\n" "Bitte trage deine Änderungen ein, bevor du zusammenführen kannst." #: builtin/merge.c:1240 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." msgstr "" -"Du hast deinen \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD " -"existiert)." +"Du hast \"cherry-pick\" nicht abgeschlossen (CHERRY_PICK_HEAD existiert)." #: builtin/merge.c:1249 msgid "You cannot combine --squash with --no-ff." @@ -2586,20 +3640,19 @@ msgstr "Du kannst --no-ff nicht mit --ff--only kombinieren." #: builtin/merge.c:1261 msgid "No commit specified and merge.defaultToUpstream not set." -msgstr "Keine Version spezifiziert und merge.defaultToUpstream nicht gesetzt." +msgstr "Keine Version angegeben und merge.defaultToUpstream ist nicht gesetzt." #: builtin/merge.c:1293 msgid "Can merge only exactly one commit into empty head" -msgstr "Kann nur exakt eine Version in einem leeren Kopf zusammenführen." +msgstr "Kann nur exakt eine Version in einem leeren Zweig zusammenführen." #: builtin/merge.c:1296 msgid "Squash commit into empty head not supported yet" -msgstr "" -"Quetschen einer Version in einen leeren Kopf wird momentan nicht unterstützt." +msgstr "Bin auf einem Zweig, der noch geboren wird; kann nicht quetschen." #: builtin/merge.c:1298 msgid "Non-fast-forward commit does not make sense into an empty head" -msgstr "nicht vorzuspulende Version macht in einem leeren Kopf keinen Sinn" +msgstr "nicht vorzuspulende Version macht in einem leeren Zweig keinen Sinn" #: builtin/merge.c:1413 #, c-format @@ -2623,7 +3676,7 @@ msgstr "Vorspulen nicht möglich, breche ab." #: builtin/merge.c:1513 builtin/merge.c:1592 #, c-format msgid "Rewinding the tree to pristine...\n" -msgstr "Rücklauf des Baumes bis zum Ursprung...\n" +msgstr "Rücklauf des Zweiges bis zum Ursprung...\n" #: builtin/merge.c:1517 #, c-format @@ -2633,7 +3686,7 @@ msgstr "Probiere Zusammenführungsstrategie %s...\n" #: builtin/merge.c:1583 #, c-format msgid "No merge strategy handled the merge.\n" -msgstr "Keine Zusammenführungsstrategie behandelt die Zusammenführung.\n" +msgstr "Keine Zusammenführungsstrategie behandelt diese Zusammenführung.\n" #: builtin/merge.c:1585 #, c-format @@ -2649,17 +3702,17 @@ msgstr "Benutze \"%s\" um die Auflösung per Hand vorzubereiten.\n" #, c-format msgid "Automatic merge went well; stopped before committing as requested\n" msgstr "" -"Automatische Zusammenführung gut gegangen; stoppe, wie angefragt, vor der " -"Eintragung\n" +"Automatische Zusammenführung abgeschlossen; halte, wie gewünscht, vor der " +"Eintragung an\n" #: builtin/mv.c:108 #, c-format msgid "Checking rename of '%s' to '%s'\n" -msgstr "Prüfe Umbenennen von '%s' nach '%s'\n" +msgstr "Prüfe Umbenennung von '%s' nach '%s'\n" #: builtin/mv.c:112 msgid "bad source" -msgstr "schlechte Quelle" +msgstr "ungültige Quelle" #: builtin/mv.c:115 msgid "can not move directory into itself" @@ -2684,7 +3737,7 @@ msgstr "nicht unter Versionskontrolle" #: builtin/mv.c:173 msgid "destination exists" -msgstr "Ziel existiert" +msgstr "Ziel existiert bereits" #: builtin/mv.c:181 #, c-format @@ -2709,10 +3762,10 @@ msgstr "%s, Quelle=%s, Ziel=%s" msgid "Renaming %s to %s\n" msgstr "Benenne %s nach %s um\n" -#: builtin/mv.c:215 +#: builtin/mv.c:215 builtin/remote.c:731 #, c-format msgid "renaming '%s' failed" -msgstr "Umbenennen von '%s' fehlgeschlagen" +msgstr "Umbenennung von '%s' fehlgeschlagen" #: builtin/notes.c:139 #, c-format @@ -2726,14 +3779,14 @@ msgstr "konnte Datei-Deskriptor für Ausgabe von 'show' nicht öffnen" #: builtin/notes.c:155 #, c-format msgid "failed to close pipe to 'show' for object '%s'" -msgstr "Schließen der Pipe zu 'show' für Objekt '%s' fehlgeschlagen." +msgstr "Schließen der Verbindung zu 'show' ist für Objekt '%s' fehlgeschlagen." #: builtin/notes.c:158 #, c-format msgid "failed to finish 'show' for object '%s'" -msgstr "'show' konnte für Objekt '%s' nicht abgeschlossen werden" +msgstr "konnte 'show' für Objekt '%s' nicht abschließen" -#: builtin/notes.c:175 builtin/tag.c:343 +#: builtin/notes.c:175 builtin/tag.c:347 #, c-format msgid "could not create file '%s'" msgstr "konnte Datei '%s' nicht erstellen" @@ -2756,12 +3809,12 @@ msgstr "Konnte Notiz-Objekt nicht schreiben" msgid "The note contents has been left in %s" msgstr "Die Notiz-Inhalte wurden in %s belassen" -#: builtin/notes.c:251 builtin/tag.c:521 +#: builtin/notes.c:251 builtin/tag.c:542 #, c-format msgid "cannot read '%s'" msgstr "kann '%s' nicht lesen" -#: builtin/notes.c:253 builtin/tag.c:524 +#: builtin/notes.c:253 builtin/tag.c:545 #, c-format msgid "could not open or read '%s'" msgstr "konnte '%s' nicht öffnen oder lesen" @@ -2769,10 +3822,10 @@ msgstr "konnte '%s' nicht öffnen oder lesen" #: builtin/notes.c:272 builtin/notes.c:445 builtin/notes.c:447 #: builtin/notes.c:507 builtin/notes.c:561 builtin/notes.c:644 #: builtin/notes.c:649 builtin/notes.c:724 builtin/notes.c:766 -#: builtin/notes.c:968 builtin/reset.c:293 builtin/tag.c:537 +#: builtin/notes.c:968 builtin/reset.c:293 builtin/tag.c:558 #, c-format msgid "Failed to resolve '%s' as a valid ref." -msgstr "'%s' konnte nicht als gültige Referenz aufgelöst werden." +msgstr "Konnte '%s' nicht als gültige Referenz auflösen." #: builtin/notes.c:275 #, c-format @@ -2786,7 +3839,7 @@ msgstr "Kann uninitialisierten/unreferenzierten Notiz-Baum nicht eintragen." #: builtin/notes.c:340 #, c-format msgid "Bad notes.rewriteMode value: '%s'" -msgstr "Schlechter notes.rewriteMode Wert: '%s'" +msgstr "Ungültiger notes.rewriteMode Wert: '%s'" #: builtin/notes.c:350 #, c-format @@ -2799,7 +3852,7 @@ msgstr "" #: builtin/notes.c:377 #, c-format msgid "Bad %s value: '%s'" -msgstr "Schlechter %s Wert: '%s'" +msgstr "Ungültiger %s Wert: '%s'" #: builtin/notes.c:441 #, c-format @@ -2852,7 +3905,7 @@ msgstr "" #: builtin/notes.c:668 #, c-format msgid "Missing notes on source object %s. Cannot copy." -msgstr "Vermisse Notizen für Quell-Objekt %s. Kann nicht kopieren." +msgstr "Keine Notizen für Quell-Objekt %s. Kopie nicht möglich." #: builtin/notes.c:717 #, c-format @@ -2860,7 +3913,7 @@ msgid "" "The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n" "Please use 'git notes add -f -m/-F/-c/-C' instead.\n" msgstr "" -"Die Optionen -m/-F/-c/-C sind veraltet für das 'edit' Unterkommando.\n" +"Die Optionen -m/-F/-c/-C sind für das Unterkommando 'edit' veraltet.\n" "Bitte benutze stattdessen 'git notes add -f -m/-F/-c/-C'.\n" #: builtin/notes.c:971 @@ -2868,30 +3921,30 @@ msgstr "" msgid "Object %s has no note\n" msgstr "Objekt %s hat keine Notiz\n" -#: builtin/notes.c:1103 +#: builtin/notes.c:1103 builtin/remote.c:1598 #, c-format msgid "Unknown subcommand: %s" msgstr "Unbekanntes Unterkommando: %s" -#: builtin/pack-objects.c:2310 +#: builtin/pack-objects.c:2337 #, c-format msgid "unsupported index version %s" msgstr "Nicht unterstützte Bereitstellungsversion %s" -#: builtin/pack-objects.c:2314 +#: builtin/pack-objects.c:2341 #, c-format msgid "bad index version '%s'" -msgstr "Schlechte Bereitstellungsversion '%s'" +msgstr "Ungültige Bereitstellungsversion '%s'" -#: builtin/pack-objects.c:2322 +#: builtin/pack-objects.c:2364 #, c-format msgid "option %s does not accept negative form" msgstr "Option %s akzeptiert keine negative Form" -#: builtin/pack-objects.c:2326 +#: builtin/pack-objects.c:2368 #, c-format msgid "unable to parse value '%s' for option %s" -msgstr "konnte Wert '%s' für Option %s nicht analysieren" +msgstr "konnte Wert '%s' für Option %s nicht parsen" #: builtin/push.c:45 msgid "tag shorthand without <tag>" @@ -2901,7 +3954,42 @@ msgstr "Kurzschrift für Markierung ohne <Markierung>" msgid "--delete only accepts plain target ref names" msgstr "--delete akzeptiert nur reine Referenz-Namen als Ziel" -#: builtin/push.c:84 +#: builtin/push.c:99 +msgid "" +"\n" +"To choose either option permanently, see push.default in 'git help config'." +msgstr "" +"\n" +"Um eine Variante permanent zu verwenden, siehe push.default in 'git help " +"config'." + +#: builtin/push.c:102 +#, c-format +msgid "" +"The upstream branch of your current branch does not match\n" +"the name of your current branch. To push to the upstream branch\n" +"on the remote, use\n" +"\n" +" git push %s HEAD:%s\n" +"\n" +"To push to the branch of the same name on the remote, use\n" +"\n" +" git push %s %s\n" +"%s" +msgstr "" +"Der Name des externen Übernahmezweiges stimmt nicht mit dem Namen deines\n" +"aktuellen Zweiges überein. Um auf den Übernahmezweig in dem externen\n" +"Projektarchiv zu versenden, benutze:\n" +"\n" +" git push %s HEAD:%s\n" +"\n" +"Um auf den Zweig mit dem selben Namen in dem externen Projekarchiv\n" +"zu versenden, benutze:\n" +"\n" +" git push %s %s\n" +"%s" + +#: builtin/push.c:121 #, c-format msgid "" "You are not currently on a branch.\n" @@ -2914,9 +4002,9 @@ msgstr "" "Um die Historie, führend zum aktuellen (freistehende Zweigspitze (HEAD))\n" "Status zu versenden, benutze\n" "\n" -" git push %s HEAD:<Name-des-entfernten-Zweiges>\n" +" git push %s HEAD:<Name-des-externen-Zweiges>\n" -#: builtin/push.c:91 +#: builtin/push.c:128 #, c-format msgid "" "The current branch %s has no upstream branch.\n" @@ -2924,37 +4012,36 @@ msgid "" "\n" " git push --set-upstream %s %s\n" msgstr "" -"Der aktuelle Zweig %s hat keinen Zweig im entfernten Projektarchiv.\n" -"Um den aktuellen Zweig zu versenden und die Entfernung als entferntes\n" -"Projektarchiv zu setzen, benutze\n" +"Der aktuelle Zweig %s hat keinen Zweig im externen Projektarchiv.\n" +"Um den aktuellen Zweig zu versenden und das Fernarchiv als externes\n" +"Projektarchiv zu verwenden, benutze\n" "\n" " git push --set-upstream %s %s\n" -#: builtin/push.c:99 +#: builtin/push.c:136 #, c-format msgid "The current branch %s has multiple upstream branches, refusing to push." -msgstr "" -"Der aktuelle Zweig %s hat mehrere entfernte Zweige, Versand verweigert." +msgstr "Der aktuelle Zweig %s hat mehrere externe Zweige, Versand verweigert." -#: builtin/push.c:102 +#: builtin/push.c:139 #, c-format msgid "" "You are pushing to remote '%s', which is not the upstream of\n" "your current branch '%s', without telling me what to push\n" "to update which remote branch." msgstr "" -"Du versendest nach '%s', welches kein entferntes Projektarchiv deines\n" +"Du versendest nach '%s', welches kein externes Projektarchiv deines\n" "aktuellen Zweiges '%s' ist, ohne mir mitzuteilen, was ich versenden\n" -"soll um welchen entfernten Zweig zu aktualisieren." +"soll, um welchen externen Zweig zu aktualisieren." -#: builtin/push.c:131 +#: builtin/push.c:174 msgid "" "You didn't specify any refspecs to push, and push.default is \"nothing\"." msgstr "" -"Du hast keine Referenzspezifikationen zum Versenden spezifiziert, und push." +"Du hast keine Referenzspezifikationen zum Versenden angegeben, und push." "default ist \"nothing\"." -#: builtin/push.c:138 +#: builtin/push.c:181 msgid "" "Updates were rejected because the tip of your current branch is behind\n" "its remote counterpart. Merge the remote changes (e.g. 'git pull')\n" @@ -2962,12 +4049,12 @@ msgid "" "See the 'Note about fast-forwards' in 'git push --help' for details." msgstr "" "Aktualisierungen wurden zurückgewiesen, weil die Spitze deines aktuellen\n" -"Zweiges hinter seinem entfernten Gegenstück ist. Führe die entfernten\n" -"Änderungen zusammen (z.B. 'git pull') bevor du erneut versendest.\n" -"Siehe auch die 'Note about fast-forwards' Sektion von 'git push --help'\n" +"Zweiges hinter seinem externen Gegenstück zurückgefallen ist. Führe die\n" +"externen Änderungen zusammen (z.B. 'git pull') bevor du erneut versendest.\n" +"Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n" "für weitere Details." -#: builtin/push.c:144 +#: builtin/push.c:187 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. If you did not intend to push that branch, you may want to\n" @@ -2975,12 +4062,14 @@ msgid "" "variable to 'current' or 'upstream' to push only the current branch." msgstr "" "Aktualisierungen wurden zurückgewiesen, weil die Spitze eines versendeten\n" -"Zweiges hinter seinem entfernten Gegenstück ist. Wenn du nicht beabsichtigt\n" -"hast, diesen Zweig zu versenden, kannst du auch den zu versendenden Zweig\n" -"spezifizieren oder die Konfigurationsvariable 'push.default' zu 'current'\n" -"oder 'upstream' setze, um nur den aktuellen Zweig zu versenden." - -#: builtin/push.c:150 +"Zweiges hinter seinem externen Gegenstück zurückgefallen ist. Wenn du nicht\n" +"beabsichtigt hast, diesen Zweig zu versenden, kannst du auch den zu " +"versendenden\n" +"Zweig spezifizieren oder die Konfigurationsvariable 'push.default' zu " +"'current'\n" +"oder 'upstream' setzen, um nur den aktuellen Zweig zu versenden." + +#: builtin/push.c:193 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. Check out this branch and merge the remote changes\n" @@ -2988,28 +4077,28 @@ msgid "" "See the 'Note about fast-forwards' in 'git push --help' for details." msgstr "" "Aktualisierungen wurden zurückgewiesen, weil die Spitze eines versendeten\n" -"Zweiges hinter seinem entfernten Gegenstück ist. Checke diesen Zweig aus\n" -"und führe die entfernten Änderungen zusammen (z.B. 'git pull') bevor du\n" -"erneut versendest.\n" -"Sie auch die 'Note about fast-forwards' Sektion von 'git push --help'\n" +"Zweiges hinter seinem externen Gegenstück zurückgefallen ist. Checke diesen\n" +"Zweig aus und führe die externen Änderungen zusammen (z.B. 'git pull')\n" +"bevor du erneut versendest.\n" +"Siehe auch die Sektion 'Note about fast-forwards' in 'git push --help'\n" "für weitere Details." -#: builtin/push.c:190 +#: builtin/push.c:233 #, c-format msgid "Pushing to %s\n" -msgstr "Schiebe zu %s\n" +msgstr "Versende nach %s\n" -#: builtin/push.c:194 +#: builtin/push.c:237 #, c-format msgid "failed to push some refs to '%s'" msgstr "Fehler beim Versenden einiger Referenzen nach '%s'" -#: builtin/push.c:226 +#: builtin/push.c:269 #, c-format msgid "bad repository '%s'" -msgstr "schlechtes Projektarchiv '%s'" +msgstr "ungültiges Projektarchiv '%s'" -#: builtin/push.c:227 +#: builtin/push.c:270 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -3023,7 +4112,7 @@ msgid "" msgstr "" "Kein Ziel zum Versenden konfiguriert.\n" "Entweder spezifizierst du die URL von der Kommandozeile oder konfigurierst " -"ein entferntes Projektarchiv unter Benutzung von\n" +"ein externes Projektarchiv unter Benutzung von\n" "\n" " git remote add <Name> <URL>\n" "\n" @@ -3031,49 +4120,414 @@ msgstr "" "\n" " git push <Name>\n" -#: builtin/push.c:242 +#: builtin/push.c:285 msgid "--all and --tags are incompatible" msgstr "--all und --tags sind inkompatibel" -#: builtin/push.c:243 +#: builtin/push.c:286 msgid "--all can't be combined with refspecs" msgstr "--all kann nicht mit Referenzspezifikationen kombiniert werden" -#: builtin/push.c:248 +#: builtin/push.c:291 msgid "--mirror and --tags are incompatible" msgstr "--mirror und --tags sind inkompatibel" -#: builtin/push.c:249 +#: builtin/push.c:292 msgid "--mirror can't be combined with refspecs" msgstr "--mirror kann nicht mit Referenzspezifikationen kombiniert werden" -#: builtin/push.c:254 +#: builtin/push.c:297 msgid "--all and --mirror are incompatible" msgstr "--all und --mirror sind inkompatibel" -#: builtin/push.c:342 +#: builtin/push.c:385 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "--delete ist inkompatibel mit --all, --mirror und --tags" -#: builtin/push.c:344 +#: builtin/push.c:387 msgid "--delete doesn't make sense without any refs" -msgstr "--delete macht ohne irgendeine Referenz ohne keinen Sinn" +msgstr "--delete macht ohne irgendeine Referenz keinen Sinn" + +#: builtin/remote.c:98 +#, c-format +msgid "Updating %s" +msgstr "Aktualisiere %s" + +#: builtin/remote.c:130 +msgid "" +"--mirror is dangerous and deprecated; please\n" +"\t use --mirror=fetch or --mirror=push instead" +msgstr "" +"--mirror ist gefährlich und veraltet; bitte\n" +"\t benutze stattdessen --mirror=fetch oder --mirror=push" + +#: builtin/remote.c:147 +#, c-format +msgid "unknown mirror argument: %s" +msgstr "unbekanntes Argument für Option --mirror: %s" + +#: builtin/remote.c:185 +msgid "specifying a master branch makes no sense with --mirror" +msgstr "Angabe eines Hauptzweiges macht mit --mirror keinen Sinn" + +#: builtin/remote.c:187 +msgid "specifying branches to track makes sense only with fetch mirrors" +msgstr "" +"die Angabe von zu folgenden Zweigen macht nur mit dem Abholen von " +"Spiegelarchiven Sinn" + +#: builtin/remote.c:195 builtin/remote.c:646 +#, c-format +msgid "remote %s already exists." +msgstr "externes Projektarchiv %s existiert bereits" + +#: builtin/remote.c:199 builtin/remote.c:650 +#, c-format +msgid "'%s' is not a valid remote name" +msgstr "'%s' ist kein gültiger Name für ein externes Projektarchiv" + +#: builtin/remote.c:243 +#, c-format +msgid "Could not setup master '%s'" +msgstr "Konnte symbolische Referenz für Hauptzweig von '%s' nicht einrichten" + +#: builtin/remote.c:299 +#, c-format +msgid "more than one %s" +msgstr "mehr als ein %s" + +#: builtin/remote.c:339 +#, c-format +msgid "Could not get fetch map for refspec %s" +msgstr "Konnte Abholungszuordnung für Referenzspezifikation %s nicht bekommen" + +#: builtin/remote.c:440 builtin/remote.c:448 +msgid "(matching)" +msgstr "(übereinstimmend)" + +#: builtin/remote.c:452 +msgid "(delete)" +msgstr "(lösche)" + +#: builtin/remote.c:595 builtin/remote.c:601 builtin/remote.c:607 +#, c-format +msgid "Could not append '%s' to '%s'" +msgstr "Konnte '%s' nicht an '%s' anhängen." + +#: builtin/remote.c:639 builtin/remote.c:792 builtin/remote.c:890 +#, c-format +msgid "No such remote: %s" +msgstr "Kein solches externes Archiv: %s" + +#: builtin/remote.c:656 +#, c-format +msgid "Could not rename config section '%s' to '%s'" +msgstr "Konnte Sektion '%s' in Konfiguration nicht nach '%s' umbenennen" + +#: builtin/remote.c:662 builtin/remote.c:799 +#, c-format +msgid "Could not remove config section '%s'" +msgstr "Konnte Sektion '%s' nicht aus Konfiguration entfernen" + +#: builtin/remote.c:677 +#, c-format +msgid "" +"Not updating non-default fetch refspec\n" +"\t%s\n" +"\tPlease update the configuration manually if necessary." +msgstr "" +"Keine Aktualisierung der nicht standardmäßigen Referenzspezifikation zum " +"Abholen\n" +"\t%s\n" +"\tBitte aktualisiere, falls notwendig, die Konfiguration manuell." + +#: builtin/remote.c:683 +#, c-format +msgid "Could not append '%s'" +msgstr "Konnte '%s' nicht anhängen." + +#: builtin/remote.c:694 +#, c-format +msgid "Could not set '%s'" +msgstr "Konnte '%s' nicht setzen" + +#: builtin/remote.c:716 +#, c-format +msgid "deleting '%s' failed" +msgstr "Konnte '%s' nicht löschen" + +#: builtin/remote.c:750 +#, c-format +msgid "creating '%s' failed" +msgstr "Konnte '%s' nicht erstellen" + +#: builtin/remote.c:764 +#, c-format +msgid "Could not remove branch %s" +msgstr "Konnte Zweig %s nicht entfernen" + +#: builtin/remote.c:834 +msgid "" +"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" +"to delete it, use:" +msgid_plural "" +"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n" +"to delete them, use:" +msgstr[0] "" +"Hinweis: Ein Zweig außerhalb der /refs/remotes/ Hierachie wurde nicht " +"entfernt;\n" +"um diesen zu entfernen, benutze:" +msgstr[1] "" +"Hinweis: Einige Zweige außer der /refs/remotes/ Hierarchie wurden nicht " +"entfernt;\n" +"um diese zu entfernen, benutze:" + +#: builtin/remote.c:943 +#, c-format +msgid " new (next fetch will store in remotes/%s)" +msgstr " neu (wird bei nächster Abholung in remotes/%s gespeichert)" + +#: builtin/remote.c:946 +msgid " tracked" +msgstr " gefolgt" + +#: builtin/remote.c:948 +msgid " stale (use 'git remote prune' to remove)" +msgstr " veraltet (benutze 'git remote prune' zum Entfernen)" + +#: builtin/remote.c:950 +msgid " ???" +msgstr " ???" + +#: builtin/remote.c:991 +#, c-format +msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch" +msgstr "ungültiges branch.%s.merge; kann nicht auf > 1 Zweig neu aufbauen" + +#: builtin/remote.c:998 +#, c-format +msgid "rebases onto remote %s" +msgstr "baut neu auf externen Zweig %s auf" + +#: builtin/remote.c:1001 +#, c-format +msgid " merges with remote %s" +msgstr " führt mit externem Zweig %s zusammen" + +#: builtin/remote.c:1002 +msgid " and with remote" +msgstr " und mit externem Zweig" + +#: builtin/remote.c:1004 +#, c-format +msgid "merges with remote %s" +msgstr "führt mit externem Zweig %s zusammen" + +#: builtin/remote.c:1005 +msgid " and with remote" +msgstr " und mit externem Zweig" + +#: builtin/remote.c:1051 +msgid "create" +msgstr "erstellt" + +#: builtin/remote.c:1054 +msgid "delete" +msgstr "gelöscht" + +#: builtin/remote.c:1058 +msgid "up to date" +msgstr "aktuell" + +#: builtin/remote.c:1061 +msgid "fast-forwardable" +msgstr "vorspulbar" + +#: builtin/remote.c:1064 +msgid "local out of date" +msgstr "lokal nicht aktuell" + +#: builtin/remote.c:1071 +#, c-format +msgid " %-*s forces to %-*s (%s)" +msgstr " %-*s erzwingt Versandt nach %-*s (%s)" + +#: builtin/remote.c:1074 +#, c-format +msgid " %-*s pushes to %-*s (%s)" +msgstr " %-*s versendet nach %-*s (%s)" + +#: builtin/remote.c:1078 +#, c-format +msgid " %-*s forces to %s" +msgstr " %-*s erzwingt Versand nach %s" + +#: builtin/remote.c:1081 +#, c-format +msgid " %-*s pushes to %s" +msgstr " %-*s versendet nach %s" + +#: builtin/remote.c:1118 +#, c-format +msgid "* remote %s" +msgstr "* externes Projektarchiv %s" + +#: builtin/remote.c:1119 +#, c-format +msgid " Fetch URL: %s" +msgstr " URL zum Abholen: %s" + +#: builtin/remote.c:1120 builtin/remote.c:1285 +msgid "(no URL)" +msgstr "(keine URL)" + +#: builtin/remote.c:1129 builtin/remote.c:1131 +#, c-format +msgid " Push URL: %s" +msgstr " URL zum Versenden: %s" + +#: builtin/remote.c:1133 builtin/remote.c:1135 builtin/remote.c:1137 +#, c-format +msgid " HEAD branch: %s" +msgstr " Hauptzweig: %s" + +#: builtin/remote.c:1139 +#, c-format +msgid "" +" HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" +msgstr "" +" Hauptzweig (externer Hauptzweig ist mehrdeutig, könnte einer der folgenden " +"sein):\n" + +#: builtin/remote.c:1151 +#, c-format +msgid " Remote branch:%s" +msgid_plural " Remote branches:%s" +msgstr[0] " externer Zweig:%s" +msgstr[1] " externe Zweige:%s" + +#: builtin/remote.c:1154 builtin/remote.c:1181 +msgid " (status not queried)" +msgstr " (Zustand nicht abgefragt)" + +#: builtin/remote.c:1163 +msgid " Local branch configured for 'git pull':" +msgid_plural " Local branches configured for 'git pull':" +msgstr[0] " Lokaler Zweig konfiguriert für 'git pull':" +msgstr[1] " Lokale Zweige konfiguriert für 'git pull':" + +#: builtin/remote.c:1171 +msgid " Local refs will be mirrored by 'git push'" +msgstr " Lokale Referenzen werden von 'git push' gespiegelt" + +#: builtin/remote.c:1178 +#, c-format +msgid " Local ref configured for 'git push'%s:" +msgid_plural " Local refs configured for 'git push'%s:" +msgstr[0] " Lokale Referenz konfiguriert für 'git push'%s:" +msgstr[1] " Lokale Referenzen konfiguriert für 'git push'%s:" + +#: builtin/remote.c:1216 +msgid "Cannot determine remote HEAD" +msgstr "Kann Hauptzweig des externen Projektarchivs nicht bestimmen" + +#: builtin/remote.c:1218 +msgid "Multiple remote HEAD branches. Please choose one explicitly with:" +msgstr "" +"Mehrere Hauptzweige im externen Projektarchiv. Bitte wähle explizit einen " +"aus mit:" + +#: builtin/remote.c:1228 +#, c-format +msgid "Could not delete %s" +msgstr "Konnte %s nicht entfernen" + +#: builtin/remote.c:1236 +#, c-format +msgid "Not a valid ref: %s" +msgstr "keine gültige Referenz: %s" + +#: builtin/remote.c:1238 +#, c-format +msgid "Could not setup %s" +msgstr "Konnte %s nicht einrichten" + +#: builtin/remote.c:1274 +#, c-format +msgid " %s will become dangling!" +msgstr " %s wird unreferenziert!" + +#: builtin/remote.c:1275 +#, c-format +msgid " %s has become dangling!" +msgstr " %s wurde unreferenziert!" + +#: builtin/remote.c:1281 +#, c-format +msgid "Pruning %s" +msgstr "entferne veraltete Zweige von %s" + +#: builtin/remote.c:1282 +#, c-format +msgid "URL: %s" +msgstr "URL: %s" + +#: builtin/remote.c:1295 +#, c-format +msgid " * [would prune] %s" +msgstr " * [würde veralteten Zweig entfernen] %s" + +#: builtin/remote.c:1298 +#, c-format +msgid " * [pruned] %s" +msgstr "* [veralteten Zweig entfernt] %s" + +#: builtin/remote.c:1387 builtin/remote.c:1461 +#, c-format +msgid "No such remote '%s'" +msgstr "Kein solches externes Projektarchiv '%s'" + +#: builtin/remote.c:1414 +msgid "no remote specified" +msgstr "kein externes Projektarchiv angegeben" + +#: builtin/remote.c:1447 +msgid "--add --delete doesn't make sense" +msgstr "--add --delete macht keinen Sinn" + +#: builtin/remote.c:1487 +#, c-format +msgid "Invalid old URL pattern: %s" +msgstr "ungültiges altes URL Format: %s" + +#: builtin/remote.c:1495 +#, c-format +msgid "No such URL found: %s" +msgstr "Keine solche URL gefunden: %s" + +#: builtin/remote.c:1497 +msgid "Will not delete all non-push URLs" +msgstr "Werde keine URLs entfernen, die nicht für den Versand bestimmt sind" #: builtin/reset.c:33 msgid "mixed" -msgstr "gemischt" +msgstr "mixed" #: builtin/reset.c:33 msgid "soft" -msgstr "weich" +msgstr "soft" #: builtin/reset.c:33 msgid "hard" -msgstr "hart" +msgstr "hard" + +#: builtin/reset.c:33 +msgid "merge" +msgstr "zusammenführen" #: builtin/reset.c:33 msgid "keep" -msgstr "halten" +msgstr "keep" #: builtin/reset.c:77 msgid "You do not have a valid HEAD." @@ -3109,7 +4563,8 @@ msgstr "Nicht bereitgestellte Änderungen nach Zurücksetzung:" #, c-format msgid "Cannot do a %s reset in the middle of a merge." msgstr "" -"Kann keine %s Zurücksetzung innerhalb einer Zusammenführung durchführen." +"Kann keine '%s' Zurücksetzung durchführen, während eine Zusammenführung im " +"Gange ist." #: builtin/reset.c:297 #, c-format @@ -3128,32 +4583,32 @@ msgstr "" #: builtin/reset.c:313 #, c-format msgid "Cannot do %s reset with paths." -msgstr "Kann keine %s Zurücksetzung mit Pfaden machen." +msgstr "Eine '%s' Zurücksetzung mit Pfaden ist nicht möglich." #: builtin/reset.c:325 #, c-format msgid "%s reset is not allowed in a bare repository" -msgstr "%s Zurücksetzung ist in einem leeren Projektarchiv nicht erlaubt" +msgstr "'%s' Zurücksetzung ist in einem bloßen Projektarchiv nicht erlaubt" #: builtin/reset.c:341 #, c-format msgid "Could not reset index file to revision '%s'." -msgstr "Konnte Bereitstellungsdatei nicht zu Revision '%s' zurücksetzen." +msgstr "Konnte Bereitstellungsdatei nicht zu Version '%s' zurücksetzen." #: builtin/revert.c:70 builtin/revert.c:92 #, c-format msgid "%s: %s cannot be used with %s" msgstr "%s: %s kann nicht mit %s benutzt werden" -#: builtin/revert.c:127 +#: builtin/revert.c:131 msgid "program error" msgstr "Programmfehler" -#: builtin/revert.c:213 +#: builtin/revert.c:221 msgid "revert failed" msgstr "\"revert\" fehlgeschlagen" -#: builtin/revert.c:228 +#: builtin/revert.c:236 msgid "cherry-pick failed" msgstr "\"cherry-pick\" fehlgeschlagen" @@ -3189,7 +4644,7 @@ msgstr "" #: builtin/rm.c:194 #, c-format msgid "not removing '%s' recursively without -r" -msgstr "entferne '%s' nicht rekursiv ohne -r" +msgstr "'%s' wird nicht ohne -r rekursiv entfernt" #: builtin/rm.c:230 #, c-format @@ -3201,32 +4656,32 @@ msgstr "git rm: konnte %s nicht entfernen" msgid "Missing author: %s" msgstr "fehlender Autor: %s" -#: builtin/tag.c:58 +#: builtin/tag.c:60 #, c-format msgid "malformed object at '%s'" msgstr "fehlerhaftes Objekt bei '%s'" -#: builtin/tag.c:205 +#: builtin/tag.c:207 #, c-format msgid "tag name too long: %.*s..." msgstr "Markierungsname zu lang: %.*s..." -#: builtin/tag.c:210 +#: builtin/tag.c:212 #, c-format msgid "tag '%s' not found." msgstr "Markierung '%s' nicht gefunden." -#: builtin/tag.c:225 +#: builtin/tag.c:227 #, c-format msgid "Deleted tag '%s' (was %s)\n" msgstr "Gelöschte Markierung '%s' (war %s)\n" -#: builtin/tag.c:237 +#: builtin/tag.c:239 #, c-format msgid "could not verify the tag '%s'" msgstr "Konnte Markierung '%s' nicht verifizieren" -#: builtin/tag.c:247 +#: builtin/tag.c:249 msgid "" "\n" "#\n" @@ -3237,10 +4692,10 @@ msgstr "" "\n" "#\n" "# Gebe eine Markierungsbeschreibung ein\n" -"# Zeilen beginnend mit '#' werden ignoriert.\n" +"# Zeilen, die mit '#' beginnen, werden ignoriert.\n" "#\n" -#: builtin/tag.c:254 +#: builtin/tag.c:256 msgid "" "\n" "#\n" @@ -3252,89 +4707,224 @@ msgstr "" "\n" "#\n" "# Gebe eine Markierungsbeschreibung ein\n" -"# Zeilen beginnend mit '#' werden behalten; du darfst diese selbst entfernen " -"wenn du möchtest.\n" +"# Zeilen, die mit '#' beginnen, werden behalten; du darfst diese\n" +"# selbst entfernen wenn du möchtest.\n" "#\n" -#: builtin/tag.c:294 +#: builtin/tag.c:298 msgid "unable to sign the tag" msgstr "konnte Markierung nicht signieren" -#: builtin/tag.c:296 +#: builtin/tag.c:300 msgid "unable to write tag file" msgstr "konnte Markierungsdatei nicht schreiben" -#: builtin/tag.c:321 +#: builtin/tag.c:325 msgid "bad object type." -msgstr "schlechter Objekt-Typ" +msgstr "ungültiger Objekt-Typ" -#: builtin/tag.c:334 +#: builtin/tag.c:338 msgid "tag header too big." msgstr "Markierungskopf zu groß." -#: builtin/tag.c:366 +#: builtin/tag.c:370 msgid "no tag message?" msgstr "keine Markierungsbeschreibung?" -#: builtin/tag.c:372 +#: builtin/tag.c:376 #, c-format msgid "The tag message has been left in %s\n" msgstr "Die Markierungsbeschreibung wurde gelassen in %s\n" -#: builtin/tag.c:421 +#: builtin/tag.c:425 msgid "switch 'points-at' requires an object" -msgstr "Wechseln von 'points-at' erfordert ein Objekt" +msgstr "Option 'points-at' erfordert ein Objekt" -#: builtin/tag.c:423 +#: builtin/tag.c:427 #, c-format msgid "malformed object name '%s'" msgstr "fehlerhafter Objekt-Name '%s'" -#: builtin/tag.c:502 +#: builtin/tag.c:506 +msgid "--column and -n are incompatible" +msgstr "--column und -n sind inkompatibel" + +#: builtin/tag.c:523 msgid "-n option is only allowed with -l." msgstr "-n Option ist nur erlaubt mit -l." -#: builtin/tag.c:504 +#: builtin/tag.c:525 msgid "--contains option is only allowed with -l." msgstr "--contains Option ist nur erlaubt mit -l." -#: builtin/tag.c:506 +#: builtin/tag.c:527 msgid "--points-at option is only allowed with -l." msgstr "--points-at Option ist nur erlaubt mit -l." -#: builtin/tag.c:514 +#: builtin/tag.c:535 msgid "only one -F or -m option is allowed." msgstr "nur eine -F oder -m Option ist erlaubt." -#: builtin/tag.c:534 +#: builtin/tag.c:555 msgid "too many params" msgstr "zu viele Parameter" -#: builtin/tag.c:540 +#: builtin/tag.c:561 #, c-format msgid "'%s' is not a valid tag name." msgstr "'%s' ist kein gültiger Markierungsname." -#: builtin/tag.c:545 +#: builtin/tag.c:566 #, c-format msgid "tag '%s' already exists" msgstr "Markierung '%s' existiert bereits" -#: builtin/tag.c:563 +#: builtin/tag.c:584 #, c-format msgid "%s: cannot lock the ref" msgstr "%s: kann Referenz nicht sperren" -#: builtin/tag.c:565 +#: builtin/tag.c:586 #, c-format msgid "%s: cannot update the ref" msgstr "%s: kann Referenz nicht aktualisieren" -#: builtin/tag.c:567 +#: builtin/tag.c:588 #, c-format msgid "Updated tag '%s' (was %s)\n" msgstr "Aktualisierte Markierung '%s' (war %s)\n" +#: git.c:16 +msgid "See 'git help <command>' for more information on a specific command." +msgstr "" +"Siehe 'git help <Kommando>' für weitere Informationen zu einem spezifischen " +"Kommando" + +#: parse-options.h:133 parse-options.h:235 +msgid "n" +msgstr "Anzahl" + +#: parse-options.h:141 +msgid "time" +msgstr "Zeit" + +#: parse-options.h:149 +msgid "file" +msgstr "Datei" + +#: parse-options.h:151 +msgid "when" +msgstr "wann" + +#: parse-options.h:156 +msgid "no-op (backward compatibility)" +msgstr "Kein Effekt (Rückwärtskompatibilität)" + +#: parse-options.h:228 +msgid "be more verbose" +msgstr "erweiterte Ausgaben" + +#: parse-options.h:230 +msgid "be more quiet" +msgstr "weniger Ausgaben" + +#: parse-options.h:236 +msgid "use <n> digits to display SHA-1s" +msgstr "benutze <n> Ziffern zur Anzeige von SHA-1s" + +#: common-cmds.h:8 +msgid "Add file contents to the index" +msgstr "stellt Dateiinhalte zur Eintragung bereit" + +#: common-cmds.h:9 +msgid "Find by binary search the change that introduced a bug" +msgstr "" +"Findet über eine Binärsuche die Änderungen, die einen Fehler verursacht haben" + +#: common-cmds.h:10 +msgid "List, create, or delete branches" +msgstr "Zeigt an, erstellt oder entfernt Zweige" + +#: common-cmds.h:11 +msgid "Checkout a branch or paths to the working tree" +msgstr "Checkt Zweige oder Pfade im Arbeitszweig aus" + +#: common-cmds.h:12 +msgid "Clone a repository into a new directory" +msgstr "Klont ein Projektarchiv in einem neuen Verzeichnis" + +#: common-cmds.h:13 +msgid "Record changes to the repository" +msgstr "Trägt Änderungen in das Projektarchiv ein" + +#: common-cmds.h:14 +msgid "Show changes between commits, commit and working tree, etc" +msgstr "Zeigt Änderungen zwischen Versionen, Version und Arbeitszweig, etc. an" + +#: common-cmds.h:15 +msgid "Download objects and refs from another repository" +msgstr "Lädt Objekte und Referenzen von einem anderen Projektarchiv herunter" + +#: common-cmds.h:16 +msgid "Print lines matching a pattern" +msgstr "Stellt Zeilen dar, die einem Muster entsprechen" + +#: common-cmds.h:17 +msgid "Create an empty git repository or reinitialize an existing one" +msgstr "" +"Erstellt ein leeres Git-Projektarchiv oder initialisiert ein bestehendes neu" + +#: common-cmds.h:18 +msgid "Show commit logs" +msgstr "Zeigt Versionshistorie an" + +#: common-cmds.h:19 +msgid "Join two or more development histories together" +msgstr "Führt zwei oder mehr Entwicklungszweige zusammen" + +#: common-cmds.h:20 +msgid "Move or rename a file, a directory, or a symlink" +msgstr "" +"Verschiebt oder benennt eine Datei, ein Verzeichnis, oder eine symbolische " +"Verknüpfung um" + +#: common-cmds.h:21 +msgid "Fetch from and merge with another repository or a local branch" +msgstr "" +"Fordert Objekte von einem externen Projektarchiv an und führt sie mit einem " +"anderen Projektarchiv oder einem lokalen Zweig zusammen" + +#: common-cmds.h:22 +msgid "Update remote refs along with associated objects" +msgstr "Aktualisiert externe Referenzen mitsamt den verbundenen Objekten" + +#: common-cmds.h:23 +msgid "Forward-port local commits to the updated upstream head" +msgstr "Baut lokale Versionen auf einem aktuellerem externen Zweig neu auf" + +#: common-cmds.h:24 +msgid "Reset current HEAD to the specified state" +msgstr "" +"Setzt die aktuelle Zweigspitze (HEAD) zu einem spezifizierten Zustand zurück" + +#: common-cmds.h:25 +msgid "Remove files from the working tree and from the index" +msgstr "Löscht Dateien im Arbeitszweig und von der Bereitstellung" + +#: common-cmds.h:26 +msgid "Show various types of objects" +msgstr "Zeigt verschiedene Arten von Objekten an" + +#: common-cmds.h:27 +msgid "Show the working tree status" +msgstr "Zeigt den Zustand des Arbeitszweiges an" + +#: common-cmds.h:28 +msgid "Create, list, delete or verify a tag object signed with GPG" +msgstr "" +"Erzeugt, listet auf, löscht oder verifiziert ein mit GPG signiertes " +"Markierungsobjekt" + #: git-am.sh:50 msgid "You need to set your committer info first" msgstr "Du musst zuerst die Informationen des Eintragenden setzen." @@ -3351,8 +4941,7 @@ msgid "" "It does not apply to blobs recorded in its index." msgstr "" "Hast du den Patch per Hand editiert?\n" -"Er kann nicht auf aufgezeichnete Blobs in seiner Bereitstellung angewendet " -"werden." +"Er kann nicht auf die Blobs in seiner 'index' Zeile angewendet werden." #: git-am.sh:163 msgid "Falling back to patching base and 3-way merge..." @@ -3388,7 +4977,7 @@ msgstr "Bitte werde dir klar. --skip oder --abort?" #: git-am.sh:513 msgid "Resolve operation not in progress, we are not resuming." -msgstr "keine Auflösung in Durchführung, wir setzen nicht fort." +msgstr "Es ist keine Auflösung im Gange, es wird nicht fortgesetzt." #: git-am.sh:579 #, sh-format @@ -3399,8 +4988,8 @@ msgstr "" #: git-am.sh:755 msgid "cannot be interactive without stdin connected to a terminal." msgstr "" -"Kann nicht interaktiv sein, ohne das die Standard-Eingabe mit einem Terminal " -"verbunden ist." +"Kann nicht interaktiv sein, ohne dass die Standard-Eingabe mit einem " +"Terminal verbunden ist." #. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a] #. in your translation. The program will only accept English @@ -3437,11 +5026,11 @@ msgstr "nicht erkannte Option: '$arg'" #: git-bisect.sh:99 #, sh-format msgid "'$arg' does not appear to be a valid revision" -msgstr "'$arg' scheint keine gültige Option zu sein" +msgstr "'$arg' scheint keine gültige Version zu sein" #: git-bisect.sh:117 msgid "Bad HEAD - I need a HEAD" -msgstr "Schlechte Zweigspitze (HEAD) - Ich brauche eine Zweigspitze (HEAD)" +msgstr "Ungültige Zweigspitze (HEAD) - Zweigspitze (HEAD) wird benötigt" #: git-bisect.sh:130 #, sh-format @@ -3453,30 +5042,30 @@ msgstr "" #: git-bisect.sh:140 msgid "won't bisect on seeked tree" -msgstr "werde nicht auf gesuchtem Baum halbieren" +msgstr "\"bisect\" auf gesuchtem Zweig nicht möglich" #: git-bisect.sh:144 msgid "Bad HEAD - strange symbolic ref" -msgstr "Schlechte Zweigspitze (HEAD) - merkwürdige symbolische Referenz" +msgstr "Ungültige Zweigspitze (HEAD) - merkwürdige symbolische Referenz" #: git-bisect.sh:189 #, sh-format msgid "Bad bisect_write argument: $state" -msgstr "Schlechtes \"bisect_write\" Argument: $state" +msgstr "Ungültiges \"bisect_write\" Argument: $state" #: git-bisect.sh:218 #, sh-format msgid "Bad rev input: $arg" -msgstr "Schlechte Referenz-Eingabe: $arg" +msgstr "Ungültige Referenz-Eingabe: $arg" #: git-bisect.sh:232 msgid "Please call 'bisect_state' with at least one argument." -msgstr "Bitte rufe 'bisect_state' mit mindestens einem Argument." +msgstr "Bitte rufe 'bisect_state' mit mindestens einem Argument auf." #: git-bisect.sh:244 #, sh-format msgid "Bad rev input: $rev" -msgstr "Schlechte Referenz-Eingabe: $rev" +msgstr "Ungültige Referenz-Eingabe: $rev" #: git-bisect.sh:250 msgid "'git bisect bad' can take only one argument." @@ -3500,7 +5089,7 @@ msgid "" "Could not check out original HEAD '$branch'.\n" "Try 'git bisect reset <commit>'." msgstr "" -"Konnte die originale Zweigspitze (HEAD) '$branch' nicht auschecken.\n" +"Konnte die ursprüngliche Zweigspitze (HEAD) '$branch' nicht auschecken.\n" "Versuche 'git bisect reset <Version>'." #: git-bisect.sh:390 @@ -3526,9 +5115,9 @@ msgid "" "Please, fix them up in the work tree, and then use 'git add/rm <file>'\n" "as appropriate to mark resolution, or use 'git commit -a'." msgstr "" -"\"pull\" ist nicht möglich weil du nicht zusammengeführte Dateien hast.\n" +"\"pull\" ist nicht möglich, weil du nicht zusammengeführte Dateien hast.\n" "Bitte korrigiere dies im Arbeitsbaum und benutze dann 'git add/rm <Datei>'\n" -"wie vorgesehen, um die Auflösung zu markieren, oder benutze 'git commit -a'." +"um die Auflösung entsprechend zu markieren, oder benutze 'git commit -a'." #: git-pull.sh:25 msgid "Pull is not possible because you have unmerged files." @@ -3543,7 +5132,7 @@ msgstr "" #: git-pull.sh:253 msgid "Cannot merge multiple branches into empty head" -msgstr "Kann nicht mehrere Zweige in einen leeren Kopf zusammenführen" +msgstr "Kann nicht mehrere Zweige in einen ungeborenen Zweig zusammenführen" #: git-pull.sh:257 msgid "Cannot rebase onto multiple branches" @@ -3600,7 +5189,7 @@ msgstr "Kein \"stash\" gefunden." #: git-stash.sh:359 #, sh-format msgid "Too many revisions specified: $REV" -msgstr "Zu viele Revisionen spezifiziert: $REV" +msgstr "Zu viele Revisionen angegeben: $REV" #: git-stash.sh:365 #, sh-format @@ -3610,7 +5199,7 @@ msgstr "$reference ist keine gültige Referenz" #: git-stash.sh:393 #, sh-format msgid "'$args' is not a stash-like commit" -msgstr "'$args' ist keine \"stash\"-artiger Version" +msgstr "'$args' ist keine \"stash\"-artige Version" #: git-stash.sh:404 #, sh-format @@ -3623,7 +5212,8 @@ msgstr "unfähig die Bereitstellung zu aktualisieren" #: git-stash.sh:416 msgid "Cannot apply a stash in the middle of a merge" -msgstr "Kann keinen \"stash\" innerhalb einer Zusammenführung anwenden" +msgstr "" +"Kann \"stash\" nicht anwenden, solang eine Zusammenführung im Gange ist" #: git-stash.sh:424 msgid "Conflicts in index. Try without --index." @@ -3653,17 +5243,18 @@ msgstr "Kein Zweigname spezifiziert" #: git-stash.sh:570 msgid "(To restore them type \"git stash apply\")" -msgstr "(Um es wiederherzustellen schreibe \"git stash apply\")" +msgstr "(Zur Wiederherstellung gebe \"git stash apply\" ein)" #: git-submodule.sh:56 #, sh-format msgid "cannot strip one component off url '$remoteurl'" -msgstr "Kann eine Komponente von URL '$remoteurl' nicht abstreifen" +msgstr "Kann eine Komponente von URL '$remoteurl' nicht extrahieren" #: git-submodule.sh:109 #, sh-format msgid "No submodule mapping found in .gitmodules for path '$sm_path'" -msgstr "Keine Unterprojekt-Zuordnung in .gitmodules für Pfad '$sm_path' gefunden" +msgstr "" +"Keine Unterprojekt-Zuordnung in .gitmodules für Pfad '$sm_path' gefunden" #: git-submodule.sh:150 #, sh-format @@ -3674,7 +5265,7 @@ msgstr "Klonen von '$url' in Unterprojekt-Pfad '$sm_path' fehlgeschlagen" #, sh-format msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa" msgstr "" -"Git-Verzeichnis '$a' ist Teil des Unterprojekt-Pfades '$b' oder umgekehrt" +"Git-Verzeichnis '$a' ist Teil des Unterprojekt-Pfades '$b', oder umgekehrt" #: git-submodule.sh:249 #, sh-format @@ -3682,7 +5273,7 @@ msgid "repo URL: '$repo' must be absolute or begin with ./|../" msgstr "repo URL: '$repo' muss absolut sein oder mit ./|../ beginnen" #: git-submodule.sh:266 -#, sh-format +#, sh-format msgid "'$sm_path' already exists in the index" msgstr "'$sm_path' existiert bereits in der Bereitstellung" @@ -3716,110 +5307,137 @@ msgstr "Betrete '$prefix$sm_path'" msgid "Stopping at '$sm_path'; script returned non-zero status." msgstr "Stoppe bei '$sm_path'; Skript gab nicht-Null Status zurück." -#: git-submodule.sh:405 +#: git-submodule.sh:406 #, sh-format msgid "No url found for submodule path '$sm_path' in .gitmodules" msgstr "Keine URL für Unterprojekt-Pfad '$sm_path' in .gitmodules gefunden" -#: git-submodule.sh:414 +#: git-submodule.sh:415 #, sh-format msgid "Failed to register url for submodule path '$sm_path'" -msgstr "Fehler beim Registrieren der URL für Unterprojekt-Pfad '$sm_path'" +msgstr "Registrierung der URL für Unterprojekt-Pfad '$sm_path' fehlgeschlagen" -#: git-submodule.sh:422 +#: git-submodule.sh:417 #, sh-format -msgid "Failed to register update mode for submodule path '$sm_path'" -msgstr "" -"Fehler beim Registrieren des Aktualisierungsmodus für Unterprojekt-Pfad " -"'$sm_path'" +msgid "Submodule '$name' ($url) registered for path '$sm_path'" +msgstr "Unterprojekt '$name' ($url) ist für Pfad '$sm_path' registriert" -#: git-submodule.sh:424 +#: git-submodule.sh:425 #, sh-format -msgid "Submodule '$name' ($url) registered for path '$sm_path'" -msgstr "Unterprojekt '$name' ($url) registriert für Pfad '$sm_path'" +msgid "Failed to register update mode for submodule path '$sm_path'" +msgstr "" +"Registrierung des Aktualisierungsmodus für Unterprojekt-Pfad '$sm_path' " +"fehlgeschlagen" -#: git-submodule.sh:523 +#: git-submodule.sh:524 #, sh-format msgid "" "Submodule path '$sm_path' not initialized\n" "Maybe you want to use 'update --init'?" msgstr "" -"Unterprojekt-Pfad '$sm_path' nicht initialisiert\n" +"Unterprojekt-Pfad '$sm_path' ist nicht initialisiert\n" "Vielleicht möchtest du 'update --init' benutzen?" -#: git-submodule.sh:536 +#: git-submodule.sh:537 #, sh-format msgid "Unable to find current revision in submodule path '$sm_path'" -msgstr "Konnte aktuelle Revision in Unterprojekt-Pfad '$sm_path' nicht finden" +msgstr "Konnte aktuelle Version in Unterprojekt-Pfad '$sm_path' nicht finden" -#: git-submodule.sh:555 +#: git-submodule.sh:556 #, sh-format msgid "Unable to fetch in submodule path '$sm_path'" msgstr "Konnte in Unterprojekt-Pfad '$sm_path' nicht anfordern" -#: git-submodule.sh:569 +#: git-submodule.sh:570 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$sm_path'" msgstr "Neuaufbau von '$sha1' in Unterprojekt-Pfad '$sm_path' nicht möglich" -#: git-submodule.sh:570 +#: git-submodule.sh:571 #, sh-format msgid "Submodule path '$sm_path': rebased into '$sha1'" msgstr "Unterprojekt-Pfad '$sm_path': neu aufgebaut in '$sha1'" -#: git-submodule.sh:575 +#: git-submodule.sh:576 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$sm_path'" -msgstr "Konnte '$sha1' nicht in Unterprojekt-Pfad '$sm_path' zusammenführen" +msgstr "" +"Zusammenführung von '$sha1' in Unterprojekt-Pfad '$sm_path' fehlgeschlagen" -#: git-submodule.sh:576 +#: git-submodule.sh:577 #, sh-format msgid "Submodule path '$sm_path': merged in '$sha1'" msgstr "Unterprojekt-Pfad '$sm_path': zusammengeführt in '$sha1'" -#: git-submodule.sh:581 +#: git-submodule.sh:582 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$sm_path'" msgstr "Konnte '$sha1' in Unterprojekt-Pfad '$sm_path' nicht auschecken." -#: git-submodule.sh:582 +#: git-submodule.sh:583 #, sh-format msgid "Submodule path '$sm_path': checked out '$sha1'" msgstr "Unterprojekt-Pfad: '$sm_path': '$sha1' ausgecheckt" -#: git-submodule.sh:604 git-submodule.sh:927 +#: git-submodule.sh:605 git-submodule.sh:928 #, sh-format msgid "Failed to recurse into submodule path '$sm_path'" msgstr "Fehler bei Rekursion in Unterprojekt-Pfad '$sm_path'" -#: git-submodule.sh:712 +#: git-submodule.sh:713 msgid "--" msgstr "--" -#: git-submodule.sh:770 +#: git-submodule.sh:771 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_src" msgstr " Warnung: $name beinhaltet nicht Version $sha1_src" -#: git-submodule.sh:773 +#: git-submodule.sh:774 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_dst" msgstr " Warnung: $name beinhaltet nicht Version $sha1_dst" -#: git-submodule.sh:776 +#: git-submodule.sh:777 #, sh-format msgid " Warn: $name doesn't contain commits $sha1_src and $sha1_dst" -msgstr " Warnung: $name beinhaltet nich die Versionen $sha1_src und $sha1_dst" +msgstr "" +" Warnung: $name beinhaltet nicht die Versionen $sha1_src und $sha1_dst" -#: git-submodule.sh:801 +#: git-submodule.sh:802 msgid "blob" msgstr "Blob" -#: git-submodule.sh:802 +#: git-submodule.sh:803 msgid "submodule" msgstr "Unterprojekt" -#: git-submodule.sh:973 +#: git-submodule.sh:974 #, sh-format msgid "Synchronizing submodule url for '$name'" msgstr "Synchronisiere Unterprojekt-URL für '$name'" + +#~ msgid "Could not extract email from committer identity." +#~ msgstr "Konnte E-Mail-Adresse des Einreichers nicht extrahieren." + +#~ msgid "cherry-pick" +#~ msgstr "cherry-pick" + +#~ msgid "Please enter the commit message for your changes." +#~ msgstr "Bitte gebe die Versionsbeschreibung für deine Änderungen ein." + +#~ msgid "Too many options specified" +#~ msgstr "Zu viele Optionen angegeben" + +#~ msgid "" +#~ "To prevent you from losing history, non-fast-forward updates were " +#~ "rejected\n" +#~ "Merge the remote changes (e.g. 'git pull') before pushing again. See " +#~ "the\n" +#~ "'Note about fast-forwards' section of 'git push --help' for details.\n" +#~ msgstr "" +#~ "Um dich vor Verlust von Historie zu bewahren, wurden nicht vorzuspulende " +#~ "Aktualisierungen zurückgewiesen.\n" +#~ "Führe die externen Änderungen zusammen (z.B. 'git pull') bevor du erneut " +#~ "versendest. Siehe auch die 'Note about fast-forwards' Sektion von \n" +#~ "'git push --help' für weitere Details.\n" diff --git a/po/git.pot b/po/git.pot index 730cac7b83..81464cca48 100644 --- a/po/git.pot +++ b/po/git.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2012-04-28 20:17+0800\n" +"POT-Creation-Date: 2012-06-02 07:03+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" @@ -35,6 +35,80 @@ msgid "" "or use 'git commit -a'." msgstr "" +#: bundle.c:36 +#, c-format +msgid "'%s' does not look like a v2 bundle file" +msgstr "" + +#: bundle.c:63 +#, c-format +msgid "unrecognized header: %s%s (%d)" +msgstr "" + +#: bundle.c:89 builtin/commit.c:696 +#, c-format +msgid "could not open '%s'" +msgstr "" + +#: bundle.c:140 +msgid "Repository lacks these prerequisite commits:" +msgstr "" + +#: bundle.c:164 sequencer.c:550 sequencer.c:982 builtin/log.c:289 +#: builtin/log.c:720 builtin/log.c:1309 builtin/log.c:1528 builtin/merge.c:347 +#: builtin/shortlog.c:181 +msgid "revision walk setup failed" +msgstr "" + +#: bundle.c:186 +#, c-format +msgid "The bundle contains %d ref" +msgid_plural "The bundle contains %d refs" +msgstr[0] "" +msgstr[1] "" + +#: bundle.c:192 +#, c-format +msgid "The bundle requires this ref" +msgid_plural "The bundle requires these %d refs" +msgstr[0] "" +msgstr[1] "" + +#: bundle.c:290 +msgid "rev-list died" +msgstr "" + +#: bundle.c:296 builtin/log.c:1205 builtin/shortlog.c:284 +#, c-format +msgid "unrecognized argument: %s" +msgstr "" + +#: bundle.c:331 +#, c-format +msgid "ref '%s' is excluded by the rev-list options" +msgstr "" + +#: bundle.c:376 +msgid "Refusing to create empty bundle." +msgstr "" + +#: bundle.c:394 +msgid "Could not spawn pack-objects" +msgstr "" + +#: bundle.c:412 +msgid "pack-objects died" +msgstr "" + +#: bundle.c:415 +#, c-format +msgid "cannot create '%s'" +msgstr "" + +#: bundle.c:437 +msgid "index-pack died" +msgstr "" + #: commit.c:48 #, c-format msgid "could not parse %s" @@ -63,6 +137,73 @@ msgstr "" msgid "failed to close rev-list's stdin: %s" msgstr "" +#: date.c:95 +msgid "in the future" +msgstr "" + +#: date.c:101 +#, c-format +msgid "%lu second ago" +msgid_plural "%lu seconds ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:108 +#, c-format +msgid "%lu minute ago" +msgid_plural "%lu minutes ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:115 +#, c-format +msgid "%lu hour ago" +msgid_plural "%lu hours ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:122 +#, c-format +msgid "%lu day ago" +msgid_plural "%lu days ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:128 +#, c-format +msgid "%lu week ago" +msgid_plural "%lu weeks ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:135 +#, c-format +msgid "%lu month ago" +msgid_plural "%lu months ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:146 +#, c-format +msgid "%lu year" +msgid_plural "%lu years" +msgstr[0] "" +msgstr[1] "" + +#: date.c:149 +#, c-format +msgid "%s, %lu month ago" +msgid_plural "%s, %lu months ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:154 date.c:159 +#, c-format +msgid "%lu year ago" +msgid_plural "%lu years ago" +msgstr[0] "" +msgstr[1] "" + #: diff.c:105 #, c-format msgid " Failed to parse dirstat cut-off percentage '%.*s'\n" @@ -105,7 +246,7 @@ msgid_plural ", %d deletions(-)" msgstr[0] "" msgstr[1] "" -#: diff.c:3435 +#: diff.c:3478 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -124,36 +265,97 @@ msgstr "" msgid "gpg failed to sign the data" msgstr "" -#: grep.c:1280 +#: grep.c:1320 #, c-format msgid "'%s': unable to read %s" msgstr "" -#: grep.c:1297 +#: grep.c:1337 #, c-format msgid "'%s': %s" msgstr "" -#: grep.c:1308 +#: grep.c:1348 #, c-format msgid "'%s': short read %s" msgstr "" -#: help.c:287 +#: help.c:207 +#, c-format +msgid "available git commands in '%s'" +msgstr "" + +#: help.c:214 +msgid "git commands available from elsewhere on your $PATH" +msgstr "" + +#: help.c:270 #, c-format msgid "" "'%s' appears to be a git command, but we were not\n" "able to execute it. Maybe git-%s is broken?" msgstr "" -#: remote.c:1607 +#: help.c:327 +msgid "Uh oh. Your system reports no Git commands at all." +msgstr "" + +#: help.c:349 +#, c-format +msgid "" +"WARNING: You called a Git command named '%s', which does not exist.\n" +"Continuing under the assumption that you meant '%s'" +msgstr "" + +#: help.c:354 +#, c-format +msgid "in %0.1f seconds automatically..." +msgstr "" + +#: help.c:361 +#, c-format +msgid "git: '%s' is not a git command. See 'git --help'." +msgstr "" + +#: help.c:365 +msgid "" +"\n" +"Did you mean this?" +msgid_plural "" +"\n" +"Did you mean one of these?" +msgstr[0] "" +msgstr[1] "" + +#: parse-options.c:493 +msgid "..." +msgstr "" + +#: parse-options.c:511 +#, c-format +msgid "usage: %s" +msgstr "" + +#. TRANSLATORS: the colon here should align with the +#. one in "usage: %s" translation +#: parse-options.c:515 +#, c-format +msgid " or: %s" +msgstr "" + +#: parse-options.c:518 +#, c-format +msgid " %s" +msgstr "" + +#: remote.c:1629 #, c-format msgid "Your branch is ahead of '%s' by %d commit.\n" msgid_plural "Your branch is ahead of '%s' by %d commits.\n" msgstr[0] "" msgstr[1] "" -#: remote.c:1613 +#: remote.c:1635 #, c-format msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n" msgid_plural "" @@ -161,7 +363,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: remote.c:1621 +#: remote.c:1643 #, c-format msgid "" "Your branch and '%s' have diverged,\n" @@ -172,227 +374,239 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: sequencer.c:120 builtin/merge.c:865 builtin/merge.c:978 +#: sequencer.c:121 builtin/merge.c:865 builtin/merge.c:978 #: builtin/merge.c:1088 builtin/merge.c:1098 #, c-format msgid "Could not open '%s' for writing" msgstr "" -#: sequencer.c:122 builtin/merge.c:333 builtin/merge.c:868 +#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:868 #: builtin/merge.c:1090 builtin/merge.c:1103 #, c-format msgid "Could not write to '%s'" msgstr "" -#: sequencer.c:143 +#: sequencer.c:144 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add <paths>' or 'git rm <paths>'" msgstr "" -#: sequencer.c:146 +#: sequencer.c:147 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add <paths>' or 'git rm <paths>'\n" "and commit the result with 'git commit'" msgstr "" -#: sequencer.c:159 sequencer.c:685 sequencer.c:768 +#: sequencer.c:160 sequencer.c:758 sequencer.c:841 #, c-format msgid "Could not write to %s" msgstr "" -#: sequencer.c:162 +#: sequencer.c:163 #, c-format msgid "Error wrapping up %s" msgstr "" -#: sequencer.c:177 +#: sequencer.c:178 msgid "Your local changes would be overwritten by cherry-pick." msgstr "" -#: sequencer.c:179 +#: sequencer.c:180 msgid "Your local changes would be overwritten by revert." msgstr "" -#: sequencer.c:182 +#: sequencer.c:183 msgid "Commit your changes or stash them to proceed." msgstr "" #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:232 +#: sequencer.c:233 #, c-format msgid "%s: Unable to write new index file" msgstr "" -#: sequencer.c:298 +#: sequencer.c:261 +msgid "Could not resolve HEAD commit\n" +msgstr "" + +#: sequencer.c:282 +msgid "Unable to update cache tree\n" +msgstr "" + +#: sequencer.c:324 +#, c-format +msgid "Could not parse commit %s\n" +msgstr "" + +#: sequencer.c:329 +#, c-format +msgid "Could not parse parent commit %s\n" +msgstr "" + +#: sequencer.c:395 msgid "Your index file is unmerged." msgstr "" -#: sequencer.c:301 +#: sequencer.c:398 msgid "You do not have a valid HEAD" msgstr "" -#: sequencer.c:316 +#: sequencer.c:413 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "" -#: sequencer.c:324 +#: sequencer.c:421 #, c-format msgid "Commit %s does not have parent %d" msgstr "" -#: sequencer.c:328 +#: sequencer.c:425 #, c-format msgid "Mainline was specified but commit %s is not a merge." msgstr "" #. TRANSLATORS: The first %s will be "revert" or #. "cherry-pick", the second %s a SHA1 -#: sequencer.c:339 +#: sequencer.c:436 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "" -#: sequencer.c:343 +#: sequencer.c:440 #, c-format msgid "Cannot get commit message for %s" msgstr "" -#: sequencer.c:427 +#: sequencer.c:524 #, c-format msgid "could not revert %s... %s" msgstr "" -#: sequencer.c:428 +#: sequencer.c:525 #, c-format msgid "could not apply %s... %s" msgstr "" -#: sequencer.c:450 sequencer.c:909 builtin/log.c:289 builtin/log.c:719 -#: builtin/log.c:1335 builtin/log.c:1554 builtin/merge.c:347 -#: builtin/shortlog.c:181 -msgid "revision walk setup failed" -msgstr "" - -#: sequencer.c:453 +#: sequencer.c:553 msgid "empty commit set passed" msgstr "" -#: sequencer.c:461 +#: sequencer.c:561 #, c-format msgid "git %s: failed to read the index" msgstr "" -#: sequencer.c:466 +#: sequencer.c:566 #, c-format msgid "git %s: failed to refresh the index" msgstr "" -#: sequencer.c:551 +#: sequencer.c:624 #, c-format msgid "Cannot %s during a %s" msgstr "" -#: sequencer.c:573 +#: sequencer.c:646 #, c-format msgid "Could not parse line %d." msgstr "" -#: sequencer.c:578 +#: sequencer.c:651 msgid "No commits parsed." msgstr "" -#: sequencer.c:591 +#: sequencer.c:664 #, c-format msgid "Could not open %s" msgstr "" -#: sequencer.c:595 +#: sequencer.c:668 #, c-format msgid "Could not read %s." msgstr "" -#: sequencer.c:602 +#: sequencer.c:675 #, c-format msgid "Unusable instruction sheet: %s" msgstr "" -#: sequencer.c:630 +#: sequencer.c:703 #, c-format msgid "Invalid key: %s" msgstr "" -#: sequencer.c:633 +#: sequencer.c:706 #, c-format msgid "Invalid value for %s: %s" msgstr "" -#: sequencer.c:645 +#: sequencer.c:718 #, c-format msgid "Malformed options sheet: %s" msgstr "" -#: sequencer.c:666 +#: sequencer.c:739 msgid "a cherry-pick or revert is already in progress" msgstr "" -#: sequencer.c:667 +#: sequencer.c:740 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "" -#: sequencer.c:671 +#: sequencer.c:744 #, c-format msgid "Could not create sequencer directory %s" msgstr "" -#: sequencer.c:687 sequencer.c:772 +#: sequencer.c:760 sequencer.c:845 #, c-format msgid "Error wrapping up %s." msgstr "" -#: sequencer.c:706 sequencer.c:840 +#: sequencer.c:779 sequencer.c:913 msgid "no cherry-pick or revert in progress" msgstr "" -#: sequencer.c:708 +#: sequencer.c:781 msgid "cannot resolve HEAD" msgstr "" -#: sequencer.c:710 +#: sequencer.c:783 msgid "cannot abort from a branch yet to be born" msgstr "" -#: sequencer.c:732 +#: sequencer.c:805 builtin/apply.c:3697 #, c-format msgid "cannot open %s: %s" msgstr "" -#: sequencer.c:735 +#: sequencer.c:808 #, c-format msgid "cannot read %s: %s" msgstr "" -#: sequencer.c:736 +#: sequencer.c:809 msgid "unexpected end of file" msgstr "" -#: sequencer.c:742 +#: sequencer.c:815 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "" -#: sequencer.c:765 +#: sequencer.c:838 #, c-format msgid "Could not format %s." msgstr "" -#: sequencer.c:927 +#: sequencer.c:1000 msgid "Can't revert as initial commit" msgstr "" -#: sequencer.c:928 +#: sequencer.c:1001 msgid "Can't cherry-pick into empty head" msgstr "" @@ -415,232 +629,241 @@ msgstr "" msgid "Upstream branch '%s' not stored as a remote-tracking branch" msgstr "" -#: wt-status.c:134 +#: wrapper.c:413 +#, c-format +msgid "unable to look up current user in the passwd file: %s" +msgstr "" + +#: wrapper.c:414 +msgid "no such user" +msgstr "" + +#: wt-status.c:135 msgid "Unmerged paths:" msgstr "" -#: wt-status.c:140 wt-status.c:157 +#: wt-status.c:141 wt-status.c:158 #, c-format msgid " (use \"git reset %s <file>...\" to unstage)" msgstr "" -#: wt-status.c:142 wt-status.c:159 +#: wt-status.c:143 wt-status.c:160 msgid " (use \"git rm --cached <file>...\" to unstage)" msgstr "" -#: wt-status.c:143 +#: wt-status.c:144 msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" msgstr "" -#: wt-status.c:151 +#: wt-status.c:152 msgid "Changes to be committed:" msgstr "" -#: wt-status.c:169 +#: wt-status.c:170 msgid "Changes not staged for commit:" msgstr "" -#: wt-status.c:173 +#: wt-status.c:174 msgid " (use \"git add <file>...\" to update what will be committed)" msgstr "" -#: wt-status.c:175 +#: wt-status.c:176 msgid " (use \"git add/rm <file>...\" to update what will be committed)" msgstr "" -#: wt-status.c:176 +#: wt-status.c:177 msgid "" " (use \"git checkout -- <file>...\" to discard changes in working directory)" msgstr "" -#: wt-status.c:178 +#: wt-status.c:179 msgid " (commit or discard the untracked or modified content in submodules)" msgstr "" -#: wt-status.c:187 +#: wt-status.c:188 #, c-format msgid "%s files:" msgstr "" -#: wt-status.c:190 +#: wt-status.c:191 #, c-format msgid " (use \"git %s <file>...\" to include in what will be committed)" msgstr "" -#: wt-status.c:207 +#: wt-status.c:208 msgid "bug" msgstr "" -#: wt-status.c:212 +#: wt-status.c:213 msgid "both deleted:" msgstr "" -#: wt-status.c:213 +#: wt-status.c:214 msgid "added by us:" msgstr "" -#: wt-status.c:214 +#: wt-status.c:215 msgid "deleted by them:" msgstr "" -#: wt-status.c:215 +#: wt-status.c:216 msgid "added by them:" msgstr "" -#: wt-status.c:216 +#: wt-status.c:217 msgid "deleted by us:" msgstr "" -#: wt-status.c:217 +#: wt-status.c:218 msgid "both added:" msgstr "" -#: wt-status.c:218 +#: wt-status.c:219 msgid "both modified:" msgstr "" -#: wt-status.c:248 +#: wt-status.c:249 msgid "new commits, " msgstr "" -#: wt-status.c:250 +#: wt-status.c:251 msgid "modified content, " msgstr "" -#: wt-status.c:252 +#: wt-status.c:253 msgid "untracked content, " msgstr "" -#: wt-status.c:266 +#: wt-status.c:267 #, c-format msgid "new file: %s" msgstr "" -#: wt-status.c:269 +#: wt-status.c:270 #, c-format msgid "copied: %s -> %s" msgstr "" -#: wt-status.c:272 +#: wt-status.c:273 #, c-format msgid "deleted: %s" msgstr "" -#: wt-status.c:275 +#: wt-status.c:276 #, c-format msgid "modified: %s" msgstr "" -#: wt-status.c:278 +#: wt-status.c:279 #, c-format msgid "renamed: %s -> %s" msgstr "" -#: wt-status.c:281 +#: wt-status.c:282 #, c-format msgid "typechange: %s" msgstr "" -#: wt-status.c:284 +#: wt-status.c:285 #, c-format msgid "unknown: %s" msgstr "" -#: wt-status.c:287 +#: wt-status.c:288 #, c-format msgid "unmerged: %s" msgstr "" -#: wt-status.c:290 +#: wt-status.c:291 #, c-format msgid "bug: unhandled diff status %c" msgstr "" -#: wt-status.c:713 +#: wt-status.c:737 msgid "On branch " msgstr "" -#: wt-status.c:720 +#: wt-status.c:744 msgid "Not currently on any branch." msgstr "" -#: wt-status.c:731 +#: wt-status.c:755 msgid "Initial commit" msgstr "" -#: wt-status.c:745 +#: wt-status.c:769 msgid "Untracked" msgstr "" -#: wt-status.c:747 +#: wt-status.c:771 msgid "Ignored" msgstr "" -#: wt-status.c:749 +#: wt-status.c:773 #, c-format msgid "Untracked files not listed%s" msgstr "" -#: wt-status.c:751 +#: wt-status.c:775 msgid " (use -u option to show untracked files)" msgstr "" -#: wt-status.c:757 +#: wt-status.c:781 msgid "No changes" msgstr "" -#: wt-status.c:761 +#: wt-status.c:785 #, c-format msgid "no changes added to commit%s\n" msgstr "" -#: wt-status.c:763 +#: wt-status.c:787 msgid " (use \"git add\" and/or \"git commit -a\")" msgstr "" -#: wt-status.c:765 +#: wt-status.c:789 #, c-format msgid "nothing added to commit but untracked files present%s\n" msgstr "" -#: wt-status.c:767 +#: wt-status.c:791 msgid " (use \"git add\" to track)" msgstr "" -#: wt-status.c:769 wt-status.c:772 wt-status.c:775 +#: wt-status.c:793 wt-status.c:796 wt-status.c:799 #, c-format msgid "nothing to commit%s\n" msgstr "" -#: wt-status.c:770 +#: wt-status.c:794 msgid " (create/copy files and use \"git add\" to track)" msgstr "" -#: wt-status.c:773 +#: wt-status.c:797 msgid " (use -u to show untracked files)" msgstr "" -#: wt-status.c:776 +#: wt-status.c:800 msgid " (working directory clean)" msgstr "" -#: wt-status.c:884 +#: wt-status.c:908 msgid "HEAD (no branch)" msgstr "" -#: wt-status.c:890 +#: wt-status.c:914 msgid "Initial commit on " msgstr "" -#: wt-status.c:905 +#: wt-status.c:929 msgid "behind " msgstr "" -#: wt-status.c:908 wt-status.c:911 +#: wt-status.c:932 wt-status.c:935 msgid "ahead " msgstr "" -#: wt-status.c:913 +#: wt-status.c:937 msgid ", behind " msgstr "" @@ -649,7 +872,7 @@ msgstr "" msgid "unexpected diff status %c" msgstr "" -#: builtin/add.c:67 builtin/commit.c:298 +#: builtin/add.c:67 builtin/commit.c:226 msgid "updating files failed" msgstr "" @@ -739,15 +962,480 @@ msgstr "" msgid "Maybe you wanted to say 'git add .'?\n" msgstr "" -#: builtin/add.c:420 builtin/clean.c:95 builtin/commit.c:358 builtin/mv.c:82 +#: builtin/add.c:420 builtin/clean.c:95 builtin/commit.c:286 builtin/mv.c:82 #: builtin/rm.c:162 msgid "index file corrupt" msgstr "" -#: builtin/add.c:476 builtin/mv.c:229 builtin/rm.c:260 +#: builtin/add.c:476 builtin/apply.c:4108 builtin/mv.c:229 builtin/rm.c:260 msgid "Unable to write new index file" msgstr "" +#: builtin/apply.c:53 +msgid "git apply [options] [<patch>...]" +msgstr "" + +#: builtin/apply.c:106 +#, c-format +msgid "unrecognized whitespace option '%s'" +msgstr "" + +#: builtin/apply.c:121 +#, c-format +msgid "unrecognized whitespace ignore option '%s'" +msgstr "" + +#: builtin/apply.c:815 +#, c-format +msgid "Cannot prepare timestamp regexp %s" +msgstr "" + +#: builtin/apply.c:824 +#, c-format +msgid "regexec returned %d for input: %s" +msgstr "" + +#: builtin/apply.c:905 +#, c-format +msgid "unable to find filename in patch at line %d" +msgstr "" + +#: builtin/apply.c:937 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" +msgstr "" + +#: builtin/apply.c:941 +#, c-format +msgid "git apply: bad git-diff - inconsistent new filename on line %d" +msgstr "" + +#: builtin/apply.c:942 +#, c-format +msgid "git apply: bad git-diff - inconsistent old filename on line %d" +msgstr "" + +#: builtin/apply.c:949 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null on line %d" +msgstr "" + +#: builtin/apply.c:1394 +#, c-format +msgid "recount: unexpected line: %.*s" +msgstr "" + +#: builtin/apply.c:1451 +#, c-format +msgid "patch fragment without header at line %d: %.*s" +msgstr "" + +#: builtin/apply.c:1468 +#, c-format +msgid "" +"git diff header lacks filename information when removing %d leading pathname " +"component (line %d)" +msgid_plural "" +"git diff header lacks filename information when removing %d leading pathname " +"components (line %d)" +msgstr[0] "" +msgstr[1] "" + +#: builtin/apply.c:1628 +msgid "new file depends on old contents" +msgstr "" + +#: builtin/apply.c:1630 +msgid "deleted file still has contents" +msgstr "" + +#: builtin/apply.c:1656 +#, c-format +msgid "corrupt patch at line %d" +msgstr "" + +#: builtin/apply.c:1692 +#, c-format +msgid "new file %s depends on old contents" +msgstr "" + +#: builtin/apply.c:1694 +#, c-format +msgid "deleted file %s still has contents" +msgstr "" + +#: builtin/apply.c:1697 +#, c-format +msgid "** warning: file %s becomes empty but is not deleted" +msgstr "" + +#: builtin/apply.c:1843 +#, c-format +msgid "corrupt binary patch at line %d: %.*s" +msgstr "" + +#. there has to be one hunk (forward hunk) +#: builtin/apply.c:1872 +#, c-format +msgid "unrecognized binary patch at line %d" +msgstr "" + +#: builtin/apply.c:1958 +#, c-format +msgid "patch with only garbage at line %d" +msgstr "" + +#: builtin/apply.c:2048 +#, c-format +msgid "unable to read symlink %s" +msgstr "" + +#: builtin/apply.c:2052 +#, c-format +msgid "unable to open or read %s" +msgstr "" + +#: builtin/apply.c:2123 +msgid "oops" +msgstr "" + +#: builtin/apply.c:2645 +#, c-format +msgid "invalid start of line: '%c'" +msgstr "" + +#: builtin/apply.c:2763 +#, c-format +msgid "Hunk #%d succeeded at %d (offset %d line)." +msgid_plural "Hunk #%d succeeded at %d (offset %d lines)." +msgstr[0] "" +msgstr[1] "" + +#: builtin/apply.c:2775 +#, c-format +msgid "Context reduced to (%ld/%ld) to apply fragment at %d" +msgstr "" + +#: builtin/apply.c:2781 +#, c-format +msgid "" +"while searching for:\n" +"%.*s" +msgstr "" + +#: builtin/apply.c:2800 +#, c-format +msgid "missing binary patch data for '%s'" +msgstr "" + +#: builtin/apply.c:2903 +#, c-format +msgid "binary patch does not apply to '%s'" +msgstr "" + +#: builtin/apply.c:2909 +#, c-format +msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" +msgstr "" + +#: builtin/apply.c:2930 +#, c-format +msgid "patch failed: %s:%ld" +msgstr "" + +#: builtin/apply.c:3045 +#, c-format +msgid "patch %s has been renamed/deleted" +msgstr "" + +#: builtin/apply.c:3052 builtin/apply.c:3069 +#, c-format +msgid "read of %s failed" +msgstr "" + +#: builtin/apply.c:3084 +msgid "removal patch leaves file contents" +msgstr "" + +#: builtin/apply.c:3105 +#, c-format +msgid "%s: already exists in working directory" +msgstr "" + +#: builtin/apply.c:3143 +#, c-format +msgid "%s: has been deleted/renamed" +msgstr "" + +#: builtin/apply.c:3148 builtin/apply.c:3179 +#, c-format +msgid "%s: %s" +msgstr "" + +#: builtin/apply.c:3159 +#, c-format +msgid "%s: does not exist in index" +msgstr "" + +#: builtin/apply.c:3173 +#, c-format +msgid "%s: does not match index" +msgstr "" + +#: builtin/apply.c:3190 +#, c-format +msgid "%s: wrong type" +msgstr "" + +#: builtin/apply.c:3192 +#, c-format +msgid "%s has type %o, expected %o" +msgstr "" + +#: builtin/apply.c:3247 +#, c-format +msgid "%s: already exists in index" +msgstr "" + +#: builtin/apply.c:3267 +#, c-format +msgid "new mode (%o) of %s does not match old mode (%o)" +msgstr "" + +#: builtin/apply.c:3272 +#, c-format +msgid "new mode (%o) of %s does not match old mode (%o) of %s" +msgstr "" + +#: builtin/apply.c:3280 +#, c-format +msgid "%s: patch does not apply" +msgstr "" + +#: builtin/apply.c:3293 +#, c-format +msgid "Checking patch %s..." +msgstr "" + +#: builtin/apply.c:3348 builtin/checkout.c:212 builtin/reset.c:158 +#, c-format +msgid "make_cache_entry failed for path '%s'" +msgstr "" + +#: builtin/apply.c:3491 +#, c-format +msgid "unable to remove %s from index" +msgstr "" + +#: builtin/apply.c:3518 +#, c-format +msgid "corrupt patch for subproject %s" +msgstr "" + +#: builtin/apply.c:3522 +#, c-format +msgid "unable to stat newly created file '%s'" +msgstr "" + +#: builtin/apply.c:3527 +#, c-format +msgid "unable to create backing store for newly created file %s" +msgstr "" + +#: builtin/apply.c:3530 +#, c-format +msgid "unable to add cache entry for %s" +msgstr "" + +#: builtin/apply.c:3563 +#, c-format +msgid "closing file '%s'" +msgstr "" + +#: builtin/apply.c:3612 +#, c-format +msgid "unable to write file '%s' mode %o" +msgstr "" + +#: builtin/apply.c:3668 +#, c-format +msgid "Applied patch %s cleanly." +msgstr "" + +#: builtin/apply.c:3676 +msgid "internal error" +msgstr "" + +#. Say this even without --verbose +#: builtin/apply.c:3679 +#, c-format +msgid "Applying patch %%s with %d reject..." +msgid_plural "Applying patch %%s with %d rejects..." +msgstr[0] "" +msgstr[1] "" + +#: builtin/apply.c:3689 +#, c-format +msgid "truncating .rej filename to %.*s.rej" +msgstr "" + +#: builtin/apply.c:3710 +#, c-format +msgid "Hunk #%d applied cleanly." +msgstr "" + +#: builtin/apply.c:3713 +#, c-format +msgid "Rejected hunk #%d." +msgstr "" + +#: builtin/apply.c:3844 +msgid "unrecognized input" +msgstr "" + +#: builtin/apply.c:3855 +msgid "unable to read index file" +msgstr "" + +#: builtin/apply.c:3970 builtin/apply.c:3973 +msgid "path" +msgstr "" + +#: builtin/apply.c:3971 +msgid "don't apply changes matching the given path" +msgstr "" + +#: builtin/apply.c:3974 +msgid "apply changes matching the given path" +msgstr "" + +#: builtin/apply.c:3976 +msgid "num" +msgstr "" + +#: builtin/apply.c:3977 +msgid "remove <num> leading slashes from traditional diff paths" +msgstr "" + +#: builtin/apply.c:3980 +msgid "ignore additions made by the patch" +msgstr "" + +#: builtin/apply.c:3982 +msgid "instead of applying the patch, output diffstat for the input" +msgstr "" + +#: builtin/apply.c:3986 +msgid "shows number of added and deleted lines in decimal notation" +msgstr "" + +#: builtin/apply.c:3988 +msgid "instead of applying the patch, output a summary for the input" +msgstr "" + +#: builtin/apply.c:3990 +msgid "instead of applying the patch, see if the patch is applicable" +msgstr "" + +#: builtin/apply.c:3992 +msgid "make sure the patch is applicable to the current index" +msgstr "" + +#: builtin/apply.c:3994 +msgid "apply a patch without touching the working tree" +msgstr "" + +#: builtin/apply.c:3996 +msgid "also apply the patch (use with --stat/--summary/--check)" +msgstr "" + +#: builtin/apply.c:3998 +msgid "build a temporary index based on embedded index information" +msgstr "" + +#: builtin/apply.c:4000 +msgid "paths are separated with NUL character" +msgstr "" + +#: builtin/apply.c:4003 +msgid "ensure at least <n> lines of context match" +msgstr "" + +#: builtin/apply.c:4004 +msgid "action" +msgstr "" + +#: builtin/apply.c:4005 +msgid "detect new or modified lines that have whitespace errors" +msgstr "" + +#: builtin/apply.c:4008 builtin/apply.c:4011 +msgid "ignore changes in whitespace when finding context" +msgstr "" + +#: builtin/apply.c:4014 +msgid "apply the patch in reverse" +msgstr "" + +#: builtin/apply.c:4016 +msgid "don't expect at least one line of context" +msgstr "" + +#: builtin/apply.c:4018 +msgid "leave the rejected hunks in corresponding *.rej files" +msgstr "" + +#: builtin/apply.c:4020 +msgid "allow overlapping hunks" +msgstr "" + +#: builtin/apply.c:4021 +msgid "be verbose" +msgstr "" + +#: builtin/apply.c:4023 +msgid "tolerate incorrectly detected missing new-line at the end of file" +msgstr "" + +#: builtin/apply.c:4026 +msgid "do not trust the line counts in the hunk headers" +msgstr "" + +#: builtin/apply.c:4028 +msgid "root" +msgstr "" + +#: builtin/apply.c:4029 +msgid "prepend <root> to all filenames" +msgstr "" + +#: builtin/apply.c:4050 +msgid "--index outside a repository" +msgstr "" + +#: builtin/apply.c:4053 +msgid "--cached outside a repository" +msgstr "" + +#: builtin/apply.c:4069 +#, c-format +msgid "can't open patch '%s'" +msgstr "" + +#: builtin/apply.c:4083 +#, c-format +msgid "squelched %d whitespace error" +msgid_plural "squelched %d whitespace errors" +msgstr[0] "" +msgstr[1] "" + +#: builtin/apply.c:4089 builtin/apply.c:4099 +#, c-format +msgid "%d line adds whitespace errors." +msgid_plural "%d lines add whitespace errors." +msgstr[0] "" +msgstr[1] "" + #: builtin/archive.c:17 #, c-format msgid "could not create archive file '%s'" @@ -783,143 +1471,172 @@ msgstr "" msgid "git archive: expected a flush" msgstr "" -#: builtin/branch.c:137 +#: builtin/branch.c:144 #, c-format msgid "" "deleting branch '%s' that has been merged to\n" " '%s', but not yet merged to HEAD." msgstr "" -#: builtin/branch.c:141 +#: builtin/branch.c:148 #, c-format msgid "" "not deleting branch '%s' that is not yet merged to\n" " '%s', even though it is merged to HEAD." msgstr "" -#. TRANSLATORS: This is "remote " in "remote branch '%s' not found" -#: builtin/branch.c:164 -msgid "remote " -msgstr "" - -#: builtin/branch.c:172 +#: builtin/branch.c:180 msgid "cannot use -a with -d" msgstr "" -#: builtin/branch.c:178 +#: builtin/branch.c:186 msgid "Couldn't look up commit object for HEAD" msgstr "" -#: builtin/branch.c:183 +#: builtin/branch.c:191 #, c-format msgid "Cannot delete the branch '%s' which you are currently on." msgstr "" -#: builtin/branch.c:193 +#: builtin/branch.c:202 #, c-format -msgid "%sbranch '%s' not found." +msgid "remote branch '%s' not found." msgstr "" -#: builtin/branch.c:201 +#: builtin/branch.c:203 +#, c-format +msgid "branch '%s' not found." +msgstr "" + +#: builtin/branch.c:210 #, c-format msgid "Couldn't look up commit object for '%s'" msgstr "" -#: builtin/branch.c:207 +#: builtin/branch.c:216 #, c-format msgid "" "The branch '%s' is not fully merged.\n" "If you are sure you want to delete it, run 'git branch -D %s'." msgstr "" -#: builtin/branch.c:215 +#: builtin/branch.c:225 #, c-format -msgid "Error deleting %sbranch '%s'" +msgid "Error deleting remote branch '%s'" msgstr "" -#: builtin/branch.c:221 +#: builtin/branch.c:226 #, c-format -msgid "Deleted %sbranch %s (was %s).\n" +msgid "Error deleting branch '%s'" msgstr "" -#: builtin/branch.c:226 +#: builtin/branch.c:233 +#, c-format +msgid "Deleted remote branch %s (was %s).\n" +msgstr "" + +#: builtin/branch.c:234 +#, c-format +msgid "Deleted branch %s (was %s).\n" +msgstr "" + +#: builtin/branch.c:239 msgid "Update of config-file failed" msgstr "" -#: builtin/branch.c:324 +#: builtin/branch.c:337 #, c-format msgid "branch '%s' does not point at a commit" msgstr "" -#: builtin/branch.c:396 +#: builtin/branch.c:409 +#, c-format +msgid "[%s: behind %d]" +msgstr "" + +#: builtin/branch.c:411 +#, c-format +msgid "[behind %d]" +msgstr "" + +#: builtin/branch.c:415 #, c-format -msgid "behind %d] " +msgid "[%s: ahead %d]" msgstr "" -#: builtin/branch.c:398 +#: builtin/branch.c:417 #, c-format -msgid "ahead %d] " +msgid "[ahead %d]" msgstr "" -#: builtin/branch.c:400 +#: builtin/branch.c:420 #, c-format -msgid "ahead %d, behind %d] " +msgid "[%s: ahead %d, behind %d]" msgstr "" -#: builtin/branch.c:503 +#: builtin/branch.c:423 +#, c-format +msgid "[ahead %d, behind %d]" +msgstr "" + +#: builtin/branch.c:535 msgid "(no branch)" msgstr "" -#: builtin/branch.c:568 +#: builtin/branch.c:600 msgid "some refs could not be read" msgstr "" -#: builtin/branch.c:581 +#: builtin/branch.c:613 msgid "cannot rename the current branch while not on any." msgstr "" -#: builtin/branch.c:591 +#: builtin/branch.c:623 #, c-format msgid "Invalid branch name: '%s'" msgstr "" -#: builtin/branch.c:606 +#: builtin/branch.c:638 msgid "Branch rename failed" msgstr "" -#: builtin/branch.c:610 +#: builtin/branch.c:642 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "" -#: builtin/branch.c:614 +#: builtin/branch.c:646 #, c-format msgid "Branch renamed to %s, but HEAD is not updated!" msgstr "" -#: builtin/branch.c:621 +#: builtin/branch.c:653 msgid "Branch is renamed, but update of config-file failed" msgstr "" -#: builtin/branch.c:636 +#: builtin/branch.c:668 #, c-format msgid "malformed object name %s" msgstr "" -#: builtin/branch.c:660 +#: builtin/branch.c:692 #, c-format -msgid "could not write branch description template: %s\n" +msgid "could not write branch description template: %s" msgstr "" -#: builtin/branch.c:750 +#: builtin/branch.c:783 msgid "Failed to resolve HEAD as a valid ref." msgstr "" -#: builtin/branch.c:755 builtin/clone.c:558 +#: builtin/branch.c:788 builtin/clone.c:558 msgid "HEAD not found below refs/heads!" msgstr "" -#: builtin/branch.c:813 +#: builtin/branch.c:808 +msgid "--column and --verbose are incompatible" +msgstr "" + +#: builtin/branch.c:857 msgid "-a and -r options to 'git branch' do not make sense with a branch name" msgstr "" @@ -966,11 +1683,6 @@ msgstr "" msgid "Unable to add merge result for '%s'" msgstr "" -#: builtin/checkout.c:212 builtin/reset.c:158 -#, c-format -msgid "make_cache_entry failed for path '%s'" -msgstr "" - #: builtin/checkout.c:234 builtin/checkout.c:392 msgid "corrupt index file" msgstr "" @@ -1058,96 +1770,96 @@ msgid "" "\n" msgstr "" -#: builtin/checkout.c:693 +#: builtin/checkout.c:694 msgid "internal error in revision walk" msgstr "" -#: builtin/checkout.c:697 +#: builtin/checkout.c:698 msgid "Previous HEAD position was" msgstr "" -#: builtin/checkout.c:723 +#: builtin/checkout.c:724 msgid "You are on a branch yet to be born" msgstr "" #. case (1) -#: builtin/checkout.c:854 +#: builtin/checkout.c:855 #, c-format msgid "invalid reference: %s" msgstr "" #. case (1): want a tree -#: builtin/checkout.c:893 +#: builtin/checkout.c:894 #, c-format msgid "reference is not a tree: %s" msgstr "" -#: builtin/checkout.c:973 +#: builtin/checkout.c:974 msgid "-B cannot be used with -b" msgstr "" -#: builtin/checkout.c:982 +#: builtin/checkout.c:983 msgid "--patch is incompatible with all other options" msgstr "" -#: builtin/checkout.c:985 +#: builtin/checkout.c:986 msgid "--detach cannot be used with -b/-B/--orphan" msgstr "" -#: builtin/checkout.c:987 +#: builtin/checkout.c:988 msgid "--detach cannot be used with -t" msgstr "" -#: builtin/checkout.c:993 +#: builtin/checkout.c:994 msgid "--track needs a branch name" msgstr "" -#: builtin/checkout.c:1000 +#: builtin/checkout.c:1001 msgid "Missing branch name; try -b" msgstr "" -#: builtin/checkout.c:1006 +#: builtin/checkout.c:1007 msgid "--orphan and -b|-B are mutually exclusive" msgstr "" -#: builtin/checkout.c:1008 +#: builtin/checkout.c:1009 msgid "--orphan cannot be used with -t" msgstr "" -#: builtin/checkout.c:1018 +#: builtin/checkout.c:1019 msgid "git checkout: -f and -m are incompatible" msgstr "" -#: builtin/checkout.c:1052 +#: builtin/checkout.c:1053 msgid "invalid path specification" msgstr "" -#: builtin/checkout.c:1060 +#: builtin/checkout.c:1061 #, c-format msgid "" "git checkout: updating paths is incompatible with switching branches.\n" "Did you intend to checkout '%s' which can not be resolved as commit?" msgstr "" -#: builtin/checkout.c:1062 +#: builtin/checkout.c:1063 msgid "git checkout: updating paths is incompatible with switching branches." msgstr "" -#: builtin/checkout.c:1067 +#: builtin/checkout.c:1068 msgid "git checkout: --detach does not take a path argument" msgstr "" -#: builtin/checkout.c:1070 +#: builtin/checkout.c:1071 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." msgstr "" -#: builtin/checkout.c:1089 +#: builtin/checkout.c:1090 msgid "Cannot switch branch to a non-commit." msgstr "" -#: builtin/checkout.c:1092 +#: builtin/checkout.c:1093 msgid "--ours/--theirs is incompatible with switching branches." msgstr "" @@ -1316,7 +2028,11 @@ msgstr "" msgid "You appear to have cloned an empty repository." msgstr "" -#: builtin/commit.c:42 +#: builtin/column.c:51 +msgid "--command must be the first argument" +msgstr "" + +#: builtin/commit.c:43 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -1330,14 +2046,14 @@ msgid "" " git commit --amend --reset-author\n" msgstr "" -#: builtin/commit.c:54 +#: builtin/commit.c:55 msgid "" "You asked to amend the most recent commit, but doing so would make\n" "it empty. You can repeat your command with --allow-empty, or you can\n" "remove the commit entirely with \"git reset HEAD^\".\n" msgstr "" -#: builtin/commit.c:59 +#: builtin/commit.c:60 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -1347,278 +2063,277 @@ msgid "" "Otherwise, please use 'git reset'\n" msgstr "" -#: builtin/commit.c:205 builtin/reset.c:33 -msgid "merge" -msgstr "" - -#: builtin/commit.c:208 -msgid "cherry-pick" -msgstr "" - -#: builtin/commit.c:325 +#: builtin/commit.c:253 msgid "failed to unpack HEAD tree object" msgstr "" -#: builtin/commit.c:367 +#: builtin/commit.c:295 msgid "unable to create temporary index" msgstr "" -#: builtin/commit.c:373 +#: builtin/commit.c:301 msgid "interactive add failed" msgstr "" -#: builtin/commit.c:406 builtin/commit.c:427 builtin/commit.c:473 +#: builtin/commit.c:334 builtin/commit.c:355 builtin/commit.c:405 msgid "unable to write new_index file" msgstr "" -#: builtin/commit.c:457 -#, c-format -msgid "cannot do a partial commit during a %s." +#: builtin/commit.c:386 +msgid "cannot do a partial commit during a merge." msgstr "" -#: builtin/commit.c:466 +#: builtin/commit.c:388 +msgid "cannot do a partial commit during a cherry-pick." +msgstr "" + +#: builtin/commit.c:398 msgid "cannot read the index" msgstr "" -#: builtin/commit.c:486 +#: builtin/commit.c:418 msgid "unable to write temporary index file" msgstr "" -#: builtin/commit.c:561 builtin/commit.c:567 +#: builtin/commit.c:493 builtin/commit.c:499 #, c-format msgid "invalid commit: %s" msgstr "" -#: builtin/commit.c:590 +#: builtin/commit.c:522 msgid "malformed --author parameter" msgstr "" -#: builtin/commit.c:651 +#: builtin/commit.c:582 #, c-format msgid "Malformed ident string: '%s'" msgstr "" -#: builtin/commit.c:689 builtin/commit.c:722 builtin/commit.c:1033 +#: builtin/commit.c:620 builtin/commit.c:653 builtin/commit.c:967 #, c-format msgid "could not lookup commit %s" msgstr "" -#: builtin/commit.c:701 builtin/shortlog.c:296 +#: builtin/commit.c:632 builtin/shortlog.c:296 #, c-format msgid "(reading log message from standard input)\n" msgstr "" -#: builtin/commit.c:703 +#: builtin/commit.c:634 msgid "could not read log from standard input" msgstr "" -#: builtin/commit.c:707 +#: builtin/commit.c:638 #, c-format msgid "could not read log file '%s'" msgstr "" -#: builtin/commit.c:713 +#: builtin/commit.c:644 msgid "commit has empty message" msgstr "" -#: builtin/commit.c:729 +#: builtin/commit.c:660 msgid "could not read MERGE_MSG" msgstr "" -#: builtin/commit.c:733 +#: builtin/commit.c:664 msgid "could not read SQUASH_MSG" msgstr "" -#: builtin/commit.c:737 +#: builtin/commit.c:668 #, c-format msgid "could not read '%s'" msgstr "" -#: builtin/commit.c:765 -#, c-format -msgid "could not open '%s'" -msgstr "" - -#: builtin/commit.c:789 +#: builtin/commit.c:720 msgid "could not write commit template" msgstr "" -#: builtin/commit.c:799 +#: builtin/commit.c:731 #, c-format msgid "" "\n" -"It looks like you may be committing a %s.\n" +"It looks like you may be committing a merge.\n" "If this is not correct, please remove the file\n" "\t%s\n" "and try again.\n" msgstr "" -#: builtin/commit.c:812 -msgid "Please enter the commit message for your changes." +#: builtin/commit.c:736 +#, c-format +msgid "" +"\n" +"It looks like you may be committing a cherry-pick.\n" +"If this is not correct, please remove the file\n" +"\t%s\n" +"and try again.\n" msgstr "" -#: builtin/commit.c:815 +#: builtin/commit.c:748 msgid "" -" Lines starting\n" +"Please enter the commit message for your changes. Lines starting\n" "with '#' will be ignored, and an empty message aborts the commit.\n" msgstr "" -#: builtin/commit.c:820 +#: builtin/commit.c:753 msgid "" -" Lines starting\n" +"Please enter the commit message for your changes. Lines starting\n" "with '#' will be kept; you may remove them yourself if you want to.\n" "An empty message aborts the commit.\n" msgstr "" -#: builtin/commit.c:832 +#: builtin/commit.c:766 #, c-format msgid "%sAuthor: %s" msgstr "" -#: builtin/commit.c:839 +#: builtin/commit.c:773 #, c-format msgid "%sCommitter: %s" msgstr "" -#: builtin/commit.c:859 +#: builtin/commit.c:793 msgid "Cannot read index" msgstr "" -#: builtin/commit.c:896 +#: builtin/commit.c:830 msgid "Error building trees" msgstr "" -#: builtin/commit.c:911 builtin/tag.c:357 +#: builtin/commit.c:845 builtin/tag.c:361 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "" -#: builtin/commit.c:1008 +#: builtin/commit.c:942 #, c-format msgid "No existing author found with '%s'" msgstr "" -#: builtin/commit.c:1023 builtin/commit.c:1217 +#: builtin/commit.c:957 builtin/commit.c:1157 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "" -#: builtin/commit.c:1063 +#: builtin/commit.c:997 msgid "Using both --reset-author and --author does not make sense" msgstr "" -#: builtin/commit.c:1074 +#: builtin/commit.c:1008 msgid "You have nothing to amend." msgstr "" -#: builtin/commit.c:1076 -#, c-format -msgid "You are in the middle of a %s -- cannot amend." +#: builtin/commit.c:1011 +msgid "You are in the middle of a merge -- cannot amend." +msgstr "" + +#: builtin/commit.c:1013 +msgid "You are in the middle of a cherry-pick -- cannot amend." msgstr "" -#: builtin/commit.c:1078 +#: builtin/commit.c:1016 msgid "Options --squash and --fixup cannot be used together" msgstr "" -#: builtin/commit.c:1088 +#: builtin/commit.c:1026 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "" -#: builtin/commit.c:1090 +#: builtin/commit.c:1028 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "" -#: builtin/commit.c:1098 +#: builtin/commit.c:1036 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "" -#: builtin/commit.c:1115 +#: builtin/commit.c:1053 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "" -#: builtin/commit.c:1117 +#: builtin/commit.c:1055 msgid "No paths with --include/--only does not make sense." msgstr "" -#: builtin/commit.c:1119 +#: builtin/commit.c:1057 msgid "Clever... amending the last one with dirty index." msgstr "" -#: builtin/commit.c:1121 +#: builtin/commit.c:1059 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "" -#: builtin/commit.c:1131 builtin/tag.c:556 +#: builtin/commit.c:1069 builtin/tag.c:577 #, c-format msgid "Invalid cleanup mode %s" msgstr "" -#: builtin/commit.c:1136 +#: builtin/commit.c:1074 msgid "Paths with -a does not make sense." msgstr "" -#: builtin/commit.c:1315 +#: builtin/commit.c:1257 msgid "couldn't look up newly created commit" msgstr "" -#: builtin/commit.c:1317 +#: builtin/commit.c:1259 msgid "could not parse newly created commit" msgstr "" -#: builtin/commit.c:1358 +#: builtin/commit.c:1300 msgid "detached HEAD" msgstr "" -#: builtin/commit.c:1360 +#: builtin/commit.c:1302 msgid " (root-commit)" msgstr "" -#: builtin/commit.c:1450 +#: builtin/commit.c:1446 msgid "could not parse HEAD commit" msgstr "" -#: builtin/commit.c:1487 builtin/merge.c:509 +#: builtin/commit.c:1484 builtin/merge.c:509 #, c-format msgid "could not open '%s' for reading" msgstr "" -#: builtin/commit.c:1494 +#: builtin/commit.c:1491 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "" -#: builtin/commit.c:1501 +#: builtin/commit.c:1498 msgid "could not read MERGE_MODE" msgstr "" -#: builtin/commit.c:1520 +#: builtin/commit.c:1517 #, c-format msgid "could not read commit message: %s" msgstr "" -#: builtin/commit.c:1534 +#: builtin/commit.c:1531 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "" -#: builtin/commit.c:1539 +#: builtin/commit.c:1536 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "" -#: builtin/commit.c:1554 builtin/merge.c:936 builtin/merge.c:961 +#: builtin/commit.c:1551 builtin/merge.c:936 builtin/merge.c:961 msgid "failed to write commit object" msgstr "" -#: builtin/commit.c:1575 +#: builtin/commit.c:1572 msgid "cannot lock HEAD ref" msgstr "" -#: builtin/commit.c:1579 +#: builtin/commit.c:1576 msgid "cannot update HEAD ref" msgstr "" -#: builtin/commit.c:1590 +#: builtin/commit.c:1587 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -1815,19 +2530,19 @@ msgstr "" #: builtin/fetch.c:549 #, c-format -msgid " (%s will become dangling)\n" +msgid " (%s will become dangling)" msgstr "" #: builtin/fetch.c:550 #, c-format -msgid " (%s has become dangling)\n" +msgid " (%s has become dangling)" msgstr "" #: builtin/fetch.c:557 msgid "[deleted]" msgstr "" -#: builtin/fetch.c:558 +#: builtin/fetch.c:558 builtin/remote.c:1055 msgid "(none)" msgstr "" @@ -1856,7 +2571,7 @@ msgstr "" msgid "Fetching %s\n" msgstr "" -#: builtin/fetch.c:890 +#: builtin/fetch.c:890 builtin/remote.c:100 #, c-format msgid "Could not fetch %s" msgstr "" @@ -1893,28 +2608,24 @@ msgstr "" msgid "Invalid %s: '%s'" msgstr "" -#: builtin/gc.c:78 -msgid "Too many options specified" -msgstr "" - -#: builtin/gc.c:103 +#: builtin/gc.c:90 #, c-format msgid "insanely long object directory %.*s" msgstr "" -#: builtin/gc.c:223 +#: builtin/gc.c:221 #, c-format msgid "Auto packing the repository for optimum performance.\n" msgstr "" -#: builtin/gc.c:226 +#: builtin/gc.c:224 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" "run \"git gc\" manually. See \"git help gc\" for more information.\n" msgstr "" -#: builtin/gc.c:256 +#: builtin/gc.c:251 msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "" @@ -1949,35 +2660,335 @@ msgstr "" msgid "cannot open '%s'" msgstr "" -#: builtin/grep.c:888 +#: builtin/grep.c:885 msgid "no pattern given." msgstr "" -#: builtin/grep.c:902 +#: builtin/grep.c:899 #, c-format msgid "bad object %s" msgstr "" -#: builtin/grep.c:943 +#: builtin/grep.c:940 msgid "--open-files-in-pager only works on the worktree" msgstr "" -#: builtin/grep.c:966 +#: builtin/grep.c:963 msgid "--cached or --untracked cannot be used with --no-index." msgstr "" -#: builtin/grep.c:971 +#: builtin/grep.c:968 msgid "--no-index or --untracked cannot be used with revs." msgstr "" -#: builtin/grep.c:974 +#: builtin/grep.c:971 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "" -#: builtin/grep.c:982 +#: builtin/grep.c:979 msgid "both --cached and trees are given." msgstr "" +#: builtin/help.c:59 +#, c-format +msgid "unrecognized help format '%s'" +msgstr "" + +#: builtin/help.c:87 +msgid "Failed to start emacsclient." +msgstr "" + +#: builtin/help.c:100 +msgid "Failed to parse emacsclient version." +msgstr "" + +#: builtin/help.c:108 +#, c-format +msgid "emacsclient version '%d' too old (< 22)." +msgstr "" + +#: builtin/help.c:126 builtin/help.c:154 builtin/help.c:163 builtin/help.c:171 +#, c-format +msgid "failed to exec '%s': %s" +msgstr "" + +#: builtin/help.c:211 +#, c-format +msgid "" +"'%s': path for unsupported man viewer.\n" +"Please consider using 'man.<tool>.cmd' instead." +msgstr "" + +#: builtin/help.c:223 +#, c-format +msgid "" +"'%s': cmd for supported man viewer.\n" +"Please consider using 'man.<tool>.path' instead." +msgstr "" + +#: builtin/help.c:287 +msgid "The most commonly used git commands are:" +msgstr "" + +#: builtin/help.c:355 +#, c-format +msgid "'%s': unknown man viewer." +msgstr "" + +#: builtin/help.c:372 +msgid "no man viewer handled the request" +msgstr "" + +#: builtin/help.c:380 +msgid "no info viewer handled the request" +msgstr "" + +#: builtin/help.c:391 +#, c-format +msgid "'%s': not a documentation directory." +msgstr "" + +#: builtin/help.c:432 builtin/help.c:439 +#, c-format +msgid "usage: %s%s" +msgstr "" + +#: builtin/help.c:453 +#, c-format +msgid "`git %s' is aliased to `%s'" +msgstr "" + +#: builtin/index-pack.c:169 +#, c-format +msgid "object type mismatch at %s" +msgstr "" + +#: builtin/index-pack.c:189 +msgid "object of unexpected type" +msgstr "" + +#: builtin/index-pack.c:226 +#, c-format +msgid "cannot fill %d byte" +msgid_plural "cannot fill %d bytes" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:236 +msgid "early EOF" +msgstr "" + +#: builtin/index-pack.c:237 +msgid "read error on input" +msgstr "" + +#: builtin/index-pack.c:249 +msgid "used more bytes than were available" +msgstr "" + +#: builtin/index-pack.c:256 +msgid "pack too large for current definition of off_t" +msgstr "" + +#: builtin/index-pack.c:272 +#, c-format +msgid "unable to create '%s'" +msgstr "" + +#: builtin/index-pack.c:277 +#, c-format +msgid "cannot open packfile '%s'" +msgstr "" + +#: builtin/index-pack.c:291 +msgid "pack signature mismatch" +msgstr "" + +#: builtin/index-pack.c:311 +#, c-format +msgid "pack has bad object at offset %lu: %s" +msgstr "" + +#: builtin/index-pack.c:405 +#, c-format +msgid "inflate returned %d" +msgstr "" + +#: builtin/index-pack.c:450 +msgid "offset value overflow for delta base object" +msgstr "" + +#: builtin/index-pack.c:458 +msgid "delta base offset is out of bound" +msgstr "" + +#: builtin/index-pack.c:466 +#, c-format +msgid "unknown object type %d" +msgstr "" + +#: builtin/index-pack.c:495 +msgid "cannot pread pack file" +msgstr "" + +#: builtin/index-pack.c:497 +#, c-format +msgid "premature end of pack file, %lu byte missing" +msgid_plural "premature end of pack file, %lu bytes missing" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:510 +msgid "serious inflate inconsistency" +msgstr "" + +#: builtin/index-pack.c:583 +#, c-format +msgid "cannot read existing object %s" +msgstr "" + +#: builtin/index-pack.c:586 +#, c-format +msgid "SHA1 COLLISION FOUND WITH %s !" +msgstr "" + +#: builtin/index-pack.c:598 +#, c-format +msgid "invalid blob object %s" +msgstr "" + +#: builtin/index-pack.c:610 +#, c-format +msgid "invalid %s" +msgstr "" + +#: builtin/index-pack.c:612 +msgid "Error in object" +msgstr "" + +#: builtin/index-pack.c:614 +#, c-format +msgid "Not all child objects of %s are reachable" +msgstr "" + +#: builtin/index-pack.c:687 builtin/index-pack.c:713 +msgid "failed to apply delta" +msgstr "" + +#: builtin/index-pack.c:850 +msgid "Receiving objects" +msgstr "" + +#: builtin/index-pack.c:850 +msgid "Indexing objects" +msgstr "" + +#: builtin/index-pack.c:872 +msgid "pack is corrupted (SHA1 mismatch)" +msgstr "" + +#: builtin/index-pack.c:877 +msgid "cannot fstat packfile" +msgstr "" + +#: builtin/index-pack.c:880 +msgid "pack has junk at the end" +msgstr "" + +#: builtin/index-pack.c:903 +msgid "Resolving deltas" +msgstr "" + +#: builtin/index-pack.c:954 +msgid "confusion beyond insanity" +msgstr "" + +#: builtin/index-pack.c:973 +#, c-format +msgid "pack has %d unresolved delta" +msgid_plural "pack has %d unresolved deltas" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:998 +#, c-format +msgid "unable to deflate appended object (%d)" +msgstr "" + +#: builtin/index-pack.c:1077 +#, c-format +msgid "local object %s is corrupt" +msgstr "" + +#: builtin/index-pack.c:1101 +msgid "error while closing pack file" +msgstr "" + +#: builtin/index-pack.c:1114 +#, c-format +msgid "cannot write keep file '%s'" +msgstr "" + +#: builtin/index-pack.c:1122 +#, c-format +msgid "cannot close written keep file '%s'" +msgstr "" + +#: builtin/index-pack.c:1135 +msgid "cannot store pack file" +msgstr "" + +#: builtin/index-pack.c:1146 +msgid "cannot store index file" +msgstr "" + +#: builtin/index-pack.c:1247 +#, c-format +msgid "Cannot open existing pack file '%s'" +msgstr "" + +#: builtin/index-pack.c:1249 +#, c-format +msgid "Cannot open existing pack idx file for '%s'" +msgstr "" + +#: builtin/index-pack.c:1296 +#, c-format +msgid "non delta: %d object" +msgid_plural "non delta: %d objects" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:1303 +#, c-format +msgid "chain length = %d: %lu object" +msgid_plural "chain length = %d: %lu objects" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:1330 +msgid "Cannot come back to cwd" +msgstr "" + +#: builtin/index-pack.c:1374 builtin/index-pack.c:1377 +#: builtin/index-pack.c:1389 builtin/index-pack.c:1393 +#, c-format +msgid "bad %s" +msgstr "" + +#: builtin/index-pack.c:1407 +msgid "--fix-thin cannot be used without --stdin" +msgstr "" + +#: builtin/index-pack.c:1411 builtin/index-pack.c:1421 +#, c-format +msgid "packfile name '%s' does not end with '.pack'" +msgstr "" + +#: builtin/index-pack.c:1430 +msgid "--verify with no packfile name given" +msgstr "" + #: builtin/init-db.c:35 #, c-format msgid "Could not make %s writable by group" @@ -2139,90 +3150,81 @@ msgstr "" msgid "format.headers without value" msgstr "" -#: builtin/log.c:675 +#: builtin/log.c:676 msgid "name of output directory is too long" msgstr "" -#: builtin/log.c:686 +#: builtin/log.c:687 #, c-format msgid "Cannot open patch file %s" msgstr "" -#: builtin/log.c:700 +#: builtin/log.c:701 msgid "Need exactly one range." msgstr "" -#: builtin/log.c:708 +#: builtin/log.c:709 msgid "Not a range." msgstr "" -#: builtin/log.c:745 -msgid "Could not extract email from committer identity." -msgstr "" - -#: builtin/log.c:791 +#: builtin/log.c:786 msgid "Cover letter needs email format" msgstr "" -#: builtin/log.c:885 +#: builtin/log.c:859 #, c-format msgid "insane in-reply-to: %s" msgstr "" -#: builtin/log.c:958 +#: builtin/log.c:932 msgid "Two output directories?" msgstr "" -#: builtin/log.c:1179 +#: builtin/log.c:1153 #, c-format msgid "bogus committer info %s" msgstr "" -#: builtin/log.c:1224 +#: builtin/log.c:1198 msgid "-n and -k are mutually exclusive." msgstr "" -#: builtin/log.c:1226 +#: builtin/log.c:1200 msgid "--subject-prefix and -k are mutually exclusive." msgstr "" -#: builtin/log.c:1231 builtin/shortlog.c:284 -#, c-format -msgid "unrecognized argument: %s" -msgstr "" - -#: builtin/log.c:1234 +#: builtin/log.c:1208 msgid "--name-only does not make sense" msgstr "" -#: builtin/log.c:1236 +#: builtin/log.c:1210 msgid "--name-status does not make sense" msgstr "" -#: builtin/log.c:1238 +#: builtin/log.c:1212 msgid "--check does not make sense" msgstr "" -#: builtin/log.c:1261 +#: builtin/log.c:1235 msgid "standard output, or directory, which one?" msgstr "" -#: builtin/log.c:1263 +#: builtin/log.c:1237 #, c-format msgid "Could not create directory '%s'" msgstr "" -#: builtin/log.c:1416 +#: builtin/log.c:1390 msgid "Failed to create output files" msgstr "" -#: builtin/log.c:1520 +#: builtin/log.c:1494 #, c-format msgid "" "Could not find a tracked remote branch, please specify <upstream> manually.\n" msgstr "" -#: builtin/log.c:1536 builtin/log.c:1538 builtin/log.c:1550 +#: builtin/log.c:1510 builtin/log.c:1512 builtin/log.c:1524 #, c-format msgid "Unknown commit %s" msgstr "" @@ -2535,7 +3537,7 @@ msgstr "" msgid "Renaming %s to %s\n" msgstr "" -#: builtin/mv.c:215 +#: builtin/mv.c:215 builtin/remote.c:731 #, c-format msgid "renaming '%s' failed" msgstr "" @@ -2559,7 +3561,7 @@ msgstr "" msgid "failed to finish 'show' for object '%s'" msgstr "" -#: builtin/notes.c:175 builtin/tag.c:343 +#: builtin/notes.c:175 builtin/tag.c:347 #, c-format msgid "could not create file '%s'" msgstr "" @@ -2582,12 +3584,12 @@ msgstr "" msgid "The note contents has been left in %s" msgstr "" -#: builtin/notes.c:251 builtin/tag.c:521 +#: builtin/notes.c:251 builtin/tag.c:542 #, c-format msgid "cannot read '%s'" msgstr "" -#: builtin/notes.c:253 builtin/tag.c:524 +#: builtin/notes.c:253 builtin/tag.c:545 #, c-format msgid "could not open or read '%s'" msgstr "" @@ -2595,7 +3597,7 @@ msgstr "" #: builtin/notes.c:272 builtin/notes.c:445 builtin/notes.c:447 #: builtin/notes.c:507 builtin/notes.c:561 builtin/notes.c:644 #: builtin/notes.c:649 builtin/notes.c:724 builtin/notes.c:766 -#: builtin/notes.c:968 builtin/reset.c:293 builtin/tag.c:537 +#: builtin/notes.c:968 builtin/reset.c:293 builtin/tag.c:558 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "" @@ -2687,27 +3689,27 @@ msgstr "" msgid "Object %s has no note\n" msgstr "" -#: builtin/notes.c:1103 +#: builtin/notes.c:1103 builtin/remote.c:1598 #, c-format msgid "Unknown subcommand: %s" msgstr "" -#: builtin/pack-objects.c:2310 +#: builtin/pack-objects.c:2337 #, c-format msgid "unsupported index version %s" msgstr "" -#: builtin/pack-objects.c:2314 +#: builtin/pack-objects.c:2341 #, c-format msgid "bad index version '%s'" msgstr "" -#: builtin/pack-objects.c:2322 +#: builtin/pack-objects.c:2364 #, c-format msgid "option %s does not accept negative form" msgstr "" -#: builtin/pack-objects.c:2326 +#: builtin/pack-objects.c:2368 #, c-format msgid "unable to parse value '%s' for option %s" msgstr "" @@ -2720,7 +3722,28 @@ msgstr "" msgid "--delete only accepts plain target ref names" msgstr "" -#: builtin/push.c:84 +#: builtin/push.c:99 +msgid "" +"\n" +"To choose either option permanently, see push.default in 'git help config'." +msgstr "" + +#: builtin/push.c:102 +#, c-format +msgid "" +"The upstream branch of your current branch does not match\n" +"the name of your current branch. To push to the upstream branch\n" +"on the remote, use\n" +"\n" +" git push %s HEAD:%s\n" +"\n" +"To push to the branch of the same name on the remote, use\n" +"\n" +" git push %s %s\n" +"%s" +msgstr "" + +#: builtin/push.c:121 #, c-format msgid "" "You are not currently on a branch.\n" @@ -2730,7 +3753,7 @@ msgid "" " git push %s HEAD:<name-of-remote-branch>\n" msgstr "" -#: builtin/push.c:91 +#: builtin/push.c:128 #, c-format msgid "" "The current branch %s has no upstream branch.\n" @@ -2739,12 +3762,12 @@ msgid "" " git push --set-upstream %s %s\n" msgstr "" -#: builtin/push.c:99 +#: builtin/push.c:136 #, c-format msgid "The current branch %s has multiple upstream branches, refusing to push." msgstr "" -#: builtin/push.c:102 +#: builtin/push.c:139 #, c-format msgid "" "You are pushing to remote '%s', which is not the upstream of\n" @@ -2752,12 +3775,12 @@ msgid "" "to update which remote branch." msgstr "" -#: builtin/push.c:131 +#: builtin/push.c:174 msgid "" "You didn't specify any refspecs to push, and push.default is \"nothing\"." msgstr "" -#: builtin/push.c:138 +#: builtin/push.c:181 msgid "" "Updates were rejected because the tip of your current branch is behind\n" "its remote counterpart. Merge the remote changes (e.g. 'git pull')\n" @@ -2765,7 +3788,7 @@ msgid "" "See the 'Note about fast-forwards' in 'git push --help' for details." msgstr "" -#: builtin/push.c:144 +#: builtin/push.c:187 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. If you did not intend to push that branch, you may want to\n" @@ -2773,7 +3796,7 @@ msgid "" "variable to 'current' or 'upstream' to push only the current branch." msgstr "" -#: builtin/push.c:150 +#: builtin/push.c:193 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. Check out this branch and merge the remote changes\n" @@ -2781,22 +3804,22 @@ msgid "" "See the 'Note about fast-forwards' in 'git push --help' for details." msgstr "" -#: builtin/push.c:190 +#: builtin/push.c:233 #, c-format msgid "Pushing to %s\n" msgstr "" -#: builtin/push.c:194 +#: builtin/push.c:237 #, c-format msgid "failed to push some refs to '%s'" msgstr "" -#: builtin/push.c:226 +#: builtin/push.c:269 #, c-format msgid "bad repository '%s'" msgstr "" -#: builtin/push.c:227 +#: builtin/push.c:270 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -2809,34 +3832,377 @@ msgid "" " git push <name>\n" msgstr "" -#: builtin/push.c:242 +#: builtin/push.c:285 msgid "--all and --tags are incompatible" msgstr "" -#: builtin/push.c:243 +#: builtin/push.c:286 msgid "--all can't be combined with refspecs" msgstr "" -#: builtin/push.c:248 +#: builtin/push.c:291 msgid "--mirror and --tags are incompatible" msgstr "" -#: builtin/push.c:249 +#: builtin/push.c:292 msgid "--mirror can't be combined with refspecs" msgstr "" -#: builtin/push.c:254 +#: builtin/push.c:297 msgid "--all and --mirror are incompatible" msgstr "" -#: builtin/push.c:342 +#: builtin/push.c:385 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "" -#: builtin/push.c:344 +#: builtin/push.c:387 msgid "--delete doesn't make sense without any refs" msgstr "" +#: builtin/remote.c:98 +#, c-format +msgid "Updating %s" +msgstr "" + +#: builtin/remote.c:130 +msgid "" +"--mirror is dangerous and deprecated; please\n" +"\t use --mirror=fetch or --mirror=push instead" +msgstr "" + +#: builtin/remote.c:147 +#, c-format +msgid "unknown mirror argument: %s" +msgstr "" + +#: builtin/remote.c:185 +msgid "specifying a master branch makes no sense with --mirror" +msgstr "" + +#: builtin/remote.c:187 +msgid "specifying branches to track makes sense only with fetch mirrors" +msgstr "" + +#: builtin/remote.c:195 builtin/remote.c:646 +#, c-format +msgid "remote %s already exists." +msgstr "" + +#: builtin/remote.c:199 builtin/remote.c:650 +#, c-format +msgid "'%s' is not a valid remote name" +msgstr "" + +#: builtin/remote.c:243 +#, c-format +msgid "Could not setup master '%s'" +msgstr "" + +#: builtin/remote.c:299 +#, c-format +msgid "more than one %s" +msgstr "" + +#: builtin/remote.c:339 +#, c-format +msgid "Could not get fetch map for refspec %s" +msgstr "" + +#: builtin/remote.c:440 builtin/remote.c:448 +msgid "(matching)" +msgstr "" + +#: builtin/remote.c:452 +msgid "(delete)" +msgstr "" + +#: builtin/remote.c:595 builtin/remote.c:601 builtin/remote.c:607 +#, c-format +msgid "Could not append '%s' to '%s'" +msgstr "" + +#: builtin/remote.c:639 builtin/remote.c:792 builtin/remote.c:890 +#, c-format +msgid "No such remote: %s" +msgstr "" + +#: builtin/remote.c:656 +#, c-format +msgid "Could not rename config section '%s' to '%s'" +msgstr "" + +#: builtin/remote.c:662 builtin/remote.c:799 +#, c-format +msgid "Could not remove config section '%s'" +msgstr "" + +#: builtin/remote.c:677 +#, c-format +msgid "" +"Not updating non-default fetch refspec\n" +"\t%s\n" +"\tPlease update the configuration manually if necessary." +msgstr "" + +#: builtin/remote.c:683 +#, c-format +msgid "Could not append '%s'" +msgstr "" + +#: builtin/remote.c:694 +#, c-format +msgid "Could not set '%s'" +msgstr "" + +#: builtin/remote.c:716 +#, c-format +msgid "deleting '%s' failed" +msgstr "" + +#: builtin/remote.c:750 +#, c-format +msgid "creating '%s' failed" +msgstr "" + +#: builtin/remote.c:764 +#, c-format +msgid "Could not remove branch %s" +msgstr "" + +#: builtin/remote.c:834 +msgid "" +"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" +"to delete it, use:" +msgid_plural "" +"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n" +"to delete them, use:" +msgstr[0] "" +msgstr[1] "" + +#: builtin/remote.c:943 +#, c-format +msgid " new (next fetch will store in remotes/%s)" +msgstr "" + +#: builtin/remote.c:946 +msgid " tracked" +msgstr "" + +#: builtin/remote.c:948 +msgid " stale (use 'git remote prune' to remove)" +msgstr "" + +#: builtin/remote.c:950 +msgid " ???" +msgstr "" + +#: builtin/remote.c:991 +#, c-format +msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch" +msgstr "" + +#: builtin/remote.c:998 +#, c-format +msgid "rebases onto remote %s" +msgstr "" + +#: builtin/remote.c:1001 +#, c-format +msgid " merges with remote %s" +msgstr "" + +#: builtin/remote.c:1002 +msgid " and with remote" +msgstr "" + +#: builtin/remote.c:1004 +#, c-format +msgid "merges with remote %s" +msgstr "" + +#: builtin/remote.c:1005 +msgid " and with remote" +msgstr "" + +#: builtin/remote.c:1051 +msgid "create" +msgstr "" + +#: builtin/remote.c:1054 +msgid "delete" +msgstr "" + +#: builtin/remote.c:1058 +msgid "up to date" +msgstr "" + +#: builtin/remote.c:1061 +msgid "fast-forwardable" +msgstr "" + +#: builtin/remote.c:1064 +msgid "local out of date" +msgstr "" + +#: builtin/remote.c:1071 +#, c-format +msgid " %-*s forces to %-*s (%s)" +msgstr "" + +#: builtin/remote.c:1074 +#, c-format +msgid " %-*s pushes to %-*s (%s)" +msgstr "" + +#: builtin/remote.c:1078 +#, c-format +msgid " %-*s forces to %s" +msgstr "" + +#: builtin/remote.c:1081 +#, c-format +msgid " %-*s pushes to %s" +msgstr "" + +#: builtin/remote.c:1118 +#, c-format +msgid "* remote %s" +msgstr "" + +#: builtin/remote.c:1119 +#, c-format +msgid " Fetch URL: %s" +msgstr "" + +#: builtin/remote.c:1120 builtin/remote.c:1285 +msgid "(no URL)" +msgstr "" + +#: builtin/remote.c:1129 builtin/remote.c:1131 +#, c-format +msgid " Push URL: %s" +msgstr "" + +#: builtin/remote.c:1133 builtin/remote.c:1135 builtin/remote.c:1137 +#, c-format +msgid " HEAD branch: %s" +msgstr "" + +#: builtin/remote.c:1139 +#, c-format +msgid "" +" HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" +msgstr "" + +#: builtin/remote.c:1151 +#, c-format +msgid " Remote branch:%s" +msgid_plural " Remote branches:%s" +msgstr[0] "" +msgstr[1] "" + +#: builtin/remote.c:1154 builtin/remote.c:1181 +msgid " (status not queried)" +msgstr "" + +#: builtin/remote.c:1163 +msgid " Local branch configured for 'git pull':" +msgid_plural " Local branches configured for 'git pull':" +msgstr[0] "" +msgstr[1] "" + +#: builtin/remote.c:1171 +msgid " Local refs will be mirrored by 'git push'" +msgstr "" + +#: builtin/remote.c:1178 +#, c-format +msgid " Local ref configured for 'git push'%s:" +msgid_plural " Local refs configured for 'git push'%s:" +msgstr[0] "" +msgstr[1] "" + +#: builtin/remote.c:1216 +msgid "Cannot determine remote HEAD" +msgstr "" + +#: builtin/remote.c:1218 +msgid "Multiple remote HEAD branches. Please choose one explicitly with:" +msgstr "" + +#: builtin/remote.c:1228 +#, c-format +msgid "Could not delete %s" +msgstr "" + +#: builtin/remote.c:1236 +#, c-format +msgid "Not a valid ref: %s" +msgstr "" + +#: builtin/remote.c:1238 +#, c-format +msgid "Could not setup %s" +msgstr "" + +#: builtin/remote.c:1274 +#, c-format +msgid " %s will become dangling!" +msgstr "" + +#: builtin/remote.c:1275 +#, c-format +msgid " %s has become dangling!" +msgstr "" + +#: builtin/remote.c:1281 +#, c-format +msgid "Pruning %s" +msgstr "" + +#: builtin/remote.c:1282 +#, c-format +msgid "URL: %s" +msgstr "" + +#: builtin/remote.c:1295 +#, c-format +msgid " * [would prune] %s" +msgstr "" + +#: builtin/remote.c:1298 +#, c-format +msgid " * [pruned] %s" +msgstr "" + +#: builtin/remote.c:1387 builtin/remote.c:1461 +#, c-format +msgid "No such remote '%s'" +msgstr "" + +#: builtin/remote.c:1414 +msgid "no remote specified" +msgstr "" + +#: builtin/remote.c:1447 +msgid "--add --delete doesn't make sense" +msgstr "" + +#: builtin/remote.c:1487 +#, c-format +msgid "Invalid old URL pattern: %s" +msgstr "" + +#: builtin/remote.c:1495 +#, c-format +msgid "No such URL found: %s" +msgstr "" + +#: builtin/remote.c:1497 +msgid "Will not delete all non-push URLs" +msgstr "" + #: builtin/reset.c:33 msgid "mixed" msgstr "" @@ -2850,6 +4216,10 @@ msgid "hard" msgstr "" #: builtin/reset.c:33 +msgid "merge" +msgstr "" + +#: builtin/reset.c:33 msgid "keep" msgstr "" @@ -2921,15 +4291,15 @@ msgstr "" msgid "%s: %s cannot be used with %s" msgstr "" -#: builtin/revert.c:127 +#: builtin/revert.c:131 msgid "program error" msgstr "" -#: builtin/revert.c:213 +#: builtin/revert.c:221 msgid "revert failed" msgstr "" -#: builtin/revert.c:228 +#: builtin/revert.c:236 msgid "cherry-pick failed" msgstr "" @@ -2969,32 +4339,32 @@ msgstr "" msgid "Missing author: %s" msgstr "" -#: builtin/tag.c:58 +#: builtin/tag.c:60 #, c-format msgid "malformed object at '%s'" msgstr "" -#: builtin/tag.c:205 +#: builtin/tag.c:207 #, c-format msgid "tag name too long: %.*s..." msgstr "" -#: builtin/tag.c:210 +#: builtin/tag.c:212 #, c-format msgid "tag '%s' not found." msgstr "" -#: builtin/tag.c:225 +#: builtin/tag.c:227 #, c-format msgid "Deleted tag '%s' (was %s)\n" msgstr "" -#: builtin/tag.c:237 +#: builtin/tag.c:239 #, c-format msgid "could not verify the tag '%s'" msgstr "" -#: builtin/tag.c:247 +#: builtin/tag.c:249 msgid "" "\n" "#\n" @@ -3003,7 +4373,7 @@ msgid "" "#\n" msgstr "" -#: builtin/tag.c:254 +#: builtin/tag.c:256 msgid "" "\n" "#\n" @@ -3013,85 +4383,209 @@ msgid "" "#\n" msgstr "" -#: builtin/tag.c:294 +#: builtin/tag.c:298 msgid "unable to sign the tag" msgstr "" -#: builtin/tag.c:296 +#: builtin/tag.c:300 msgid "unable to write tag file" msgstr "" -#: builtin/tag.c:321 +#: builtin/tag.c:325 msgid "bad object type." msgstr "" -#: builtin/tag.c:334 +#: builtin/tag.c:338 msgid "tag header too big." msgstr "" -#: builtin/tag.c:366 +#: builtin/tag.c:370 msgid "no tag message?" msgstr "" -#: builtin/tag.c:372 +#: builtin/tag.c:376 #, c-format msgid "The tag message has been left in %s\n" msgstr "" -#: builtin/tag.c:421 +#: builtin/tag.c:425 msgid "switch 'points-at' requires an object" msgstr "" -#: builtin/tag.c:423 +#: builtin/tag.c:427 #, c-format msgid "malformed object name '%s'" msgstr "" -#: builtin/tag.c:502 +#: builtin/tag.c:506 +msgid "--column and -n are incompatible" +msgstr "" + +#: builtin/tag.c:523 msgid "-n option is only allowed with -l." msgstr "" -#: builtin/tag.c:504 +#: builtin/tag.c:525 msgid "--contains option is only allowed with -l." msgstr "" -#: builtin/tag.c:506 +#: builtin/tag.c:527 msgid "--points-at option is only allowed with -l." msgstr "" -#: builtin/tag.c:514 +#: builtin/tag.c:535 msgid "only one -F or -m option is allowed." msgstr "" -#: builtin/tag.c:534 +#: builtin/tag.c:555 msgid "too many params" msgstr "" -#: builtin/tag.c:540 +#: builtin/tag.c:561 #, c-format msgid "'%s' is not a valid tag name." msgstr "" -#: builtin/tag.c:545 +#: builtin/tag.c:566 #, c-format msgid "tag '%s' already exists" msgstr "" -#: builtin/tag.c:563 +#: builtin/tag.c:584 #, c-format msgid "%s: cannot lock the ref" msgstr "" -#: builtin/tag.c:565 +#: builtin/tag.c:586 #, c-format msgid "%s: cannot update the ref" msgstr "" -#: builtin/tag.c:567 +#: builtin/tag.c:588 #, c-format msgid "Updated tag '%s' (was %s)\n" msgstr "" +#: git.c:16 +msgid "See 'git help <command>' for more information on a specific command." +msgstr "" + +#: parse-options.h:133 parse-options.h:235 +msgid "n" +msgstr "" + +#: parse-options.h:141 +msgid "time" +msgstr "" + +#: parse-options.h:149 +msgid "file" +msgstr "" + +#: parse-options.h:151 +msgid "when" +msgstr "" + +#: parse-options.h:156 +msgid "no-op (backward compatibility)" +msgstr "" + +#: parse-options.h:228 +msgid "be more verbose" +msgstr "" + +#: parse-options.h:230 +msgid "be more quiet" +msgstr "" + +#: parse-options.h:236 +msgid "use <n> digits to display SHA-1s" +msgstr "" + +#: common-cmds.h:8 +msgid "Add file contents to the index" +msgstr "" + +#: common-cmds.h:9 +msgid "Find by binary search the change that introduced a bug" +msgstr "" + +#: common-cmds.h:10 +msgid "List, create, or delete branches" +msgstr "" + +#: common-cmds.h:11 +msgid "Checkout a branch or paths to the working tree" +msgstr "" + +#: common-cmds.h:12 +msgid "Clone a repository into a new directory" +msgstr "" + +#: common-cmds.h:13 +msgid "Record changes to the repository" +msgstr "" + +#: common-cmds.h:14 +msgid "Show changes between commits, commit and working tree, etc" +msgstr "" + +#: common-cmds.h:15 +msgid "Download objects and refs from another repository" +msgstr "" + +#: common-cmds.h:16 +msgid "Print lines matching a pattern" +msgstr "" + +#: common-cmds.h:17 +msgid "Create an empty git repository or reinitialize an existing one" +msgstr "" + +#: common-cmds.h:18 +msgid "Show commit logs" +msgstr "" + +#: common-cmds.h:19 +msgid "Join two or more development histories together" +msgstr "" + +#: common-cmds.h:20 +msgid "Move or rename a file, a directory, or a symlink" +msgstr "" + +#: common-cmds.h:21 +msgid "Fetch from and merge with another repository or a local branch" +msgstr "" + +#: common-cmds.h:22 +msgid "Update remote refs along with associated objects" +msgstr "" + +#: common-cmds.h:23 +msgid "Forward-port local commits to the updated upstream head" +msgstr "" + +#: common-cmds.h:24 +msgid "Reset current HEAD to the specified state" +msgstr "" + +#: common-cmds.h:25 +msgid "Remove files from the working tree and from the index" +msgstr "" + +#: common-cmds.h:26 +msgid "Show various types of objects" +msgstr "" + +#: common-cmds.h:27 +msgid "Show the working tree status" +msgstr "" + +#: common-cmds.h:28 +msgid "Create, list, delete or verify a tag object signed with GPG" +msgstr "" + #: git-am.sh:50 msgid "You need to set your committer info first" msgstr "" @@ -3452,106 +4946,106 @@ msgstr "" msgid "Stopping at '$sm_path'; script returned non-zero status." msgstr "" -#: git-submodule.sh:405 +#: git-submodule.sh:406 #, sh-format msgid "No url found for submodule path '$sm_path' in .gitmodules" msgstr "" -#: git-submodule.sh:414 +#: git-submodule.sh:415 #, sh-format msgid "Failed to register url for submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:422 +#: git-submodule.sh:417 #, sh-format -msgid "Failed to register update mode for submodule path '$sm_path'" +msgid "Submodule '$name' ($url) registered for path '$sm_path'" msgstr "" -#: git-submodule.sh:424 +#: git-submodule.sh:425 #, sh-format -msgid "Submodule '$name' ($url) registered for path '$sm_path'" +msgid "Failed to register update mode for submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:523 +#: git-submodule.sh:524 #, sh-format msgid "" "Submodule path '$sm_path' not initialized\n" "Maybe you want to use 'update --init'?" msgstr "" -#: git-submodule.sh:536 +#: git-submodule.sh:537 #, sh-format msgid "Unable to find current revision in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:555 +#: git-submodule.sh:556 #, sh-format msgid "Unable to fetch in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:569 +#: git-submodule.sh:570 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:570 +#: git-submodule.sh:571 #, sh-format msgid "Submodule path '$sm_path': rebased into '$sha1'" msgstr "" -#: git-submodule.sh:575 +#: git-submodule.sh:576 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:576 +#: git-submodule.sh:577 #, sh-format msgid "Submodule path '$sm_path': merged in '$sha1'" msgstr "" -#: git-submodule.sh:581 +#: git-submodule.sh:582 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:582 +#: git-submodule.sh:583 #, sh-format msgid "Submodule path '$sm_path': checked out '$sha1'" msgstr "" -#: git-submodule.sh:604 git-submodule.sh:927 +#: git-submodule.sh:605 git-submodule.sh:928 #, sh-format msgid "Failed to recurse into submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:712 +#: git-submodule.sh:713 msgid "--" msgstr "" -#: git-submodule.sh:770 +#: git-submodule.sh:771 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_src" msgstr "" -#: git-submodule.sh:773 +#: git-submodule.sh:774 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_dst" msgstr "" -#: git-submodule.sh:776 +#: git-submodule.sh:777 #, sh-format msgid " Warn: $name doesn't contain commits $sha1_src and $sha1_dst" msgstr "" -#: git-submodule.sh:801 +#: git-submodule.sh:802 msgid "blob" msgstr "" -#: git-submodule.sh:802 +#: git-submodule.sh:803 msgid "submodule" msgstr "" -#: git-submodule.sh:973 +#: git-submodule.sh:974 #, sh-format msgid "Synchronizing submodule url for '$name'" msgstr "" diff --git a/po/it.po b/po/it.po new file mode 100644 index 0000000000..6e5db1da6e --- /dev/null +++ b/po/it.po @@ -0,0 +1,5144 @@ +# Italian translations for Git. +# Copyright (C) 2012 Marco Paolone <marcopaolone@gmail.com> +# This file is distributed under the same license as the Git package. + +msgid "" +msgstr "" +"Project-Id-Version: Git\n" +"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" +"POT-Creation-Date: 2012-05-21 08:57+0800\n" +"PO-Revision-Date: 2012-05-29 22:58+0200\n" +"Last-Translator: Marco Paolone <marcopaolone@gmail.com>\n" +"Language-Team: Italian\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: advice.c:40 +#, c-format +msgid "hint: %.*s\n" +msgstr "suggerimento: %.*s\n" + +#. +#. * Message used both when 'git commit' fails and when +#. * other commands doing a merge do. +#. +#: advice.c:70 +msgid "" +"Fix them up in the work tree,\n" +"and then use 'git add/rm <file>' as\n" +"appropriate to mark resolution and make a commit,\n" +"or use 'git commit -a'." +msgstr "" + +#: bundle.c:36 +#, c-format +msgid "'%s' does not look like a v2 bundle file" +msgstr "" + +#: bundle.c:63 +#, c-format, fuzzy +msgid "unrecognized header: %s%s (%d)" +msgstr "header non riconosciuto: %s%s (%d)" + +#: bundle.c:89 builtin/commit.c:697 +#, c-format +msgid "could not open '%s'" +msgstr "non è stato possibile aprire '%s'" + +#: bundle.c:140 +msgid "Repository lacks these prerequisite commits:" +msgstr "" + +#: bundle.c:164 sequencer.c:533 sequencer.c:965 builtin/log.c:289 +#: builtin/log.c:719 builtin/log.c:1335 builtin/log.c:1554 builtin/merge.c:347 +#: builtin/shortlog.c:181 +msgid "revision walk setup failed" +msgstr "" + +#: bundle.c:186 +#, c-format +msgid "The bundle contains %d ref" +msgid_plural "The bundle contains %d refs" +msgstr[0] "" +msgstr[1] "" + +#: bundle.c:192 +#, c-format +msgid "The bundle requires this ref" +msgid_plural "The bundle requires these %d refs" +msgstr[0] "" +msgstr[1] "" + +#: bundle.c:290 +msgid "rev-list died" +msgstr "" + +#: bundle.c:296 builtin/log.c:1231 builtin/shortlog.c:284 +#, c-format +msgid "unrecognized argument: %s" +msgstr "argomento non riconosciuto: %s" + +#: bundle.c:331 +#, c-format +msgid "ref '%s' is excluded by the rev-list options" +msgstr "" + +#: bundle.c:376 +msgid "Refusing to create empty bundle." +msgstr "" + +#: bundle.c:394 +msgid "Could not spawn pack-objects" +msgstr "" + +#: bundle.c:412 +msgid "pack-objects died" +msgstr "" + +#: bundle.c:415 +#, c-format +msgid "cannot create '%s'" +msgstr "impossibile creare '%s'" + +#: bundle.c:437 +msgid "index-pack died" +msgstr "" + +#: commit.c:48 +#, c-format +msgid "could not parse %s" +msgstr "" + +#: commit.c:50 +#, c-format +msgid "%s %s is not a commit!" +msgstr "%s %s non è un commit!" + +#: compat/obstack.c:406 compat/obstack.c:408 +msgid "memory exhausted" +msgstr "" + +#: connected.c:39 +msgid "Could not run 'git rev-list'" +msgstr "Impossibile eseguire 'git-rev-list'" + +#: connected.c:48 +#, c-format, fuzzy +msgid "failed write to rev-list: %s" +msgstr "impossibile salvare nella rev-list: %s" + +#: connected.c:56 +#, c-format +msgid "failed to close rev-list's stdin: %s" +msgstr "" + +#: date.c:95 +msgid "in the future" +msgstr "in futuro" + +#: date.c:101 +#, c-format +msgid "%lu second ago" +msgid_plural "%lu seconds ago" +msgstr[0] "%lu secondo fa" +msgstr[1] "%lu secondi fa" + +#: date.c:108 +#, c-format +msgid "%lu minute ago" +msgid_plural "%lu minutes ago" +msgstr[0] "%lu un minuto fa" +msgstr[1] "%lu minuti fa" + +#: date.c:115 +#, c-format +msgid "%lu hour ago" +msgid_plural "%lu hours ago" +msgstr[0] "%lu ora fa" +msgstr[1] "%lu ore fa" + +#: date.c:122 +#, c-format +msgid "%lu day ago" +msgid_plural "%lu days ago" +msgstr[0] "%lu giorno fa" +msgstr[1] "%lu giorni fa" + +#: date.c:128 +#, c-format +msgid "%lu week ago" +msgid_plural "%lu weeks ago" +msgstr[0] "%lu settimana fa" +msgstr[1] "%lu settimane fa" + +#: date.c:135 +#, c-format +msgid "%lu month ago" +msgid_plural "%lu months ago" +msgstr[0] "%lu mese fa" +msgstr[1] "%lu mesi fa" + +#: date.c:146 +#, c-format +msgid "%lu year" +msgid_plural "%lu years" +msgstr[0] "%lu anno" +msgstr[1] "%lu anni" + +#: date.c:149 +#, c-format +msgid "%s, %lu month ago" +msgid_plural "%s, %lu months ago" +msgstr[0] "%s, %lu mese fa" +msgstr[1] "%s, %lu mesi fa" + +#: date.c:154 date.c:159 +#, c-format +msgid "%lu year ago" +msgid_plural "%lu years ago" +msgstr[0] "%lu anno fa" +msgstr[1] "%lu anni fa" + +#: diff.c:105 +#, c-format +msgid " Failed to parse dirstat cut-off percentage '%.*s'\n" +msgstr "" + +#: diff.c:110 +#, c-format +msgid " Unknown dirstat parameter '%.*s'\n" +msgstr " Parametro dirstat '%.*s' sconosciuto\n" + +#: diff.c:210 +#, c-format +msgid "" +"Found errors in 'diff.dirstat' config variable:\n" +"%s" +msgstr "" +"Errori trovati nella variabile di configurazione 'diff.dirstat':\n" +"%s" + +#: diff.c:1400 +msgid " 0 files changed\n" +msgstr " 0 file modificati\n" + +#: diff.c:1404 +#, c-format +msgid " %d file changed" +msgid_plural " %d files changed" +msgstr[0] " %d file modificato" +msgstr[1] " %d file modificati" + +#: diff.c:1421 +#, c-format +msgid ", %d insertion(+)" +msgid_plural ", %d insertions(+)" +msgstr[0] ", %d aggiunta(+)" +msgstr[1] ", %d aggiunte(+)<" + +#: diff.c:1432 +#, c-format +msgid ", %d deletion(-)" +msgid_plural ", %d deletions(-)" +msgstr[0] ". %d eliminato(-)" +msgstr[1] ", %d eliminati(-)" + +#: diff.c:3478 +#, c-format, fuzzy +msgid "" +"Failed to parse --dirstat/-X option parameter:\n" +"%s" +msgstr "" +"Errore nel parametro dell'opzione --dirstat/-X:\n" +"%s" + +#: gpg-interface.c:59 +msgid "could not run gpg." +msgstr "impossibile eseguire gpg." + +#: gpg-interface.c:71 +msgid "gpg did not accept the data" +msgstr "gpg non ha accettato i dati" + +#: gpg-interface.c:82 +msgid "gpg failed to sign the data" +msgstr "gpg non è riuscito a firmare i dati" + +#: grep.c:1280 +#, c-format +msgid "'%s': unable to read %s" +msgstr "'%s': impossibile leggere %s" + +#: grep.c:1297 +#, c-format +msgid "'%s': %s" +msgstr "'%s': %s" + +#: grep.c:1308 +#, c-format +msgid "'%s': short read %s" +msgstr "" + +#: help.c:207 +#, c-format +msgid "available git commands in '%s'" +msgstr "comandi git disponibili in '%s'" + +#: help.c:214 +msgid "git commands available from elsewhere on your $PATH" +msgstr "i comandi git sono disponibili in un altro percorso nel tuo $PATH" + +#: help.c:270 +#, c-format +msgid "" +"'%s' appears to be a git command, but we were not\n" +"able to execute it. Maybe git-%s is broken?" +msgstr "" +"'%s' sembra essere un comando git, ma non è stato\n" +"possibile eseguirlo. Fore git-%s è corrotto?" + +#: help.c:327 +msgid "Uh oh. Your system reports no Git commands at all." +msgstr "Oh oh. Il sistema non riporta alcun comando Git." + +#: help.c:349 +#, c-format +msgid "" +"WARNING: You called a Git command named '%s', which does not exist.\n" +"Continuing under the assumption that you meant '%s'" +msgstr "" + +#: help.c:354 +#, c-format +msgid "in %0.1f seconds automatically..." +msgstr "automaticamente tra %0.1f secondi..." + +#: help.c:361 +#, c-format +msgid "git: '%s' is not a git command. See 'git --help'." +msgstr "git: '%s' non è un comando git. Consultare 'git --help'." + +#: help.c:365 +msgid "" +"\n" +"Did you mean this?" +msgid_plural "" +"\n" +"Did you mean one of these?" +msgstr[0] "\nSi intendeva questo?" +msgstr[1] "\nSi intendeva uno di questi?" + +#: parse-options.c:493 +msgid "..." +msgstr "..." + +#: parse-options.c:511 +#, c-format +msgid "usage: %s" +msgstr " uso: %s" + +#. TRANSLATORS: the colon here should align with the +#. one in "usage: %s" translation +#: parse-options.c:515 +#, c-format +msgid " or: %s" +msgstr "oppure: %s" + +#: parse-options.c:518 +#, c-format +msgid " %s" +msgstr " %s" + +#: remote.c:1607 +#, c-format +msgid "Your branch is ahead of '%s' by %d commit.\n" +msgid_plural "Your branch is ahead of '%s' by %d commits.\n" +msgstr[0] "" +msgstr[1] "" + +#: remote.c:1613 +#, c-format +msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n" +msgid_plural "" +"Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n" +msgstr[0] "" +msgstr[1] "" + +#: remote.c:1621 +#, c-format +msgid "" +"Your branch and '%s' have diverged,\n" +"and have %d and %d different commit each, respectively.\n" +msgid_plural "" +"Your branch and '%s' have diverged,\n" +"and have %d and %d different commits each, respectively.\n" +msgstr[0] "" +msgstr[1] "" + +#: sequencer.c:121 builtin/merge.c:865 builtin/merge.c:978 +#: builtin/merge.c:1088 builtin/merge.c:1098 +#, c-format +msgid "Could not open '%s' for writing" +msgstr "Impossibile aprire '%s' per la scrittura" + +#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:868 +#: builtin/merge.c:1090 builtin/merge.c:1103 +#, c-format +msgid "Could not write to '%s'" +msgstr "Non è stato possibile scrivere su '%s'" + +#: sequencer.c:144 +msgid "" +"after resolving the conflicts, mark the corrected paths\n" +"with 'git add <paths>' or 'git rm <paths>'" +msgstr "" +"dopo aver risolto i conflitti, segnare i percorsi corretti\n" +"con 'git add <percorso>' o 'git rm <percorso>'" + +#: sequencer.c:147 +msgid "" +"after resolving the conflicts, mark the corrected paths\n" +"with 'git add <paths>' or 'git rm <paths>'\n" +"and commit the result with 'git commit'" +msgstr "" +"dopo aver risolto i conflitti, segnare i percorsi corretti\n" +"con 'git add <percorso>' o 'git rm <percorso>' ed effettuare\n" +"il commit del risultato con 'git commit'" + +#: sequencer.c:160 sequencer.c:741 sequencer.c:824 +#, c-format +msgid "Could not write to %s" +msgstr "Non è stato possibile scrivere su %s" + +#: sequencer.c:163 +#, c-format +msgid "Error wrapping up %s" +msgstr "" + +#: sequencer.c:178 +msgid "Your local changes would be overwritten by cherry-pick." +msgstr "Le modifiche locali verranno sovrascritte da cherry-pick" + +#: sequencer.c:180 +msgid "Your local changes would be overwritten by revert." +msgstr "Le modifiche locali verranno sovrascritte da revert." + +#: sequencer.c:183 +msgid "Commit your changes or stash them to proceed." +msgstr "Effettuare il commit delle modifiche o annullarle per procedere." + +#. TRANSLATORS: %s will be "revert" or "cherry-pick" +#: sequencer.c:233 +#, c-format +msgid "%s: Unable to write new index file" +msgstr "%s: non è stato possibile scrivere il nuovo file indice" + +#: sequencer.c:261 +msgid "Could not resolve HEAD commit\n" +msgstr "Non è stato possibile risolvere il commit HEAD\n" + +#: sequencer.c:282 +msgid "Unable to update cache tree\n" +msgstr "Impossibile aggiornare la cache dell'albero\n" + +#: sequencer.c:323 +#, c-format +msgid "Could not parse commit %s\n" +msgstr "" + +#: sequencer.c:328 +#, c-format +msgid "Could not parse parent commit %s\n" +msgstr "" + +#: sequencer.c:358 +msgid "Your index file is unmerged." +msgstr "" + +#: sequencer.c:361 +msgid "You do not have a valid HEAD" +msgstr "" + +#: sequencer.c:376 +#, c-format +msgid "Commit %s is a merge but no -m option was given." +msgstr "Il commit %s è un merge ma non è stata fornita l'opzione -m." + +#: sequencer.c:384 +#, c-format +msgid "Commit %s does not have parent %d" +msgstr "" + +#: sequencer.c:388 +#, c-format +msgid "Mainline was specified but commit %s is not a merge." +msgstr "" + +#. TRANSLATORS: The first %s will be "revert" or +#. "cherry-pick", the second %s a SHA1 +#: sequencer.c:399 +#, c-format +msgid "%s: cannot parse parent commit %s" +msgstr "" + +#: sequencer.c:403 +#, c-format, fuzzy +msgid "Cannot get commit message for %s" +msgstr "Non è possibile prelevare il messaggio di commit per %s" + +#: sequencer.c:491 +#, c-format +msgid "could not revert %s... %s" +msgstr "non è stato possibile eseguire il revert di %s... %s" + +#: sequencer.c:492 +#, c-format +msgid "could not apply %s... %s" +msgstr "non è stato possibile applicare %s... %s" + +#: sequencer.c:536 +msgid "empty commit set passed" +msgstr "è stato passato un set di commit vuoto" + +#: sequencer.c:544 +#, c-format +msgid "git %s: failed to read the index" +msgstr "git %s: lettura dell'indice non riuscita" + +#: sequencer.c:549 +#, c-format +msgid "git %s: failed to refresh the index" +msgstr "git %s: aggiornamento dell'indice non riuscito" + +#: sequencer.c:607 +#, c-format +msgid "Cannot %s during a %s" +msgstr "" + +#: sequencer.c:629 +#, c-format +msgid "Could not parse line %d." +msgstr "" + +#: sequencer.c:634 +msgid "No commits parsed." +msgstr "" + +#: sequencer.c:647 +#, c-format +msgid "Could not open %s" +msgstr "Non è stato possibile aprire %s" + +#: sequencer.c:651 +#, c-format +msgid "Could not read %s." +msgstr "" + +#: sequencer.c:658 +#, c-format +msgid "Unusable instruction sheet: %s" +msgstr "" + +#: sequencer.c:686 +#, c-format +msgid "Invalid key: %s" +msgstr "Chiave non valida: %s" + +#: sequencer.c:689 +#, c-format +msgid "Invalid value for %s: %s" +msgstr "Valore non valido per %s: %s" + +#: sequencer.c:701 +#, c-format +msgid "Malformed options sheet: %s" +msgstr "" + +#: sequencer.c:722 +msgid "a cherry-pick or revert is already in progress" +msgstr "è già in corso un'operazione di cherry-pick o di revert" + +#: sequencer.c:723 +msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" +msgstr "provare \"git cherry-pick (--continue | --quit | -- abort)\"" + +#: sequencer.c:727 +#, c-format +msgid "Could not create sequencer directory %s" +msgstr "" + +#: sequencer.c:743 sequencer.c:828 +#, c-format +msgid "Error wrapping up %s." +msgstr "" + +#: sequencer.c:762 sequencer.c:896 +msgid "no cherry-pick or revert in progress" +msgstr "nessuna operazione di cherry-pick o revert in corso" + +#: sequencer.c:764 +msgid "cannot resolve HEAD" +msgstr "non è possibile risolvere HEAD" + +#: sequencer.c:766 +msgid "cannot abort from a branch yet to be born" +msgstr "" + +#: sequencer.c:788 builtin/apply.c:3689 +#, c-format +msgid "cannot open %s: %s" +msgstr "non è possibile aprire %s: %s" + +#: sequencer.c:791 +#, c-format +msgid "cannot read %s: %s" +msgstr "non è possibile leggere %s: %s" + +#: sequencer.c:792 +msgid "unexpected end of file" +msgstr "fine del file inattesa" + +#: sequencer.c:798 +#, c-format +msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" +msgstr "" + +#: sequencer.c:821 +#, c-format +msgid "Could not format %s." +msgstr "" + +#: sequencer.c:983 +msgid "Can't revert as initial commit" +msgstr "" + +#: sequencer.c:984 +msgid "Can't cherry-pick into empty head" +msgstr "" + +#: sha1_name.c:864 +msgid "HEAD does not point to a branch" +msgstr "HEAD non punta ad un ramo" + +#: sha1_name.c:867 +#, c-format +msgid "No such branch: '%s'" +msgstr "Nessun ramo esistente: '%s'" + +#: sha1_name.c:869 +#, c-format +msgid "No upstream configured for branch '%s'" +msgstr "Nessun upstream configurato per il branch '%s'" + +#: sha1_name.c:872 +#, c-format +msgid "Upstream branch '%s' not stored as a remote-tracking branch" +msgstr "" + +#: wt-status.c:135 +msgid "Unmerged paths:" +msgstr "" + +#: wt-status.c:141 wt-status.c:158 +#, c-format +msgid " (use \"git reset %s <file>...\" to unstage)" +msgstr " (usare \"git reset %s <file>...\" per rimuoverlo dallo stage)" + +#: wt-status.c:143 wt-status.c:160 +msgid " (use \"git rm --cached <file>...\" to unstage)" +msgstr " (usare \"git rm --cached <file>...\" per rimuoverlo dallo stage)" + +#: wt-status.c:144 +msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" +msgstr "" + +#: wt-status.c:152 +msgid "Changes to be committed:" +msgstr "Modifiche di cui effettuare il commit:" + +#: wt-status.c:170 +msgid "Changes not staged for commit:" +msgstr "Modifiche non pronte per il commit:" + +#: wt-status.c:174 +msgid " (use \"git add <file>...\" to update what will be committed)" +msgstr "" + +#: wt-status.c:176 +msgid " (use \"git add/rm <file>...\" to update what will be committed)" +msgstr "" + +#: wt-status.c:177 +msgid "" +" (use \"git checkout -- <file>...\" to discard changes in working directory)" +msgstr "" + +#: wt-status.c:179 +msgid " (commit or discard the untracked or modified content in submodules)" +msgstr "" + +#: wt-status.c:188 +#, c-format +msgid "%s files:" +msgstr "%s file:" + +#: wt-status.c:191 +#, c-format +msgid " (use \"git %s <file>...\" to include in what will be committed)" +msgstr "" + +#: wt-status.c:208 +msgid "bug" +msgstr "bug" + +#: wt-status.c:213 +msgid "both deleted:" +msgstr "entrambi eliminati:" + +#: wt-status.c:214 +msgid "added by us:" +msgstr "aggiunto da noi:" + +#: wt-status.c:215 +msgid "deleted by them:" +msgstr "eliminato da loro:" + +#: wt-status.c:216 +msgid "added by them:" +msgstr "aggiunto da loro:" + +#: wt-status.c:217 +msgid "deleted by us:" +msgstr "eliminato da noi:" + +#: wt-status.c:218 +msgid "both added:" +msgstr "entrambi aggiunti:" + +#: wt-status.c:219 +msgid "both modified:" +msgstr "entrambi modificati:" + +#: wt-status.c:249 +msgid "new commits, " +msgstr "nuovi commit, " + +#: wt-status.c:251 +msgid "modified content, " +msgstr "contenuto modificato, " + +#: wt-status.c:253 +msgid "untracked content, " +msgstr "contenuto non tracciato, " + +#: wt-status.c:267 +#, c-format +msgid "new file: %s" +msgstr "nuovo file: %s" + +#: wt-status.c:270 +#, c-format +msgid "copied: %s -> %s" +msgstr "copiato: %s -> %s" + +#: wt-status.c:273 +#, c-format +msgid "deleted: %s" +msgstr "eliminato: %s" + +#: wt-status.c:276 +#, c-format +msgid "modified: %s" +msgstr "modificato: %s" + +#: wt-status.c:279 +#, c-format +msgid "renamed: %s -> %s" +msgstr "rinominato: %s -> %s" + +#: wt-status.c:282 +#, c-format +msgid "typechange: %s" +msgstr "" + +#: wt-status.c:285 +#, c-format +msgid "unknown: %s" +msgstr "sconosciuto: %s" + +#: wt-status.c:288 +#, c-format +msgid "unmerged: %s" +msgstr "" + +#: wt-status.c:291 +#, c-format +msgid "bug: unhandled diff status %c" +msgstr "" + +#: wt-status.c:737 +msgid "On branch " +msgstr "Sul ramo " + +#: wt-status.c:744 +msgid "Not currently on any branch." +msgstr "Al momento non si è su alcun ramo." + +#: wt-status.c:755 +msgid "Initial commit" +msgstr "Commit iniziale" + +#: wt-status.c:769 +msgid "Untracked" +msgstr "Non tracciato" + +#: wt-status.c:771 +msgid "Ignored" +msgstr "Ignorato" + +#: wt-status.c:773 +#, c-format +msgid "Untracked files not listed%s" +msgstr "" + +#: wt-status.c:775 +msgid " (use -u option to show untracked files)" +msgstr " (usare l'opzione -u per visualizzare i file non tracciati)" + +#: wt-status.c:781 +msgid "No changes" +msgstr "Nessuna modifica" + +#: wt-status.c:785 +#, c-format +msgid "no changes added to commit%s\n" +msgstr "nessuna modifica aggiunta al commit%s\n" + +#: wt-status.c:787 +msgid " (use \"git add\" and/or \"git commit -a\")" +msgstr " (usare \"git add\" e/o \"git commit -a\")" + +#: wt-status.c:789 +#, c-format +msgid "nothing added to commit but untracked files present%s\n" +msgstr "" + +#: wt-status.c:791 +msgid " (use \"git add\" to track)" +msgstr " (usare \"git add\" per tracciare)" + +#: wt-status.c:793 wt-status.c:796 wt-status.c:799 +#, c-format +msgid "nothing to commit%s\n" +msgstr "" + +#: wt-status.c:794 +msgid " (create/copy files and use \"git add\" to track)" +msgstr " (crea/copia file e usa \"git add\" per tracciarli)" + +#: wt-status.c:797 +msgid " (use -u to show untracked files)" +msgstr " (usare -u per mostrare i file non tracciati)" + +#: wt-status.c:800 +msgid " (working directory clean)" +msgstr " (cartella di lavoro pulita)" + +#: wt-status.c:908 +msgid "HEAD (no branch)" +msgstr "HEAD (nessun ramo)" + +#: wt-status.c:914 +msgid "Initial commit on " +msgstr "Commit iniziale su " + +#: wt-status.c:929 +msgid "behind " +msgstr "" + +#: wt-status.c:932 wt-status.c:935 +msgid "ahead " +msgstr "" + +#: wt-status.c:937 +msgid ", behind " +msgstr "" + +#: builtin/add.c:62 +#, c-format, fuzzy +msgid "unexpected diff status %c" +msgstr "status diff %c inatteso" + +#: builtin/add.c:67 builtin/commit.c:226 +msgid "updating files failed" +msgstr "aggiornamento dei file non riuscito" + +#: builtin/add.c:77 +#, c-format +msgid "remove '%s'\n" +msgstr "elimina '%s'\n" + +#: builtin/add.c:176 +#, c-format +msgid "Path '%s' is in submodule '%.*s'" +msgstr "" + +#: builtin/add.c:192 +msgid "Unstaged changes after refreshing the index:" +msgstr "" + +#: builtin/add.c:195 builtin/add.c:456 builtin/rm.c:186 +#, c-format +msgid "pathspec '%s' did not match any files" +msgstr "" + +#: builtin/add.c:209 +#, c-format +msgid "'%s' is beyond a symbolic link" +msgstr "'%s' si trova oltre un link simbolico" + +#: builtin/add.c:276 +msgid "Could not read the index" +msgstr "Impossibile leggere l'indice" + +#: builtin/add.c:286 +#, c-format +msgid "Could not open '%s' for writing." +msgstr "Impossibile aprire '%s' per la scrittura." + +#: builtin/add.c:290 +msgid "Could not write patch" +msgstr "Non è stato possibile scrivere la patch" + +#: builtin/add.c:295 +#, c-format +msgid "Could not stat '%s'" +msgstr "" + +#: builtin/add.c:297 +msgid "Empty patch. Aborted." +msgstr "Patch vuota. Operazione terminata." + +#: builtin/add.c:303 +#, c-format +msgid "Could not apply '%s'" +msgstr "Impossibile applicare '%s'" + +#: builtin/add.c:312 +msgid "The following paths are ignored by one of your .gitignore files:\n" +msgstr "I seguenti percorsi sono stati ignorati da uno o più file .gitignore:\n" + +#: builtin/add.c:352 +#, c-format +msgid "Use -f if you really want to add them.\n" +msgstr "Usare -f se si desidera davvero aggiungerli.\n" + +#: builtin/add.c:353 +msgid "no files added" +msgstr "nessun file aggiunto" + +#: builtin/add.c:359 +msgid "adding files failed" +msgstr "aggiunta dei file non riuscita" + +#: builtin/add.c:391 +msgid "-A and -u are mutually incompatible" +msgstr "-A e -u sono reciprocamente incompatibili" + +#: builtin/add.c:393 +msgid "Option --ignore-missing can only be used together with --dry-run" +msgstr "L'opzione --ignore-missing può essere usata solo in combinazione con --dry-run" + +#: builtin/add.c:413 +#, c-format +msgid "Nothing specified, nothing added.\n" +msgstr "Non è stato specificato nulla, non è stato aggiunto nulla.\n" + +#: builtin/add.c:414 +#, c-format +msgid "Maybe you wanted to say 'git add .'?\n" +msgstr "Forse si intendeva dire 'git add .'?\n" + +#: builtin/add.c:420 builtin/clean.c:95 builtin/commit.c:286 builtin/mv.c:82 +#: builtin/rm.c:162 +msgid "index file corrupt" +msgstr "indice del file corrotto" + +#: builtin/add.c:476 builtin/apply.c:4100 builtin/mv.c:229 builtin/rm.c:260 +msgid "Unable to write new index file" +msgstr "Impossibile scrivere il nuovo file di indice" + +#: builtin/apply.c:53 +msgid "git apply [options] [<patch>...]" +msgstr "git apply [opzioni] [<patch>...]" + +#: builtin/apply.c:106 +#, c-format +msgid "unrecognized whitespace option '%s'" +msgstr "" + +#: builtin/apply.c:121 +#, c-format +msgid "unrecognized whitespace ignore option '%s'" +msgstr "" + +#: builtin/apply.c:815 +#, c-format +msgid "Cannot prepare timestamp regexp %s" +msgstr "" + +#: builtin/apply.c:824 +#, c-format +msgid "regexec returned %d for input: %s" +msgstr "" + +#: builtin/apply.c:905 +#, c-format +msgid "unable to find filename in patch at line %d" +msgstr "non è possibile trovare il nome del file nella patch alla riga %d" + +#: builtin/apply.c:937 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" +msgstr "git apply: git-diff errato - atteso /dev/null, ricevuto %s alla riga %d" + +#: builtin/apply.c:941 +#, c-format +msgid "git apply: bad git-diff - inconsistent new filename on line %d" +msgstr "git apply: git-diff errato - nuovo nome del file incosistente alla riga %d" + +#: builtin/apply.c:942 +#, c-format +msgid "git apply: bad git-diff - inconsistent old filename on line %d" +msgstr "git apply: git-diff errato - vecchio nome del file inconsistente alla riga %d" + +#: builtin/apply.c:949 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null on line %d" +msgstr "git apply: git-diff errato - atteso /dev/nulla alla riga %d" + +#: builtin/apply.c:1394 +#, c-format +msgid "recount: unexpected line: %.*s" +msgstr "recount: riga inattesa: %.*s" + +#: builtin/apply.c:1451 +#, c-format +msgid "patch fragment without header at line %d: %.*s" +msgstr "frammento di patch senza intestazione alla riga %d: %.*s" + +#: builtin/apply.c:1468 +#, c-format +msgid "" +"git diff header lacks filename information when removing %d leading pathname " +"component (line %d)" +msgid_plural "" +"git diff header lacks filename information when removing %d leading pathname " +"components (line %d)" +msgstr[0] "" +msgstr[1] "" + +#: builtin/apply.c:1628 +msgid "new file depends on old contents" +msgstr "il nuovo file dipende da contenuti precedenti" + +#: builtin/apply.c:1630 +msgid "deleted file still has contents" +msgstr "il file eliminato ha ancora dei contenuti" + +#: builtin/apply.c:1656 +#, c-format +msgid "corrupt patch at line %d" +msgstr "patch corrotta alla riga %d" + +#: builtin/apply.c:1692 +#, c-format +msgid "new file %s depends on old contents" +msgstr "il nuovo file %s dipende da contenuti precedenti" + +#: builtin/apply.c:1694 +#, c-format +msgid "deleted file %s still has contents" +msgstr "il file eliminato %s ha ancora dei contenuti" + +#: builtin/apply.c:1697 +#, c-format +msgid "** warning: file %s becomes empty but is not deleted" +msgstr "** attenzione: il file %s diventa vuoto ma non è eliminato" + +#: builtin/apply.c:1843 +#, c-format +msgid "corrupt binary patch at line %d: %.*s" +msgstr "patch binaria corrotta alla riga %d: %.*s" + +#. there has to be one hunk (forward hunk) +#: builtin/apply.c:1872 +#, c-format +msgid "unrecognized binary patch at line %d" +msgstr "patch binaria non riconosciuta alla riga %d" + +#: builtin/apply.c:1958 +#, c-format +msgid "patch with only garbage at line %d" +msgstr "patch con sola spazzatura alla riga %d" + +#: builtin/apply.c:2048 +#, c-format +msgid "unable to read symlink %s" +msgstr "impossibile leggere il link simbolico %s" + +#: builtin/apply.c:2052 +#, c-format +msgid "unable to open or read %s" +msgstr "impossibile aprire o leggere %s" + +#: builtin/apply.c:2123 +msgid "oops" +msgstr "oops" + +#: builtin/apply.c:2645 +#, c-format +msgid "invalid start of line: '%c'" +msgstr "inizio della riga non valido: '%c'" + +#: builtin/apply.c:2763 +#, c-format +msgid "Hunk #%d succeeded at %d (offset %d line)." +msgid_plural "Hunk #%d succeeded at %d (offset %d lines)." +msgstr[0] "" +msgstr[1] "" + +#: builtin/apply.c:2775 +#, c-format +msgid "Context reduced to (%ld/%ld) to apply fragment at %d" +msgstr "" + +#: builtin/apply.c:2781 +#, c-format +msgid "" +"while searching for:\n" +"%.*s" +msgstr "" +"durante la ricerca per:\n" +"%.*s" + +#: builtin/apply.c:2800 +#, c-format +msgid "missing binary patch data for '%s'" +msgstr "dati della patch binaria mancanti per '%s'" + +#: builtin/apply.c:2903 +#, c-format, fuzzy +msgid "binary patch does not apply to '%s'" +msgstr "la patch binaria non può essere applicata a '%s'" + +#: builtin/apply.c:2909 +#, c-format +msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" +msgstr "la patch binaria su '%s' crea risultati non corretti (atteso %s, ricevuto %s)" + +#: builtin/apply.c:2930 +#, c-format +msgid "patch failed: %s:%ld" +msgstr "patch non riuscito: %s:%ld" + +#: builtin/apply.c:3045 +#, c-format +msgid "patch %s has been renamed/deleted" +msgstr "la patch %s è stata rinominata/eliminata" + +#: builtin/apply.c:3052 builtin/apply.c:3069 +#, c-format +msgid "read of %s failed" +msgstr "lettura di %s non riuscita" + +#: builtin/apply.c:3084 +msgid "removal patch leaves file contents" +msgstr "la rimozione della patch lascia contenuti del file" + +#: builtin/apply.c:3105 +#, c-format +msgid "%s: already exists in working directory" +msgstr "%s: esiste già nella cartella di lavoro" + +#: builtin/apply.c:3143 +#, c-format +msgid "%s: has been deleted/renamed" +msgstr "%s: è stato eliminato/rinominato" + +#: builtin/apply.c:3148 builtin/apply.c:3179 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: builtin/apply.c:3159 +#, c-format +msgid "%s: does not exist in index" +msgstr "%s: non esiste nell'indice" + +#: builtin/apply.c:3173 +#, c-format +msgid "%s: does not match index" +msgstr "%s: non corrisponde all'indice" + +#: builtin/apply.c:3190 +#, c-format +msgid "%s: wrong type" +msgstr "%s: tipo errato" + +#: builtin/apply.c:3192 +#, c-format +msgid "%s has type %o, expected %o" +msgstr "%s ha il tipo %o, atteso %o" + +#: builtin/apply.c:3247 +#, c-format +msgid "%s: already exists in index" +msgstr "%s: esiste già nell'indice" + +#: builtin/apply.c:3266 +#, c-format +msgid "new mode (%o) of %s does not match old mode (%o)%s%s" +msgstr "la nuova modalità (%o) di %s non corrisponde alla modalità precedente (%o)%s%s" + +#: builtin/apply.c:3272 +#, c-format +msgid "%s: patch does not apply" +msgstr "%s: la patch non può essere applicata" + +#: builtin/apply.c:3285 +#, c-format +msgid "Checking patch %s..." +msgstr "Verifica della patch %s..." + +#: builtin/apply.c:3340 builtin/checkout.c:212 builtin/reset.c:158 +#, c-format +msgid "make_cache_entry failed for path '%s'" +msgstr "make_cache_entry non riuscito per il percorso '%s'" + +#: builtin/apply.c:3483 +#, c-format +msgid "unable to remove %s from index" +msgstr "impossibile rimuovere %s dall'indice" + +#: builtin/apply.c:3510 +#, c-format +msgid "corrupt patch for subproject %s" +msgstr "" + +#: builtin/apply.c:3514 +#, c-format +msgid "unable to stat newly created file '%s'" +msgstr "impossibile eseguire lo stat del file appena creato '%s'" + +#: builtin/apply.c:3519 +#, c-format +msgid "unable to create backing store for newly created file %s" +msgstr "" + +#: builtin/apply.c:3522 +#, c-format +msgid "unable to add cache entry for %s" +msgstr "impossibile aggiungere la voce della cache per %s" + +#: builtin/apply.c:3555 +#, c-format +msgid "closing file '%s'" +msgstr "chiusura del file '%s'" + +#: builtin/apply.c:3604 +#, c-format +msgid "unable to write file '%s' mode %o" +msgstr "non è possibile scrivere il file '%s' in modalità %o" + +#: builtin/apply.c:3660 +#, c-format +msgid "Applied patch %s cleanly." +msgstr "" + +#: builtin/apply.c:3668 +msgid "internal error" +msgstr "errore interno" + +#. Say this even without --verbose +#: builtin/apply.c:3671 +#, c-format +msgid "Applying patch %%s with %d reject..." +msgid_plural "Applying patch %%s with %d rejects..." +msgstr[0] "" +msgstr[1] "" + +#: builtin/apply.c:3681 +#, c-format +msgid "truncating .rej filename to %.*s.rej" +msgstr "" + +#: builtin/apply.c:3702 +#, c-format +msgid "Hunk #%d applied cleanly." +msgstr "" + +#: builtin/apply.c:3705 +#, c-format +msgid "Rejected hunk #%d." +msgstr "" + +#: builtin/apply.c:3836 +msgid "unrecognized input" +msgstr "input non riconosciuto" + +#: builtin/apply.c:3847 +msgid "unable to read index file" +msgstr "impossibile leggere il file dell'indice" + +#: builtin/apply.c:3962 builtin/apply.c:3965 +msgid "path" +msgstr "percorso" + +#: builtin/apply.c:3963 +msgid "don't apply changes matching the given path" +msgstr "" + +#: builtin/apply.c:3966 +msgid "apply changes matching the given path" +msgstr "" + +#: builtin/apply.c:3968 +msgid "num" +msgstr "num" + +#: builtin/apply.c:3969 +msgid "remove <num> leading slashes from traditional diff paths" +msgstr "" + +#: builtin/apply.c:3972 +msgid "ignore additions made by the patch" +msgstr "" + +#: builtin/apply.c:3974 +msgid "instead of applying the patch, output diffstat for the input" +msgstr "invece di applicare la patch, mostra l'output di diffstat per l'input" + +#: builtin/apply.c:3978 +msgid "shows number of added and deleted lines in decimal notation" +msgstr "mostra il numero di righe aggiunte e eliminate in notazione decimale" + +#: builtin/apply.c:3980 +msgid "instead of applying the patch, output a summary for the input" +msgstr "invece di applicare la patch, mostra un riassunto per l'input" + +#: builtin/apply.c:3982 +msgid "instead of applying the patch, see if the patch is applicable" +msgstr "invece di applicare la patch, verifica se può essere applicata" + +#: builtin/apply.c:3984 +msgid "make sure the patch is applicable to the current index" +msgstr "assicura che la patch sia applicabile all'indice corrente" + +#: builtin/apply.c:3986 +msgid "apply a patch without touching the working tree" +msgstr "applica una patch senza modificare l'albero di lavoro" + +#: builtin/apply.c:3988 +msgid "also apply the patch (use with --stat/--summary/--check)" +msgstr "applica anche la patch (usare con --stat/--summary/--check)" + +#: builtin/apply.c:3990 +msgid "build a temporary index based on embedded index information" +msgstr "crea un indice temporaneo basato sulle informazioni incorporate dell'indice" + +#: builtin/apply.c:3992 +msgid "paths are separated with NUL character" +msgstr "i percorsi sono separati con un carattere NUL" + +#: builtin/apply.c:3995 +msgid "ensure at least <n> lines of context match" +msgstr "assicura almeno <n> righe di contesto corrispondente" + +#: builtin/apply.c:3996 +msgid "action" +msgstr "azione" + +#: builtin/apply.c:3997 +msgid "detect new or modified lines that have whitespace errors" +msgstr "rileva righe nuove o modificate che hanno errori di spazi bianchi" + +#: builtin/apply.c:4000 builtin/apply.c:4003 +msgid "ignore changes in whitespace when finding context" +msgstr "" + +#: builtin/apply.c:4006 +msgid "apply the patch in reverse" +msgstr "applica la patch in maniera inversa" + +#: builtin/apply.c:4008 +msgid "don't expect at least one line of context" +msgstr "" + +#: builtin/apply.c:4010 +msgid "leave the rejected hunks in corresponding *.rej files" +msgstr "" + +#: builtin/apply.c:4012 +msgid "allow overlapping hunks" +msgstr "" + +#: builtin/apply.c:4013 +msgid "be verbose" +msgstr "dettagliato" + +#: builtin/apply.c:4015 +msgid "tolerate incorrectly detected missing new-line at the end of file" +msgstr "" + +#: builtin/apply.c:4018 +msgid "do not trust the line counts in the hunk headers" +msgstr "" + +#: builtin/apply.c:4020 +msgid "root" +msgstr "radice" + +#: builtin/apply.c:4021 +msgid "prepend <root> to all filenames" +msgstr "antepone <root> a tutti i nomi file" + +#: builtin/apply.c:4042 +msgid "--index outside a repository" +msgstr "--index al di fuori di un deposito" + +#: builtin/apply.c:4045 +msgid "--cached outside a repository" +msgstr "--cached al di fuori di un deposito" + +#: builtin/apply.c:4061 +#, c-format +msgid "can't open patch '%s'" +msgstr "impossibile aprire la patch '%s'" + +#: builtin/apply.c:4075 +#, c-format +msgid "squelched %d whitespace error" +msgid_plural "squelched %d whitespace errors" +msgstr[0] "" +msgstr[1] "" + +#: builtin/apply.c:4081 builtin/apply.c:4091 +#, c-format +msgid "%d line adds whitespace errors." +msgid_plural "%d lines add whitespace errors." +msgstr[0] "" +msgstr[1] "" + +#: builtin/archive.c:17 +#, c-format +msgid "could not create archive file '%s'" +msgstr "impossibile creare il file dell'archivio '%s'" + +#: builtin/archive.c:20 +msgid "could not redirect output" +msgstr "impossibile redirigere l'output" + +#: builtin/archive.c:37 +msgid "git archive: Remote with no URL" +msgstr "git archive: Remote non ha una URL" + +#: builtin/archive.c:58 +msgid "git archive: expected ACK/NAK, got EOF" +msgstr "git archive: atteso ACK/NAK, ricevuto EOF" + +#: builtin/archive.c:63 +#, c-format +msgid "git archive: NACK %s" +msgstr "git archive: NACK %s" + +#: builtin/archive.c:65 +#, c-format +msgid "remote error: %s" +msgstr "errore remoto: %s" + +#: builtin/archive.c:66 +msgid "git archive: protocol error" +msgstr "git archive: errore del protocollo" + +#: builtin/archive.c:71 +msgid "git archive: expected a flush" +msgstr "" + +#: builtin/branch.c:144 +#, c-format +msgid "" +"deleting branch '%s' that has been merged to\n" +" '%s', but not yet merged to HEAD." +msgstr "" + +#: builtin/branch.c:148 +#, c-format +msgid "" +"not deleting branch '%s' that is not yet merged to\n" +" '%s', even though it is merged to HEAD." +msgstr "" + +#: builtin/branch.c:180 +msgid "cannot use -a with -d" +msgstr "impossibile usare -a con -d" + +#: builtin/branch.c:186 +msgid "Couldn't look up commit object for HEAD" +msgstr "" + +#: builtin/branch.c:191 +#, c-format +msgid "Cannot delete the branch '%s' which you are currently on." +msgstr "" + +#: builtin/branch.c:202 +#, c-format +msgid "remote branch '%s' not found." +msgstr "il ramo remoto '%s' non è stato trovato." + +#: builtin/branch.c:203 +#, c-format +msgid "branch '%s' not found." +msgstr "ramo '%s' non trovato." + +#: builtin/branch.c:210 +#, c-format +msgid "Couldn't look up commit object for '%s'" +msgstr "" + +#: builtin/branch.c:216 +#, c-format +msgid "" +"The branch '%s' is not fully merged.\n" +"If you are sure you want to delete it, run 'git branch -D %s'." +msgstr "" + +#: builtin/branch.c:225 +#, c-format +msgid "Error deleting remote branch '%s'" +msgstr "Errore nella rimozione del ramo remoto '%s'" + +#: builtin/branch.c:226 +#, c-format +msgid "Error deleting branch '%s'" +msgstr "Errore nella rimozione del ramo '%s'" + +#: builtin/branch.c:233 +#, c-format +msgid "Deleted remote branch %s (was %s).\n" +msgstr "Ramo remoto %s eliminato (era %s).\n" + +#: builtin/branch.c:234 +#, c-format +msgid "Deleted branch %s (was %s).\n" +msgstr "Ramo %s eliminato (era %s).\n" + +#: builtin/branch.c:239 +msgid "Update of config-file failed" +msgstr "Aggiornamento del file di configurazione fallito" + +#: builtin/branch.c:337 +#, c-format +msgid "branch '%s' does not point at a commit" +msgstr "il ramo '%s' non punta ad un commit" + +#: builtin/branch.c:409 +#, c-format +msgid "[%s: behind %d]" +msgstr "[%s: dietro %d]" + +#: builtin/branch.c:411 +#, c-format +msgid "[behind %d]" +msgstr "[dietro %d]" + +#: builtin/branch.c:415 +#, c-format +msgid "[%s: ahead %d]" +msgstr "[%s: avanti %d]" + +#: builtin/branch.c:417 +#, c-format +msgid "[ahead %d]" +msgstr "" + +#: builtin/branch.c:420 +#, c-format +msgid "[%s: ahead %d, behind %d]" +msgstr "" + +#: builtin/branch.c:423 +#, c-format +msgid "[ahead %d, behind %d]" +msgstr "" + +#: builtin/branch.c:535 +msgid "(no branch)" +msgstr "(nessun ramo)" + +#: builtin/branch.c:600 +msgid "some refs could not be read" +msgstr "" + +#: builtin/branch.c:613 +msgid "cannot rename the current branch while not on any." +msgstr "" + +#: builtin/branch.c:623 +#, c-format +msgid "Invalid branch name: '%s'" +msgstr "Nome del ramo non valido: '%s'" + +#: builtin/branch.c:638 +msgid "Branch rename failed" +msgstr "" + +#: builtin/branch.c:642 +#, c-format +msgid "Renamed a misnamed branch '%s' away" +msgstr "" + +#: builtin/branch.c:646 +#, c-format +msgid "Branch renamed to %s, but HEAD is not updated!" +msgstr "Ramo rinominato in %s, ma HEAD non è aggiornato!" + +#: builtin/branch.c:653 +msgid "Branch is renamed, but update of config-file failed" +msgstr "Il ramo è stato rinominato, ma l'aggiornamento del file di configurazione è fallito" + +#: builtin/branch.c:668 +#, c-format +msgid "malformed object name %s" +msgstr "nome dell'oggetto %s non corretto" + +#: builtin/branch.c:692 +#, c-format +msgid "could not write branch description template: %s" +msgstr "" + +#: builtin/branch.c:783 +msgid "Failed to resolve HEAD as a valid ref." +msgstr "" + +#: builtin/branch.c:788 builtin/clone.c:558 +msgid "HEAD not found below refs/heads!" +msgstr "" + +#: builtin/branch.c:808 +msgid "--column and --verbose are incompatible" +msgstr "--column e --verbose non sono compatibili" + +#: builtin/branch.c:857 +msgid "-a and -r options to 'git branch' do not make sense with a branch name" +msgstr "le opzioni -a e -r per 'git branch' non hanno senso con il nome di un ramo" + +#: builtin/bundle.c:47 +#, c-format +msgid "%s is okay\n" +msgstr "%s è corretto\n" + +#: builtin/bundle.c:56 +msgid "Need a repository to create a bundle." +msgstr "" + +#: builtin/bundle.c:60 +msgid "Need a repository to unbundle." +msgstr "" + +#: builtin/checkout.c:113 builtin/checkout.c:146 +#, c-format +msgid "path '%s' does not have our version" +msgstr "il percorso '%s' non ha la nostra versione" + +#: builtin/checkout.c:115 builtin/checkout.c:148 +#, c-format +msgid "path '%s' does not have their version" +msgstr "il percorso '%s' non ha la loro versione" + +#: builtin/checkout.c:131 +#, c-format +msgid "path '%s' does not have all necessary versions" +msgstr "" + +#: builtin/checkout.c:175 +#, c-format +msgid "path '%s' does not have necessary versions" +msgstr "il percorso '%s' non ha le versioni necessarie" + +#: builtin/checkout.c:192 +#, c-format +msgid "path '%s': cannot merge" +msgstr "" + +#: builtin/checkout.c:209 +#, c-format +msgid "Unable to add merge result for '%s'" +msgstr "" + +#: builtin/checkout.c:234 builtin/checkout.c:392 +msgid "corrupt index file" +msgstr "file indice corrotto" + +#: builtin/checkout.c:264 builtin/checkout.c:271 +#, c-format +msgid "path '%s' is unmerged" +msgstr "" + +#: builtin/checkout.c:302 builtin/checkout.c:498 builtin/clone.c:583 +#: builtin/merge.c:812 +msgid "unable to write new index file" +msgstr "impossibile scrivere il nuovo file di indice" + +#: builtin/checkout.c:319 builtin/diff.c:302 builtin/merge.c:408 +msgid "diff_setup_done failed" +msgstr "diff_setup_done non riuscito" + +#: builtin/checkout.c:414 +msgid "you need to resolve your current index first" +msgstr "è necessario risolvere prima l'indice corrente" + +#: builtin/checkout.c:533 +#, c-format +msgid "Can not do reflog for '%s'\n" +msgstr "" + +#: builtin/checkout.c:566 +msgid "HEAD is now at" +msgstr "HEAD si trova ora a" + +#: builtin/checkout.c:573 +#, c-format +msgid "Reset branch '%s'\n" +msgstr "Ripristina il ramo '%s'\n" + +#: builtin/checkout.c:576 +#, c-format +msgid "Already on '%s'\n" +msgstr "Si è già su '%s'\n" + +#: builtin/checkout.c:580 +#, c-format +msgid "Switched to and reset branch '%s'\n" +msgstr "" + +#: builtin/checkout.c:582 +#, c-format +msgid "Switched to a new branch '%s'\n" +msgstr "" + +#: builtin/checkout.c:584 +#, c-format +msgid "Switched to branch '%s'\n" +msgstr "Si è passati al ramo '%s'\n" + +#: builtin/checkout.c:640 +#, c-format +msgid " ... and %d more.\n" +msgstr " ... e %d altri.\n" + +#. The singular version +#: builtin/checkout.c:646 +#, c-format +msgid "" +"Warning: you are leaving %d commit behind, not connected to\n" +"any of your branches:\n" +"\n" +"%s\n" +msgid_plural "" +"Warning: you are leaving %d commits behind, not connected to\n" +"any of your branches:\n" +"\n" +"%s\n" +msgstr[0] "" +msgstr[1] "" + +#: builtin/checkout.c:664 +#, c-format +msgid "" +"If you want to keep them by creating a new branch, this may be a good time\n" +"to do so with:\n" +"\n" +" git branch new_branch_name %s\n" +"\n" +msgstr "" +"Se si desidera mantenerle creando un nuovo ramo, questo potrebbe essere\n" +"un buon momento per farlo con:\n" +"\n" +" git branch nuovo_nome_ramo %s\n" +"\n" + +#: builtin/checkout.c:694 +msgid "internal error in revision walk" +msgstr "" + +#: builtin/checkout.c:698 +msgid "Previous HEAD position was" +msgstr "La precedente posizione di HEAD era" + +#: builtin/checkout.c:724 +msgid "You are on a branch yet to be born" +msgstr "" + +#. case (1) +#: builtin/checkout.c:855 +#, c-format +msgid "invalid reference: %s" +msgstr "riferimento non valido: %s" + +#. case (1): want a tree +#: builtin/checkout.c:894 +#, c-format +msgid "reference is not a tree: %s" +msgstr "il riferimento non è un albero: %s" + +#: builtin/checkout.c:974 +msgid "-B cannot be used with -b" +msgstr "-B non può essere usata con -b" + +#: builtin/checkout.c:983 +msgid "--patch is incompatible with all other options" +msgstr "--patch è incompatibile con tutte le altre opzioni" + +#: builtin/checkout.c:986 +msgid "--detach cannot be used with -b/-B/--orphan" +msgstr "--detach non può essere usato con -b/-B/--orphan" + +#: builtin/checkout.c:988 +msgid "--detach cannot be used with -t" +msgstr "--detach non può essere usato con -t" + +#: builtin/checkout.c:994 +msgid "--track needs a branch name" +msgstr "--track necessita del nome di un ramo" + +#: builtin/checkout.c:1001 +msgid "Missing branch name; try -b" +msgstr "Nome del ramo mancante; provare con -b" + +#: builtin/checkout.c:1007 +msgid "--orphan and -b|-B are mutually exclusive" +msgstr "" + +#: builtin/checkout.c:1009 +msgid "--orphan cannot be used with -t" +msgstr "--orphan non può essere usato con -t" + +#: builtin/checkout.c:1019 +msgid "git checkout: -f and -m are incompatible" +msgstr "git checkout: -f e -m non sono compatibili" + +#: builtin/checkout.c:1053 +msgid "invalid path specification" +msgstr "" + +#: builtin/checkout.c:1061 +#, c-format +msgid "" +"git checkout: updating paths is incompatible with switching branches.\n" +"Did you intend to checkout '%s' which can not be resolved as commit?" +msgstr "" + +#: builtin/checkout.c:1063 +msgid "git checkout: updating paths is incompatible with switching branches." +msgstr "" + +#: builtin/checkout.c:1068 +msgid "git checkout: --detach does not take a path argument" +msgstr "" + +#: builtin/checkout.c:1071 +msgid "" +"git checkout: --ours/--theirs, --force and --merge are incompatible when\n" +"checking out of the index." +msgstr "" + +#: builtin/checkout.c:1090 +msgid "Cannot switch branch to a non-commit." +msgstr "" + +#: builtin/checkout.c:1093 +msgid "--ours/--theirs is incompatible with switching branches." +msgstr "" + +#: builtin/clean.c:78 +msgid "-x and -X cannot be used together" +msgstr "-x e -X non possono essere usati insieme" + +#: builtin/clean.c:82 +msgid "" +"clean.requireForce set to true and neither -n nor -f given; refusing to clean" +msgstr "" + +#: builtin/clean.c:85 +msgid "" +"clean.requireForce defaults to true and neither -n nor -f given; refusing to " +"clean" +msgstr "" + +#: builtin/clean.c:155 builtin/clean.c:176 +#, c-format +msgid "Would remove %s\n" +msgstr "" + +#: builtin/clean.c:159 builtin/clean.c:179 +#, c-format +msgid "Removing %s\n" +msgstr "Rimozione di %s\n" + +#: builtin/clean.c:162 builtin/clean.c:182 +#, c-format +msgid "failed to remove %s" +msgstr "rimozione di %s non riuscita" + +#: builtin/clean.c:166 +#, c-format +msgid "Would not remove %s\n" +msgstr "" + +#: builtin/clean.c:168 +#, c-format +msgid "Not removing %s\n" +msgstr "" + +#: builtin/clone.c:243 +#, c-format +msgid "reference repository '%s' is not a local directory." +msgstr "l'archivio di riferimento '%s' non è una cartella locale." + +#: builtin/clone.c:302 +#, c-format +msgid "failed to open '%s'" +msgstr "apertura di '%s' non riuscita" + +#: builtin/clone.c:306 +#, c-format +msgid "failed to create directory '%s'" +msgstr "creazione della cartella '%s' non riuscita" + +#: builtin/clone.c:308 builtin/diff.c:75 +#, c-format +msgid "failed to stat '%s'" +msgstr "stat di '%s' non riuscito" + +#: builtin/clone.c:310 +#, c-format +msgid "%s exists and is not a directory" +msgstr "%s esiste e non è una cartella" + +#: builtin/clone.c:324 +#, c-format +msgid "failed to stat %s\n" +msgstr "stat di %s non riuscito\n" + +#: builtin/clone.c:341 +#, c-format, fuzzy +msgid "failed to unlink '%s'" +msgstr "rimozione del link '%s' non riuscita" + +#: builtin/clone.c:346 +#, c-format +msgid "failed to create link '%s'" +msgstr "creazione del link '%s' non riuscita" + +#: builtin/clone.c:350 +#, c-format +msgid "failed to copy file to '%s'" +msgstr "copia del file in '%s' non riuscita" + +#: builtin/clone.c:373 +#, c-format +msgid "done.\n" +msgstr "fatto.\n" + +#: builtin/clone.c:440 +#, c-format +msgid "Could not find remote branch %s to clone." +msgstr "Impossibile trovare il ramo remoto %s da clonare." + +#: builtin/clone.c:549 +#, fuzzy +msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" +msgstr "" +"l'HEAD remoto si riferisce ad un ref inesistente, impossibile eseguire il\n" +"checkout.\n" + +#: builtin/clone.c:639 +msgid "Too many arguments." +msgstr "Troppi argomenti." + +#: builtin/clone.c:643 +msgid "You must specify a repository to clone." +msgstr "È necessario specificare un archivio da clonare." + +#: builtin/clone.c:654 +#, c-format +msgid "--bare and --origin %s options are incompatible." +msgstr "le opzioni --bare e --origin %s non sono compatibili." + +#: builtin/clone.c:668 +#, c-format +msgid "repository '%s' does not exist" +msgstr "l'archivio '%s' non esiste" + +#: builtin/clone.c:673 +msgid "--depth is ignored in local clones; use file:// instead." +msgstr "--depth è ingnorato nei cloni locali; usare file:// invece." + +#: builtin/clone.c:683 +#, c-format +msgid "destination path '%s' already exists and is not an empty directory." +msgstr "il percorso di destinazione '%s' esiste già e non è una cartella vuota." + +#: builtin/clone.c:693 +#, c-format +msgid "working tree '%s' already exists." +msgstr "l'albero di lavoro '%s' esiste già." + +#: builtin/clone.c:706 builtin/clone.c:720 +#, c-format +msgid "could not create leading directories of '%s'" +msgstr "" + +#: builtin/clone.c:709 +#, c-format +msgid "could not create work tree dir '%s'." +msgstr "" + +#: builtin/clone.c:728 +#, c-format +msgid "Cloning into bare repository '%s'...\n" +msgstr "" + +#: builtin/clone.c:730 +#, c-format +msgid "Cloning into '%s'...\n" +msgstr "" + +#: builtin/clone.c:786 +#, c-format +msgid "Don't know how to clone %s" +msgstr "Non so come clonare %s" + +#: builtin/clone.c:835 +#, c-format +msgid "Remote branch %s not found in upstream %s" +msgstr "Il ramo remoto %s non è stato trovato in upstream %s" + +#: builtin/clone.c:842 +msgid "You appear to have cloned an empty repository." +msgstr "Sembra che sia stato clonato un archivio vuoto." + +#: builtin/column.c:51 +msgid "--command must be the first argument" +msgstr "--command deve essere il primo argomento" + +#: builtin/commit.c:43 +msgid "" +"Your name and email address were configured automatically based\n" +"on your username and hostname. Please check that they are accurate.\n" +"You can suppress this message by setting them explicitly:\n" +"\n" +" git config --global user.name \"Your Name\"\n" +" git config --global user.email you@example.com\n" +"\n" +"After doing this, you may fix the identity used for this commit with:\n" +"\n" +" git commit --amend --reset-author\n" +msgstr "" +"Il nome e l'indirizzo email sono stati configurati automaticamente usando\n" +"il nome utente ed il nome host. Per favore, verificare che siano esatti.\n" +"È possibile eliminare questo messaggio impostandoli esplicitamente:\n" +"\n" +" git config --global user.name \"Tuo Nome\"\n" +" git config --global user.email tu@esempio.com\n" +"\n" +"Dopo questa operazione, per ripristinare l'identità usata in questo commit:\n" +"\n" +" git commit --amend --reset-author\n" + +#: builtin/commit.c:55 +msgid "" +"You asked to amend the most recent commit, but doing so would make\n" +"it empty. You can repeat your command with --allow-empty, or you can\n" +"remove the commit entirely with \"git reset HEAD^\".\n" +msgstr "" + +#: builtin/commit.c:60 +msgid "" +"The previous cherry-pick is now empty, possibly due to conflict resolution.\n" +"If you wish to commit it anyway, use:\n" +"\n" +" git commit --allow-empty\n" +"\n" +"Otherwise, please use 'git reset'\n" +msgstr "" + +#: builtin/commit.c:253 +msgid "failed to unpack HEAD tree object" +msgstr "" + +#: builtin/commit.c:295 +msgid "unable to create temporary index" +msgstr "" + +#: builtin/commit.c:301 +msgid "interactive add failed" +msgstr "" + +#: builtin/commit.c:334 builtin/commit.c:355 builtin/commit.c:405 +msgid "unable to write new_index file" +msgstr "non è possibile scrivere il file new_index" + +#: builtin/commit.c:386 +msgid "cannot do a partial commit during a merge." +msgstr "non è possibile eseguire un commit parziale durante un merge." + +#: builtin/commit.c:388 +msgid "cannot do a partial commit during a cherry-pick." +msgstr "non è possibile eseguire un commit parziale durante un cherry-pick." + +#: builtin/commit.c:398 +msgid "cannot read the index" +msgstr "non è possibile leggere l'indice" + +#: builtin/commit.c:418 +msgid "unable to write temporary index file" +msgstr "scrittura del file di indice temporaneo non riuscita" + +#: builtin/commit.c:493 builtin/commit.c:499 +#, c-format +msgid "invalid commit: %s" +msgstr "commit non valido: %s" + +#: builtin/commit.c:522 +msgid "malformed --author parameter" +msgstr "parametro --author non corretto" + +#: builtin/commit.c:583 +#, c-format +msgid "Malformed ident string: '%s'" +msgstr "" + +#: builtin/commit.c:621 builtin/commit.c:654 builtin/commit.c:968 +#, c-format +msgid "could not lookup commit %s" +msgstr "" + +#: builtin/commit.c:633 builtin/shortlog.c:296 +#, c-format +msgid "(reading log message from standard input)\n" +msgstr "(lettura del messaggio di log dallo standard input)\n" + +#: builtin/commit.c:635 +msgid "could not read log from standard input" +msgstr "impossibile leggere il log dallo standard input" + +#: builtin/commit.c:639 +#, c-format +msgid "could not read log file '%s'" +msgstr "impossibile leggere il file di log '%s'" + +#: builtin/commit.c:645 +msgid "commit has empty message" +msgstr "il commit ha un messaggio vuoto" + +#: builtin/commit.c:661 +msgid "could not read MERGE_MSG" +msgstr "impossibile leggere MERGE_MSG" + +#: builtin/commit.c:665 +msgid "could not read SQUASH_MSG" +msgstr "impossibile leggere SQUASH_MSG" + +#: builtin/commit.c:669 +#, c-format +msgid "could not read '%s'" +msgstr "impossibile leggere '%s'" + +#: builtin/commit.c:721 +msgid "could not write commit template" +msgstr "non è stato possibile scrivere il modello di commit" + +#: builtin/commit.c:732 +#, c-format +msgid "" +"\n" +"It looks like you may be committing a merge.\n" +"If this is not correct, please remove the file\n" +"\t%s\n" +"and try again.\n" +msgstr "" +"\n" +"Sembra che si stia eseguendo il commit di un merge.\n" +"Se l'operazione non è corretta, per favore eliminare il file\n" +"\t%s\n" +"e riprovare.\n" + +#: builtin/commit.c:737 +#, c-format +msgid "" +"\n" +"It looks like you may be committing a cherry-pick.\n" +"If this is not correct, please remove the file\n" +"\t%s\n" +"and try again.\n" +msgstr "" + +#: builtin/commit.c:749 +#, fuzzy +msgid "" +"Please enter the commit message for your changes. Lines starting\n" +"with '#' will be ignored, and an empty message aborts the commit.\n" +msgstr "" +"Per favore, inserire il messaggio di commit per le modifiche effettuate.\n" +"Le righe che iniziano con '#' verranno ignorate, ed un messaggio vuoto\n" +"annulla il commit.\n" + +#: builtin/commit.c:754 +#, fuzzy +msgid "" +"Please enter the commit message for your changes. Lines starting\n" +"with '#' will be kept; you may remove them yourself if you want to.\n" +"An empty message aborts the commit.\n" +msgstr "" +"Per favore, inserire il messaggio di commit per le modifiche effettuate.\n" +"Le righe che iniziano con '#' verranno mantenute; possono essere rimosse\n" +"manualmente se si vuole. Un messaggio vuoto annulla il commit.\n" + +#: builtin/commit.c:767 +#, c-format +msgid "%sAuthor: %s" +msgstr "%sAutore: %s" + +#: builtin/commit.c:774 +#, c-format +msgid "%sCommitter: %s" +msgstr "%sCommitter: %s" + +#: builtin/commit.c:794 +msgid "Cannot read index" +msgstr "Impossibile leggere l'indice" + +#: builtin/commit.c:831 +msgid "Error building trees" +msgstr "Errore nella creazione degli alberi" + +#: builtin/commit.c:846 builtin/tag.c:361 +#, c-format +msgid "Please supply the message using either -m or -F option.\n" +msgstr "Per favore, fornire il messaggio usando l'opzione -m o -F.\n" + +#: builtin/commit.c:943 +#, c-format +msgid "No existing author found with '%s'" +msgstr "Nessun autore esistente trovato con '%s'" + +#: builtin/commit.c:958 builtin/commit.c:1158 +#, c-format +msgid "Invalid untracked files mode '%s'" +msgstr "" + +#: builtin/commit.c:998 +msgid "Using both --reset-author and --author does not make sense" +msgstr "L'uso di entrambe le opzioni --reset-author e --author non ha senso" + +#: builtin/commit.c:1009 +msgid "You have nothing to amend." +msgstr "Non c'è nulla da riparare." + +#: builtin/commit.c:1012 +msgid "You are in the middle of a merge -- cannot amend." +msgstr "Si è nel mezzo di un merge -- non è possibile riparare." + +#: builtin/commit.c:1014 +msgid "You are in the middle of a cherry-pick -- cannot amend." +msgstr "" + +#: builtin/commit.c:1017 +msgid "Options --squash and --fixup cannot be used together" +msgstr "Le opzioni --squash e --fixup non possono essere usate insieme" + +#: builtin/commit.c:1027 +msgid "Only one of -c/-C/-F/--fixup can be used." +msgstr "Solo una delle opzioni -c/-C/-F/--fixup può essere usata." + +#: builtin/commit.c:1029 +msgid "Option -m cannot be combined with -c/-C/-F/--fixup." +msgstr "L'opzione -m non può essere combinata con -c/-C/-F/--fixup." + +#: builtin/commit.c:1037 +msgid "--reset-author can be used only with -C, -c or --amend." +msgstr "L'opzione --reset-author può essere usata solo con -C, -c o --amend." + +#: builtin/commit.c:1054 +msgid "Only one of --include/--only/--all/--interactive/--patch can be used." +msgstr "Può essere usata solo una delle opzioni --include/--only/--all/--interactive/--patch ." + +#: builtin/commit.c:1056 +msgid "No paths with --include/--only does not make sense." +msgstr "" + +#: builtin/commit.c:1058 +#, fuzzy +msgid "Clever... amending the last one with dirty index." +msgstr "Furbo... riparare l'ultimo con un indice errato." + +#: builtin/commit.c:1060 +msgid "Explicit paths specified without -i nor -o; assuming --only paths..." +msgstr "" + +#: builtin/commit.c:1070 builtin/tag.c:577 +#, c-format +msgid "Invalid cleanup mode %s" +msgstr "" + +#: builtin/commit.c:1075 +msgid "Paths with -a does not make sense." +msgstr "" + +#: builtin/commit.c:1258 +msgid "couldn't look up newly created commit" +msgstr "" + +#: builtin/commit.c:1260 +msgid "could not parse newly created commit" +msgstr "" + +#: builtin/commit.c:1301 +msgid "detached HEAD" +msgstr "" + +#: builtin/commit.c:1303 +msgid " (root-commit)" +msgstr "" + +#: builtin/commit.c:1447 +msgid "could not parse HEAD commit" +msgstr "" + +#: builtin/commit.c:1485 builtin/merge.c:509 +#, c-format +msgid "could not open '%s' for reading" +msgstr "non è stato possibile aprire '%s' per la lettura" + +#: builtin/commit.c:1492 +#, c-format +msgid "Corrupt MERGE_HEAD file (%s)" +msgstr "File MERGE_HEAD corrotto (%s)" + +#: builtin/commit.c:1499 +msgid "could not read MERGE_MODE" +msgstr "non è stato possibile leggere MERGE_MODE" + +#: builtin/commit.c:1518 +#, c-format +msgid "could not read commit message: %s" +msgstr "non è stato possibile leggere il messaggio di commit: %s" + +#: builtin/commit.c:1532 +#, c-format +msgid "Aborting commit; you did not edit the message.\n" +msgstr "Commit annullato; il messaggio non è stato modificato.\n" + +#: builtin/commit.c:1537 +#, c-format +msgid "Aborting commit due to empty commit message.\n" +msgstr "Annullamento del commit a causa di un messaggio di commit vuoto.\n" + +#: builtin/commit.c:1552 builtin/merge.c:936 builtin/merge.c:961 +msgid "failed to write commit object" +msgstr "scrittura dell'oggetto di commit non riuscita" + +#: builtin/commit.c:1573 +msgid "cannot lock HEAD ref" +msgstr "" + +#: builtin/commit.c:1577 +msgid "cannot update HEAD ref" +msgstr "" + +#: builtin/commit.c:1588 +msgid "" +"Repository has been updated, but unable to write\n" +"new_index file. Check that disk is not full or quota is\n" +"not exceeded, and then \"git reset HEAD\" to recover." +msgstr "" +"L'archivio è stato aggiornato, ma non è stato possibile scrivere il file\n" +"new_index. Verificare che l'unità disco non sia piena o che la quota non sia\n" +"stata superata, ed eseguire \"git reset HEAD\"ccc per il ripristino." + +#: builtin/describe.c:234 +#, c-format +msgid "annotated tag %s not available" +msgstr "" + +#: builtin/describe.c:238 +#, c-format +msgid "annotated tag %s has no embedded name" +msgstr "" + +#: builtin/describe.c:240 +#, c-format +msgid "tag '%s' is really '%s' here" +msgstr "" + +#: builtin/describe.c:267 +#, c-format, fuzzy +msgid "Not a valid object name %s" +msgstr "Non è il nome di un oggetto valido %s" + +#: builtin/describe.c:270 +#, c-format +msgid "%s is not a valid '%s' object" +msgstr "%s non è un oggetto '%s' valido" + +#: builtin/describe.c:287 +#, c-format, fuzzy +msgid "no tag exactly matches '%s'" +msgstr "nessun tag corrisponde esattamente a '%s'" + +#: builtin/describe.c:289 +#, c-format +msgid "searching to describe %s\n" +msgstr "" + +#: builtin/describe.c:329 +#, c-format +msgid "finished search at %s\n" +msgstr "" + +#: builtin/describe.c:353 +#, c-format +msgid "" +"No annotated tags can describe '%s'.\n" +"However, there were unannotated tags: try --tags." +msgstr "" + +#: builtin/describe.c:357 +#, c-format +msgid "" +"No tags can describe '%s'.\n" +"Try --always, or create some tags." +msgstr "" +"Nessun tag può descrivere '%s'.\n" +"Provare con --always, o creare dei tag." + +#: builtin/describe.c:378 +#, c-format +msgid "traversed %lu commits\n" +msgstr "" + +#: builtin/describe.c:381 +#, c-format +msgid "" +"more than %i tags found; listed %i most recent\n" +"gave up search at %s\n" +msgstr "" + +#: builtin/describe.c:436 +msgid "--long is incompatible with --abbrev=0" +msgstr "--long non è compatibile con --abbrev=0" + +#: builtin/describe.c:462 +msgid "No names found, cannot describe anything." +msgstr "" + +#: builtin/describe.c:482 +msgid "--dirty is incompatible with committishes" +msgstr "" + +#: builtin/diff.c:77 +#, c-format +msgid "'%s': not a regular file or symlink" +msgstr "'%s': non è un file regolare o un link simbolico" + +#: builtin/diff.c:220 +#, c-format +msgid "invalid option: %s" +msgstr "opzione non valida: %s" + +#: builtin/diff.c:297 +msgid "Not a git repository" +msgstr "Non è un archivio git" + +#: builtin/diff.c:347 +#, c-format +msgid "invalid object '%s' given." +msgstr "" + +#: builtin/diff.c:352 +#, c-format +msgid "more than %d trees given: '%s'" +msgstr "" + +#: builtin/diff.c:362 +#, c-format +msgid "more than two blobs given: '%s'" +msgstr "" + +#: builtin/diff.c:370 +#, c-format +msgid "unhandled object '%s' given." +msgstr "" + +#: builtin/fetch.c:200 +msgid "Couldn't find remote ref HEAD" +msgstr "" + +#: builtin/fetch.c:253 +#, c-format +msgid "object %s not found" +msgstr "oggetto %s non trovato" + +#: builtin/fetch.c:259 +msgid "[up to date]" +msgstr "[aggiornato]" + +#: builtin/fetch.c:273 +#, c-format +msgid "! %-*s %-*s -> %s (can't fetch in current branch)" +msgstr "" + +#: builtin/fetch.c:274 builtin/fetch.c:360 +msgid "[rejected]" +msgstr "[respinto]" + +#: builtin/fetch.c:285 +msgid "[tag update]" +msgstr "" + +#: builtin/fetch.c:287 builtin/fetch.c:322 builtin/fetch.c:340 +msgid " (unable to update local ref)" +msgstr "" + +#: builtin/fetch.c:305 +#, fuzzy +msgid "[new tag]" +msgstr "[nuova tag]" + +#: builtin/fetch.c:308 +msgid "[new branch]" +msgstr "[nuovo ramo]" + +#: builtin/fetch.c:311 +msgid "[new ref]" +msgstr "" + +#: builtin/fetch.c:356 +msgid "unable to update local ref" +msgstr "" + +#: builtin/fetch.c:356 +msgid "forced update" +msgstr "" + +#: builtin/fetch.c:362 +msgid "(non-fast-forward)" +msgstr "" + +#: builtin/fetch.c:393 builtin/fetch.c:685 +#, c-format +msgid "cannot open %s: %s\n" +msgstr "impossibile aprire %s: %s\n" + +#: builtin/fetch.c:402 +#, c-format +msgid "%s did not send all necessary objects\n" +msgstr "%s non ha inviato tutti gli oggetti necessari\n" + +#: builtin/fetch.c:488 +#, c-format +msgid "From %.*s\n" +msgstr "Da %.*s\n" + +#: builtin/fetch.c:499 +#, c-format +msgid "" +"some local refs could not be updated; try running\n" +" 'git remote prune %s' to remove any old, conflicting branches" +msgstr "" + +#: builtin/fetch.c:549 +#, c-format +msgid " (%s will become dangling)" +msgstr "" + +#: builtin/fetch.c:550 +#, c-format +msgid " (%s has become dangling)" +msgstr "" + +#: builtin/fetch.c:557 +msgid "[deleted]" +msgstr "[eliminato]" + +#: builtin/fetch.c:558 builtin/remote.c:1055 +msgid "(none)" +msgstr "(nessuno)" + +#: builtin/fetch.c:675 +#, c-format +msgid "Refusing to fetch into current branch %s of non-bare repository" +msgstr "" + +#: builtin/fetch.c:709 +#, c-format +msgid "Don't know how to fetch from %s" +msgstr "" + +#: builtin/fetch.c:786 +#, c-format +msgid "Option \"%s\" value \"%s\" is not valid for %s" +msgstr "" + +#: builtin/fetch.c:789 +#, c-format +msgid "Option \"%s\" is ignored for %s\n" +msgstr "" + +#: builtin/fetch.c:888 +#, c-format +msgid "Fetching %s\n" +msgstr "" + +#: builtin/fetch.c:890 builtin/remote.c:100 +#, c-format +msgid "Could not fetch %s" +msgstr "" + +#: builtin/fetch.c:907 +msgid "" +"No remote repository specified. Please, specify either a URL or a\n" +"remote name from which new revisions should be fetched." +msgstr "" + +#: builtin/fetch.c:927 +#, fuzzy +msgid "You need to specify a tag name." +msgstr "È necessario specificare il nome di un tag." + +#: builtin/fetch.c:979 +msgid "fetch --all does not take a repository argument" +msgstr "fetch --all non richiede l'archivio come argomento" + +#: builtin/fetch.c:981 +msgid "fetch --all does not make sense with refspecs" +msgstr "" + +#: builtin/fetch.c:992 +#, c-format +msgid "No such remote or remote group: %s" +msgstr "" + +#: builtin/fetch.c:1000 +msgid "Fetching a group and specifying refspecs does not make sense" +msgstr "" + +#: builtin/gc.c:63 +#, c-format +msgid "Invalid %s: '%s'" +msgstr "" + +#: builtin/gc.c:90 +#, c-format +msgid "insanely long object directory %.*s" +msgstr "" + +#: builtin/gc.c:221 +#, c-format +msgid "Auto packing the repository for optimum performance.\n" +msgstr "" + +#: builtin/gc.c:224 +#, c-format +msgid "" +"Auto packing the repository for optimum performance. You may also\n" +"run \"git gc\" manually. See \"git help gc\" for more information.\n" +msgstr "" + +#: builtin/gc.c:251 +msgid "" +"There are too many unreachable loose objects; run 'git prune' to remove them." +msgstr "" + +#: builtin/grep.c:216 +#, c-format +msgid "grep: failed to create thread: %s" +msgstr "" + +#: builtin/grep.c:402 +#, c-format +msgid "Failed to chdir: %s" +msgstr "" + +#: builtin/grep.c:478 builtin/grep.c:512 +#, c-format +msgid "unable to read tree (%s)" +msgstr "" + +#: builtin/grep.c:526 +#, c-format +msgid "unable to grep from object of type %s" +msgstr "" + +#: builtin/grep.c:584 +#, c-format +msgid "switch `%c' expects a numerical value" +msgstr "" + +#: builtin/grep.c:601 +#, c-format +msgid "cannot open '%s'" +msgstr "impossibile aprire '%s'" + +#: builtin/grep.c:888 +msgid "no pattern given." +msgstr "" + +#: builtin/grep.c:902 +#, c-format +msgid "bad object %s" +msgstr "oggetto %s errato" + +#: builtin/grep.c:943 +msgid "--open-files-in-pager only works on the worktree" +msgstr "--open-files-in-pager funziona solo nell'albero di lavoro" + +#: builtin/grep.c:966 +msgid "--cached or --untracked cannot be used with --no-index." +msgstr "--cached o --untracked non può essere usato con --no-index." + +#: builtin/grep.c:971 +msgid "--no-index or --untracked cannot be used with revs." +msgstr "" + +#: builtin/grep.c:974 +msgid "--[no-]exclude-standard cannot be used for tracked contents." +msgstr "--[no-]exclude-standard non può essere usato per il contenuto tracciato." + +#: builtin/grep.c:982 +msgid "both --cached and trees are given." +msgstr "" + +#: builtin/help.c:59 +#, c-format +msgid "unrecognized help format '%s'" +msgstr "formato di aiuto '%s' non riconosciuto" + +#: builtin/help.c:87 +msgid "Failed to start emacsclient." +msgstr "Esecuzione di emacsclient non riuscita." + +#: builtin/help.c:100 +msgid "Failed to parse emacsclient version." +msgstr "Verifica della versione di emacsclient non riuscita." + +#: builtin/help.c:108 +#, c-format +msgid "emacsclient version '%d' too old (< 22)." +msgstr "la versione '%d' di emacsclient è vecchia (<22)." + +#: builtin/help.c:126 builtin/help.c:154 builtin/help.c:163 builtin/help.c:171 +#, c-format +msgid "failed to exec '%s': %s" +msgstr "esecuzione di '%s' non riuscita: %s" + +#: builtin/help.c:211 +#, c-format +msgid "" +"'%s': path for unsupported man viewer.\n" +"Please consider using 'man.<tool>.cmd' instead." +msgstr "" +"'%s': percorso ad un visualizzatore man non supportato.\n" +"Utilizzare invece 'man.<tool>.cmd'." + +#: builtin/help.c:223 +#, c-format +msgid "" +"'%s': cmd for supported man viewer.\n" +"Please consider using 'man.<tool>.path' instead." +msgstr "" + +#: builtin/help.c:287 +msgid "The most commonly used git commands are:" +msgstr "I comandi git usati più di frequente sono:" + +#: builtin/help.c:355 +#, c-format +msgid "'%s': unknown man viewer." +msgstr "'%s': visualizzatore mano sconosciuto." + +#: builtin/help.c:372 +msgid "no man viewer handled the request" +msgstr "nessun visualizzatore man ha gestito la richiesta" + +#: builtin/help.c:380 +msgid "no info viewer handled the request" +msgstr "nessun visualizzatore info ha gestito la richiesta" + +#: builtin/help.c:391 +#, c-format +msgid "'%s': not a documentation directory." +msgstr "'%s': non è una cartella della documentazione." + +#: builtin/help.c:432 builtin/help.c:439 +#, c-format +msgid "usage: %s%s" +msgstr "uso: %s%s" + +#: builtin/help.c:453 +#, c-format +msgid "`git %s' is aliased to `%s'" +msgstr "'git %s è un alias di '%s'" + +#: builtin/index-pack.c:169 +#, c-format +msgid "object type mismatch at %s" +msgstr "" + +#: builtin/index-pack.c:189 +msgid "object of unexpected type" +msgstr "" + +#: builtin/index-pack.c:226 +#, c-format +msgid "cannot fill %d byte" +msgid_plural "cannot fill %d bytes" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:236 +msgid "early EOF" +msgstr "EOF prematuro" + +#: builtin/index-pack.c:237 +msgid "read error on input" +msgstr "errore di lettura in input" + +#: builtin/index-pack.c:249 +msgid "used more bytes than were available" +msgstr "usati più byte di quelli disponibili" + +#: builtin/index-pack.c:256 +msgid "pack too large for current definition of off_t" +msgstr "" + +#: builtin/index-pack.c:272 +#, c-format +msgid "unable to create '%s'" +msgstr "non è possibile creare '%s'" + +#: builtin/index-pack.c:277 +#, c-format +msgid "cannot open packfile '%s'" +msgstr "" + +#: builtin/index-pack.c:291 +#, fuzzy +msgid "pack signature mismatch" +msgstr "la firma del pack non coincide" + +#: builtin/index-pack.c:311 +#, c-format +msgid "pack has bad object at offset %lu: %s" +msgstr "" + +#: builtin/index-pack.c:405 +#, c-format +msgid "inflate returned %d" +msgstr "" + +#: builtin/index-pack.c:450 +msgid "offset value overflow for delta base object" +msgstr "" + +#: builtin/index-pack.c:458 +msgid "delta base offset is out of bound" +msgstr "" + +#: builtin/index-pack.c:466 +#, c-format +msgid "unknown object type %d" +msgstr "tipo di oggetto %d sconosciuto" + +#: builtin/index-pack.c:495 +msgid "cannot pread pack file" +msgstr "" + +#: builtin/index-pack.c:497 +#, c-format +msgid "premature end of pack file, %lu byte missing" +msgid_plural "premature end of pack file, %lu bytes missing" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:510 +msgid "serious inflate inconsistency" +msgstr "" + +#: builtin/index-pack.c:583 +#, c-format +msgid "cannot read existing object %s" +msgstr "non è possibile leggere l'oggetto %s esistente" + +#: builtin/index-pack.c:586 +#, c-format +msgid "SHA1 COLLISION FOUND WITH %s !" +msgstr "TROVATA COLLISIONE SHA1 CON %s !" + +#: builtin/index-pack.c:598 +#, c-format +msgid "invalid blob object %s" +msgstr "" + +#: builtin/index-pack.c:610 +#, c-format, fuzzy +msgid "invalid %s" +msgstr "%s non valido" + +#: builtin/index-pack.c:612 +msgid "Error in object" +msgstr "Errore nell'oggetto" + +#: builtin/index-pack.c:614 +#, c-format +msgid "Not all child objects of %s are reachable" +msgstr "Non tutti gli oggetti figlio di %s sono raggiungibili" + +#: builtin/index-pack.c:687 builtin/index-pack.c:713 +msgid "failed to apply delta" +msgstr "applicazione del delta non riuscita" + +#: builtin/index-pack.c:850 +msgid "Receiving objects" +msgstr "Ricezione degli oggetti" + +#: builtin/index-pack.c:850 +msgid "Indexing objects" +msgstr "Indicizzazione degli oggetti" + +#: builtin/index-pack.c:872 +#, fuzzy +msgid "pack is corrupted (SHA1 mismatch)" +msgstr "il pack è corrotto (SHA1 non corrisponde)" + +#: builtin/index-pack.c:877 +msgid "cannot fstat packfile" +msgstr "" + +#: builtin/index-pack.c:880 +msgid "pack has junk at the end" +msgstr "" + +#: builtin/index-pack.c:903 +msgid "Resolving deltas" +msgstr "Risoluzione dei delta" + +#: builtin/index-pack.c:954 +msgid "confusion beyond insanity" +msgstr "confusione al di là della follia" + +#: builtin/index-pack.c:973 +#, c-format +msgid "pack has %d unresolved delta" +msgid_plural "pack has %d unresolved deltas" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:998 +#, c-format +msgid "unable to deflate appended object (%d)" +msgstr "" + +#: builtin/index-pack.c:1077 +#, c-format +msgid "local object %s is corrupt" +msgstr "" + +#: builtin/index-pack.c:1101 +#, fuzzy +msgid "error while closing pack file" +msgstr "errore durante la chiusura del file pack" + +#: builtin/index-pack.c:1114 +#, c-format, fuzzy +msgid "cannot write keep file '%s'" +msgstr "non è stato possibile scrivere il keep file '%s'" + +#: builtin/index-pack.c:1122 +#, c-format +msgid "cannot close written keep file '%s'" +msgstr "" + +#: builtin/index-pack.c:1135 +msgid "cannot store pack file" +msgstr "" + +#: builtin/index-pack.c:1146 +msgid "cannot store index file" +msgstr "" + +#: builtin/index-pack.c:1247 +#, c-format +msgid "Cannot open existing pack file '%s'" +msgstr "" + +#: builtin/index-pack.c:1249 +#, c-format +msgid "Cannot open existing pack idx file for '%s'" +msgstr "" + +#: builtin/index-pack.c:1296 +#, c-format, fuzzy +msgid "non delta: %d object" +msgid_plural "non delta: %d objects" +msgstr[0] "non delta: %d oggetto" +msgstr[1] "non delta: %d oggetti" + +#: builtin/index-pack.c:1303 +#, c-format, fuzzy +msgid "chain length = %d: %lu object" +msgid_plural "chain length = %d: %lu objects" +msgstr[0] "lunghezza della catena = %d: %lu oggetto" +msgstr[1] "lunghezza della catena = %d: %lu oggetti" + +#: builtin/index-pack.c:1330 +msgid "Cannot come back to cwd" +msgstr "" + +#: builtin/index-pack.c:1374 builtin/index-pack.c:1377 +#: builtin/index-pack.c:1389 builtin/index-pack.c:1393 +#, c-format +msgid "bad %s" +msgstr "%s errato" + +#: builtin/index-pack.c:1407 +msgid "--fix-thin cannot be used without --stdin" +msgstr "--fix-thin non può essere usato senza --stdin" + +#: builtin/index-pack.c:1411 builtin/index-pack.c:1421 +#, c-format, fuzzy +msgid "packfile name '%s' does not end with '.pack'" +msgstr "il nome del file pack '%s' non termina con '.pack'" + +#: builtin/index-pack.c:1430 +#, fuzzy +msgid "--verify with no packfile name given" +msgstr "--verify senza un nome del file pack fornito" + +#: builtin/init-db.c:35 +#, c-format +msgid "Could not make %s writable by group" +msgstr "" + +#: builtin/init-db.c:62 +#, c-format +msgid "insanely long template name %s" +msgstr "" + +#: builtin/init-db.c:67 +#, c-format +msgid "cannot stat '%s'" +msgstr "non è stato possibile eseguire lo stat di '%s'" + +#: builtin/init-db.c:73 +#, c-format +msgid "cannot stat template '%s'" +msgstr "" + +#: builtin/init-db.c:80 +#, c-format +msgid "cannot opendir '%s'" +msgstr "" + +#: builtin/init-db.c:97 +#, c-format +msgid "cannot readlink '%s'" +msgstr "" + +#: builtin/init-db.c:99 +#, c-format +msgid "insanely long symlink %s" +msgstr "" + +#: builtin/init-db.c:102 +#, c-format +msgid "cannot symlink '%s' '%s'" +msgstr "" + +#: builtin/init-db.c:106 +#, c-format +msgid "cannot copy '%s' to '%s'" +msgstr "" + +#: builtin/init-db.c:110 +#, c-format +msgid "ignoring template %s" +msgstr "" + +#: builtin/init-db.c:133 +#, c-format +msgid "insanely long template path %s" +msgstr "" + +#: builtin/init-db.c:141 +#, c-format +msgid "templates not found %s" +msgstr "" + +#: builtin/init-db.c:154 +#, c-format +msgid "not copying templates of a wrong format version %d from '%s'" +msgstr "" + +#: builtin/init-db.c:192 +#, c-format +msgid "insane git directory %s" +msgstr "" + +#: builtin/init-db.c:322 builtin/init-db.c:325 +#, c-format +msgid "%s already exists" +msgstr "%s esiste già" + +#: builtin/init-db.c:354 +#, c-format +msgid "unable to handle file type %d" +msgstr "" + +#: builtin/init-db.c:357 +#, c-format +msgid "unable to move %s to %s" +msgstr "non è stato possibile spostare %s in %s" + +#: builtin/init-db.c:362 +#, c-format +msgid "Could not create git link %s" +msgstr "" + +#. +#. * TRANSLATORS: The first '%s' is either "Reinitialized +#. * existing" or "Initialized empty", the second " shared" or +#. * "", and the last '%s%s' is the verbatim directory name. +#. +#: builtin/init-db.c:419 +#, c-format +msgid "%s%s Git repository in %s%s\n" +msgstr "%s%s archivio Git in %s%s\n" + +#: builtin/init-db.c:420 +#, fuzzy +msgid "Reinitialized existing" +msgstr "Reinizializzato un esistente" + +#: builtin/init-db.c:420 +#, fuzzy +msgid "Initialized empty" +msgstr "Inizializzato un vuoto" + +#: builtin/init-db.c:421 +msgid " shared" +msgstr " condiviso" + +#: builtin/init-db.c:440 +msgid "cannot tell cwd" +msgstr "" + +#: builtin/init-db.c:521 builtin/init-db.c:528 +#, c-format +msgid "cannot mkdir %s" +msgstr "" + +#: builtin/init-db.c:532 +#, c-format +msgid "cannot chdir to %s" +msgstr "" + +#: builtin/init-db.c:554 +#, c-format +msgid "" +"%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-" +"dir=<directory>)" +msgstr "" +"%s (o --work-tree=<cartella>) non consentito senza specificare %s (o --git-" +"dir=<cartella>)" + +#: builtin/init-db.c:578 +msgid "Cannot access current working directory" +msgstr "Non è stato possibile accedere alla cartella di lavoro corrente" + +#: builtin/init-db.c:585 +#, c-format +msgid "Cannot access work tree '%s'" +msgstr "Non è stato possibile accedere all'albero di lavoro '%s'" + +#: builtin/log.c:188 +#, c-format +msgid "Final output: %d %s\n" +msgstr "" + +#: builtin/log.c:401 builtin/log.c:489 +#, c-format +msgid "Could not read object %s" +msgstr "Non è stato possibile leggere l'oggetto %s" + +#: builtin/log.c:513 +#, c-format +msgid "Unknown type: %d" +msgstr "Tipo sconosciuto: %d" + +#: builtin/log.c:602 +msgid "format.headers without value" +msgstr "format.headers non ha alcun valore" + +#: builtin/log.c:675 +msgid "name of output directory is too long" +msgstr "il nome della cartella di output è troppo lungo" + +#: builtin/log.c:686 +#, c-format +msgid "Cannot open patch file %s" +msgstr "Non è possibile aprire il file patch %s" + +#: builtin/log.c:700 +msgid "Need exactly one range." +msgstr "" + +#: builtin/log.c:708 +msgid "Not a range." +msgstr "" + +#: builtin/log.c:745 +msgid "Could not extract email from committer identity." +msgstr "Non è stato possibile estrarre l'indirizzo email dall'identità del committer." + +#: builtin/log.c:791 +msgid "Cover letter needs email format" +msgstr "" + +#: builtin/log.c:885 +#, c-format +msgid "insane in-reply-to: %s" +msgstr "" + +#: builtin/log.c:958 +msgid "Two output directories?" +msgstr "Due cartelle di output?" + +#: builtin/log.c:1179 +#, c-format +msgid "bogus committer info %s" +msgstr "" + +#: builtin/log.c:1224 +msgid "-n and -k are mutually exclusive." +msgstr "" + +#: builtin/log.c:1226 +msgid "--subject-prefix and -k are mutually exclusive." +msgstr "" + +#: builtin/log.c:1234 +msgid "--name-only does not make sense" +msgstr "--name-only non ha senso" + +#: builtin/log.c:1236 +msgid "--name-status does not make sense" +msgstr "--name-status non ha senso" + +#: builtin/log.c:1238 +msgid "--check does not make sense" +msgstr "--check non ha senso" + +#: builtin/log.c:1261 +msgid "standard output, or directory, which one?" +msgstr "standard output, o cartella, quale dei due?" + +#: builtin/log.c:1263 +#, c-format +msgid "Could not create directory '%s'" +msgstr "Non è stato possibile creare la cartella '%s'" + +#: builtin/log.c:1416 +msgid "Failed to create output files" +msgstr "Creazione dei file di output non riuscita" + +#: builtin/log.c:1520 +#, c-format +msgid "" +"Could not find a tracked remote branch, please specify <upstream> manually.\n" +msgstr "" + +#: builtin/log.c:1536 builtin/log.c:1538 builtin/log.c:1550 +#, c-format +msgid "Unknown commit %s" +msgstr "Commit %s sconosciuto" + +#: builtin/merge.c:90 +msgid "switch `m' requires a value" +msgstr "lo switch 'm' richiede un valore" + +#: builtin/merge.c:127 +#, c-format +msgid "Could not find merge strategy '%s'.\n" +msgstr "Non è stato possibile trovare la strategia di merge '%s'.\n" + +#: builtin/merge.c:128 +#, c-format +msgid "Available strategies are:" +msgstr "Le strategie disponibili sono:" + +#: builtin/merge.c:133 +#, c-format +msgid "Available custom strategies are:" +msgstr "Le strategie personalizzate disponibili sono:" + +#: builtin/merge.c:240 +msgid "could not run stash." +msgstr "non è stato possibile eseguire stash." + +#: builtin/merge.c:245 +msgid "stash failed" +msgstr "esecuzione di stash non riuscita" + +#: builtin/merge.c:250 +#, c-format +msgid "not a valid object: %s" +msgstr "non è un oggetto valido: %s" + +#: builtin/merge.c:269 builtin/merge.c:286 +msgid "read-tree failed" +msgstr "read-tree non riuscito" + +#: builtin/merge.c:316 +msgid " (nothing to squash)" +msgstr "" + +#: builtin/merge.c:329 +#, c-format +msgid "Squash commit -- not updating HEAD\n" +msgstr "" + +#: builtin/merge.c:361 +msgid "Writing SQUASH_MSG" +msgstr "Scrittura di SQUASH_MSG" + +#: builtin/merge.c:363 +msgid "Finishing SQUASH_MSG" +msgstr "Completamento di SQUASH_MSG" + +#: builtin/merge.c:386 +#, c-format +msgid "No merge message -- not updating HEAD\n" +msgstr "Nessun messaggio di merge -- HEAD non viene aggiornato\n" + +#: builtin/merge.c:437 +#, c-format +msgid "'%s' does not point to a commit" +msgstr "'%s' non punta ad un commit" + +#: builtin/merge.c:536 +#, c-format +msgid "Bad branch.%s.mergeoptions string: %s" +msgstr "Stringa branch.%s.mergeoptions errata: %s" + +#: builtin/merge.c:629 +msgid "git write-tree failed to write a tree" +msgstr "git write-tree non è riuscito a scrivere un albero" + +#: builtin/merge.c:679 +msgid "failed to read the cache" +msgstr "lettura della cache non riuscita" + +#: builtin/merge.c:697 +msgid "Unable to write index." +msgstr "Non è possibile scrivere l'indice." + +#: builtin/merge.c:710 +msgid "Not handling anything other than two heads merge." +msgstr "" + +#: builtin/merge.c:724 +#, c-format +msgid "Unknown option for merge-recursive: -X%s" +msgstr "Opzione per merge-recursive sconosciuta: -X%s" + +#: builtin/merge.c:738 +#, c-format +msgid "unable to write %s" +msgstr "non è possibile scrivere %s" + +#: builtin/merge.c:877 +#, c-format +msgid "Could not read from '%s'" +msgstr "Non è stato possibile leggere da '%s'" + +#: builtin/merge.c:886 +#, c-format +msgid "Not committing merge; use 'git commit' to complete the merge.\n" +msgstr "" + +#: builtin/merge.c:892 +msgid "" +"Please enter a commit message to explain why this merge is necessary,\n" +"especially if it merges an updated upstream into a topic branch.\n" +"\n" +"Lines starting with '#' will be ignored, and an empty message aborts\n" +"the commit.\n" +msgstr "" + +#: builtin/merge.c:916 +msgid "Empty commit message." +msgstr "Messaggio di commit vuoto." + +#: builtin/merge.c:928 +#, c-format +msgid "Wonderful.\n" +msgstr "Splendido.\n" + +#: builtin/merge.c:993 +#, c-format, fuzzy +msgid "Automatic merge failed; fix conflicts and then commit the result.\n" +msgstr "" +"Merge automatico fallito; risolvere i conflitti ed effettuare il commit del\n" +"risultato.\n" + +#: builtin/merge.c:1009 +#, c-format +msgid "'%s' is not a commit" +msgstr "'%s' non è un commit" + +#: builtin/merge.c:1050 +msgid "No current branch." +msgstr "Nessun ramo corrente." + +#: builtin/merge.c:1052 +msgid "No remote for the current branch." +msgstr "" + +#: builtin/merge.c:1054 +#, fuzzy +msgid "No default upstream defined for the current branch." +msgstr "Nessun upstream di default definito per il ramo corrente." + +#: builtin/merge.c:1059 +#, c-format +msgid "No remote tracking branch for %s from %s" +msgstr "" + +#: builtin/merge.c:1146 builtin/merge.c:1303 +#, c-format, fuzzy +msgid "%s - not something we can merge" +msgstr "%s - non è qualcosa per cui effettuare il merge" + +#: builtin/merge.c:1214 +msgid "There is no merge to abort (MERGE_HEAD missing)." +msgstr "" + +#: builtin/merge.c:1230 git-pull.sh:31 +msgid "" +"You have not concluded your merge (MERGE_HEAD exists).\n" +"Please, commit your changes before you can merge." +msgstr "" +"Il merge non è stato concluso (esiste MERGE_HEAD).\n" +"Per favore, effettuare il commit delle modifiche prima del merge." + +#: builtin/merge.c:1233 git-pull.sh:34 +msgid "You have not concluded your merge (MERGE_HEAD exists)." +msgstr "Il merge non è stato concluso (esiste MERGE_HEAD)." + +#: builtin/merge.c:1237 +msgid "" +"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" +"Please, commit your changes before you can merge." +msgstr "" +"Il cherry-pick non è stato concluso (esiste CHERRY_PICK_HEAD).\n" +"Per favore, eseguire il commit delle modifiche prima del merge." + +#: builtin/merge.c:1240 +msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." +msgstr "" + +#: builtin/merge.c:1249 +msgid "You cannot combine --squash with --no-ff." +msgstr "Non è possibile combinare --squash con --no-off." + +#: builtin/merge.c:1254 +msgid "You cannot combine --no-ff with --ff-only." +msgstr "Non è possibile combinare --no-ff con --ff-only." + +#: builtin/merge.c:1261 +msgid "No commit specified and merge.defaultToUpstream not set." +msgstr "Nessun commit specificato e merge.defaultToUpstream non definito." + +#: builtin/merge.c:1293 +msgid "Can merge only exactly one commit into empty head" +msgstr "" + +#: builtin/merge.c:1296 +msgid "Squash commit into empty head not supported yet" +msgstr "" + +#: builtin/merge.c:1298 +msgid "Non-fast-forward commit does not make sense into an empty head" +msgstr "" + +#: builtin/merge.c:1413 +#, c-format +msgid "Updating %s..%s\n" +msgstr "Aggiornamento di %s..%s\n" + +#: builtin/merge.c:1451 +#, c-format +msgid "Trying really trivial in-index merge...\n" +msgstr "" + +#: builtin/merge.c:1458 +#, c-format +msgid "Nope.\n" +msgstr "No.\n" + +#: builtin/merge.c:1490 +msgid "Not possible to fast-forward, aborting." +msgstr "" + +#: builtin/merge.c:1513 builtin/merge.c:1592 +#, c-format +msgid "Rewinding the tree to pristine...\n" +msgstr "" + +#: builtin/merge.c:1517 +#, c-format +msgid "Trying merge strategy %s...\n" +msgstr "" + +#: builtin/merge.c:1583 +#, c-format +msgid "No merge strategy handled the merge.\n" +msgstr "" + +#: builtin/merge.c:1585 +#, c-format +msgid "Merge with strategy %s failed.\n" +msgstr "" + +#: builtin/merge.c:1594 +#, c-format +msgid "Using the %s to prepare resolving by hand.\n" +msgstr "" + +#: builtin/merge.c:1606 +#, c-format +msgid "Automatic merge went well; stopped before committing as requested\n" +msgstr "" + +#: builtin/mv.c:108 +#, c-format +msgid "Checking rename of '%s' to '%s'\n" +msgstr "" + +#: builtin/mv.c:112 +msgid "bad source" +msgstr "" + +#: builtin/mv.c:115 +msgid "can not move directory into itself" +msgstr "" + +#: builtin/mv.c:118 +msgid "cannot move directory over file" +msgstr "" + +#: builtin/mv.c:128 +#, c-format +msgid "Huh? %.*s is in index?" +msgstr "Eh? %.*s si trova nell'indice?" + +#: builtin/mv.c:140 +msgid "source directory is empty" +msgstr "la cartella sorgente è vuota" + +#: builtin/mv.c:171 +msgid "not under version control" +msgstr "non si trova nel sistema di controllo versione" + +#: builtin/mv.c:173 +msgid "destination exists" +msgstr "la destinazione esiste" + +#: builtin/mv.c:181 +#, c-format +msgid "overwriting '%s'" +msgstr "sovrascrittura di %s in corso" + +#: builtin/mv.c:184 +msgid "Cannot overwrite" +msgstr "" + +#: builtin/mv.c:187 +msgid "multiple sources for the same target" +msgstr "fonti multiple per la stessa destinazione" + +#: builtin/mv.c:202 +#, c-format +msgid "%s, source=%s, destination=%s" +msgstr "%s, sorgente=%s, destinazione=%s" + +#: builtin/mv.c:212 +#, c-format +msgid "Renaming %s to %s\n" +msgstr "Rinominazione di %s in %s in corso\n" + +#: builtin/mv.c:215 builtin/remote.c:731 +#, c-format +msgid "renaming '%s' failed" +msgstr "" + +#: builtin/notes.c:139 +#, c-format +msgid "unable to start 'show' for object '%s'" +msgstr "" + +#: builtin/notes.c:145 +msgid "can't fdopen 'show' output fd" +msgstr "" + +#: builtin/notes.c:155 +#, c-format +msgid "failed to close pipe to 'show' for object '%s'" +msgstr "" + +#: builtin/notes.c:158 +#, c-format +msgid "failed to finish 'show' for object '%s'" +msgstr "" + +#: builtin/notes.c:175 builtin/tag.c:347 +#, c-format +msgid "could not create file '%s'" +msgstr "" + +#: builtin/notes.c:189 +msgid "Please supply the note contents using either -m or -F option" +msgstr "" + +#: builtin/notes.c:210 builtin/notes.c:973 +#, c-format +msgid "Removing note for object %s\n" +msgstr "" + +#: builtin/notes.c:215 +msgid "unable to write note object" +msgstr "" + +#: builtin/notes.c:217 +#, c-format +msgid "The note contents has been left in %s" +msgstr "" + +#: builtin/notes.c:251 builtin/tag.c:542 +#, c-format +msgid "cannot read '%s'" +msgstr "" + +#: builtin/notes.c:253 builtin/tag.c:545 +#, c-format +msgid "could not open or read '%s'" +msgstr "" + +#: builtin/notes.c:272 builtin/notes.c:445 builtin/notes.c:447 +#: builtin/notes.c:507 builtin/notes.c:561 builtin/notes.c:644 +#: builtin/notes.c:649 builtin/notes.c:724 builtin/notes.c:766 +#: builtin/notes.c:968 builtin/reset.c:293 builtin/tag.c:558 +#, c-format +msgid "Failed to resolve '%s' as a valid ref." +msgstr "" + +#: builtin/notes.c:275 +#, c-format +msgid "Failed to read object '%s'." +msgstr "" + +#: builtin/notes.c:299 +msgid "Cannot commit uninitialized/unreferenced notes tree" +msgstr "" + +#: builtin/notes.c:340 +#, c-format +msgid "Bad notes.rewriteMode value: '%s'" +msgstr "Valore di notes.rewriteMode errato: '%s'" + +#: builtin/notes.c:350 +#, c-format +msgid "Refusing to rewrite notes in %s (outside of refs/notes/)" +msgstr "" + +#. TRANSLATORS: The first %s is the name of the +#. environment variable, the second %s is its value +#: builtin/notes.c:377 +#, c-format +msgid "Bad %s value: '%s'" +msgstr "Valore di %s errato: '%s'" + +#: builtin/notes.c:441 +#, c-format +msgid "Malformed input line: '%s'." +msgstr "" + +#: builtin/notes.c:456 +#, c-format +msgid "Failed to copy notes from '%s' to '%s'" +msgstr "" + +#: builtin/notes.c:500 builtin/notes.c:554 builtin/notes.c:627 +#: builtin/notes.c:639 builtin/notes.c:712 builtin/notes.c:759 +#: builtin/notes.c:1033 +msgid "too many parameters" +msgstr "troppi parametri" + +#: builtin/notes.c:513 builtin/notes.c:772 +#, c-format +msgid "No note found for object %s." +msgstr "Nessuna nota trovata per l'oggetto %s." + +#: builtin/notes.c:580 +#, c-format +msgid "" +"Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite " +"existing notes" +msgstr "" + +#: builtin/notes.c:585 builtin/notes.c:662 +#, c-format +msgid "Overwriting existing notes for object %s\n" +msgstr "" + +#: builtin/notes.c:635 +msgid "too few parameters" +msgstr "troppi pochi parametri" + +#: builtin/notes.c:656 +#, c-format +msgid "" +"Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite " +"existing notes" +msgstr "" + +#: builtin/notes.c:668 +#, c-format +msgid "Missing notes on source object %s. Cannot copy." +msgstr "" + +#: builtin/notes.c:717 +#, c-format +msgid "" +"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n" +"Please use 'git notes add -f -m/-F/-c/-C' instead.\n" +msgstr "" + +#: builtin/notes.c:971 +#, c-format +msgid "Object %s has no note\n" +msgstr "L'oggetto %s non ha note.\n" + +#: builtin/notes.c:1103 builtin/remote.c:1598 +#, c-format +msgid "Unknown subcommand: %s" +msgstr "" + +#: builtin/pack-objects.c:2315 +#, c-format +msgid "unsupported index version %s" +msgstr "" + +#: builtin/pack-objects.c:2319 +#, c-format +msgid "bad index version '%s'" +msgstr "versione dell'indice '%s' errata" + +#: builtin/pack-objects.c:2342 +#, c-format +msgid "option %s does not accept negative form" +msgstr "l'opzione %s non accetta forme negative" + +#: builtin/pack-objects.c:2346 +#, c-format +msgid "unable to parse value '%s' for option %s" +msgstr "" + +#: builtin/push.c:45 +msgid "tag shorthand without <tag>" +msgstr "" + +#: builtin/push.c:64 +msgid "--delete only accepts plain target ref names" +msgstr "" + +#: builtin/push.c:99 +msgid "" +"\n" +"To choose either option permanently, see push.default in 'git help config'." +msgstr "" + +#: builtin/push.c:102 +#, c-format +msgid "" +"The upstream branch of your current branch does not match\n" +"the name of your current branch. To push to the upstream branch\n" +"on the remote, use\n" +"\n" +" git push %s HEAD:%s\n" +"\n" +"To push to the branch of the same name on the remote, use\n" +"\n" +" git push %s %s\n" +"%s" +msgstr "" + +#: builtin/push.c:121 +#, c-format +msgid "" +"You are not currently on a branch.\n" +"To push the history leading to the current (detached HEAD)\n" +"state now, use\n" +"\n" +" git push %s HEAD:<name-of-remote-branch>\n" +msgstr "" + +#: builtin/push.c:128 +#, c-format +msgid "" +"The current branch %s has no upstream branch.\n" +"To push the current branch and set the remote as upstream, use\n" +"\n" +" git push --set-upstream %s %s\n" +msgstr "" + +#: builtin/push.c:136 +#, c-format +msgid "The current branch %s has multiple upstream branches, refusing to push." +msgstr "" + +#: builtin/push.c:139 +#, c-format +msgid "" +"You are pushing to remote '%s', which is not the upstream of\n" +"your current branch '%s', without telling me what to push\n" +"to update which remote branch." +msgstr "" + +#: builtin/push.c:174 +msgid "" +"You didn't specify any refspecs to push, and push.default is \"nothing\"." +msgstr "" + +#: builtin/push.c:181 +msgid "" +"Updates were rejected because the tip of your current branch is behind\n" +"its remote counterpart. Merge the remote changes (e.g. 'git pull')\n" +"before pushing again.\n" +"See the 'Note about fast-forwards' in 'git push --help' for details." +msgstr "" + +#: builtin/push.c:187 +msgid "" +"Updates were rejected because a pushed branch tip is behind its remote\n" +"counterpart. If you did not intend to push that branch, you may want to\n" +"specify branches to push or set the 'push.default' configuration\n" +"variable to 'current' or 'upstream' to push only the current branch." +msgstr "" + +#: builtin/push.c:193 +msgid "" +"Updates were rejected because a pushed branch tip is behind its remote\n" +"counterpart. Check out this branch and merge the remote changes\n" +"(e.g. 'git pull') before pushing again.\n" +"See the 'Note about fast-forwards' in 'git push --help' for details." +msgstr "" + +#: builtin/push.c:233 +#, c-format +msgid "Pushing to %s\n" +msgstr "" + +#: builtin/push.c:237 +#, c-format +msgid "failed to push some refs to '%s'" +msgstr "" + +#: builtin/push.c:269 +#, c-format +msgid "bad repository '%s'" +msgstr "archivio '%s' errato" + +#: builtin/push.c:270 +msgid "" +"No configured push destination.\n" +"Either specify the URL from the command-line or configure a remote " +"repository using\n" +"\n" +" git remote add <name> <url>\n" +"\n" +"and then push using the remote name\n" +"\n" +" git push <name>\n" +msgstr "" + +#: builtin/push.c:285 +msgid "--all and --tags are incompatible" +msgstr "--all e tags non sono compatibili" + +#: builtin/push.c:286 +msgid "--all can't be combined with refspecs" +msgstr "" + +#: builtin/push.c:291 +msgid "--mirror and --tags are incompatible" +msgstr "" + +#: builtin/push.c:292 +msgid "--mirror can't be combined with refspecs" +msgstr "" + +#: builtin/push.c:297 +msgid "--all and --mirror are incompatible" +msgstr "--all e --mirror non sono compatibili" + +#: builtin/push.c:385 +msgid "--delete is incompatible with --all, --mirror and --tags" +msgstr "--delete non è compatibile con --all, --mirror e --tags" + +#: builtin/push.c:387 +msgid "--delete doesn't make sense without any refs" +msgstr "" + +#: builtin/remote.c:98 +#, c-format +msgid "Updating %s" +msgstr "Aggiornamento di %s" + +#: builtin/remote.c:130 +msgid "" +"--mirror is dangerous and deprecated; please\n" +"\t use --mirror=fetch or --mirror=push instead" +msgstr "" +"--mirror è pericoloso e deprecato; per favore\n" +"\t usare invece --mirror-fetch o --mirror-push" + +#: builtin/remote.c:147 +#, c-format +msgid "unknown mirror argument: %s" +msgstr "" + +#: builtin/remote.c:185 +msgid "specifying a master branch makes no sense with --mirror" +msgstr "" + +#: builtin/remote.c:187 +msgid "specifying branches to track makes sense only with fetch mirrors" +msgstr "" + +#: builtin/remote.c:195 builtin/remote.c:646 +#, c-format +msgid "remote %s already exists." +msgstr "" + +#: builtin/remote.c:199 builtin/remote.c:650 +#, c-format +msgid "'%s' is not a valid remote name" +msgstr "" + +#: builtin/remote.c:243 +#, c-format +msgid "Could not setup master '%s'" +msgstr "" + +#: builtin/remote.c:299 +#, c-format +msgid "more than one %s" +msgstr "" + +#: builtin/remote.c:339 +#, c-format +msgid "Could not get fetch map for refspec %s" +msgstr "" + +#: builtin/remote.c:440 builtin/remote.c:448 +msgid "(matching)" +msgstr "" + +#: builtin/remote.c:452 +msgid "(delete)" +msgstr "" + +#: builtin/remote.c:595 builtin/remote.c:601 builtin/remote.c:607 +#, c-format +msgid "Could not append '%s' to '%s'" +msgstr "" + +#: builtin/remote.c:639 builtin/remote.c:792 builtin/remote.c:890 +#, c-format +msgid "No such remote: %s" +msgstr "" + +#: builtin/remote.c:656 +#, c-format, fuzzy +msgid "Could not rename config section '%s' to '%s'" +msgstr "Non è stato possibile rinominare la sezione di configurazione '%s' in '%s'" + +#: builtin/remote.c:662 builtin/remote.c:799 +#, c-format +msgid "Could not remove config section '%s'" +msgstr "Non è stato possibile rimuovere la sezione di configurazione '%s'" + +#: builtin/remote.c:677 +#, c-format +msgid "" +"Not updating non-default fetch respec\n" +"\t%s\n" +"\tPlease update the configuration manually if necessary." +msgstr "" + +#: builtin/remote.c:683 +#, c-format +msgid "Could not append '%s'" +msgstr "" + +#: builtin/remote.c:694 +#, c-format +msgid "Could not set '%s'" +msgstr "" + +#: builtin/remote.c:716 +#, c-format +msgid "deleting '%s' failed" +msgstr "eliminazione di '%s' fallita" + +#: builtin/remote.c:750 +#, c-format +msgid "creating '%s' failed" +msgstr "creazione di '%s' non riuscita" + +#: builtin/remote.c:764 +#, c-format +msgid "Could not remove branch %s" +msgstr "Non è stato possibile rimuovere il ramo %s" + +#: builtin/remote.c:834 +msgid "" +"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" +"to delete it, use:" +msgid_plural "" +"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n" +"to delete them, use:" +msgstr[0] "" +msgstr[1] "" + +#: builtin/remote.c:943 +#, c-format +msgid " new (next fetch will store in remotes/%s)" +msgstr "" + +#: builtin/remote.c:946 +msgid " tracked" +msgstr "" + +#: builtin/remote.c:948 +msgid " stale (use 'git remote prune' to remove)" +msgstr "" + +#: builtin/remote.c:950 +msgid " ???" +msgstr "" + +#: builtin/remote.c:991 +#, c-format +msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch" +msgstr "" + +#: builtin/remote.c:998 +#, c-format +msgid "rebases onto remote %s" +msgstr "" + +#: builtin/remote.c:1001 +#, c-format +msgid " merges with remote %s" +msgstr "" + +#: builtin/remote.c:1002 +msgid " and with remote" +msgstr "" + +#: builtin/remote.c:1004 +#, c-format +msgid "merges with remote %s" +msgstr "" + +#: builtin/remote.c:1005 +msgid " and with remote" +msgstr "" + +#: builtin/remote.c:1051 +msgid "create" +msgstr "" + +#: builtin/remote.c:1054 +msgid "delete" +msgstr "" + +#: builtin/remote.c:1058 +msgid "up to date" +msgstr "" + +#: builtin/remote.c:1061 +msgid "fast-forwardable" +msgstr "" + +#: builtin/remote.c:1064 +msgid "local out of date" +msgstr "" + +#: builtin/remote.c:1071 +#, c-format +msgid " %-*s forces to %-*s (%s)" +msgstr "" + +#: builtin/remote.c:1074 +#, c-format +msgid " %-*s pushes to %-*s (%s)" +msgstr "" + +#: builtin/remote.c:1078 +#, c-format +msgid " %-*s forces to %s" +msgstr "" + +#: builtin/remote.c:1081 +#, c-format +msgid " %-*s pushes to %s" +msgstr "" + +#: builtin/remote.c:1118 +#, c-format +msgid "* remote %s" +msgstr "" + +#: builtin/remote.c:1119 +#, c-format +msgid " Fetch URL: %s" +msgstr "" + +#: builtin/remote.c:1120 builtin/remote.c:1285 +msgid "(no URL)" +msgstr "(nessun URL)" + +#: builtin/remote.c:1129 builtin/remote.c:1131 +#, c-format +msgid " Push URL: %s" +msgstr "" + +#: builtin/remote.c:1133 builtin/remote.c:1135 builtin/remote.c:1137 +#, c-format +msgid " HEAD branch: %s" +msgstr " ramo HEAD: %s" + +#: builtin/remote.c:1139 +#, c-format +msgid "" +" HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" +msgstr "" + +#: builtin/remote.c:1151 +#, c-format +msgid " Remote branch:%s" +msgid_plural " Remote branches:%s" +msgstr[0] " Ramo remoto:%s" +msgstr[1] " Rami remoti:%s" + +#: builtin/remote.c:1154 builtin/remote.c:1181 +msgid " (status not queried)" +msgstr "" + +#: builtin/remote.c:1163 +msgid " Local branch configured for 'git pull':" +msgid_plural " Local branches configured for 'git pull':" +msgstr[0] " Ramo locale configurato per 'git pull':" +msgstr[1] " Rami locali configurati per 'git pull':" + +#: builtin/remote.c:1171 +msgid " Local refs will be mirrored by 'git push'" +msgstr "" + +#: builtin/remote.c:1178 +#, c-format +msgid " Local ref configured for 'git push'%s:" +msgid_plural " Local refs configured for 'git push'%s:" +msgstr[0] "" +msgstr[1] "" + +#: builtin/remote.c:1216 +msgid "Cannot determine remote HEAD" +msgstr "" + +#: builtin/remote.c:1218 +msgid "Multiple remote HEAD branches. Please choose one explicitly with:" +msgstr "" + +#: builtin/remote.c:1228 +#, c-format +msgid "Could not delete %s" +msgstr "" + +#: builtin/remote.c:1236 +#, c-format +msgid "Not a valid ref: %s" +msgstr "" + +#: builtin/remote.c:1238 +#, c-format +msgid "Could not setup %s" +msgstr "" + +#: builtin/remote.c:1274 +#, c-format +msgid " %s will become dangling!" +msgstr "" + +#: builtin/remote.c:1275 +#, c-format +msgid " %s has become dangling!" +msgstr "" + +#: builtin/remote.c:1281 +#, c-format +msgid "Pruning %s" +msgstr "" + +#: builtin/remote.c:1282 +#, c-format +msgid "URL: %s" +msgstr "" + +#: builtin/remote.c:1295 +#, c-format +msgid " * [would prune] %s" +msgstr "" + +#: builtin/remote.c:1298 +#, c-format +msgid " * [pruned] %s" +msgstr "" + +#: builtin/remote.c:1387 builtin/remote.c:1461 +#, c-format +msgid "No such remote '%s'" +msgstr "" + +#: builtin/remote.c:1414 +msgid "no remote specified" +msgstr "" + +#: builtin/remote.c:1447 +msgid "--add --delete doesn't make sense" +msgstr "--add --delete non ha senso" + +#: builtin/remote.c:1487 +#, c-format +msgid "Invalid old URL pattern: %s" +msgstr "" + +#: builtin/remote.c:1495 +#, c-format +msgid "No such URL found: %s" +msgstr "Nessuna URL trovata: %s" + +#: builtin/remote.c:1497 +msgid "Will not delete all non-push URLs" +msgstr "" + +#: builtin/reset.c:33 +msgid "mixed" +msgstr "" + +#: builtin/reset.c:33 +msgid "soft" +msgstr "" + +#: builtin/reset.c:33 +msgid "hard" +msgstr "" + +#: builtin/reset.c:33 +msgid "merge" +msgstr "" + +#: builtin/reset.c:33 +msgid "keep" +msgstr "" + +#: builtin/reset.c:77 +msgid "You do not have a valid HEAD." +msgstr "" + +#: builtin/reset.c:79 +msgid "Failed to find tree of HEAD." +msgstr "" + +#: builtin/reset.c:85 +#, c-format +msgid "Failed to find tree of %s." +msgstr "Ricerca dell'albero di %s non riuscita." + +#: builtin/reset.c:96 +msgid "Could not write new index file." +msgstr "Non è stato possibile scrivere il nuovo file indice." + +#: builtin/reset.c:106 +#, c-format, fuzzy +msgid "HEAD is now at %s" +msgstr "HEAD ora si trova a %s" + +#: builtin/reset.c:130 +msgid "Could not read index" +msgstr "Non è possibile leggere l'indice" + +#: builtin/reset.c:133 +msgid "Unstaged changes after reset:" +msgstr "" + +#: builtin/reset.c:223 +#, c-format +msgid "Cannot do a %s reset in the middle of a merge." +msgstr "" + +#: builtin/reset.c:297 +#, c-format +msgid "Could not parse object '%s'." +msgstr "" + +#: builtin/reset.c:302 +msgid "--patch is incompatible with --{hard,mixed,soft}" +msgstr "--patch non è compatibile con --{hard,mixed,soft}" + +#: builtin/reset.c:311 +msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead." +msgstr "--mixed con i percorsi è deprecata; usare invece 'git reset -- <percorso>'." + +#: builtin/reset.c:313 +#, c-format +msgid "Cannot do %s reset with paths." +msgstr "" + +#: builtin/reset.c:325 +#, c-format, fuzzy +msgid "%s reset is not allowed in a bare repository" +msgstr "%s reset non è consentito in un archivio scoperto #FIXME: bare" + +#: builtin/reset.c:341 +#, c-format, fuzzy +msgid "Could not reset index file to revision '%s'." +msgstr "Non è possibile ripristinare il file indice alla revisione '%s'." + +#: builtin/revert.c:70 builtin/revert.c:92 +#, c-format +msgid "%s: %s cannot be used with %s" +msgstr "%s: %s non può essere usato con %s" + +#: builtin/revert.c:131 +msgid "program error" +msgstr "errore del programma" + +#: builtin/revert.c:221 +#, fuzzy +msgid "revert failed" +msgstr "revert non riuscito" + +#: builtin/revert.c:236 +#, fuzzy +msgid "cherry-pick failed" +msgstr "cherry-pick non riuscito" + +#: builtin/rm.c:109 +#, c-format +msgid "" +"'%s' has staged content different from both the file and the HEAD\n" +"(use -f to force removal)" +msgstr "" + +#: builtin/rm.c:115 +#, c-format +msgid "" +"'%s' has changes staged in the index\n" +"(use --cached to keep the file, or -f to force removal)" +msgstr "" + +#: builtin/rm.c:119 +#, c-format +msgid "" +"'%s' has local modifications\n" +"(use --cached to keep the file, or -f to force removal)" +msgstr "" +"'%s' contiene delle modifiche locali\n" +"(usare --cached per mantenere il file, o -f per forzare la rimozione)" + +#: builtin/rm.c:194 +#, c-format +msgid "not removing '%s' recursively without -r" +msgstr "" + +#: builtin/rm.c:230 +#, c-format +msgid "git rm: unable to remove %s" +msgstr "git rm: non è possibile eliminare %s" + +#: builtin/shortlog.c:157 +#, c-format +msgid "Missing author: %s" +msgstr "Autore mancante: %s" + +#: builtin/tag.c:60 +#, c-format +msgid "malformed object at '%s'" +msgstr "" + +#: builtin/tag.c:207 +#, c-format, fuzzy +msgid "tag name too long: %.*s..." +msgstr "nome tag troppo lungo: %.*s..." + +#: builtin/tag.c:212 +#, c-format +msgid "tag '%s' not found." +msgstr "tag '%s' non trovato." + +#: builtin/tag.c:227 +#, c-format +msgid "Deleted tag '%s' (was %s)\n" +msgstr "Tag '%s' eliminato (era %s)\n" + +#: builtin/tag.c:239 +#, c-format +msgid "could not verify the tag '%s'" +msgstr "non è possibile verificare il tag '%s'" + +#: builtin/tag.c:249 +msgid "" +"\n" +"#\n" +"# Write a tag message\n" +"# Lines starting with '#' will be ignored.\n" +"#\n" +msgstr "" + +#: builtin/tag.c:256 +msgid "" +"\n" +"#\n" +"# Write a tag message\n" +"# Lines starting with '#' will be kept; you may remove them yourself if you " +"want to.\n" +"#\n" +msgstr "" + +#: builtin/tag.c:298 +msgid "unable to sign the tag" +msgstr "non è possibile firmare il tag" + +#: builtin/tag.c:300 +msgid "unable to write tag file" +msgstr "" + +#: builtin/tag.c:325 +#, fuzzy +msgid "bad object type." +msgstr "tipo di oggetto errato." + +#: builtin/tag.c:338 +#, fuzzy +msgid "tag header too big." +msgstr "intestazione del tag troppo grande" + +#: builtin/tag.c:370 +#, fuzzy +msgid "no tag message?" +msgstr "nessun messaggio per il tag?" + +#: builtin/tag.c:376 +#, c-format, fuzzy +msgid "The tag message has been left in %s\n" +msgstr "Il messaggio tag è stato lasciato in %s\n" + +#: builtin/tag.c:425 +#, fuzzy +msgid "switch 'points-at' requires an object" +msgstr "lo switch 'points-at' richiede un oggetto" + +#: builtin/tag.c:427 +#, c-format +msgid "malformed object name '%s'" +msgstr "" + +#: builtin/tag.c:506 +msgid "--column and -n are incompatible" +msgstr "--column e -n non sono compatibili" + +#: builtin/tag.c:523 +msgid "-n option is only allowed with -l." +msgstr "l'opzione -n è consentita solo con -l." + +#: builtin/tag.c:525 +msgid "--contains option is only allowed with -l." +msgstr "l'opzione --contains è consentita solo con -l." + +#: builtin/tag.c:527 +msgid "--points-at option is only allowed with -l." +msgstr "l'opzione --points-at è consentita solo con -l." + +#: builtin/tag.c:535 +msgid "only one -F or -m option is allowed." +msgstr "è consentita una sola opzione tra -F e -m." + +#: builtin/tag.c:555 +msgid "too many params" +msgstr "troppi parametri" + +#: builtin/tag.c:561 +#, c-format, fuzzy +msgid "'%s' is not a valid tag name." +msgstr "'%s' non è un nome tag valido." + +#: builtin/tag.c:566 +#, c-format +msgid "tag '%s' already exists" +msgstr "il tag '%s' esiste già" + +#: builtin/tag.c:584 +#, c-format +msgid "%s: cannot lock the ref" +msgstr "" + +#: builtin/tag.c:586 +#, c-format +msgid "%s: cannot update the ref" +msgstr "" + +#: builtin/tag.c:588 +#, c-format +msgid "Updated tag '%s' (was %s)\n" +msgstr "Tag '%s' aggiornato (era %s)\n" + +#: git.c:16 +msgid "See 'git help <command>' for more information on a specific command." +msgstr "Consultare 'git help <comando> per maggiori informazioni su un comando specifico." + +#: parse-options.h:133 parse-options.h:235 +msgid "n" +msgstr "n" + +#: parse-options.h:141 +#, fuzzy +msgid "time" +msgstr "tempo" + +#: parse-options.h:149 +msgid "file" +msgstr "file" + +#: parse-options.h:151 +msgid "when" +msgstr "quando" + +#: parse-options.h:156 +msgid "no-op (backward compatibility)" +msgstr "" + +#: parse-options.h:228 +msgid "be more verbose" +msgstr "più dettagliato" + +#: parse-options.h:230 +msgid "be more quiet" +msgstr "meno dettagliato" + +#: parse-options.h:236 +#, fuzzy +msgid "use <n> digits to display SHA-1s" +msgstr "usa <n> cifre per mostrare SHA-1" + +#: common-cmds.h:8 +#, fuzzy +msgid "Add file contents to the index" +msgstr "Aggiunge il contenuto del file all'indice" + +#: common-cmds.h:9 +msgid "Find by binary search the change that introduced a bug" +msgstr "" + +#: common-cmds.h:10 +msgid "List, create, or delete branches" +msgstr "Elenca, crea o elimina rami" + +#: common-cmds.h:11 +msgid "Checkout a branch or paths to the working tree" +msgstr "" + +#: common-cmds.h:12 +msgid "Clone a repository into a new directory" +msgstr "Clona un archivio in una nuova cartella" + +#: common-cmds.h:13 +#, fuzzy +msgid "Record changes to the repository" +msgstr "Registra modifiche nell'archivio" + +#: common-cmds.h:14 +msgid "Show changes between commits, commit and working tree, etc" +msgstr "Mostra le modifiche tra i commit, commit e albero di lavoro, ecc" + +#: common-cmds.h:15 +msgid "Download objects and refs from another repository" +msgstr "" + +#: common-cmds.h:16 +msgid "Print lines matching a pattern" +msgstr "Stampa le righe corrispondenti ad un modello" + +#: common-cmds.h:17 +msgid "Create an empty git repository or reinitialize an existing one" +msgstr "Crea un archivio git vuoto o reinizializza uno esistente" + +#: common-cmds.h:18 +msgid "Show commit logs" +msgstr "Mostra log del commit" + +#: common-cmds.h:19 +#, fuzzy +msgid "Join two or more development histories together" +msgstr "Unisce due o più cronologie di sviluppo insieme" + +#: common-cmds.h:20 +msgid "Move or rename a file, a directory, or a symlink" +msgstr "Sposta o rinomina un file, una cartella o un link simbolico" + +#: common-cmds.h:21 +#, fuzzy +msgid "Fetch from and merge with another repository or a local branch" +msgstr "Preleva e applica da un altro archivio o un ramo locale" + +#: common-cmds.h:22 +msgid "Update remote refs along with associated objects" +msgstr "" + +#: common-cmds.h:23 +msgid "Forward-port local commits to the updated upstream head" +msgstr "" + +#: common-cmds.h:24 +#, fuzzy +msgid "Reset current HEAD to the specified state" +msgstr "Ripristina l'HEAD corrente allo stato specificato" + +#: common-cmds.h:25 +msgid "Remove files from the working tree and from the index" +msgstr "Rimuove file dall'albero di lavoro e dall'indice" + +#: common-cmds.h:26 +msgid "Show various types of objects" +msgstr "Mostra vari tipi di oggetti" + +#: common-cmds.h:27 +msgid "Show the working tree status" +msgstr "Mostra lo stato dell'albero di lavoro" + +#: common-cmds.h:28 +#, fuzzy +msgid "Create, list, delete or verify a tag object signed with GPG" +msgstr "Crea, elenca. elimina o verifica un oggetto tag firmato con GPG" + +#: git-am.sh:50 +#, fuzzy +msgid "You need to set your committer info first" +msgstr "È necessario impostare le informazioni sul committer" + +#: git-am.sh:137 +msgid "Repository lacks necessary blobs to fall back on 3-way merge." +msgstr "" + +#: git-am.sh:154 +msgid "" +"Did you hand edit your patch?\n" +"It does not apply to blobs recorded in its index." +msgstr "" + +#: git-am.sh:163 +msgid "Falling back to patching base and 3-way merge..." +msgstr "" + +#: git-am.sh:275 +#, fuzzy +msgid "Only one StGIT patch series can be applied at once" +msgstr "Può essere applicata solo una serie di patch StGIT per volta" + +#: git-am.sh:362 +#, sh-format +msgid "Patch format $patch_format is not supported." +msgstr "Il formato patch $patch_format non è supportato." + +#: git-am.sh:364 +msgid "Patch format detection failed." +msgstr "" + +#: git-am.sh:418 +msgid "-d option is no longer supported. Do not use." +msgstr "l'opzione -d non è più supportata. Non utilizzarla." + +#: git-am.sh:481 +#, sh-format +msgid "previous rebase directory $dotest still exists but mbox given." +msgstr "" + +#: git-am.sh:486 +#, fuzzy +msgid "Please make up your mind. --skip or --abort?" +msgstr "Per favore, decidetevi. --skip o --abort?" + +#: git-am.sh:513 +msgid "Resolve operation not in progress, we are not resuming." +msgstr "" + +#: git-am.sh:579 +#, sh-format +msgid "Dirty index: cannot apply patches (dirty: $files)" +msgstr "" + +#: git-am.sh:755 +#, fuzzy +msgid "cannot be interactive without stdin connected to a terminal." +msgstr "" +"non è possibile passare in modalità interattiva senza uno standard input connesso ad\n" +"un terminale" + +#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a] +#. in your translation. The program will only accept English +#. input at this point. +#: git-am.sh:766 +#, fuzzy +msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all " +msgstr "Applicare? [s]ì/[n]o/[m]odifica/[v]isualizza/mostra [p]atch/[a]ccetta tutto " + +#: git-am.sh:802 +#, sh-format +msgid "Applying: $FIRSTLINE" +msgstr "" + +#: git-am.sh:847 +msgid "No changes -- Patch already applied." +msgstr "Nessuna modifica -- patch già applicata." + +#: git-am.sh:873 +msgid "applying to an empty history" +msgstr "" + +#. TRANSLATORS: Make sure to include [Y] and [n] in your +#. translation. The program will only accept English input +#. at this point. +#: git-bisect.sh:54 +#, fuzzy +msgid "Do you want me to do it for you [Y/n]? " +msgstr "Volete che me ne occupi io [S/n]? " + +#: git-bisect.sh:95 +#, sh-format +msgid "unrecognised option: '$arg'" +msgstr "opzione non riconoscitua: '$arg'" + +#: git-bisect.sh:99 +#, sh-format +msgid "'$arg' does not appear to be a valid revision" +msgstr "" + +#: git-bisect.sh:117 +#, fuzzy +msgid "Bad HEAD - I need a HEAD" +msgstr "HEAD errata - ho bisogno di una HEAD" + +#: git-bisect.sh:130 +#, sh-format +msgid "" +"Checking out '$start_head' failed. Try 'git bisect reset <validbranch>'." +msgstr "" + +#: git-bisect.sh:140 +msgid "won't bisect on seeked tree" +msgstr "" + +#: git-bisect.sh:144 +msgid "Bad HEAD - strange symbolic ref" +msgstr "" + +#: git-bisect.sh:189 +#, sh-format +msgid "Bad bisect_write argument: $state" +msgstr "" + +#: git-bisect.sh:218 +#, sh-format +msgid "Bad rev input: $arg" +msgstr "" + +#: git-bisect.sh:232 +msgid "Please call 'bisect_state' with at least one argument." +msgstr "Per favore, chiamare 'bisect_state' con almeno un argomento." + +#: git-bisect.sh:244 +#, sh-format +msgid "Bad rev input: $rev" +msgstr "" + +#: git-bisect.sh:250 +msgid "'git bisect bad' can take only one argument." +msgstr "'git bisect bad' può prendere un solo argomento." + +#. TRANSLATORS: Make sure to include [Y] and [n] in your +#. translation. The program will only accept English input +#. at this point. +#: git-bisect.sh:279 +msgid "Are you sure [Y/n]? " +msgstr "Si è sicuri? [S/n] " + +#: git-bisect.sh:354 +#, sh-format +msgid "'$invalid' is not a valid commit" +msgstr "'$invalid' non è un commit valido" + +#: git-bisect.sh:363 +#, sh-format +msgid "" +"Could not check out original HEAD '$branch'.\n" +"Try 'git bisect reset <commit>'." +msgstr "" + +#: git-bisect.sh:390 +msgid "No logfile given" +msgstr "Nessun file di log specificato" + +#: git-bisect.sh:391 +#, sh-format +msgid "cannot read $file for replaying" +msgstr "" + +#: git-bisect.sh:408 +msgid "?? what are you talking about?" +msgstr "" + +#: git-bisect.sh:474 +#, fuzzy +msgid "We are not bisecting." +msgstr "Non stiamo eseguendo il bisect." + +#: git-pull.sh:21 +msgid "" +"Pull is not possible because you have unmerged files.\n" +"Please, fix them up in the work tree, and then use 'git add/rm <file>'\n" +"as appropriate to mark resolution, or use 'git commit -a'." +msgstr "" + +#: git-pull.sh:25 +msgid "Pull is not possible because you have unmerged files." +msgstr "" + +#: git-pull.sh:197 +msgid "updating an unborn branch with changes added to the index" +msgstr "" + +#: git-pull.sh:253 +msgid "Cannot merge multiple branches into empty head" +msgstr "" + +#: git-pull.sh:257 +msgid "Cannot rebase onto multiple branches" +msgstr "Non è possibile eseguire il rebase su rami multipli" + +#: git-stash.sh:51 +#, fuzzy +msgid "git stash clear with parameters is unimplemented" +msgstr "git stash clear con parametri non è implementato" + +#: git-stash.sh:74 +msgid "You do not have the initial commit yet" +msgstr "Non esiste ancora un commit iniziale" + +#: git-stash.sh:89 +#, fuzzy +msgid "Cannot save the current index state" +msgstr "Non è possibile salvare lo stato corrente dell'indice" + +#: git-stash.sh:123 git-stash.sh:136 +#, fuzzy +msgid "Cannot save the current worktree state" +msgstr "Non è possibile salvare lo stato dell'albero di lavoro corrente" + +#: git-stash.sh:140 +msgid "No changes selected" +msgstr "Nessuna modifica selezionata" + +#: git-stash.sh:143 +msgid "Cannot remove temporary index (can't happen)" +msgstr "" + +#: git-stash.sh:156 +#, fuzzy +msgid "Cannot record working tree state" +msgstr "Non è possbile registrare lo stato dell'albero di lavoro" + +#: git-stash.sh:223 +msgid "No local changes to save" +msgstr "Nessuna modifica locale da salvare" + +#: git-stash.sh:227 +msgid "Cannot initialize stash" +msgstr "Non è possibile inizializzare stash" + +#: git-stash.sh:235 +#, fuzzy +msgid "Cannot save the current status" +msgstr "Non è possibile salvare lo stato attuale" + +#: git-stash.sh:253 +#, fuzzy +msgid "Cannot remove worktree changes" +msgstr "Non è possibile rimuovere le modifiche all'albero di lavoro" + +#: git-stash.sh:352 +msgid "No stash found." +msgstr "Nessuno stash trovato." + +#: git-stash.sh:359 +#, sh-format, fuzzy +msgid "Too many revisions specified: $REV" +msgstr "Troppe revisioni specificate: $REV" + +#: git-stash.sh:365 +#, sh-format +msgid "$reference is not valid reference" +msgstr "$reference non è un riferimento valido" + +#: git-stash.sh:393 +#, sh-format +msgid "'$args' is not a stash-like commit" +msgstr "'$args' non è un commit di tipo stash" + +#: git-stash.sh:404 +#, sh-format, fuzzy +msgid "'$args' is not a stash reference" +msgstr "'$args' non è un riferimento a stash" + +#: git-stash.sh:412 +msgid "unable to refresh index" +msgstr "non è stato possibile aggiornare l'indice" + +#: git-stash.sh:416 +msgid "Cannot apply a stash in the middle of a merge" +msgstr "Non è possibile applicare uno stash nel mezzo di un merge" + +#: git-stash.sh:424 +#, fuzzy +msgid "Conflicts in index. Try without --index." +msgstr "Ci sono conflitti nell'indice. Provare senza --index." + +#: git-stash.sh:426 +msgid "Could not save index tree" +msgstr "Non è stato possibile salvare l'indice dell'albero" + +#: git-stash.sh:460 +msgid "Cannot unstage modified files" +msgstr "" + +#: git-stash.sh:491 +#, sh-format +msgid "Dropped ${REV} ($s)" +msgstr "" + +#: git-stash.sh:492 +#, sh-format +msgid "${REV}: Could not drop stash entry" +msgstr "" + +#: git-stash.sh:499 +#, fuzzy +msgid "No branch name specified" +msgstr "Nessun nome del ramo specificato" + +#: git-stash.sh:570 +msgid "(To restore them type \"git stash apply\")" +msgstr "(Per ripristinarli digitare \"git stash apply\")" + +#: git-submodule.sh:56 +#, sh-format +msgid "cannot strip one component off url '$remoteurl'" +msgstr "" + +#: git-submodule.sh:109 +#, sh-format +msgid "No submodule mapping found in .gitmodules for path '$sm_path'" +msgstr "" + +#: git-submodule.sh:150 +#, sh-format +msgid "Clone of '$url' into submodule path '$sm_path' failed" +msgstr "" + +#: git-submodule.sh:160 +#, sh-format +msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa" +msgstr "" + +#: git-submodule.sh:249 +#, sh-format +msgid "repo URL: '$repo' must be absolute or begin with ./|../" +msgstr "" + +#: git-submodule.sh:266 +#, sh-format +msgid "'$sm_path' already exists in the index" +msgstr "" + +#: git-submodule.sh:283 +#, sh-format +msgid "'$sm_path' already exists and is not a valid git repo" +msgstr "" + +#: git-submodule.sh:297 +#, sh-format +msgid "Unable to checkout submodule '$sm_path'" +msgstr "" + +#: git-submodule.sh:302 +#, sh-format +msgid "Failed to add submodule '$sm_path'" +msgstr "" + +#: git-submodule.sh:307 +#, sh-format +msgid "Failed to register submodule '$sm_path'" +msgstr "" + +#: git-submodule.sh:349 +#, sh-format +msgid "Entering '$prefix$sm_path'" +msgstr "" + +#: git-submodule.sh:363 +#, sh-format +msgid "Stopping at '$sm_path'; script returned non-zero status." +msgstr "" + +#: git-submodule.sh:405 +#, sh-format +msgid "No url found for submodule path '$sm_path' in .gitmodules" +msgstr "" + +#: git-submodule.sh:414 +#, sh-format +msgid "Failed to register url for submodule path '$sm_path'" +msgstr "" + +#: git-submodule.sh:422 +#, sh-format +msgid "Failed to register update mode for submodule path '$sm_path'" +msgstr "" + +#: git-submodule.sh:424 +#, sh-format +msgid "Submodule '$name' ($url) registered for path '$sm_path'" +msgstr "" + +#: git-submodule.sh:523 +#, sh-format +msgid "" +"Submodule path '$sm_path' not initialized\n" +"Maybe you want to use 'update --init'?" +msgstr "" + +#: git-submodule.sh:536 +#, sh-format +msgid "Unable to find current revision in submodule path '$sm_path'" +msgstr "" + +#: git-submodule.sh:555 +#, sh-format +msgid "Unable to fetch in submodule path '$sm_path'" +msgstr "" + +#: git-submodule.sh:569 +#, sh-format +msgid "Unable to rebase '$sha1' in submodule path '$sm_path'" +msgstr "" + +#: git-submodule.sh:570 +#, sh-format +msgid "Submodule path '$sm_path': rebased into '$sha1'" +msgstr "" + +#: git-submodule.sh:575 +#, sh-format +msgid "Unable to merge '$sha1' in submodule path '$sm_path'" +msgstr "" + +#: git-submodule.sh:576 +#, sh-format +msgid "Submodule path '$sm_path': merged in '$sha1'" +msgstr "" + +#: git-submodule.sh:581 +#, sh-format +msgid "Unable to checkout '$sha1' in submodule path '$sm_path'" +msgstr "" + +#: git-submodule.sh:582 +#, sh-format +msgid "Submodule path '$sm_path': checked out '$sha1'" +msgstr "" + +#: git-submodule.sh:604 git-submodule.sh:927 +#, sh-format +msgid "Failed to recurse into submodule path '$sm_path'" +msgstr "" + +#: git-submodule.sh:712 +msgid "--" +msgstr "--" + +#: git-submodule.sh:770 +#, sh-format +msgid " Warn: $name doesn't contain commit $sha1_src" +msgstr " Attenzione: $name non contiene commit $sha1_src" + +#: git-submodule.sh:773 +#, sh-format +msgid " Warn: $name doesn't contain commit $sha1_dst" +msgstr " Attenzione: $name non contiene commit $sha1_dst" + +#: git-submodule.sh:776 +#, sh-format +msgid " Warn: $name doesn't contain commits $sha1_src and $sha1_dst" +msgstr " Attenzione: $name non contiene commit $sha1_src e $sha1_dst" + +#: git-submodule.sh:801 +msgid "blob" +msgstr "" + +#: git-submodule.sh:802 +msgid "submodule" +msgstr "" + +#: git-submodule.sh:973 +#, sh-format +msgid "Synchronizing submodule url for '$name'" +msgstr "" diff --git a/po/pt_PT.po b/po/pt_PT.po index d28c568c73..517ec29a4a 100644 --- a/po/pt_PT.po +++ b/po/pt_PT.po @@ -8,17 +8,17 @@ msgid "" msgstr "" "Project-Id-Version: Git\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2012-03-16 20:18+0800\n" -"PO-Revision-Date: 2012-04-05 20:48+0100\n" +"POT-Creation-Date: 2012-05-08 16:06+0800\n" +"PO-Revision-Date: 2012-05-14 21:17+0100\n" "Last-Translator: Marco Sousa <marcomsousa AT gmail.com>\n" "Language-Team: Portuguese\n" -"Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: advice.c:34 +#: advice.c:40 #, c-format msgid "hint: %.*s\n" msgstr "dica: %.*s\n" @@ -27,7 +27,7 @@ msgstr "dica: %.*s\n" #. * Message used both when 'git commit' fails and when #. * other commands doing a merge do. #. -#: advice.c:64 +#: advice.c:70 msgid "" "Fix them up in the work tree,\n" "and then use 'git add/rm <file>' as\n" @@ -35,12 +35,95 @@ msgid "" "or use 'git commit -a'." msgstr "" -#: commit.c:47 +#: bundle.c:36 +#, c-format +msgid "'%s' does not look like a v2 bundle file" +msgstr "" + +#: bundle.c:63 +#, c-format +msgid "unrecognized header: %s%s (%d)" +msgstr "cabeçalho não reconhecido: %s%s (%d)" + +#: bundle.c:89 +#: builtin/commit.c:753 +#, c-format +msgid "could not open '%s'" +msgstr "não é possivel abrir '%s'" + +#: bundle.c:140 +msgid "Repository lacks these prerequisite commits:" +msgstr "" + +#: bundle.c:164 +#: sequencer.c:533 +#: sequencer.c:965 +#: builtin/log.c:289 +#: builtin/log.c:719 +#: builtin/log.c:1335 +#: builtin/log.c:1554 +#: builtin/merge.c:347 +#: builtin/shortlog.c:181 +msgid "revision walk setup failed" +msgstr "" + +#: bundle.c:186 +#, c-format +msgid "The bundle contains %d ref" +msgid_plural "The bundle contains %d refs" +msgstr[0] "" +msgstr[1] "" + +#: bundle.c:192 +#, c-format +msgid "The bundle requires this ref" +msgid_plural "The bundle requires these %d refs" +msgstr[0] "" +msgstr[1] "" + +#: bundle.c:290 +msgid "rev-list died" +msgstr "rev-list morreu" + +#: bundle.c:296 +#: builtin/log.c:1231 +#: builtin/shortlog.c:284 +#, c-format +msgid "unrecognized argument: %s" +msgstr "argumento não reconhecido: %s" + +#: bundle.c:331 +#, c-format +msgid "ref '%s' is excluded by the rev-list options" +msgstr "" + +#: bundle.c:376 +msgid "Refusing to create empty bundle." +msgstr "" + +#: bundle.c:394 +msgid "Could not spawn pack-objects" +msgstr "Não foi possível pawn pack-objects" + +#: bundle.c:412 +msgid "pack-objects died" +msgstr "" + +#: bundle.c:415 +#, c-format +msgid "cannot create '%s'" +msgstr "não consegue crear '%s'" + +#: bundle.c:437 +msgid "index-pack died" +msgstr "" + +#: commit.c:48 #, c-format msgid "could not parse %s" msgstr "não consigo parsear %s" -#: commit.c:49 +#: commit.c:50 #, c-format msgid "%s %s is not a commit!" msgstr "%s %s não é um commit!" @@ -64,6 +147,74 @@ msgstr "" msgid "failed to close rev-list's stdin: %s" msgstr "" +#: date.c:95 +msgid "in the future" +msgstr "" + +#: date.c:101 +#, c-format +msgid "%lu second ago" +msgid_plural "%lu seconds ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:108 +#, c-format +msgid "%lu minute ago" +msgid_plural "%lu minutes ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:115 +#, c-format +msgid "%lu hour ago" +msgid_plural "%lu hours ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:122 +#, c-format +msgid "%lu day ago" +msgid_plural "%lu days ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:128 +#, c-format +msgid "%lu week ago" +msgid_plural "%lu weeks ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:135 +#, c-format +msgid "%lu month ago" +msgid_plural "%lu months ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:146 +#, c-format +msgid "%lu year" +msgid_plural "%lu years" +msgstr[0] "" +msgstr[1] "" + +#: date.c:149 +#, c-format +msgid "%s, %lu month ago" +msgid_plural "%s, %lu months ago" +msgstr[0] "" +msgstr[1] "" + +#: date.c:154 +#: date.c:159 +#, c-format +msgid "%lu year ago" +msgid_plural "%lu years ago" +msgstr[0] "" +msgstr[1] "" + #: diff.c:105 #, c-format msgid " Failed to parse dirstat cut-off percentage '%.*s'\n" @@ -81,32 +232,32 @@ msgid "" "%s" msgstr "" -#: diff.c:1336 +#: diff.c:1400 msgid " 0 files changed\n" msgstr " 0 ficheros modificados\n" -#: diff.c:1340 +#: diff.c:1404 #, c-format msgid " %d file changed" msgid_plural " %d files changed" msgstr[0] " %d ficheiro modificado" msgstr[1] " %d ficheiros modificados" -#: diff.c:1357 +#: diff.c:1421 #, c-format msgid ", %d insertion(+)" msgid_plural ", %d insertions(+)" msgstr[0] ", %d adição(+)" msgstr[1] ", %d adições(+)" -#: diff.c:1368 +#: diff.c:1432 #, c-format msgid ", %d deletion(-)" msgid_plural ", %d deletions(-)" msgstr[0] ", %d eliminado(-)" msgstr[1] ", %d eliminados(-)" -#: diff.c:3424 +#: diff.c:3478 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -140,13 +291,53 @@ msgstr "'%s': %s" msgid "'%s': short read %s" msgstr "" -#: help.c:287 +#: help.c:207 +#, c-format +msgid "available git commands in '%s'" +msgstr "" + +#: help.c:214 +msgid "git commands available from elsewhere on your $PATH" +msgstr "" + +#: help.c:270 #, c-format msgid "" "'%s' appears to be a git command, but we were not\n" "able to execute it. Maybe git-%s is broken?" msgstr "" +#: help.c:327 +msgid "Uh oh. Your system reports no Git commands at all." +msgstr "" + +#: help.c:349 +#, c-format +msgid "" +"WARNING: You called a Git command named '%s', which does not exist.\n" +"Continuing under the assumption that you meant '%s'" +msgstr "" + +#: help.c:354 +#, c-format +msgid "in %0.1f seconds automatically..." +msgstr "" + +#: help.c:361 +#, c-format +msgid "git: '%s' is not a git command. See 'git --help'." +msgstr "" + +#: help.c:365 +msgid "" +"\n" +"Did you mean this?" +msgid_plural "" +"\n" +"Did you mean one of these?" +msgstr[0] "" +msgstr[1] "" + #: remote.c:1607 #, c-format msgid "Your branch is ahead of '%s' by %d commit.\n" @@ -172,475 +363,502 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: sequencer.c:120 -#: builtin/merge.c:864 -#: builtin/merge.c:985 -#: builtin/merge.c:1095 -#: builtin/merge.c:1105 +#: sequencer.c:121 +#: builtin/merge.c:865 +#: builtin/merge.c:978 +#: builtin/merge.c:1088 +#: builtin/merge.c:1098 #, c-format msgid "Could not open '%s' for writing" msgstr "" -#: sequencer.c:122 -#: builtin/merge.c:334 -#: builtin/merge.c:867 -#: builtin/merge.c:1097 -#: builtin/merge.c:1110 +#: sequencer.c:123 +#: builtin/merge.c:333 +#: builtin/merge.c:868 +#: builtin/merge.c:1090 +#: builtin/merge.c:1103 #, c-format msgid "Could not write to '%s'" msgstr "Não foi possível escrever para '%s'" -#: sequencer.c:143 +#: sequencer.c:144 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add <paths>' or 'git rm <paths>'" msgstr "" -#: sequencer.c:146 +#: sequencer.c:147 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add <paths>' or 'git rm <paths>'\n" "and commit the result with 'git commit'" msgstr "" -#: sequencer.c:159 -#: sequencer.c:685 -#: sequencer.c:768 +#: sequencer.c:160 +#: sequencer.c:741 +#: sequencer.c:824 #, c-format msgid "Could not write to %s" msgstr "Não foi possível gravar para %s" -#: sequencer.c:162 +#: sequencer.c:163 #, c-format msgid "Error wrapping up %s" msgstr "" -#: sequencer.c:177 +#: sequencer.c:178 msgid "Your local changes would be overwritten by cherry-pick." msgstr "" -#: sequencer.c:179 +#: sequencer.c:180 msgid "Your local changes would be overwritten by revert." msgstr "" -#: sequencer.c:182 +#: sequencer.c:183 msgid "Commit your changes or stash them to proceed." msgstr "" #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:232 +#: sequencer.c:233 #, c-format msgid "%s: Unable to write new index file" msgstr "" -#: sequencer.c:298 +#: sequencer.c:261 +msgid "Could not resolve HEAD commit\n" +msgstr "" + +#: sequencer.c:282 +msgid "Unable to update cache tree\n" +msgstr "" + +#: sequencer.c:323 +#, c-format +msgid "Could not parse commit %s\n" +msgstr "Não foi possível analisar commit %s\n" + +#: sequencer.c:328 +#, c-format +msgid "Could not parse parent commit %s\n" +msgstr "Não foi possível analisar commit parent %s\n" + +#: sequencer.c:358 msgid "Your index file is unmerged." msgstr "O seu ficheiro de índice é não fundido." -#: sequencer.c:301 +#: sequencer.c:361 msgid "You do not have a valid HEAD" msgstr "Você não tem uma HEAD válida" -#: sequencer.c:316 +#: sequencer.c:376 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "" -#: sequencer.c:324 +#: sequencer.c:384 #, c-format msgid "Commit %s does not have parent %d" msgstr "" -#: sequencer.c:328 +#: sequencer.c:388 #, c-format msgid "Mainline was specified but commit %s is not a merge." msgstr "" #. TRANSLATORS: The first %s will be "revert" or #. "cherry-pick", the second %s a SHA1 -#: sequencer.c:339 +#: sequencer.c:399 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "" -#: sequencer.c:343 +#: sequencer.c:403 #, c-format msgid "Cannot get commit message for %s" msgstr "Não é possível obter mensagem commit para %s" -#: sequencer.c:427 +#: sequencer.c:491 #, c-format msgid "could not revert %s... %s" msgstr "" -#: sequencer.c:428 +#: sequencer.c:492 #, c-format msgid "could not apply %s... %s" msgstr "" -#: sequencer.c:450 -#: sequencer.c:909 -#: builtin/log.c:288 -#: builtin/log.c:713 -#: builtin/log.c:1329 -#: builtin/log.c:1548 -#: builtin/merge.c:348 -#: builtin/shortlog.c:181 -msgid "revision walk setup failed" -msgstr "" - -#: sequencer.c:453 +#: sequencer.c:536 msgid "empty commit set passed" msgstr "passado commit com o set vazio" -#: sequencer.c:461 +#: sequencer.c:544 #, c-format msgid "git %s: failed to read the index" msgstr "" -#: sequencer.c:466 +#: sequencer.c:549 #, c-format msgid "git %s: failed to refresh the index" msgstr "" -#: sequencer.c:551 +#: sequencer.c:607 #, c-format msgid "Cannot %s during a %s" msgstr "Não foi possível abrir %s durante um %s" -#: sequencer.c:573 +#: sequencer.c:629 #, c-format msgid "Could not parse line %d." msgstr "Não foi possível parsear linha %d." -#: sequencer.c:578 +#: sequencer.c:634 msgid "No commits parsed." msgstr "Nenhum commit parseado." -#: sequencer.c:591 +#: sequencer.c:647 #, c-format msgid "Could not open %s" msgstr "Não foi possível abrir %s" -#: sequencer.c:595 +#: sequencer.c:651 #, c-format msgid "Could not read %s." msgstr "Não foi possível ler %s." -#: sequencer.c:602 +#: sequencer.c:658 #, c-format msgid "Unusable instruction sheet: %s" msgstr "" -#: sequencer.c:630 +#: sequencer.c:686 #, c-format msgid "Invalid key: %s" msgstr "" -#: sequencer.c:633 +#: sequencer.c:689 #, c-format msgid "Invalid value for %s: %s" msgstr "Valor inválido para %s: %s" -#: sequencer.c:645 +#: sequencer.c:701 #, c-format msgid "Malformed options sheet: %s" msgstr "" -#: sequencer.c:666 +#: sequencer.c:722 msgid "a cherry-pick or revert is already in progress" msgstr "" -#: sequencer.c:667 +#: sequencer.c:723 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "" -#: sequencer.c:671 +#: sequencer.c:727 #, c-format msgid "Could not create sequencer directory %s" msgstr "" -#: sequencer.c:687 -#: sequencer.c:772 +#: sequencer.c:743 +#: sequencer.c:828 #, c-format msgid "Error wrapping up %s." msgstr "" -#: sequencer.c:706 -#: sequencer.c:840 +#: sequencer.c:762 +#: sequencer.c:896 msgid "no cherry-pick or revert in progress" msgstr "" -#: sequencer.c:708 +#: sequencer.c:764 msgid "cannot resolve HEAD" msgstr "" -#: sequencer.c:710 +#: sequencer.c:766 msgid "cannot abort from a branch yet to be born" msgstr "" -#: sequencer.c:732 +#: sequencer.c:788 +#: builtin/apply.c:3682 #, c-format msgid "cannot open %s: %s" msgstr "não foi possível abrir %s: %s" -#: sequencer.c:735 +#: sequencer.c:791 #, c-format msgid "cannot read %s: %s" msgstr "não foi possível ler %s: %s" -#: sequencer.c:736 +#: sequencer.c:792 msgid "unexpected end of file" msgstr "" -#: sequencer.c:742 +#: sequencer.c:798 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "" -#: sequencer.c:765 +#: sequencer.c:821 #, c-format msgid "Could not format %s." msgstr "Não foi possível formatear %s." -#: sequencer.c:927 +#: sequencer.c:983 msgid "Can't revert as initial commit" msgstr "" -#: sequencer.c:928 +#: sequencer.c:984 msgid "Can't cherry-pick into empty head" msgstr "" -#: wt-status.c:134 +#: sha1_name.c:864 +msgid "HEAD does not point to a branch" +msgstr "" + +#: sha1_name.c:867 +#, c-format +msgid "No such branch: '%s'" +msgstr "Não existe rama '%s'" + +#: sha1_name.c:869 +#, c-format +msgid "No upstream configured for branch '%s'" +msgstr "" + +#: sha1_name.c:872 +#, c-format +msgid "Upstream branch '%s' not stored as a remote-tracking branch" +msgstr "" + +#: wt-status.c:135 msgid "Unmerged paths:" msgstr "caminhos não fundidos:" -#: wt-status.c:140 -#: wt-status.c:157 +#: wt-status.c:141 +#: wt-status.c:158 #, c-format msgid " (use \"git reset %s <file>...\" to unstage)" msgstr "" -#: wt-status.c:142 -#: wt-status.c:159 +#: wt-status.c:143 +#: wt-status.c:160 msgid " (use \"git rm --cached <file>...\" to unstage)" msgstr "" -#: wt-status.c:143 +#: wt-status.c:144 msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" msgstr " (usa \"git add/rm <ficheiro>...\" para marcar como resolvido)" -#: wt-status.c:151 +#: wt-status.c:152 msgid "Changes to be committed:" msgstr "Mudanças a serem commitadas" -#: wt-status.c:169 +#: wt-status.c:170 msgid "Changes not staged for commit:" msgstr "" -#: wt-status.c:173 +#: wt-status.c:174 msgid " (use \"git add <file>...\" to update what will be committed)" msgstr " (usa \"git add <ficheiro>...\" para actualizar o que vai ser commitado)" -#: wt-status.c:175 +#: wt-status.c:176 msgid " (use \"git add/rm <file>...\" to update what will be committed)" msgstr " (usa \"git add/rm <ficheiro>...\" para actualizar o que vai ser commitado)" -#: wt-status.c:176 +#: wt-status.c:177 msgid " (use \"git checkout -- <file>...\" to discard changes in working directory)" msgstr "" -#: wt-status.c:178 +#: wt-status.c:179 msgid " (commit or discard the untracked or modified content in submodules)" msgstr "" -#: wt-status.c:187 +#: wt-status.c:188 #, c-format msgid "%s files:" msgstr "%s ficheros:" -#: wt-status.c:190 +#: wt-status.c:191 #, c-format msgid " (use \"git %s <file>...\" to include in what will be committed)" msgstr "" -#: wt-status.c:207 +#: wt-status.c:208 msgid "bug" msgstr "erro" -#: wt-status.c:212 +#: wt-status.c:213 msgid "both deleted:" msgstr "eliminados em ambos:" -#: wt-status.c:213 +#: wt-status.c:214 msgid "added by us:" msgstr "adicionado por nós:" -#: wt-status.c:214 +#: wt-status.c:215 msgid "deleted by them:" msgstr "eliminados por eles:" -#: wt-status.c:215 +#: wt-status.c:216 msgid "added by them:" msgstr "adicionados por eles:" -#: wt-status.c:216 +#: wt-status.c:217 msgid "deleted by us:" msgstr "eliminados por nós:" -#: wt-status.c:217 +#: wt-status.c:218 msgid "both added:" msgstr "adicionados em ambos:" -#: wt-status.c:218 +#: wt-status.c:219 msgid "both modified:" msgstr "modificados em ambos:" -#: wt-status.c:248 +#: wt-status.c:249 msgid "new commits, " msgstr "novos commits, " -#: wt-status.c:250 +#: wt-status.c:251 msgid "modified content, " msgstr "conteúdo modificado, " -#: wt-status.c:252 +#: wt-status.c:253 msgid "untracked content, " msgstr "conteúdo não seguido" -#: wt-status.c:266 +#: wt-status.c:267 #, c-format msgid "new file: %s" msgstr "novo ficheiro: %s" -#: wt-status.c:269 +#: wt-status.c:270 #, c-format msgid "copied: %s -> %s" msgstr "copiado: %s -> %s" -#: wt-status.c:272 +#: wt-status.c:273 #, c-format msgid "deleted: %s" msgstr "eliminado: %s" -#: wt-status.c:275 +#: wt-status.c:276 #, c-format msgid "modified: %s" msgstr "modificado: %s" -#: wt-status.c:278 +#: wt-status.c:279 #, c-format msgid "renamed: %s -> %s" msgstr "mudado de nome: %s -> %s" -#: wt-status.c:281 +#: wt-status.c:282 #, c-format msgid "typechange: %s" msgstr "" -#: wt-status.c:284 +#: wt-status.c:285 #, c-format msgid "unknown: %s" msgstr "desconhecido: %s" -#: wt-status.c:287 +#: wt-status.c:288 #, c-format msgid "unmerged: %s" msgstr "não fundidos: %s" -#: wt-status.c:290 +#: wt-status.c:291 #, c-format msgid "bug: unhandled diff status %c" msgstr "" -#: wt-status.c:713 +#: wt-status.c:737 msgid "On branch " msgstr "Na rama" -#: wt-status.c:720 +#: wt-status.c:744 msgid "Not currently on any branch." msgstr "Não está em nenhuma rama." -#: wt-status.c:731 +#: wt-status.c:755 msgid "Initial commit" msgstr "Commit inicial" -#: wt-status.c:745 +#: wt-status.c:769 msgid "Untracked" msgstr "Não seguido" -#: wt-status.c:747 +#: wt-status.c:771 msgid "Ignored" msgstr "Ignorado" -#: wt-status.c:749 +#: wt-status.c:773 #, c-format msgid "Untracked files not listed%s" msgstr "" -#: wt-status.c:751 +#: wt-status.c:775 msgid " (use -u option to show untracked files)" msgstr "" -#: wt-status.c:757 +#: wt-status.c:781 msgid "No changes" msgstr "Sem mudanças" -#: wt-status.c:761 +#: wt-status.c:785 #, c-format msgid "no changes added to commit%s\n" msgstr "nenhuma alteração adicionado ao commit%s\n" -#: wt-status.c:763 +#: wt-status.c:787 msgid " (use \"git add\" and/or \"git commit -a\")" msgstr " (usa \"git add\" e/ou \"git commit -a\")" -#: wt-status.c:765 +#: wt-status.c:789 #, c-format msgid "nothing added to commit but untracked files present%s\n" msgstr "" -#: wt-status.c:767 +#: wt-status.c:791 msgid " (use \"git add\" to track)" msgstr " (usa \"git add\" para seguir)" -#: wt-status.c:769 -#: wt-status.c:772 -#: wt-status.c:775 +#: wt-status.c:793 +#: wt-status.c:796 +#: wt-status.c:799 #, c-format msgid "nothing to commit%s\n" msgstr "nada para fazer commit%s\n" -#: wt-status.c:770 +#: wt-status.c:794 msgid " (create/copy files and use \"git add\" to track)" msgstr "" -#: wt-status.c:773 +#: wt-status.c:797 msgid " (use -u to show untracked files)" msgstr "" -#: wt-status.c:776 +#: wt-status.c:800 msgid " (working directory clean)" msgstr " (directório de trabalho vacio)" -#: wt-status.c:884 +#: wt-status.c:908 msgid "HEAD (no branch)" msgstr "HEAD (Não é rama)" -#: wt-status.c:890 +#: wt-status.c:914 msgid "Initial commit on " msgstr "Commit inicial em " -#: wt-status.c:905 +#: wt-status.c:929 msgid "behind " msgstr "atrás " -#: wt-status.c:908 -#: wt-status.c:911 +#: wt-status.c:932 +#: wt-status.c:935 msgid "ahead " msgstr "a frente " -#: wt-status.c:913 +#: wt-status.c:937 msgid ", behind " msgstr ", atrás " @@ -650,7 +868,7 @@ msgid "unexpected diff status %c" msgstr "" #: builtin/add.c:67 -#: builtin/commit.c:298 +#: builtin/commit.c:282 msgid "updating files failed" msgstr "Falou a atualização dos ficheiros" @@ -744,18 +962,359 @@ msgstr "" #: builtin/add.c:420 #: builtin/clean.c:95 -#: builtin/commit.c:358 +#: builtin/commit.c:342 #: builtin/mv.c:82 #: builtin/rm.c:162 msgid "index file corrupt" msgstr "ficheiro index corrupto" #: builtin/add.c:476 +#: builtin/apply.c:4093 #: builtin/mv.c:229 #: builtin/rm.c:260 msgid "Unable to write new index file" msgstr "" +#: builtin/apply.c:106 +#, c-format +msgid "unrecognized whitespace option '%s'" +msgstr "espaço em braco não reconhecido: '%s'" + +#: builtin/apply.c:121 +#, c-format +msgid "unrecognized whitespace ignore option '%s'" +msgstr "" + +#: builtin/apply.c:815 +#, c-format +msgid "Cannot prepare timestamp regexp %s" +msgstr "" + +#: builtin/apply.c:824 +#, c-format +msgid "regexec returned %d for input: %s" +msgstr "" + +#: builtin/apply.c:905 +#, c-format +msgid "unable to find filename in patch at line %d" +msgstr "" + +#: builtin/apply.c:934 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" +msgstr "" + +#: builtin/apply.c:937 +#, c-format +msgid "git apply: bad git-diff - inconsistent %s filename on line %d" +msgstr "" + +#: builtin/apply.c:944 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null on line %d" +msgstr "" + +#: builtin/apply.c:1387 +#, c-format +msgid "recount: unexpected line: %.*s" +msgstr "" + +#: builtin/apply.c:1444 +#, c-format +msgid "patch fragment without header at line %d: %.*s" +msgstr "" + +#: builtin/apply.c:1461 +#, c-format +msgid "git diff header lacks filename information when removing %d leading pathname component (line %d)" +msgid_plural "git diff header lacks filename information when removing %d leading pathname components (line %d)" +msgstr[0] "" +msgstr[1] "" + +#: builtin/apply.c:1621 +msgid "new file depends on old contents" +msgstr "" + +#: builtin/apply.c:1623 +msgid "deleted file still has contents" +msgstr "" + +#: builtin/apply.c:1649 +#, c-format +msgid "corrupt patch at line %d" +msgstr "" + +#: builtin/apply.c:1685 +#, c-format +msgid "new file %s depends on old contents" +msgstr "" + +#: builtin/apply.c:1687 +#, c-format +msgid "deleted file %s still has contents" +msgstr "" + +#: builtin/apply.c:1690 +#, c-format +msgid "** warning: file %s becomes empty but is not deleted" +msgstr "" + +#: builtin/apply.c:1836 +#, c-format +msgid "corrupt binary patch at line %d: %.*s" +msgstr "" + +#. there has to be one hunk (forward hunk) +#: builtin/apply.c:1865 +#, c-format +msgid "unrecognized binary patch at line %d" +msgstr "" + +#: builtin/apply.c:1951 +#, c-format +msgid "patch with only garbage at line %d" +msgstr "" + +#: builtin/apply.c:2041 +#, c-format +msgid "unable to read symlink %s" +msgstr "" + +#: builtin/apply.c:2045 +#, c-format +msgid "unable to open or read %s" +msgstr "Não foi possível abrir o ler %s" + +#: builtin/apply.c:2116 +msgid "oops" +msgstr "" + +#: builtin/apply.c:2638 +#, c-format +msgid "invalid start of line: '%c'" +msgstr "começo de linha inválido: '%c'" + +#: builtin/apply.c:2756 +#, c-format +msgid "Hunk #%d succeeded at %d (offset %d line)." +msgid_plural "Hunk #%d succeeded at %d (offset %d lines)." +msgstr[0] "" +msgstr[1] "" + +#: builtin/apply.c:2768 +#, c-format +msgid "Context reduced to (%ld/%ld) to apply fragment at %d" +msgstr "" + +#: builtin/apply.c:2774 +#, c-format +msgid "" +"while searching for:\n" +"%.*s" +msgstr "" + +#: builtin/apply.c:2793 +#, c-format +msgid "missing binary patch data for '%s'" +msgstr "" + +#: builtin/apply.c:2896 +#, c-format +msgid "binary patch does not apply to '%s'" +msgstr "" + +#: builtin/apply.c:2902 +#, c-format +msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" +msgstr "" + +#: builtin/apply.c:2923 +#, c-format +msgid "patch failed: %s:%ld" +msgstr "" + +#: builtin/apply.c:3038 +#, c-format +msgid "patch %s has been renamed/deleted" +msgstr "" + +#: builtin/apply.c:3045 +#: builtin/apply.c:3062 +#, c-format +msgid "read of %s failed" +msgstr "ler %s falhou" + +#: builtin/apply.c:3077 +msgid "removal patch leaves file contents" +msgstr "" + +#: builtin/apply.c:3098 +#, c-format +msgid "%s: already exists in working directory" +msgstr "%s: já existe no espaço de trabalho" + +#: builtin/apply.c:3136 +#, c-format +msgid "%s: has been deleted/renamed" +msgstr "" + +#: builtin/apply.c:3141 +#: builtin/apply.c:3172 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: builtin/apply.c:3152 +#, c-format +msgid "%s: does not exist in index" +msgstr "" + +#: builtin/apply.c:3166 +#, c-format +msgid "%s: does not match index" +msgstr "%s: não tem correspondencia ao index" + +#: builtin/apply.c:3183 +#, c-format +msgid "%s: wrong type" +msgstr "" + +#: builtin/apply.c:3185 +#, c-format +msgid "%s has type %o, expected %o" +msgstr "" + +#: builtin/apply.c:3240 +#, c-format +msgid "%s: already exists in index" +msgstr "%s: já existe no indíce" + +#: builtin/apply.c:3259 +#, c-format +msgid "new mode (%o) of %s does not match old mode (%o)%s%s" +msgstr "" + +#: builtin/apply.c:3265 +#, c-format +msgid "%s: patch does not apply" +msgstr "" + +#: builtin/apply.c:3278 +#, c-format +msgid "Checking patch %s..." +msgstr "" + +#: builtin/apply.c:3333 +#: builtin/checkout.c:212 +#: builtin/reset.c:158 +#, c-format +msgid "make_cache_entry failed for path '%s'" +msgstr "" + +#: builtin/apply.c:3476 +#, c-format +msgid "unable to remove %s from index" +msgstr "" + +#: builtin/apply.c:3503 +#, c-format +msgid "corrupt patch for subproject %s" +msgstr "" + +#: builtin/apply.c:3507 +#, c-format +msgid "unable to stat newly created file '%s'" +msgstr "não é possivel 'stat' o novo ficheiro creado '%s'" + +#: builtin/apply.c:3512 +#, c-format +msgid "unable to create backing store for newly created file %s" +msgstr "" + +#: builtin/apply.c:3515 +#, c-format +msgid "unable to add cache entry for %s" +msgstr "" + +#: builtin/apply.c:3548 +#, c-format +msgid "closing file '%s'" +msgstr "fechar fichero '%s'" + +#: builtin/apply.c:3597 +#, c-format +msgid "unable to write file '%s' mode %o" +msgstr "" + +#: builtin/apply.c:3653 +#, c-format +msgid "Applied patch %s cleanly." +msgstr "" + +#: builtin/apply.c:3661 +msgid "internal error" +msgstr "" + +#. Say this even without --verbose +#: builtin/apply.c:3664 +#, c-format +msgid "Applying patch %%s with %d reject..." +msgid_plural "Applying patch %%s with %d rejects..." +msgstr[0] "" +msgstr[1] "" + +#: builtin/apply.c:3674 +#, c-format +msgid "truncating .rej filename to %.*s.rej" +msgstr "" + +#: builtin/apply.c:3695 +#, c-format +msgid "Hunk #%d applied cleanly." +msgstr "" + +#: builtin/apply.c:3698 +#, c-format +msgid "Rejected hunk #%d." +msgstr "" + +#: builtin/apply.c:3829 +msgid "unrecognized input" +msgstr "entrada não reconhecida" + +#: builtin/apply.c:3840 +msgid "unable to read index file" +msgstr "Não foi possível ler o fichero indíce" + +#: builtin/apply.c:4035 +msgid "--index outside a repository" +msgstr "--index fora de um repositorio" + +#: builtin/apply.c:4038 +msgid "--cached outside a repository" +msgstr "--cached fora de um repositorio" + +#: builtin/apply.c:4054 +#, c-format +msgid "can't open patch '%s'" +msgstr "não é possivel abrir patch '%s'" + +#: builtin/apply.c:4068 +#, c-format +msgid "squelched %d whitespace error" +msgid_plural "squelched %d whitespace errors" +msgstr[0] "" +msgstr[1] "" + +#: builtin/apply.c:4074 +#: builtin/apply.c:4084 +#, c-format +msgid "%d line adds whitespace errors." +msgid_plural "%d lines add whitespace errors." +msgstr[0] "" +msgstr[1] "" + #: builtin/archive.c:17 #, c-format msgid "could not create archive file '%s'" @@ -791,144 +1350,158 @@ msgstr "" msgid "git archive: expected a flush" msgstr "" -#: builtin/branch.c:137 +#: builtin/branch.c:144 #, c-format msgid "" "deleting branch '%s' that has been merged to\n" " '%s', but not yet merged to HEAD." msgstr "" -#: builtin/branch.c:141 +#: builtin/branch.c:148 #, c-format msgid "" "not deleting branch '%s' that is not yet merged to\n" " '%s', even though it is merged to HEAD." msgstr "" -#. TRANSLATORS: This is "remote " in "remote branch '%s' not found" -#: builtin/branch.c:163 -msgid "remote " -msgstr "remota" - -#: builtin/branch.c:171 +#: builtin/branch.c:180 msgid "cannot use -a with -d" msgstr "Não é possível usar -a com um -d" -#: builtin/branch.c:177 +#: builtin/branch.c:186 msgid "Couldn't look up commit object for HEAD" msgstr "" -#: builtin/branch.c:182 +#: builtin/branch.c:191 #, c-format msgid "Cannot delete the branch '%s' which you are currently on." msgstr "" -#: builtin/branch.c:192 +#: builtin/branch.c:202 #, c-format -msgid "%sbranch '%s' not found." -msgstr "%sbranch '%s' não encontrado." +msgid "remote branch '%s' not found." +msgstr "rama remota '%s não encontrada." -#: builtin/branch.c:200 +#: builtin/branch.c:203 +#, c-format +msgid "branch '%s' not found." +msgstr "rama '%s' não encontrado." + +#: builtin/branch.c:210 #, c-format msgid "Couldn't look up commit object for '%s'" msgstr "" -#: builtin/branch.c:206 +#: builtin/branch.c:216 #, c-format msgid "" "The branch '%s' is not fully merged.\n" "If you are sure you want to delete it, run 'git branch -D %s'." msgstr "" -#: builtin/branch.c:214 +#: builtin/branch.c:225 #, c-format -msgid "Error deleting %sbranch '%s'" +msgid "Error deleting remote branch '%s'" msgstr "" -#: builtin/branch.c:219 +#: builtin/branch.c:226 #, c-format -msgid "Deleted %sbranch %s (was %s).\n" +msgid "Error deleting branch '%s'" +msgstr "Erro a eliminar rama '%s'" + +#: builtin/branch.c:233 +#, c-format +msgid "Deleted remote branch %s (was %s).\n" msgstr "" -#: builtin/branch.c:224 +#: builtin/branch.c:234 +#, c-format +msgid "Deleted branch %s (was %s).\n" +msgstr "Eliminar rama %s (era %s).\n" + +#: builtin/branch.c:239 msgid "Update of config-file failed" msgstr "" -#: builtin/branch.c:322 +#: builtin/branch.c:337 #, c-format msgid "branch '%s' does not point at a commit" msgstr "" -#: builtin/branch.c:394 +#: builtin/branch.c:409 #, c-format msgid "behind %d] " msgstr "atrás %d] " -#: builtin/branch.c:396 +#: builtin/branch.c:411 #, c-format msgid "ahead %d] " msgstr "a frente %d] " -#: builtin/branch.c:398 +#: builtin/branch.c:413 #, c-format msgid "ahead %d, behind %d] " msgstr "a frente %d, atrás %d] " -#: builtin/branch.c:501 +#: builtin/branch.c:521 msgid "(no branch)" msgstr "(não é rama)" -#: builtin/branch.c:566 +#: builtin/branch.c:586 msgid "some refs could not be read" msgstr "" -#: builtin/branch.c:579 +#: builtin/branch.c:599 msgid "cannot rename the current branch while not on any." msgstr "" -#: builtin/branch.c:589 +#: builtin/branch.c:609 #, c-format msgid "Invalid branch name: '%s'" msgstr "Nome da rama inválida: '%s'" -#: builtin/branch.c:604 +#: builtin/branch.c:624 msgid "Branch rename failed" msgstr "Falhou renomeação da rama" -#: builtin/branch.c:608 +#: builtin/branch.c:628 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "Renomeado uma rama erronea '%s'" -#: builtin/branch.c:612 +#: builtin/branch.c:632 #, c-format msgid "Branch renamed to %s, but HEAD is not updated!" msgstr "" -#: builtin/branch.c:619 +#: builtin/branch.c:639 msgid "Branch is renamed, but update of config-file failed" msgstr "" -#: builtin/branch.c:634 +#: builtin/branch.c:654 #, c-format msgid "malformed object name %s" msgstr "" -#: builtin/branch.c:658 +#: builtin/branch.c:678 #, c-format -msgid "could not write branch description template: %s\n" +msgid "could not write branch description template: %s" msgstr "" -#: builtin/branch.c:746 +#: builtin/branch.c:769 msgid "Failed to resolve HEAD as a valid ref." msgstr "" -#: builtin/branch.c:751 +#: builtin/branch.c:774 #: builtin/clone.c:558 msgid "HEAD not found below refs/heads!" msgstr "" -#: builtin/branch.c:809 +#: builtin/branch.c:794 +msgid "--column and --verbose are incompatible" +msgstr "--column e --verbose são incompatíveis" + +#: builtin/branch.c:843 msgid "-a and -r options to 'git branch' do not make sense with a branch name" msgstr "" @@ -977,12 +1550,6 @@ msgstr "" msgid "Unable to add merge result for '%s'" msgstr "" -#: builtin/checkout.c:212 -#: builtin/reset.c:158 -#, c-format -msgid "make_cache_entry failed for path '%s'" -msgstr "" - #: builtin/checkout.c:234 #: builtin/checkout.c:392 msgid "corrupt index file" @@ -997,7 +1564,7 @@ msgstr "" #: builtin/checkout.c:302 #: builtin/checkout.c:498 #: builtin/clone.c:583 -#: builtin/merge.c:811 +#: builtin/merge.c:812 msgid "unable to write new index file" msgstr "" @@ -1016,42 +1583,42 @@ msgstr "" msgid "Can not do reflog for '%s'\n" msgstr "" -#: builtin/checkout.c:565 +#: builtin/checkout.c:566 msgid "HEAD is now at" msgstr "HEAD é agora em " -#: builtin/checkout.c:572 +#: builtin/checkout.c:573 #, c-format msgid "Reset branch '%s'\n" msgstr "Reset rama '%s'\n" -#: builtin/checkout.c:575 +#: builtin/checkout.c:576 #, c-format msgid "Already on '%s'\n" msgstr "Já em '%s'\n" -#: builtin/checkout.c:579 +#: builtin/checkout.c:580 #, c-format msgid "Switched to and reset branch '%s'\n" msgstr "" -#: builtin/checkout.c:581 +#: builtin/checkout.c:582 #, c-format msgid "Switched to a new branch '%s'\n" msgstr "Mudado para a nova rama '%s'\n" -#: builtin/checkout.c:583 +#: builtin/checkout.c:584 #, c-format msgid "Switched to branch '%s'\n" msgstr "Mudado para a rama '%s'\n" -#: builtin/checkout.c:639 +#: builtin/checkout.c:640 #, c-format msgid " ... and %d more.\n" msgstr " ... e %d mais.\n" #. The singular version -#: builtin/checkout.c:645 +#: builtin/checkout.c:646 #, c-format msgid "" "Warning: you are leaving %d commit behind, not connected to\n" @@ -1066,7 +1633,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: builtin/checkout.c:663 +#: builtin/checkout.c:664 #, c-format msgid "" "If you want to keep them by creating a new branch, this may be a good time\n" @@ -1076,96 +1643,96 @@ msgid "" "\n" msgstr "" -#: builtin/checkout.c:692 +#: builtin/checkout.c:693 msgid "internal error in revision walk" msgstr "" -#: builtin/checkout.c:696 +#: builtin/checkout.c:697 msgid "Previous HEAD position was" msgstr "" -#: builtin/checkout.c:722 +#: builtin/checkout.c:723 msgid "You are on a branch yet to be born" msgstr "" #. case (1) -#: builtin/checkout.c:853 +#: builtin/checkout.c:854 #, c-format msgid "invalid reference: %s" msgstr "" #. case (1): want a tree -#: builtin/checkout.c:892 +#: builtin/checkout.c:893 #, c-format msgid "reference is not a tree: %s" msgstr "" -#: builtin/checkout.c:972 +#: builtin/checkout.c:973 msgid "-B cannot be used with -b" msgstr "" -#: builtin/checkout.c:981 +#: builtin/checkout.c:982 msgid "--patch is incompatible with all other options" msgstr "" -#: builtin/checkout.c:984 +#: builtin/checkout.c:985 msgid "--detach cannot be used with -b/-B/--orphan" msgstr "" -#: builtin/checkout.c:986 +#: builtin/checkout.c:987 msgid "--detach cannot be used with -t" msgstr "" -#: builtin/checkout.c:992 +#: builtin/checkout.c:993 msgid "--track needs a branch name" msgstr "" -#: builtin/checkout.c:999 +#: builtin/checkout.c:1000 msgid "Missing branch name; try -b" msgstr "" -#: builtin/checkout.c:1005 +#: builtin/checkout.c:1006 msgid "--orphan and -b|-B are mutually exclusive" msgstr "" -#: builtin/checkout.c:1007 +#: builtin/checkout.c:1008 msgid "--orphan cannot be used with -t" msgstr "" -#: builtin/checkout.c:1017 +#: builtin/checkout.c:1018 msgid "git checkout: -f and -m are incompatible" msgstr "" -#: builtin/checkout.c:1051 +#: builtin/checkout.c:1052 msgid "invalid path specification" msgstr "" -#: builtin/checkout.c:1059 +#: builtin/checkout.c:1060 #, c-format msgid "" "git checkout: updating paths is incompatible with switching branches.\n" "Did you intend to checkout '%s' which can not be resolved as commit?" msgstr "" -#: builtin/checkout.c:1061 +#: builtin/checkout.c:1062 msgid "git checkout: updating paths is incompatible with switching branches." msgstr "" -#: builtin/checkout.c:1066 +#: builtin/checkout.c:1067 msgid "git checkout: --detach does not take a path argument" msgstr "" -#: builtin/checkout.c:1069 +#: builtin/checkout.c:1070 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." msgstr "" -#: builtin/checkout.c:1088 +#: builtin/checkout.c:1089 msgid "Cannot switch branch to a non-commit." msgstr "" -#: builtin/checkout.c:1091 +#: builtin/checkout.c:1092 msgid "--ours/--theirs is incompatible with switching branches." msgstr "" @@ -1217,12 +1784,12 @@ msgstr "" #: builtin/clone.c:302 #, c-format msgid "failed to open '%s'" -msgstr "" +msgstr "falhou a abrir '%s'" #: builtin/clone.c:306 #, c-format msgid "failed to create directory '%s'" -msgstr "" +msgstr "falhou a criar o directório '%s'" #: builtin/clone.c:308 #: builtin/diff.c:75 @@ -1253,7 +1820,7 @@ msgstr "" #: builtin/clone.c:350 #, c-format msgid "failed to copy file to '%s'" -msgstr "" +msgstr "falhou a copiar o ficheiro para '%s'" #: builtin/clone.c:373 #, c-format @@ -1336,7 +1903,11 @@ msgstr "" msgid "You appear to have cloned an empty repository." msgstr "" -#: builtin/commit.c:42 +#: builtin/column.c:51 +msgid "--command must be the first argument" +msgstr "" + +#: builtin/commit.c:43 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -1360,14 +1931,14 @@ msgstr "" "\n" " git commit --amend --reset-author\n" -#: builtin/commit.c:54 +#: builtin/commit.c:55 msgid "" "You asked to amend the most recent commit, but doing so would make\n" "it empty. You can repeat your command with --allow-empty, or you can\n" "remove the commit entirely with \"git reset HEAD^\".\n" msgstr "" -#: builtin/commit.c:59 +#: builtin/commit.c:60 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -1377,286 +1948,289 @@ msgid "" "Otherwise, please use 'git reset'\n" msgstr "" -#: builtin/commit.c:205 -#: builtin/reset.c:33 -msgid "merge" -msgstr "juntar" - -#: builtin/commit.c:208 -msgid "cherry-pick" -msgstr "cherry-pick" - -#: builtin/commit.c:325 +#: builtin/commit.c:309 msgid "failed to unpack HEAD tree object" msgstr "" -#: builtin/commit.c:367 +#: builtin/commit.c:351 msgid "unable to create temporary index" msgstr "" -#: builtin/commit.c:373 +#: builtin/commit.c:357 msgid "interactive add failed" msgstr "falhou adicionar interativo" -#: builtin/commit.c:406 -#: builtin/commit.c:427 -#: builtin/commit.c:473 +#: builtin/commit.c:390 +#: builtin/commit.c:411 +#: builtin/commit.c:461 msgid "unable to write new_index file" msgstr "" -#: builtin/commit.c:457 -#, c-format -msgid "cannot do a partial commit during a %s." +#: builtin/commit.c:442 +msgid "cannot do a partial commit during a merge." +msgstr "" + +#: builtin/commit.c:444 +msgid "cannot do a partial commit during a cherry-pick." msgstr "" -#: builtin/commit.c:466 +#: builtin/commit.c:454 msgid "cannot read the index" msgstr "não foi possível ler o indíce" -#: builtin/commit.c:486 +#: builtin/commit.c:474 msgid "unable to write temporary index file" msgstr "" -#: builtin/commit.c:550 -#: builtin/commit.c:556 +#: builtin/commit.c:549 +#: builtin/commit.c:555 #, c-format msgid "invalid commit: %s" msgstr "commit inválido: %s" -#: builtin/commit.c:579 +#: builtin/commit.c:578 msgid "malformed --author parameter" msgstr "" -#: builtin/commit.c:635 +#: builtin/commit.c:639 #, c-format msgid "Malformed ident string: '%s'" msgstr "" -#: builtin/commit.c:670 -#: builtin/commit.c:703 -#: builtin/commit.c:1000 +#: builtin/commit.c:677 +#: builtin/commit.c:710 +#: builtin/commit.c:1024 #, c-format msgid "could not lookup commit %s" msgstr "" -#: builtin/commit.c:682 +#: builtin/commit.c:689 #: builtin/shortlog.c:296 #, c-format msgid "(reading log message from standard input)\n" msgstr "" -#: builtin/commit.c:684 +#: builtin/commit.c:691 msgid "could not read log from standard input" msgstr "" -#: builtin/commit.c:688 +#: builtin/commit.c:695 #, c-format msgid "could not read log file '%s'" msgstr "não é possivel ler o ficheiro de log '%s'" -#: builtin/commit.c:694 +#: builtin/commit.c:701 msgid "commit has empty message" msgstr "a mensagem do commit está vazia" -#: builtin/commit.c:710 +#: builtin/commit.c:717 msgid "could not read MERGE_MSG" msgstr "não é possivel ler MERGE_MSG" -#: builtin/commit.c:714 +#: builtin/commit.c:721 msgid "could not read SQUASH_MSG" msgstr "não é possivel ler SQUASH_MSG" -#: builtin/commit.c:718 +#: builtin/commit.c:725 #, c-format msgid "could not read '%s'" msgstr "não é possivel ler '%s'" -#: builtin/commit.c:746 -#, c-format -msgid "could not open '%s'" -msgstr "não é possivel abrir '%s'" - -#: builtin/commit.c:770 +#: builtin/commit.c:777 msgid "could not write commit template" msgstr "" -#: builtin/commit.c:783 +#: builtin/commit.c:788 #, c-format msgid "" "\n" -"It looks like you may be committing a %s.\n" +"It looks like you may be committing a merge.\n" "If this is not correct, please remove the file\n" "\t%s\n" "and try again.\n" msgstr "" -#: builtin/commit.c:796 -msgid "Please enter the commit message for your changes." -msgstr "Por favor insira a mensagem de commit das suas alterações." +#: builtin/commit.c:793 +#, c-format +msgid "" +"\n" +"It looks like you may be committing a cherry-pick.\n" +"If this is not correct, please remove the file\n" +"\t%s\n" +"and try again.\n" +msgstr "" -#: builtin/commit.c:799 +#: builtin/commit.c:805 msgid "" -" Lines starting\n" +"Please enter the commit message for your changes. Lines starting\n" "with '#' will be ignored, and an empty message aborts the commit.\n" msgstr "" -#: builtin/commit.c:804 +#: builtin/commit.c:810 msgid "" -" Lines starting\n" +"Please enter the commit message for your changes. Lines starting\n" "with '#' will be kept; you may remove them yourself if you want to.\n" "An empty message aborts the commit.\n" msgstr "" -#: builtin/commit.c:816 +#: builtin/commit.c:823 #, c-format msgid "%sAuthor: %s" msgstr "%sAutor: %s" -#: builtin/commit.c:823 +#: builtin/commit.c:830 #, c-format msgid "%sCommitter: %s" msgstr "%sCommitador: %s" -#: builtin/commit.c:843 +#: builtin/commit.c:850 msgid "Cannot read index" msgstr "" -#: builtin/commit.c:880 +#: builtin/commit.c:887 msgid "Error building trees" msgstr "" -#: builtin/commit.c:895 -#: builtin/tag.c:357 +#: builtin/commit.c:902 +#: builtin/tag.c:361 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "" -#: builtin/commit.c:975 +#: builtin/commit.c:999 #, c-format msgid "No existing author found with '%s'" msgstr "" -#: builtin/commit.c:990 -#: builtin/commit.c:1182 +#: builtin/commit.c:1014 +#: builtin/commit.c:1214 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "" -#: builtin/commit.c:1030 +#: builtin/commit.c:1054 msgid "Using both --reset-author and --author does not make sense" msgstr "" -#: builtin/commit.c:1041 +#: builtin/commit.c:1065 msgid "You have nothing to amend." msgstr "Você não tem nada a corregir." -#: builtin/commit.c:1043 -#, c-format -msgid "You are in the middle of a %s -- cannot amend." +#: builtin/commit.c:1068 +msgid "You are in the middle of a merge -- cannot amend." +msgstr "" + +#: builtin/commit.c:1070 +msgid "You are in the middle of a cherry-pick -- cannot amend." msgstr "" -#: builtin/commit.c:1045 +#: builtin/commit.c:1073 msgid "Options --squash and --fixup cannot be used together" msgstr "" -#: builtin/commit.c:1055 +#: builtin/commit.c:1083 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "" -#: builtin/commit.c:1057 +#: builtin/commit.c:1085 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "" -#: builtin/commit.c:1063 +#: builtin/commit.c:1093 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "" -#: builtin/commit.c:1080 +#: builtin/commit.c:1110 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "" -#: builtin/commit.c:1082 +#: builtin/commit.c:1112 msgid "No paths with --include/--only does not make sense." msgstr "" -#: builtin/commit.c:1084 +#: builtin/commit.c:1114 msgid "Clever... amending the last one with dirty index." msgstr "" -#: builtin/commit.c:1086 +#: builtin/commit.c:1116 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "" -#: builtin/commit.c:1096 -#: builtin/tag.c:556 +#: builtin/commit.c:1126 +#: builtin/tag.c:577 #, c-format msgid "Invalid cleanup mode %s" msgstr "" -#: builtin/commit.c:1101 +#: builtin/commit.c:1131 msgid "Paths with -a does not make sense." msgstr "" -#: builtin/commit.c:1280 +#: builtin/commit.c:1315 msgid "couldn't look up newly created commit" msgstr "" -#: builtin/commit.c:1282 +#: builtin/commit.c:1317 msgid "could not parse newly created commit" msgstr "" -#: builtin/commit.c:1323 +#: builtin/commit.c:1358 msgid "detached HEAD" msgstr "" -#: builtin/commit.c:1325 +#: builtin/commit.c:1360 msgid " (root-commit)" msgstr " (root-commit)" -#: builtin/commit.c:1415 +#: builtin/commit.c:1450 msgid "could not parse HEAD commit" msgstr "" -#: builtin/commit.c:1452 +#: builtin/commit.c:1487 #: builtin/merge.c:509 #, c-format msgid "could not open '%s' for reading" msgstr "" -#: builtin/commit.c:1459 +#: builtin/commit.c:1494 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "" -#: builtin/commit.c:1466 +#: builtin/commit.c:1501 msgid "could not read MERGE_MODE" msgstr "" -#: builtin/commit.c:1485 +#: builtin/commit.c:1520 #, c-format msgid "could not read commit message: %s" msgstr "" -#: builtin/commit.c:1499 +#: builtin/commit.c:1534 +#, c-format +msgid "Aborting commit; you did not edit the message.\n" +msgstr "" + +#: builtin/commit.c:1539 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "" -#: builtin/commit.c:1514 -#: builtin/merge.c:935 -#: builtin/merge.c:968 +#: builtin/commit.c:1554 +#: builtin/merge.c:936 +#: builtin/merge.c:961 msgid "failed to write commit object" msgstr "" -#: builtin/commit.c:1535 +#: builtin/commit.c:1575 msgid "cannot lock HEAD ref" msgstr "" -#: builtin/commit.c:1539 +#: builtin/commit.c:1579 msgid "cannot update HEAD ref" msgstr "" -#: builtin/commit.c:1550 +#: builtin/commit.c:1590 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -1779,127 +2353,133 @@ msgstr "" msgid "Couldn't find remote ref HEAD" msgstr "" -#: builtin/fetch.c:252 +#: builtin/fetch.c:253 #, c-format msgid "object %s not found" -msgstr "" +msgstr "objecto %s não encontrado" -#: builtin/fetch.c:258 +#: builtin/fetch.c:259 msgid "[up to date]" msgstr "[Actualizada]" -#: builtin/fetch.c:272 +#: builtin/fetch.c:273 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" msgstr "" -#: builtin/fetch.c:273 -#: builtin/fetch.c:351 +#: builtin/fetch.c:274 +#: builtin/fetch.c:360 msgid "[rejected]" msgstr "[rejeitado]" -#: builtin/fetch.c:284 +#: builtin/fetch.c:285 msgid "[tag update]" msgstr "[etiqueta actualizada]" -#: builtin/fetch.c:286 -#: builtin/fetch.c:313 -#: builtin/fetch.c:331 +#: builtin/fetch.c:287 +#: builtin/fetch.c:322 +#: builtin/fetch.c:340 msgid " (unable to update local ref)" msgstr "" -#: builtin/fetch.c:298 +#: builtin/fetch.c:305 msgid "[new tag]" msgstr "[nova etiqueta]" -#: builtin/fetch.c:302 +#: builtin/fetch.c:308 msgid "[new branch]" msgstr "[nova rama]" -#: builtin/fetch.c:347 +#: builtin/fetch.c:311 +msgid "[new ref]" +msgstr "[nova ref]" + +#: builtin/fetch.c:356 msgid "unable to update local ref" msgstr "" -#: builtin/fetch.c:347 +#: builtin/fetch.c:356 msgid "forced update" msgstr "actualização forçada" -#: builtin/fetch.c:353 +#: builtin/fetch.c:362 msgid "(non-fast-forward)" -msgstr "" +msgstr "(non-fast-forward)" -#: builtin/fetch.c:384 -#: builtin/fetch.c:676 +#: builtin/fetch.c:393 +#: builtin/fetch.c:685 #, c-format msgid "cannot open %s: %s\n" -msgstr "" +msgstr "não é possivel abrir %s: %s\n" -#: builtin/fetch.c:393 +#: builtin/fetch.c:402 #, c-format msgid "%s did not send all necessary objects\n" msgstr "" -#: builtin/fetch.c:479 +#: builtin/fetch.c:488 #, c-format msgid "From %.*s\n" msgstr "Para %.*s\n" -#: builtin/fetch.c:490 +#: builtin/fetch.c:499 #, c-format msgid "" "some local refs could not be updated; try running\n" " 'git remote prune %s' to remove any old, conflicting branches" msgstr "" -#: builtin/fetch.c:540 +#: builtin/fetch.c:549 #, c-format -msgid " (%s will become dangling)\n" +msgid " (%s will become dangling)" msgstr "" -#: builtin/fetch.c:541 +#: builtin/fetch.c:550 #, c-format -msgid " (%s has become dangling)\n" +msgid " (%s has become dangling)" msgstr "" -#: builtin/fetch.c:548 +#: builtin/fetch.c:557 msgid "[deleted]" msgstr "[eliminado]" -#: builtin/fetch.c:549 +#: builtin/fetch.c:558 +#: builtin/remote.c:1055 msgid "(none)" msgstr "(nenhum)" -#: builtin/fetch.c:666 +#: builtin/fetch.c:675 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" msgstr "" -#: builtin/fetch.c:700 +#: builtin/fetch.c:709 #, c-format msgid "Don't know how to fetch from %s" msgstr "" -#: builtin/fetch.c:777 +#: builtin/fetch.c:786 #, c-format msgid "Option \"%s\" value \"%s\" is not valid for %s" msgstr "" -#: builtin/fetch.c:780 +#: builtin/fetch.c:789 #, c-format msgid "Option \"%s\" is ignored for %s\n" msgstr "" -#: builtin/fetch.c:879 +#: builtin/fetch.c:888 #, c-format msgid "Fetching %s\n" msgstr "Baixando %s\n" -#: builtin/fetch.c:881 +#: builtin/fetch.c:890 +#: builtin/remote.c:100 #, c-format msgid "Could not fetch %s" msgstr "" -#: builtin/fetch.c:898 +#: builtin/fetch.c:907 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." @@ -1907,24 +2487,24 @@ msgstr "" "Nenhum repositório remoto especificado. Por favor, especifique um URL ou o\n" "nome remoto a partir do qual novas revisões devem ser obtida." -#: builtin/fetch.c:918 +#: builtin/fetch.c:927 msgid "You need to specify a tag name." msgstr "Você precisa especificar um nome da etiqueta." -#: builtin/fetch.c:970 +#: builtin/fetch.c:979 msgid "fetch --all does not take a repository argument" msgstr "" -#: builtin/fetch.c:972 +#: builtin/fetch.c:981 msgid "fetch --all does not make sense with refspecs" msgstr "" -#: builtin/fetch.c:983 +#: builtin/fetch.c:992 #, c-format msgid "No such remote or remote group: %s" msgstr "" -#: builtin/fetch.c:991 +#: builtin/fetch.c:1000 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "" @@ -1933,28 +2513,24 @@ msgstr "" msgid "Invalid %s: '%s'" msgstr "Inválido %s: '%s'" -#: builtin/gc.c:78 -msgid "Too many options specified" -msgstr "Demasiadas opções especificadas" - -#: builtin/gc.c:103 +#: builtin/gc.c:90 #, c-format msgid "insanely long object directory %.*s" msgstr "" -#: builtin/gc.c:223 +#: builtin/gc.c:221 #, c-format msgid "Auto packing the repository for optimum performance.\n" msgstr "" -#: builtin/gc.c:226 +#: builtin/gc.c:224 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" "run \"git gc\" manually. See \"git help gc\" for more information.\n" msgstr "" -#: builtin/gc.c:256 +#: builtin/gc.c:251 msgid "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "" @@ -2018,6 +2594,314 @@ msgstr "" msgid "both --cached and trees are given." msgstr "" +#: builtin/help.c:59 +#, c-format +msgid "unrecognized help format '%s'" +msgstr "formato ajuda não reconhecido '%s'" + +#: builtin/help.c:87 +msgid "Failed to start emacsclient." +msgstr "" + +#: builtin/help.c:100 +msgid "Failed to parse emacsclient version." +msgstr "" + +#: builtin/help.c:108 +#, c-format +msgid "emacsclient version '%d' too old (< 22)." +msgstr "" + +#: builtin/help.c:126 +#: builtin/help.c:154 +#: builtin/help.c:163 +#: builtin/help.c:171 +#, c-format +msgid "failed to exec '%s': %s" +msgstr "" + +#: builtin/help.c:211 +#, c-format +msgid "" +"'%s': path for unsupported man viewer.\n" +"Please consider using 'man.<tool>.cmd' instead." +msgstr "" + +#: builtin/help.c:223 +#, c-format +msgid "" +"'%s': cmd for supported man viewer.\n" +"Please consider using 'man.<tool>.path' instead." +msgstr "" + +#: builtin/help.c:287 +msgid "The most commonly used git commands are:" +msgstr "" + +#: builtin/help.c:355 +#, c-format +msgid "'%s': unknown man viewer." +msgstr "" + +#: builtin/help.c:372 +msgid "no man viewer handled the request" +msgstr "" + +#: builtin/help.c:380 +msgid "no info viewer handled the request" +msgstr "" + +#: builtin/help.c:391 +#, c-format +msgid "'%s': not a documentation directory." +msgstr "" + +#: builtin/help.c:432 +#: builtin/help.c:439 +#, c-format +msgid "usage: %s%s" +msgstr "" + +#: builtin/help.c:453 +#, c-format +msgid "`git %s' is aliased to `%s'" +msgstr "" + +#: builtin/index-pack.c:84 +#, c-format +msgid "object type mismatch at %s" +msgstr "" + +#: builtin/index-pack.c:104 +msgid "object of unexpected type" +msgstr "" + +#: builtin/index-pack.c:141 +#, c-format +msgid "cannot fill %d byte" +msgid_plural "cannot fill %d bytes" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:151 +msgid "early EOF" +msgstr "" + +#: builtin/index-pack.c:152 +msgid "read error on input" +msgstr "" + +#: builtin/index-pack.c:164 +msgid "used more bytes than were available" +msgstr "" + +#: builtin/index-pack.c:171 +msgid "pack too large for current definition of off_t" +msgstr "" + +#: builtin/index-pack.c:187 +#, c-format +msgid "unable to create '%s'" +msgstr "não é possivel crear '%s'" + +#: builtin/index-pack.c:192 +#, c-format +msgid "cannot open packfile '%s'" +msgstr "Não é possivel abrir o ficheiro packfile '%s'" + +#: builtin/index-pack.c:206 +msgid "pack signature mismatch" +msgstr "" + +#: builtin/index-pack.c:226 +#, c-format +msgid "pack has bad object at offset %lu: %s" +msgstr "" + +#: builtin/index-pack.c:300 +#, c-format +msgid "inflate returned %d" +msgstr "" + +#: builtin/index-pack.c:345 +msgid "offset value overflow for delta base object" +msgstr "" + +#: builtin/index-pack.c:353 +msgid "delta base offset is out of bound" +msgstr "" + +#: builtin/index-pack.c:361 +#, c-format +msgid "unknown object type %d" +msgstr "ojecto com tipo desconhecido %d" + +#: builtin/index-pack.c:390 +msgid "cannot pread pack file" +msgstr "Não é possivel pread pack file" + +#: builtin/index-pack.c:392 +#, c-format +msgid "premature end of pack file, %lu byte missing" +msgid_plural "premature end of pack file, %lu bytes missing" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:405 +msgid "serious inflate inconsistency" +msgstr "" + +#: builtin/index-pack.c:476 +#, c-format +msgid "cannot read existing object %s" +msgstr "não foi possível ler objecto existente %s" + +#: builtin/index-pack.c:479 +#, c-format +msgid "SHA1 COLLISION FOUND WITH %s !" +msgstr "" + +#: builtin/index-pack.c:488 +#, c-format +msgid "invalid blob object %s" +msgstr "inválido objecto blob %s" + +#: builtin/index-pack.c:500 +#, c-format +msgid "invalid %s" +msgstr "inválido: %s" + +#: builtin/index-pack.c:502 +msgid "Error in object" +msgstr "" + +#: builtin/index-pack.c:504 +#, c-format +msgid "Not all child objects of %s are reachable" +msgstr "" + +#: builtin/index-pack.c:576 +#: builtin/index-pack.c:602 +msgid "failed to apply delta" +msgstr "" + +#: builtin/index-pack.c:706 +msgid "Receiving objects" +msgstr "" + +#: builtin/index-pack.c:706 +msgid "Indexing objects" +msgstr "" + +#: builtin/index-pack.c:728 +msgid "pack is corrupted (SHA1 mismatch)" +msgstr "" + +#: builtin/index-pack.c:733 +msgid "cannot fstat packfile" +msgstr "Não é possivel fstat packfile" + +#: builtin/index-pack.c:736 +msgid "pack has junk at the end" +msgstr "" + +#: builtin/index-pack.c:754 +msgid "Resolving deltas" +msgstr "Resolvendo deltas" + +#: builtin/index-pack.c:787 +#, c-format +msgid "unable to deflate appended object (%d)" +msgstr "" + +#: builtin/index-pack.c:866 +#, c-format +msgid "local object %s is corrupt" +msgstr "" + +#: builtin/index-pack.c:890 +msgid "error while closing pack file" +msgstr "" + +#: builtin/index-pack.c:903 +#, c-format +msgid "cannot write keep file '%s'" +msgstr "não é possivel escrever o fichero kepp '%s'" + +#: builtin/index-pack.c:911 +#, c-format +msgid "cannot close written keep file '%s'" +msgstr "Não é possivel fechar o fichero escrito '%s'" + +#: builtin/index-pack.c:924 +msgid "cannot store pack file" +msgstr "Não é possivel guardar o fichero pack" + +#: builtin/index-pack.c:935 +msgid "cannot store index file" +msgstr "Não é possivel guardar fichero index" + +#: builtin/index-pack.c:1024 +#, c-format +msgid "Cannot open existing pack file '%s'" +msgstr "Não é possivel abrir o existente ficheiro pack %s" + +#: builtin/index-pack.c:1026 +#, c-format +msgid "Cannot open existing pack idx file for '%s'" +msgstr "Não é possivel abrir o ficheiro 'pack idx' para '%s'" + +#: builtin/index-pack.c:1073 +#, c-format +msgid "non delta: %d object" +msgid_plural "non delta: %d objects" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:1080 +#, c-format +msgid "chain length = %d: %lu object" +msgid_plural "chain length = %d: %lu objects" +msgstr[0] "" +msgstr[1] "" + +#: builtin/index-pack.c:1107 +msgid "Cannot come back to cwd" +msgstr "" + +#: builtin/index-pack.c:1140 +#: builtin/index-pack.c:1143 +#: builtin/index-pack.c:1155 +#: builtin/index-pack.c:1159 +#, c-format +msgid "bad %s" +msgstr "inválido %s" + +#: builtin/index-pack.c:1173 +msgid "--fix-thin cannot be used without --stdin" +msgstr "" + +#: builtin/index-pack.c:1177 +#: builtin/index-pack.c:1187 +#, c-format +msgid "packfile name '%s' does not end with '.pack'" +msgstr "" + +#: builtin/index-pack.c:1196 +msgid "--verify with no packfile name given" +msgstr "" + +#: builtin/index-pack.c:1220 +msgid "confusion beyond insanity" +msgstr "" + +#: builtin/index-pack.c:1239 +#, c-format +msgid "pack has %d unresolved delta" +msgid_plural "pack has %d unresolved deltas" +msgstr[0] "" +msgstr[1] "" + #: builtin/init-db.c:35 #, c-format msgid "Could not make %s writable by group" @@ -2160,167 +3044,161 @@ msgstr "" msgid "Cannot access work tree '%s'" msgstr "" -#: builtin/log.c:187 +#: builtin/log.c:188 #, c-format msgid "Final output: %d %s\n" msgstr "" -#: builtin/log.c:395 -#: builtin/log.c:483 +#: builtin/log.c:401 +#: builtin/log.c:489 #, c-format msgid "Could not read object %s" msgstr "" -#: builtin/log.c:507 +#: builtin/log.c:513 #, c-format msgid "Unknown type: %d" msgstr "Tipo desconhecido: %d" -#: builtin/log.c:596 +#: builtin/log.c:602 msgid "format.headers without value" msgstr "" -#: builtin/log.c:669 +#: builtin/log.c:675 msgid "name of output directory is too long" msgstr "nome do diretório de saída é demasiado longo" -#: builtin/log.c:680 +#: builtin/log.c:686 #, c-format msgid "Cannot open patch file %s" msgstr "Não é possivel abrir o ficheiro patch %s" -#: builtin/log.c:694 +#: builtin/log.c:700 msgid "Need exactly one range." msgstr "Necessita de exatamente um intervalo." -#: builtin/log.c:702 +#: builtin/log.c:708 msgid "Not a range." msgstr "Não é um intervalo." -#: builtin/log.c:739 +#: builtin/log.c:745 msgid "Could not extract email from committer identity." msgstr "Não foi possível extrair a identidade do committer do e-mail." -#: builtin/log.c:785 +#: builtin/log.c:791 msgid "Cover letter needs email format" msgstr "Carta de apresentação necessita um modelo de e-mail" -#: builtin/log.c:879 +#: builtin/log.c:885 #, c-format msgid "insane in-reply-to: %s" msgstr "" -#: builtin/log.c:952 +#: builtin/log.c:958 msgid "Two output directories?" msgstr "Dois diretórios de saída?" -#: builtin/log.c:1173 +#: builtin/log.c:1179 #, c-format msgid "bogus committer info %s" msgstr "" -#: builtin/log.c:1218 +#: builtin/log.c:1224 msgid "-n and -k are mutually exclusive." msgstr "" -#: builtin/log.c:1220 +#: builtin/log.c:1226 msgid "--subject-prefix and -k are mutually exclusive." msgstr "" -#: builtin/log.c:1225 -#: builtin/shortlog.c:284 -#, c-format -msgid "unrecognized argument: %s" -msgstr "argumento não reconhecido: %s" - -#: builtin/log.c:1228 +#: builtin/log.c:1234 msgid "--name-only does not make sense" msgstr "" -#: builtin/log.c:1230 +#: builtin/log.c:1236 msgid "--name-status does not make sense" msgstr "" -#: builtin/log.c:1232 +#: builtin/log.c:1238 msgid "--check does not make sense" msgstr "" -#: builtin/log.c:1255 +#: builtin/log.c:1261 msgid "standard output, or directory, which one?" msgstr "saída padrão, ou diretório, qual deles?" -#: builtin/log.c:1257 +#: builtin/log.c:1263 #, c-format msgid "Could not create directory '%s'" msgstr "" -#: builtin/log.c:1410 +#: builtin/log.c:1416 msgid "Failed to create output files" msgstr "Falhou ao criar ficheiros de saída" -#: builtin/log.c:1514 +#: builtin/log.c:1520 #, c-format msgid "Could not find a tracked remote branch, please specify <upstream> manually.\n" msgstr "" -#: builtin/log.c:1530 -#: builtin/log.c:1532 -#: builtin/log.c:1544 +#: builtin/log.c:1536 +#: builtin/log.c:1538 +#: builtin/log.c:1550 #, c-format msgid "Unknown commit %s" msgstr "Commit desconhecido %s" -#: builtin/merge.c:91 +#: builtin/merge.c:90 msgid "switch `m' requires a value" msgstr "" -#: builtin/merge.c:128 +#: builtin/merge.c:127 #, c-format msgid "Could not find merge strategy '%s'.\n" msgstr "" -#: builtin/merge.c:129 +#: builtin/merge.c:128 #, c-format msgid "Available strategies are:" msgstr "As estratégias disponíveis são:" -#: builtin/merge.c:134 +#: builtin/merge.c:133 #, c-format msgid "Available custom strategies are:" msgstr "Estratégias personalizadas disponíveis são:" -#: builtin/merge.c:241 +#: builtin/merge.c:240 msgid "could not run stash." msgstr "" -#: builtin/merge.c:246 +#: builtin/merge.c:245 msgid "stash failed" msgstr "falhou o stash" -#: builtin/merge.c:251 +#: builtin/merge.c:250 #, c-format msgid "not a valid object: %s" msgstr "" -#: builtin/merge.c:270 -#: builtin/merge.c:287 +#: builtin/merge.c:269 +#: builtin/merge.c:286 msgid "read-tree failed" msgstr "" -#: builtin/merge.c:317 +#: builtin/merge.c:316 msgid " (nothing to squash)" msgstr " (nada para squash)" -#: builtin/merge.c:330 +#: builtin/merge.c:329 #, c-format msgid "Squash commit -- not updating HEAD\n" msgstr "" -#: builtin/merge.c:362 +#: builtin/merge.c:361 msgid "Writing SQUASH_MSG" msgstr "Escrevendo SQUASH_MSG" -#: builtin/merge.c:364 +#: builtin/merge.c:363 msgid "Finishing SQUASH_MSG" msgstr "Terminando SQUASH_MSG" @@ -2347,35 +3225,35 @@ msgstr "" msgid "failed to read the cache" msgstr "" -#: builtin/merge.c:696 +#: builtin/merge.c:697 msgid "Unable to write index." msgstr "" -#: builtin/merge.c:709 +#: builtin/merge.c:710 msgid "Not handling anything other than two heads merge." msgstr "" -#: builtin/merge.c:723 +#: builtin/merge.c:724 #, c-format msgid "Unknown option for merge-recursive: -X%s" msgstr "" -#: builtin/merge.c:737 +#: builtin/merge.c:738 #, c-format msgid "unable to write %s" msgstr "" -#: builtin/merge.c:876 +#: builtin/merge.c:877 #, c-format msgid "Could not read from '%s'" msgstr "" -#: builtin/merge.c:885 +#: builtin/merge.c:886 #, c-format msgid "Not committing merge; use 'git commit' to complete the merge.\n" msgstr "Não commitando um merge; usa 'git commit' para completar o merge.\n" -#: builtin/merge.c:891 +#: builtin/merge.c:892 msgid "" "Please enter a commit message to explain why this merge is necessary,\n" "especially if it merges an updated upstream into a topic branch.\n" @@ -2384,144 +3262,144 @@ msgid "" "the commit.\n" msgstr "" -#: builtin/merge.c:915 +#: builtin/merge.c:916 msgid "Empty commit message." msgstr "Mensagem de commit vazia." -#: builtin/merge.c:927 +#: builtin/merge.c:928 #, c-format msgid "Wonderful.\n" msgstr "Fastastico.\n" -#: builtin/merge.c:1000 +#: builtin/merge.c:993 #, c-format msgid "Automatic merge failed; fix conflicts and then commit the result.\n" msgstr "" -#: builtin/merge.c:1016 +#: builtin/merge.c:1009 #, c-format msgid "'%s' is not a commit" msgstr "'%s' não é um commit" -#: builtin/merge.c:1057 +#: builtin/merge.c:1050 msgid "No current branch." msgstr "Nenhuma rama actual" -#: builtin/merge.c:1059 +#: builtin/merge.c:1052 msgid "No remote for the current branch." msgstr "" -#: builtin/merge.c:1061 +#: builtin/merge.c:1054 msgid "No default upstream defined for the current branch." msgstr "" -#: builtin/merge.c:1066 +#: builtin/merge.c:1059 #, c-format msgid "No remote tracking branch for %s from %s" msgstr "" -#: builtin/merge.c:1188 +#: builtin/merge.c:1146 +#: builtin/merge.c:1303 +#, c-format +msgid "%s - not something we can merge" +msgstr "" + +#: builtin/merge.c:1214 msgid "There is no merge to abort (MERGE_HEAD missing)." msgstr "" -#: builtin/merge.c:1204 +#: builtin/merge.c:1230 #: git-pull.sh:31 msgid "" "You have not concluded your merge (MERGE_HEAD exists).\n" "Please, commit your changes before you can merge." msgstr "" -#: builtin/merge.c:1207 +#: builtin/merge.c:1233 #: git-pull.sh:34 msgid "You have not concluded your merge (MERGE_HEAD exists)." msgstr "" -#: builtin/merge.c:1211 +#: builtin/merge.c:1237 msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you can merge." msgstr "" -#: builtin/merge.c:1214 +#: builtin/merge.c:1240 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." msgstr "" -#: builtin/merge.c:1223 +#: builtin/merge.c:1249 msgid "You cannot combine --squash with --no-ff." msgstr "" -#: builtin/merge.c:1228 +#: builtin/merge.c:1254 msgid "You cannot combine --no-ff with --ff-only." msgstr "" -#: builtin/merge.c:1235 +#: builtin/merge.c:1261 msgid "No commit specified and merge.defaultToUpstream not set." msgstr "" -#: builtin/merge.c:1266 +#: builtin/merge.c:1293 msgid "Can merge only exactly one commit into empty head" msgstr "" -#: builtin/merge.c:1269 +#: builtin/merge.c:1296 msgid "Squash commit into empty head not supported yet" msgstr "" -#: builtin/merge.c:1271 +#: builtin/merge.c:1298 msgid "Non-fast-forward commit does not make sense into an empty head" msgstr "" -#: builtin/merge.c:1275 -#: builtin/merge.c:1319 -#, c-format -msgid "%s - not something we can merge" -msgstr "" - -#: builtin/merge.c:1385 +#: builtin/merge.c:1413 #, c-format msgid "Updating %s..%s\n" msgstr "Actualizando %s..%s\n" -#: builtin/merge.c:1423 +#: builtin/merge.c:1451 #, c-format msgid "Trying really trivial in-index merge...\n" msgstr "" -#: builtin/merge.c:1430 +#: builtin/merge.c:1458 #, c-format msgid "Nope.\n" msgstr "Não.\n" -#: builtin/merge.c:1462 +#: builtin/merge.c:1490 msgid "Not possible to fast-forward, aborting." msgstr "" -#: builtin/merge.c:1485 -#: builtin/merge.c:1562 +#: builtin/merge.c:1513 +#: builtin/merge.c:1592 #, c-format msgid "Rewinding the tree to pristine...\n" msgstr "" -#: builtin/merge.c:1489 +#: builtin/merge.c:1517 #, c-format msgid "Trying merge strategy %s...\n" msgstr "" -#: builtin/merge.c:1553 +#: builtin/merge.c:1583 #, c-format msgid "No merge strategy handled the merge.\n" msgstr "" -#: builtin/merge.c:1555 +#: builtin/merge.c:1585 #, c-format msgid "Merge with strategy %s failed.\n" msgstr "Fundir com a estratégia %s falhou.\n" -#: builtin/merge.c:1564 +#: builtin/merge.c:1594 #, c-format msgid "Using the %s to prepare resolving by hand.\n" msgstr "" -#: builtin/merge.c:1575 +#: builtin/merge.c:1606 #, c-format msgid "Automatic merge went well; stopped before committing as requested\n" msgstr "" @@ -2584,6 +3462,7 @@ msgid "Renaming %s to %s\n" msgstr "Mudar de nome %s para %s\n" #: builtin/mv.c:215 +#: builtin/remote.c:731 #, c-format msgid "renaming '%s' failed" msgstr "mudar de nome '%s' falhou" @@ -2608,7 +3487,7 @@ msgid "failed to finish 'show' for object '%s'" msgstr "" #: builtin/notes.c:175 -#: builtin/tag.c:343 +#: builtin/tag.c:347 #, c-format msgid "could not create file '%s'" msgstr "" @@ -2633,13 +3512,13 @@ msgid "The note contents has been left in %s" msgstr "" #: builtin/notes.c:251 -#: builtin/tag.c:521 +#: builtin/tag.c:542 #, c-format msgid "cannot read '%s'" msgstr "não consegue ler '%s'" #: builtin/notes.c:253 -#: builtin/tag.c:524 +#: builtin/tag.c:545 #, c-format msgid "could not open or read '%s'" msgstr "" @@ -2655,7 +3534,7 @@ msgstr "" #: builtin/notes.c:766 #: builtin/notes.c:968 #: builtin/reset.c:293 -#: builtin/tag.c:537 +#: builtin/tag.c:558 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "" @@ -2750,39 +3629,61 @@ msgid "Object %s has no note\n" msgstr "" #: builtin/notes.c:1103 +#: builtin/remote.c:1598 #, c-format msgid "Unknown subcommand: %s" msgstr "" -#: builtin/pack-objects.c:2310 +#: builtin/pack-objects.c:2315 #, c-format msgid "unsupported index version %s" msgstr "" -#: builtin/pack-objects.c:2314 +#: builtin/pack-objects.c:2319 #, c-format msgid "bad index version '%s'" msgstr "" -#: builtin/pack-objects.c:2322 +#: builtin/pack-objects.c:2342 #, c-format msgid "option %s does not accept negative form" msgstr "opção %s não aceita formato negativo" -#: builtin/pack-objects.c:2326 +#: builtin/pack-objects.c:2346 #, c-format msgid "unable to parse value '%s' for option %s" msgstr "" -#: builtin/push.c:44 +#: builtin/push.c:45 msgid "tag shorthand without <tag>" msgstr "" -#: builtin/push.c:63 +#: builtin/push.c:64 msgid "--delete only accepts plain target ref names" msgstr "--delete só aceita nomes simples para o ref de destino" -#: builtin/push.c:73 +#: builtin/push.c:99 +msgid "" +"\n" +"To choose either option permanently, see push.default in 'git help config'." +msgstr "" + +#: builtin/push.c:102 +#, c-format +msgid "" +"The upstream branch of your current branch does not match\n" +"the name of your current branch. To push to the upstream branch\n" +"on the remote, use\n" +"\n" +" git push %s HEAD:%s\n" +"\n" +"To push to the branch of the same name on the remote, use\n" +"\n" +" git push %s %s\n" +"%s" +msgstr "" + +#: builtin/push.c:121 #, c-format msgid "" "You are not currently on a branch.\n" @@ -2792,7 +3693,7 @@ msgid "" " git push %s HEAD:<name-of-remote-branch>\n" msgstr "" -#: builtin/push.c:80 +#: builtin/push.c:128 #, c-format msgid "" "The current branch %s has no upstream branch.\n" @@ -2801,39 +3702,63 @@ msgid "" " git push --set-upstream %s %s\n" msgstr "" -#: builtin/push.c:88 +#: builtin/push.c:136 #, c-format msgid "The current branch %s has multiple upstream branches, refusing to push." msgstr "" -#: builtin/push.c:111 +#: builtin/push.c:139 +#, c-format +msgid "" +"You are pushing to remote '%s', which is not the upstream of\n" +"your current branch '%s', without telling me what to push\n" +"to update which remote branch." +msgstr "" + +#: builtin/push.c:174 msgid "You didn't specify any refspecs to push, and push.default is \"nothing\"." msgstr "" -#: builtin/push.c:131 +#: builtin/push.c:181 +msgid "" +"Updates were rejected because the tip of your current branch is behind\n" +"its remote counterpart. Merge the remote changes (e.g. 'git pull')\n" +"before pushing again.\n" +"See the 'Note about fast-forwards' in 'git push --help' for details." +msgstr "" + +#: builtin/push.c:187 +msgid "" +"Updates were rejected because a pushed branch tip is behind its remote\n" +"counterpart. If you did not intend to push that branch, you may want to\n" +"specify branches to push or set the 'push.default' configuration\n" +"variable to 'current' or 'upstream' to push only the current branch." +msgstr "" + +#: builtin/push.c:193 +msgid "" +"Updates were rejected because a pushed branch tip is behind its remote\n" +"counterpart. Check out this branch and merge the remote changes\n" +"(e.g. 'git pull') before pushing again.\n" +"See the 'Note about fast-forwards' in 'git push --help' for details." +msgstr "" + +#: builtin/push.c:233 #, c-format msgid "Pushing to %s\n" msgstr "Pushing para %s\n" -#: builtin/push.c:135 +#: builtin/push.c:237 #, c-format msgid "failed to push some refs to '%s'" msgstr "" -#: builtin/push.c:143 -#, c-format -msgid "" -"To prevent you from losing history, non-fast-forward updates were rejected\n" -"Merge the remote changes (e.g. 'git pull') before pushing again. See the\n" -"'Note about fast-forwards' section of 'git push --help' for details.\n" -msgstr "" - -#: builtin/push.c:160 +#: builtin/push.c:269 #, c-format msgid "bad repository '%s'" msgstr "repositorio inválido '%s'" -#: builtin/push.c:161 +#: builtin/push.c:270 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote repository using\n" @@ -2845,34 +3770,390 @@ msgid "" " git push <name>\n" msgstr "" -#: builtin/push.c:176 +#: builtin/push.c:285 msgid "--all and --tags are incompatible" msgstr "--all e --tags are são incompatíveis" -#: builtin/push.c:177 +#: builtin/push.c:286 msgid "--all can't be combined with refspecs" msgstr "" -#: builtin/push.c:182 +#: builtin/push.c:291 msgid "--mirror and --tags are incompatible" msgstr "" -#: builtin/push.c:183 +#: builtin/push.c:292 msgid "--mirror can't be combined with refspecs" msgstr "" -#: builtin/push.c:188 +#: builtin/push.c:297 msgid "--all and --mirror are incompatible" msgstr "" -#: builtin/push.c:274 +#: builtin/push.c:385 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "" -#: builtin/push.c:276 +#: builtin/push.c:387 msgid "--delete doesn't make sense without any refs" msgstr "" +#: builtin/remote.c:98 +#, c-format +msgid "Updating %s" +msgstr "Actualizando %s" + +#: builtin/remote.c:130 +msgid "" +"--mirror is dangerous and deprecated; please\n" +"\t use --mirror=fetch or --mirror=push instead" +msgstr "" + +#: builtin/remote.c:147 +#, c-format +msgid "unknown mirror argument: %s" +msgstr "argumento mirror não conhecido: %s" + +#: builtin/remote.c:185 +msgid "specifying a master branch makes no sense with --mirror" +msgstr "" + +#: builtin/remote.c:187 +msgid "specifying branches to track makes sense only with fetch mirrors" +msgstr "" + +#: builtin/remote.c:195 +#: builtin/remote.c:646 +#, c-format +msgid "remote %s already exists." +msgstr "o remoto %s já existe" + +#: builtin/remote.c:199 +#: builtin/remote.c:650 +#, c-format +msgid "'%s' is not a valid remote name" +msgstr "'%s' não é um nombe remoto valido" + +#: builtin/remote.c:243 +#, c-format +msgid "Could not setup master '%s'" +msgstr "Não foi possível configurar a rama master '%s'" + +#: builtin/remote.c:299 +#, c-format +msgid "more than one %s" +msgstr "" + +#: builtin/remote.c:339 +#, c-format +msgid "Could not get fetch map for refspec %s" +msgstr "" + +#: builtin/remote.c:440 +#: builtin/remote.c:448 +msgid "(matching)" +msgstr "" + +#: builtin/remote.c:452 +msgid "(delete)" +msgstr "(eliminado)" + +#: builtin/remote.c:595 +#: builtin/remote.c:601 +#: builtin/remote.c:607 +#, c-format +msgid "Could not append '%s' to '%s'" +msgstr "Não foi possível adicionar o '%s' para o '%s'" + +#: builtin/remote.c:639 +#: builtin/remote.c:792 +#: builtin/remote.c:890 +#, c-format +msgid "No such remote: %s" +msgstr "" + +#: builtin/remote.c:656 +#, c-format +msgid "Could not rename config section '%s' to '%s'" +msgstr "Não foi possível renombrar a secção da configuração de '%s' para '%s'" + +#: builtin/remote.c:662 +#: builtin/remote.c:799 +#, c-format +msgid "Could not remove config section '%s'" +msgstr "Não foi possível remover a secção da configuração '%s'" + +#: builtin/remote.c:677 +#, c-format +msgid "" +"Not updating non-default fetch respec\n" +"\t%s\n" +"\tPlease update the configuration manually if necessary." +msgstr "" + +#: builtin/remote.c:683 +#, c-format +msgid "Could not append '%s'" +msgstr "Não foi possível adicionar '%s'" + +#: builtin/remote.c:694 +#, c-format +msgid "Could not set '%s'" +msgstr "Não foi possível atribuir '%s'" + +#: builtin/remote.c:716 +#, c-format +msgid "deleting '%s' failed" +msgstr "falhou eliminar '%s'" + +#: builtin/remote.c:750 +#, c-format +msgid "creating '%s' failed" +msgstr "falhou a criar '%s'" + +#: builtin/remote.c:764 +#, c-format +msgid "Could not remove branch %s" +msgstr "Não foi possível remover rama %s" + +#: builtin/remote.c:834 +msgid "" +"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" +"to delete it, use:" +msgid_plural "" +"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n" +"to delete them, use:" +msgstr[0] "" +msgstr[1] "" + +#: builtin/remote.c:943 +#, c-format +msgid " new (next fetch will store in remotes/%s)" +msgstr "" + +#: builtin/remote.c:946 +msgid " tracked" +msgstr "seguido" + +#: builtin/remote.c:948 +msgid " stale (use 'git remote prune' to remove)" +msgstr "" + +#: builtin/remote.c:950 +msgid " ???" +msgstr " ???" + +#: builtin/remote.c:991 +#, c-format +msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch" +msgstr "" + +#: builtin/remote.c:998 +#, c-format +msgid "rebases onto remote %s" +msgstr "" + +#: builtin/remote.c:1001 +#, c-format +msgid " merges with remote %s" +msgstr "Fundir com servidor remoto %s" + +#: builtin/remote.c:1002 +msgid " and with remote" +msgstr " e com remoto" + +#: builtin/remote.c:1004 +#, c-format +msgid "merges with remote %s" +msgstr "Fundir com servidor remoto %s" + +#: builtin/remote.c:1005 +msgid " and with remote" +msgstr " e com remoto" + +#: builtin/remote.c:1051 +msgid "create" +msgstr "creado" + +#: builtin/remote.c:1054 +msgid "delete" +msgstr "eliminado" + +#: builtin/remote.c:1058 +msgid "up to date" +msgstr "actualizado" + +#: builtin/remote.c:1061 +msgid "fast-forwardable" +msgstr "fast-forwardable" + +#: builtin/remote.c:1064 +msgid "local out of date" +msgstr "local desatualizada" + +#: builtin/remote.c:1071 +#, c-format +msgid " %-*s forces to %-*s (%s)" +msgstr "" + +#: builtin/remote.c:1074 +#, c-format +msgid " %-*s pushes to %-*s (%s)" +msgstr "" + +#: builtin/remote.c:1078 +#, c-format +msgid " %-*s forces to %s" +msgstr "" + +#: builtin/remote.c:1081 +#, c-format +msgid " %-*s pushes to %s" +msgstr "" + +#: builtin/remote.c:1118 +#, c-format +msgid "* remote %s" +msgstr "* remota %s" + +#: builtin/remote.c:1119 +#, c-format +msgid " Fetch URL: %s" +msgstr "" + +#: builtin/remote.c:1120 +#: builtin/remote.c:1285 +msgid "(no URL)" +msgstr "(nenhum URL)" + +#: builtin/remote.c:1129 +#: builtin/remote.c:1131 +#, c-format +msgid " Push URL: %s" +msgstr "" + +#: builtin/remote.c:1133 +#: builtin/remote.c:1135 +#: builtin/remote.c:1137 +#, c-format +msgid " HEAD branch: %s" +msgstr "Rama HEAD: %s" + +#: builtin/remote.c:1139 +#, c-format +msgid " HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" +msgstr "" + +#: builtin/remote.c:1151 +#, c-format +msgid " Remote branch:%s" +msgid_plural " Remote branches:%s" +msgstr[0] "Rama remota:%s" +msgstr[1] "Ramas remotas:%s'" + +#: builtin/remote.c:1154 +#: builtin/remote.c:1181 +msgid " (status not queried)" +msgstr "" + +#: builtin/remote.c:1163 +msgid " Local branch configured for 'git pull':" +msgid_plural " Local branches configured for 'git pull':" +msgstr[0] "" +msgstr[1] "" + +#: builtin/remote.c:1171 +msgid " Local refs will be mirrored by 'git push'" +msgstr "" + +#: builtin/remote.c:1178 +#, c-format +msgid " Local ref configured for 'git push'%s:" +msgid_plural " Local refs configured for 'git push'%s:" +msgstr[0] "" +msgstr[1] "" + +#: builtin/remote.c:1216 +msgid "Cannot determine remote HEAD" +msgstr "" + +#: builtin/remote.c:1218 +msgid "Multiple remote HEAD branches. Please choose one explicitly with:" +msgstr "" + +#: builtin/remote.c:1228 +#, c-format +msgid "Could not delete %s" +msgstr "Não foi possível abrir %s" + +#: builtin/remote.c:1236 +#, c-format +msgid "Not a valid ref: %s" +msgstr "" + +#: builtin/remote.c:1238 +#, c-format +msgid "Could not setup %s" +msgstr "Não foi possível configurar %s" + +#: builtin/remote.c:1274 +#, c-format +msgid " %s will become dangling!" +msgstr "" + +#: builtin/remote.c:1275 +#, c-format +msgid " %s has become dangling!" +msgstr "" + +#: builtin/remote.c:1281 +#, c-format +msgid "Pruning %s" +msgstr "Apagando %s" + +#: builtin/remote.c:1282 +#, c-format +msgid "URL: %s" +msgstr "URL: %s" + +#: builtin/remote.c:1295 +#, c-format +msgid " * [would prune] %s" +msgstr "" + +#: builtin/remote.c:1298 +#, c-format +msgid " * [pruned] %s" +msgstr "" + +#: builtin/remote.c:1387 +#: builtin/remote.c:1461 +#, c-format +msgid "No such remote '%s'" +msgstr "Não existe este remoto '%s'" + +#: builtin/remote.c:1414 +msgid "no remote specified" +msgstr "Nenhum remoto especificado" + +#: builtin/remote.c:1447 +msgid "--add --delete doesn't make sense" +msgstr "" + +#: builtin/remote.c:1487 +#, c-format +msgid "Invalid old URL pattern: %s" +msgstr "" + +#: builtin/remote.c:1495 +#, c-format +msgid "No such URL found: %s" +msgstr "Nenhum URL encontrado: %s" + +#: builtin/remote.c:1497 +msgid "Will not delete all non-push URLs" +msgstr "" + #: builtin/reset.c:33 msgid "mixed" msgstr "mistura" @@ -2886,6 +4167,10 @@ msgid "hard" msgstr "forte" #: builtin/reset.c:33 +msgid "merge" +msgstr "juntar" + +#: builtin/reset.c:33 msgid "keep" msgstr "manter" @@ -2953,20 +4238,20 @@ msgid "Could not reset index file to revision '%s'." msgstr "" #: builtin/revert.c:70 -#: builtin/revert.c:91 +#: builtin/revert.c:92 #, c-format msgid "%s: %s cannot be used with %s" msgstr "" -#: builtin/revert.c:126 +#: builtin/revert.c:131 msgid "program error" msgstr "erro do programa" -#: builtin/revert.c:209 +#: builtin/revert.c:221 msgid "revert failed" msgstr "falhou o revert" -#: builtin/revert.c:224 +#: builtin/revert.c:236 msgid "cherry-pick failed" msgstr "cherry-pick falhou" @@ -3006,32 +4291,32 @@ msgstr "" msgid "Missing author: %s" msgstr "Autor em falta: %s" -#: builtin/tag.c:58 +#: builtin/tag.c:60 #, c-format msgid "malformed object at '%s'" msgstr "" -#: builtin/tag.c:205 +#: builtin/tag.c:207 #, c-format msgid "tag name too long: %.*s..." msgstr "" -#: builtin/tag.c:210 +#: builtin/tag.c:212 #, c-format msgid "tag '%s' not found." msgstr "etiqueta '%s' não foi encontrada." -#: builtin/tag.c:225 +#: builtin/tag.c:227 #, c-format msgid "Deleted tag '%s' (was %s)\n" msgstr "" -#: builtin/tag.c:237 +#: builtin/tag.c:239 #, c-format msgid "could not verify the tag '%s'" msgstr "" -#: builtin/tag.c:247 +#: builtin/tag.c:249 msgid "" "\n" "#\n" @@ -3040,7 +4325,7 @@ msgid "" "#\n" msgstr "" -#: builtin/tag.c:254 +#: builtin/tag.c:256 msgid "" "\n" "#\n" @@ -3049,159 +4334,251 @@ msgid "" "#\n" msgstr "" -#: builtin/tag.c:294 +#: builtin/tag.c:298 msgid "unable to sign the tag" msgstr "" -#: builtin/tag.c:296 +#: builtin/tag.c:300 msgid "unable to write tag file" msgstr "" -#: builtin/tag.c:321 +#: builtin/tag.c:325 msgid "bad object type." msgstr "" -#: builtin/tag.c:334 +#: builtin/tag.c:338 msgid "tag header too big." msgstr "" -#: builtin/tag.c:366 +#: builtin/tag.c:370 msgid "no tag message?" msgstr "nenhuma mensaje para a etiqueta?" -#: builtin/tag.c:372 +#: builtin/tag.c:376 #, c-format msgid "The tag message has been left in %s\n" msgstr "" -#: builtin/tag.c:421 +#: builtin/tag.c:425 msgid "switch 'points-at' requires an object" msgstr "" -#: builtin/tag.c:423 +#: builtin/tag.c:427 #, c-format msgid "malformed object name '%s'" msgstr "" -#: builtin/tag.c:502 +#: builtin/tag.c:506 +msgid "--column and -n are incompatible" +msgstr "--column e -n are são incompatíveis" + +#: builtin/tag.c:523 msgid "-n option is only allowed with -l." msgstr "" -#: builtin/tag.c:504 +#: builtin/tag.c:525 msgid "--contains option is only allowed with -l." msgstr "" -#: builtin/tag.c:506 +#: builtin/tag.c:527 msgid "--points-at option is only allowed with -l." msgstr "" -#: builtin/tag.c:514 +#: builtin/tag.c:535 msgid "only one -F or -m option is allowed." msgstr "" -#: builtin/tag.c:534 +#: builtin/tag.c:555 msgid "too many params" msgstr "demasiado parametros" -#: builtin/tag.c:540 +#: builtin/tag.c:561 #, c-format msgid "'%s' is not a valid tag name." msgstr "" -#: builtin/tag.c:545 +#: builtin/tag.c:566 #, c-format msgid "tag '%s' already exists" msgstr "etiqueta '%s' já existe" -#: builtin/tag.c:563 +#: builtin/tag.c:584 #, c-format msgid "%s: cannot lock the ref" msgstr "" -#: builtin/tag.c:565 +#: builtin/tag.c:586 #, c-format msgid "%s: cannot update the ref" msgstr "" -#: builtin/tag.c:567 +#: builtin/tag.c:588 #, c-format msgid "Updated tag '%s' (was %s)\n" msgstr "" -#: git-am.sh:49 +#: git.c:16 +msgid "See 'git help <command>' for more information on a specific command." +msgstr "" + +#: common-cmds.h:8 +msgid "Add file contents to the index" +msgstr "" + +#: common-cmds.h:9 +msgid "Find by binary search the change that introduced a bug" +msgstr "" + +#: common-cmds.h:10 +msgid "List, create, or delete branches" +msgstr "Listar, criar ou apagar ramas" + +#: common-cmds.h:11 +msgid "Checkout a branch or paths to the working tree" +msgstr "" + +#: common-cmds.h:12 +msgid "Clone a repository into a new directory" +msgstr "" + +#: common-cmds.h:13 +msgid "Record changes to the repository" +msgstr "Gravar alterações para o repositório" + +#: common-cmds.h:14 +msgid "Show changes between commits, commit and working tree, etc" +msgstr "" + +#: common-cmds.h:15 +msgid "Download objects and refs from another repository" +msgstr "" + +#: common-cmds.h:16 +msgid "Print lines matching a pattern" +msgstr "" + +#: common-cmds.h:17 +msgid "Create an empty git repository or reinitialize an existing one" +msgstr "" + +#: common-cmds.h:18 +msgid "Show commit logs" +msgstr "Mostrado logs de commits" + +#: common-cmds.h:19 +msgid "Join two or more development histories together" +msgstr "" + +#: common-cmds.h:20 +msgid "Move or rename a file, a directory, or a symlink" +msgstr "" + +#: common-cmds.h:21 +msgid "Fetch from and merge with another repository or a local branch" +msgstr "" + +#: common-cmds.h:22 +msgid "Update remote refs along with associated objects" +msgstr "" + +#: common-cmds.h:23 +msgid "Forward-port local commits to the updated upstream head" +msgstr "" + +#: common-cmds.h:24 +msgid "Reset current HEAD to the specified state" +msgstr "" + +#: common-cmds.h:25 +msgid "Remove files from the working tree and from the index" +msgstr "" + +#: common-cmds.h:26 +msgid "Show various types of objects" +msgstr "" + +#: common-cmds.h:27 +msgid "Show the working tree status" +msgstr "Mostrar o estado los ramos das árvores de trabalho" + +#: common-cmds.h:28 +msgid "Create, list, delete or verify a tag object signed with GPG" +msgstr "" + +#: git-am.sh:50 msgid "You need to set your committer info first" msgstr "Necessitas primeiro de especificiar os teus dados de committer" -#: git-am.sh:136 +#: git-am.sh:137 msgid "Repository lacks necessary blobs to fall back on 3-way merge." msgstr "" -#: git-am.sh:147 +#: git-am.sh:154 msgid "" "Did you hand edit your patch?\n" "It does not apply to blobs recorded in its index." msgstr "" -#: git-am.sh:156 +#: git-am.sh:163 msgid "Falling back to patching base and 3-way merge..." msgstr "" -#: git-am.sh:268 +#: git-am.sh:275 msgid "Only one StGIT patch series can be applied at once" msgstr "" -#: git-am.sh:355 +#: git-am.sh:362 #, sh-format msgid "Patch format $patch_format is not supported." msgstr "" -#: git-am.sh:357 +#: git-am.sh:364 msgid "Patch format detection failed." msgstr "Falhou a detecção do formato do patch." -#: git-am.sh:411 +#: git-am.sh:418 msgid "-d option is no longer supported. Do not use." msgstr "" -#: git-am.sh:474 +#: git-am.sh:481 #, sh-format msgid "previous rebase directory $dotest still exists but mbox given." msgstr "" -#: git-am.sh:479 +#: git-am.sh:486 msgid "Please make up your mind. --skip or --abort?" msgstr "" -#: git-am.sh:506 +#: git-am.sh:513 msgid "Resolve operation not in progress, we are not resuming." msgstr "" -#: git-am.sh:572 +#: git-am.sh:579 #, sh-format msgid "Dirty index: cannot apply patches (dirty: $files)" msgstr "" -#: git-am.sh:748 +#: git-am.sh:755 msgid "cannot be interactive without stdin connected to a terminal." msgstr "" #. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a] #. in your translation. The program will only accept English #. input at this point. -#: git-am.sh:759 +#: git-am.sh:766 msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all " msgstr "Aplicar? Sim[y]/[n]ão/[e]ditar/[v]er patch/[a]ceitar todos " -#: git-am.sh:795 +#: git-am.sh:802 #, sh-format msgid "Applying: $FIRSTLINE" msgstr "Aplicando: $FIRSTLINE" -#: git-am.sh:840 +#: git-am.sh:847 msgid "No changes -- Patch already applied." msgstr "Nenhuma mudança -- Já foi aplicado o patch." -#: git-am.sh:866 +#: git-am.sh:873 msgid "applying to an empty history" msgstr "" @@ -3296,7 +4673,7 @@ msgstr "" #: git-bisect.sh:474 msgid "We are not bisecting." -msgstr "" +msgstr "Não estamos a bisseccionar." #: git-pull.sh:21 msgid "" @@ -3433,163 +4810,171 @@ msgstr "" msgid "cannot strip one component off url '$remoteurl'" msgstr "" -#: git-submodule.sh:108 +#: git-submodule.sh:109 #, sh-format -msgid "No submodule mapping found in .gitmodules for path '$path'" +msgid "No submodule mapping found in .gitmodules for path '$sm_path'" msgstr "" -#: git-submodule.sh:149 +#: git-submodule.sh:150 #, sh-format -msgid "Clone of '$url' into submodule path '$path' failed" +msgid "Clone of '$url' into submodule path '$sm_path' failed" msgstr "" -#: git-submodule.sh:159 +#: git-submodule.sh:160 #, sh-format msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa" msgstr "" -#: git-submodule.sh:247 +#: git-submodule.sh:249 #, sh-format msgid "repo URL: '$repo' must be absolute or begin with ./|../" msgstr "" -#: git-submodule.sh:264 +#: git-submodule.sh:266 #, sh-format -msgid "'$path' already exists in the index" +msgid "'$sm_path' already exists in the index" msgstr "" -#: git-submodule.sh:281 +#: git-submodule.sh:283 #, sh-format -msgid "'$path' already exists and is not a valid git repo" +msgid "'$sm_path' already exists and is not a valid git repo" msgstr "" -#: git-submodule.sh:295 +#: git-submodule.sh:297 #, sh-format -msgid "Unable to checkout submodule '$path'" +msgid "Unable to checkout submodule '$sm_path'" msgstr "" -#: git-submodule.sh:300 +#: git-submodule.sh:302 #, sh-format -msgid "Failed to add submodule '$path'" +msgid "Failed to add submodule '$sm_path'" msgstr "" -#: git-submodule.sh:305 +#: git-submodule.sh:307 #, sh-format -msgid "Failed to register submodule '$path'" +msgid "Failed to register submodule '$sm_path'" msgstr "" -#: git-submodule.sh:347 +#: git-submodule.sh:349 #, sh-format -msgid "Entering '$prefix$path'" -msgstr "Entrando '$prefix$path'" +msgid "Entering '$prefix$sm_path'" +msgstr "Entrando '$prefix$sm_path'" -#: git-submodule.sh:359 +#: git-submodule.sh:363 #, sh-format -msgid "Stopping at '$path'; script returned non-zero status." +msgid "Stopping at '$sm_path'; script returned non-zero status." msgstr "" -#: git-submodule.sh:401 +#: git-submodule.sh:405 #, sh-format -msgid "No url found for submodule path '$path' in .gitmodules" +msgid "No url found for submodule path '$sm_path' in .gitmodules" msgstr "" -#: git-submodule.sh:410 +#: git-submodule.sh:414 #, sh-format -msgid "Failed to register url for submodule path '$path'" +msgid "Failed to register url for submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:418 +#: git-submodule.sh:422 #, sh-format -msgid "Failed to register update mode for submodule path '$path'" +msgid "Failed to register update mode for submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:420 +#: git-submodule.sh:424 #, sh-format -msgid "Submodule '$name' ($url) registered for path '$path'" +msgid "Submodule '$name' ($url) registered for path '$sm_path'" msgstr "" -#: git-submodule.sh:519 +#: git-submodule.sh:523 #, sh-format msgid "" -"Submodule path '$path' not initialized\n" +"Submodule path '$sm_path' not initialized\n" "Maybe you want to use 'update --init'?" msgstr "" -#: git-submodule.sh:532 +#: git-submodule.sh:536 #, sh-format -msgid "Unable to find current revision in submodule path '$path'" +msgid "Unable to find current revision in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:551 +#: git-submodule.sh:555 #, sh-format -msgid "Unable to fetch in submodule path '$path'" +msgid "Unable to fetch in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:565 +#: git-submodule.sh:569 #, sh-format -msgid "Unable to rebase '$sha1' in submodule path '$path'" +msgid "Unable to rebase '$sha1' in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:566 +#: git-submodule.sh:570 #, sh-format -msgid "Submodule path '$path': rebased into '$sha1'" +msgid "Submodule path '$sm_path': rebased into '$sha1'" msgstr "" -#: git-submodule.sh:571 +#: git-submodule.sh:575 #, sh-format -msgid "Unable to merge '$sha1' in submodule path '$path'" +msgid "Unable to merge '$sha1' in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:572 +#: git-submodule.sh:576 #, sh-format -msgid "Submodule path '$path': merged in '$sha1'" +msgid "Submodule path '$sm_path': merged in '$sha1'" msgstr "" -#: git-submodule.sh:577 +#: git-submodule.sh:581 #, sh-format -msgid "Unable to checkout '$sha1' in submodule path '$path'" +msgid "Unable to checkout '$sha1' in submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:578 +#: git-submodule.sh:582 #, sh-format -msgid "Submodule path '$path': checked out '$sha1'" +msgid "Submodule path '$sm_path': checked out '$sha1'" msgstr "" -#: git-submodule.sh:600 -#: git-submodule.sh:923 +#: git-submodule.sh:604 +#: git-submodule.sh:927 #, sh-format -msgid "Failed to recurse into submodule path '$path'" +msgid "Failed to recurse into submodule path '$sm_path'" msgstr "" -#: git-submodule.sh:708 +#: git-submodule.sh:712 msgid "--" msgstr "--" -#: git-submodule.sh:766 +#: git-submodule.sh:770 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_src" msgstr "" -#: git-submodule.sh:769 +#: git-submodule.sh:773 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_dst" msgstr "" -#: git-submodule.sh:772 +#: git-submodule.sh:776 #, sh-format msgid " Warn: $name doesn't contain commits $sha1_src and $sha1_dst" msgstr "" -#: git-submodule.sh:797 +#: git-submodule.sh:801 msgid "blob" msgstr "blob" -#: git-submodule.sh:798 +#: git-submodule.sh:802 msgid "submodule" msgstr "submódulos" -#: git-submodule.sh:969 +#: git-submodule.sh:973 #, sh-format msgid "Synchronizing submodule url for '$name'" msgstr "" +#~ msgid "cherry-pick" +#~ msgstr "cherry-pick" + +#~ msgid "Please enter the commit message for your changes." +#~ msgstr "Por favor insira a mensagem de commit das suas alterações." + +#~ msgid "Too many options specified" +#~ msgstr "Demasiadas opções especificadas" @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: git 1.7.10\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2012-03-16 20:18+0800\n" -"PO-Revision-Date: 2012-03-26 07:00+0100\n" +"POT-Creation-Date: 2012-05-15 06:31+0800\n" +"PO-Revision-Date: 2012-05-28 22:35+0100\n" "Last-Translator: Peter Krefting <peter@softwolves.pp.se>\n" "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" "Language: sv\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: advice.c:34 +#: advice.c:40 #, c-format msgid "hint: %.*s\n" msgstr "tips: %.*s\n" @@ -26,7 +26,7 @@ msgstr "tips: %.*s\n" #. * Message used both when 'git commit' fails and when #. * other commands doing a merge do. #. -#: advice.c:64 +#: advice.c:70 msgid "" "Fix them up in the work tree,\n" "and then use 'git add/rm <file>' as\n" @@ -85,32 +85,32 @@ msgstr "" "Hittade fel i konfigurationsvariabeln \"diff.dirstat\":\n" "%s" -#: diff.c:1336 +#: diff.c:1400 msgid " 0 files changed\n" msgstr " 0 filer ändrade\n" -#: diff.c:1340 +#: diff.c:1404 #, c-format msgid " %d file changed" msgid_plural " %d files changed" msgstr[0] " %d fil ändrad" msgstr[1] " %d filer ändrade" -#: diff.c:1357 +#: diff.c:1421 #, c-format msgid ", %d insertion(+)" msgid_plural ", %d insertions(+)" msgstr[0] ", %d tillägg(+)" msgstr[1] ", %d tillägg(+)" -#: diff.c:1368 +#: diff.c:1432 #, c-format msgid ", %d deletion(-)" msgid_plural ", %d deletions(-)" msgstr[0] ", %d borttagning(-)" msgstr[1] ", %d borttagningar(-)" -#: diff.c:3424 +#: diff.c:3439 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -187,14 +187,14 @@ msgstr[1] "" "Din gren och \"%s\" har divergerat,\n" "och har %d respektive %d olika incheckningar.\n" -#: sequencer.c:120 builtin/merge.c:864 builtin/merge.c:985 -#: builtin/merge.c:1095 builtin/merge.c:1105 +#: sequencer.c:120 builtin/merge.c:865 builtin/merge.c:978 +#: builtin/merge.c:1088 builtin/merge.c:1098 #, c-format msgid "Could not open '%s' for writing" msgstr "Kunde inte öppna \"%s\" för skrivning" -#: sequencer.c:122 builtin/merge.c:334 builtin/merge.c:867 -#: builtin/merge.c:1097 builtin/merge.c:1110 +#: sequencer.c:122 builtin/merge.c:333 builtin/merge.c:868 +#: builtin/merge.c:1090 builtin/merge.c:1103 #, c-format msgid "Could not write to '%s'" msgstr "Kunde inte skriva till \"%s\"" @@ -291,7 +291,7 @@ msgid "could not apply %s... %s" msgstr "kunde inte applicera %s... %s" #: sequencer.c:450 sequencer.c:909 builtin/log.c:288 builtin/log.c:713 -#: builtin/log.c:1329 builtin/log.c:1548 builtin/merge.c:348 +#: builtin/log.c:1329 builtin/log.c:1548 builtin/merge.c:347 #: builtin/shortlog.c:181 msgid "revision walk setup failed" msgstr "misslyckades skapa revisionstraversering" @@ -999,7 +999,7 @@ msgid "path '%s' is unmerged" msgstr "sökvägen \"%s\" har inte slagits ihop" #: builtin/checkout.c:302 builtin/checkout.c:498 builtin/clone.c:583 -#: builtin/merge.c:811 +#: builtin/merge.c:812 msgid "unable to write new index file" msgstr "kunde inte skriva ny indexfil" @@ -1089,71 +1089,71 @@ msgstr "" " git branch nytt_grennamn %s\n" "\n" -#: builtin/checkout.c:692 +#: builtin/checkout.c:693 msgid "internal error in revision walk" msgstr "internt fel vid genomgång av revisioner (revision walk)" -#: builtin/checkout.c:696 +#: builtin/checkout.c:697 msgid "Previous HEAD position was" msgstr "Tidigare position för HEAD var" -#: builtin/checkout.c:722 +#: builtin/checkout.c:723 msgid "You are on a branch yet to be born" msgstr "Du är på en gren som ännu inte är född" #. case (1) -#: builtin/checkout.c:853 +#: builtin/checkout.c:854 #, c-format msgid "invalid reference: %s" msgstr "felaktig referens: %s" #. case (1): want a tree -#: builtin/checkout.c:892 +#: builtin/checkout.c:893 #, c-format msgid "reference is not a tree: %s" msgstr "referensen är inte ett träd: %s" -#: builtin/checkout.c:972 +#: builtin/checkout.c:973 msgid "-B cannot be used with -b" msgstr "-B kan inte användas med -b" -#: builtin/checkout.c:981 +#: builtin/checkout.c:982 msgid "--patch is incompatible with all other options" msgstr "--patch är inkompatibel med alla andra flaggor" -#: builtin/checkout.c:984 +#: builtin/checkout.c:985 msgid "--detach cannot be used with -b/-B/--orphan" msgstr "--detcah kan inte användas med -b/-B/--orphan" -#: builtin/checkout.c:986 +#: builtin/checkout.c:987 msgid "--detach cannot be used with -t" msgstr "--detach kan inte användas med -t" -#: builtin/checkout.c:992 +#: builtin/checkout.c:993 msgid "--track needs a branch name" msgstr "--track behöver ett namn på en gren" -#: builtin/checkout.c:999 +#: builtin/checkout.c:1000 msgid "Missing branch name; try -b" msgstr "Grennamn saknas; försök med -b" -#: builtin/checkout.c:1005 +#: builtin/checkout.c:1006 msgid "--orphan and -b|-B are mutually exclusive" msgstr "--orphan och -b|-B kan inte användas samtidigt" -#: builtin/checkout.c:1007 +#: builtin/checkout.c:1008 msgid "--orphan cannot be used with -t" msgstr "--orphan kan inte användas med -t" -#: builtin/checkout.c:1017 +#: builtin/checkout.c:1018 msgid "git checkout: -f and -m are incompatible" msgstr "git checkout: -f och -m är inkompatibla" -#: builtin/checkout.c:1051 +#: builtin/checkout.c:1052 msgid "invalid path specification" msgstr "felaktig sökvägsangivelse" -#: builtin/checkout.c:1059 +#: builtin/checkout.c:1060 #, c-format msgid "" "git checkout: updating paths is incompatible with switching branches.\n" @@ -1162,15 +1162,15 @@ msgstr "" "git checkout: uppdatera sökvägar är inkompatibelt med att växla gren.\n" "Ville du checka ut \"%s\" som inte kan lösas som en sammanslaning?" -#: builtin/checkout.c:1061 +#: builtin/checkout.c:1062 msgid "git checkout: updating paths is incompatible with switching branches." msgstr "git checkout: uppdatera sökvägar är inkompatibelt med att växla gren." -#: builtin/checkout.c:1066 +#: builtin/checkout.c:1067 msgid "git checkout: --detach does not take a path argument" msgstr "git checkout: --detach tar inte en sökväg som argument" -#: builtin/checkout.c:1069 +#: builtin/checkout.c:1070 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." @@ -1178,11 +1178,11 @@ msgstr "" "git checkout: --ours/--theirs, --force och --merge är inkompatibla när\n" "du checkar ut från indexet." -#: builtin/checkout.c:1088 +#: builtin/checkout.c:1089 msgid "Cannot switch branch to a non-commit." msgstr "Kan inte växla gren på en icke-incheckning." -#: builtin/checkout.c:1091 +#: builtin/checkout.c:1092 msgid "--ours/--theirs is incompatible with switching branches." msgstr "--ours/--theirs är inkompatibla med att byta gren." @@ -1445,67 +1445,67 @@ msgstr "kan inte läsa indexet" msgid "unable to write temporary index file" msgstr "kunde inte skriva temporär indexfil" -#: builtin/commit.c:550 builtin/commit.c:556 +#: builtin/commit.c:561 builtin/commit.c:567 #, c-format msgid "invalid commit: %s" msgstr "felaktig incheckning: %s" -#: builtin/commit.c:579 +#: builtin/commit.c:590 msgid "malformed --author parameter" msgstr "felformad \"--author\"-flagga" -#: builtin/commit.c:635 +#: builtin/commit.c:651 #, c-format msgid "Malformed ident string: '%s'" msgstr "Felaktig indragningssträng: \"%s\"" -#: builtin/commit.c:670 builtin/commit.c:703 builtin/commit.c:1000 +#: builtin/commit.c:689 builtin/commit.c:722 builtin/commit.c:1033 #, c-format msgid "could not lookup commit %s" msgstr "kunde inte slå upp incheckningen %s" -#: builtin/commit.c:682 builtin/shortlog.c:296 +#: builtin/commit.c:701 builtin/shortlog.c:296 #, c-format msgid "(reading log message from standard input)\n" msgstr "(läser loggmeddelande från standard in)\n" -#: builtin/commit.c:684 +#: builtin/commit.c:703 msgid "could not read log from standard input" msgstr "kunde inte läsa logg från standard in" -#: builtin/commit.c:688 +#: builtin/commit.c:707 #, c-format msgid "could not read log file '%s'" msgstr "kunde inte läsa loggfilen \"%s\"" -#: builtin/commit.c:694 +#: builtin/commit.c:713 msgid "commit has empty message" msgstr "incheckningen har ett tomt meddelande" -#: builtin/commit.c:710 +#: builtin/commit.c:729 msgid "could not read MERGE_MSG" msgstr "kunde inte läsa MERGE_MSG" -#: builtin/commit.c:714 +#: builtin/commit.c:733 msgid "could not read SQUASH_MSG" msgstr "kunde inte läsa SQUASH_MSG" -#: builtin/commit.c:718 +#: builtin/commit.c:737 #, c-format msgid "could not read '%s'" msgstr "kunde inte läsa \"%s\"" -#: builtin/commit.c:746 +#: builtin/commit.c:765 #, c-format msgid "could not open '%s'" msgstr "kunde inte öppna \"%s\"" -#: builtin/commit.c:770 +#: builtin/commit.c:789 msgid "could not write commit template" msgstr "kunde inte skriva incheckningsmall" # %s är "merge" eller "cherry-pick" -#: builtin/commit.c:783 +#: builtin/commit.c:799 #, c-format msgid "" "\n" @@ -1520,11 +1520,11 @@ msgstr "" "\t%s\n" "och försöker igen.\n" -#: builtin/commit.c:796 +#: builtin/commit.c:812 msgid "Please enter the commit message for your changes." msgstr "Ange ett incheckningsmeddelande för dina ändringar." -#: builtin/commit.c:799 +#: builtin/commit.c:815 msgid "" " Lines starting\n" "with '#' will be ignored, and an empty message aborts the commit.\n" @@ -1532,7 +1532,7 @@ msgstr "" " Rader som inleds\n" "med \"#\" kommer ignoreras, och ett tomt meddelande avbryter incheckningen.\n" -#: builtin/commit.c:804 +#: builtin/commit.c:820 msgid "" " Lines starting\n" "with '#' will be kept; you may remove them yourself if you want to.\n" @@ -1542,151 +1542,156 @@ msgstr "" "med \"#\" kommer behållas; du kan själv ta bort dem om du vill.\n" "Ett tomt meddelande avbryter incheckningen.\n" -#: builtin/commit.c:816 +#: builtin/commit.c:832 #, c-format msgid "%sAuthor: %s" msgstr "%sFörfattare: %s" -#: builtin/commit.c:823 +#: builtin/commit.c:839 #, c-format msgid "%sCommitter: %s" msgstr "%sIncheckare: %s" -#: builtin/commit.c:843 +#: builtin/commit.c:859 msgid "Cannot read index" msgstr "Kan inte läsa indexet" -#: builtin/commit.c:880 +#: builtin/commit.c:896 msgid "Error building trees" msgstr "Fel vid byggande av träd" -#: builtin/commit.c:895 builtin/tag.c:357 +#: builtin/commit.c:911 builtin/tag.c:357 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "Ange meddelandet en av flaggorna -m eller -F.\n" -#: builtin/commit.c:975 +#: builtin/commit.c:1008 #, c-format msgid "No existing author found with '%s'" msgstr "Hittade ingen befintlig författare med \"%s\"" -#: builtin/commit.c:990 builtin/commit.c:1182 +#: builtin/commit.c:1023 builtin/commit.c:1217 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "Ogiltigt läge för ospårade filer: \"%s\"" -#: builtin/commit.c:1030 +#: builtin/commit.c:1063 msgid "Using both --reset-author and --author does not make sense" msgstr "Kan inte använda både --reset-author och --author" -#: builtin/commit.c:1041 +#: builtin/commit.c:1074 msgid "You have nothing to amend." msgstr "Du har inget att utöka." -#: builtin/commit.c:1043 +#: builtin/commit.c:1076 #, c-format msgid "You are in the middle of a %s -- cannot amend." msgstr "Du är i mitten av en %s -- kan inte utöka." -#: builtin/commit.c:1045 +#: builtin/commit.c:1078 msgid "Options --squash and --fixup cannot be used together" msgstr "Flaggorna --squash och --fixup kan inte användas samtidigt" -#: builtin/commit.c:1055 +#: builtin/commit.c:1088 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "Endast en av -c/-C/-F/--fixup kan användas." -#: builtin/commit.c:1057 +#: builtin/commit.c:1090 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "Flaggan -m kan inte kombineras med -c/-C/-F/--fixup." -#: builtin/commit.c:1063 +#: builtin/commit.c:1098 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "--reset-author kan endast användas med -C, -c eller --amend." -#: builtin/commit.c:1080 +#: builtin/commit.c:1115 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "" "Endast en av --include/--only/--all/--interactive/--patch kan användas." -#: builtin/commit.c:1082 +#: builtin/commit.c:1117 msgid "No paths with --include/--only does not make sense." msgstr "Du måste ange sökvägar tillsammans med --include/--only." -#: builtin/commit.c:1084 +#: builtin/commit.c:1119 msgid "Clever... amending the last one with dirty index." msgstr "Smart... utöka den senaste med smutsigt index." -#: builtin/commit.c:1086 +#: builtin/commit.c:1121 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "Explicita sökvägar angavs utan -i eller -o; antar --only sökvägar..." -#: builtin/commit.c:1096 builtin/tag.c:556 +#: builtin/commit.c:1131 builtin/tag.c:556 #, c-format msgid "Invalid cleanup mode %s" msgstr "Felaktigt städningsläge %s" -#: builtin/commit.c:1101 +#: builtin/commit.c:1136 msgid "Paths with -a does not make sense." msgstr "Kan inte ange sökvägar med -a." -#: builtin/commit.c:1280 +#: builtin/commit.c:1315 msgid "couldn't look up newly created commit" msgstr "kunde inte slå upp en precis skapad incheckning" -#: builtin/commit.c:1282 +#: builtin/commit.c:1317 msgid "could not parse newly created commit" msgstr "kunde inte tolka en precis skapad incheckning" -#: builtin/commit.c:1323 +#: builtin/commit.c:1358 msgid "detached HEAD" msgstr "frånkopplad HEAD" -#: builtin/commit.c:1325 +#: builtin/commit.c:1360 msgid " (root-commit)" msgstr " (rotincheckning)" -#: builtin/commit.c:1415 +#: builtin/commit.c:1450 msgid "could not parse HEAD commit" msgstr "kunde inte tolka HEAD:s incheckning" -#: builtin/commit.c:1452 builtin/merge.c:509 +#: builtin/commit.c:1487 builtin/merge.c:509 #, c-format msgid "could not open '%s' for reading" msgstr "kunde inte öppna \"%s\" för läsning" -#: builtin/commit.c:1459 +#: builtin/commit.c:1494 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "Trasig MERGE_HEAD-fil (%s)" -#: builtin/commit.c:1466 +#: builtin/commit.c:1501 msgid "could not read MERGE_MODE" msgstr "kunde inte läsa MERGE_MODE" -#: builtin/commit.c:1485 +#: builtin/commit.c:1520 #, c-format msgid "could not read commit message: %s" msgstr "kunde inte läsa incheckningsmeddelande: %s" -#: builtin/commit.c:1499 +#: builtin/commit.c:1534 +#, c-format +msgid "Aborting commit; you did not edit the message.\n" +msgstr "Avbryter incheckning; meddelandet inte redigerat.\n" + +#: builtin/commit.c:1539 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "Avbryter på grund av tomt incheckningsmeddelande.\n" -#: builtin/commit.c:1514 builtin/merge.c:935 builtin/merge.c:968 +#: builtin/commit.c:1554 builtin/merge.c:936 builtin/merge.c:961 msgid "failed to write commit object" msgstr "kunde inte skriva incheckningsobjekt" -#: builtin/commit.c:1535 +#: builtin/commit.c:1575 msgid "cannot lock HEAD ref" msgstr "kunde inte låsa HEAD-referens" -#: builtin/commit.c:1539 +#: builtin/commit.c:1579 msgid "cannot update HEAD ref" msgstr "kunde inte uppdatera HEAD-referens" -#: builtin/commit.c:1550 +#: builtin/commit.c:1590 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -1819,68 +1824,72 @@ msgstr "ej hanterat objekt \"%s\" angavs." msgid "Couldn't find remote ref HEAD" msgstr "Kunde inte hitta fjärr-referensen HEAD" -#: builtin/fetch.c:252 +#: builtin/fetch.c:253 #, c-format msgid "object %s not found" msgstr "objektet %s hittades inte" -#: builtin/fetch.c:258 +#: builtin/fetch.c:259 msgid "[up to date]" msgstr "[àjour]" -#: builtin/fetch.c:272 +#: builtin/fetch.c:273 #, c-format msgid "! %-*s %-*s -> %s (can't fetch in current branch)" msgstr "! %-*s %-*s -> %s (kan inte hämta i aktuell gren)" -#: builtin/fetch.c:273 builtin/fetch.c:351 +#: builtin/fetch.c:274 builtin/fetch.c:360 msgid "[rejected]" msgstr "[refuserad]" -#: builtin/fetch.c:284 +#: builtin/fetch.c:285 msgid "[tag update]" msgstr "[uppdaterad tagg]" -#: builtin/fetch.c:286 builtin/fetch.c:313 builtin/fetch.c:331 +#: builtin/fetch.c:287 builtin/fetch.c:322 builtin/fetch.c:340 msgid " (unable to update local ref)" msgstr " (kunde inte uppdatera lokal ref)" -#: builtin/fetch.c:298 +#: builtin/fetch.c:305 msgid "[new tag]" msgstr "[ny tagg]" -#: builtin/fetch.c:302 +#: builtin/fetch.c:308 msgid "[new branch]" msgstr "[ny gren]" -#: builtin/fetch.c:347 +#: builtin/fetch.c:311 +msgid "[new ref]" +msgstr "[ny ref]" + +#: builtin/fetch.c:356 msgid "unable to update local ref" msgstr "kunde inte uppdatera lokal ref" -#: builtin/fetch.c:347 +#: builtin/fetch.c:356 msgid "forced update" msgstr "tvingad uppdatering" -#: builtin/fetch.c:353 +#: builtin/fetch.c:362 msgid "(non-fast-forward)" msgstr "(ej snabbspolad)" -#: builtin/fetch.c:384 builtin/fetch.c:676 +#: builtin/fetch.c:393 builtin/fetch.c:685 #, c-format msgid "cannot open %s: %s\n" msgstr "kan inte öppna %s: %s\n" -#: builtin/fetch.c:393 +#: builtin/fetch.c:402 #, c-format msgid "%s did not send all necessary objects\n" msgstr "%s sände inte alla nödvändiga objekt\n" -#: builtin/fetch.c:479 +#: builtin/fetch.c:488 #, c-format msgid "From %.*s\n" msgstr "Från %.*s\n" -#: builtin/fetch.c:490 +#: builtin/fetch.c:499 #, c-format msgid "" "some local refs could not be updated; try running\n" @@ -1889,55 +1898,55 @@ msgstr "" "vissa lokala referenser kunde inte uppdateras; testa att köra\n" " \"git remote prune %s\" för att ta bort gamla grenar som står i konflikt" -#: builtin/fetch.c:540 +#: builtin/fetch.c:549 #, c-format msgid " (%s will become dangling)\n" msgstr " (%s kommer bli dinglande)\n" -#: builtin/fetch.c:541 +#: builtin/fetch.c:550 #, c-format msgid " (%s has become dangling)\n" msgstr " (%s har blivit dinglande)\n" -#: builtin/fetch.c:548 +#: builtin/fetch.c:557 msgid "[deleted]" msgstr "[borttagen]" -#: builtin/fetch.c:549 +#: builtin/fetch.c:558 msgid "(none)" msgstr "(ingen)" -#: builtin/fetch.c:666 +#: builtin/fetch.c:675 #, c-format msgid "Refusing to fetch into current branch %s of non-bare repository" msgstr "Vägrar hämta till aktuell gren %s i ett icke-naket arkiv" -#: builtin/fetch.c:700 +#: builtin/fetch.c:709 #, c-format msgid "Don't know how to fetch from %s" msgstr "Vet inte hur man hämtar från %s" -#: builtin/fetch.c:777 +#: builtin/fetch.c:786 #, c-format msgid "Option \"%s\" value \"%s\" is not valid for %s" msgstr "Flaggan \"%s\" och värdet \"%s\" är inte giltigt för %s" -#: builtin/fetch.c:780 +#: builtin/fetch.c:789 #, c-format msgid "Option \"%s\" is ignored for %s\n" msgstr "Flaggan \"%s\" ignoreras för %s\n" -#: builtin/fetch.c:879 +#: builtin/fetch.c:888 #, c-format msgid "Fetching %s\n" msgstr "Hämtar %s\n" -#: builtin/fetch.c:881 +#: builtin/fetch.c:890 #, c-format msgid "Could not fetch %s" msgstr "Kunde inte hämta %s" -#: builtin/fetch.c:898 +#: builtin/fetch.c:907 msgid "" "No remote repository specified. Please, specify either a URL or a\n" "remote name from which new revisions should be fetched." @@ -1945,24 +1954,24 @@ msgstr "" "Inget fjärrarkiv angavs. Ange antingen en URL eller namnet på ett\n" "fjärrarkiv som nya incheckningar skall hämtas från." -#: builtin/fetch.c:918 +#: builtin/fetch.c:927 msgid "You need to specify a tag name." msgstr "Du måste ange namnet på en tagg." -#: builtin/fetch.c:970 +#: builtin/fetch.c:979 msgid "fetch --all does not take a repository argument" msgstr "fetch --all tar inte namnet på ett arkiv som argument" -#: builtin/fetch.c:972 +#: builtin/fetch.c:981 msgid "fetch --all does not make sense with refspecs" msgstr "fetch --all kan inte anges med referensspecifikationer" -#: builtin/fetch.c:983 +#: builtin/fetch.c:992 #, c-format msgid "No such remote or remote group: %s" msgstr "Fjärren eller fjärrgruppen finns inte: %s" -#: builtin/fetch.c:991 +#: builtin/fetch.c:1000 msgid "Fetching a group and specifying refspecs does not make sense" msgstr "Kan inte hämta från grupp och ange referensspecifikationer" @@ -1971,21 +1980,17 @@ msgstr "Kan inte hämta från grupp och ange referensspecifikationer" msgid "Invalid %s: '%s'" msgstr "Felaktigt %s: \"%s\"" -#: builtin/gc.c:78 -msgid "Too many options specified" -msgstr "För många flaggor angavs" - -#: builtin/gc.c:103 +#: builtin/gc.c:90 #, c-format msgid "insanely long object directory %.*s" msgstr "tokigt lång objektkatalog %.*s" -#: builtin/gc.c:223 +#: builtin/gc.c:221 #, c-format msgid "Auto packing the repository for optimum performance.\n" msgstr "Packar arkivet automatiskt för optimal prestanda.\n" -#: builtin/gc.c:226 +#: builtin/gc.c:224 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" @@ -1994,7 +1999,7 @@ msgstr "" "Packar arkivet automatiskt för optimal prestanda. Du kan även\n" "köra \"git gc\" manuellt. Se \"git help gc\" för mer information.\n" -#: builtin/gc.c:256 +#: builtin/gc.c:251 msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "" @@ -2311,56 +2316,56 @@ msgstr "Kunde inte hitta en spårad fjärrgren, ange <uppström> manuellt.\n" msgid "Unknown commit %s" msgstr "Okänd incheckning %s" -#: builtin/merge.c:91 +#: builtin/merge.c:90 msgid "switch `m' requires a value" msgstr "flaggan \"m\" behöver ett värde" -#: builtin/merge.c:128 +#: builtin/merge.c:127 #, c-format msgid "Could not find merge strategy '%s'.\n" msgstr "Kunde inte hitta sammanslagningsstrategin \"%s\".\n" -#: builtin/merge.c:129 +#: builtin/merge.c:128 #, c-format msgid "Available strategies are:" msgstr "Tillgängliga strategier är:" -#: builtin/merge.c:134 +#: builtin/merge.c:133 #, c-format msgid "Available custom strategies are:" msgstr "Tillgängliga skräddarsydda strategier är:" -#: builtin/merge.c:241 +#: builtin/merge.c:240 msgid "could not run stash." msgstr "kunde köra stash." -#: builtin/merge.c:246 +#: builtin/merge.c:245 msgid "stash failed" msgstr "stash misslyckades" -#: builtin/merge.c:251 +#: builtin/merge.c:250 #, c-format msgid "not a valid object: %s" msgstr "inte ett giltigt objekt: %s" -#: builtin/merge.c:270 builtin/merge.c:287 +#: builtin/merge.c:269 builtin/merge.c:286 msgid "read-tree failed" msgstr "read-tree misslyckades" -#: builtin/merge.c:317 +#: builtin/merge.c:316 msgid " (nothing to squash)" msgstr " (inget att platta till)" -#: builtin/merge.c:330 +#: builtin/merge.c:329 #, c-format msgid "Squash commit -- not updating HEAD\n" msgstr "Tillplattningsincheckning -- uppdaterar inte HEAD\n" -#: builtin/merge.c:362 +#: builtin/merge.c:361 msgid "Writing SQUASH_MSG" msgstr "Skriver SQUASH_MSG" -#: builtin/merge.c:364 +#: builtin/merge.c:363 msgid "Finishing SQUASH_MSG" msgstr "Avslutar SQUASH_MSG" @@ -2387,37 +2392,37 @@ msgstr "git write-tree misslyckades skriva ett träd" msgid "failed to read the cache" msgstr "misslyckads läsa cachen" -#: builtin/merge.c:696 +#: builtin/merge.c:697 msgid "Unable to write index." msgstr "Kunde inte skriva indexet." -#: builtin/merge.c:709 +#: builtin/merge.c:710 msgid "Not handling anything other than two heads merge." msgstr "Hanterar inte något annat än en sammanslagning av två huvuden." -#: builtin/merge.c:723 +#: builtin/merge.c:724 #, c-format msgid "Unknown option for merge-recursive: -X%s" msgstr "Felaktig flagga för merge-recursive: -X%s" -#: builtin/merge.c:737 +#: builtin/merge.c:738 #, c-format msgid "unable to write %s" msgstr "kunde inte skriva %s" -#: builtin/merge.c:876 +#: builtin/merge.c:877 #, c-format msgid "Could not read from '%s'" msgstr "Kunde inte läsa från \"%s\"" -#: builtin/merge.c:885 +#: builtin/merge.c:886 #, c-format msgid "Not committing merge; use 'git commit' to complete the merge.\n" msgstr "" "Checkar inte in sammanslagningen; använd \"git commit\" för att slutföra " "den.\n" -#: builtin/merge.c:891 +#: builtin/merge.c:892 msgid "" "Please enter a commit message to explain why this merge is necessary,\n" "especially if it merges an updated upstream into a topic branch.\n" @@ -2432,48 +2437,53 @@ msgstr "" "Rader som inleds med \"#\" kommer ignoreras, och ett tomt meddelande\n" "avbryter incheckningen.\n" -#: builtin/merge.c:915 +#: builtin/merge.c:916 msgid "Empty commit message." msgstr "Tomt incheckningsmeddelande." -#: builtin/merge.c:927 +#: builtin/merge.c:928 #, c-format msgid "Wonderful.\n" msgstr "Underbart.\n" -#: builtin/merge.c:1000 +#: builtin/merge.c:993 #, c-format msgid "Automatic merge failed; fix conflicts and then commit the result.\n" msgstr "" "Kunde inte slå ihop automatiskt; fixa konflikter och checka in resultatet.\n" -#: builtin/merge.c:1016 +#: builtin/merge.c:1009 #, c-format msgid "'%s' is not a commit" msgstr "\"%s\" är inte en incheckning" -#: builtin/merge.c:1057 +#: builtin/merge.c:1050 msgid "No current branch." msgstr "Inte på någon gren." -#: builtin/merge.c:1059 +#: builtin/merge.c:1052 msgid "No remote for the current branch." msgstr "Ingen fjärr för aktuell gren." -#: builtin/merge.c:1061 +#: builtin/merge.c:1054 msgid "No default upstream defined for the current branch." msgstr "Ingen standarduppström angiven för aktuell gren." -#: builtin/merge.c:1066 +#: builtin/merge.c:1059 #, c-format msgid "No remote tracking branch for %s from %s" msgstr "Ingen fjärrspårande gren för %s från %s" -#: builtin/merge.c:1188 +#: builtin/merge.c:1146 builtin/merge.c:1303 +#, c-format +msgid "%s - not something we can merge" +msgstr "%s - inte något vi kan slå ihop" + +#: builtin/merge.c:1214 msgid "There is no merge to abort (MERGE_HEAD missing)." msgstr "Det finns ingen sammanslagning att avbryta (MERGE_HEAD saknas)." -#: builtin/merge.c:1204 git-pull.sh:31 +#: builtin/merge.c:1230 git-pull.sh:31 msgid "" "You have not concluded your merge (MERGE_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -2481,11 +2491,11 @@ msgstr "" "Du har inte avslutat sammanslagningen (MERGE_HEAD finns).\n" "Checka in dina ändringar innan du kan slå ihop." -#: builtin/merge.c:1207 git-pull.sh:34 +#: builtin/merge.c:1233 git-pull.sh:34 msgid "You have not concluded your merge (MERGE_HEAD exists)." msgstr "Du har inte avslutat sammanslagningen (MERGE_HEAD finns)." -#: builtin/merge.c:1211 +#: builtin/merge.c:1237 msgid "" "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" "Please, commit your changes before you can merge." @@ -2493,84 +2503,79 @@ msgstr "" "Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns).\n" "Checka in dina ändringar innan du kan slå ihop." -#: builtin/merge.c:1214 +#: builtin/merge.c:1240 msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." msgstr "Du har inte avslutat din \"cherry-pick\" (CHERRY_PICK_HEAD finns)." -#: builtin/merge.c:1223 +#: builtin/merge.c:1249 msgid "You cannot combine --squash with --no-ff." msgstr "Du kan inte kombinera --squash med --no-ff." -#: builtin/merge.c:1228 +#: builtin/merge.c:1254 msgid "You cannot combine --no-ff with --ff-only." msgstr "Du kan inte kombinera --no-ff med --ff-only." -#: builtin/merge.c:1235 +#: builtin/merge.c:1261 msgid "No commit specified and merge.defaultToUpstream not set." msgstr "Ingen incheckning angiven och merge.defaultToUpstream är ej satt." -#: builtin/merge.c:1266 +#: builtin/merge.c:1293 msgid "Can merge only exactly one commit into empty head" msgstr "Kan endast slå ihop en enda incheckning i ett tomt huvud." -#: builtin/merge.c:1269 +#: builtin/merge.c:1296 msgid "Squash commit into empty head not supported yet" msgstr "Stöder inte en tillplattningsincheckning på ett tomt huvud ännu" -#: builtin/merge.c:1271 +#: builtin/merge.c:1298 msgid "Non-fast-forward commit does not make sense into an empty head" msgstr "Icke-snabbspolad incheckning kan inte användas med ett tomt huvud" -#: builtin/merge.c:1275 builtin/merge.c:1319 -#, c-format -msgid "%s - not something we can merge" -msgstr "%s - inte något vi kan slå ihop" - -#: builtin/merge.c:1385 +#: builtin/merge.c:1413 #, c-format msgid "Updating %s..%s\n" msgstr "Uppdaterar %s..%s\n" -#: builtin/merge.c:1423 +#: builtin/merge.c:1451 #, c-format msgid "Trying really trivial in-index merge...\n" msgstr "Försöker riktigt enkel sammanslagning i indexet...\n" -#: builtin/merge.c:1430 +#: builtin/merge.c:1458 #, c-format msgid "Nope.\n" msgstr "Nej.\n" -#: builtin/merge.c:1462 +#: builtin/merge.c:1490 msgid "Not possible to fast-forward, aborting." msgstr "Kan inte snabbspola, avbryter." -#: builtin/merge.c:1485 builtin/merge.c:1562 +#: builtin/merge.c:1513 builtin/merge.c:1592 #, c-format msgid "Rewinding the tree to pristine...\n" msgstr "Återspolar trädet till orört...\n" -#: builtin/merge.c:1489 +#: builtin/merge.c:1517 #, c-format msgid "Trying merge strategy %s...\n" msgstr "Försöker sammanslagninsstrategin %s...\n" -#: builtin/merge.c:1553 +#: builtin/merge.c:1583 #, c-format msgid "No merge strategy handled the merge.\n" msgstr "Ingen sammanslagningsstrategi hanterade sammanslagningen.\n" -#: builtin/merge.c:1555 +#: builtin/merge.c:1585 #, c-format msgid "Merge with strategy %s failed.\n" msgstr "Sammanslaning med strategin %s misslyckades.\n" -#: builtin/merge.c:1564 +#: builtin/merge.c:1594 #, c-format msgid "Using the %s to prepare resolving by hand.\n" msgstr "Använder %s för att förbereda lösning för hand.\n" -#: builtin/merge.c:1575 +#: builtin/merge.c:1606 #, c-format msgid "Automatic merge went well; stopped before committing as requested\n" msgstr "" @@ -2796,35 +2801,35 @@ msgstr "Objektet %s har ingen anteckning\n" msgid "Unknown subcommand: %s" msgstr "Okänt underkommando: %s" -#: builtin/pack-objects.c:2310 +#: builtin/pack-objects.c:2315 #, c-format msgid "unsupported index version %s" msgstr "indexversionen %s stöds ej" -#: builtin/pack-objects.c:2314 +#: builtin/pack-objects.c:2319 #, c-format msgid "bad index version '%s'" msgstr "felaktig indexversion \"%s\"" -#: builtin/pack-objects.c:2322 +#: builtin/pack-objects.c:2342 #, c-format msgid "option %s does not accept negative form" msgstr "flaggan %s godtar inte negativ form" -#: builtin/pack-objects.c:2326 +#: builtin/pack-objects.c:2346 #, c-format msgid "unable to parse value '%s' for option %s" msgstr "kunde inte tolka värdet \"%s\" för flaggan %s" -#: builtin/push.c:44 +#: builtin/push.c:45 msgid "tag shorthand without <tag>" msgstr "taggförkortning utan <tagg>" -#: builtin/push.c:63 +#: builtin/push.c:64 msgid "--delete only accepts plain target ref names" msgstr "--delete godtar endast enkla målreferensnamn" -#: builtin/push.c:73 +#: builtin/push.c:84 #, c-format msgid "" "You are not currently on a branch.\n" @@ -2839,7 +2844,7 @@ msgstr "" "\n" " git push %s HEAD:<namn-på-fjärrgren>\n" -#: builtin/push.c:80 +#: builtin/push.c:91 #, c-format msgid "" "The current branch %s has no upstream branch.\n" @@ -2852,48 +2857,82 @@ msgstr "" "\n" " git push --set-upstream %s %s\n" -#: builtin/push.c:88 +#: builtin/push.c:99 #, c-format msgid "The current branch %s has multiple upstream branches, refusing to push." msgstr "Den aktuella grenen %s har flera uppströmsgrenar, vägrar sända." -#: builtin/push.c:111 +#: builtin/push.c:102 +#, c-format +msgid "" +"You are pushing to remote '%s', which is not the upstream of\n" +"your current branch '%s', without telling me what to push\n" +"to update which remote branch." +msgstr "" +"Du sänder till fjärren \"%s\", som inte är uppströms för den\n" +"aktuella grenen \"%s\", utan att tala om för mig vad som\n" +"skall sändas för att uppdatera fjärrgrenen." + +#: builtin/push.c:131 msgid "" "You didn't specify any refspecs to push, and push.default is \"nothing\"." msgstr "" "Du angav inga referensspecifikationer att sända, och push.default är " "\"nothing\"." -#: builtin/push.c:131 +#: builtin/push.c:138 +msgid "" +"Updates were rejected because the tip of your current branch is behind\n" +"its remote counterpart. Merge the remote changes (e.g. 'git pull')\n" +"before pushing again.\n" +"See the 'Note about fast-forwards' in 'git push --help' for details." +msgstr "" +"Uppdateringar avvisades då änden på din befintliga gren är bakom\n" +"dess fjärrmotsvarighet. Slå ihop fjärrändringarna (t.ex. \"git pull\")\n" +"innan du sänder igen.\n" +"Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer." + +#: builtin/push.c:144 +msgid "" +"Updates were rejected because a pushed branch tip is behind its remote\n" +"counterpart. If you did not intend to push that branch, you may want to\n" +"specify branches to push or set the 'push.default' configuration\n" +"variable to 'current' or 'upstream' to push only the current branch." +msgstr "" +"Uppdateringar avvisades då änden på en insänd gren är bakom dess\n" +"fjärrmotsvarighet. Om det inte var meningen att sända in grenen, bör\n" +"du specificera grenar att sända, eller ändra inställningsvariabeln\n" +"\"push-default\" till \"current\" eller \"upstream\" för att endast sända\n" +"aktuell gren." + +#: builtin/push.c:150 +msgid "" +"Updates were rejected because a pushed branch tip is behind its remote\n" +"counterpart. Check out this branch and merge the remote changes\n" +"(e.g. 'git pull') before pushing again.\n" +"See the 'Note about fast-forwards' in 'git push --help' for details." +msgstr "" +"Uppdateringar avvisades då änden på en gren som sänds in är bakom dess\n" +"fjärrmotsvarighet. Checka ut grenen och slå ihop fjärrändringarna (t.ex.\n" +"\"git pull\") innan du sänder igen.\n" +"Se avsnittet \"Note about fast-forward\" i \"git push --help\" för detaljer." + +#: builtin/push.c:190 #, c-format msgid "Pushing to %s\n" msgstr "Sänder till %s\n" -#: builtin/push.c:135 +#: builtin/push.c:194 #, c-format msgid "failed to push some refs to '%s'" msgstr "misslyckades sända vissa referenser till \"%s\"" -#: builtin/push.c:143 -#, c-format -msgid "" -"To prevent you from losing history, non-fast-forward updates were rejected\n" -"Merge the remote changes (e.g. 'git pull') before pushing again. See the\n" -"'Note about fast-forwards' section of 'git push --help' for details.\n" -msgstr "" -"För att förhindra att du tappar historik har icke snabbspolande " -"uppdateringar\n" -"avvisats. Slå ihop fjärrändringarna (t.ex \"git pull\") innan du sänder " -"igen.\n" -"Se avsnittet \"Note about fast-forward\" i \"git push --help\" för " -"detaljer.\n" - -#: builtin/push.c:160 +#: builtin/push.c:226 #, c-format msgid "bad repository '%s'" msgstr "felaktigt arkiv \"%s\"" -#: builtin/push.c:161 +#: builtin/push.c:227 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -2914,31 +2953,31 @@ msgstr "" "\n" " git push <namn>\n" -#: builtin/push.c:176 +#: builtin/push.c:242 msgid "--all and --tags are incompatible" msgstr "--all och --tags är inkompatibla" -#: builtin/push.c:177 +#: builtin/push.c:243 msgid "--all can't be combined with refspecs" msgstr "--all kan inte kombineras med referensspecifikationer" -#: builtin/push.c:182 +#: builtin/push.c:248 msgid "--mirror and --tags are incompatible" msgstr "--mirror och --tags är inkompatibla" -#: builtin/push.c:183 +#: builtin/push.c:249 msgid "--mirror can't be combined with refspecs" msgstr "--mirror kan inte kombineras med referensspecifikationer" -#: builtin/push.c:188 +#: builtin/push.c:254 msgid "--all and --mirror are incompatible" msgstr "--all och --mirror är inkompatibla" -#: builtin/push.c:274 +#: builtin/push.c:334 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "--delete är imkompatibel med --all, --mirror och --tags" -#: builtin/push.c:276 +#: builtin/push.c:336 msgid "--delete doesn't make sense without any refs" msgstr "--delete kan inte användas utan referenser" @@ -3022,20 +3061,20 @@ msgstr "%s återställning tillåts inte i ett naket arkiv" msgid "Could not reset index file to revision '%s'." msgstr "Kunde inte återställa indexfilen till versionen \"%s\"." -#: builtin/revert.c:70 builtin/revert.c:91 +#: builtin/revert.c:70 builtin/revert.c:92 #, c-format msgid "%s: %s cannot be used with %s" msgstr "%s: %s kan inte användas med %s" -#: builtin/revert.c:126 +#: builtin/revert.c:127 msgid "program error" msgstr "programfel" -#: builtin/revert.c:209 +#: builtin/revert.c:213 msgid "revert failed" msgstr "\"revert\" misslyckades" -#: builtin/revert.c:224 +#: builtin/revert.c:228 msgid "cherry-pick failed" msgstr "\"cherry-pick\" misslyckades" @@ -3549,68 +3588,68 @@ msgstr "Misslyckades klona \"$url\" till undermodulsökvägen \"$path\"" msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa" msgstr "Gitkatalog \"$a\" ingår i underkatalogsökvägen \"$b\" eller omvänt" -#: git-submodule.sh:247 +#: git-submodule.sh:248 #, sh-format msgid "repo URL: '$repo' must be absolute or begin with ./|../" msgstr "arkiv-URL: \"$repo\" måste vara absolut eller börja med ./|../" -#: git-submodule.sh:264 +#: git-submodule.sh:265 #, sh-format msgid "'$path' already exists in the index" msgstr "\"$path\" finns redan i indexet" -#: git-submodule.sh:281 +#: git-submodule.sh:282 #, sh-format msgid "'$path' already exists and is not a valid git repo" msgstr "\"$path\" finns redan och är inte ett giltigt git-arkiv" -#: git-submodule.sh:295 +#: git-submodule.sh:296 #, sh-format msgid "Unable to checkout submodule '$path'" msgstr "Kan inte checka ut undermodul \"$path\"" -#: git-submodule.sh:300 +#: git-submodule.sh:301 #, sh-format msgid "Failed to add submodule '$path'" msgstr "Misslyckades lägga till underkatalog \"$path\"" -#: git-submodule.sh:305 +#: git-submodule.sh:306 #, sh-format msgid "Failed to register submodule '$path'" msgstr "Misslyckades registrera undermodul \"$path\"" -#: git-submodule.sh:347 +#: git-submodule.sh:348 #, sh-format msgid "Entering '$prefix$path'" msgstr "Går in i \"$prefix$path\"" -#: git-submodule.sh:359 +#: git-submodule.sh:360 #, sh-format msgid "Stopping at '$path'; script returned non-zero status." msgstr "Stoppar på \"$path\"; skriptet returnerade en status skild från noll." -#: git-submodule.sh:401 +#: git-submodule.sh:402 #, sh-format msgid "No url found for submodule path '$path' in .gitmodules" msgstr "Hittade ingen url för undermodulsökvägen \"$path\" i .gitmodules" -#: git-submodule.sh:410 +#: git-submodule.sh:411 #, sh-format msgid "Failed to register url for submodule path '$path'" msgstr "Misslyckades registrera url för underkatalogsökväg \"$path\"" -#: git-submodule.sh:418 +#: git-submodule.sh:419 #, sh-format msgid "Failed to register update mode for submodule path '$path'" msgstr "" "Misslyckades registrera uppdateringsläge för undermodulsökväg \"$path\"" -#: git-submodule.sh:420 +#: git-submodule.sh:421 #, sh-format msgid "Submodule '$name' ($url) registered for path '$path'" msgstr "Undermodulen \"$name\" ($url) registrerad för sökvägen \"$path\"" -#: git-submodule.sh:519 +#: git-submodule.sh:520 #, sh-format msgid "" "Submodule path '$path' not initialized\n" @@ -3619,83 +3658,86 @@ msgstr "" "Undermodulen \"$path\" har inte initierats\n" "Kanske du vill köra \"update --init\"?" -#: git-submodule.sh:532 +#: git-submodule.sh:533 #, sh-format msgid "Unable to find current revision in submodule path '$path'" msgstr "Kan inte hitta aktuell revision i undermodulsökväg \"$path\"" -#: git-submodule.sh:551 +#: git-submodule.sh:552 #, sh-format msgid "Unable to fetch in submodule path '$path'" msgstr "Kan inte hämta i undermodulsökväg \"$path\"" -#: git-submodule.sh:565 +#: git-submodule.sh:566 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$path'" msgstr "Kan inte göra \"rebase\" av \"$sha1\" i undermodulsökväg \"$path\"" -#: git-submodule.sh:566 +#: git-submodule.sh:567 #, sh-format msgid "Submodule path '$path': rebased into '$sha1'" msgstr "Undermodulsökvägen \"$path\": \"rebase\":ad in i \"$sha1\"" -#: git-submodule.sh:571 +#: git-submodule.sh:572 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$path'" msgstr "Kan inte slå ihop \"$sha1\" i undermodulsökvägen \"$path\"" -#: git-submodule.sh:572 +#: git-submodule.sh:573 #, sh-format msgid "Submodule path '$path': merged in '$sha1'" msgstr "Undermodulsökvägen \"$path\": sammanslagen i \"$sha1\"" -#: git-submodule.sh:577 +#: git-submodule.sh:578 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$path'" msgstr "Kan inte checka ut \"$sha1\" i undermodulsökvägen \"$path\"" -#: git-submodule.sh:578 +#: git-submodule.sh:579 #, sh-format msgid "Submodule path '$path': checked out '$sha1'" msgstr "Undermodulsökvägen \"$path\": checkade ut \"$sha1\"" -#: git-submodule.sh:600 git-submodule.sh:923 +#: git-submodule.sh:601 git-submodule.sh:924 #, sh-format msgid "Failed to recurse into submodule path '$path'" msgstr "Misslyckades rekursera in i undermodulsökvägen \"$path\"" -#: git-submodule.sh:708 +#: git-submodule.sh:709 msgid "--" msgstr "--" -#: git-submodule.sh:766 +#: git-submodule.sh:767 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_src" msgstr " Varning: $name innehåller inte incheckning $sha1_src" -#: git-submodule.sh:769 +#: git-submodule.sh:770 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_dst" msgstr " Varning: $name innehåller inte incheckning $sha1_dst" -#: git-submodule.sh:772 +#: git-submodule.sh:773 #, sh-format msgid " Warn: $name doesn't contain commits $sha1_src and $sha1_dst" msgstr " Varning: $name innehåller inte incheckningar $sha1_src och $sha1_dst" -#: git-submodule.sh:797 +#: git-submodule.sh:798 msgid "blob" msgstr "blob" -#: git-submodule.sh:798 +#: git-submodule.sh:799 msgid "submodule" msgstr "undermodul" -#: git-submodule.sh:969 +#: git-submodule.sh:970 #, sh-format msgid "Synchronizing submodule url for '$name'" msgstr "Synkroniserar undermodul-url för \"$name\"" +#~ msgid "Too many options specified" +#~ msgstr "För många flaggor angavs" + #~ msgid "# Changed but not updated:" #~ msgstr "# Ändrade men inte uppdaterade:" diff --git a/po/vi.po b/po/vi.po new file mode 100644 index 0000000000..6456e75bcb --- /dev/null +++ b/po/vi.po @@ -0,0 +1,5374 @@ +# Vietnamese translation for GIT-CORE. +# Copyright (C) 2012, Trần Ngọc Quân. +# This file is distributed under the same license as the git-core package. +# First translated by Trần Ngọc Quân <vnwildman@gmail.com>, 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: git-1.7.11-rc0-100-g5498c\n" +"Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" +"POT-Creation-Date: 2012-06-02 07:03+0800\n" +"PO-Revision-Date: 2012-06-03 07:13+0700\n" +"Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n" +"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"Plural-Forms: nplurals=2; plural=1;\n" +"X-Poedit-Language: Vietnamese\n" +"X-Poedit-Country: VIET NAM\n" +"X-Poedit-SourceCharset: utf-8\n" +"X-Poedit-Basepath: ../\n" + +#: advice.c:40 +#, c-format +msgid "hint: %.*s\n" +msgstr "gợi ý: %.*s\n" + +#. +#. * Message used both when 'git commit' fails and when +#. * other commands doing a merge do. +#. +#: advice.c:70 +msgid "" +"Fix them up in the work tree,\n" +"and then use 'git add/rm <file>' as\n" +"appropriate to mark resolution and make a commit,\n" +"or use 'git commit -a'." +msgstr "" +"Sửa chúng trong cây làm việc,\n" +"và sau đó sử dụng lệnh 'git add/rm <tập-tin>'\n" +"dành riêng cho việc đánh dấu cần giải quyết và tạo lần chuyển giao,\n" +"hoặc là sử dụng lệnh 'git commit -a'." + +#: bundle.c:36 +#, c-format +msgid "'%s' does not look like a v2 bundle file" +msgstr "'%s' không giống như tập tin v2 bundle (cụm)" + +#: bundle.c:63 +#, c-format +msgid "unrecognized header: %s%s (%d)" +msgstr "phần đầu (header) không được thừa nhận: %s%s (%d)" + +#: bundle.c:89 +#: builtin/commit.c:696 +#, c-format +msgid "could not open '%s'" +msgstr "không thể mở '%s'" + +#: bundle.c:140 +msgid "Repository lacks these prerequisite commits:" +msgstr "Khó chứa thiếu những lần chuyển giao (commit) cần trước hết này:" + +#: bundle.c:164 +#: sequencer.c:550 +#: sequencer.c:982 +#: builtin/log.c:289 +#: builtin/log.c:720 +#: builtin/log.c:1309 +#: builtin/log.c:1528 +#: builtin/merge.c:347 +#: builtin/shortlog.c:181 +msgid "revision walk setup failed" +msgstr "Cài đặt việc di chuyển qua các điểm xét lại gặp lỗi" + +#: bundle.c:186 +#, c-format +msgid "The bundle contains %d ref" +msgid_plural "The bundle contains %d refs" +msgstr[0] "Bundle chứa %d tham chiếu (refs)" +msgstr[1] "Bundle chứa %d tham chiếu (refs)" + +#: bundle.c:192 +#, c-format +msgid "The bundle requires this ref" +msgid_plural "The bundle requires these %d refs" +msgstr[0] "Lệnh bundle yêu cầu tham chiếu (refs) này" +msgstr[1] "Lệnh bundle yêu cầu %d tham chiếu (refs) này" + +#: bundle.c:290 +msgid "rev-list died" +msgstr "rev-list bị chết" + +#: bundle.c:296 +#: builtin/log.c:1205 +#: builtin/shortlog.c:284 +#, c-format +msgid "unrecognized argument: %s" +msgstr "đối số không được thừa nhận: %s" + +#: bundle.c:331 +#, c-format +msgid "ref '%s' is excluded by the rev-list options" +msgstr "tham chiếu '%s' bị loại trừ bởi các tùy chọn rev-list" + +#: bundle.c:376 +msgid "Refusing to create empty bundle." +msgstr "Từ chối tạo một bundle trống rỗng." + +#: bundle.c:394 +msgid "Could not spawn pack-objects" +msgstr "Không thể sản sinh pack-objects" + +#: bundle.c:412 +msgid "pack-objects died" +msgstr "pack-objects đã chết" + +#: bundle.c:415 +#, c-format +msgid "cannot create '%s'" +msgstr "không thể tạo '%s'" + +#: bundle.c:437 +msgid "index-pack died" +msgstr "index-pack đã chết" + +#: commit.c:48 +#, c-format +msgid "could not parse %s" +msgstr "không thể phân tích %s" + +#: commit.c:50 +#, c-format +msgid "%s %s is not a commit!" +msgstr "%s %s không phải là một lần commit!" + +#: compat/obstack.c:406 +#: compat/obstack.c:408 +msgid "memory exhausted" +msgstr "cạn bộ nhớ" + +#: connected.c:39 +msgid "Could not run 'git rev-list'" +msgstr "Không thể chạy 'git rev-list'" + +#: connected.c:48 +#, c-format +msgid "failed write to rev-list: %s" +msgstr "gặp lỗi khi ghi vào rev-list: %s" + +#: connected.c:56 +#, c-format +msgid "failed to close rev-list's stdin: %s" +msgstr "gặp lỗi khi đóng đầu vào chuẩn stdin của rev-list: %s" + +#: date.c:95 +msgid "in the future" +msgstr "trong tương lai" + +#: date.c:101 +#, c-format +msgid "%lu second ago" +msgid_plural "%lu seconds ago" +msgstr[0] "%lu giây trước" +msgstr[1] "%lu giây trước" + +#: date.c:108 +#, c-format +msgid "%lu minute ago" +msgid_plural "%lu minutes ago" +msgstr[0] "%lu phút trước" +msgstr[1] "%lu phút trước" + +#: date.c:115 +#, c-format +msgid "%lu hour ago" +msgid_plural "%lu hours ago" +msgstr[0] "%lu giờ trước" +msgstr[1] "%lu giờ trước" + +#: date.c:122 +#, c-format +msgid "%lu day ago" +msgid_plural "%lu days ago" +msgstr[0] "%lu ngày trước" +msgstr[1] "%lu ngày trước" + +#: date.c:128 +#, c-format +msgid "%lu week ago" +msgid_plural "%lu weeks ago" +msgstr[0] "%lu tuần trước" +msgstr[1] "%lu tuần trước" + +#: date.c:135 +#, c-format +msgid "%lu month ago" +msgid_plural "%lu months ago" +msgstr[0] "%lu tháng trước" +msgstr[1] "%lu tháng trước" + +#: date.c:146 +#, c-format +msgid "%lu year" +msgid_plural "%lu years" +msgstr[0] "%lu năm" +msgstr[1] "%lu năm" + +#: date.c:149 +#, c-format +msgid "%s, %lu month ago" +msgid_plural "%s, %lu months ago" +msgstr[0] "%s, %lu tháng trước" +msgstr[1] "%s, %lu tháng trước" + +#: date.c:154 +#: date.c:159 +#, c-format +msgid "%lu year ago" +msgid_plural "%lu years ago" +msgstr[0] "%lu năm trước" +msgstr[1] "%lu năm trước" + +#: diff.c:105 +#, c-format +msgid " Failed to parse dirstat cut-off percentage '%.*s'\n" +msgstr " Gặp lỗi khi phân tích dirstat cắt bỏ phần trăm '%.*s'\n" + +#: diff.c:110 +#, c-format +msgid " Unknown dirstat parameter '%.*s'\n" +msgstr " Không hiểu đối số dirstat '%.*s'\n" + +#: diff.c:210 +#, c-format +msgid "" +"Found errors in 'diff.dirstat' config variable:\n" +"%s" +msgstr "" +"Tìm thấy các lỗi trong biến cấu hình 'diff.dirstat':\n" +"%s" + +#: diff.c:1400 +msgid " 0 files changed\n" +msgstr " 0 tập tin nào bị thay đổi\n" + +#: diff.c:1404 +#, c-format +msgid " %d file changed" +msgid_plural " %d files changed" +msgstr[0] " %d tập tin đã bị thay đổi" +msgstr[1] " %d tập tin đã bị thay đổi" + +#: diff.c:1421 +#, c-format +msgid ", %d insertion(+)" +msgid_plural ", %d insertions(+)" +msgstr[0] ", %d được thêm vào(+)" +msgstr[1] ", %d được thêm vào(+)" + +#: diff.c:1432 +#, c-format +msgid ", %d deletion(-)" +msgid_plural ", %d deletions(-)" +msgstr[0] ", %d bị xóa(-)" +msgstr[1] ", %d bị xóa(-)" + +#: diff.c:3478 +#, c-format +msgid "" +"Failed to parse --dirstat/-X option parameter:\n" +"%s" +msgstr "" +"Gặp lỗi khi phân tích đối số tùy chọn --dirstat/-X:\n" +"%s" + +#: gpg-interface.c:59 +msgid "could not run gpg." +msgstr "không thể chạy gpg." + +#: gpg-interface.c:71 +msgid "gpg did not accept the data" +msgstr "gpg đã không đồng ý dữ liệu" + +#: gpg-interface.c:82 +msgid "gpg failed to sign the data" +msgstr "gpg gặp lỗi khi ký dữ liệu" + +#: grep.c:1320 +#, c-format +msgid "'%s': unable to read %s" +msgstr "'%s': không thể đọc %s" + +#: grep.c:1337 +#, c-format +msgid "'%s': %s" +msgstr "'%s': %s" + +#: grep.c:1348 +#, c-format +msgid "'%s': short read %s" +msgstr "'%s': đọc ngắn %s" + +#: help.c:207 +#, c-format +msgid "available git commands in '%s'" +msgstr "các lệnh git sẵn sàng để dùng trong '%s'" + +#: help.c:214 +msgid "git commands available from elsewhere on your $PATH" +msgstr "các lệnh git sẵn sàng để dùng từ một nơi khác trong $PATH của bạn" + +#: help.c:270 +#, c-format +msgid "" +"'%s' appears to be a git command, but we were not\n" +"able to execute it. Maybe git-%s is broken?" +msgstr "" +"'%s' trông như là một lệnh git, nhưng chúng tôi không\n" +"thể thực thi nó. Có lẽ là lệnh git-%s đã bị hỏng?" + +#: help.c:327 +msgid "Uh oh. Your system reports no Git commands at all." +msgstr "Ối chà. Hệ thống của bạn báo rằng chẳng có lệnh Git nào cả." + +#: help.c:349 +#, c-format +msgid "" +"WARNING: You called a Git command named '%s', which does not exist.\n" +"Continuing under the assumption that you meant '%s'" +msgstr "" +"CẢNH BÁO: Bạn đã gọi lệnh Git có tên '%s', mà nó lại không sẵn có.\n" +"Giả định rằng ý bạn là '%s'" + +#: help.c:354 +#, c-format +msgid "in %0.1f seconds automatically..." +msgstr "trong %0.1f giây một cách tự động..." + +#: help.c:361 +#, c-format +msgid "git: '%s' is not a git command. See 'git --help'." +msgstr "git: '%s' không phải là một lệnh của git. Xem thêm 'git --help'." + +#: help.c:365 +msgid "" +"\n" +"Did you mean this?" +msgid_plural "" +"\n" +"Did you mean one of these?" +msgstr[0] "" +"\n" +"Có phải ý bạn là cái này không?" +msgstr[1] "" +"\n" +"Có phải ý bạn là một trong số những cái này không?" + +#: parse-options.c:493 +msgid "..." +msgstr "..." + +#: parse-options.c:511 +#, c-format +msgid "usage: %s" +msgstr "cách sử dụng: %s" + +#. TRANSLATORS: the colon here should align with the +#. one in "usage: %s" translation +#: parse-options.c:515 +#, c-format +msgid " or: %s" +msgstr " hoặc: %s" + +#: parse-options.c:518 +#, c-format +msgid " %s" +msgstr " %s" + +#: remote.c:1629 +#, c-format +msgid "Your branch is ahead of '%s' by %d commit.\n" +msgid_plural "Your branch is ahead of '%s' by %d commits.\n" +msgstr[0] "Nhánh của bạn là đầu của '%s' bởi %d lần chuyển giao (commit).\n" +msgstr[1] "Nhánh của bạn là đầu của '%s' bởi %d lần chuyển giao (commit).\n" + +#: remote.c:1635 +#, c-format +msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n" +msgid_plural "Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n" +msgstr[0] "Nhánh của bạn thì ở đằng sau '%s' bởi %d lần chuyển giao (commit), và có thể được fast-forward.\n" +msgstr[1] "Nhánh của bạn thì ở đằng sau '%s' bởi %d lần chuyển giao (commit), và có thể được fast-forward.\n" + +#: remote.c:1643 +#, c-format +msgid "" +"Your branch and '%s' have diverged,\n" +"and have %d and %d different commit each, respectively.\n" +msgid_plural "" +"Your branch and '%s' have diverged,\n" +"and have %d and %d different commits each, respectively.\n" +msgstr[0] "" +"Nhánh của bạn và '%s' bị phân kỳ,\n" +"và có %d và %d lần chuyển giao (commit) khác nhau cho từng cái,\n" +"tương ứng với mỗi lần.\n" +msgstr[1] "" +"Your branch and '%s' have diverged,\n" +"and have %d and %d different commit each, respectively.\n" + +#: sequencer.c:121 +#: builtin/merge.c:865 +#: builtin/merge.c:978 +#: builtin/merge.c:1088 +#: builtin/merge.c:1098 +#, c-format +msgid "Could not open '%s' for writing" +msgstr "Không thể mở %s' để ghi" + +#: sequencer.c:123 +#: builtin/merge.c:333 +#: builtin/merge.c:868 +#: builtin/merge.c:1090 +#: builtin/merge.c:1103 +#, c-format +msgid "Could not write to '%s'" +msgstr "Không thể ghi vào '%s'" + +#: sequencer.c:144 +msgid "" +"after resolving the conflicts, mark the corrected paths\n" +"with 'git add <paths>' or 'git rm <paths>'" +msgstr "" +"sau khi giải quyết các xung đột, đánh dấu đường dẫn đã sửa\n" +"với lệnh 'git add <đường_dẫn>' hoặc 'git rm <đường_dẫn>'" + +#: sequencer.c:147 +msgid "" +"after resolving the conflicts, mark the corrected paths\n" +"with 'git add <paths>' or 'git rm <paths>'\n" +"and commit the result with 'git commit'" +msgstr "" +"sau khi giải quyết các xung đột, đánh dấu đường dẫn đã sửa\n" +"với lệnh 'git add <đường_dẫn>' hoặc 'git rm <đường_dẫn>'\n" +"và chuyển giao (commit) kết quả bằng lệnh 'git commit'" + +#: sequencer.c:160 +#: sequencer.c:758 +#: sequencer.c:841 +#, c-format +msgid "Could not write to %s" +msgstr "Không thể ghi vào %s" + +#: sequencer.c:163 +#, c-format +msgid "Error wrapping up %s" +msgstr "Lỗi bao bọc %s" + +#: sequencer.c:178 +msgid "Your local changes would be overwritten by cherry-pick." +msgstr "Các thay đổi nội bộ của bạn có thể bị ghi đè bởi lệnh cherry-pick." + +#: sequencer.c:180 +msgid "Your local changes would be overwritten by revert." +msgstr "Các thay đổi nội bộ của bạn có thể bị ghi đè bởi lệnh revert." + +#: sequencer.c:183 +msgid "Commit your changes or stash them to proceed." +msgstr "Chuyển giao (commit) các thay đổi hay stash chúng để tiến hành." + +#. TRANSLATORS: %s will be "revert" or "cherry-pick" +#: sequencer.c:233 +#, c-format +msgid "%s: Unable to write new index file" +msgstr "%s: Không thể ghi tập tin lưu bảng mục lục mới" + +#: sequencer.c:261 +msgid "Could not resolve HEAD commit\n" +msgstr "Không thể phân giải commit (lần chuyển giao) HEAD\n" + +#: sequencer.c:282 +msgid "Unable to update cache tree\n" +msgstr "Không thể cập nhật cây bộ nhớ đệm\n" + +#: sequencer.c:324 +#, c-format +msgid "Could not parse commit %s\n" +msgstr "Không thể phân tích commit (lần chuyển giao) %s\n" + +#: sequencer.c:329 +#, c-format +msgid "Could not parse parent commit %s\n" +msgstr "Không thể phân tích commit (lần chuyển giao) cha mẹ %s\n" + +#: sequencer.c:395 +msgid "Your index file is unmerged." +msgstr "Tập tin lưu mục lục của bạn không được hòa trộn." + +#: sequencer.c:398 +msgid "You do not have a valid HEAD" +msgstr "Bạn không có HEAD nào hợp lệ" + +#: sequencer.c:413 +#, c-format +msgid "Commit %s is a merge but no -m option was given." +msgstr "Lần chuyển giao (commit) %s là một lần hòa trộn nhưng không đưa ra tùy chọn -m." + +#: sequencer.c:421 +#, c-format +msgid "Commit %s does not have parent %d" +msgstr "Lần chuyển giao (commit) %s không có cha mẹ %d" + +#: sequencer.c:425 +#, c-format +msgid "Mainline was specified but commit %s is not a merge." +msgstr "Luồng chính được chỉ định nhưng lần chuyển giao (commit) %s không phải là một lần hòa trộn." + +#. TRANSLATORS: The first %s will be "revert" or +#. "cherry-pick", the second %s a SHA1 +#: sequencer.c:436 +#, c-format +msgid "%s: cannot parse parent commit %s" +msgstr "%s: không thể phân tích lần chuyển giao mẹ của %s" + +#: sequencer.c:440 +#, c-format +msgid "Cannot get commit message for %s" +msgstr "Không thể lấy thông điệp lần chuyển giao (commit) cho %s" + +#: sequencer.c:524 +#, c-format +msgid "could not revert %s... %s" +msgstr "không thể revert %s... %s" + +#: sequencer.c:525 +#, c-format +msgid "could not apply %s... %s" +msgstr "không thể apply (áp dụng miếng vá) %s... %s" + +#: sequencer.c:553 +msgid "empty commit set passed" +msgstr "lần chuyển giao (commit) trống rỗng đặt là hợp quy cách" + +#: sequencer.c:561 +#, c-format +msgid "git %s: failed to read the index" +msgstr "git %s: gặp lỗi đọc bảng mục lục" + +#: sequencer.c:566 +#, c-format +msgid "git %s: failed to refresh the index" +msgstr "git %s: gặp lỗi khi làm tươi mới bảng mục lục" + +#: sequencer.c:624 +#, c-format +msgid "Cannot %s during a %s" +msgstr "Không thể %s trong khi %s" + +#: sequencer.c:646 +#, c-format +msgid "Could not parse line %d." +msgstr "Không phân tích được dòng %d." + +#: sequencer.c:651 +msgid "No commits parsed." +msgstr "Không có lần chuyển giao (commit) nào được phân tích." + +#: sequencer.c:664 +#, c-format +msgid "Could not open %s" +msgstr "Không thể mở %s" + +#: sequencer.c:668 +#, c-format +msgid "Could not read %s." +msgstr "Không thể đọc %s." + +#: sequencer.c:675 +#, c-format +msgid "Unusable instruction sheet: %s" +msgstr "Bảng chỉ thị không thể dùng được: %s" + +#: sequencer.c:703 +#, c-format +msgid "Invalid key: %s" +msgstr "Khóa không đúng: %s" + +#: sequencer.c:706 +#, c-format +msgid "Invalid value for %s: %s" +msgstr "Giá trị không hợp lệ %s: %s" + +#: sequencer.c:718 +#, c-format +msgid "Malformed options sheet: %s" +msgstr "Bảng tùy chọn dị hình: %s" + +#: sequencer.c:739 +msgid "a cherry-pick or revert is already in progress" +msgstr "một thao tác cherry-pick hoặc revert đang được thực hiện" + +#: sequencer.c:740 +msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" +msgstr "hãy thử \"git cherry-pick (--continue | --quit | --abort)\"" + +#: sequencer.c:744 +#, c-format +msgid "Could not create sequencer directory %s" +msgstr "Không thể tạo thư mục xếp dãy %s" + +#: sequencer.c:760 +#: sequencer.c:845 +#, c-format +msgid "Error wrapping up %s." +msgstr "Lỗi bao bọc %s." + +#: sequencer.c:779 +#: sequencer.c:913 +msgid "no cherry-pick or revert in progress" +msgstr "không cherry-pick hay revert trong tiến trình" + +#: sequencer.c:781 +msgid "cannot resolve HEAD" +msgstr "không thể phân giải HEAD" + +#: sequencer.c:783 +msgid "cannot abort from a branch yet to be born" +msgstr "không thể hủy bỏ từ một nhánh mà nó còn chưa được tạo ra" + +#: sequencer.c:805 +#: builtin/apply.c:3697 +#, c-format +msgid "cannot open %s: %s" +msgstr "không thể mở %s: %s" + +#: sequencer.c:808 +#, c-format +msgid "cannot read %s: %s" +msgstr "không thể đọc %s: %s" + +#: sequencer.c:809 +msgid "unexpected end of file" +msgstr "kết thúc tập tin đột xuất" + +#: sequencer.c:815 +#, c-format +msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" +msgstr "tập tin HEAD 'pre-cherry-pick' đã lưu '%s' bị hỏng" + +#: sequencer.c:838 +#, c-format +msgid "Could not format %s." +msgstr "Không thể định dạng %s." + +#: sequencer.c:1000 +msgid "Can't revert as initial commit" +msgstr "Không thể revert một lần chuyển giao (commit) khởi tạo" + +#: sequencer.c:1001 +msgid "Can't cherry-pick into empty head" +msgstr "Không thể cherry-pick vào một đầu (head) trống rỗng" + +#: sha1_name.c:864 +msgid "HEAD does not point to a branch" +msgstr "HEAD không chỉ đến một nhánh nào cả" + +#: sha1_name.c:867 +#, c-format +msgid "No such branch: '%s'" +msgstr "Không có nhánh nào như thế: '%s'" + +#: sha1_name.c:869 +#, c-format +msgid "No upstream configured for branch '%s'" +msgstr "Không có dòng ngược (upstream) được cấu hình cho nhánh '%s'" + +#: sha1_name.c:872 +#, c-format +msgid "Upstream branch '%s' not stored as a remote-tracking branch" +msgstr "Nhánh dòng ngược (upstream) '%s' không được lưu lại như là một nhánh 'remote-tracking'" + +#: wrapper.c:413 +#, c-format +msgid "unable to look up current user in the passwd file: %s" +msgstr "không tìm thấy người dùng hiện tại trong tập tin passwd: %s" + +#: wrapper.c:414 +msgid "no such user" +msgstr "không có người dùng như vậy" + +#: wt-status.c:135 +msgid "Unmerged paths:" +msgstr "Những đường dẫn chưa được hòa trộn:" + +#: wt-status.c:141 +#: wt-status.c:158 +#, c-format +msgid " (use \"git reset %s <file>...\" to unstage)" +msgstr " (sử dụng \"git reset %s <tập-tin>...\" để bỏ một stage (trạng thái))" + +#: wt-status.c:143 +#: wt-status.c:160 +msgid " (use \"git rm --cached <file>...\" to unstage)" +msgstr " (sử dụng \"git rm --cached <tập-tin>...\" để bỏ trạng thái (stage))" + +#: wt-status.c:144 +msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" +msgstr " (sử dụng \"git add/rm <tập-tin>...\" như là một cách thích hợp để đánh dấu là cần được giải quyết)" + +#: wt-status.c:152 +msgid "Changes to be committed:" +msgstr "Những thay đổi sẽ được chuyển giao:" + +#: wt-status.c:170 +msgid "Changes not staged for commit:" +msgstr "Các thay đổi không được đặt trạng thái (stage) cho lần chuyển giao (commit):" + +#: wt-status.c:174 +msgid " (use \"git add <file>...\" to update what will be committed)" +msgstr " (sử dụng \"git add <tập-tin>...\" để cập nhật những gì cần chuyển giao (commit))" + +#: wt-status.c:176 +msgid " (use \"git add/rm <file>...\" to update what will be committed)" +msgstr " (sử dụng \"git add/rm <tập_tin>...\" để cập nhật những gì sẽ được chuyển giao)" + +#: wt-status.c:177 +msgid " (use \"git checkout -- <file>...\" to discard changes in working directory)" +msgstr " (sử dụng \"git checkout -- <tập_tin>...\" để loại bỏ những thay đổi trong thư mục làm việc)" + +#: wt-status.c:179 +msgid " (commit or discard the untracked or modified content in submodules)" +msgstr " (chuyển giao (commit) hoặc là loại bỏ các nội dung không-bị-theo-vết hay đã bị chỉnh sửa trong mô-đun-con)" + +#: wt-status.c:188 +#, c-format +msgid "%s files:" +msgstr "%s tệp tin:" + +#: wt-status.c:191 +#, c-format +msgid " (use \"git %s <file>...\" to include in what will be committed)" +msgstr " (sử dụng \"git %s <tập-tin>...\" để bao gồm thêm vào những gì cần chuyển giao (commit))" + +#: wt-status.c:208 +msgid "bug" +msgstr "lỗi" + +#: wt-status.c:213 +msgid "both deleted:" +msgstr "bị xóa bởi cả hai:" + +#: wt-status.c:214 +msgid "added by us:" +msgstr "được thêm vào bởi chúng tôi:" + +#: wt-status.c:215 +msgid "deleted by them:" +msgstr "bị xóa đi bởi họ:" + +#: wt-status.c:216 +msgid "added by them:" +msgstr "được thêm vào bởi họ:" + +#: wt-status.c:217 +msgid "deleted by us:" +msgstr "bị xóa bởi chúng tôi:" + +#: wt-status.c:218 +msgid "both added:" +msgstr "được thêm vào bởi cả hai:" + +#: wt-status.c:219 +msgid "both modified:" +msgstr "bị sửa bởi cả hai:" + +#: wt-status.c:249 +msgid "new commits, " +msgstr " lần chuyển giao (commit) mới, " + +#: wt-status.c:251 +msgid "modified content, " +msgstr "nội dung được sửa đổi," + +#: wt-status.c:253 +msgid "untracked content, " +msgstr "nội dung chưa được theo dõi" + +#: wt-status.c:267 +#, c-format +msgid "new file: %s" +msgstr "tập tin mới: %s" + +#: wt-status.c:270 +#, c-format +msgid "copied: %s -> %s" +msgstr "đã sao chép: %s -> %s" + +#: wt-status.c:273 +#, c-format +msgid "deleted: %s" +msgstr "bị xóa: %s" + +#: wt-status.c:276 +#, c-format +msgid "modified: %s" +msgstr "bị sửa đổi: %s" + +#: wt-status.c:279 +#, c-format +msgid "renamed: %s -> %s" +msgstr "đã đổi tên: %s -> %s" + +#: wt-status.c:282 +#, c-format +msgid "typechange: %s" +msgstr "đổi-kiểu: %s" + +#: wt-status.c:285 +#, c-format +msgid "unknown: %s" +msgstr "không rõ: %s" + +#: wt-status.c:288 +#, c-format +msgid "unmerged: %s" +msgstr "chưa hòa trộn: %s" + +#: wt-status.c:291 +#, c-format +msgid "bug: unhandled diff status %c" +msgstr "lỗi: không lấy được trạng thái lệnh diff %c" + +#: wt-status.c:737 +msgid "On branch " +msgstr "Trên nhánh" + +#: wt-status.c:744 +msgid "Not currently on any branch." +msgstr "Hiện tại chẳng ở nhánh nào cả." + +#: wt-status.c:755 +msgid "Initial commit" +msgstr "Lần chuyển giao (commit) khởi đầu" + +#: wt-status.c:769 +msgid "Untracked" +msgstr "Không được theo vết" + +#: wt-status.c:771 +msgid "Ignored" +msgstr "Bị bỏ qua" + +#: wt-status.c:773 +#, c-format +msgid "Untracked files not listed%s" +msgstr "Những tập tin không bị theo vết không được liệt kê ra %s" + +#: wt-status.c:775 +msgid " (use -u option to show untracked files)" +msgstr " (sử dụng tùy chọn -u để hiển thị các tập tin chưa được theo dõi)" + +#: wt-status.c:781 +msgid "No changes" +msgstr "Không có thay đổi nào" + +#: wt-status.c:785 +#, c-format +msgid "no changes added to commit%s\n" +msgstr "không có thay đổi nào được thêm vào lần chuyển giao (commit)%s\n" + +#: wt-status.c:787 +msgid " (use \"git add\" and/or \"git commit -a\")" +msgstr " (sử dụng \"git add\" và/hoặc \"git commit -a\")" + +#: wt-status.c:789 +#, c-format +msgid "nothing added to commit but untracked files present%s\n" +msgstr "không có gì được thêm vào lần chuyển giao (commit) nhưng có những tập tin không được theo dấu vết hiện diện%s\n" + +#: wt-status.c:791 +msgid " (use \"git add\" to track)" +msgstr " (sử dụng \"git add\" để theo dõi dấu vết)" + +#: wt-status.c:793 +#: wt-status.c:796 +#: wt-status.c:799 +#, c-format +msgid "nothing to commit%s\n" +msgstr "không có gì để chuyển giao (commit) %s\n" + +#: wt-status.c:794 +msgid " (create/copy files and use \"git add\" to track)" +msgstr " (tạo/sao-chép các tập tin và sử dụng \"git add\" để theo dõi dấu vết)" + +#: wt-status.c:797 +msgid " (use -u to show untracked files)" +msgstr " (sử dụng tùy chọn -u để hiển thị các tập tin chưa được theo dõi)" + +#: wt-status.c:800 +msgid " (working directory clean)" +msgstr " (thư mục làm việc sạch sẽ)" + +#: wt-status.c:908 +msgid "HEAD (no branch)" +msgstr "HEAD (chưa có nhánh nào)" + +#: wt-status.c:914 +msgid "Initial commit on " +msgstr "Lần chuyển giao (commit) khởi tạo trên" + +#: wt-status.c:929 +msgid "behind " +msgstr "đằng sau" + +#: wt-status.c:932 +#: wt-status.c:935 +msgid "ahead " +msgstr "phía trước" + +#: wt-status.c:937 +msgid ", behind " +msgstr ", đằng sau" + +#: builtin/add.c:62 +#, c-format +msgid "unexpected diff status %c" +msgstr "trạng thái lệnh diff không như mong đợi %c" + +#: builtin/add.c:67 +#: builtin/commit.c:226 +msgid "updating files failed" +msgstr "Cập nhật tập tin gặp lỗi" + +#: builtin/add.c:77 +#, c-format +msgid "remove '%s'\n" +msgstr "gỡ bỏ '%s'\n" + +#: builtin/add.c:176 +#, c-format +msgid "Path '%s' is in submodule '%.*s'" +msgstr "Đường dẫn '%s' thì ở trong mô-đun-con '%.*s'" + +#: builtin/add.c:192 +msgid "Unstaged changes after refreshing the index:" +msgstr "Các thay đổi không được lưu trạng thái sau khi làm tươi mới lại bảng mục lục:" + +#: builtin/add.c:195 +#: builtin/add.c:456 +#: builtin/rm.c:186 +#, c-format +msgid "pathspec '%s' did not match any files" +msgstr "pathspec '%s' không khớp với bất kỳ tập tin nào" + +#: builtin/add.c:209 +#, c-format +msgid "'%s' is beyond a symbolic link" +msgstr "'%s' nằm ngoài một liên kết tượng trưng" + +#: builtin/add.c:276 +msgid "Could not read the index" +msgstr "Không thể đọc bảng mục lục" + +#: builtin/add.c:286 +#, c-format +msgid "Could not open '%s' for writing." +msgstr "Không thể mở '%s' để ghi" + +#: builtin/add.c:290 +msgid "Could not write patch" +msgstr "Không thể ghi ra miếng vá" + +#: builtin/add.c:295 +#, c-format +msgid "Could not stat '%s'" +msgstr "không thể lấy trạng thái về '%s'" + +#: builtin/add.c:297 +msgid "Empty patch. Aborted." +msgstr "Miếng vá trống rỗng. Đã bỏ qua." + +#: builtin/add.c:303 +#, c-format +msgid "Could not apply '%s'" +msgstr "Không thể apply (áp dụng miếng vá) '%s'" + +#: builtin/add.c:312 +msgid "The following paths are ignored by one of your .gitignore files:\n" +msgstr "Các đường dẫn theo sau đây sẽ bị lờ đi bởi một trong các tập tin .gitignore của bạn:\n" + +#: builtin/add.c:352 +#, c-format +msgid "Use -f if you really want to add them.\n" +msgstr "Sử dụng tùy chọn -f nếu bạn thực sự muốn thêm chúng vào.\n" + +#: builtin/add.c:353 +msgid "no files added" +msgstr "chưa có tập tin nào được thêm vào" + +#: builtin/add.c:359 +msgid "adding files failed" +msgstr "thêm tập tin gặp lỗi" + +#: builtin/add.c:391 +msgid "-A and -u are mutually incompatible" +msgstr "-A và -u xung khắc nhau" + +#: builtin/add.c:393 +msgid "Option --ignore-missing can only be used together with --dry-run" +msgstr "Tùy chọn --ignore-missing chỉ có thể được sử dụng cùng với --dry-run" + +#: builtin/add.c:413 +#, c-format +msgid "Nothing specified, nothing added.\n" +msgstr "Không có gì được chỉ ra, không có gì được thêm vào.\n" + +#: builtin/add.c:414 +#, c-format +msgid "Maybe you wanted to say 'git add .'?\n" +msgstr "Có lẽ bạn muốn nói là 'git add .' phải không?\n" + +#: builtin/add.c:420 +#: builtin/clean.c:95 +#: builtin/commit.c:286 +#: builtin/mv.c:82 +#: builtin/rm.c:162 +msgid "index file corrupt" +msgstr "tập tin ghi bảng mục lục bị hỏng" + +#: builtin/add.c:476 +#: builtin/apply.c:4108 +#: builtin/mv.c:229 +#: builtin/rm.c:260 +msgid "Unable to write new index file" +msgstr "Không thể ghi tập tin lưu bảng mục lục mới" + +#: builtin/apply.c:53 +msgid "git apply [options] [<patch>...]" +msgstr "git apply [các-tùy-chọn] [<miếng-vá>...]" + +#: builtin/apply.c:106 +#, c-format +msgid "unrecognized whitespace option '%s'" +msgstr "không nhận ra tùy chọn về khoảng trắng '%s'" + +#: builtin/apply.c:121 +#, c-format +msgid "unrecognized whitespace ignore option '%s'" +msgstr "không nhận ra tùy chọn bỏ qua khoảng trắng '%s'" + +#: builtin/apply.c:815 +#, c-format +msgid "Cannot prepare timestamp regexp %s" +msgstr "Không thể chuẩn bị biểu thức chính qui dấu vết thời gian (timestamp regexp) %s" + +#: builtin/apply.c:824 +#, c-format +msgid "regexec returned %d for input: %s" +msgstr "thi hành biểu thức chính quy trả về %d cho kết xuất: %s" + +#: builtin/apply.c:905 +#, c-format +msgid "unable to find filename in patch at line %d" +msgstr "không thể tìm thấy tên tập tin trong miếng vá tại dòng %d" + +#: builtin/apply.c:937 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" +msgstr "git apply: git-diff sai - mong đợi /dev/null, đã nhận %s trên dòng %d" + +#: builtin/apply.c:941 +#, c-format +msgid "git apply: bad git-diff - inconsistent new filename on line %d" +msgstr "git apply: git-diff sai - tên tập tin mới mâu thuấn trên dòng %d" + +#: builtin/apply.c:942 +#, c-format +msgid "git apply: bad git-diff - inconsistent old filename on line %d" +msgstr "git apply: git-diff sai - tên tập tin cũ mâu thuấn trên dòng %d" + +#: builtin/apply.c:949 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null on line %d" +msgstr "git apply: git-diff sai - mong đợi /dev/null trên dòng %d" + +#: builtin/apply.c:1394 +#, c-format +msgid "recount: unexpected line: %.*s" +msgstr "chi tiết: dòng không được mong đợi: %.*s" + +#: builtin/apply.c:1451 +#, c-format +msgid "patch fragment without header at line %d: %.*s" +msgstr "miếng vá phân mảnh mà không có phần đầu tại dòng %d: %.*s" + +#: builtin/apply.c:1468 +#, c-format +msgid "git diff header lacks filename information when removing %d leading pathname component (line %d)" +msgid_plural "git diff header lacks filename information when removing %d leading pathname components (line %d)" +msgstr[0] "phần đầu diff cho git thiếu thông tin tên tập tin khi gỡ bỏ đi %d trong thành phần dẫn đầu tên của đường dẫn (dòng %d)" +msgstr[1] "phần đầu diff cho git thiếu thông tin tên tập tin khi gỡ bỏ đi %d trong thành phần dẫn đầu tên của đường dẫn (dòng %d)" + +#: builtin/apply.c:1628 +msgid "new file depends on old contents" +msgstr "tập tin mới phụ thuộc vào nội dung cũ" + +#: builtin/apply.c:1630 +msgid "deleted file still has contents" +msgstr "tập tin đã xóa vẫn còn nội dung" + +#: builtin/apply.c:1656 +#, c-format +msgid "corrupt patch at line %d" +msgstr "miếng vá hỏng tại dòng %d" + +#: builtin/apply.c:1692 +#, c-format +msgid "new file %s depends on old contents" +msgstr "tập tin mới %s phụ thuộc vào nội dung cũ" + +#: builtin/apply.c:1694 +#, c-format +msgid "deleted file %s still has contents" +msgstr "tập tin đã xóa %s vẫn còn nội dung" + +#: builtin/apply.c:1697 +#, c-format +msgid "** warning: file %s becomes empty but is not deleted" +msgstr "** cảnh báo: tập tin %s trở nên trống rỗng nhưng không bị xóa" + +#: builtin/apply.c:1843 +#, c-format +msgid "corrupt binary patch at line %d: %.*s" +msgstr "miếng vá định dạng nhị phân sai hỏng tại dòng %d: %.*s" + +#. there has to be one hunk (forward hunk) +#: builtin/apply.c:1872 +#, c-format +msgid "unrecognized binary patch at line %d" +msgstr "miếng vá định dạng nhị phân không được nhận ra tại dòng %d" + +#: builtin/apply.c:1958 +#, c-format +msgid "patch with only garbage at line %d" +msgstr "vá chỉ với 'garbage' tại dòng %d" + +#: builtin/apply.c:2048 +#, c-format +msgid "unable to read symlink %s" +msgstr "không thể đọc liên kết tượng trưng %s" + +#: builtin/apply.c:2052 +#, c-format +msgid "unable to open or read %s" +msgstr "không thể mở để đọc hay ghi %s" + +#: builtin/apply.c:2123 +msgid "oops" +msgstr "ôi?" + +#: builtin/apply.c:2645 +#, c-format +msgid "invalid start of line: '%c'" +msgstr "sai khởi đầu dòng: '%c'" + +#: builtin/apply.c:2763 +#, c-format +msgid "Hunk #%d succeeded at %d (offset %d line)." +msgid_plural "Hunk #%d succeeded at %d (offset %d lines)." +msgstr[0] "Khối dữ liệu #%d thành công tại %d (offset %d dòng)." +msgstr[1] "Khối dữ liệu #%d thành công tại %d (offset %d dòng)." + +#: builtin/apply.c:2775 +#, c-format +msgid "Context reduced to (%ld/%ld) to apply fragment at %d" +msgstr "Nội dung được giảm xuống (%ld/%ld) để áp dụng mảnh dữ liệu tại %d" + +#: builtin/apply.c:2781 +#, c-format +msgid "" +"while searching for:\n" +"%.*s" +msgstr "" +"Trong khi đang tìm kiếm cho:\n" +"%.*s" + +#: builtin/apply.c:2800 +#, c-format +msgid "missing binary patch data for '%s'" +msgstr "thiếu dữ liệu của miếng vá định dạng nhị phân cho '%s'" + +#: builtin/apply.c:2903 +#, c-format +msgid "binary patch does not apply to '%s'" +msgstr "miếng vá định dạng nhị phân không được áp dụng cho '%s'" + +#: builtin/apply.c:2909 +#, c-format +msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" +msgstr "vá nhị phân cho '%s' tạo ra kết quả không chính xác (đang chờ %s, đã nhận %s)" + +#: builtin/apply.c:2930 +#, c-format +msgid "patch failed: %s:%ld" +msgstr "vá gặp lỗi: %s:%ld" + +#: builtin/apply.c:3045 +#, c-format +msgid "patch %s has been renamed/deleted" +msgstr "miếng vá %s đã bị xóa/đổi tên" + +#: builtin/apply.c:3052 +#: builtin/apply.c:3069 +#, c-format +msgid "read of %s failed" +msgstr "đọc %s gặp lỗi" + +#: builtin/apply.c:3084 +msgid "removal patch leaves file contents" +msgstr "loại bỏ miếng vá để lại nội dung tập tin" + +#: builtin/apply.c:3105 +#, c-format +msgid "%s: already exists in working directory" +msgstr "%s: đã sẵn có trong thư mục đang làm việc" + +#: builtin/apply.c:3143 +#, c-format +msgid "%s: has been deleted/renamed" +msgstr "%s: đã được xóa/thay-tên" + +#: builtin/apply.c:3148 +#: builtin/apply.c:3179 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: builtin/apply.c:3159 +#, c-format +msgid "%s: does not exist in index" +msgstr "%s: không tồn tại trong bảng mục lục" + +#: builtin/apply.c:3173 +#, c-format +msgid "%s: does not match index" +msgstr "%s: không khớp trong mục lục" + +#: builtin/apply.c:3190 +#, c-format +msgid "%s: wrong type" +msgstr "%s: sai kiểu" + +#: builtin/apply.c:3192 +#, c-format +msgid "%s has type %o, expected %o" +msgstr "%s có kiểu %o, mong chờ %o" + +#: builtin/apply.c:3247 +#, c-format +msgid "%s: already exists in index" +msgstr "%s: đã có từ trước trong bảng mục lục" + +#: builtin/apply.c:3267 +#, c-format +msgid "new mode (%o) of %s does not match old mode (%o)" +msgstr "chế độ mới (%o) của %s không khớp với chế độ cũ (%o)" + +#: builtin/apply.c:3272 +#, c-format +msgid "new mode (%o) of %s does not match old mode (%o) of %s" +msgstr "chế độ mới (%o) của %s không khớp với chế độ cũ (%o) của %s" + +#: builtin/apply.c:3280 +#, c-format +msgid "%s: patch does not apply" +msgstr "%s: miếng vá không được áp dụng" + +#: builtin/apply.c:3293 +#, c-format +msgid "Checking patch %s..." +msgstr "Đang kiểm tra miếng vá %s..." + +#: builtin/apply.c:3348 +#: builtin/checkout.c:212 +#: builtin/reset.c:158 +#, c-format +msgid "make_cache_entry failed for path '%s'" +msgstr "make_cache_entry gặp lỗi đối với đường dẫn '%s'" + +#: builtin/apply.c:3491 +#, c-format +msgid "unable to remove %s from index" +msgstr "không thể gỡ bỏ %s từ mục lục" + +#: builtin/apply.c:3518 +#, c-format +msgid "corrupt patch for subproject %s" +msgstr "miếng vá sai hỏng cho dự án con (subproject) %s" + +#: builtin/apply.c:3522 +#, c-format +msgid "unable to stat newly created file '%s'" +msgstr "không thể lấy trạng thái về tập tin %s mới hơn đã được tạo" + +#: builtin/apply.c:3527 +#, c-format +msgid "unable to create backing store for newly created file %s" +msgstr "không thể tạo 'backing store' cho tập tin được tạo mới hơn %s" + +#: builtin/apply.c:3530 +#, c-format +msgid "unable to add cache entry for %s" +msgstr "không thể thêm mục nhớ tạm cho %s" + +#: builtin/apply.c:3563 +#, c-format +msgid "closing file '%s'" +msgstr "đang đóng tập tin '%s'" + +#: builtin/apply.c:3612 +#, c-format +msgid "unable to write file '%s' mode %o" +msgstr "không thể ghi vào tập tin '%s' chế độ (mode) %o" + +#: builtin/apply.c:3668 +#, c-format +msgid "Applied patch %s cleanly." +msgstr "Đã áp dụng miếng và %s một cách sạch sẽ." + +#: builtin/apply.c:3676 +msgid "internal error" +msgstr "lỗi nội bộ" + +#. Say this even without --verbose +#: builtin/apply.c:3679 +#, c-format +msgid "Applying patch %%s with %d reject..." +msgid_plural "Applying patch %%s with %d rejects..." +msgstr[0] "Đang áp dụng miếng vá %%s với %d lần từ chối..." +msgstr[1] "Đang áp dụng miếng vá %%s với %d lần từ chối..." + +#: builtin/apply.c:3689 +#, c-format +msgid "truncating .rej filename to %.*s.rej" +msgstr "đang cắt cụt tên tập tin .rej thành %.*s.rej" + +#: builtin/apply.c:3710 +#, c-format +msgid "Hunk #%d applied cleanly." +msgstr "Khối nhớ #%d được áp dụng gọn gàng." + +#: builtin/apply.c:3713 +#, c-format +msgid "Rejected hunk #%d." +msgstr "hunk #%d bị từ chối." + +#: builtin/apply.c:3844 +msgid "unrecognized input" +msgstr "không thừa nhận đầu vào" + +#: builtin/apply.c:3855 +msgid "unable to read index file" +msgstr "không thể đọc tập tin lưu bảng mục lục" + +#: builtin/apply.c:3970 +#: builtin/apply.c:3973 +msgid "path" +msgstr "đường-dẫn" + +#: builtin/apply.c:3971 +msgid "don't apply changes matching the given path" +msgstr "không áp dụng các thay đổi khớp với đường dẫn đã cho" + +#: builtin/apply.c:3974 +msgid "apply changes matching the given path" +msgstr "áp dụng các thay đổi khớp với đường dẫn đã cho" + +#: builtin/apply.c:3976 +msgid "num" +msgstr "số" + +#: builtin/apply.c:3977 +msgid "remove <num> leading slashes from traditional diff paths" +msgstr "gỡ bỏ <số> phần dẫn đầu (slashe) từ đường dẫn diff cổ điển" + +#: builtin/apply.c:3980 +msgid "ignore additions made by the patch" +msgstr "lờ đi phần phụ thêm tạo ra bởi miếng vá" + +#: builtin/apply.c:3982 +msgid "instead of applying the patch, output diffstat for the input" +msgstr "thay vì áp dụng một miếng vá, kết xuất kết quả từ lệnh diffstat cho đầu ra" + +#: builtin/apply.c:3986 +msgid "shows number of added and deleted lines in decimal notation" +msgstr "hiển thị số lượng các dòng được thêm vào và xóa đi theo ký hiệu thập phân" + +#: builtin/apply.c:3988 +msgid "instead of applying the patch, output a summary for the input" +msgstr "thay vì áp dụng một miếng vá, kết xuất kết quả cho đầu vào" + +#: builtin/apply.c:3990 +msgid "instead of applying the patch, see if the patch is applicable" +msgstr "thay vì áp dụng miếng vá, hãy xem xem miếng vá có thích hợp không" + +#: builtin/apply.c:3992 +msgid "make sure the patch is applicable to the current index" +msgstr "hãy chắc chắn là miếng vá thích hợp với bảng mục lục hiện hành" + +#: builtin/apply.c:3994 +msgid "apply a patch without touching the working tree" +msgstr "áp dụng một miếng vá mà không động chạm đến cây làm việc" + +#: builtin/apply.c:3996 +msgid "also apply the patch (use with --stat/--summary/--check)" +msgstr "đồng thời áp dụng miếng vá (sử dụng với tùy chọn --stat/--summary/--check)" + +#: builtin/apply.c:3998 +msgid "build a temporary index based on embedded index information" +msgstr "xây dựng bảng mục lục tạm thời trên cơ sở thông tin bảng mục lục được nhúng" + +#: builtin/apply.c:4000 +msgid "paths are separated with NUL character" +msgstr "các đường dẫn bị ngăn cách bởi ký tự NULL" + +#: builtin/apply.c:4003 +msgid "ensure at least <n> lines of context match" +msgstr "đảm bảo rằng có ít nhất <n> dòng nội dung khớp" + +#: builtin/apply.c:4004 +msgid "action" +msgstr "hành động" + +#: builtin/apply.c:4005 +msgid "detect new or modified lines that have whitespace errors" +msgstr "tìm thấy một dòng mới hoặc bị sửa đổi mà nó có lỗi do khoảng trắng" + +#: builtin/apply.c:4008 +#: builtin/apply.c:4011 +msgid "ignore changes in whitespace when finding context" +msgstr "lờ đi sự thay đổi do khoảng trắng khi quét nội dung" + +#: builtin/apply.c:4014 +msgid "apply the patch in reverse" +msgstr "áp dụng miếng vá theo chiều ngược" + +#: builtin/apply.c:4016 +msgid "don't expect at least one line of context" +msgstr "đừng hy vọng có ít nhất một dòng nội dung" + +#: builtin/apply.c:4018 +msgid "leave the rejected hunks in corresponding *.rej files" +msgstr "để lại khối dữ liệu bị từ chối trong các tập tin *.rej tương ứng" + +#: builtin/apply.c:4020 +msgid "allow overlapping hunks" +msgstr "cho phép chồng khối nhớ" + +#: builtin/apply.c:4021 +msgid "be verbose" +msgstr "chi tiết" + +#: builtin/apply.c:4023 +msgid "tolerate incorrectly detected missing new-line at the end of file" +msgstr "dung sai không chính xác đã tìm thấy thiếu dòng mới tại cuối tập tin" + +#: builtin/apply.c:4026 +msgid "do not trust the line counts in the hunk headers" +msgstr "không tin số lượng dòng trong phần đầu khối dữ liệu" + +#: builtin/apply.c:4028 +msgid "root" +msgstr "root" + +#: builtin/apply.c:4029 +msgid "prepend <root> to all filenames" +msgstr "treo thêm <root> vào tất cả các tên tập tin" + +#: builtin/apply.c:4050 +msgid "--index outside a repository" +msgstr "--index ở ngoài một kho chứa" + +#: builtin/apply.c:4053 +msgid "--cached outside a repository" +msgstr "--cached ở ngoài một kho chứa" + +#: builtin/apply.c:4069 +#, c-format +msgid "can't open patch '%s'" +msgstr "không thể mở miếng vá '%s'" + +#: builtin/apply.c:4083 +#, c-format +msgid "squelched %d whitespace error" +msgid_plural "squelched %d whitespace errors" +msgstr[0] "đã chấm dứt %d lỗi khoảng trắng" +msgstr[1] "đã chấm dứt %d lỗi khoảng trắng" + +#: builtin/apply.c:4089 +#: builtin/apply.c:4099 +#, c-format +msgid "%d line adds whitespace errors." +msgid_plural "%d lines add whitespace errors." +msgstr[0] "%d dòng thêm khoảng trắng lỗi." +msgstr[1] "%d dòng thêm khoảng trắng lỗi." + +#: builtin/archive.c:17 +#, c-format +msgid "could not create archive file '%s'" +msgstr "không thể tạo tập tin kho (lưu trữ, nén) '%s'" + +#: builtin/archive.c:20 +msgid "could not redirect output" +msgstr "không thể chuyển hướng kết xuất" + +#: builtin/archive.c:37 +msgid "git archive: Remote with no URL" +msgstr "git archive: Máy chủ không có địa chỉ URL" + +#: builtin/archive.c:58 +msgid "git archive: expected ACK/NAK, got EOF" +msgstr "git archive: mong đợi ACK/NAK, nhận EOF" + +#: builtin/archive.c:63 +#, c-format +msgid "git archive: NACK %s" +msgstr "git archive: NACK %s" + +#: builtin/archive.c:65 +#, c-format +msgid "remote error: %s" +msgstr "lỗi máy chủ: %s" + +#: builtin/archive.c:66 +msgid "git archive: protocol error" +msgstr "git archive: lỗi giao thức" + +#: builtin/archive.c:71 +msgid "git archive: expected a flush" +msgstr "git archive: đã mong chờ một flush" + +#: builtin/branch.c:144 +#, c-format +msgid "" +"deleting branch '%s' that has been merged to\n" +" '%s', but not yet merged to HEAD." +msgstr "" +"đang xóa nhánh '%s' mà nó lại đã được hòa trộn vào\n" +" '%s', nhưng vẫn chưa được hòa trộn vào HEAD." + +#: builtin/branch.c:148 +#, c-format +msgid "" +"not deleting branch '%s' that is not yet merged to\n" +" '%s', even though it is merged to HEAD." +msgstr "" +"không xóa nhánh '%s' cái mà chưa được hòa trộng vào\n" +" '%s', cho dù là nó đã được hòa trộn vào HEAD." + +#: builtin/branch.c:180 +msgid "cannot use -a with -d" +msgstr "không thể sử dụng -a với -d" + +#: builtin/branch.c:186 +msgid "Couldn't look up commit object for HEAD" +msgstr "Không thể tìm kiếm đối tượng chuyển giao (commit) cho HEAD" + +#: builtin/branch.c:191 +#, c-format +msgid "Cannot delete the branch '%s' which you are currently on." +msgstr "Không thể xóa nhánh '%s' cái mà bạn hiện nay đang ở." + +#: builtin/branch.c:202 +#, c-format +msgid "remote branch '%s' not found." +msgstr "nhánh máy chủ '%s' không tìm thấy." + +#: builtin/branch.c:203 +#, c-format +msgid "branch '%s' not found." +msgstr "không tìm thấy nhánh '%s'." + +#: builtin/branch.c:210 +#, c-format +msgid "Couldn't look up commit object for '%s'" +msgstr "Không thể tìm kiếm đối tượng chuyển giao (commit) cho '%s'" + +#: builtin/branch.c:216 +#, c-format +msgid "" +"The branch '%s' is not fully merged.\n" +"If you are sure you want to delete it, run 'git branch -D %s'." +msgstr "" +"Nhánh '%s' không được trộn một cách đầy đủ.\n" +"Nếu bạn thực sự muốn xóa nó, thì chạy lệnh 'git branch -D %s'." + +#: builtin/branch.c:225 +#, c-format +msgid "Error deleting remote branch '%s'" +msgstr "Gặp lỗi khi đang xóa nhánh máy chủ '%s'" + +#: builtin/branch.c:226 +#, c-format +msgid "Error deleting branch '%s'" +msgstr "Lỗi khi xoá bỏ nhánh '%s'" + +#: builtin/branch.c:233 +#, c-format +msgid "Deleted remote branch %s (was %s).\n" +msgstr "Nhánh máy chủ đã xóa %s (trước là %s).\n" + +#: builtin/branch.c:234 +#, c-format +msgid "Deleted branch %s (was %s).\n" +msgstr "Nhánh đã bị xóa '%s' (trước là %s)\n" + +#: builtin/branch.c:239 +msgid "Update of config-file failed" +msgstr "Cập nhật tệp tin cấu hình gặp lỗi" + +#: builtin/branch.c:337 +#, c-format +msgid "branch '%s' does not point at a commit" +msgstr "nhánh '%s' không chỉ đến một lần chuyển giao (commit) nào cả" + +#: builtin/branch.c:409 +#, c-format +msgid "[%s: behind %d]" +msgstr "[%s: đằng sau %d]" + +#: builtin/branch.c:411 +#, c-format +msgid "[behind %d]" +msgstr "[đằng sau %d]" + +#: builtin/branch.c:415 +#, c-format +msgid "[%s: ahead %d]" +msgstr "[%s: phía trước %d]" + +#: builtin/branch.c:417 +#, c-format +msgid "[ahead %d]" +msgstr "[phía trước %d]" + +#: builtin/branch.c:420 +#, c-format +msgid "[%s: ahead %d, behind %d]" +msgstr "[%s: phía trước %d, phía sau %d]" + +#: builtin/branch.c:423 +#, c-format +msgid "[ahead %d, behind %d]" +msgstr "[phía trước %d, phía sau %d]" + +#: builtin/branch.c:535 +msgid "(no branch)" +msgstr "(không có nhánh nào)" + +#: builtin/branch.c:600 +msgid "some refs could not be read" +msgstr "một số tham chiếu đã không thể đọc được" + +#: builtin/branch.c:613 +msgid "cannot rename the current branch while not on any." +msgstr "không thể đổi tên nhánh hiện hành trong khi nó chẳng ở đâu cả." + +#: builtin/branch.c:623 +#, c-format +msgid "Invalid branch name: '%s'" +msgstr "tên nhánh sai: '%s'" + +#: builtin/branch.c:638 +msgid "Branch rename failed" +msgstr "Đổi tên nhánh gặp lỗi" + +#: builtin/branch.c:642 +#, c-format +msgid "Renamed a misnamed branch '%s' away" +msgstr "Đã đổi tên nhánh khuyết danh '%s' đi" + +#: builtin/branch.c:646 +#, c-format +msgid "Branch renamed to %s, but HEAD is not updated!" +msgstr "Nhánh bị đổi tên thành %s, nhưng HEAD lại không được cập nhật!" + +#: builtin/branch.c:653 +msgid "Branch is renamed, but update of config-file failed" +msgstr "Nhánh bị đổi tên, nhưng cập nhật tập tin cấu hình gặp lỗi" + +#: builtin/branch.c:668 +#, c-format +msgid "malformed object name %s" +msgstr "tên đối tượng dị hình %s" + +#: builtin/branch.c:692 +#, c-format +msgid "could not write branch description template: %s" +msgstr "không thể ghi vào mẫu mô tả nhánh: %s" + +#: builtin/branch.c:783 +msgid "Failed to resolve HEAD as a valid ref." +msgstr "Gặp lỗi khi giải quyết HEAD như là một tham chiếu (ref) hợp lệ." + +#: builtin/branch.c:788 +#: builtin/clone.c:558 +msgid "HEAD not found below refs/heads!" +msgstr "HEAD không tìm thấy ở dưới refs/heads!" + +#: builtin/branch.c:808 +msgid "--column and --verbose are incompatible" +msgstr "--column và --verbose xung khắc nhau" + +#: builtin/branch.c:857 +msgid "-a and -r options to 'git branch' do not make sense with a branch name" +msgstr "hai tùy chọn -a và -r áp dụng cho lệnh 'git branch' không hợp lý đối với tên nhánh" + +#: builtin/bundle.c:47 +#, c-format +msgid "%s is okay\n" +msgstr "'%s' tốt\n" + +#: builtin/bundle.c:56 +msgid "Need a repository to create a bundle." +msgstr "Cần một kho chứa để mà tạo một bundle." + +#: builtin/bundle.c:60 +msgid "Need a repository to unbundle." +msgstr "Cần một kho chứa để mà bung một bundle." + +#: builtin/checkout.c:113 +#: builtin/checkout.c:146 +#, c-format +msgid "path '%s' does not have our version" +msgstr "đường dẫn '%s' không có các phiên bản của chúng ta" + +#: builtin/checkout.c:115 +#: builtin/checkout.c:148 +#, c-format +msgid "path '%s' does not have their version" +msgstr "đường dẫn '%s' không có các phiên bản của chúng" + +#: builtin/checkout.c:131 +#, c-format +msgid "path '%s' does not have all necessary versions" +msgstr "đường dẫn '%s' không có tất cả các phiên bản cần thiết" + +#: builtin/checkout.c:175 +#, c-format +msgid "path '%s' does not have necessary versions" +msgstr "đường dẫn '%s' không có các phiên bản cần thiết" + +#: builtin/checkout.c:192 +#, c-format +msgid "path '%s': cannot merge" +msgstr "đường dẫn '%s': không thể hòa trộn" + +#: builtin/checkout.c:209 +#, c-format +msgid "Unable to add merge result for '%s'" +msgstr "Không thể thêm kết quả hòa trộn cho '%s'" + +#: builtin/checkout.c:234 +#: builtin/checkout.c:392 +msgid "corrupt index file" +msgstr "tập tin ghi bảng mục lục bị hỏng" + +#: builtin/checkout.c:264 +#: builtin/checkout.c:271 +#, c-format +msgid "path '%s' is unmerged" +msgstr "đường dẫn '%s' không được hòa trộn" + +#: builtin/checkout.c:302 +#: builtin/checkout.c:498 +#: builtin/clone.c:583 +#: builtin/merge.c:812 +msgid "unable to write new index file" +msgstr "không thể ghi tập tin lưu bảng mục lục mới" + +#: builtin/checkout.c:319 +#: builtin/diff.c:302 +#: builtin/merge.c:408 +msgid "diff_setup_done failed" +msgstr "diff_setup_done gặp lỗi" + +#: builtin/checkout.c:414 +msgid "you need to resolve your current index first" +msgstr "bạn cần phải giải quyết bảng mục lục hiện tại của bạn trước đã!" + +#: builtin/checkout.c:533 +#, c-format +msgid "Can not do reflog for '%s'\n" +msgstr "Không thể thực hiện reflog cho '%s'\n" + +#: builtin/checkout.c:566 +msgid "HEAD is now at" +msgstr "HEAD hiện giờ tại" + +#: builtin/checkout.c:573 +#, c-format +msgid "Reset branch '%s'\n" +msgstr "Đặt lại nhánh '%s'\n" + +#: builtin/checkout.c:576 +#, c-format +msgid "Already on '%s'\n" +msgstr "Đã sẵn sàng trên '%s'\n" + +#: builtin/checkout.c:580 +#, c-format +msgid "Switched to and reset branch '%s'\n" +msgstr "Đã chuyển tới và reset nhánh '%s'\n" + +#: builtin/checkout.c:582 +#, c-format +msgid "Switched to a new branch '%s'\n" +msgstr "Đã chuyển đến nhánh mới '%s'\n" + +#: builtin/checkout.c:584 +#, c-format +msgid "Switched to branch '%s'\n" +msgstr "Đã chuyển đến nhánh '%s'\n" + +#: builtin/checkout.c:640 +#, c-format +msgid " ... and %d more.\n" +msgstr " ... và nhiều hơn %d.\n" + +#. The singular version +#: builtin/checkout.c:646 +#, c-format +msgid "" +"Warning: you are leaving %d commit behind, not connected to\n" +"any of your branches:\n" +"\n" +"%s\n" +msgid_plural "" +"Warning: you are leaving %d commits behind, not connected to\n" +"any of your branches:\n" +"\n" +"%s\n" +msgstr[0] "" +"Cảnh báo: bạn đã rời bở %d lần chuyển giao (commit) lại đằng sau, không được kết nối đến\n" +"bất kỳ nhánh nào của bạn:\n" +"\n" +"%s\n" +msgstr[1] "" +"Cảnh báo: bạn đã rời bở %d lần chuyển giao (commit) lại đằng sau, không được kết nối đến\n" +"bất kỳ nhánh nào của bạn:\n" +"\n" +"%s\n" + +#: builtin/checkout.c:664 +#, c-format +msgid "" +"If you want to keep them by creating a new branch, this may be a good time\n" +"to do so with:\n" +"\n" +" git branch new_branch_name %s\n" +"\n" +msgstr "" +"Nếu bạn muốn giữ chúng bằng cách tạo ra một nhánh mới, đây có lẽ là một thời điểm thích hợp\n" +"để làm thế bằng lệnh:\n" +"\n" +" git branch tên_nhánh_mới %s\n" +"\n" + +#: builtin/checkout.c:694 +msgid "internal error in revision walk" +msgstr "lỗi nội bộ trong khi di chuyển qua các điểm xét lại" + +#: builtin/checkout.c:698 +msgid "Previous HEAD position was" +msgstr "Vị trí kế trước của HEAD là" + +#: builtin/checkout.c:724 +msgid "You are on a branch yet to be born" +msgstr "Bạn tại nhánh mà nó chưa hề được sinh ra" + +#. case (1) +#: builtin/checkout.c:855 +#, c-format +msgid "invalid reference: %s" +msgstr "tham chiếu sai: %s" + +#. case (1): want a tree +#: builtin/checkout.c:894 +#, c-format +msgid "reference is not a tree: %s" +msgstr "tham chiếu không phải là cây:%s" + +#: builtin/checkout.c:974 +msgid "-B cannot be used with -b" +msgstr "-B không thể được sử dụng với -b" + +#: builtin/checkout.c:983 +msgid "--patch is incompatible with all other options" +msgstr "--patch xung khắc với tất cả các tùy chọn khác" + +#: builtin/checkout.c:986 +msgid "--detach cannot be used with -b/-B/--orphan" +msgstr "--detach không thể được sử dụng với -b/-B/--orphan" + +#: builtin/checkout.c:988 +msgid "--detach cannot be used with -t" +msgstr "--detach không thể được sử dụng với tùy chọn -t" + +#: builtin/checkout.c:994 +msgid "--track needs a branch name" +msgstr "--track cần tên một nhánh" + +#: builtin/checkout.c:1001 +msgid "Missing branch name; try -b" +msgstr "Thiếu tên nhánh; hãy thử -b" + +#: builtin/checkout.c:1007 +msgid "--orphan and -b|-B are mutually exclusive" +msgstr "Tùy chọn --orphan và -b|-B loại từ lẫn nhau" + +#: builtin/checkout.c:1009 +msgid "--orphan cannot be used with -t" +msgstr "--orphan không thể được sử dụng với tùy chọn -t" + +#: builtin/checkout.c:1019 +msgid "git checkout: -f and -m are incompatible" +msgstr "git checkout: -f và -m xung khắc nhau" + +#: builtin/checkout.c:1053 +msgid "invalid path specification" +msgstr "đường dẫn đã cho không hợp lệ" + +#: builtin/checkout.c:1061 +#, c-format +msgid "" +"git checkout: updating paths is incompatible with switching branches.\n" +"Did you intend to checkout '%s' which can not be resolved as commit?" +msgstr "" +"git checkout: việc cập nhật các đường dẫn là xung khắc với việc chuyển đổi các nhánh..\n" +"Bạn đã có ý định checkout '%s' cái mà không thể được phân giải như là lần chuyển giao (commit)?" + +#: builtin/checkout.c:1063 +msgid "git checkout: updating paths is incompatible with switching branches." +msgstr "git checkout: việc cập nhật các đường dẫn là xung khắc với việc chuyển đổi các nhánh." + +#: builtin/checkout.c:1068 +msgid "git checkout: --detach does not take a path argument" +msgstr "git checkout: --detach không nhận một đối số đường dẫn" + +#: builtin/checkout.c:1071 +msgid "" +"git checkout: --ours/--theirs, --force and --merge are incompatible when\n" +"checking out of the index." +msgstr "" +"git checkout: --ours/--theirs, --force và --merge là xung khắc với nhau khi\n" +"checkout." + +#: builtin/checkout.c:1090 +msgid "Cannot switch branch to a non-commit." +msgstr "Không thể chuyển đến một non-commit." + +#: builtin/checkout.c:1093 +msgid "--ours/--theirs is incompatible with switching branches." +msgstr "--ours/--theirs là xung khắc nhau khi chuyển đổi các nhánh." + +#: builtin/clean.c:78 +msgid "-x and -X cannot be used together" +msgstr "-x và -X không thể dùng cùng một lúc với nhau" + +#: builtin/clean.c:82 +msgid "clean.requireForce set to true and neither -n nor -f given; refusing to clean" +msgstr "clean.requireForce được đặt thành true và không đưa ra tùy chọn -n mà cũng không -f; từ chối lệnh dọn dẹp (clean)" + +#: builtin/clean.c:85 +msgid "clean.requireForce defaults to true and neither -n nor -f given; refusing to clean" +msgstr "clean.requireForce mặc định được đặt thành true và không đưa ra tùy chọn -n mà cũng không -f; từ chối lệnh dọn dẹp (clean)" + +#: builtin/clean.c:155 +#: builtin/clean.c:176 +#, c-format +msgid "Would remove %s\n" +msgstr "Có thể gỡ bỏ %s\n" + +#: builtin/clean.c:159 +#: builtin/clean.c:179 +#, c-format +msgid "Removing %s\n" +msgstr "Đang gỡ bỏ %s\n" + +#: builtin/clean.c:162 +#: builtin/clean.c:182 +#, c-format +msgid "failed to remove %s" +msgstr "gặp lỗi khi gỡ bỏ %s" + +#: builtin/clean.c:166 +#, c-format +msgid "Would not remove %s\n" +msgstr "Không thể gỡ bỏ %s\n" + +#: builtin/clean.c:168 +#, c-format +msgid "Not removing %s\n" +msgstr "Không xóa %s\n" + +#: builtin/clone.c:243 +#, c-format +msgid "reference repository '%s' is not a local directory." +msgstr "kho tham chiếu '%s' không phải là một thư mục nội bộ." + +#: builtin/clone.c:302 +#, c-format +msgid "failed to open '%s'" +msgstr "gặp lỗi khi mở '%s'" + +#: builtin/clone.c:306 +#, c-format +msgid "failed to create directory '%s'" +msgstr "tạo thư mục \"%s\" gặp lỗi" + +#: builtin/clone.c:308 +#: builtin/diff.c:75 +#, c-format +msgid "failed to stat '%s'" +msgstr "gặp lỗi stat (lấy trạng thái về) '%s'" + +#: builtin/clone.c:310 +#, c-format +msgid "%s exists and is not a directory" +msgstr "%s tồn tại nhưng không phải là một thư mục" + +#: builtin/clone.c:324 +#, c-format +msgid "failed to stat %s\n" +msgstr "lỗi stat (lấy trạng thái về) %s\n" + +#: builtin/clone.c:341 +#, c-format +msgid "failed to unlink '%s'" +msgstr "bỏ liên kết (unlink) %s không thành công" + +#: builtin/clone.c:346 +#, c-format +msgid "failed to create link '%s'" +msgstr "tạo được liên kết mềm tới %s gặp lỗi" + +#: builtin/clone.c:350 +#, c-format +msgid "failed to copy file to '%s'" +msgstr "sao chép tệp tin tới '%s' gặp lỗi" + +#: builtin/clone.c:373 +#, c-format +msgid "done.\n" +msgstr "hoàn tất.\n" + +#: builtin/clone.c:440 +#, c-format +msgid "Could not find remote branch %s to clone." +msgstr "Không tìm thấy nhánh máy chủ %s để nhân bản (clone)." + +#: builtin/clone.c:549 +msgid "remote HEAD refers to nonexistent ref, unable to checkout.\n" +msgstr "refers HEAD máy chủ chỉ đến ref không tồn tại, không thể checkout.\n" + +#: builtin/clone.c:639 +msgid "Too many arguments." +msgstr "Có quá nhiều đối số." + +#: builtin/clone.c:643 +msgid "You must specify a repository to clone." +msgstr "Bạn phải chỉ định một kho để mà nhân bản (clone)." + +#: builtin/clone.c:654 +#, c-format +msgid "--bare and --origin %s options are incompatible." +msgstr "tùy chọn --bare và --origin %s xung khắc nhau." + +#: builtin/clone.c:668 +#, c-format +msgid "repository '%s' does not exist" +msgstr "kho chứa '%s' chưa tồn tại" + +#: builtin/clone.c:673 +msgid "--depth is ignored in local clones; use file:// instead." +msgstr "--depth bị lờ đi khi nhân bản nội bộ; hãy sử dụng file:// để thay thế." + +#: builtin/clone.c:683 +#, c-format +msgid "destination path '%s' already exists and is not an empty directory." +msgstr "đường dẫn đích '%s' đã có từ trước và không phải là một thư mục rỗng." + +#: builtin/clone.c:693 +#, c-format +msgid "working tree '%s' already exists." +msgstr "cây làm việc '%s' đã sẵn tồn tại rồi." + +#: builtin/clone.c:706 +#: builtin/clone.c:720 +#, c-format +msgid "could not create leading directories of '%s'" +msgstr "không thể tạo các thư mục dẫn đầu của '%s'" + +#: builtin/clone.c:709 +#, c-format +msgid "could not create work tree dir '%s'." +msgstr "không thể tạo cây thư mục làm việc dir '%s'." + +#: builtin/clone.c:728 +#, c-format +msgid "Cloning into bare repository '%s'...\n" +msgstr "Đang nhân bản thành kho chứa bare '%s'...\n" + +#: builtin/clone.c:730 +#, c-format +msgid "Cloning into '%s'...\n" +msgstr "Đang nhân bản thành '%s'...\n" + +#: builtin/clone.c:786 +#, c-format +msgid "Don't know how to clone %s" +msgstr "Không biết làm cách nào để nhân bản (clone) %s" + +#: builtin/clone.c:835 +#, c-format +msgid "Remote branch %s not found in upstream %s" +msgstr "Nhánh máy chủ %s không tìm thấy trong dòng ngược (upstream) %s" + +#: builtin/clone.c:842 +msgid "You appear to have cloned an empty repository." +msgstr "Bạn hình như là đã nhân bản một kho trống rỗng." + +#: builtin/column.c:51 +msgid "--command must be the first argument" +msgstr "--command phải là đối số đầu tiên" + +#: builtin/commit.c:43 +msgid "" +"Your name and email address were configured automatically based\n" +"on your username and hostname. Please check that they are accurate.\n" +"You can suppress this message by setting them explicitly:\n" +"\n" +" git config --global user.name \"Your Name\"\n" +" git config --global user.email you@example.com\n" +"\n" +"After doing this, you may fix the identity used for this commit with:\n" +"\n" +" git commit --amend --reset-author\n" +msgstr "" +"Tên và địa chỉ thư điện tử của bạn được cấu hình một cách tự động trên cơ sở\n" +"tài khoản và địa chỉ máy chủ của bạn. Xin hãy kiểm tra xem chúng có chính xác không.\n" +"Bạn có thể chặn những thông báo kiểu này bằng cách cài đặt các thông tin trên một cách rõ ràng:\n" +"\n" +" git config --global user.name \"Tên của bạn\"\n" +" git config --global user.email you@example.com\n" +"\n" +"Sau khi thực hiện xong, bạn có thể sửa chữa định danh được sử dụng cho lần chuyển giao (commit) này với lệnh:\n" +"\n" +" git commit --amend --reset-author\n" + +#: builtin/commit.c:55 +msgid "" +"You asked to amend the most recent commit, but doing so would make\n" +"it empty. You can repeat your command with --allow-empty, or you can\n" +"remove the commit entirely with \"git reset HEAD^\".\n" +msgstr "" +"Bạn đã yêu cầu amend (tu bổ) phần lớn các lần chuyển giao (commit) gần đây, nhưng làm như thế\n" +"có thể làm cho nó trở nên trống rỗng. Bạn có thể lặp lại lệnh của mình bằng --allow-empty,\n" +"hoặc là bạn gỡ bỏ các lần chuyển giao một cách hoàn toàn bằng lệnh:\n" +"\"git reset HEAD^\".\n" + +#: builtin/commit.c:60 +msgid "" +"The previous cherry-pick is now empty, possibly due to conflict resolution.\n" +"If you wish to commit it anyway, use:\n" +"\n" +" git commit --allow-empty\n" +"\n" +"Otherwise, please use 'git reset'\n" +msgstr "" +"Lần cherry-pick trước hiện nay trống rỗng, có lẽ là bởi vì sự phân giải xung đột.\n" +"Nếu bạn muốn chuyển giao nó cho dù thế nào đi nữa, sử dụng:\n" +"\n" +" git commit --allow-empty\n" +"\n" +"Nếu không, hãy thử sử dụng 'git reset'\n" + +#: builtin/commit.c:253 +msgid "failed to unpack HEAD tree object" +msgstr "gặp lỗi khi tháo dỡ HEAD đối tượng cây" + +#: builtin/commit.c:295 +msgid "unable to create temporary index" +msgstr "không thể tạo bảng mục lục tạm thời" + +#: builtin/commit.c:301 +msgid "interactive add failed" +msgstr "việc thêm tương tác gặp lỗi" + +#: builtin/commit.c:334 +#: builtin/commit.c:355 +#: builtin/commit.c:405 +msgid "unable to write new_index file" +msgstr "không thể ghi tập tin lưu bảng mục lục mới (new_index)" + +#: builtin/commit.c:386 +msgid "cannot do a partial commit during a merge." +msgstr "không thể thực hiện việc chuyển giao (commit) cục bộ trong khi đang được hòa trộn." + +#: builtin/commit.c:388 +msgid "cannot do a partial commit during a cherry-pick." +msgstr "không thể thực hiện việc chuyển giao (commit) bộ phận trong khi đang cherry-pick." + +#: builtin/commit.c:398 +msgid "cannot read the index" +msgstr "không đọc được bảng mục lục" + +#: builtin/commit.c:418 +msgid "unable to write temporary index file" +msgstr "không thể ghi tập tin lưu bảng mục lục tạm thời" + +#: builtin/commit.c:493 +#: builtin/commit.c:499 +#, c-format +msgid "invalid commit: %s" +msgstr "lần chuyển giao (commit) không hợp lệ: %s" + +#: builtin/commit.c:522 +msgid "malformed --author parameter" +msgstr "đối số --author bị dị hình" + +#: builtin/commit.c:582 +#, c-format +msgid "Malformed ident string: '%s'" +msgstr "Chuỗi thụt lề đầu dòng dị hình: '%s'" + +#: builtin/commit.c:620 +#: builtin/commit.c:653 +#: builtin/commit.c:967 +#, c-format +msgid "could not lookup commit %s" +msgstr "không thể tìm kiếm commit (lần chuyển giao) %s" + +#: builtin/commit.c:632 +#: builtin/shortlog.c:296 +#, c-format +msgid "(reading log message from standard input)\n" +msgstr "(đang đọc thông điệp nhật ký từ đầu vào tiêu chuẩn)\n" + +#: builtin/commit.c:634 +msgid "could not read log from standard input" +msgstr "không thể đọc nhật ký từ đầu vào tiêu chuẩn" + +#: builtin/commit.c:638 +#, c-format +msgid "could not read log file '%s'" +msgstr "không đọc được tệp nhật ký '%s'" + +#: builtin/commit.c:644 +msgid "commit has empty message" +msgstr "lần chuyển giao (commit) có ghi chú trống rỗng" + +#: builtin/commit.c:660 +msgid "could not read MERGE_MSG" +msgstr "không thể đọc MERGE_MSG" + +#: builtin/commit.c:664 +msgid "could not read SQUASH_MSG" +msgstr "không thể đọc SQUASH_MSG" + +#: builtin/commit.c:668 +#, c-format +msgid "could not read '%s'" +msgstr "Không thể đọc '%s'." + +#: builtin/commit.c:720 +msgid "could not write commit template" +msgstr "không thể ghi mẫu commit" + +#: builtin/commit.c:731 +#, c-format +msgid "" +"\n" +"It looks like you may be committing a merge.\n" +"If this is not correct, please remove the file\n" +"\t%s\n" +"and try again.\n" +msgstr "" +"\n" +"Nó trông giống với việc bạn đang chuyển giao một lần hòa trộn.\n" +"Nếu không phải vậy, xin hãy gỡ bỏ tập tin\n" +"\t%s\n" +"và thử lại.\n" + +#: builtin/commit.c:736 +#, c-format +msgid "" +"\n" +"It looks like you may be committing a cherry-pick.\n" +"If this is not correct, please remove the file\n" +"\t%s\n" +"and try again.\n" +msgstr "" +"\n" +"Nó trông giống với việc bạn đang chuyển giao một lần cherry-pick.\n" +"Nếu không phải vậy, xin hãy gỡ bỏ tập tin\n" +"\t%s\n" +"và thử lại.\n" + +#: builtin/commit.c:748 +msgid "" +"Please enter the commit message for your changes. Lines starting\n" +"with '#' will be ignored, and an empty message aborts the commit.\n" +msgstr "" +"Hãy nhập vào các thông tin để giải thích các thay đổi của bạn. Những dòng được\n" +"bắt đầu bằng '#' sẽ được bỏ qua, phần chú thích này nếu rỗng sẽ làm hủy bỏ lần chuyển giao (commit).\n" + +#: builtin/commit.c:753 +msgid "" +"Please enter the commit message for your changes. Lines starting\n" +"with '#' will be kept; you may remove them yourself if you want to.\n" +"An empty message aborts the commit.\n" +msgstr "" +"Hãy nhập vào các thông tin để giải thích các thay đổi của bạn.Những dòng được\n" +"bắt đầu bằng '#' sẽ được bỏ qua; bạn có thể xóa chúng đi nếu muốn.\n" +"Phần chú thích này nếu rỗng sẽ làm hủy bỏ lần chuyển giao (commit).\n" + +#: builtin/commit.c:766 +#, c-format +msgid "%sAuthor: %s" +msgstr "%sTác giả: %s" + +#: builtin/commit.c:773 +#, c-format +msgid "%sCommitter: %s" +msgstr "%sNgười chuyển giao (commit): %s" + +#: builtin/commit.c:793 +msgid "Cannot read index" +msgstr "không đọc được bảng mục lục" + +#: builtin/commit.c:830 +msgid "Error building trees" +msgstr "Gặp lỗi khi xây dựng cây" + +#: builtin/commit.c:845 +#: builtin/tag.c:361 +#, c-format +msgid "Please supply the message using either -m or -F option.\n" +msgstr "Xin hãy áp dụng thông điệp sử dụng hoặc là tùy chọn -m hoặc là -F.\n" + +#: builtin/commit.c:942 +#, c-format +msgid "No existing author found with '%s'" +msgstr "Không tìm thấy tác giả đã sẵn có với '%s'" + +#: builtin/commit.c:957 +#: builtin/commit.c:1157 +#, c-format +msgid "Invalid untracked files mode '%s'" +msgstr "Chế độ cho các tập tin không bị theo vết không hợp lệ '%s'" + +#: builtin/commit.c:997 +msgid "Using both --reset-author and --author does not make sense" +msgstr "Sử dụng cả hai tùy chọn --reset-author và --author không hợp lý" + +#: builtin/commit.c:1008 +msgid "You have nothing to amend." +msgstr "Không có gì để amend (tu bổ) cả." + +#: builtin/commit.c:1011 +msgid "You are in the middle of a merge -- cannot amend." +msgstr "Bạn đang ở giữa của quá trình hòa trộn -- không thể thực hiện amend (tu bổ)." + +#: builtin/commit.c:1013 +msgid "You are in the middle of a cherry-pick -- cannot amend." +msgstr "Bạn đang ở giữa của quá trình cherry-pick -- không thể thực hiện amend (tu bổ)." + +#: builtin/commit.c:1016 +msgid "Options --squash and --fixup cannot be used together" +msgstr "Các tùy chọn --squash và --fixup không thể sử dụng cùng với nhau" + +#: builtin/commit.c:1026 +msgid "Only one of -c/-C/-F/--fixup can be used." +msgstr "Chỉ một tùy chọn trong số -c/-C/-F/--fixup được sử dụng" + +#: builtin/commit.c:1028 +msgid "Option -m cannot be combined with -c/-C/-F/--fixup." +msgstr "Tùy chọn -m không thể được tổ hợp cùng với -c/-C/-F/--fixup." + +#: builtin/commit.c:1036 +msgid "--reset-author can be used only with -C, -c or --amend." +msgstr "--reset-author chỉ có thể được sử dụng với tùy chọn -C, -c hay --amend." + +#: builtin/commit.c:1053 +msgid "Only one of --include/--only/--all/--interactive/--patch can be used." +msgstr "Chỉ một trong các tùy chọn --include/--only/--all/--interactive/--patch được sử dụng." + +#: builtin/commit.c:1055 +msgid "No paths with --include/--only does not make sense." +msgstr "Không đường dẫn với các tùy chọn --include/--only không hợp lý." + +#: builtin/commit.c:1057 +msgid "Clever... amending the last one with dirty index." +msgstr "Giỏi... đang tu bổ cái cuối với bảng mục lục phi nghĩa." + +#: builtin/commit.c:1059 +msgid "Explicit paths specified without -i nor -o; assuming --only paths..." +msgstr "Những đường dẫn rõ ràng được chỉ ra không có tùy chọn -i cũng không -o; đang giả định --only những-đường-dẫn..." + +#: builtin/commit.c:1069 +#: builtin/tag.c:577 +#, c-format +msgid "Invalid cleanup mode %s" +msgstr "Chế độ dọn dẹp không hợp lệ %s" + +#: builtin/commit.c:1074 +msgid "Paths with -a does not make sense." +msgstr "Các đường dẫn với tùy chọn -a không hợp lý." + +#: builtin/commit.c:1257 +msgid "couldn't look up newly created commit" +msgstr "không thể tìm thấy lần chuyển giao (commit) mới hơn đã được tạo" + +#: builtin/commit.c:1259 +msgid "could not parse newly created commit" +msgstr "không thể phân tích cú pháp của đối tượng chuyển giao mới hơn đã được tạo" + +#: builtin/commit.c:1300 +msgid "detached HEAD" +msgstr "đã rời khỏi HEAD" + +#: builtin/commit.c:1302 +msgid " (root-commit)" +msgstr " (root-commit)" + +#: builtin/commit.c:1446 +msgid "could not parse HEAD commit" +msgstr "không thể phân tích commit (lần chuyển giao) HEAD" + +#: builtin/commit.c:1484 +#: builtin/merge.c:509 +#, c-format +msgid "could not open '%s' for reading" +msgstr "không thể mở %s' để đọc" + +#: builtin/commit.c:1491 +#, c-format +msgid "Corrupt MERGE_HEAD file (%s)" +msgstr "Tập tin MERGE_HEAD sai hỏng (%s)" + +#: builtin/commit.c:1498 +msgid "could not read MERGE_MODE" +msgstr "không thể đọc MERGE_MODE" + +#: builtin/commit.c:1517 +#, c-format +msgid "could not read commit message: %s" +msgstr "không thể đọc thông điệp (message) commit (lần chuyển giao): %s" + +#: builtin/commit.c:1531 +#, c-format +msgid "Aborting commit; you did not edit the message.\n" +msgstr "Đang bỏ qua việc chuyển giao (commit); bạn đã không biên soạn thông điệp (message).\n" + +#: builtin/commit.c:1536 +#, c-format +msgid "Aborting commit due to empty commit message.\n" +msgstr "Đang bỏ qua lần chuyển giao (commit) bởi vì thông điệp của nó trống rỗng.\n" + +#: builtin/commit.c:1551 +#: builtin/merge.c:936 +#: builtin/merge.c:961 +msgid "failed to write commit object" +msgstr "gặp lỗi khi ghi đối tượng chuyển giao (commit)" + +#: builtin/commit.c:1572 +msgid "cannot lock HEAD ref" +msgstr "không thể khóa HEAD ref (tham chiếu)" + +#: builtin/commit.c:1576 +msgid "cannot update HEAD ref" +msgstr "không thể cập nhật HEAD ref (tham chiếu)" + +#: builtin/commit.c:1587 +msgid "" +"Repository has been updated, but unable to write\n" +"new_index file. Check that disk is not full or quota is\n" +"not exceeded, and then \"git reset HEAD\" to recover." +msgstr "" +"Kho chứa đã hoàn tất việc cập nhật, nhưng không thể ghi vào\n" +"tập tin new_index (bảng mục lục mới). Hãy kiểm tra xem đĩa có bị đầy quá\n" +"hay quota (hạn nghạch đĩa cứng) bị vượt quá, và sau đó \"git reset HEAD\" để khắc phục." + +#: builtin/describe.c:234 +#, c-format +msgid "annotated tag %s not available" +msgstr "thẻ đã được ghi chú %s không sẵn để dùng" + +#: builtin/describe.c:238 +#, c-format +msgid "annotated tag %s has no embedded name" +msgstr "thẻ được chú giải %s không có tên nhúng" + +#: builtin/describe.c:240 +#, c-format +msgid "tag '%s' is really '%s' here" +msgstr "thẻ '%s' đã thực sự ở đây '%s' rồi" + +#: builtin/describe.c:267 +#, c-format +msgid "Not a valid object name %s" +msgstr "Không phải tên đối tượng %s hợp lệ" + +#: builtin/describe.c:270 +#, c-format +msgid "%s is not a valid '%s' object" +msgstr "%s không phải là một đối tượng '%s' hợp lệ" + +#: builtin/describe.c:287 +#, c-format +msgid "no tag exactly matches '%s'" +msgstr "không có thẻ nào khớp chính xác với '%s'" + +#: builtin/describe.c:289 +#, c-format +msgid "searching to describe %s\n" +msgstr "Đang tìm kiếm để mô tả %s\n" + +#: builtin/describe.c:329 +#, c-format +msgid "finished search at %s\n" +msgstr "việc tìm kiếm đã kết thúc tại %s\n" + +#: builtin/describe.c:353 +#, c-format +msgid "" +"No annotated tags can describe '%s'.\n" +"However, there were unannotated tags: try --tags." +msgstr "" +"Không có thẻ được chú giải nào được mô tả là '%s'.\n" +"Tuy nhiên, ở đây có những thẻ không được chú giải: hãy thử --tags." + +#: builtin/describe.c:357 +#, c-format +msgid "" +"No tags can describe '%s'.\n" +"Try --always, or create some tags." +msgstr "" +"Không có thẻ (tag) có thể mô tả '%s'.\n" +"Hãy thử --always, hoặt tạo một số thẻ." + +#: builtin/describe.c:378 +#, c-format +msgid "traversed %lu commits\n" +msgstr "đã xuyên %lu qua lần chuyển giao (commit)\n" + +#: builtin/describe.c:381 +#, c-format +msgid "" +"more than %i tags found; listed %i most recent\n" +"gave up search at %s\n" +msgstr "" +"tìm thấy nhiều hơn %i thẻ (tag); đã liệt kê %i gần đây nhất\n" +"bỏ đi tìm kiếm tại %s\n" + +#: builtin/describe.c:436 +msgid "--long is incompatible with --abbrev=0" +msgstr "--long là xung khắc với tùy chọn --abbrev=0" + +#: builtin/describe.c:462 +msgid "No names found, cannot describe anything." +msgstr "Không tìm thấy các tên, không thể mô tả gì cả." + +#: builtin/describe.c:482 +msgid "--dirty is incompatible with committishes" +msgstr "--dirty là xung khắc với các tùy chọn dành cho chuyển giao (commit)" + +#: builtin/diff.c:77 +#, c-format +msgid "'%s': not a regular file or symlink" +msgstr "'%s': không phải tập tin bình thường hay liên kết tượng trưng" + +#: builtin/diff.c:220 +#, c-format +msgid "invalid option: %s" +msgstr "tùy chọn sai: %s" + +#: builtin/diff.c:297 +msgid "Not a git repository" +msgstr "Không phải là kho git" + +#: builtin/diff.c:347 +#, c-format +msgid "invalid object '%s' given." +msgstr "đối tượng đã cho '%s' không hợp lệ." + +#: builtin/diff.c:352 +#, c-format +msgid "more than %d trees given: '%s'" +msgstr "đã chỉ ra nhiều hơn %d cây (tree): '%s'" + +#: builtin/diff.c:362 +#, c-format +msgid "more than two blobs given: '%s'" +msgstr "đã cho nhiều hơn hai đối tượng blob: '%s'" + +#: builtin/diff.c:370 +#, c-format +msgid "unhandled object '%s' given." +msgstr "đã cho đối tượng không thể nắm giữ '%s'." + +#: builtin/fetch.c:200 +msgid "Couldn't find remote ref HEAD" +msgstr "Không thể tìm thấy máy chủ cho tham chiếu HEAD" + +#: builtin/fetch.c:253 +#, c-format +msgid "object %s not found" +msgstr "Không tìm thấy đối tượng %s" + +#: builtin/fetch.c:259 +msgid "[up to date]" +msgstr "[đã cập nhật]" + +#: builtin/fetch.c:273 +#, c-format +msgid "! %-*s %-*s -> %s (can't fetch in current branch)" +msgstr "! %-*s %-*s -> %s (không thể fetch (lấy về) trong nhánh hiện hành)" + +#: builtin/fetch.c:274 +#: builtin/fetch.c:360 +msgid "[rejected]" +msgstr "[Bị từ chối]" + +#: builtin/fetch.c:285 +msgid "[tag update]" +msgstr "[cập nhật thẻ]" + +#: builtin/fetch.c:287 +#: builtin/fetch.c:322 +#: builtin/fetch.c:340 +msgid " (unable to update local ref)" +msgstr " (không thể cập nhật tham chiếu (ref) nội bộ)" + +#: builtin/fetch.c:305 +msgid "[new tag]" +msgstr "[thẻ mới]" + +#: builtin/fetch.c:308 +msgid "[new branch]" +msgstr "[nhánh mới]" + +#: builtin/fetch.c:311 +msgid "[new ref]" +msgstr "[ref (tham chiếu) mới]" + +#: builtin/fetch.c:356 +msgid "unable to update local ref" +msgstr "không thể cập nhật tham chiếu (ref) nội bộ" + +#: builtin/fetch.c:356 +msgid "forced update" +msgstr "cưỡng bức cập nhật" + +#: builtin/fetch.c:362 +msgid "(non-fast-forward)" +msgstr "(non-fast-forward)" + +#: builtin/fetch.c:393 +#: builtin/fetch.c:685 +#, c-format +msgid "cannot open %s: %s\n" +msgstr "không thể mở %s: %s\n" + +#: builtin/fetch.c:402 +#, c-format +msgid "%s did not send all necessary objects\n" +msgstr "%s đã không gửi tất cả các đối tượng cần thiết\n" + +#: builtin/fetch.c:488 +#, c-format +msgid "From %.*s\n" +msgstr "Từ %.*s\n" + +#: builtin/fetch.c:499 +#, c-format +msgid "" +"some local refs could not be updated; try running\n" +" 'git remote prune %s' to remove any old, conflicting branches" +msgstr "" +"một số tham chiếu (refs) nội bộ không thể được cập nhật; hãy thử chạy\n" +" 'git remote prune %s' để bỏ đi những nhánh cũ, hay bị xung đột" + +#: builtin/fetch.c:549 +#, c-format +msgid " (%s will become dangling)" +msgstr " (%s sẽ trở thành lủng lẳng (không được quản lý))" + +#: builtin/fetch.c:550 +#, c-format +msgid " (%s has become dangling)" +msgstr " (%s phải trở thành lủng lẳng (không được quản lý))" + +#: builtin/fetch.c:557 +msgid "[deleted]" +msgstr "[đã xóa]" + +#: builtin/fetch.c:558 +#: builtin/remote.c:1055 +msgid "(none)" +msgstr "(không)" + +#: builtin/fetch.c:675 +#, c-format +msgid "Refusing to fetch into current branch %s of non-bare repository" +msgstr "Từ chối việc lấy (fetch) vào trong nhánh hiện tại %s của một kho chứa không phải kho trần (bare)" + +#: builtin/fetch.c:709 +#, c-format +msgid "Don't know how to fetch from %s" +msgstr "Không biết làm cách nào để lấy về (fetch) từ %s" + +#: builtin/fetch.c:786 +#, c-format +msgid "Option \"%s\" value \"%s\" is not valid for %s" +msgstr "Tùy chọn \"%s\" có giá trị \"%s\" là không hợp lệ cho %s" + +#: builtin/fetch.c:789 +#, c-format +msgid "Option \"%s\" is ignored for %s\n" +msgstr "Tùy chọn \"%s\" bị bỏ qua với %s\n" + +#: builtin/fetch.c:888 +#, c-format +msgid "Fetching %s\n" +msgstr "Đang lấy (fetch) %s\n" + +#: builtin/fetch.c:890 +#: builtin/remote.c:100 +#, c-format +msgid "Could not fetch %s" +msgstr "không thể fetch (lấy) %s" + +#: builtin/fetch.c:907 +msgid "" +"No remote repository specified. Please, specify either a URL or a\n" +"remote name from which new revisions should be fetched." +msgstr "" +"Chưa chỉ ra kho chứa máy chủ. Xin hãy chỉ định hoặc là URL hoặc\n" +"tên máy chủ từ cái mà những điểm xét duyệt mới có thể được fetch (lấy về)." + +#: builtin/fetch.c:927 +msgid "You need to specify a tag name." +msgstr "Bạn phải định rõ tên thẻ." + +#: builtin/fetch.c:979 +msgid "fetch --all does not take a repository argument" +msgstr "lệnh lấy về sử dụng tùy chọn --all sẽ không lấy đối số kho chứa" + +#: builtin/fetch.c:981 +msgid "fetch --all does not make sense with refspecs" +msgstr "lệnh lấy về fetch sử dụng tùy chọn --all không hợp lý với refspecs" + +#: builtin/fetch.c:992 +#, c-format +msgid "No such remote or remote group: %s" +msgstr "không có nhóm máy chủ hay máy chủ như thế: %s" + +#: builtin/fetch.c:1000 +msgid "Fetching a group and specifying refspecs does not make sense" +msgstr "Việc lấy về cả một nhóm và chỉ định refspecs không hợp lý" + +#: builtin/gc.c:63 +#, c-format +msgid "Invalid %s: '%s'" +msgstr "%s không hợp lệ: '%s'" + +#: builtin/gc.c:90 +#, c-format +msgid "insanely long object directory %.*s" +msgstr "thư mục đối tượng dài một cách điên rồ %.*s" + +#: builtin/gc.c:221 +#, c-format +msgid "Auto packing the repository for optimum performance.\n" +msgstr "Tự động đóng gói kho chứa để tối ưu hóa hiệu suất làm việc.\n" + +#: builtin/gc.c:224 +#, c-format +msgid "" +"Auto packing the repository for optimum performance. You may also\n" +"run \"git gc\" manually. See \"git help gc\" for more information.\n" +msgstr "" +"Tự động đóng gói kho chứa để tối ưu hóa hiệu suất làm việc.\n" +"chạy lệnh \"git gc\" một cách thủ công. Hãy xem \"git help gc\" để biết thêm chi tiết.\n" + +#: builtin/gc.c:251 +msgid "There are too many unreachable loose objects; run 'git prune' to remove them." +msgstr "Có quá nhiều đối tượng tự do không được dùng đến; hãy chạy lệnh 'git prune' để xóa bỏ chúng đi." + +#: builtin/grep.c:216 +#, c-format +msgid "grep: failed to create thread: %s" +msgstr "grep: gặp lỗi tạo tuyến (thread): %s" + +#: builtin/grep.c:402 +#, c-format +msgid "Failed to chdir: %s" +msgstr "Gặp lỗi với lệnh chdir: %s" + +#: builtin/grep.c:478 +#: builtin/grep.c:512 +#, c-format +msgid "unable to read tree (%s)" +msgstr "không thể đọc cây (%s)" + +#: builtin/grep.c:526 +#, c-format +msgid "unable to grep from object of type %s" +msgstr "không thể thực hiện lệnh grep (lọc tìm) từ đối tượng thuộc kiểu %s" + +#: builtin/grep.c:584 +#, c-format +msgid "switch `%c' expects a numerical value" +msgstr "chuyển đến `%c' mong chờ một giá trị bằng số" + +#: builtin/grep.c:601 +#, c-format +msgid "cannot open '%s'" +msgstr "không mở được '%s'" + +#: builtin/grep.c:885 +msgid "no pattern given." +msgstr "chưa chỉ ra mẫu." + +#: builtin/grep.c:899 +#, c-format +msgid "bad object %s" +msgstr "đối tượng sai %s" + +#: builtin/grep.c:940 +msgid "--open-files-in-pager only works on the worktree" +msgstr "--open-files-in-pager chỉ làm việc trên cây-làm-việc" + +#: builtin/grep.c:963 +msgid "--cached or --untracked cannot be used with --no-index." +msgstr "--cached hay --untracked không được sử dụng với --no-index." + +#: builtin/grep.c:968 +msgid "--no-index or --untracked cannot be used with revs." +msgstr "--no-index hay --untracked không được sử dụng cùng với các tùy chọn liên quan đến revs." + +#: builtin/grep.c:971 +msgid "--[no-]exclude-standard cannot be used for tracked contents." +msgstr "--[no-]exclude-standard không thể sử dụng cho nội dung lưu dấu vết." + +#: builtin/grep.c:979 +msgid "both --cached and trees are given." +msgstr "cả hai --cached và các cây phải được chỉ ra." + +#: builtin/help.c:59 +#, c-format +msgid "unrecognized help format '%s'" +msgstr "không nhận ra định dạng trợ giúp '%s'" + +#: builtin/help.c:87 +msgid "Failed to start emacsclient." +msgstr "Lỗi khởi chạy emacsclient." + +#: builtin/help.c:100 +msgid "Failed to parse emacsclient version." +msgstr "Gặp lỗi khi phân tích phiên bản emacsclient." + +#: builtin/help.c:108 +#, c-format +msgid "emacsclient version '%d' too old (< 22)." +msgstr "phiên bản của emacsclient '%d' quá cũ (< 22)." + +#: builtin/help.c:126 +#: builtin/help.c:154 +#: builtin/help.c:163 +#: builtin/help.c:171 +#, c-format +msgid "failed to exec '%s': %s" +msgstr "gặp lỗi khi thực thi '%s': %s" + +#: builtin/help.c:211 +#, c-format +msgid "" +"'%s': path for unsupported man viewer.\n" +"Please consider using 'man.<tool>.cmd' instead." +msgstr "" +"'%s': đường dẫn không hỗ trợ bộ trình chiếu man.\n" +"Hãy cân nhắc đến việc sử dụng 'man.<tool>.cmd' để thay thế." + +#: builtin/help.c:223 +#, c-format +msgid "" +"'%s': cmd for supported man viewer.\n" +"Please consider using 'man.<tool>.path' instead." +msgstr "" +"'%s': cmd (lệnh) hỗ trợ bộ trình chiếu man.\n" +"Hãy cân nhắc đến việc sử dụng 'man.<tool>.path' để thay thế." + +#: builtin/help.c:287 +msgid "The most commonly used git commands are:" +msgstr "Những lệnh git hay được sử dụng nhất là:" + +#: builtin/help.c:355 +#, c-format +msgid "'%s': unknown man viewer." +msgstr "'%s': không rõ chương trình xem man." + +#: builtin/help.c:372 +msgid "no man viewer handled the request" +msgstr "không có trình xem trợ giúp dạng manpage tiếp hợp với yêu cầu" + +#: builtin/help.c:380 +msgid "no info viewer handled the request" +msgstr "không có trình xem trợ giúp dạng info tiếp hợp với yêu cầu" + +#: builtin/help.c:391 +#, c-format +msgid "'%s': not a documentation directory." +msgstr "'%s': không phải là một thư mục tài liệu." + +#: builtin/help.c:432 +#: builtin/help.c:439 +#, c-format +msgid "usage: %s%s" +msgstr "cách sử dụng: %s%s" + +#: builtin/help.c:453 +#, c-format +msgid "`git %s' is aliased to `%s'" +msgstr "`git %s' được đặt bí danh thành `%s'" + +#: builtin/index-pack.c:169 +#, c-format +msgid "object type mismatch at %s" +msgstr "kiểu đối tượng không khớp tại %s" + +#: builtin/index-pack.c:189 +msgid "object of unexpected type" +msgstr "đối tượng của kiểu không mong đợi" + +#: builtin/index-pack.c:226 +#, c-format +msgid "cannot fill %d byte" +msgid_plural "cannot fill %d bytes" +msgstr[0] "không thể điền vào %d byte" +msgstr[1] "không thể điền vào %d byte" + +#: builtin/index-pack.c:236 +msgid "early EOF" +msgstr "vừa đúng lúc EOF" + +#: builtin/index-pack.c:237 +msgid "read error on input" +msgstr "lỗi đọc ở đầu vào" + +#: builtin/index-pack.c:249 +msgid "used more bytes than were available" +msgstr "sử dụng nhiều hơn số lượng byte mà nó sẵn có" + +#: builtin/index-pack.c:256 +msgid "pack too large for current definition of off_t" +msgstr "pack quá lớn so với định nghĩa hiện tại của kiểu off_t" + +#: builtin/index-pack.c:272 +#, c-format +msgid "unable to create '%s'" +msgstr "không thể tạo '%s'" + +#: builtin/index-pack.c:277 +#, c-format +msgid "cannot open packfile '%s'" +msgstr "không thể mở packfile '%s'" + +#: builtin/index-pack.c:291 +msgid "pack signature mismatch" +msgstr "chữ ký cho pack không khớp" + +#: builtin/index-pack.c:311 +#, c-format +msgid "pack has bad object at offset %lu: %s" +msgstr "pack có đối tượng sai khoảng bù (offset) %lu: %s" + +#: builtin/index-pack.c:405 +#, c-format +msgid "inflate returned %d" +msgstr "xả nén trả về %d" + +#: builtin/index-pack.c:450 +msgid "offset value overflow for delta base object" +msgstr "tràn giá trị khoảng bù cho đối tượng delta cơ sở" + +#: builtin/index-pack.c:458 +msgid "delta base offset is out of bound" +msgstr "khoảng bù cơ sở cho delta nằm ngoài phạm vi" + +#: builtin/index-pack.c:466 +#, c-format +msgid "unknown object type %d" +msgstr "không hiểu kiểu đối tượng %d" + +#: builtin/index-pack.c:495 +msgid "cannot pread pack file" +msgstr "không thể chạy hàm pread cho tập tin pack" + +#: builtin/index-pack.c:497 +#, c-format +msgid "premature end of pack file, %lu byte missing" +msgid_plural "premature end of pack file, %lu bytes missing" +msgstr[0] "tập tin pack bị kết thúc sớm, %lu byte bị thiếu" +msgstr[1] "tập tin pack bị kết thúc sớm, %lu byte bị thiếu" + +#: builtin/index-pack.c:510 +msgid "serious inflate inconsistency" +msgstr "sự mâu thuẫn xả nén nghiêm trọng" + +#: builtin/index-pack.c:583 +#, c-format +msgid "cannot read existing object %s" +msgstr "không thể đọc đối tượng đã tồn tại %s" + +#: builtin/index-pack.c:586 +#, c-format +msgid "SHA1 COLLISION FOUND WITH %s !" +msgstr "SỰ VA CHẠM SHA1 ĐÃ XẢY RA VỚI %s!" + +#: builtin/index-pack.c:598 +#, c-format +msgid "invalid blob object %s" +msgstr "đối tượng blob không hợp lệ %s" + +#: builtin/index-pack.c:610 +#, c-format +msgid "invalid %s" +msgstr "%s không hợp lệ" + +#: builtin/index-pack.c:612 +msgid "Error in object" +msgstr "Lỗi trong đối tượng" + +#: builtin/index-pack.c:614 +#, c-format +msgid "Not all child objects of %s are reachable" +msgstr "Không phải tất cả các đối tượng con của %s là có thể với tới được" + +#: builtin/index-pack.c:687 +#: builtin/index-pack.c:713 +msgid "failed to apply delta" +msgstr "gặp lỗi khi áp dụng delta" + +#: builtin/index-pack.c:850 +msgid "Receiving objects" +msgstr "Đang nhận về các đối tượng" + +#: builtin/index-pack.c:850 +msgid "Indexing objects" +msgstr "Các đối tượng bảng mục lục" + +#: builtin/index-pack.c:872 +msgid "pack is corrupted (SHA1 mismatch)" +msgstr "pack bị sai hỏng (SHA1 không khớp)" + +#: builtin/index-pack.c:877 +msgid "cannot fstat packfile" +msgstr "không thể fstat packfile" + +#: builtin/index-pack.c:880 +msgid "pack has junk at the end" +msgstr "pack có phần thừa ở cuối" + +#: builtin/index-pack.c:903 +msgid "Resolving deltas" +msgstr "Đang phân giải các delta" + +#: builtin/index-pack.c:954 +msgid "confusion beyond insanity" +msgstr "lộn xộn hơn cả điên rồ" + +#: builtin/index-pack.c:973 +#, c-format +msgid "pack has %d unresolved delta" +msgid_plural "pack has %d unresolved deltas" +msgstr[0] "pack có %d delta chưa được giải quyết" +msgstr[1] "pack có %d delta chưa được giải quyết" + +#: builtin/index-pack.c:998 +#, c-format +msgid "unable to deflate appended object (%d)" +msgstr "không thể xả đối tượng nối thêm (%d)" + +#: builtin/index-pack.c:1077 +#, c-format +msgid "local object %s is corrupt" +msgstr "đối tượng nội bộ %s bị hỏng" + +#: builtin/index-pack.c:1101 +msgid "error while closing pack file" +msgstr "gặp lỗi trong khi đóng tập tin pack" + +#: builtin/index-pack.c:1114 +#, c-format +msgid "cannot write keep file '%s'" +msgstr "không thể ghi tập tin giữ lại '%s'" + +#: builtin/index-pack.c:1122 +#, c-format +msgid "cannot close written keep file '%s'" +msgstr "không thể đóng tập tin giữ lại đã được ghi '%s'" + +#: builtin/index-pack.c:1135 +msgid "cannot store pack file" +msgstr "không thể lưu tập tin pack" + +#: builtin/index-pack.c:1146 +msgid "cannot store index file" +msgstr "không thể lưu trữ tập tin ghi mục lục" + +#: builtin/index-pack.c:1247 +#, c-format +msgid "Cannot open existing pack file '%s'" +msgstr "Không thể mở tập tin pack đã sẵn có '%s' " + +#: builtin/index-pack.c:1249 +#, c-format +msgid "Cannot open existing pack idx file for '%s'" +msgstr "Không thể mở tập tin 'pack idx' cho '%s'" + +#: builtin/index-pack.c:1296 +#, c-format +msgid "non delta: %d object" +msgid_plural "non delta: %d objects" +msgstr[0] "không delta: %d đối tượng" +msgstr[1] "không delta: %d đối tượng" + +#: builtin/index-pack.c:1303 +#, c-format +msgid "chain length = %d: %lu object" +msgid_plural "chain length = %d: %lu objects" +msgstr[0] "chiều dài xích = %d: %lu đối tượng" +msgstr[1] "chiều dài xích = %d: %lu đối tượng" + +#: builtin/index-pack.c:1330 +msgid "Cannot come back to cwd" +msgstr "Không thể quay lại cwd" + +#: builtin/index-pack.c:1374 +#: builtin/index-pack.c:1377 +#: builtin/index-pack.c:1389 +#: builtin/index-pack.c:1393 +#, c-format +msgid "bad %s" +msgstr "%s sai" + +#: builtin/index-pack.c:1407 +msgid "--fix-thin cannot be used without --stdin" +msgstr "--fix-thin không thể được dùng mà không có --stdin" + +#: builtin/index-pack.c:1411 +#: builtin/index-pack.c:1421 +#, c-format +msgid "packfile name '%s' does not end with '.pack'" +msgstr "tên tập tin packfile '%s' không được kết thúc bằng đuôi '.pack'" + +#: builtin/index-pack.c:1430 +msgid "--verify with no packfile name given" +msgstr "dùng tùy chọn --verify mà không đưa ra tên packfile" + +#: builtin/init-db.c:35 +#, c-format +msgid "Could not make %s writable by group" +msgstr "Không thể làm %s được ghi bởi nhóm" + +#: builtin/init-db.c:62 +#, c-format +msgid "insanely long template name %s" +msgstr "tên mẫu dài một cách điên rồ %s" + +#: builtin/init-db.c:67 +#, c-format +msgid "cannot stat '%s'" +msgstr "không thể lấy trạng thái (stat) về '%s'" + +#: builtin/init-db.c:73 +#, c-format +msgid "cannot stat template '%s'" +msgstr "không thể stat (lấy trạng thái về) mẫu '%s'" + +#: builtin/init-db.c:80 +#, c-format +msgid "cannot opendir '%s'" +msgstr "không thể opendir '%s'" + +#: builtin/init-db.c:97 +#, c-format +msgid "cannot readlink '%s'" +msgstr "không thể readlink '%s'" + +#: builtin/init-db.c:99 +#, c-format +msgid "insanely long symlink %s" +msgstr "liên kết tượng trưng dài một cách điên rồ %s" + +#: builtin/init-db.c:102 +#, c-format +msgid "cannot symlink '%s' '%s'" +msgstr "không thể tạo liên kết tượng trưng (symlink) '%s' '%s'" + +#: builtin/init-db.c:106 +#, c-format +msgid "cannot copy '%s' to '%s'" +msgstr "không thể sao chép %s sang %s" + +#: builtin/init-db.c:110 +#, c-format +msgid "ignoring template %s" +msgstr "đang lờ đi mẫu %s" + +#: builtin/init-db.c:133 +#, c-format +msgid "insanely long template path %s" +msgstr "đường dẫn mẫu dài một cách điên rồ %s" + +#: builtin/init-db.c:141 +#, c-format +msgid "templates not found %s" +msgstr "các mẫu không được tìm thấy %s" + +#: builtin/init-db.c:154 +#, c-format +msgid "not copying templates of a wrong format version %d from '%s'" +msgstr "không sao chép các mẫu của phiên bản sai định dạng %d từ '%s'" + +#: builtin/init-db.c:192 +#, c-format +msgid "insane git directory %s" +msgstr "thư mục git điên rồ %s" + +#: builtin/init-db.c:322 +#: builtin/init-db.c:325 +#, c-format +msgid "%s already exists" +msgstr "%s đã tồn tại rồi" + +#: builtin/init-db.c:354 +#, c-format +msgid "unable to handle file type %d" +msgstr "không thể handle tệp tin kiểu %d" + +#: builtin/init-db.c:357 +#, c-format +msgid "unable to move %s to %s" +msgstr "không di chuyển được %s vào %s" + +#: builtin/init-db.c:362 +#, c-format +msgid "Could not create git link %s" +msgstr "Không thể tạo liên kết git '%s'" + +#. +#. * TRANSLATORS: The first '%s' is either "Reinitialized +#. * existing" or "Initialized empty", the second " shared" or +#. * "", and the last '%s%s' is the verbatim directory name. +#. +#: builtin/init-db.c:419 +#, c-format +msgid "%s%s Git repository in %s%s\n" +msgstr "%s%s kho Git trong %s%s\n" + +#: builtin/init-db.c:420 +msgid "Reinitialized existing" +msgstr "Khởi tạo lại đã sẵn có rồi" + +#: builtin/init-db.c:420 +msgid "Initialized empty" +msgstr "Khởi tạo trống rỗng" + +#: builtin/init-db.c:421 +msgid " shared" +msgstr " đã chia sẻ" + +#: builtin/init-db.c:440 +msgid "cannot tell cwd" +msgstr "không nói chuyện được với lệnh cwd" + +#: builtin/init-db.c:521 +#: builtin/init-db.c:528 +#, c-format +msgid "cannot mkdir %s" +msgstr "không thể mkdir (tạo thư mục): %s" + +#: builtin/init-db.c:532 +#, c-format +msgid "cannot chdir to %s" +msgstr "không thể chdir (chuyển đổi thư mục) sang %s" + +#: builtin/init-db.c:554 +#, c-format +msgid "%s (or --work-tree=<directory>) not allowed without specifying %s (or --git-dir=<directory>)" +msgstr "%s (hoặc --work-tree=<thư-mục>) không cho phép không chỉ định %s (hoặc --git-dir=<thư-mục>)" + +#: builtin/init-db.c:578 +msgid "Cannot access current working directory" +msgstr "Không thể truy cập thư mục làm việc hiện hành" + +#: builtin/init-db.c:585 +#, c-format +msgid "Cannot access work tree '%s'" +msgstr "không thể truy cập cây (tree) làm việc '%s'" + +#: builtin/log.c:188 +#, c-format +msgid "Final output: %d %s\n" +msgstr "Kết xuất cuối cùng: %d %s\n" + +#: builtin/log.c:401 +#: builtin/log.c:489 +#, c-format +msgid "Could not read object %s" +msgstr "Không thể đọc đối tượng %s" + +#: builtin/log.c:513 +#, c-format +msgid "Unknown type: %d" +msgstr "Không nhận ra kiểu: %d" + +#: builtin/log.c:602 +msgid "format.headers without value" +msgstr "format.headers không có giá trị cụ thể" + +#: builtin/log.c:676 +msgid "name of output directory is too long" +msgstr "tên của thư mục kết xuất quá dài" + +#: builtin/log.c:687 +#, c-format +msgid "Cannot open patch file %s" +msgstr "Không thể mở tập tin miếng vá: %s" + +#: builtin/log.c:701 +msgid "Need exactly one range." +msgstr "Cần chính xác một vùng." + +#: builtin/log.c:709 +msgid "Not a range." +msgstr "Không phải là một vùng." + +#: builtin/log.c:786 +msgid "Cover letter needs email format" +msgstr "'Cover letter' cần cho định dạng thư" + +#: builtin/log.c:859 +#, c-format +msgid "insane in-reply-to: %s" +msgstr "in-reply-to điên rồ: %s" + +#: builtin/log.c:932 +msgid "Two output directories?" +msgstr "Hai thư mục kết xuất?" + +#: builtin/log.c:1153 +#, c-format +msgid "bogus committer info %s" +msgstr "thông tin người chuyển giao không có thực %s" + +#: builtin/log.c:1198 +msgid "-n and -k are mutually exclusive." +msgstr "-n và -k loại từ lẫn nhau." + +#: builtin/log.c:1200 +msgid "--subject-prefix and -k are mutually exclusive." +msgstr "--subject-prefix và -k xung khắc nhau." + +#: builtin/log.c:1208 +msgid "--name-only does not make sense" +msgstr "--name-only không hợp lý" + +#: builtin/log.c:1210 +msgid "--name-status does not make sense" +msgstr "--name-status không hợp lý" + +#: builtin/log.c:1212 +msgid "--check does not make sense" +msgstr "--check không hợp lý" + +#: builtin/log.c:1235 +msgid "standard output, or directory, which one?" +msgstr "đầu ra chuẩn, hay thư mục, chọn cái nào?" + +#: builtin/log.c:1237 +#, c-format +msgid "Could not create directory '%s'" +msgstr "Không thể tạo thư mục '%s'" + +#: builtin/log.c:1390 +msgid "Failed to create output files" +msgstr "Gặp lỗi khi tạo các tập tin kết xuất" + +#: builtin/log.c:1494 +#, c-format +msgid "Could not find a tracked remote branch, please specify <upstream> manually.\n" +msgstr "Không tìm thấy nhánh mạng bị theo vết, hãy chỉ định <dòng-ngược> một cách thủ công.\n" + +#: builtin/log.c:1510 +#: builtin/log.c:1512 +#: builtin/log.c:1524 +#, c-format +msgid "Unknown commit %s" +msgstr "Không hiểu lần chuyển giao (commit) %s" + +#: builtin/merge.c:90 +msgid "switch `m' requires a value" +msgstr "switch `m' yêu cầu một giá trị" + +#: builtin/merge.c:127 +#, c-format +msgid "Could not find merge strategy '%s'.\n" +msgstr "Không tìm thấy chiến lược hòa trộn '%s'.\n" + +#: builtin/merge.c:128 +#, c-format +msgid "Available strategies are:" +msgstr "Các chiến lược sẵn sàng là:" + +#: builtin/merge.c:133 +#, c-format +msgid "Available custom strategies are:" +msgstr "Các chiến lược tùy chỉnh sẵn sàng là:" + +#: builtin/merge.c:240 +msgid "could not run stash." +msgstr "không thể chạy stash." + +#: builtin/merge.c:245 +msgid "stash failed" +msgstr "stash gặp lỗi" + +#: builtin/merge.c:250 +#, c-format +msgid "not a valid object: %s" +msgstr "không phải là một đối tượng hợp lệ: %s" + +#: builtin/merge.c:269 +#: builtin/merge.c:286 +msgid "read-tree failed" +msgstr "read-tree gặp lỗi" + +#: builtin/merge.c:316 +msgid " (nothing to squash)" +msgstr " (không có ghì để squash)" + +#: builtin/merge.c:329 +#, c-format +msgid "Squash commit -- not updating HEAD\n" +msgstr "Squash commit -- không cập nhật HEAD\n" + +#: builtin/merge.c:361 +msgid "Writing SQUASH_MSG" +msgstr "Đang ghi SQUASH_MSG" + +#: builtin/merge.c:363 +msgid "Finishing SQUASH_MSG" +msgstr "Hoàn thành SQUASH_MSG" + +#: builtin/merge.c:386 +#, c-format +msgid "No merge message -- not updating HEAD\n" +msgstr "Không thông điệp hòa trộn -- không cập nhật HEAD\n" + +#: builtin/merge.c:437 +#, c-format +msgid "'%s' does not point to a commit" +msgstr "'%s' không chỉ đến một lần chuyển giao (commit) nào cả" + +#: builtin/merge.c:536 +#, c-format +msgid "Bad branch.%s.mergeoptions string: %s" +msgstr "Chuỗi branch.%s.mergeoptions sai: %s" + +#: builtin/merge.c:629 +msgid "git write-tree failed to write a tree" +msgstr "lệnh git write-tree gặp lỗi khi ghi một cây" + +#: builtin/merge.c:679 +msgid "failed to read the cache" +msgstr "gặp lỗi khi đọc bộ nhớ tạm" + +#: builtin/merge.c:697 +msgid "Unable to write index." +msgstr "Không thể ghi bảng mục lục" + +#: builtin/merge.c:710 +msgid "Not handling anything other than two heads merge." +msgstr "Không cầm nắm gì ngoài hai head hòa trộn" + +#: builtin/merge.c:724 +#, c-format +msgid "Unknown option for merge-recursive: -X%s" +msgstr "Không hiểu tùy chọn cho merge-recursive: -X%s" + +#: builtin/merge.c:738 +#, c-format +msgid "unable to write %s" +msgstr "không ghi được %s" + +#: builtin/merge.c:877 +#, c-format +msgid "Could not read from '%s'" +msgstr "Không thể đọc từ '%s'" + +#: builtin/merge.c:886 +#, c-format +msgid "Not committing merge; use 'git commit' to complete the merge.\n" +msgstr "Vẫn chưa hòa trộn các lần chuyển giao (commit); sử dụng lệnh 'git commit' để hoàn tất việc hòa trộn.\n" + +#: builtin/merge.c:892 +msgid "" +"Please enter a commit message to explain why this merge is necessary,\n" +"especially if it merges an updated upstream into a topic branch.\n" +"\n" +"Lines starting with '#' will be ignored, and an empty message aborts\n" +"the commit.\n" +msgstr "" +"Hãy nhập vào các thông tin để giải thích tại sao sự hòa trộn này là cần thiết,\n" +"đặc biệt là khi nó hòa trộn dòng ngược đã cập nhật vào trong một nhánh topic.\n" +"\n" +"Những dòng được bắt đầu bằng '#' sẽ được bỏ qua, và phần chú thích này nếu rỗng\n" +"sẽ làm hủy bỏ lần chuyển giao (commit).\n" + +#: builtin/merge.c:916 +msgid "Empty commit message." +msgstr "Chú thích của lần commit (chuyển giao) bị trống rỗng." + +#: builtin/merge.c:928 +#, c-format +msgid "Wonderful.\n" +msgstr "Thần kỳ.\n" + +#: builtin/merge.c:993 +#, c-format +msgid "Automatic merge failed; fix conflicts and then commit the result.\n" +msgstr "Việc tự động hòa trộn gặp lỗi; hãy sửa các xung đột sau đó chuyển giao (commit) kết quả.\n" + +#: builtin/merge.c:1009 +#, c-format +msgid "'%s' is not a commit" +msgstr "%s không phải là một lần commit (chuyển giao)" + +#: builtin/merge.c:1050 +msgid "No current branch." +msgstr "không phải nhánh hiện hành" + +#: builtin/merge.c:1052 +msgid "No remote for the current branch." +msgstr "Không có máy chủ cho nhánh hiện hành." + +#: builtin/merge.c:1054 +msgid "No default upstream defined for the current branch." +msgstr "Không có dòng ngược mặc định được định nghĩa cho nhánh hiện hành." + +#: builtin/merge.c:1059 +#, c-format +msgid "No remote tracking branch for %s from %s" +msgstr "Không nhánh mạng theo vết cho %s từ %s" + +#: builtin/merge.c:1146 +#: builtin/merge.c:1303 +#, c-format +msgid "%s - not something we can merge" +msgstr "%s - không phải là một số thứ chúng tôi có thể hòa trộn" + +#: builtin/merge.c:1214 +msgid "There is no merge to abort (MERGE_HEAD missing)." +msgstr "Ở đây không có lần hòa trộn nào được hủy bỏ giữa chừng cả (không thấy MERGE_HEAD)." + +#: builtin/merge.c:1230 +#: git-pull.sh:31 +msgid "" +"You have not concluded your merge (MERGE_HEAD exists).\n" +"Please, commit your changes before you can merge." +msgstr "" +"Bạn chưa kết thúc việc hòa trộng (MERGE_HEAD vẫn tồn tại).\n" +"Hãy chuyển giao (commit) các thay đổi trước khi bạn có thể hòa trộn." + +#: builtin/merge.c:1233 +#: git-pull.sh:34 +msgid "You have not concluded your merge (MERGE_HEAD exists)." +msgstr "Bạn chưa kết thúc việc hòa trộng (MERGE_HEAD vẫn tồn tại)." + +#: builtin/merge.c:1237 +msgid "" +"You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists).\n" +"Please, commit your changes before you can merge." +msgstr "" +"Bạn chưa kết thúc việc cherry-pick (CHERRY_PICK_HEAD vẫn tồn tại).\n" +"Hãy chuyển giao (commit) các thay đổi trước khi bạn có thể hòa trộn." + +#: builtin/merge.c:1240 +msgid "You have not concluded your cherry-pick (CHERRY_PICK_HEAD exists)." +msgstr "Bạn chưa kết thúc việc cherry-pick (CHERRY_PICK_HEAD vẫn tồn tại)." + +#: builtin/merge.c:1249 +msgid "You cannot combine --squash with --no-ff." +msgstr "Bạn không thể tổ hợp --squash với --no-ff." + +#: builtin/merge.c:1254 +msgid "You cannot combine --no-ff with --ff-only." +msgstr "Bạn không thể tổ hợp --no-ff với --ff-only." + +#: builtin/merge.c:1261 +msgid "No commit specified and merge.defaultToUpstream not set." +msgstr "Không chỉ ra lần chuyển giao (commit) và merge.defaultToUpstream chưa được đặt." + +#: builtin/merge.c:1293 +msgid "Can merge only exactly one commit into empty head" +msgstr "Không thể hòa trộn một cách đúng đắn một lần chuyển giao (commit) vào một head rỗng" + +#: builtin/merge.c:1296 +msgid "Squash commit into empty head not supported yet" +msgstr "Squash commit vào một head trống rỗng vẫn chưa được hỗ trợ" + +#: builtin/merge.c:1298 +msgid "Non-fast-forward commit does not make sense into an empty head" +msgstr "Chuyển giao (commit) không-fast-forward không hợp lý ở trong một head trống rỗng" + +#: builtin/merge.c:1413 +#, c-format +msgid "Updating %s..%s\n" +msgstr "Đang cập nhật %s..%s\n" + +#: builtin/merge.c:1451 +#, c-format +msgid "Trying really trivial in-index merge...\n" +msgstr "Đang thử hòa trộn kiểu 'trivial in-index'...\n" + +#: builtin/merge.c:1458 +#, c-format +msgid "Nope.\n" +msgstr "Không.\n" + +#: builtin/merge.c:1490 +msgid "Not possible to fast-forward, aborting." +msgstr "Thực hiện lệnh fast-forward là không thể được, đang bỏ qua." + +#: builtin/merge.c:1513 +#: builtin/merge.c:1592 +#, c-format +msgid "Rewinding the tree to pristine...\n" +msgstr "Đang tua lại cây thành thời xa xưa...\n" + +#: builtin/merge.c:1517 +#, c-format +msgid "Trying merge strategy %s...\n" +msgstr "Đang thử chiến lược hòa trộn %s...\n" + +#: builtin/merge.c:1583 +#, c-format +msgid "No merge strategy handled the merge.\n" +msgstr "Không có chiến lược hòa trộn nào được nắm giữ (handle) sự hòa trộn.\n" + +#: builtin/merge.c:1585 +#, c-format +msgid "Merge with strategy %s failed.\n" +msgstr "Hòa trộn với chiến lược %s gặp lỗi.\n" + +#: builtin/merge.c:1594 +#, c-format +msgid "Using the %s to prepare resolving by hand.\n" +msgstr "Sử dụng %s để chuẩn bị giải quyết bằng tay.\n" + +#: builtin/merge.c:1606 +#, c-format +msgid "Automatic merge went well; stopped before committing as requested\n" +msgstr "Hòa trộn tự động đã trở nên tốt; bị dừng trước khi việc chuyển giao được yêu cầu\n" + +#: builtin/mv.c:108 +#, c-format +msgid "Checking rename of '%s' to '%s'\n" +msgstr "Đang kiểm tra việc đổi tên của '%s' thành '%s'\n" + +#: builtin/mv.c:112 +msgid "bad source" +msgstr "nguồn sai" + +#: builtin/mv.c:115 +msgid "can not move directory into itself" +msgstr "không thể di chuyển một thư mục vào trong chính nó được" + +#: builtin/mv.c:118 +msgid "cannot move directory over file" +msgstr "không di chuyển được thư mục thông qua tập tin" + +#: builtin/mv.c:128 +#, c-format +msgid "Huh? %.*s is in index?" +msgstr "Hả? %.*s trong bảng mục lục à?" + +#: builtin/mv.c:140 +msgid "source directory is empty" +msgstr "thư mục nguồn là trống rỗng" + +#: builtin/mv.c:171 +msgid "not under version control" +msgstr "không nằm dưới sự quản lý mã nguồn" + +#: builtin/mv.c:173 +msgid "destination exists" +msgstr "đích đã tồn tại sẵn rồi" + +#: builtin/mv.c:181 +#, c-format +msgid "overwriting '%s'" +msgstr "đang ghi đè lên '%s'" + +#: builtin/mv.c:184 +msgid "Cannot overwrite" +msgstr "Không thể ghi chèn" + +#: builtin/mv.c:187 +msgid "multiple sources for the same target" +msgstr "Nhiều nguồn cho cùng một đích" + +#: builtin/mv.c:202 +#, c-format +msgid "%s, source=%s, destination=%s" +msgstr "%s, nguồn=%s, đích=%s" + +#: builtin/mv.c:212 +#, c-format +msgid "Renaming %s to %s\n" +msgstr "Đang thay đổi tên %s thành %s\n" + +#: builtin/mv.c:215 +#: builtin/remote.c:731 +#, c-format +msgid "renaming '%s' failed" +msgstr "đổi tên %s gặp lỗi" + +#: builtin/notes.c:139 +#, c-format +msgid "unable to start 'show' for object '%s'" +msgstr "không thể khởi chạy 'show' cho đối tượng '%s'" + +#: builtin/notes.c:145 +msgid "can't fdopen 'show' output fd" +msgstr "không thể fdopen 'show' (lệnh hiển thị) mô tả tập tin (fd) kết xuất" + +#: builtin/notes.c:155 +#, c-format +msgid "failed to close pipe to 'show' for object '%s'" +msgstr "gặp lỗi khi đóng đường ống cho lệnh 'show' cho đối tượng '%s'" + +#: builtin/notes.c:158 +#, c-format +msgid "failed to finish 'show' for object '%s'" +msgstr "gặp lỗi khi hoàn thành 'show' cho đối tượng '%s'" + +#: builtin/notes.c:175 +#: builtin/tag.c:347 +#, c-format +msgid "could not create file '%s'" +msgstr "không thể tạo tập tin '%s'" + +#: builtin/notes.c:189 +msgid "Please supply the note contents using either -m or -F option" +msgstr "Xin hãy áp dụng nội dung của ghi chú sử dụng hoặc là tùy chọn -m hoặc là -F" + +#: builtin/notes.c:210 +#: builtin/notes.c:973 +#, c-format +msgid "Removing note for object %s\n" +msgstr "Đang gỡ bỏ ghi chú (note) cho đối tượng %s\n" + +#: builtin/notes.c:215 +msgid "unable to write note object" +msgstr "không thể ghi đối tượng ghi chú (note)" + +#: builtin/notes.c:217 +#, c-format +msgid "The note contents has been left in %s" +msgstr "Nội dung ghi chú còn lại %s" + +#: builtin/notes.c:251 +#: builtin/tag.c:542 +#, c-format +msgid "cannot read '%s'" +msgstr "không thể đọc '%s'" + +#: builtin/notes.c:253 +#: builtin/tag.c:545 +#, c-format +msgid "could not open or read '%s'" +msgstr "không thể mở để đọc hay ghi '%s'" + +#: builtin/notes.c:272 +#: builtin/notes.c:445 +#: builtin/notes.c:447 +#: builtin/notes.c:507 +#: builtin/notes.c:561 +#: builtin/notes.c:644 +#: builtin/notes.c:649 +#: builtin/notes.c:724 +#: builtin/notes.c:766 +#: builtin/notes.c:968 +#: builtin/reset.c:293 +#: builtin/tag.c:558 +#, c-format +msgid "Failed to resolve '%s' as a valid ref." +msgstr "Gặp lỗi khi giải quyết '%s' như là một tham chiếu (ref) hợp lệ." + +#: builtin/notes.c:275 +#, c-format +msgid "Failed to read object '%s'." +msgstr "Gặp lỗi khi đọc đối tượng '%s'." + +#: builtin/notes.c:299 +msgid "Cannot commit uninitialized/unreferenced notes tree" +msgstr "Không thể chuyển giao (commit) chưa được khởi tạo hoặc không được tham chiếu cây ghi chú" + +#: builtin/notes.c:340 +#, c-format +msgid "Bad notes.rewriteMode value: '%s'" +msgstr "Giá trị notes.rewriteMode sai: '%s'" + +#: builtin/notes.c:350 +#, c-format +msgid "Refusing to rewrite notes in %s (outside of refs/notes/)" +msgstr "Từ chối ghi đè ghi chú trong %s (nằm ngoài của refs/notes/)" + +#. TRANSLATORS: The first %s is the name of the +#. environment variable, the second %s is its value +#: builtin/notes.c:377 +#, c-format +msgid "Bad %s value: '%s'" +msgstr "Giá trị %s sai: '%s'" + +#: builtin/notes.c:441 +#, c-format +msgid "Malformed input line: '%s'." +msgstr "Dòng nhập vào dị hình: '%s'." + +#: builtin/notes.c:456 +#, c-format +msgid "Failed to copy notes from '%s' to '%s'" +msgstr "Gặp lỗi khi sao chép ghi chú (note) từ '%s' tới '%s'" + +#: builtin/notes.c:500 +#: builtin/notes.c:554 +#: builtin/notes.c:627 +#: builtin/notes.c:639 +#: builtin/notes.c:712 +#: builtin/notes.c:759 +#: builtin/notes.c:1033 +msgid "too many parameters" +msgstr "quá nhiều đối số" + +#: builtin/notes.c:513 +#: builtin/notes.c:772 +#, c-format +msgid "No note found for object %s." +msgstr "không ghi chú được tìm thấy cho đối tượng %s." + +#: builtin/notes.c:580 +#, c-format +msgid "Cannot add notes. Found existing notes for object %s. Use '-f' to overwrite existing notes" +msgstr "Không thể thêm các ghi chú. Đã tìm thấy các ghi chú đã sẵn có cho đối tượng %s. Sử dụng tùy chọn '-f' để ghi đè lên các ghi chú cũ" + +#: builtin/notes.c:585 +#: builtin/notes.c:662 +#, c-format +msgid "Overwriting existing notes for object %s\n" +msgstr "Đang ghi đè lên ghi chú cũ cho đối tượng %s\n" + +#: builtin/notes.c:635 +msgid "too few parameters" +msgstr "quá ít đối số" + +#: builtin/notes.c:656 +#, c-format +msgid "Cannot copy notes. Found existing notes for object %s. Use '-f' to overwrite existing notes" +msgstr "Không thể sao chép các ghi chú. Đã tìm thấy các ghi chú đã sẵn có cho đối tượng %s. Sử dụng tùy chọn '-f' để ghi đè lên các ghi chú cũ" + +#: builtin/notes.c:668 +#, c-format +msgid "Missing notes on source object %s. Cannot copy." +msgstr "Thiếu ghi chú trên đối tượng nguốn %s. Không thể sao chép." + +#: builtin/notes.c:717 +#, c-format +msgid "" +"The -m/-F/-c/-C options have been deprecated for the 'edit' subcommand.\n" +"Please use 'git notes add -f -m/-F/-c/-C' instead.\n" +msgstr "" +"Các tùy chọn -m/-F/-c/-C đã cổ không còn dùng nữa cho lệnh con 'edit'.\n" +"Xin hãy sử dụng lệnh sau để thay thế: 'git notes add -f -m/-F/-c/-C'.\n" + +#: builtin/notes.c:971 +#, c-format +msgid "Object %s has no note\n" +msgstr "Đối tượng %s không có ghi chú (note)\n" + +#: builtin/notes.c:1103 +#: builtin/remote.c:1598 +#, c-format +msgid "Unknown subcommand: %s" +msgstr "Không hiểu câu lệnh con: %s" + +#: builtin/pack-objects.c:2337 +#, c-format +msgid "unsupported index version %s" +msgstr "phiên bản mục lục không được hỗ trợ %s" + +#: builtin/pack-objects.c:2341 +#, c-format +msgid "bad index version '%s'" +msgstr "phiên bản mục lục sai '%s'" + +#: builtin/pack-objects.c:2364 +#, c-format +msgid "option %s does not accept negative form" +msgstr "tùy chọn %s không chấp nhận dạng thức âm" + +#: builtin/pack-objects.c:2368 +#, c-format +msgid "unable to parse value '%s' for option %s" +msgstr "không thể phân tích giá trị '%s' cho tùy chọn %s" + +#: builtin/push.c:45 +msgid "tag shorthand without <tag>" +msgstr "dùng tốc ký tag không có <thẻ>" + +#: builtin/push.c:64 +msgid "--delete only accepts plain target ref names" +msgstr "--delete chỉ chấp nhận các tên tham chiếu (ref) dạng thường" + +#: builtin/push.c:99 +msgid "" +"\n" +"To choose either option permanently, see push.default in 'git help config'." +msgstr "" +"\n" +"Để chọn mỗi tùy chọn một cách cố định, xem push.default trong 'git help config'." + +#: builtin/push.c:102 +#, c-format +msgid "" +"The upstream branch of your current branch does not match\n" +"the name of your current branch. To push to the upstream branch\n" +"on the remote, use\n" +"\n" +" git push %s HEAD:%s\n" +"\n" +"To push to the branch of the same name on the remote, use\n" +"\n" +" git push %s %s\n" +"%s" +msgstr "" +"Nhánh dòng ngược (upstream) của nhánh hiện tại của bạn không khớp\n" +"với tên của nhánh hiện tại của bạn. Để push đến nhánh dòng ngược\n" +"trên máy chủ, sử dụng\n" +"\n" +" git push %s HEAD:%s\n" +"\n" +"Để push tới nhánh cùng tên trên máy chủ, sử dụng\n" +"\n" +" git push %s %s\n" +"%s" + +#: builtin/push.c:121 +#, c-format +msgid "" +"You are not currently on a branch.\n" +"To push the history leading to the current (detached HEAD)\n" +"state now, use\n" +"\n" +" git push %s HEAD:<name-of-remote-branch>\n" +msgstr "" +"Bạn hiện nay không ở một nhánh.\n" +"Để push lịch sử hướng tới trạng thái hiện hành (HEAD đã bị tách rời)\n" +"ngay bây giờ, sử dụng\n" +"\n" +" git push %s HEAD:<tên-của-nhánh-máy-chủ>\n" + +#: builtin/push.c:128 +#, c-format +msgid "" +"The current branch %s has no upstream branch.\n" +"To push the current branch and set the remote as upstream, use\n" +"\n" +" git push --set-upstream %s %s\n" +msgstr "" +"Nhánh hiện tại %s không có nhánh dòng ngược (upstream) nào.\n" +"Để push (đẩy lên) nhánh hiện tại và đặt máy chủ như là dòng ngược (upstream), sử dụng\n" +"\n" +" git push --set-upstream %s %s\n" + +#: builtin/push.c:136 +#, c-format +msgid "The current branch %s has multiple upstream branches, refusing to push." +msgstr "Nhánh hiện tại %s có đa nhánh dòng ngược (upstream), từ chối push." + +#: builtin/push.c:139 +#, c-format +msgid "" +"You are pushing to remote '%s', which is not the upstream of\n" +"your current branch '%s', without telling me what to push\n" +"to update which remote branch." +msgstr "" +"Bạn đang push (đẩy lên) máy chủ '%s', mà nó không phải là dòng ngược (upstream) của\n" +"nhánh hiện tại '%s' của bạn, mà không báo cho tôi biết là cái gì được push\n" +"để cập nhật nhánh máy chủ nào." + +#: builtin/push.c:174 +msgid "You didn't specify any refspecs to push, and push.default is \"nothing\"." +msgstr "Bạn đã không chỉ ra một refspecs nào để push, và push.default là \"không là gì cả\"." + +#: builtin/push.c:181 +msgid "" +"Updates were rejected because the tip of your current branch is behind\n" +"its remote counterpart. Merge the remote changes (e.g. 'git pull')\n" +"before pushing again.\n" +"See the 'Note about fast-forwards' in 'git push --help' for details." +msgstr "" +"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau bộ\n" +"phận tương ứng của máy chủ. Hòa trộn với các thay đổi từ máy chủ (v.d. 'git pull')\n" +"trước khi lại push lần nữa.\n" +"Xem trong phần 'Note about fast-forwards' trong nội dung từ lệnh 'git push --help'." + +#: builtin/push.c:187 +msgid "" +"Updates were rejected because a pushed branch tip is behind its remote\n" +"counterpart. If you did not intend to push that branch, you may want to\n" +"specify branches to push or set the 'push.default' configuration\n" +"variable to 'current' or 'upstream' to push only the current branch." +msgstr "" +"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau bộ\n" +"phận tương ứng của máy chủ. Nếu bạn không có ý định push nhánh đó, bạn có lẽ muốn\n" +"chỉ định các nhánh để push hoặt là đặt nội dung cho biến cấu hình 'push.default'\n" +"thành 'current' hoặc 'upstream' để push chỉ nhánh hiện hành mà thôi." + +#: builtin/push.c:193 +msgid "" +"Updates were rejected because a pushed branch tip is behind its remote\n" +"counterpart. Check out this branch and merge the remote changes\n" +"(e.g. 'git pull') before pushing again.\n" +"See the 'Note about fast-forwards' in 'git push --help' for details." +msgstr "" +"Việc cập nhật bị từ chối bởi vì đầu mút của nhánh được push nằm đằng sau bộ\n" +"phận tương ứng của máy chủ. Checkou nhánh này và hòa trộn với các thay đổi từ máy chủ\n" +"(v.d. 'git pull') trước khi lại push lần nữa.\n" +"Xem trong phần 'Note about fast-forwards' trong nội dung từ lệnh 'git push --help'." + +#: builtin/push.c:233 +#, c-format +msgid "Pushing to %s\n" +msgstr "Đang push (đẩy) lên %s\n" + +#: builtin/push.c:237 +#, c-format +msgid "failed to push some refs to '%s'" +msgstr "gặp lỗi khi push (đẩy lên) một số tham chiếu (ref) đến '%s'" + +#: builtin/push.c:269 +#, c-format +msgid "bad repository '%s'" +msgstr "repository (kho) sai '%s'" + +#: builtin/push.c:270 +msgid "" +"No configured push destination.\n" +"Either specify the URL from the command-line or configure a remote repository using\n" +"\n" +" git remote add <name> <url>\n" +"\n" +"and then push using the remote name\n" +"\n" +" git push <name>\n" +msgstr "" +"Chưa cấu hình đích để push (đẩy lên).\n" +"Hoặc là chỉ ra URL từ dòng lệnh hoặc là cấu hình một kho máy chủ sử dụng\n" +"\n" +" git remote add <tên> <url>\n" +"\n" +"và sau đó push sử dụng tên máy chủ\n" +"\n" +" git push <tên>\n" + +#: builtin/push.c:285 +msgid "--all and --tags are incompatible" +msgstr "--all và --tags xung khắc nhau" + +#: builtin/push.c:286 +msgid "--all can't be combined with refspecs" +msgstr "--all không thể được tổ hợp cùng với refspecs" + +#: builtin/push.c:291 +msgid "--mirror and --tags are incompatible" +msgstr "--mirror và --tags xung khắc nhau" + +#: builtin/push.c:292 +msgid "--mirror can't be combined with refspecs" +msgstr "--mirror không thể được tổ hợp cùng với refspecs" + +#: builtin/push.c:297 +msgid "--all and --mirror are incompatible" +msgstr "--all và --mirror xung khắc nhau" + +#: builtin/push.c:385 +msgid "--delete is incompatible with --all, --mirror and --tags" +msgstr "--delete là xung khắc với các tùy chọn --all, --mirror và --tags" + +#: builtin/push.c:387 +msgid "--delete doesn't make sense without any refs" +msgstr "--delete không hợp lý nếu không có bất kỳ tham chiếu (refs) nào" + +#: builtin/remote.c:98 +#, c-format +msgid "Updating %s" +msgstr "Đang cập nhật %s" + +#: builtin/remote.c:130 +msgid "" +"--mirror is dangerous and deprecated; please\n" +"\t use --mirror=fetch or --mirror=push instead" +msgstr "" +"--mirror nguy hiểm và không dùng nữa; xin hãy\n" +"\t sử dụng tùy chọn --mirror=fetch hoặc --mirror=push để thay thế" + +#: builtin/remote.c:147 +#, c-format +msgid "unknown mirror argument: %s" +msgstr "không hiểu tham số máy bản sao (mirror): %s" + +#: builtin/remote.c:185 +msgid "specifying a master branch makes no sense with --mirror" +msgstr "đang chỉ định một nhánh master không phân biệt HOA/thường với tùy chọn --mirror" + +#: builtin/remote.c:187 +msgid "specifying branches to track makes sense only with fetch mirrors" +msgstr "chỉ định những nhánh để theo vết chỉ hợp lý với các 'fetch mirror'" + +#: builtin/remote.c:195 +#: builtin/remote.c:646 +#, c-format +msgid "remote %s already exists." +msgstr "máy chủ %s đã tồn tại rồi." + +#: builtin/remote.c:199 +#: builtin/remote.c:650 +#, c-format +msgid "'%s' is not a valid remote name" +msgstr "'%s' không phải tên máy chủ hợp lệ" + +#: builtin/remote.c:243 +#, c-format +msgid "Could not setup master '%s'" +msgstr "Không thể cài đặt nhánh master '%s'" + +#: builtin/remote.c:299 +#, c-format +msgid "more than one %s" +msgstr "nhiều hơn một %s" + +#: builtin/remote.c:339 +#, c-format +msgid "Could not get fetch map for refspec %s" +msgstr "Không thể lấy ánh xạ (map) fetch cho refspec %s" + +#: builtin/remote.c:440 +#: builtin/remote.c:448 +msgid "(matching)" +msgstr "(mẫu)" + +#: builtin/remote.c:452 +msgid "(delete)" +msgstr "(xoá)" + +#: builtin/remote.c:595 +#: builtin/remote.c:601 +#: builtin/remote.c:607 +#, c-format +msgid "Could not append '%s' to '%s'" +msgstr "Không thể nối thêm '%s' vào '%s'" + +#: builtin/remote.c:639 +#: builtin/remote.c:792 +#: builtin/remote.c:890 +#, c-format +msgid "No such remote: %s" +msgstr "Không có máy chủ nào như thế: %s" + +#: builtin/remote.c:656 +#, c-format +msgid "Could not rename config section '%s' to '%s'" +msgstr "Không thể đổi tên chương (section) cấu hình từ '%s' thành '%s'" + +#: builtin/remote.c:662 +#: builtin/remote.c:799 +#, c-format +msgid "Could not remove config section '%s'" +msgstr "Không thể gỡ bỏ chương (section) cấu hình '%s'" + +#: builtin/remote.c:677 +#, c-format +msgid "" +"Not updating non-default fetch refspec\n" +"\t%s\n" +"\tPlease update the configuration manually if necessary." +msgstr "" +"Không cập nhật 'non-default fetch respec'\n" +"\t%s\n" +"\tXin hãy cập nhật phần cấu hình một cách thủ công nếu thấy cần thiết." + +#: builtin/remote.c:683 +#, c-format +msgid "Could not append '%s'" +msgstr "Không thể nối thêm '%s'" + +#: builtin/remote.c:694 +#, c-format +msgid "Could not set '%s'" +msgstr "Không thể đặt '%s'" + +#: builtin/remote.c:716 +#, c-format +msgid "deleting '%s' failed" +msgstr "việc xoá %s gặp lỗi" + +#: builtin/remote.c:750 +#, c-format +msgid "creating '%s' failed" +msgstr "tạo %s gặp lỗi" + +#: builtin/remote.c:764 +#, c-format +msgid "Could not remove branch %s" +msgstr "Không thể gỡ nhánh %s" + +#: builtin/remote.c:834 +msgid "" +"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" +"to delete it, use:" +msgid_plural "" +"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n" +"to delete them, use:" +msgstr[0] "" +"Chú ý: Một nhánh nằm ngoài hệ thống refs/remotes/ đã không được gỡ bỏ đi;\n" +"để xóa đi, sử dụng:" +msgstr[1] "" +"Chú ý: Một số nhánh nằm ngoài hệ thống refs/remotes/ đã không được gỡ bỏ đi;\n" +"để xóa đi, sử dụng:" + +#: builtin/remote.c:943 +#, c-format +msgid " new (next fetch will store in remotes/%s)" +msgstr " mới (lần lấy về tiếp theo sẽ lưu trong remotes/%s)" + +#: builtin/remote.c:946 +msgid " tracked" +msgstr " bị theo vết" + +#: builtin/remote.c:948 +msgid " stale (use 'git remote prune' to remove)" +msgstr " cũ (sử dụng 'git remote prune' để gỡ bỏ)" + +#: builtin/remote.c:950 +msgid " ???" +msgstr " ???" + +#: builtin/remote.c:991 +#, c-format +msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch" +msgstr "branch.%s.merge không hợp lệ; không thể rebase về phía > 1 nhánh" + +#: builtin/remote.c:998 +#, c-format +msgid "rebases onto remote %s" +msgstr "thực hiện rebase trên máy chủ %s" + +#: builtin/remote.c:1001 +#, c-format +msgid " merges with remote %s" +msgstr " hòa trộn với máy chủ %s" + +#: builtin/remote.c:1002 +msgid " and with remote" +msgstr " và với máy chủ" + +#: builtin/remote.c:1004 +#, c-format +msgid "merges with remote %s" +msgstr "hòa trộn với máy chủ %s" + +#: builtin/remote.c:1005 +msgid " and with remote" +msgstr " và với máy chủ" + +#: builtin/remote.c:1051 +msgid "create" +msgstr "tạo" + +#: builtin/remote.c:1054 +msgid "delete" +msgstr "xoá" + +#: builtin/remote.c:1058 +msgid "up to date" +msgstr "đã cập nhật" + +#: builtin/remote.c:1061 +msgid "fast-forwardable" +msgstr "có-thể-fast-forward" + +#: builtin/remote.c:1064 +msgid "local out of date" +msgstr "dữ liệu nội bộ đã cũ" + +#: builtin/remote.c:1071 +#, c-format +msgid " %-*s forces to %-*s (%s)" +msgstr " %-*s ép buộc thành %-*s (%s)" + +#: builtin/remote.c:1074 +#, c-format +msgid " %-*s pushes to %-*s (%s)" +msgstr " %-*s push tới %-*s (%s)" + +#: builtin/remote.c:1078 +#, c-format +msgid " %-*s forces to %s" +msgstr " %-*s ép buộc thành %s" + +#: builtin/remote.c:1081 +#, c-format +msgid " %-*s pushes to %s" +msgstr " %-*s push tới %s" + +#: builtin/remote.c:1118 +#, c-format +msgid "* remote %s" +msgstr "* máy chủ %s" + +#: builtin/remote.c:1119 +#, c-format +msgid " Fetch URL: %s" +msgstr " URL để lấy về (fetch): %s" + +#: builtin/remote.c:1120 +#: builtin/remote.c:1285 +msgid "(no URL)" +msgstr "(không có URL nào)" + +#: builtin/remote.c:1129 +#: builtin/remote.c:1131 +#, c-format +msgid " Push URL: %s" +msgstr " URL để đẩy lên (push) : %s" + +#: builtin/remote.c:1133 +#: builtin/remote.c:1135 +#: builtin/remote.c:1137 +#, c-format +msgid " HEAD branch: %s" +msgstr " Nhánh HEAD: %s" + +#: builtin/remote.c:1139 +#, c-format +msgid " HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" +msgstr " nhánh HEAD (HEAD máy chủ là không rõ ràng, có lẽ là một trong số sau):\n" + +#: builtin/remote.c:1151 +#, c-format +msgid " Remote branch:%s" +msgid_plural " Remote branches:%s" +msgstr[0] " Nhánh trên máy chủ:%s" +msgstr[1] " Những nhánh trên máy chủ:%s" + +#: builtin/remote.c:1154 +#: builtin/remote.c:1181 +msgid " (status not queried)" +msgstr " (trạng thái không được yêu cầu)" + +#: builtin/remote.c:1163 +msgid " Local branch configured for 'git pull':" +msgid_plural " Local branches configured for 'git pull':" +msgstr[0] " Nhánh nội bộ đã được cấu hình cho lệnh 'git pull':" +msgstr[1] " Những nhánh nội bộ đã được cấu hình cho lệnh 'git pull':" + +#: builtin/remote.c:1171 +msgid " Local refs will be mirrored by 'git push'" +msgstr " refs nội bộ sẽ được phản chiếu bởi lệnh 'git push'" + +#: builtin/remote.c:1178 +#, c-format +msgid " Local ref configured for 'git push'%s:" +msgid_plural " Local refs configured for 'git push'%s:" +msgstr[0] " Tham chiếu nội bộ được cấu hình cho lệnh 'git push'%s:" +msgstr[1] " Những tham chiếu nội bộ được cấu hình cho lệnh 'git push'%s:" + +#: builtin/remote.c:1216 +msgid "Cannot determine remote HEAD" +msgstr "Không thể xác định được HEAD máy chủ" + +#: builtin/remote.c:1218 +msgid "Multiple remote HEAD branches. Please choose one explicitly with:" +msgstr "Nhiều nhánh HEAD máy chủ. Hãy chọn rõ ràng một:" + +#: builtin/remote.c:1228 +#, c-format +msgid "Could not delete %s" +msgstr "Không thể xóa bỏ %s" + +#: builtin/remote.c:1236 +#, c-format +msgid "Not a valid ref: %s" +msgstr "Không phải là tham chiếu (ref) hợp lệ: %s" + +#: builtin/remote.c:1238 +#, c-format +msgid "Could not setup %s" +msgstr "Không thể cài đặt %s" + +#: builtin/remote.c:1274 +#, c-format +msgid " %s will become dangling!" +msgstr " %s sẽ trở thành lủng lẳng (không được quản lý)!" + +#: builtin/remote.c:1275 +#, c-format +msgid " %s has become dangling!" +msgstr " %s phải trở thành lủng lẳng (không được quản lý)!" + +#: builtin/remote.c:1281 +#, c-format +msgid "Pruning %s" +msgstr "Đang xén bớt %s" + +#: builtin/remote.c:1282 +#, c-format +msgid "URL: %s" +msgstr "URL: %s" + +#: builtin/remote.c:1295 +#, c-format +msgid " * [would prune] %s" +msgstr " * [nên xén bớt] %s" + +#: builtin/remote.c:1298 +#, c-format +msgid " * [pruned] %s" +msgstr " *[đã xén bớ] %s" + +#: builtin/remote.c:1387 +#: builtin/remote.c:1461 +#, c-format +msgid "No such remote '%s'" +msgstr "Không có máy chủ nào có tên '%s'" + +#: builtin/remote.c:1414 +msgid "no remote specified" +msgstr "chưa chỉ ra máy chủ nào" + +#: builtin/remote.c:1447 +msgid "--add --delete doesn't make sense" +msgstr "--add --delete không hợp lý" + +#: builtin/remote.c:1487 +#, c-format +msgid "Invalid old URL pattern: %s" +msgstr "Kiểu mẫu URL cũ không hợp lệ: %s" + +#: builtin/remote.c:1495 +#, c-format +msgid "No such URL found: %s" +msgstr "Không tìm thấy URL như vậy: %s" + +#: builtin/remote.c:1497 +msgid "Will not delete all non-push URLs" +msgstr "Sẽ không xóa những địa chỉ URL không-push" + +#: builtin/reset.c:33 +msgid "mixed" +msgstr "pha trộn" + +#: builtin/reset.c:33 +msgid "soft" +msgstr "mềm" + +#: builtin/reset.c:33 +msgid "hard" +msgstr "cứng" + +#: builtin/reset.c:33 +msgid "merge" +msgstr "hòa trộn" + +#: builtin/reset.c:33 +msgid "keep" +msgstr "giữ lại" + +#: builtin/reset.c:77 +msgid "You do not have a valid HEAD." +msgstr "Bạn không có HEAD nào hợp lệ." + +#: builtin/reset.c:79 +msgid "Failed to find tree of HEAD." +msgstr "Gặp lỗi khi tìm cây của HEAD." + +#: builtin/reset.c:85 +#, c-format +msgid "Failed to find tree of %s." +msgstr "Gặp lỗi khi tìm cây của %s." + +#: builtin/reset.c:96 +msgid "Could not write new index file." +msgstr "Không thể ghi tập tin lưu bảng mục lục mới." + +#: builtin/reset.c:106 +#, c-format +msgid "HEAD is now at %s" +msgstr "HEAD hiện giờ tại %s" + +#: builtin/reset.c:130 +msgid "Could not read index" +msgstr "Không thể đọc bảng mục lục" + +#: builtin/reset.c:133 +msgid "Unstaged changes after reset:" +msgstr "Những thay đổi bị bỏ trạng thái (stage) sau khi reset:" + +#: builtin/reset.c:223 +#, c-format +msgid "Cannot do a %s reset in the middle of a merge." +msgstr "Không thể thực hiện một %s reset ở giữa của quá trình hòa trộn." + +#: builtin/reset.c:297 +#, c-format +msgid "Could not parse object '%s'." +msgstr "không thể phân tích đối tượng '%s'." + +#: builtin/reset.c:302 +msgid "--patch is incompatible with --{hard,mixed,soft}" +msgstr "--patch xung khắc với --{hard,mixed,soft}" + +#: builtin/reset.c:311 +msgid "--mixed with paths is deprecated; use 'git reset -- <paths>' instead." +msgstr "--mixed với các đường dẫn không còn dùng nữa; hãy thay thế bằng lệnh 'git reset -- <đường_dẫn>'." + +#: builtin/reset.c:313 +#, c-format +msgid "Cannot do %s reset with paths." +msgstr "Không thể thực hiện lệnh %s reset với các đường dẫn." + +#: builtin/reset.c:325 +#, c-format +msgid "%s reset is not allowed in a bare repository" +msgstr "%s reset không được phép trên kho bare (trên máy chủ)" + +#: builtin/reset.c:341 +#, c-format +msgid "Could not reset index file to revision '%s'." +msgstr "Không thể đặt lại (reset) bảng mục lục thành điểm xét lại '%s'." + +#: builtin/revert.c:70 +#: builtin/revert.c:92 +#, c-format +msgid "%s: %s cannot be used with %s" +msgstr "%s: %s không thể được sử dụng với %s" + +#: builtin/revert.c:131 +msgid "program error" +msgstr "lỗi chương trình" + +#: builtin/revert.c:221 +msgid "revert failed" +msgstr "revert gặp lỗi" + +#: builtin/revert.c:236 +msgid "cherry-pick failed" +msgstr "cherry-pick gặp lỗi" + +#: builtin/rm.c:109 +#, c-format +msgid "" +"'%s' has staged content different from both the file and the HEAD\n" +"(use -f to force removal)" +msgstr "" +"'%s' có nội dung được lưu trạng thái khác biệt từ cả tập tin và cả HEAD\n" +"(sử dụng -f để ép buộc gỡ bỏ)" + +#: builtin/rm.c:115 +#, c-format +msgid "" +"'%s' has changes staged in the index\n" +"(use --cached to keep the file, or -f to force removal)" +msgstr "" +"'%s' có các thay đổi được lưu trạng thái trong bảng mục lục\n" +"(sử dụng --cached để giữ tập tin, hoặc -f để ép buộc gỡ bỏ)" + +#: builtin/rm.c:119 +#, c-format +msgid "" +"'%s' has local modifications\n" +"(use --cached to keep the file, or -f to force removal)" +msgstr "" +"'%s' có các thay đổi nội bộ\n" +"(sử dụng --cached để giữ tập tin, hoặc -f để ép buộc gỡ bỏ)" + +#: builtin/rm.c:194 +#, c-format +msgid "not removing '%s' recursively without -r" +msgstr "không thể gỡ bỏ '%s' một cách đệ qui mà không có tùy chọn -r" + +#: builtin/rm.c:230 +#, c-format +msgid "git rm: unable to remove %s" +msgstr "git rm: không thể gỡ bỏ %s" + +#: builtin/shortlog.c:157 +#, c-format +msgid "Missing author: %s" +msgstr "Thiếu tên tác giả: %s" + +#: builtin/tag.c:60 +#, c-format +msgid "malformed object at '%s'" +msgstr "đối tượng dị hình tại '%s'" + +#: builtin/tag.c:207 +#, c-format +msgid "tag name too long: %.*s..." +msgstr "tên thẻ quá dài: %.*s..." + +#: builtin/tag.c:212 +#, c-format +msgid "tag '%s' not found." +msgstr "không tìm thấy tìm thấy thẻ '%s'." + +#: builtin/tag.c:227 +#, c-format +msgid "Deleted tag '%s' (was %s)\n" +msgstr "Thẻ đã bị xóa '%s' (trước là %s)\n" + +#: builtin/tag.c:239 +#, c-format +msgid "could not verify the tag '%s'" +msgstr "không thể thẩm tra thẻ '%s'" + +#: builtin/tag.c:249 +msgid "" +"\n" +"#\n" +"# Write a tag message\n" +"# Lines starting with '#' will be ignored.\n" +"#\n" +msgstr "" +"\n" +"#\n" +"# Viết các ghi chú cho (thẻ) tag\n" +"# Những dòng được bắt đầu bằng '#' sẽ được bỏ qua.\n" +"#\n" + +#: builtin/tag.c:256 +msgid "" +"\n" +"#\n" +"# Write a tag message\n" +"# Lines starting with '#' will be kept; you may remove them yourself if you want to.\n" +"#\n" +msgstr "" +"\n" +"#\n" +"# Viết các ghi chú cho (thẻ) tag\n" +"# Những dòng được bắt đầu bằng '#' sẽ được bỏ qua; bạn có thể xóa chúng đi nếu muốn.\n" +"#\n" + +#: builtin/tag.c:298 +msgid "unable to sign the tag" +msgstr "không thể ký thẻ" + +#: builtin/tag.c:300 +msgid "unable to write tag file" +msgstr "không thể ghi vào tập tin lưu thẻ" + +#: builtin/tag.c:325 +msgid "bad object type." +msgstr "kiểu đối tượng sai." + +#: builtin/tag.c:338 +msgid "tag header too big." +msgstr "đầu thẻ (tag) quá lớn." + +#: builtin/tag.c:370 +msgid "no tag message?" +msgstr "không có thông điệp (message) cho thẻ (tag)?" + +#: builtin/tag.c:376 +#, c-format +msgid "The tag message has been left in %s\n" +msgstr "Nội dung ghi chú còn lại %s\n" + +#: builtin/tag.c:425 +msgid "switch 'points-at' requires an object" +msgstr "chuyển đến 'points-at' yêu cần một đối tượng" + +#: builtin/tag.c:427 +#, c-format +msgid "malformed object name '%s'" +msgstr "tên đối tượng dị hình '%s'" + +#: builtin/tag.c:506 +msgid "--column and -n are incompatible" +msgstr "--column và -n xung khắc nhau" + +#: builtin/tag.c:523 +msgid "-n option is only allowed with -l." +msgstr "tùy chọn -n chỉ cho phép dùng với -l." + +#: builtin/tag.c:525 +msgid "--contains option is only allowed with -l." +msgstr "tùy chọn --contains chỉ cho phép dùng với -l." + +#: builtin/tag.c:527 +msgid "--points-at option is only allowed with -l." +msgstr "tùy chọn --points-at chỉ cho phép dùng với -l." + +#: builtin/tag.c:535 +msgid "only one -F or -m option is allowed." +msgstr "chỉ có một tùy chọn -F hoặc -m là được phép." + +#: builtin/tag.c:555 +msgid "too many params" +msgstr "quá nhiều đối số" + +#: builtin/tag.c:561 +#, c-format +msgid "'%s' is not a valid tag name." +msgstr "'%s' không phải thẻ hợp lệ." + +#: builtin/tag.c:566 +#, c-format +msgid "tag '%s' already exists" +msgstr "Thẻ '%s' đã tồn tại rồi" + +#: builtin/tag.c:584 +#, c-format +msgid "%s: cannot lock the ref" +msgstr "%s: không thể khóa ref (tham chiếu)" + +#: builtin/tag.c:586 +#, c-format +msgid "%s: cannot update the ref" +msgstr "%s: không thể cập nhật ref (tham chiếu)" + +#: builtin/tag.c:588 +#, c-format +msgid "Updated tag '%s' (was %s)\n" +msgstr "Thẻ đã cập nhật '%s' (cũ là %s)\n" + +#: git.c:16 +msgid "See 'git help <command>' for more information on a specific command." +msgstr "Chạy lệnh 'git help <tên-lệnh>' để có thêm thông tin về lệnh được chỉ ra." + +#: parse-options.h:133 +#: parse-options.h:235 +msgid "n" +msgstr "n" + +#: parse-options.h:141 +msgid "time" +msgstr "thời-gian" + +#: parse-options.h:149 +msgid "file" +msgstr "tập-tin" + +#: parse-options.h:151 +msgid "when" +msgstr "khi" + +#: parse-options.h:156 +msgid "no-op (backward compatibility)" +msgstr "no-op (tương thích ngược)" + +#: parse-options.h:228 +msgid "be more verbose" +msgstr "chi tiết hơn nữa" + +#: parse-options.h:230 +msgid "be more quiet" +msgstr "im lặng hơn nữa" + +#: parse-options.h:236 +msgid "use <n> digits to display SHA-1s" +msgstr "sử dụng <n> chữ số để hiển thị SHA-1s" + +#: common-cmds.h:8 +msgid "Add file contents to the index" +msgstr "Thêm nội dung tập tin vào bảng mục lục" + +#: common-cmds.h:9 +msgid "Find by binary search the change that introduced a bug" +msgstr "Tìm kiếm bằng điều tra nhị phân các thay đổi mà nó bắt đầu lỗi" + +#: common-cmds.h:10 +msgid "List, create, or delete branches" +msgstr "Liệt kê, tạo hay là xóa các nhánh" + +#: common-cmds.h:11 +msgid "Checkout a branch or paths to the working tree" +msgstr "Checkout một nhánh hay các đường dẫn tời cây làm việc" + +#: common-cmds.h:12 +msgid "Clone a repository into a new directory" +msgstr "Nhân bản một kho chứa đến một thư mục mới" + +#: common-cmds.h:13 +msgid "Record changes to the repository" +msgstr "Ghi các thay đổi vào kho chứa" + +#: common-cmds.h:14 +msgid "Show changes between commits, commit and working tree, etc" +msgstr "Hiển thị các thay đổi giữa những lần chuyển giao (commit), commit và cây làm việc, v.v.." + +#: common-cmds.h:15 +msgid "Download objects and refs from another repository" +msgstr "Các đối tượng và tham chiếu được tải về từ kho chứa khác" + +#: common-cmds.h:16 +msgid "Print lines matching a pattern" +msgstr "In ra những dòng khớp với một mẫu" + +#: common-cmds.h:17 +msgid "Create an empty git repository or reinitialize an existing one" +msgstr "Tạo một kho git trống rỗng hay khởi tạo lại một kho đã tồn tại từ trước" + +#: common-cmds.h:18 +msgid "Show commit logs" +msgstr "hiển thị nhật ký các lần commit (chuyển giao)" + +#: common-cmds.h:19 +msgid "Join two or more development histories together" +msgstr "Hợp nhất hai hay nhiều hơn lịch sử của các nhà phát triển phần mềm lại với nhau" + +#: common-cmds.h:20 +msgid "Move or rename a file, a directory, or a symlink" +msgstr "Di chuyển, đổi tên một tập tin, thư mục hay liên kết tượng trưng" + +#: common-cmds.h:21 +msgid "Fetch from and merge with another repository or a local branch" +msgstr "Fetch (lấy về) và hòa trộng với kho khác hay nhánh nội bộ" + +#: common-cmds.h:22 +msgid "Update remote refs along with associated objects" +msgstr "Cập nhật tham chiếu (refs) máy chủ cùng với các đối tượng liên quan đến nó" + +#: common-cmds.h:23 +msgid "Forward-port local commits to the updated upstream head" +msgstr "Forward-port những lần chuyển giao nội bộ tới head dòng ngược đã cập nhật" + +#: common-cmds.h:24 +msgid "Reset current HEAD to the specified state" +msgstr "Đặt lại HEAD hiện hành thành một trạng thái được chỉ ra" + +#: common-cmds.h:25 +msgid "Remove files from the working tree and from the index" +msgstr "Gỡ bỏ các tập tin từ cây làm việc và từ bảng mục lục" + +#: common-cmds.h:26 +msgid "Show various types of objects" +msgstr "Hiển thị các kiểu khác nhau của các đối tượng" + +#: common-cmds.h:27 +msgid "Show the working tree status" +msgstr "Hiển thị trạng thái cây làm việc" + +#: common-cmds.h:28 +msgid "Create, list, delete or verify a tag object signed with GPG" +msgstr "Tạo, liệt kê, xóa hay xác thực một đối tượng thẻ (tag) mà nó được ký sử dụng GPG" + +#: git-am.sh:50 +msgid "You need to set your committer info first" +msgstr "Bạn cần đặt thông tin về người chuyển giao mã nguồn trước đã" + +#: git-am.sh:137 +msgid "Repository lacks necessary blobs to fall back on 3-way merge." +msgstr "Kho thiếu đối tượng blob cần thiết để trở về trên '3-way merge'." + +#: git-am.sh:154 +msgid "" +"Did you hand edit your patch?\n" +"It does not apply to blobs recorded in its index." +msgstr "" +"Bạn đã sửa miếng vá của mình bằng cách thủ công à?\n" +"Nó không thể áp dụng các blob đã được ghi lại trong bảng mục lục của nó." + +#: git-am.sh:163 +msgid "Falling back to patching base and 3-way merge..." +msgstr "Đang trở lại để vá cơ sở và '3-way merge'..." + +#: git-am.sh:275 +msgid "Only one StGIT patch series can be applied at once" +msgstr "Chỉ có một sê-ri miếng vá StGIT được áp dụng một lúc" + +#: git-am.sh:362 +#, sh-format +msgid "Patch format $patch_format is not supported." +msgstr "Định dạng miếng vá $patch_format không được hỗ trợ." + +#: git-am.sh:364 +msgid "Patch format detection failed." +msgstr "Dò tìm định dạng miếng vá gặp lỗi." + +#: git-am.sh:418 +msgid "-d option is no longer supported. Do not use." +msgstr "Tùy chọn -d không còn được hỗ trợ nữa. Xin đừng sử dụng." + +#: git-am.sh:481 +#, sh-format +msgid "previous rebase directory $dotest still exists but mbox given." +msgstr "thư mục rebase trước $dotest vẫn chưa sẵn sàng nhưng mbox được đưa ra." + +#: git-am.sh:486 +msgid "Please make up your mind. --skip or --abort?" +msgstr "Xin hãy rõ ràng. --skip hay --abort?" + +#: git-am.sh:513 +msgid "Resolve operation not in progress, we are not resuming." +msgstr "Thao tác phân giải không đang được tiến hành, chúng ta không phục hồi lại." + +#: git-am.sh:579 +#, sh-format +msgid "Dirty index: cannot apply patches (dirty: $files)" +msgstr "Bảng mục lục sai: không thể áp dụng các miếng vá (sai: $files)" + +#: git-am.sh:755 +msgid "cannot be interactive without stdin connected to a terminal." +msgstr "không thể được tương tác mà không có stdin kết nối với một thiết bị cuối" + +#. TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a] +#. in your translation. The program will only accept English +#. input at this point. +#: git-am.sh:766 +msgid "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all " +msgstr "Áp dụng? đồng ý [y]/không [n]/chỉnh sửa [e]/hiển thị miếng [v]á/đồng ý tất cả [a]" + +#: git-am.sh:802 +#, sh-format +msgid "Applying: $FIRSTLINE" +msgstr "Đang áp dụng (miếng vá): $FIRSTLINE" + +#: git-am.sh:847 +msgid "No changes -- Patch already applied." +msgstr "Không thay đổi gì cả -- Miếng vá đã được áp dụng rồi." + +#: git-am.sh:873 +msgid "applying to an empty history" +msgstr "áp dụng vào một lịch sử trống rỗng" + +#. TRANSLATORS: Make sure to include [Y] and [n] in your +#. translation. The program will only accept English input +#. at this point. +#: git-bisect.sh:54 +msgid "Do you want me to do it for you [Y/n]? " +msgstr "Bạn có muốn tôi thực hiện điều này cho bạn không [Y/n]? " + +#: git-bisect.sh:95 +#, sh-format +msgid "unrecognised option: '$arg'" +msgstr "không công nhận tùy chọn: '$arg'" + +#: git-bisect.sh:99 +#, sh-format +msgid "'$arg' does not appear to be a valid revision" +msgstr "'$arg' không có vẻ như là một sự xét lại hợp lệ" + +#: git-bisect.sh:117 +msgid "Bad HEAD - I need a HEAD" +msgstr "HEAD sai - Tôi cần một HEAD" + +#: git-bisect.sh:130 +#, sh-format +msgid "Checking out '$start_head' failed. Try 'git bisect reset <validbranch>'." +msgstr "Việc checkout '$start_head' gặp lỗi. Hãy thử 'git bisect reset <nhánh_hợp_lệ>'." + +#: git-bisect.sh:140 +msgid "won't bisect on seeked tree" +msgstr "sẽ không bisect trêm cây được seek" + +#: git-bisect.sh:144 +msgid "Bad HEAD - strange symbolic ref" +msgstr "HEAD sai - tham chiếu (ref) tượng trưng kỳ lạ" + +#: git-bisect.sh:189 +#, sh-format +msgid "Bad bisect_write argument: $state" +msgstr "Đối số bisect_write sai: $state" + +#: git-bisect.sh:218 +#, sh-format +msgid "Bad rev input: $arg" +msgstr "Đầu vào rev sai: $arg" + +#: git-bisect.sh:232 +msgid "Please call 'bisect_state' with at least one argument." +msgstr "Hãy gọi lệnhl 'bisect_state' với ít nhất một đối số." + +#: git-bisect.sh:244 +#, sh-format +msgid "Bad rev input: $rev" +msgstr "Đầu vào rev sai: $rev" + +#: git-bisect.sh:250 +msgid "'git bisect bad' can take only one argument." +msgstr "'git bisect bad' có thể lấy chỉ một đối số." + +#. TRANSLATORS: Make sure to include [Y] and [n] in your +#. translation. The program will only accept English input +#. at this point. +#: git-bisect.sh:279 +msgid "Are you sure [Y/n]? " +msgstr "Bạn có chắc chắn chưa [Y/n]?" + +#: git-bisect.sh:354 +#, sh-format +msgid "'$invalid' is not a valid commit" +msgstr "'$invalid' không phải là lần chuyển giao (commit) hợp lệ" + +#: git-bisect.sh:363 +#, sh-format +msgid "" +"Could not check out original HEAD '$branch'.\n" +"Try 'git bisect reset <commit>'." +msgstr "" +"Không thể check out original HEAD '$branch'.\n" +"Hãy thử 'git bisect reset <commit>'." + +#: git-bisect.sh:390 +msgid "No logfile given" +msgstr "Chưa chỉ ra tập tin ghi nhật ký" + +#: git-bisect.sh:391 +#, sh-format +msgid "cannot read $file for replaying" +msgstr "không thể đọc $file để thao diễn lại" + +#: git-bisect.sh:408 +msgid "?? what are you talking about?" +msgstr "?? bạn đang nói gì thế?" + +#: git-bisect.sh:474 +msgid "We are not bisecting." +msgstr "Chúng tôi không bisect." + +#: git-pull.sh:21 +msgid "" +"Pull is not possible because you have unmerged files.\n" +"Please, fix them up in the work tree, and then use 'git add/rm <file>'\n" +"as appropriate to mark resolution, or use 'git commit -a'." +msgstr "" +"Pull là không thể được bởi vì bạn có những tập tin chưa được hòa trộn.\n" +"Xin hãy sửa chữa chúng trước, và sau đó sử dụng lệnh 'git add/rm <tập-tin>'\n" +"để phê chuẩn việc đánh dấu đây cần được giải quyết, hoặc là sử dụng 'git commit -a'." + +#: git-pull.sh:25 +msgid "Pull is not possible because you have unmerged files." +msgstr "Full là không thể thực hiện bởi vì bạn có những tập tin chưa được hòa trộn." + +#: git-pull.sh:197 +msgid "updating an unborn branch with changes added to the index" +msgstr "đang cập nhật một nhánh chưa được sinh ra với các thay đổi được thêm vào bảng mục lục" + +#: git-pull.sh:253 +msgid "Cannot merge multiple branches into empty head" +msgstr "Không thể hòa trộn nhiều nhánh và trong một head trống rỗng" + +#: git-pull.sh:257 +msgid "Cannot rebase onto multiple branches" +msgstr "Không thể thực hiện lệnh rebase (cơ cấu lại) trên nhiều nhánh" + +#: git-stash.sh:51 +msgid "git stash clear with parameters is unimplemented" +msgstr "git stash clear với các tham số là chưa được thực hiện (không nhận đối số)" + +#: git-stash.sh:74 +msgid "You do not have the initial commit yet" +msgstr "Bạn chưa còn có lần chuyển giao (commit) khởi tạo" + +#: git-stash.sh:89 +msgid "Cannot save the current index state" +msgstr "Không thể ghi lại trạng thái bảng mục lục hiện hành" + +#: git-stash.sh:123 +#: git-stash.sh:136 +msgid "Cannot save the current worktree state" +msgstr "Không thể ghi lại trạng thái cây-làm-việc hiện hành" + +#: git-stash.sh:140 +msgid "No changes selected" +msgstr "Chưa có thay đổi nào được chọn" + +#: git-stash.sh:143 +msgid "Cannot remove temporary index (can't happen)" +msgstr "Không thể gỡ bỏ bảng mục lục tạm thời (không thể xảy ra)" + +#: git-stash.sh:156 +msgid "Cannot record working tree state" +msgstr "Không thể ghi lại trạng thái cây làm việc hiện hành" + +#: git-stash.sh:223 +msgid "No local changes to save" +msgstr "Không có thay đổi nội bộ nào được ghi lại" + +#: git-stash.sh:227 +msgid "Cannot initialize stash" +msgstr "Không thể khởi tạo stash" + +#: git-stash.sh:235 +msgid "Cannot save the current status" +msgstr "Không thể ghi lại trạng thái hiện hành" + +#: git-stash.sh:253 +msgid "Cannot remove worktree changes" +msgstr "Không thể gỡ bỏ các thay đổi cây-làm-việc" + +#: git-stash.sh:352 +msgid "No stash found." +msgstr "Không tìm thấy stast nào." + +#: git-stash.sh:359 +#, sh-format +msgid "Too many revisions specified: $REV" +msgstr "Chỉ ra quá nhiều điểm xét lại: $REV" + +#: git-stash.sh:365 +#, sh-format +msgid "$reference is not valid reference" +msgstr "$reference không phải là tham chiếu hợp lệ" + +#: git-stash.sh:393 +#, sh-format +msgid "'$args' is not a stash-like commit" +msgstr "'$args' không phải là lần chuyển giao (commit) giống-stash" + +#: git-stash.sh:404 +#, sh-format +msgid "'$args' is not a stash reference" +msgstr "'$args' không phải tham chiếu đến stash" + +#: git-stash.sh:412 +msgid "unable to refresh index" +msgstr "không thể làm tươi mới bảng mục lục" + +#: git-stash.sh:416 +msgid "Cannot apply a stash in the middle of a merge" +msgstr "Không thể áp dụng một stash ở giữa của quá trình hòa trộn" + +#: git-stash.sh:424 +msgid "Conflicts in index. Try without --index." +msgstr "Xung đột trong bảng mục lục. Hãy thử mà không dùng tùy chọn --index." + +#: git-stash.sh:426 +msgid "Could not save index tree" +msgstr "Không thể ghi lại cây chỉ mục" + +#: git-stash.sh:460 +msgid "Cannot unstage modified files" +msgstr "Không thể bỏ trạng thía của các tập tin đã được sửa chữa" + +#: git-stash.sh:491 +#, sh-format +msgid "Dropped ${REV} ($s)" +msgstr "Đã hạ xuống ${REV} ($s)" + +#: git-stash.sh:492 +#, sh-format +msgid "${REV}: Could not drop stash entry" +msgstr "${REV}: Không thể xóa bỏ mục stash" + +#: git-stash.sh:499 +msgid "No branch name specified" +msgstr "Chưa chỉ ra tên của nhánh" + +#: git-stash.sh:570 +msgid "(To restore them type \"git stash apply\")" +msgstr "(Để phục hồi lại chúng hãy gõ \"git stash apply\")" + +#: git-submodule.sh:56 +#, sh-format +msgid "cannot strip one component off url '$remoteurl'" +msgstr "không thể tháo bỏ một thành phần ra khỏi url '$remoteurl'" + +#: git-submodule.sh:109 +#, sh-format +msgid "No submodule mapping found in .gitmodules for path '$sm_path'" +msgstr "Không tìm thấy ánh xạ (mapping) mô-đun-con trong .gitmodules cho đường dẫn '$sm_path'" + +#: git-submodule.sh:150 +#, sh-format +msgid "Clone of '$url' into submodule path '$sm_path' failed" +msgstr "Nhân bản '$url' vào đường dẫn mô-đun-con '$sm_path' gặp lỗi" + +#: git-submodule.sh:160 +#, sh-format +msgid "Gitdir '$a' is part of the submodule path '$b' or vice versa" +msgstr "Gitdir '$a' là bộ phận của đường dẫn mô-đun-con '$b' hoặc \"vice versa\"" + +#: git-submodule.sh:249 +#, sh-format +msgid "repo URL: '$repo' must be absolute or begin with ./|../" +msgstr "repo URL: '$repo' phải là đường dẫn tuyệt đối hoặc là bắt đầu bằng ./|../" + +#: git-submodule.sh:266 +#, sh-format +msgid "'$sm_path' already exists in the index" +msgstr "'$sm_path' thực sự đã tồn tại ở bảng mục lục rồi" + +#: git-submodule.sh:283 +#, sh-format +msgid "'$sm_path' already exists and is not a valid git repo" +msgstr "'$sm_path' đã tồn tại từ trước và không phải là một kho git hợp lệ" + +#: git-submodule.sh:297 +#, sh-format +msgid "Unable to checkout submodule '$sm_path'" +msgstr "Không thể checkout mô-đun con '$sm_path'" + +#: git-submodule.sh:302 +#, sh-format +msgid "Failed to add submodule '$sm_path'" +msgstr "Gặp lỗi khi thêm mô-đun con '$sm_path'" + +#: git-submodule.sh:307 +#, sh-format +msgid "Failed to register submodule '$sm_path'" +msgstr "Gặp lỗi khi đăng ký với hệ thống mô-đun con '$sm_path'" + +#: git-submodule.sh:349 +#, sh-format +msgid "Entering '$prefix$sm_path'" +msgstr "Đang nhập '$prefix$sm_path'" + +#: git-submodule.sh:363 +#, sh-format +msgid "Stopping at '$sm_path'; script returned non-zero status." +msgstr "Dừng lại tại '$sm_path'; script trả về trạng thái khác không." + +#: git-submodule.sh:406 +#, sh-format +msgid "No url found for submodule path '$sm_path' in .gitmodules" +msgstr "Không tìm thấy url cho đường dẫn mô-đun-con '$sm_path' trong .gitmodules" + +#: git-submodule.sh:415 +#, sh-format +msgid "Failed to register url for submodule path '$sm_path'" +msgstr "Gặp lỗi khi đăng ký url cho đường dẫn mô-đun-con '$sm_path'" + +#: git-submodule.sh:417 +#, sh-format +msgid "Submodule '$name' ($url) registered for path '$sm_path'" +msgstr "Mô-đun-con '$name' ($url) được đăng ký cho đường dẫn '$sm_path'" + +#: git-submodule.sh:425 +#, sh-format +msgid "Failed to register update mode for submodule path '$sm_path'" +msgstr "Gặp lỗi khi đăng ký chế độ cập nhật cho đường dẫn mô-đun-con '$sm_path'" + +#: git-submodule.sh:524 +#, sh-format +msgid "" +"Submodule path '$sm_path' not initialized\n" +"Maybe you want to use 'update --init'?" +msgstr "" +"Đường dẫn mô-đun-con '$sm_path' chưa được khởi tạo\n" +"Có lẽ bạn muốn sử dụng lệnh 'update --init'?" + +#: git-submodule.sh:537 +#, sh-format +msgid "Unable to find current revision in submodule path '$sm_path'" +msgstr "Không tìm thấy điểm xét lại hiện hành trong đường dẫn mô-đun-con '$sm_path'" + +#: git-submodule.sh:556 +#, sh-format +msgid "Unable to fetch in submodule path '$sm_path'" +msgstr "Không thể lấy về (fetch) trong đường dẫn mô-đun-con '$sm_path'" + +#: git-submodule.sh:570 +#, sh-format +msgid "Unable to rebase '$sha1' in submodule path '$sm_path'" +msgstr "Không thể rebase '$sha1' trong đường dẫn mô-đun-con '$sm_path'" + +#: git-submodule.sh:571 +#, sh-format +msgid "Submodule path '$sm_path': rebased into '$sha1'" +msgstr "Đường dẫn mô-đun-con '$sm_path': được rebase vào trong '$sha1'" + +#: git-submodule.sh:576 +#, sh-format +msgid "Unable to merge '$sha1' in submodule path '$sm_path'" +msgstr "Không thể hòa trộn (merge) '$sha1' trong đường dẫn mô-đun-con '$sm_path'" + +#: git-submodule.sh:577 +#, sh-format +msgid "Submodule path '$sm_path': merged in '$sha1'" +msgstr "Đường dẫn mô-đun-con '$sm_path': được hòa trộn vào '$sha1'" + +#: git-submodule.sh:582 +#, sh-format +msgid "Unable to checkout '$sha1' in submodule path '$sm_path'" +msgstr "Không thể checkout '$sha1' trong đường dẫn mô-đun-con '$sm_path'" + +#: git-submodule.sh:583 +#, sh-format +msgid "Submodule path '$sm_path': checked out '$sha1'" +msgstr "Đường dẫn mô-đun-con '$sm_path': được checkout '$sha1'" + +#: git-submodule.sh:605 +#: git-submodule.sh:928 +#, sh-format +msgid "Failed to recurse into submodule path '$sm_path'" +msgstr "Gặp lỗi khi đệ quy vào trong đường dẫn mô-đun-con '$sm_path'" + +#: git-submodule.sh:713 +msgid "--" +msgstr "--" + +#: git-submodule.sh:771 +#, sh-format +msgid " Warn: $name doesn't contain commit $sha1_src" +msgstr " Cảnh báo: $name không chứa lần chuyển giao (commit) $sha1_src" + +#: git-submodule.sh:774 +#, sh-format +msgid " Warn: $name doesn't contain commit $sha1_dst" +msgstr " Cảnh báo: $name không chứa lần chuyển giao (commit) $sha1_dst" + +#: git-submodule.sh:777 +#, sh-format +msgid " Warn: $name doesn't contain commits $sha1_src and $sha1_dst" +msgstr " Cảnh báo: $name không chứa những lần chuyển giao (commit) $sha1_src và $sha1_dst" + +#: git-submodule.sh:802 +msgid "blob" +msgstr "blob" + +#: git-submodule.sh:803 +msgid "submodule" +msgstr "mô-đun con" + +#: git-submodule.sh:974 +#, sh-format +msgid "Synchronizing submodule url for '$name'" +msgstr "Đang đồng bộ hóa url mô-đun-con cho '$name'" + +#~ msgid "Could not extract email from committer identity." +#~ msgstr "" +#~ "Không thể rút trích địa chỉ thư điện tử từ định danh người chuyển giao" + +#, fuzzy +#~ msgid "could not parse commit %s\n" +#~ msgstr "Không thể phân tích commit (lần chuyển giao) %s\n" + +#, fuzzy +#~ msgid "cherry-pick" +#~ msgstr "< Chọn D-Mod" + +#, fuzzy +#~ msgid "Too many options specified" +#~ msgstr "đã ghi rõ quá nhiều kích cỡ" diff --git a/po/zh_CN.po b/po/zh_CN.po index 701b693378..1b7a51b933 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -12,15 +12,15 @@ msgid "" msgstr "" "Project-Id-Version: Git\n" "Report-Msgid-Bugs-To: Git Mailing List <git@vger.kernel.org>\n" -"POT-Creation-Date: 2012-04-28 20:17+0800\n" -"PO-Revision-Date: 2012-01-30 00:00+0800\n" +"POT-Creation-Date: 2012-06-02 07:03+0800\n" +"PO-Revision-Date: 2012-06-02 17:05+0800\n" "Last-Translator: Jiang Xin <worldhello.net@gmail.com>\n" "Language-Team: GitHub <https://github.com/gotgit/git/>\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" #: advice.c:40 #, c-format @@ -42,6 +42,80 @@ msgstr "" "'git add/rm <file>' 标记解决方案,\n" "或使用 'git commit -a'。" +#: bundle.c:36 +#, c-format +msgid "'%s' does not look like a v2 bundle file" +msgstr "'%s' 不像是一个 v2 版本的包文件" + +#: bundle.c:63 +#, c-format +msgid "unrecognized header: %s%s (%d)" +msgstr "未能识别的包头:%s%s (%d)" + +#: bundle.c:89 builtin/commit.c:696 +#, c-format +msgid "could not open '%s'" +msgstr "不能打开 '%s'" + +#: bundle.c:140 +msgid "Repository lacks these prerequisite commits:" +msgstr "版本库缺少这些必备的提交:" + +#: bundle.c:164 sequencer.c:550 sequencer.c:982 builtin/log.c:289 +#: builtin/log.c:720 builtin/log.c:1309 builtin/log.c:1528 builtin/merge.c:347 +#: builtin/shortlog.c:181 +msgid "revision walk setup failed" +msgstr "版本遍历设置失败" + +#: bundle.c:186 +#, c-format +msgid "The bundle contains %d ref" +msgid_plural "The bundle contains %d refs" +msgstr[0] "这个包中含有 %d 个引用" +msgstr[1] "这个包中含有 %d 个引用" + +#: bundle.c:192 +#, c-format +msgid "The bundle requires this ref" +msgid_plural "The bundle requires these %d refs" +msgstr[0] "这个包需要这个引用" +msgstr[1] "这个包需要 %d 个这些引用" + +#: bundle.c:290 +msgid "rev-list died" +msgstr "rev-list 终止" + +#: bundle.c:296 builtin/log.c:1205 builtin/shortlog.c:284 +#, c-format +msgid "unrecognized argument: %s" +msgstr "未能识别的参数:%s" + +#: bundle.c:331 +#, c-format +msgid "ref '%s' is excluded by the rev-list options" +msgstr "引用 '%s' 被 rev-list 选项排除" + +#: bundle.c:376 +msgid "Refusing to create empty bundle." +msgstr "不能创建空包。" + +#: bundle.c:394 +msgid "Could not spawn pack-objects" +msgstr "不能生成 pack-objects 进程" + +#: bundle.c:412 +msgid "pack-objects died" +msgstr "pack-objects 终止" + +#: bundle.c:415 +#, c-format +msgid "cannot create '%s'" +msgstr "不能创建 '%s'" + +#: bundle.c:437 +msgid "index-pack died" +msgstr "index-pack 终止" + #: commit.c:48 #, c-format msgid "could not parse %s" @@ -70,6 +144,73 @@ msgstr "无法写入 rev-list:%s" msgid "failed to close rev-list's stdin: %s" msgstr "无法关闭 rev-list 的标准输入:%s" +#: date.c:95 +msgid "in the future" +msgstr "在将来" + +#: date.c:101 +#, c-format +msgid "%lu second ago" +msgid_plural "%lu seconds ago" +msgstr[0] "%lu 秒钟之前" +msgstr[1] "%lu 秒钟之前" + +#: date.c:108 +#, c-format +msgid "%lu minute ago" +msgid_plural "%lu minutes ago" +msgstr[0] "%lu 分钟之前" +msgstr[1] "%lu 分钟之前" + +#: date.c:115 +#, c-format +msgid "%lu hour ago" +msgid_plural "%lu hours ago" +msgstr[0] "%lu 小时之前" +msgstr[1] "%lu 小时之前" + +#: date.c:122 +#, c-format +msgid "%lu day ago" +msgid_plural "%lu days ago" +msgstr[0] "%lu 天之前" +msgstr[1] "%lu 天之前" + +#: date.c:128 +#, c-format +msgid "%lu week ago" +msgid_plural "%lu weeks ago" +msgstr[0] "%lu 周之前" +msgstr[1] "%lu 周之前" + +#: date.c:135 +#, c-format +msgid "%lu month ago" +msgid_plural "%lu months ago" +msgstr[0] "%lu 个月之前" +msgstr[1] "%lu 个月之前" + +#: date.c:146 +#, c-format +msgid "%lu year" +msgid_plural "%lu years" +msgstr[0] "%lu 年" +msgstr[1] "%lu 年" + +#: date.c:149 +#, c-format +msgid "%s, %lu month ago" +msgid_plural "%s, %lu months ago" +msgstr[0] "%s,%lu 个月之前" +msgstr[1] "%s,%lu 个月之前" + +#: date.c:154 date.c:159 +#, c-format +msgid "%lu year ago" +msgid_plural "%lu years ago" +msgstr[0] "%lu 年前" +msgstr[1] "%lu 年前" + # 译者:注意保持前导空格 #: diff.c:105 #, c-format @@ -100,20 +241,23 @@ msgstr " 0 个文件被修改\n" msgid " %d file changed" msgid_plural " %d files changed" msgstr[0] " %d 个文件被修改" +msgstr[1] " %d 个文件被修改" #: diff.c:1421 #, c-format msgid ", %d insertion(+)" msgid_plural ", %d insertions(+)" msgstr[0] ",插入 %d 行(+)" +msgstr[1] ",插入 %d 行(+)" #: diff.c:1432 #, c-format msgid ", %d deletion(-)" msgid_plural ", %d deletions(-)" msgstr[0] ",删除 %d 行(-)" +msgstr[1] ",删除 %d 行(-)" -#: diff.c:3435 +#: diff.c:3478 #, c-format msgid "" "Failed to parse --dirstat/-X option parameter:\n" @@ -134,22 +278,31 @@ msgstr "gpg 没有接受数据" msgid "gpg failed to sign the data" msgstr "gpg 无法为数据签名" -#: grep.c:1280 +#: grep.c:1320 #, c-format msgid "'%s': unable to read %s" msgstr "'%s':无法读取 %s" -#: grep.c:1297 +#: grep.c:1337 #, c-format msgid "'%s': %s" msgstr "'%s':%s" -#: grep.c:1308 +#: grep.c:1348 #, c-format msgid "'%s': short read %s" msgstr "'%s':读取不完整 %s" -#: help.c:287 +#: help.c:207 +#, c-format +msgid "available git commands in '%s'" +msgstr "在 '%s' 下可用的 git 命令" + +#: help.c:214 +msgid "git commands available from elsewhere on your $PATH" +msgstr "在 $PATH 路径中的其他地方可用的 git 命令" + +#: help.c:270 #, c-format msgid "" "'%s' appears to be a git command, but we were not\n" @@ -158,20 +311,81 @@ msgstr "" "'%s' 像是一个 git 命令,但却无法运行。\n" "可能是 git-%s 受损?" -#: remote.c:1607 +#: help.c:327 +msgid "Uh oh. Your system reports no Git commands at all." +msgstr "唉呀,您的系统中未发现 Git 命令。" + +#: help.c:349 +#, c-format +msgid "" +"WARNING: You called a Git command named '%s', which does not exist.\n" +"Continuing under the assumption that you meant '%s'" +msgstr "" +"警告:您运行一个不存在的 Git 命令 '%s'。继续执行假定您要要运行的\n" +"是 '%s'" + +#: help.c:354 +#, c-format +msgid "in %0.1f seconds automatically..." +msgstr "在 %0.1f 秒钟后自动运行..." + +#: help.c:361 +#, c-format +msgid "git: '%s' is not a git command. See 'git --help'." +msgstr "git:'%s' 不是一个 git 命令。参见 'git --help'。" + +#: help.c:365 +msgid "" +"\n" +"Did you mean this?" +msgid_plural "" +"\n" +"Did you mean one of these?" +msgstr[0] "" +"\n" +"您指的是这个么?" +msgstr[1] "" +"\n" +"您指的是这些其中一个么?" + +#: parse-options.c:493 +msgid "..." +msgstr "..." + +#: parse-options.c:511 +#, c-format +msgid "usage: %s" +msgstr "用法:%s" + +#. TRANSLATORS: the colon here should align with the +#. one in "usage: %s" translation +#: parse-options.c:515 +#, c-format +msgid " or: %s" +msgstr " 或:%s" + +# 译者:为保证在输出中对齐,注意调整句中空格! +#: parse-options.c:518 +#, c-format +msgid " %s" +msgstr " %s" + +#: remote.c:1629 #, c-format msgid "Your branch is ahead of '%s' by %d commit.\n" msgid_plural "Your branch is ahead of '%s' by %d commits.\n" msgstr[0] "您的分支领先 '%s' 共 %d 个提交。\n" +msgstr[1] "您的分支领先 '%s' 共 %d 个提交。\n" -#: remote.c:1613 +#: remote.c:1635 #, c-format msgid "Your branch is behind '%s' by %d commit, and can be fast-forwarded.\n" msgid_plural "" "Your branch is behind '%s' by %d commits, and can be fast-forwarded.\n" msgstr[0] "您的分支落后 '%s' 共 %d 个提交,并且可以快进。\n" +msgstr[1] "您的分支落后 '%s' 共 %d 个提交,并且可以快进。\n" -#: remote.c:1621 +#: remote.c:1643 #, c-format msgid "" "Your branch and '%s' have diverged,\n" @@ -182,20 +396,23 @@ msgid_plural "" msgstr[0] "" "您的分支和 '%s' 出现了偏离,\n" "并且各自分别有 %d 和 %d 处不同的提交。\n" +msgstr[1] "" +"您的分支和 '%s' 出现了偏离,\n" +"并且各自分别有 %d 和 %d 处不同的提交。\n" -#: sequencer.c:120 builtin/merge.c:865 builtin/merge.c:978 +#: sequencer.c:121 builtin/merge.c:865 builtin/merge.c:978 #: builtin/merge.c:1088 builtin/merge.c:1098 #, c-format msgid "Could not open '%s' for writing" msgstr "不能为写入打开 '%s'" -#: sequencer.c:122 builtin/merge.c:333 builtin/merge.c:868 +#: sequencer.c:123 builtin/merge.c:333 builtin/merge.c:868 #: builtin/merge.c:1090 builtin/merge.c:1103 #, c-format msgid "Could not write to '%s'" msgstr "不能写入 '%s'" -#: sequencer.c:143 +#: sequencer.c:144 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add <paths>' or 'git rm <paths>'" @@ -203,7 +420,7 @@ msgstr "" "冲突解决完毕后,用 'git add <paths>' 或 'git rm <paths>'\n" "命令标记修正后的文件" -#: sequencer.c:146 +#: sequencer.c:147 msgid "" "after resolving the conflicts, mark the corrected paths\n" "with 'git add <paths>' or 'git rm <paths>'\n" @@ -212,202 +429,214 @@ msgstr "" "冲突解决完毕后,用 'git add <paths>' 或 'git rm <paths>'\n" "对修正后的文件做标记,然后用 'git commit' 提交" -#: sequencer.c:159 sequencer.c:685 sequencer.c:768 +#: sequencer.c:160 sequencer.c:758 sequencer.c:841 #, c-format msgid "Could not write to %s" msgstr "不能写入 %s" -#: sequencer.c:162 +#: sequencer.c:163 #, c-format msgid "Error wrapping up %s" msgstr "错误收尾 %s" -#: sequencer.c:177 +#: sequencer.c:178 msgid "Your local changes would be overwritten by cherry-pick." msgstr "您的本地修改将被拣选操作覆盖。" -#: sequencer.c:179 +#: sequencer.c:180 msgid "Your local changes would be overwritten by revert." msgstr "您的本地修改将被还原操作覆盖。" -#: sequencer.c:182 +#: sequencer.c:183 msgid "Commit your changes or stash them to proceed." msgstr "提交您的修改或保存进度后再继续。" #. TRANSLATORS: %s will be "revert" or "cherry-pick" -#: sequencer.c:232 +#: sequencer.c:233 #, c-format msgid "%s: Unable to write new index file" msgstr "%s:无法写入新索引文件" -#: sequencer.c:298 +#: sequencer.c:261 +msgid "Could not resolve HEAD commit\n" +msgstr "不能解析 HEAD 提交\n" + +#: sequencer.c:282 +msgid "Unable to update cache tree\n" +msgstr "不能更新缓存\n" + +#: sequencer.c:324 +#, c-format +msgid "Could not parse commit %s\n" +msgstr "不能解析提交 %s\n" + +#: sequencer.c:329 +#, c-format +msgid "Could not parse parent commit %s\n" +msgstr "不能解析父提交 %s\n" + +#: sequencer.c:395 msgid "Your index file is unmerged." msgstr "您的索引文件未完成合并。" -#: sequencer.c:301 +#: sequencer.c:398 msgid "You do not have a valid HEAD" msgstr "您没有一个有效的 HEAD" -#: sequencer.c:316 +#: sequencer.c:413 #, c-format msgid "Commit %s is a merge but no -m option was given." msgstr "提交 %s 是一个合并提交但未提供 -m 选项。" -#: sequencer.c:324 +#: sequencer.c:421 #, c-format msgid "Commit %s does not have parent %d" msgstr "提交 %s 没有父提交 %d" -#: sequencer.c:328 +#: sequencer.c:425 #, c-format msgid "Mainline was specified but commit %s is not a merge." msgstr "指定了主线但提交 %s 不是一个合并。" #. TRANSLATORS: The first %s will be "revert" or #. "cherry-pick", the second %s a SHA1 -#: sequencer.c:339 +#: sequencer.c:436 #, c-format msgid "%s: cannot parse parent commit %s" msgstr "%s:不能解析父提交 %s" -#: sequencer.c:343 +#: sequencer.c:440 #, c-format msgid "Cannot get commit message for %s" msgstr "不能得到 %s 的提交说明" -#: sequencer.c:427 +#: sequencer.c:524 #, c-format msgid "could not revert %s... %s" msgstr "不能还原 %s... %s" -#: sequencer.c:428 +#: sequencer.c:525 #, c-format msgid "could not apply %s... %s" msgstr "不能应用 %s... %s" -#: sequencer.c:450 sequencer.c:909 builtin/log.c:289 builtin/log.c:719 -#: builtin/log.c:1335 builtin/log.c:1554 builtin/merge.c:347 -#: builtin/shortlog.c:181 -msgid "revision walk setup failed" -msgstr "版本遍历设置失败" - -#: sequencer.c:453 +#: sequencer.c:553 msgid "empty commit set passed" msgstr "提供了空的提交集" -#: sequencer.c:461 +#: sequencer.c:561 #, c-format msgid "git %s: failed to read the index" msgstr "git %s:无法读取索引" -#: sequencer.c:466 +#: sequencer.c:566 #, c-format msgid "git %s: failed to refresh the index" msgstr "git %s:无法刷新索引" -#: sequencer.c:551 +#: sequencer.c:624 #, c-format msgid "Cannot %s during a %s" msgstr "无法 %s 在一个 %s 过程中" -#: sequencer.c:573 +#: sequencer.c:646 #, c-format msgid "Could not parse line %d." msgstr "不能解析第 %d 行。" -#: sequencer.c:578 +#: sequencer.c:651 msgid "No commits parsed." msgstr "没有提交被解析。" -#: sequencer.c:591 +#: sequencer.c:664 #, c-format msgid "Could not open %s" msgstr "不能打开 %s" -#: sequencer.c:595 +#: sequencer.c:668 #, c-format msgid "Could not read %s." msgstr "不能读取 %s。" -#: sequencer.c:602 +#: sequencer.c:675 #, c-format msgid "Unusable instruction sheet: %s" msgstr "无用的指令表单:%s" -#: sequencer.c:630 +#: sequencer.c:703 #, c-format msgid "Invalid key: %s" msgstr "无效键名:%s" -#: sequencer.c:633 +#: sequencer.c:706 #, c-format msgid "Invalid value for %s: %s" -msgstr "无效的 %s 值:%s" +msgstr "%s 的值无效:%s" -#: sequencer.c:645 +#: sequencer.c:718 #, c-format msgid "Malformed options sheet: %s" msgstr "非法的选项表单:%s" -#: sequencer.c:666 +#: sequencer.c:739 msgid "a cherry-pick or revert is already in progress" msgstr "一个拣选或还原操作已在进行" -#: sequencer.c:667 +#: sequencer.c:740 msgid "try \"git cherry-pick (--continue | --quit | --abort)\"" msgstr "尝试 \"git cherry-pick (--continue | --quit | --abort)\"" -#: sequencer.c:671 +#: sequencer.c:744 #, c-format msgid "Could not create sequencer directory %s" msgstr "不能创建序列目录 %s" -#: sequencer.c:687 sequencer.c:772 +#: sequencer.c:760 sequencer.c:845 #, c-format msgid "Error wrapping up %s." msgstr "错误收尾 %s。" -#: sequencer.c:706 sequencer.c:840 +#: sequencer.c:779 sequencer.c:913 msgid "no cherry-pick or revert in progress" msgstr "没有拣选或还原操作在进行" -#: sequencer.c:708 +#: sequencer.c:781 msgid "cannot resolve HEAD" msgstr "不能解析 HEAD" -#: sequencer.c:710 +#: sequencer.c:783 msgid "cannot abort from a branch yet to be born" msgstr "不能从尚未建立的分支终止" -#: sequencer.c:732 +#: sequencer.c:805 builtin/apply.c:3697 #, c-format msgid "cannot open %s: %s" msgstr "不能打开 %s:%s" -#: sequencer.c:735 +#: sequencer.c:808 #, c-format msgid "cannot read %s: %s" msgstr "不能读取 %s:%s" -#: sequencer.c:736 +#: sequencer.c:809 msgid "unexpected end of file" msgstr "未预期的文件结束" -#: sequencer.c:742 +#: sequencer.c:815 #, c-format msgid "stored pre-cherry-pick HEAD file '%s' is corrupt" msgstr "保存拣选提交前的 HEAD 文件 '%s' 损坏" -#: sequencer.c:765 +#: sequencer.c:838 #, c-format msgid "Could not format %s." msgstr "不能格式化 %s。" -#: sequencer.c:927 +#: sequencer.c:1000 msgid "Can't revert as initial commit" msgstr "不能作为初始提交还原" -#: sequencer.c:928 +#: sequencer.c:1001 msgid "Can't cherry-pick into empty head" msgstr "不能拣选到空分支" @@ -430,261 +659,270 @@ msgstr "尚未给分支 '%s' 设置上游" msgid "Upstream branch '%s' not stored as a remote-tracking branch" msgstr "上游分支 '%s' 没有存储为一个远程跟踪分支" -#: wt-status.c:134 +#: wrapper.c:413 +#, c-format +msgid "unable to look up current user in the passwd file: %s" +msgstr "无法在 passwd 文件中查询到当前用户:%s" + +#: wrapper.c:414 +msgid "no such user" +msgstr "无此用户" + +#: wt-status.c:135 msgid "Unmerged paths:" msgstr "未合并的路径:" # 译者:注意保持前导空格 -#: wt-status.c:140 wt-status.c:157 +#: wt-status.c:141 wt-status.c:158 #, c-format msgid " (use \"git reset %s <file>...\" to unstage)" msgstr " (使用 \"git reset %s <file>...\" 撤出暂存区)" # 译者:注意保持前导空格 -#: wt-status.c:142 wt-status.c:159 +#: wt-status.c:143 wt-status.c:160 msgid " (use \"git rm --cached <file>...\" to unstage)" msgstr " (使用 \"git rm --cached <file>...\" 撤出暂存区)" # 译者:注意保持前导空格 -#: wt-status.c:143 +#: wt-status.c:144 msgid " (use \"git add/rm <file>...\" as appropriate to mark resolution)" msgstr " (酌情使用 \"git add/rm <file>...\" 标记解决方案)" -#: wt-status.c:151 +#: wt-status.c:152 msgid "Changes to be committed:" msgstr "要提交的变更:" -#: wt-status.c:169 +#: wt-status.c:170 msgid "Changes not staged for commit:" msgstr "尚未暂存以备提交的变更:" # 译者:注意保持前导空格 -#: wt-status.c:173 +#: wt-status.c:174 msgid " (use \"git add <file>...\" to update what will be committed)" msgstr " (使用 \"git add <file>...\" 更新要提交的内容)" # 译者:注意保持前导空格 -#: wt-status.c:175 +#: wt-status.c:176 msgid " (use \"git add/rm <file>...\" to update what will be committed)" msgstr " (使用 \"git add/rm <file>...\" 更新要提交的内容)" # 译者:注意保持前导空格 -#: wt-status.c:176 +#: wt-status.c:177 msgid "" " (use \"git checkout -- <file>...\" to discard changes in working directory)" msgstr " (使用 \"git checkout -- <file>...\" 丢弃工作区的改动)" # 译者:注意保持前导空格 -#: wt-status.c:178 +#: wt-status.c:179 msgid " (commit or discard the untracked or modified content in submodules)" msgstr " (提交或丢弃子模组中未跟踪或修改的内容)" -#: wt-status.c:187 +#: wt-status.c:188 #, c-format msgid "%s files:" msgstr "%s文件:" # 译者:注意保持前导空格 -#: wt-status.c:190 +#: wt-status.c:191 #, c-format msgid " (use \"git %s <file>...\" to include in what will be committed)" msgstr " (使用 \"git %s <file>...\" 以包含要提交的内容)" -#: wt-status.c:207 +#: wt-status.c:208 msgid "bug" msgstr "bug" -#: wt-status.c:212 +#: wt-status.c:213 msgid "both deleted:" msgstr "双方删除:" -#: wt-status.c:213 +#: wt-status.c:214 msgid "added by us:" msgstr "由我们添加:" -#: wt-status.c:214 +#: wt-status.c:215 msgid "deleted by them:" msgstr "由他们删除:" -#: wt-status.c:215 +#: wt-status.c:216 msgid "added by them:" msgstr "由他们添加:" -#: wt-status.c:216 +#: wt-status.c:217 msgid "deleted by us:" msgstr "由我们删除:" -#: wt-status.c:217 +#: wt-status.c:218 msgid "both added:" msgstr "双方添加:" -#: wt-status.c:218 +#: wt-status.c:219 msgid "both modified:" msgstr "双方修改:" # 译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字 -#: wt-status.c:248 +#: wt-status.c:249 msgid "new commits, " msgstr "新提交, " # 译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字 -#: wt-status.c:250 +#: wt-status.c:251 msgid "modified content, " msgstr "修改的内容, " # 译者:末尾两个字节可能被删减,如果翻译为中文标点会出现半个汉字 -#: wt-status.c:252 +#: wt-status.c:253 msgid "untracked content, " msgstr "未跟踪的内容, " # 译者:为保证在输出中对齐,注意调整句中空格! -#: wt-status.c:266 +#: wt-status.c:267 #, c-format msgid "new file: %s" msgstr "新文件: %s" # 译者:为保证在输出中对齐,注意调整句中空格! -#: wt-status.c:269 +#: wt-status.c:270 #, c-format msgid "copied: %s -> %s" msgstr "拷贝: %s -> %s" # 译者:为保证在输出中对齐,注意调整句中空格! -#: wt-status.c:272 +#: wt-status.c:273 #, c-format msgid "deleted: %s" msgstr "删除: %s" # 译者:为保证在输出中对齐,注意调整句中空格! -#: wt-status.c:275 +#: wt-status.c:276 #, c-format msgid "modified: %s" msgstr "修改: %s" # 译者:为保证在输出中对齐,注意调整句中空格! -#: wt-status.c:278 +#: wt-status.c:279 #, c-format msgid "renamed: %s -> %s" msgstr "重命名: %s -> %s" # 译者:为保证在输出中对齐,注意调整句中空格! -#: wt-status.c:281 +#: wt-status.c:282 #, c-format msgid "typechange: %s" msgstr "类型变更: %s" # 译者:为保证在输出中对齐,注意调整句中空格! -#: wt-status.c:284 +#: wt-status.c:285 #, c-format msgid "unknown: %s" msgstr "未知: %s" # 译者:为保证在输出中对齐,注意调整句中空格! -#: wt-status.c:287 +#: wt-status.c:288 #, c-format msgid "unmerged: %s" msgstr "未合并: %s" -#: wt-status.c:290 +#: wt-status.c:291 #, c-format msgid "bug: unhandled diff status %c" msgstr "bug:未处理的差异状态 %c" -#: wt-status.c:713 +#: wt-status.c:737 msgid "On branch " msgstr "位于分支 " -#: wt-status.c:720 +#: wt-status.c:744 msgid "Not currently on any branch." msgstr "当前不在任何分支上。" -#: wt-status.c:731 +#: wt-status.c:755 msgid "Initial commit" msgstr "初始提交" -#: wt-status.c:745 +#: wt-status.c:769 msgid "Untracked" msgstr "未跟踪的" -#: wt-status.c:747 +#: wt-status.c:771 msgid "Ignored" msgstr "忽略的" -#: wt-status.c:749 +#: wt-status.c:773 #, c-format msgid "Untracked files not listed%s" msgstr "未跟踪的文件没有列出%s" # 译者:中文字符串拼接,可删除前导空格 -#: wt-status.c:751 +#: wt-status.c:775 msgid " (use -u option to show untracked files)" msgstr "(使用 -u 参数显示未跟踪的文件)" -#: wt-status.c:757 +#: wt-status.c:781 msgid "No changes" msgstr "没有修改" -#: wt-status.c:761 +#: wt-status.c:785 #, c-format msgid "no changes added to commit%s\n" msgstr "修改尚未加入提交%s\n" # 译者:中文字符串拼接,可删除前导空格 -#: wt-status.c:763 +#: wt-status.c:787 msgid " (use \"git add\" and/or \"git commit -a\")" msgstr "(使用 \"git add\" 和/或 \"git commit -a\")" -#: wt-status.c:765 +#: wt-status.c:789 #, c-format msgid "nothing added to commit but untracked files present%s\n" msgstr "空提交但存在未跟踪文件%s\n" # 译者:中文字符串拼接,可删除前导空格 -#: wt-status.c:767 +#: wt-status.c:791 msgid " (use \"git add\" to track)" msgstr "(使用 \"git add\" 建立跟踪)" -#: wt-status.c:769 wt-status.c:772 wt-status.c:775 +#: wt-status.c:793 wt-status.c:796 wt-status.c:799 #, c-format msgid "nothing to commit%s\n" msgstr "无须提交%s\n" # 译者:中文字符串拼接,可删除前导空格 -#: wt-status.c:770 +#: wt-status.c:794 msgid " (create/copy files and use \"git add\" to track)" msgstr "(新建/拷贝的文件使用 \"git add\" 建立跟踪)" # 译者:中文字符串拼接,可删除前导空格 -#: wt-status.c:773 +#: wt-status.c:797 msgid " (use -u to show untracked files)" msgstr "(使用 -u 显示未跟踪文件)" # 译者:中文字符串拼接,可删除前导空格 -#: wt-status.c:776 +#: wt-status.c:800 msgid " (working directory clean)" msgstr "(干净的工作区)" -#: wt-status.c:884 +#: wt-status.c:908 msgid "HEAD (no branch)" msgstr "HEAD(非分支)" # 译者:注意保持句尾空格 -#: wt-status.c:890 +#: wt-status.c:914 msgid "Initial commit on " msgstr "初始提交于 " # 译者:注意保持句尾空格 -#: wt-status.c:905 +#: wt-status.c:929 msgid "behind " msgstr "落后 " # 译者:注意保持句尾空格 -#: wt-status.c:908 wt-status.c:911 +#: wt-status.c:932 wt-status.c:935 msgid "ahead " msgstr "领先 " # 译者:注意保持句尾空格 -#: wt-status.c:913 +#: wt-status.c:937 msgid ", behind " msgstr ",落后 " @@ -693,7 +931,7 @@ msgstr ",落后 " msgid "unexpected diff status %c" msgstr "意外的差异状态 %c" -#: builtin/add.c:67 builtin/commit.c:298 +#: builtin/add.c:67 builtin/commit.c:226 msgid "updating files failed" msgstr "更新文件失败" @@ -783,15 +1021,482 @@ msgstr "没有指定文件,也没有文件被添加。\n" msgid "Maybe you wanted to say 'git add .'?\n" msgstr "也许您想要执行 'git add .'?\n" -#: builtin/add.c:420 builtin/clean.c:95 builtin/commit.c:358 builtin/mv.c:82 +#: builtin/add.c:420 builtin/clean.c:95 builtin/commit.c:286 builtin/mv.c:82 #: builtin/rm.c:162 msgid "index file corrupt" msgstr "索引文件损坏" -#: builtin/add.c:476 builtin/mv.c:229 builtin/rm.c:260 +#: builtin/add.c:476 builtin/apply.c:4108 builtin/mv.c:229 builtin/rm.c:260 msgid "Unable to write new index file" msgstr "无法写入新索引文件" +#: builtin/apply.c:53 +msgid "git apply [options] [<patch>...]" +msgstr "git apply [选项] [<补丁>...]" + +#: builtin/apply.c:106 +#, c-format +msgid "unrecognized whitespace option '%s'" +msgstr "未能识别的空白字符选项 '%s'" + +#: builtin/apply.c:121 +#, c-format +msgid "unrecognized whitespace ignore option '%s'" +msgstr "未能识别的空白字符忽略选项 '%s'" + +#: builtin/apply.c:815 +#, c-format +msgid "Cannot prepare timestamp regexp %s" +msgstr "无法准备时间戳正则表达式 %s" + +#: builtin/apply.c:824 +#, c-format +msgid "regexec returned %d for input: %s" +msgstr "regexec 返回 %d,输入为:%s" + +#: builtin/apply.c:905 +#, c-format +msgid "unable to find filename in patch at line %d" +msgstr "不能在补丁的第 %d 行找到文件名" + +#: builtin/apply.c:937 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null, got %s on line %d" +msgstr "git apply:错误的 git-diff - 期望 /dev/null,但在第 %2$d 行得到 %1$s" + +#: builtin/apply.c:941 +#, c-format +msgid "git apply: bad git-diff - inconsistent new filename on line %d" +msgstr "git apply:错误的 git-diff - 第 %d 行上新文件名不一致" + +#: builtin/apply.c:942 +#, c-format +msgid "git apply: bad git-diff - inconsistent old filename on line %d" +msgstr "git apply:错误的 git-diff - 第 %d 行上旧文件名不一致" + +#: builtin/apply.c:949 +#, c-format +msgid "git apply: bad git-diff - expected /dev/null on line %d" +msgstr "git apply:错误的 git-diff - 期望 /dev/null 于第 %d 行" + +#: builtin/apply.c:1394 +#, c-format +msgid "recount: unexpected line: %.*s" +msgstr "recount:意外的行:%.*s" + +#: builtin/apply.c:1451 +#, c-format +msgid "patch fragment without header at line %d: %.*s" +msgstr "第 %d 行的补丁片段没有头信息:%.*s" + +#: builtin/apply.c:1468 +#, c-format +msgid "" +"git diff header lacks filename information when removing %d leading pathname " +"component (line %d)" +msgid_plural "" +"git diff header lacks filename information when removing %d leading pathname " +"components (line %d)" +msgstr[0] "当移除 %d 个前导路径后 git diff 头缺乏文件名信息(第 %d 行)" +msgstr[1] "当移除 %d 个前导路径后 git diff 头缺乏文件名信息(第 %d 行)" + +#: builtin/apply.c:1628 +msgid "new file depends on old contents" +msgstr "新文件依赖旧内容" + +#: builtin/apply.c:1630 +msgid "deleted file still has contents" +msgstr "删除的文件仍有内容" + +#: builtin/apply.c:1656 +#, c-format +msgid "corrupt patch at line %d" +msgstr "补丁损坏位于第 %d 行" + +#: builtin/apply.c:1692 +#, c-format +msgid "new file %s depends on old contents" +msgstr "新文件 %s 依赖旧内容" + +#: builtin/apply.c:1694 +#, c-format +msgid "deleted file %s still has contents" +msgstr "删除的文件 %s 仍有内容" + +#: builtin/apply.c:1697 +#, c-format +msgid "** warning: file %s becomes empty but is not deleted" +msgstr "** 警告:文件 %s 成为空文件但并未删除" + +#: builtin/apply.c:1843 +#, c-format +msgid "corrupt binary patch at line %d: %.*s" +msgstr "二进制补丁在第 %d 行损坏:%.*s" + +#. there has to be one hunk (forward hunk) +#: builtin/apply.c:1872 +#, c-format +msgid "unrecognized binary patch at line %d" +msgstr "未能识别的二进制补丁位于第 %d 行" + +#: builtin/apply.c:1958 +#, c-format +msgid "patch with only garbage at line %d" +msgstr "补丁文件的第 %d 行只有垃圾数据" + +#: builtin/apply.c:2048 +#, c-format +msgid "unable to read symlink %s" +msgstr "无法读取符号链接 %s" + +#: builtin/apply.c:2052 +#, c-format +msgid "unable to open or read %s" +msgstr "不能打开或读取 %s" + +#: builtin/apply.c:2123 +msgid "oops" +msgstr "哎哟" + +#: builtin/apply.c:2645 +#, c-format +msgid "invalid start of line: '%c'" +msgstr "无效的行首字符:'%c'" + +#: builtin/apply.c:2763 +#, c-format +msgid "Hunk #%d succeeded at %d (offset %d line)." +msgid_plural "Hunk #%d succeeded at %d (offset %d lines)." +msgstr[0] "块 #%d 成功应用于 %d (偏移 %d 行)" +msgstr[1] "块 #%d 成功应用于 %d (偏移 %d 行)" + +#: builtin/apply.c:2775 +#, c-format +msgid "Context reduced to (%ld/%ld) to apply fragment at %d" +msgstr "上下文减少到(%ld/%ld)以在第 %d 行应用补丁片段" + +#: builtin/apply.c:2781 +#, c-format +msgid "" +"while searching for:\n" +"%.*s" +msgstr "" +"当查询:\n" +"%.*s" + +#: builtin/apply.c:2800 +#, c-format +msgid "missing binary patch data for '%s'" +msgstr "缺失 '%s' 的二进制补丁数据" + +#: builtin/apply.c:2903 +#, c-format +msgid "binary patch does not apply to '%s'" +msgstr "二进制补丁未应用到 '%s'" + +#: builtin/apply.c:2909 +#, c-format +msgid "binary patch to '%s' creates incorrect result (expecting %s, got %s)" +msgstr "到 '%s' 的二进制补丁产生了不正确的结果(预期 %s,得到 %s)" + +#: builtin/apply.c:2930 +#, c-format +msgid "patch failed: %s:%ld" +msgstr "打补丁失败:%s:%ld" + +#: builtin/apply.c:3045 +#, c-format +msgid "patch %s has been renamed/deleted" +msgstr "补丁 %s 已经被重命名/删除" + +#: builtin/apply.c:3052 builtin/apply.c:3069 +#, c-format +msgid "read of %s failed" +msgstr "读取 %s 失败" + +#: builtin/apply.c:3084 +msgid "removal patch leaves file contents" +msgstr "移除补丁仍留下了文件内容" + +#: builtin/apply.c:3105 +#, c-format +msgid "%s: already exists in working directory" +msgstr "%s:已经存在于工作区中" + +#: builtin/apply.c:3143 +#, c-format +msgid "%s: has been deleted/renamed" +msgstr "%s:已经被删除/重命名" + +#: builtin/apply.c:3148 builtin/apply.c:3179 +#, c-format +msgid "%s: %s" +msgstr "%s:%s" + +#: builtin/apply.c:3159 +#, c-format +msgid "%s: does not exist in index" +msgstr "%s:不存在于索引中" + +#: builtin/apply.c:3173 +#, c-format +msgid "%s: does not match index" +msgstr "%s:和索引不匹配" + +#: builtin/apply.c:3190 +#, c-format +msgid "%s: wrong type" +msgstr "%s:错误类型" + +#: builtin/apply.c:3192 +#, c-format +msgid "%s has type %o, expected %o" +msgstr "%s 的类型是 %o,预期是 %o" + +#: builtin/apply.c:3247 +#, c-format +msgid "%s: already exists in index" +msgstr "%s:已经存在于索引中" + +#: builtin/apply.c:3267 +#, c-format +msgid "new mode (%o) of %s does not match old mode (%o)" +msgstr "%2$s 的新模式(%1$o)和旧模式(%3$o)不匹配" + +#: builtin/apply.c:3272 +#, c-format +msgid "new mode (%o) of %s does not match old mode (%o) of %s" +msgstr "%2$s 的新模式(%1$o)和 %4$s 的旧模式(%3$o)不匹配" + +#: builtin/apply.c:3280 +#, c-format +msgid "%s: patch does not apply" +msgstr "%s:补丁未应用" + +#: builtin/apply.c:3293 +#, c-format +msgid "Checking patch %s..." +msgstr "检查补丁 %s..." + +#: builtin/apply.c:3348 builtin/checkout.c:212 builtin/reset.c:158 +#, c-format +msgid "make_cache_entry failed for path '%s'" +msgstr "对路径 '%s' 的 make_cache_entry 操作失败" + +#: builtin/apply.c:3491 +#, c-format +msgid "unable to remove %s from index" +msgstr "不能从索引中移除 %s" + +#: builtin/apply.c:3518 +#, c-format +msgid "corrupt patch for subproject %s" +msgstr "子项目 %s 损坏的补丁" + +#: builtin/apply.c:3522 +#, c-format +msgid "unable to stat newly created file '%s'" +msgstr "不能枚举新建文件 '%s' 的状态" + +#: builtin/apply.c:3527 +#, c-format +msgid "unable to create backing store for newly created file %s" +msgstr "不能为新建文件 %s 创建后端存储" + +#: builtin/apply.c:3530 +#, c-format +msgid "unable to add cache entry for %s" +msgstr "无法为 %s 添加缓存条目" + +#: builtin/apply.c:3563 +#, c-format +msgid "closing file '%s'" +msgstr "关闭文件 '%s'" + +#: builtin/apply.c:3612 +#, c-format +msgid "unable to write file '%s' mode %o" +msgstr "不能写文件 '%s' 权限 %o" + +#: builtin/apply.c:3668 +#, c-format +msgid "Applied patch %s cleanly." +msgstr "成功应用补丁 %s。" + +#: builtin/apply.c:3676 +msgid "internal error" +msgstr "内部错误" + +#. Say this even without --verbose +#: builtin/apply.c:3679 +#, c-format +msgid "Applying patch %%s with %d reject..." +msgid_plural "Applying patch %%s with %d rejects..." +msgstr[0] "应用补丁 %%s 时 %d 个被拒绝..." +msgstr[1] "应用补丁 %%s 时 %d 个被拒绝..." + +#: builtin/apply.c:3689 +#, c-format +msgid "truncating .rej filename to %.*s.rej" +msgstr "截短 .rej 文件名为 %.*s.rej" + +#: builtin/apply.c:3710 +#, c-format +msgid "Hunk #%d applied cleanly." +msgstr "第 #%d 个片段成功应用。" + +#: builtin/apply.c:3713 +#, c-format +msgid "Rejected hunk #%d." +msgstr "拒绝第 #%d 个片段。" + +#: builtin/apply.c:3844 +msgid "unrecognized input" +msgstr "未能识别的输入" + +#: builtin/apply.c:3855 +msgid "unable to read index file" +msgstr "无法读取索引文件" + +#: builtin/apply.c:3970 builtin/apply.c:3973 +msgid "path" +msgstr "路径" + +#: builtin/apply.c:3971 +msgid "don't apply changes matching the given path" +msgstr "不要应用与给出路径向匹配的变更" + +#: builtin/apply.c:3974 +msgid "apply changes matching the given path" +msgstr "应用与给出路径向匹配的变更" + +#: builtin/apply.c:3976 +msgid "num" +msgstr "数字" + +#: builtin/apply.c:3977 +msgid "remove <num> leading slashes from traditional diff paths" +msgstr "从传统的 diff 路径中移除 <数字> 个前导路径" + +#: builtin/apply.c:3980 +msgid "ignore additions made by the patch" +msgstr "忽略补丁中的添加的文件" + +#: builtin/apply.c:3982 +msgid "instead of applying the patch, output diffstat for the input" +msgstr "不应用补丁,而是显示输入的差异统计(diffstat)" + +#: builtin/apply.c:3986 +msgid "shows number of added and deleted lines in decimal notation" +msgstr "以数字方式显示添加或删除行的数量" + +#: builtin/apply.c:3988 +msgid "instead of applying the patch, output a summary for the input" +msgstr "不应用补丁,而是显示输入的概要" + +#: builtin/apply.c:3990 +msgid "instead of applying the patch, see if the patch is applicable" +msgstr "不应用补丁,而是查看补丁是否可应用" + +#: builtin/apply.c:3992 +msgid "make sure the patch is applicable to the current index" +msgstr "确认补丁可以应用到当前索引" + +#: builtin/apply.c:3994 +msgid "apply a patch without touching the working tree" +msgstr "应用补丁而不修改工作区" + +#: builtin/apply.c:3996 +msgid "also apply the patch (use with --stat/--summary/--check)" +msgstr "同时应用此补丁(和 --stat/--summary/--check 共用)" + +#: builtin/apply.c:3998 +msgid "build a temporary index based on embedded index information" +msgstr "创建一个临时索引基于嵌入的索引信息" + +#: builtin/apply.c:4000 +msgid "paths are separated with NUL character" +msgstr "路径以 NUL 字符分隔" + +#: builtin/apply.c:4003 +msgid "ensure at least <n> lines of context match" +msgstr "确保至少匹配 <n> 行上下文" + +#: builtin/apply.c:4004 +msgid "action" +msgstr "动作" + +#: builtin/apply.c:4005 +msgid "detect new or modified lines that have whitespace errors" +msgstr "检查新增和修改的行中间的空白字符滥用" + +#: builtin/apply.c:4008 builtin/apply.c:4011 +msgid "ignore changes in whitespace when finding context" +msgstr "查找上下文时忽略空白字符的变更" + +#: builtin/apply.c:4014 +msgid "apply the patch in reverse" +msgstr "反向应用补丁" + +#: builtin/apply.c:4016 +msgid "don't expect at least one line of context" +msgstr "无需至少一行上下文" + +#: builtin/apply.c:4018 +msgid "leave the rejected hunks in corresponding *.rej files" +msgstr "将拒绝的补丁片段保存在对应的 *.rej 文件中" + +#: builtin/apply.c:4020 +msgid "allow overlapping hunks" +msgstr "允许重叠的补丁片段" + +#: builtin/apply.c:4021 +msgid "be verbose" +msgstr "冗长输出" + +#: builtin/apply.c:4023 +msgid "tolerate incorrectly detected missing new-line at the end of file" +msgstr "宽容不正确的文件末尾换行符" + +#: builtin/apply.c:4026 +msgid "do not trust the line counts in the hunk headers" +msgstr "不信任补丁片段的头信息中的行号" + +#: builtin/apply.c:4028 +msgid "root" +msgstr "根目录" + +#: builtin/apply.c:4029 +msgid "prepend <root> to all filenames" +msgstr "为所有文件名前添加 <根目录>" + +#: builtin/apply.c:4050 +msgid "--index outside a repository" +msgstr "--index 在一个版本库之外" + +#: builtin/apply.c:4053 +msgid "--cached outside a repository" +msgstr "--cached 在一个版本库之外" + +#: builtin/apply.c:4069 +#, c-format +msgid "can't open patch '%s'" +msgstr "不能打开补丁 '%s'" + +#: builtin/apply.c:4083 +#, c-format +msgid "squelched %d whitespace error" +msgid_plural "squelched %d whitespace errors" +msgstr[0] "抑制下仍有 %d 个空白字符误用" +msgstr[1] "抑制下仍有 %d 个空白字符误用" + +#: builtin/apply.c:4089 builtin/apply.c:4099 +#, c-format +msgid "%d line adds whitespace errors." +msgid_plural "%d lines add whitespace errors." +msgstr[0] "%d 行有空白字符误用。" +msgstr[1] "%d 行有空白字符误用。" + #: builtin/archive.c:17 #, c-format msgid "could not create archive file '%s'" @@ -828,7 +1533,7 @@ msgid "git archive: expected a flush" msgstr "git archive:预期一个刷新" # 译者:保持原换行格式,在输出时 %s 的替代内容会让字符串变长 -#: builtin/branch.c:137 +#: builtin/branch.c:144 #, c-format msgid "" "deleting branch '%s' that has been merged to\n" @@ -838,7 +1543,7 @@ msgstr "" " '%s',但未合并到 HEAD。" # 译者:保持原换行格式,在输出时 %s 的替代内容会让字符串变长 -#: builtin/branch.c:141 +#: builtin/branch.c:148 #, c-format msgid "" "not deleting branch '%s' that is not yet merged to\n" @@ -847,36 +1552,35 @@ msgstr "" "并未删除分支 '%s', 虽然它已经合并到 HEAD,\n" " 然而却尚未被合并到分支 '%s' 。" -# 译者:汉字之间无空格,故删除尾部空格 -#. TRANSLATORS: This is "remote " in "remote branch '%s' not found" -#: builtin/branch.c:164 -msgid "remote " -msgstr "远程" - -#: builtin/branch.c:172 +#: builtin/branch.c:180 msgid "cannot use -a with -d" msgstr "不能将 -a 和 -d 共用" -#: builtin/branch.c:178 +#: builtin/branch.c:186 msgid "Couldn't look up commit object for HEAD" msgstr "无法查询 HEAD 指向的提交对象" -#: builtin/branch.c:183 +#: builtin/branch.c:191 #, c-format msgid "Cannot delete the branch '%s' which you are currently on." msgstr "无法删除您当前所在的分支 '%s'。" -#: builtin/branch.c:193 +#: builtin/branch.c:202 #, c-format -msgid "%sbranch '%s' not found." -msgstr "%s分支 '%s' 未发现。" +msgid "remote branch '%s' not found." +msgstr "远程分支 '%s' 未发现。" -#: builtin/branch.c:201 +#: builtin/branch.c:203 +#, c-format +msgid "branch '%s' not found." +msgstr "分支 '%s' 未发现。" + +#: builtin/branch.c:210 #, c-format msgid "Couldn't look up commit object for '%s'" msgstr "无法查询 '%s' 指向的提交对象" -#: builtin/branch.c:207 +#: builtin/branch.c:216 #, c-format msgid "" "The branch '%s' is not fully merged.\n" @@ -885,97 +1589,123 @@ msgstr "" "分支 '%s' 没有完全合并。\n" "如果您确认要删除它,执行 'git branch -D %s'。" -#: builtin/branch.c:215 +#: builtin/branch.c:225 +#, c-format +msgid "Error deleting remote branch '%s'" +msgstr "删除远程分支 '%s' 时出错" + +#: builtin/branch.c:226 #, c-format -msgid "Error deleting %sbranch '%s'" -msgstr "删除 %s分支 '%s' 时出错" +msgid "Error deleting branch '%s'" +msgstr "删除分支 '%s' 时出错" -#: builtin/branch.c:221 +#: builtin/branch.c:233 #, c-format -msgid "Deleted %sbranch %s (was %s).\n" -msgstr "已删除 %s分支 %s(曾为 %s)。\n" +msgid "Deleted remote branch %s (was %s).\n" +msgstr "已删除远程分支 %s(曾为 %s)。\n" -#: builtin/branch.c:226 +#: builtin/branch.c:234 +#, c-format +msgid "Deleted branch %s (was %s).\n" +msgstr "已删除分支 %s(曾为 %s)。\n" + +#: builtin/branch.c:239 msgid "Update of config-file failed" msgstr "无法更新 config 文件" -#: builtin/branch.c:324 +#: builtin/branch.c:337 #, c-format msgid "branch '%s' does not point at a commit" msgstr "分支 '%s' 未指向一个提交" -# 译者:注意保持句尾空格 -#: builtin/branch.c:396 +#: builtin/branch.c:409 #, c-format -msgid "behind %d] " -msgstr "落后 %d] " +msgid "[%s: behind %d]" +msgstr "[%s:落后 %d]" -# 译者:注意保持句尾空格 -#: builtin/branch.c:398 +#: builtin/branch.c:411 #, c-format -msgid "ahead %d] " -msgstr "领先 %d] " +msgid "[behind %d]" +msgstr "[落后 %d]" -# 译者:注意保持句尾空格 -#: builtin/branch.c:400 +#: builtin/branch.c:415 +#, c-format +msgid "[%s: ahead %d]" +msgstr "[%s:领先 %d]" + +#: builtin/branch.c:417 #, c-format -msgid "ahead %d, behind %d] " -msgstr "领先 %d,落后 %d] " +msgid "[ahead %d]" +msgstr "[领先 %d]" -#: builtin/branch.c:503 +#: builtin/branch.c:420 +#, c-format +msgid "[%s: ahead %d, behind %d]" +msgstr "[%s:领先 %d,落后 %d]" + +#: builtin/branch.c:423 +#, c-format +msgid "[ahead %d, behind %d]" +msgstr "[领先 %d,落后 %d]" + +#: builtin/branch.c:535 msgid "(no branch)" msgstr "(非分支)" -#: builtin/branch.c:568 +#: builtin/branch.c:600 msgid "some refs could not be read" msgstr "一些引用不能读取" -#: builtin/branch.c:581 +#: builtin/branch.c:613 msgid "cannot rename the current branch while not on any." msgstr "无法重命名当前分支因为不处于任何分支上。" -#: builtin/branch.c:591 +#: builtin/branch.c:623 #, c-format msgid "Invalid branch name: '%s'" msgstr "无效的分支名:'%s'" -#: builtin/branch.c:606 +#: builtin/branch.c:638 msgid "Branch rename failed" msgstr "分支重命名失败" -#: builtin/branch.c:610 +#: builtin/branch.c:642 #, c-format msgid "Renamed a misnamed branch '%s' away" msgstr "重命名掉一个错误命名的旧分支 '%s'" -#: builtin/branch.c:614 +#: builtin/branch.c:646 #, c-format msgid "Branch renamed to %s, but HEAD is not updated!" msgstr "分支重命名为 %s,但 HEAD 没有更新!" -#: builtin/branch.c:621 +#: builtin/branch.c:653 msgid "Branch is renamed, but update of config-file failed" msgstr "分支被重命名,但更新 config 文件失败" -#: builtin/branch.c:636 +#: builtin/branch.c:668 #, c-format msgid "malformed object name %s" msgstr "非法的对象名 %s" -#: builtin/branch.c:660 +#: builtin/branch.c:692 #, c-format -msgid "could not write branch description template: %s\n" -msgstr "不能写分支描述模版:%s\n" +msgid "could not write branch description template: %s" +msgstr "不能写分支描述模版:%s" -#: builtin/branch.c:750 +#: builtin/branch.c:783 msgid "Failed to resolve HEAD as a valid ref." msgstr "无法将 HEAD 解析为有效引用。" -#: builtin/branch.c:755 builtin/clone.c:558 +#: builtin/branch.c:788 builtin/clone.c:558 msgid "HEAD not found below refs/heads!" msgstr "HEAD 没有位于 /refs/heads 之下!" -#: builtin/branch.c:813 +#: builtin/branch.c:808 +msgid "--column and --verbose are incompatible" +msgstr "--column 和 --verbose 不兼容" + +#: builtin/branch.c:857 msgid "-a and -r options to 'git branch' do not make sense with a branch name" msgstr "'git branch' 的 -a 和 -r 选项带一个分支名参数没有意义" @@ -1022,11 +1752,6 @@ msgstr "path '%s':无法合并" msgid "Unable to add merge result for '%s'" msgstr "无法为 '%s' 添加合并结果" -#: builtin/checkout.c:212 builtin/reset.c:158 -#, c-format -msgid "make_cache_entry failed for path '%s'" -msgstr "对路径 '%s' 的 make_cache_entry 操作失败" - #: builtin/checkout.c:234 builtin/checkout.c:392 msgid "corrupt index file" msgstr "损坏的索引文件" @@ -1106,6 +1831,10 @@ msgstr[0] "" "警告:您正丢下 %d 个提交,未和任何分支关联:\n" "\n" "%s\n" +msgstr[1] "" +"警告:您正丢下 %d 个提交,未和任何分支关联:\n" +"\n" +"%s\n" #: builtin/checkout.c:664 #, c-format @@ -1122,71 +1851,71 @@ msgstr "" " git branch new_branch_name %s\n" "\n" -#: builtin/checkout.c:693 +#: builtin/checkout.c:694 msgid "internal error in revision walk" msgstr "在版本遍历时遇到内部错误" -#: builtin/checkout.c:697 +#: builtin/checkout.c:698 msgid "Previous HEAD position was" msgstr "之前的 HEAD 位置是" -#: builtin/checkout.c:723 +#: builtin/checkout.c:724 msgid "You are on a branch yet to be born" msgstr "您位于一个尚未初始化的分支" #. case (1) -#: builtin/checkout.c:854 +#: builtin/checkout.c:855 #, c-format msgid "invalid reference: %s" msgstr "无效引用:%s" #. case (1): want a tree -#: builtin/checkout.c:893 +#: builtin/checkout.c:894 #, c-format msgid "reference is not a tree: %s" msgstr "引用不是一个树:%s" -#: builtin/checkout.c:973 +#: builtin/checkout.c:974 msgid "-B cannot be used with -b" msgstr "-B 不能和 -b 共用" -#: builtin/checkout.c:982 +#: builtin/checkout.c:983 msgid "--patch is incompatible with all other options" msgstr "--patch 选项和其他选项不兼容" -#: builtin/checkout.c:985 +#: builtin/checkout.c:986 msgid "--detach cannot be used with -b/-B/--orphan" msgstr "--detach 不能和 -b/-B/--orphan 共用" -#: builtin/checkout.c:987 +#: builtin/checkout.c:988 msgid "--detach cannot be used with -t" msgstr "--detach 不能和 -t 共用" -#: builtin/checkout.c:993 +#: builtin/checkout.c:994 msgid "--track needs a branch name" msgstr "--track 需要一个分支名" -#: builtin/checkout.c:1000 +#: builtin/checkout.c:1001 msgid "Missing branch name; try -b" msgstr "缺少分支名;尝试 -b" -#: builtin/checkout.c:1006 +#: builtin/checkout.c:1007 msgid "--orphan and -b|-B are mutually exclusive" msgstr "--orphan 和 -b|-B 互斥" -#: builtin/checkout.c:1008 +#: builtin/checkout.c:1009 msgid "--orphan cannot be used with -t" msgstr "--orphan 不能和 -t 共用" -#: builtin/checkout.c:1018 +#: builtin/checkout.c:1019 msgid "git checkout: -f and -m are incompatible" msgstr "git checkout:-f 和 -m 不兼容" -#: builtin/checkout.c:1052 +#: builtin/checkout.c:1053 msgid "invalid path specification" msgstr "无效的路径规格" -#: builtin/checkout.c:1060 +#: builtin/checkout.c:1061 #, c-format msgid "" "git checkout: updating paths is incompatible with switching branches.\n" @@ -1195,26 +1924,26 @@ msgstr "" "git checkout:更新路径和切换分支不兼容。\n" "您是想要检出 '%s' 但未能将其解析为提交么?" -#: builtin/checkout.c:1062 +#: builtin/checkout.c:1063 msgid "git checkout: updating paths is incompatible with switching branches." msgstr "git checkout:更新路径和切换分支不兼容。" -#: builtin/checkout.c:1067 +#: builtin/checkout.c:1068 msgid "git checkout: --detach does not take a path argument" msgstr "git checkout:--detach 不跟路径参数" -#: builtin/checkout.c:1070 +#: builtin/checkout.c:1071 msgid "" "git checkout: --ours/--theirs, --force and --merge are incompatible when\n" "checking out of the index." msgstr "" "git checkout:在从索引检出时,--ours/--theirs、--force 和 --merge 不兼容。" -#: builtin/checkout.c:1089 +#: builtin/checkout.c:1090 msgid "Cannot switch branch to a non-commit." msgstr "无法切换分支到一个非提交。" -#: builtin/checkout.c:1092 +#: builtin/checkout.c:1093 msgid "--ours/--theirs is incompatible with switching branches." msgstr "--ours/--theirs 和切换分支不兼容。" @@ -1385,7 +2114,11 @@ msgstr "远程分支 %s 在上游 %s 未发现" msgid "You appear to have cloned an empty repository." msgstr "您似乎克隆了一个空版本库。" -#: builtin/commit.c:42 +#: builtin/column.c:51 +msgid "--command must be the first argument" +msgstr "--command 必须是第一个参数" + +#: builtin/commit.c:43 msgid "" "Your name and email address were configured automatically based\n" "on your username and hostname. Please check that they are accurate.\n" @@ -1408,7 +2141,7 @@ msgstr "" "\n" " git commit --amend --reset-author\n" -#: builtin/commit.c:54 +#: builtin/commit.c:55 msgid "" "You asked to amend the most recent commit, but doing so would make\n" "it empty. You can repeat your command with --allow-empty, or you can\n" @@ -1417,7 +2150,7 @@ msgstr "" "您要修补最近的提交,但这么做会让它成为空提交。您可以重复您的命令并带上\n" "--allow-empty 选项,或者您可用命令 \"git reset HEAD^\" 整个删除该提交。\n" -#: builtin/commit.c:59 +#: builtin/commit.c:60 msgid "" "The previous cherry-pick is now empty, possibly due to conflict resolution.\n" "If you wish to commit it anyway, use:\n" @@ -1433,296 +2166,292 @@ msgstr "" "\n" "否则,请使用命令 'git reset'\n" -#: builtin/commit.c:205 builtin/reset.c:33 -msgid "merge" -msgstr "合并" - -#: builtin/commit.c:208 -msgid "cherry-pick" -msgstr "拣选" - -#: builtin/commit.c:325 +#: builtin/commit.c:253 msgid "failed to unpack HEAD tree object" msgstr "无法解包 HEAD 树对象" -#: builtin/commit.c:367 +#: builtin/commit.c:295 msgid "unable to create temporary index" msgstr "不能创建临时索引" -#: builtin/commit.c:373 +#: builtin/commit.c:301 msgid "interactive add failed" msgstr "交互式添加失败" -#: builtin/commit.c:406 builtin/commit.c:427 builtin/commit.c:473 +#: builtin/commit.c:334 builtin/commit.c:355 builtin/commit.c:405 msgid "unable to write new_index file" msgstr "无法写 new_index 文件" -# 译者:%s若翻为中文,前后不需要空格 -#: builtin/commit.c:457 -#, c-format -msgid "cannot do a partial commit during a %s." -msgstr "在%s过程中不能做部分提交。" +#: builtin/commit.c:386 +msgid "cannot do a partial commit during a merge." +msgstr "在合并过程中不能做部分提交。" -#: builtin/commit.c:466 +#: builtin/commit.c:388 +msgid "cannot do a partial commit during a cherry-pick." +msgstr "在拣选过程中不能做部分提交。" + +#: builtin/commit.c:398 msgid "cannot read the index" msgstr "无法读取索引" -#: builtin/commit.c:486 +#: builtin/commit.c:418 msgid "unable to write temporary index file" msgstr "无法写临时索引文件" -#: builtin/commit.c:561 builtin/commit.c:567 +#: builtin/commit.c:493 builtin/commit.c:499 #, c-format msgid "invalid commit: %s" msgstr "无效的提交:%s" -#: builtin/commit.c:590 +#: builtin/commit.c:522 msgid "malformed --author parameter" msgstr "非法的 --author 参数" -#: builtin/commit.c:651 +#: builtin/commit.c:582 #, c-format msgid "Malformed ident string: '%s'" msgstr "非法的身份字符串:'%s'" -#: builtin/commit.c:689 builtin/commit.c:722 builtin/commit.c:1033 +#: builtin/commit.c:620 builtin/commit.c:653 builtin/commit.c:967 #, c-format msgid "could not lookup commit %s" msgstr "不能查询提交 %s" -#: builtin/commit.c:701 builtin/shortlog.c:296 +#: builtin/commit.c:632 builtin/shortlog.c:296 #, c-format msgid "(reading log message from standard input)\n" msgstr "(正从标准输入中读取日志信息)\n" -#: builtin/commit.c:703 +#: builtin/commit.c:634 msgid "could not read log from standard input" msgstr "不能从标准输入中读取日志信息" -#: builtin/commit.c:707 +#: builtin/commit.c:638 #, c-format msgid "could not read log file '%s'" msgstr "不能读取日志文件 '%s'" -#: builtin/commit.c:713 +#: builtin/commit.c:644 msgid "commit has empty message" msgstr "提交说明为空" -#: builtin/commit.c:729 +#: builtin/commit.c:660 msgid "could not read MERGE_MSG" msgstr "不能读取 MERGE_MSG" -#: builtin/commit.c:733 +#: builtin/commit.c:664 msgid "could not read SQUASH_MSG" msgstr "不能读取 SQUASH_MSG" -#: builtin/commit.c:737 +#: builtin/commit.c:668 #, c-format msgid "could not read '%s'" msgstr "不能读取 '%s'" -#: builtin/commit.c:765 -#, c-format -msgid "could not open '%s'" -msgstr "不能打开 '%s'" - -#: builtin/commit.c:789 +#: builtin/commit.c:720 msgid "could not write commit template" msgstr "不能写提交模版" -# 译者:%s若翻为中文,前后不需要空格 -#: builtin/commit.c:799 +#: builtin/commit.c:731 #, c-format msgid "" "\n" -"It looks like you may be committing a %s.\n" +"It looks like you may be committing a merge.\n" "If this is not correct, please remove the file\n" "\t%s\n" "and try again.\n" msgstr "" "\n" -"看起来您正在提交一个%s。\n" -"如果不是这样,请删除文件\n" +"看起来您正在做一个合并提交。如果不对,请删除文件\n" "\t%s\n" "然后重试。\n" -#: builtin/commit.c:812 -msgid "Please enter the commit message for your changes." -msgstr "请为您的修改输入提交说明。" +#: builtin/commit.c:736 +#, c-format +msgid "" +"\n" +"It looks like you may be committing a cherry-pick.\n" +"If this is not correct, please remove the file\n" +"\t%s\n" +"and try again.\n" +msgstr "" +"\n" +"看起来您正在做一个拣选提交。如果不对,请删除文件\n" +"\t%s\n" +"然后重试。\n" -# 译者:中文字符串拼接,可删除前导空格 -#: builtin/commit.c:815 +#: builtin/commit.c:748 msgid "" -" Lines starting\n" +"Please enter the commit message for your changes. Lines starting\n" "with '#' will be ignored, and an empty message aborts the commit.\n" msgstr "" -"以 '#' 开头\n" -"的行将被忽略,并且空的提交说明将会中止提交。\n" +"请为您的变更输入提交说明。以 '#' 开始的行将被忽略,而一个空的提交\n" +"说明将会终止提交。\n" -# 译者:中文字符串拼接,可删除前导空格 -#: builtin/commit.c:820 +#: builtin/commit.c:753 msgid "" -" Lines starting\n" +"Please enter the commit message for your changes. Lines starting\n" "with '#' will be kept; you may remove them yourself if you want to.\n" "An empty message aborts the commit.\n" msgstr "" -"以 '#' 开头\n" -"的行将被保留,您可以删除它们如果您想这样做的话。空的提交说明将会\n" -"中止提交。\n" +"请为您的变更输入提交说明。以 '#' 开始的行将被保留,您可以删除它们\n" +"如果您想这样做的话。而一个空的提交说明将会终止提交。\n" # 译者:为保证在输出中对齐,注意调整句中空格! -#: builtin/commit.c:832 +#: builtin/commit.c:766 #, c-format msgid "%sAuthor: %s" msgstr "%s作者: %s" # 译者:为保证在输出中对齐,注意调整句中空格! -#: builtin/commit.c:839 +#: builtin/commit.c:773 #, c-format msgid "%sCommitter: %s" msgstr "%s提交者: %s" -#: builtin/commit.c:859 +#: builtin/commit.c:793 msgid "Cannot read index" msgstr "无法读取索引" -#: builtin/commit.c:896 +#: builtin/commit.c:830 msgid "Error building trees" msgstr "无法创建树对象" -#: builtin/commit.c:911 builtin/tag.c:357 +#: builtin/commit.c:845 builtin/tag.c:361 #, c-format msgid "Please supply the message using either -m or -F option.\n" msgstr "请使用 -m 或者 -F 选项提供提交说明。\n" -#: builtin/commit.c:1008 +#: builtin/commit.c:942 #, c-format msgid "No existing author found with '%s'" msgstr "没有找到匹配 '%s' 的作者" -#: builtin/commit.c:1023 builtin/commit.c:1217 +#: builtin/commit.c:957 builtin/commit.c:1157 #, c-format msgid "Invalid untracked files mode '%s'" msgstr "无效的未追踪文件参数 '%s'" -#: builtin/commit.c:1063 +#: builtin/commit.c:997 msgid "Using both --reset-author and --author does not make sense" msgstr "同时使用 --reset-author 和 --author 没有意义" -#: builtin/commit.c:1074 +#: builtin/commit.c:1008 msgid "You have nothing to amend." msgstr "您没有可修补的提交。" -# 译者:%s若翻为中文,前后不需要空格 -#: builtin/commit.c:1076 -#, c-format -msgid "You are in the middle of a %s -- cannot amend." -msgstr "您正处于一个%s的过程中 -- 无法修补提交。" +#: builtin/commit.c:1011 +msgid "You are in the middle of a merge -- cannot amend." +msgstr "您正处于一个合并过程中 -- 无法修补提交。" + +#: builtin/commit.c:1013 +msgid "You are in the middle of a cherry-pick -- cannot amend." +msgstr "您正处于一个拣选过程中 -- 无法修补提交。" -#: builtin/commit.c:1078 +#: builtin/commit.c:1016 msgid "Options --squash and --fixup cannot be used together" msgstr "选项 --squash 和 --fixup 不能共用" -#: builtin/commit.c:1088 +#: builtin/commit.c:1026 msgid "Only one of -c/-C/-F/--fixup can be used." msgstr "只能用一个 -c/-C/-F/--fixup 选项。" -#: builtin/commit.c:1090 +#: builtin/commit.c:1028 msgid "Option -m cannot be combined with -c/-C/-F/--fixup." msgstr "选项 -m 不能和 -c/-C/-F/--fixup 共用。" -#: builtin/commit.c:1098 +#: builtin/commit.c:1036 msgid "--reset-author can be used only with -C, -c or --amend." msgstr "--reset-author 只能和 -C、-c 或 --amend 共用。" -#: builtin/commit.c:1115 +#: builtin/commit.c:1053 msgid "Only one of --include/--only/--all/--interactive/--patch can be used." msgstr "只能用一个 --include/--only/--all/--interactive/--patch 选项。" -#: builtin/commit.c:1117 +#: builtin/commit.c:1055 msgid "No paths with --include/--only does not make sense." msgstr "参数 --include/--only 不跟路径没有意义。" -#: builtin/commit.c:1119 +#: builtin/commit.c:1057 msgid "Clever... amending the last one with dirty index." msgstr "聪明... 在索引不干净下修补最后的提交。" -#: builtin/commit.c:1121 +#: builtin/commit.c:1059 msgid "Explicit paths specified without -i nor -o; assuming --only paths..." msgstr "指定了明确的路径而没有使用 -i 或 -o 选项;认为是 --only paths..." -#: builtin/commit.c:1131 builtin/tag.c:556 +#: builtin/commit.c:1069 builtin/tag.c:577 #, c-format msgid "Invalid cleanup mode %s" msgstr "无效的清理模式 %s" -#: builtin/commit.c:1136 +#: builtin/commit.c:1074 msgid "Paths with -a does not make sense." msgstr "路径和 -a 选项共用没有意义。" -#: builtin/commit.c:1315 +#: builtin/commit.c:1257 msgid "couldn't look up newly created commit" msgstr "无法找到新创建的提交" -#: builtin/commit.c:1317 +#: builtin/commit.c:1259 msgid "could not parse newly created commit" msgstr "不能解析新创建的提交" -#: builtin/commit.c:1358 +#: builtin/commit.c:1300 msgid "detached HEAD" msgstr "分离头指针" # 译者:中文字符串拼接,可删除前导空格 -#: builtin/commit.c:1360 +#: builtin/commit.c:1302 msgid " (root-commit)" msgstr "(根提交)" -#: builtin/commit.c:1450 +#: builtin/commit.c:1446 msgid "could not parse HEAD commit" msgstr "不能解析 HEAD 提交" -#: builtin/commit.c:1487 builtin/merge.c:509 +#: builtin/commit.c:1484 builtin/merge.c:509 #, c-format msgid "could not open '%s' for reading" msgstr "不能为读入打开 '%s'" -#: builtin/commit.c:1494 +#: builtin/commit.c:1491 #, c-format msgid "Corrupt MERGE_HEAD file (%s)" msgstr "损坏的 MERGE_HEAD 文件(%s)" -#: builtin/commit.c:1501 +#: builtin/commit.c:1498 msgid "could not read MERGE_MODE" msgstr "不能读取 MERGE_MODE" -#: builtin/commit.c:1520 +#: builtin/commit.c:1517 #, c-format msgid "could not read commit message: %s" msgstr "不能读取提交说明:%s" -#: builtin/commit.c:1534 +#: builtin/commit.c:1531 #, c-format msgid "Aborting commit; you did not edit the message.\n" msgstr "终止提交;您未更改来自模版的提交说明。\n" -#: builtin/commit.c:1539 +#: builtin/commit.c:1536 #, c-format msgid "Aborting commit due to empty commit message.\n" msgstr "终止提交因为提交说明为空。\n" -#: builtin/commit.c:1554 builtin/merge.c:936 builtin/merge.c:961 +#: builtin/commit.c:1551 builtin/merge.c:936 builtin/merge.c:961 msgid "failed to write commit object" msgstr "无法写提交对象" -#: builtin/commit.c:1575 +#: builtin/commit.c:1572 msgid "cannot lock HEAD ref" msgstr "无法锁定 HEAD 引用" -#: builtin/commit.c:1579 +#: builtin/commit.c:1576 msgid "cannot update HEAD ref" msgstr "无法更新 HEAD 引用" -#: builtin/commit.c:1590 +#: builtin/commit.c:1587 msgid "" "Repository has been updated, but unable to write\n" "new_index file. Check that disk is not full or quota is\n" @@ -1931,20 +2660,20 @@ msgstr "" # 译者:注意保持前导空格 #: builtin/fetch.c:549 #, c-format -msgid " (%s will become dangling)\n" -msgstr " (%s 将成为悬空状态)\n" +msgid " (%s will become dangling)" +msgstr " (%s 将成为悬空状态)" # 译者:注意保持前导空格 #: builtin/fetch.c:550 #, c-format -msgid " (%s has become dangling)\n" -msgstr " (%s 已成为悬空状态)\n" +msgid " (%s has become dangling)" +msgstr " (%s 已成为悬空状态)" #: builtin/fetch.c:557 msgid "[deleted]" msgstr "[已删除]" -#: builtin/fetch.c:558 +#: builtin/fetch.c:558 builtin/remote.c:1055 msgid "(none)" msgstr "(无)" @@ -1966,14 +2695,14 @@ msgstr "选项 \"%s\" 的值 \"%s\" 对于 %s 是无效的" #: builtin/fetch.c:789 #, c-format msgid "Option \"%s\" is ignored for %s\n" -msgstr "选项 \"%s\" 对于 %s 被忽略\n" +msgstr "选项 \"%s\" 为 %s 所忽略\n" #: builtin/fetch.c:888 #, c-format msgid "Fetching %s\n" msgstr "正在获取 %s\n" -#: builtin/fetch.c:890 +#: builtin/fetch.c:890 builtin/remote.c:100 #, c-format msgid "Could not fetch %s" msgstr "不能获取 %s" @@ -2010,21 +2739,17 @@ msgstr "获取组并指定引用表达式没有意义" msgid "Invalid %s: '%s'" msgstr "无效的 %s:'%s'" -#: builtin/gc.c:78 -msgid "Too many options specified" -msgstr "指定了太多的选项" - -#: builtin/gc.c:103 +#: builtin/gc.c:90 #, c-format msgid "insanely long object directory %.*s" msgstr "不正常的长对象目录 %.*s" -#: builtin/gc.c:223 +#: builtin/gc.c:221 #, c-format msgid "Auto packing the repository for optimum performance.\n" msgstr "自动打包版本库以求最佳性能。\n" -#: builtin/gc.c:226 +#: builtin/gc.c:224 #, c-format msgid "" "Auto packing the repository for optimum performance. You may also\n" @@ -2033,7 +2758,7 @@ msgstr "" "自动打包版本库以求最佳性能。您还可以手动运行 \"git gc\"。\n" "参见 \"git help gc\" 以获取更多信息。\n" -#: builtin/gc.c:256 +#: builtin/gc.c:251 msgid "" "There are too many unreachable loose objects; run 'git prune' to remove them." msgstr "有太多不可达的松散对象,运行 'git prune' 删除它们。" @@ -2068,35 +2793,339 @@ msgstr "开关 `%c' 期望一个数字值" msgid "cannot open '%s'" msgstr "不能打开 '%s'" -#: builtin/grep.c:888 +#: builtin/grep.c:885 msgid "no pattern given." msgstr "未提供模式匹配。" -#: builtin/grep.c:902 +#: builtin/grep.c:899 #, c-format msgid "bad object %s" msgstr "坏对象 %s" -#: builtin/grep.c:943 +#: builtin/grep.c:940 msgid "--open-files-in-pager only works on the worktree" msgstr "--open-files-in-pager 仅用于工作区" -#: builtin/grep.c:966 +#: builtin/grep.c:963 msgid "--cached or --untracked cannot be used with --no-index." msgstr "--cached 或 --untracked 不能与 --no-index 共用。" -#: builtin/grep.c:971 +#: builtin/grep.c:968 msgid "--no-index or --untracked cannot be used with revs." msgstr "--no-index 或 --untracked 不能和版本共用。" -#: builtin/grep.c:974 +#: builtin/grep.c:971 msgid "--[no-]exclude-standard cannot be used for tracked contents." msgstr "--[no-]exclude-standard 不能用于已跟踪内容。" -#: builtin/grep.c:982 +#: builtin/grep.c:979 msgid "both --cached and trees are given." msgstr "同时给出了 --cached 和树对象。" +#: builtin/help.c:59 +#, c-format +msgid "unrecognized help format '%s'" +msgstr "未能识别的帮助格式 '%s'" + +#: builtin/help.c:87 +msgid "Failed to start emacsclient." +msgstr "无法启动 emacsclient。" + +#: builtin/help.c:100 +msgid "Failed to parse emacsclient version." +msgstr "无法解析 emacsclient 版本。" + +#: builtin/help.c:108 +#, c-format +msgid "emacsclient version '%d' too old (< 22)." +msgstr "emacsclient 版本 '%d' 太老 (< 22)。" + +#: builtin/help.c:126 builtin/help.c:154 builtin/help.c:163 builtin/help.c:171 +#, c-format +msgid "failed to exec '%s': %s" +msgstr "无法执行 '%s':%s" + +#: builtin/help.c:211 +#, c-format +msgid "" +"'%s': path for unsupported man viewer.\n" +"Please consider using 'man.<tool>.cmd' instead." +msgstr "" +"'%s':不支持的 man 手册查看器的路径。\n" +"请使用 'man.<tool>.cmd'。" + +#: builtin/help.c:223 +#, c-format +msgid "" +"'%s': cmd for supported man viewer.\n" +"Please consider using 'man.<tool>.path' instead." +msgstr "" +"'%s': 支持的 man 手册查看器命令。\n" +"请使用 'man.<tool>.path'。" + +#: builtin/help.c:287 +msgid "The most commonly used git commands are:" +msgstr "最常用的 git 命令有:" + +#: builtin/help.c:355 +#, c-format +msgid "'%s': unknown man viewer." +msgstr "'%s':未知的 man 查看器。" + +#: builtin/help.c:372 +msgid "no man viewer handled the request" +msgstr "没有 man 查看器处理此请求" + +#: builtin/help.c:380 +msgid "no info viewer handled the request" +msgstr "没有 info 查看器处理此请求" + +#: builtin/help.c:391 +#, c-format +msgid "'%s': not a documentation directory." +msgstr "'%s':不是一个文档目录。" + +#: builtin/help.c:432 builtin/help.c:439 +#, c-format +msgid "usage: %s%s" +msgstr "用法:%s%s" + +#: builtin/help.c:453 +#, c-format +msgid "`git %s' is aliased to `%s'" +msgstr "`git %s' 是 `%s' 的别名" + +#: builtin/index-pack.c:169 +#, c-format +msgid "object type mismatch at %s" +msgstr "%s 的对象类型不匹配" + +#: builtin/index-pack.c:189 +msgid "object of unexpected type" +msgstr "意外的类型的对象" + +#: builtin/index-pack.c:226 +#, c-format +msgid "cannot fill %d byte" +msgid_plural "cannot fill %d bytes" +msgstr[0] "无法填充 %d 字节" +msgstr[1] "无法填充 %d 字节" + +#: builtin/index-pack.c:236 +msgid "early EOF" +msgstr "过早的文件结束符(EOF)" + +#: builtin/index-pack.c:237 +msgid "read error on input" +msgstr "输入上的读错误" + +#: builtin/index-pack.c:249 +msgid "used more bytes than were available" +msgstr "用掉了超过可用的字节" + +#: builtin/index-pack.c:256 +msgid "pack too large for current definition of off_t" +msgstr "包太大超过了当前 off_t 的定义" + +#: builtin/index-pack.c:272 +#, c-format +msgid "unable to create '%s'" +msgstr "不能创建 '%s'" + +#: builtin/index-pack.c:277 +#, c-format +msgid "cannot open packfile '%s'" +msgstr "无法打开包文件 '%s'" + +#: builtin/index-pack.c:291 +msgid "pack signature mismatch" +msgstr "包签名不匹配" + +#: builtin/index-pack.c:311 +#, c-format +msgid "pack has bad object at offset %lu: %s" +msgstr "包中有错误的对象位于 %lu:%s" + +#: builtin/index-pack.c:405 +#, c-format +msgid "inflate returned %d" +msgstr "解压缩返回 %d" + +#: builtin/index-pack.c:450 +msgid "offset value overflow for delta base object" +msgstr "偏移值覆盖了 delta 基准对象" + +#: builtin/index-pack.c:458 +msgid "delta base offset is out of bound" +msgstr "delta 基准偏移越界" + +#: builtin/index-pack.c:466 +#, c-format +msgid "unknown object type %d" +msgstr "未知对象类型 %d" + +#: builtin/index-pack.c:495 +msgid "cannot pread pack file" +msgstr "无法读取包文件" + +#: builtin/index-pack.c:497 +#, c-format +msgid "premature end of pack file, %lu byte missing" +msgid_plural "premature end of pack file, %lu bytes missing" +msgstr[0] "包文件过早结束,缺少 %lu 字节" +msgstr[1] "包文件过早结束,缺少 %lu 字节" + +#: builtin/index-pack.c:510 +msgid "serious inflate inconsistency" +msgstr "解压缩严重的不一致" + +#: builtin/index-pack.c:583 +#, c-format +msgid "cannot read existing object %s" +msgstr "不能读取现存对象 %s" + +#: builtin/index-pack.c:586 +#, c-format +msgid "SHA1 COLLISION FOUND WITH %s !" +msgstr "发现 %s 出现 SHA1 冲突!" + +#: builtin/index-pack.c:598 +#, c-format +msgid "invalid blob object %s" +msgstr "无效的 blob 对象 %s" + +#: builtin/index-pack.c:610 +#, c-format +msgid "invalid %s" +msgstr "无效的 %s" + +#: builtin/index-pack.c:612 +msgid "Error in object" +msgstr "对象中出错" + +#: builtin/index-pack.c:614 +#, c-format +msgid "Not all child objects of %s are reachable" +msgstr "%s 的所有子对象并非都可达" + +#: builtin/index-pack.c:687 builtin/index-pack.c:713 +msgid "failed to apply delta" +msgstr "无法应用 delta" + +#: builtin/index-pack.c:850 +msgid "Receiving objects" +msgstr "接收对象中" + +#: builtin/index-pack.c:850 +msgid "Indexing objects" +msgstr "索引对象中" + +#: builtin/index-pack.c:872 +msgid "pack is corrupted (SHA1 mismatch)" +msgstr "包冲突(SHA1 不匹配)" + +#: builtin/index-pack.c:877 +msgid "cannot fstat packfile" +msgstr "不能枚举包文件状态" + +#: builtin/index-pack.c:880 +msgid "pack has junk at the end" +msgstr "包的结尾有垃圾数据" + +#: builtin/index-pack.c:903 +msgid "Resolving deltas" +msgstr "处理 delta 中" + +#: builtin/index-pack.c:954 +msgid "confusion beyond insanity" +msgstr "不可理喻" + +#: builtin/index-pack.c:973 +#, c-format +msgid "pack has %d unresolved delta" +msgid_plural "pack has %d unresolved deltas" +msgstr[0] "包有 %d 个未解决的 delta" +msgstr[1] "包有 %d 个未解决的 delta" + +#: builtin/index-pack.c:998 +#, c-format +msgid "unable to deflate appended object (%d)" +msgstr "不能缩小附加对象(%d)" + +#: builtin/index-pack.c:1077 +#, c-format +msgid "local object %s is corrupt" +msgstr "本地对象 %s 已损坏" + +#: builtin/index-pack.c:1101 +msgid "error while closing pack file" +msgstr "关闭包文件时出错" + +#: builtin/index-pack.c:1114 +#, c-format +msgid "cannot write keep file '%s'" +msgstr "无法写保留文件 '%s'" + +#: builtin/index-pack.c:1122 +#, c-format +msgid "cannot close written keep file '%s'" +msgstr "无法关闭保留文件 '%s'" + +#: builtin/index-pack.c:1135 +msgid "cannot store pack file" +msgstr "无法存储包文件" + +#: builtin/index-pack.c:1146 +msgid "cannot store index file" +msgstr "无法存储索引文件" + +#: builtin/index-pack.c:1247 +#, c-format +msgid "Cannot open existing pack file '%s'" +msgstr "无法打开现存包文件 '%s'" + +#: builtin/index-pack.c:1249 +#, c-format +msgid "Cannot open existing pack idx file for '%s'" +msgstr "无法为 %s 打开包索引文件" + +#: builtin/index-pack.c:1296 +#, c-format +msgid "non delta: %d object" +msgid_plural "non delta: %d objects" +msgstr[0] "非 delta:%d 个对象" +msgstr[1] "非 delta:%d 个对象" + +#: builtin/index-pack.c:1303 +#, c-format +msgid "chain length = %d: %lu object" +msgid_plural "chain length = %d: %lu objects" +msgstr[0] "链长 = %d: %lu 对象" +msgstr[1] "链长 = %d: %lu 对象" + +#: builtin/index-pack.c:1330 +msgid "Cannot come back to cwd" +msgstr "无法返回当前工作目录" + +#: builtin/index-pack.c:1374 builtin/index-pack.c:1377 +#: builtin/index-pack.c:1389 builtin/index-pack.c:1393 +#, c-format +msgid "bad %s" +msgstr "错误选项 %s" + +#: builtin/index-pack.c:1407 +msgid "--fix-thin cannot be used without --stdin" +msgstr "--fix-thin 不能和 --stdin 共用" + +#: builtin/index-pack.c:1411 builtin/index-pack.c:1421 +#, c-format +msgid "packfile name '%s' does not end with '.pack'" +msgstr "包名 '%s' 没有以 '.pack' 结尾" + +#: builtin/index-pack.c:1430 +msgid "--verify with no packfile name given" +msgstr "--verify 没有提供包名参数" + #: builtin/init-db.c:35 #, c-format msgid "Could not make %s writable by group" @@ -2160,7 +3189,7 @@ msgstr "模版未找到 %s" #: builtin/init-db.c:154 #, c-format msgid "not copying templates of a wrong format version %d from '%s'" -msgstr "未复制错误版本 %d 的模版自 '%s'" +msgstr "没有从 '%2$s' 复制带有错误版本 %1$d 的模版" #: builtin/init-db.c:192 #, c-format @@ -2261,90 +3290,81 @@ msgstr "未知类型:%d" msgid "format.headers without value" msgstr "format.headers 没有值" -#: builtin/log.c:675 +#: builtin/log.c:676 msgid "name of output directory is too long" msgstr "输出目录名太长" -#: builtin/log.c:686 +#: builtin/log.c:687 #, c-format msgid "Cannot open patch file %s" msgstr "无法打开补丁文件 %s" -#: builtin/log.c:700 +#: builtin/log.c:701 msgid "Need exactly one range." msgstr "只需要一个范围。" -#: builtin/log.c:708 +#: builtin/log.c:709 msgid "Not a range." msgstr "不是一个范围。" -#: builtin/log.c:745 -msgid "Could not extract email from committer identity." -msgstr "不能从提交者身份中提取邮件地址。" - -#: builtin/log.c:791 +#: builtin/log.c:786 msgid "Cover letter needs email format" msgstr "信封需要邮件地址格式" -#: builtin/log.c:885 +#: builtin/log.c:859 #, c-format msgid "insane in-reply-to: %s" msgstr "不正常的 in-reply-to:%s" -#: builtin/log.c:958 +#: builtin/log.c:932 msgid "Two output directories?" msgstr "两个输出目录?" -#: builtin/log.c:1179 +#: builtin/log.c:1153 #, c-format msgid "bogus committer info %s" msgstr "虚假的提交者信息 %s" -#: builtin/log.c:1224 +#: builtin/log.c:1198 msgid "-n and -k are mutually exclusive." msgstr "-n 和 -k 互斥。" -#: builtin/log.c:1226 +#: builtin/log.c:1200 msgid "--subject-prefix and -k are mutually exclusive." msgstr "--subject-prefix 和 -k 互斥。" -#: builtin/log.c:1231 builtin/shortlog.c:284 -#, c-format -msgid "unrecognized argument: %s" -msgstr "未识别的参数:%s" - -#: builtin/log.c:1234 +#: builtin/log.c:1208 msgid "--name-only does not make sense" msgstr "--name-only 无意义" -#: builtin/log.c:1236 +#: builtin/log.c:1210 msgid "--name-status does not make sense" msgstr "--name-status 无意义" -#: builtin/log.c:1238 +#: builtin/log.c:1212 msgid "--check does not make sense" msgstr "--check 无意义" -#: builtin/log.c:1261 +#: builtin/log.c:1235 msgid "standard output, or directory, which one?" msgstr "标准输出或目录,哪一个?" -#: builtin/log.c:1263 +#: builtin/log.c:1237 #, c-format msgid "Could not create directory '%s'" msgstr "不能创建目录 '%s'" -#: builtin/log.c:1416 +#: builtin/log.c:1390 msgid "Failed to create output files" msgstr "无法创建输出文件" -#: builtin/log.c:1520 +#: builtin/log.c:1494 #, c-format msgid "" "Could not find a tracked remote branch, please specify <upstream> manually.\n" msgstr "不能找到跟踪的远程分支,请手工指定 <upstream>。\n" -#: builtin/log.c:1536 builtin/log.c:1538 builtin/log.c:1550 +#: builtin/log.c:1510 builtin/log.c:1512 builtin/log.c:1524 #, c-format msgid "Unknown commit %s" msgstr "未知提交 %s" @@ -2666,7 +3686,7 @@ msgstr "%s,源=%s,目标=%s" msgid "Renaming %s to %s\n" msgstr "重命名 %s 至 %s\n" -#: builtin/mv.c:215 +#: builtin/mv.c:215 builtin/remote.c:731 #, c-format msgid "renaming '%s' failed" msgstr "重命名 '%s' 失败" @@ -2690,7 +3710,7 @@ msgstr "无法为对象 '%s' 的 'show' 关闭管道" msgid "failed to finish 'show' for object '%s'" msgstr "无法为对象 '%s' 完成 'show'" -#: builtin/notes.c:175 builtin/tag.c:343 +#: builtin/notes.c:175 builtin/tag.c:347 #, c-format msgid "could not create file '%s'" msgstr "不能创建文件 '%s'" @@ -2713,12 +3733,12 @@ msgstr "不能写注解对象" msgid "The note contents has been left in %s" msgstr "注解内容被留在文件 %s 中" -#: builtin/notes.c:251 builtin/tag.c:521 +#: builtin/notes.c:251 builtin/tag.c:542 #, c-format msgid "cannot read '%s'" msgstr "不能读取 '%s'" -#: builtin/notes.c:253 builtin/tag.c:524 +#: builtin/notes.c:253 builtin/tag.c:545 #, c-format msgid "could not open or read '%s'" msgstr "不能打开或读取 '%s'" @@ -2726,7 +3746,7 @@ msgstr "不能打开或读取 '%s'" #: builtin/notes.c:272 builtin/notes.c:445 builtin/notes.c:447 #: builtin/notes.c:507 builtin/notes.c:561 builtin/notes.c:644 #: builtin/notes.c:649 builtin/notes.c:724 builtin/notes.c:766 -#: builtin/notes.c:968 builtin/reset.c:293 builtin/tag.c:537 +#: builtin/notes.c:968 builtin/reset.c:293 builtin/tag.c:558 #, c-format msgid "Failed to resolve '%s' as a valid ref." msgstr "无法解析 '%s' 为一个有效引用。" @@ -2820,30 +3840,30 @@ msgstr "" msgid "Object %s has no note\n" msgstr "对象 %s 没有注解\n" -#: builtin/notes.c:1103 +#: builtin/notes.c:1103 builtin/remote.c:1598 #, c-format msgid "Unknown subcommand: %s" msgstr "未知子命令:%s" -#: builtin/pack-objects.c:2310 +#: builtin/pack-objects.c:2337 #, c-format msgid "unsupported index version %s" msgstr "不支持的索引版本 %s" -#: builtin/pack-objects.c:2314 +#: builtin/pack-objects.c:2341 #, c-format msgid "bad index version '%s'" msgstr "坏的索引版本 '%s'" -#: builtin/pack-objects.c:2322 +#: builtin/pack-objects.c:2364 #, c-format msgid "option %s does not accept negative form" msgstr "选项 %s 不接受否定格式" -#: builtin/pack-objects.c:2326 +#: builtin/pack-objects.c:2368 #, c-format msgid "unable to parse value '%s' for option %s" -msgstr "不能解析值 '%s' 针对于选项 %s" +msgstr "不能解析选项 %1$s 的值 '%2$s'" #: builtin/push.c:45 msgid "tag shorthand without <tag>" @@ -2853,7 +3873,39 @@ msgstr "tag 简写没有跟 <tag> 参数" msgid "--delete only accepts plain target ref names" msgstr "--delete 只接受简单的目标引用名" -#: builtin/push.c:84 +#: builtin/push.c:99 +msgid "" +"\n" +"To choose either option permanently, see push.default in 'git help config'." +msgstr "" +"\n" +"为了永久地选择任一选项,参见 'git help config' 中的 push.default。" + +#: builtin/push.c:102 +#, c-format +msgid "" +"The upstream branch of your current branch does not match\n" +"the name of your current branch. To push to the upstream branch\n" +"on the remote, use\n" +"\n" +" git push %s HEAD:%s\n" +"\n" +"To push to the branch of the same name on the remote, use\n" +"\n" +" git push %s %s\n" +"%s" +msgstr "" +"如果您当前分支的上游分支和您当前分支名不匹配,为推送到远程的\n" +"上游分支,使用\n" +"\n" +" git push %s HEAD:%s\n" +"\n" +"为推送至远程同名分支,使用\n" +"\n" +" git push %s %s\n" +"%s" + +#: builtin/push.c:121 #, c-format msgid "" "You are not currently on a branch.\n" @@ -2867,7 +3919,7 @@ msgstr "" "\n" " git push %s HEAD:<name-of-remote-branch>\n" -#: builtin/push.c:91 +#: builtin/push.c:128 #, c-format msgid "" "The current branch %s has no upstream branch.\n" @@ -2880,12 +3932,12 @@ msgstr "" "\n" " git push --set-upstream %s %s\n" -#: builtin/push.c:99 +#: builtin/push.c:136 #, c-format msgid "The current branch %s has multiple upstream branches, refusing to push." msgstr "当前分支 %s 有多个上游分支,拒绝推送。" -#: builtin/push.c:102 +#: builtin/push.c:139 #, c-format msgid "" "You are pushing to remote '%s', which is not the upstream of\n" @@ -2895,60 +3947,60 @@ msgstr "" "您正推送至远程 '%s'(其并非当前分支 '%s' 的上游),\n" "而没有告诉我要推送什么、更新哪个远程分支。" -#: builtin/push.c:131 +#: builtin/push.c:174 msgid "" "You didn't specify any refspecs to push, and push.default is \"nothing\"." msgstr "您没有为推送指定任何引用表达式,并且 push.default 为 \"nothing\"。" -#: builtin/push.c:138 +#: builtin/push.c:181 msgid "" "Updates were rejected because the tip of your current branch is behind\n" "its remote counterpart. Merge the remote changes (e.g. 'git pull')\n" "before pushing again.\n" "See the 'Note about fast-forwards' in 'git push --help' for details." msgstr "" -"更新被拒绝,因为您当前分支落后于对应的远程分支。再次推送前先与远程变更\n" -"合并(如 'git pull')。\n" -"详见 'git push --help' 中的 'Note about fast-forwards' 的内容。" +"更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支。\n" +"再次推送前,先与远程变更合并(如 'git pull')。详见\n" +"'git push --help' 中的 'Note about fast-forwards' 小节。" -#: builtin/push.c:144 +#: builtin/push.c:187 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. If you did not intend to push that branch, you may want to\n" "specify branches to push or set the 'push.default' configuration\n" "variable to 'current' or 'upstream' to push only the current branch." msgstr "" -"更新被拒绝,因为推送的一个分支落后于对应的远程分支。如果您并非有意推送\n" -"该分支,您可以指定要推送的分支或者设置 'push.default' 配置变量为\n" -"'current' 或 'upstream' 以便只推送当前分支。" +"更新被拒绝,因为推送的一个分支的最新提交落后于其对应的远程分支。\n" +"如果您并非有意推送该分支,您可以在推送时指定要推送的分支,或者将\n" +"配置变量 'push.default' 设置为 'current' 或 'upstream' 以便只推送当前分支。" -#: builtin/push.c:150 +#: builtin/push.c:193 msgid "" "Updates were rejected because a pushed branch tip is behind its remote\n" "counterpart. Check out this branch and merge the remote changes\n" "(e.g. 'git pull') before pushing again.\n" "See the 'Note about fast-forwards' in 'git push --help' for details." msgstr "" -"更新被拒绝,因为推送的一个分支落后于对应的远程分支。检出该分支并在再次\n" -"推送之前与远程变更合并(如 'git pull')。\n" -"详见 'git push --help' 中的 'Note about fast-forwards' 的内容。" +"更新被拒绝,因为推送的一个分支的最新提交落后于其对应的远程分支。\n" +"检出该分支并与远程变更合并(如 'git pull'),然后再推送。详见\n" +"'git push --help' 中的 'Note about fast-forwards' 小节。" -#: builtin/push.c:190 +#: builtin/push.c:233 #, c-format msgid "Pushing to %s\n" msgstr "推送到 %s\n" -#: builtin/push.c:194 +#: builtin/push.c:237 #, c-format msgid "failed to push some refs to '%s'" msgstr "无法推送一些引用到 '%s'" -#: builtin/push.c:226 +#: builtin/push.c:269 #, c-format msgid "bad repository '%s'" msgstr "坏的版本库 '%s'" -#: builtin/push.c:227 +#: builtin/push.c:270 msgid "" "No configured push destination.\n" "Either specify the URL from the command-line or configure a remote " @@ -2969,34 +4021,385 @@ msgstr "" "\n" " git push <name>\n" -#: builtin/push.c:242 +#: builtin/push.c:285 msgid "--all and --tags are incompatible" msgstr "--all 和 --tags 不兼容" -#: builtin/push.c:243 +#: builtin/push.c:286 msgid "--all can't be combined with refspecs" msgstr "--all 不能和引用表达式共用" -#: builtin/push.c:248 +#: builtin/push.c:291 msgid "--mirror and --tags are incompatible" msgstr "--mirror 和 --tags 不兼容" -#: builtin/push.c:249 +#: builtin/push.c:292 msgid "--mirror can't be combined with refspecs" msgstr "--mirror 不能和引用表达式共用" -#: builtin/push.c:254 +#: builtin/push.c:297 msgid "--all and --mirror are incompatible" msgstr "--all 和 --mirror 不兼容" -#: builtin/push.c:342 +#: builtin/push.c:385 msgid "--delete is incompatible with --all, --mirror and --tags" msgstr "--delete 与 --all、--mirror 及 --tags 不兼容" -#: builtin/push.c:344 +#: builtin/push.c:387 msgid "--delete doesn't make sense without any refs" msgstr "--delete 未接任何引用没有意义" +#: builtin/remote.c:98 +#, c-format +msgid "Updating %s" +msgstr "更新 %s 中" + +#: builtin/remote.c:130 +msgid "" +"--mirror is dangerous and deprecated; please\n" +"\t use --mirror=fetch or --mirror=push instead" +msgstr "" +"--mirror 选项危险且过时,请使用 --mirror=fetch\n" +"\t 或 --mirror=push" + +#: builtin/remote.c:147 +#, c-format +msgid "unknown mirror argument: %s" +msgstr "未知的镜像参数:%s" + +#: builtin/remote.c:185 +msgid "specifying a master branch makes no sense with --mirror" +msgstr "指定一个 master 分支并使用 --mirror 选项没有意义" + +#: builtin/remote.c:187 +msgid "specifying branches to track makes sense only with fetch mirrors" +msgstr "指定要跟踪的分支只在与获取镜像共用才有意义" + +#: builtin/remote.c:195 builtin/remote.c:646 +#, c-format +msgid "remote %s already exists." +msgstr "远程 %s 已经存在。" + +#: builtin/remote.c:199 builtin/remote.c:650 +#, c-format +msgid "'%s' is not a valid remote name" +msgstr "'%s' 不是一个有效的远程名称" + +#: builtin/remote.c:243 +#, c-format +msgid "Could not setup master '%s'" +msgstr "无法设置 master '%s'" + +#: builtin/remote.c:299 +#, c-format +msgid "more than one %s" +msgstr "多于一个 %s" + +#: builtin/remote.c:339 +#, c-format +msgid "Could not get fetch map for refspec %s" +msgstr "无法得到引用表达式 %s 的获取列表" + +#: builtin/remote.c:440 builtin/remote.c:448 +msgid "(matching)" +msgstr "(匹配)" + +#: builtin/remote.c:452 +msgid "(delete)" +msgstr "(删除)" + +#: builtin/remote.c:595 builtin/remote.c:601 builtin/remote.c:607 +#, c-format +msgid "Could not append '%s' to '%s'" +msgstr "不能添加 '%s' 至 '%s'" + +#: builtin/remote.c:639 builtin/remote.c:792 builtin/remote.c:890 +#, c-format +msgid "No such remote: %s" +msgstr "没有这样的远程:%s" + +#: builtin/remote.c:656 +#, c-format +msgid "Could not rename config section '%s' to '%s'" +msgstr "不能重命名配置小节 '%s' 到 '%s'" + +#: builtin/remote.c:662 builtin/remote.c:799 +#, c-format +msgid "Could not remove config section '%s'" +msgstr "不能移除配置小节 '%s'" + +#: builtin/remote.c:677 +#, c-format +msgid "" +"Not updating non-default fetch refspec\n" +"\t%s\n" +"\tPlease update the configuration manually if necessary." +msgstr "" +"没有更新非默认的获取引用表达式\n" +"\t%s\n" +"\t如果必要请手动更新配置。" + +#: builtin/remote.c:683 +#, c-format +msgid "Could not append '%s'" +msgstr "不能追加 '%s'" + +#: builtin/remote.c:694 +#, c-format +msgid "Could not set '%s'" +msgstr "不能设置 '%s'" + +#: builtin/remote.c:716 +#, c-format +msgid "deleting '%s' failed" +msgstr "删除 '%s' 失败" + +#: builtin/remote.c:750 +#, c-format +msgid "creating '%s' failed" +msgstr "创建 '%s' 失败" + +#: builtin/remote.c:764 +#, c-format +msgid "Could not remove branch %s" +msgstr "无法移除分支 %s" + +#: builtin/remote.c:834 +msgid "" +"Note: A branch outside the refs/remotes/ hierarchy was not removed;\n" +"to delete it, use:" +msgid_plural "" +"Note: Some branches outside the refs/remotes/ hierarchy were not removed;\n" +"to delete them, use:" +msgstr[0] "注意:ref/remotes 层级之外的一个分支未被移除。要删除它,使用:" +msgstr[1] "注意:ref/remotes 层级之外的一些分支未被移除。要删除它们,使用:" + +#: builtin/remote.c:943 +#, c-format +msgid " new (next fetch will store in remotes/%s)" +msgstr " 新的(下一次获取将存储于 remotes/%s)" + +#: builtin/remote.c:946 +msgid " tracked" +msgstr " 已跟踪" + +#: builtin/remote.c:948 +msgid " stale (use 'git remote prune' to remove)" +msgstr " 过时(使用 'git remote prune' 来移除)" + +#: builtin/remote.c:950 +msgid " ???" +msgstr " ???" + +#: builtin/remote.c:991 +#, c-format +msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch" +msgstr "无效的 branch.%s.merge,不能变基到一个以上的分支" + +#: builtin/remote.c:998 +#, c-format +msgid "rebases onto remote %s" +msgstr "变基到远程 %s" + +#: builtin/remote.c:1001 +#, c-format +msgid " merges with remote %s" +msgstr " 与远程 %s 合并" + +#: builtin/remote.c:1002 +msgid " and with remote" +msgstr " 且有远程" + +#: builtin/remote.c:1004 +#, c-format +msgid "merges with remote %s" +msgstr "与远程 %s 合并" + +#: builtin/remote.c:1005 +msgid " and with remote" +msgstr " 且有远程" + +#: builtin/remote.c:1051 +msgid "create" +msgstr "创建" + +#: builtin/remote.c:1054 +msgid "delete" +msgstr "删除" + +#: builtin/remote.c:1058 +msgid "up to date" +msgstr "最新" + +#: builtin/remote.c:1061 +msgid "fast-forwardable" +msgstr "可快进" + +#: builtin/remote.c:1064 +msgid "local out of date" +msgstr "本地已过时" + +#: builtin/remote.c:1071 +#, c-format +msgid " %-*s forces to %-*s (%s)" +msgstr " %-*s 强制推送至 %-*s (%s)" + +#: builtin/remote.c:1074 +#, c-format +msgid " %-*s pushes to %-*s (%s)" +msgstr " %-*s 推送至 %-*s (%s)" + +#: builtin/remote.c:1078 +#, c-format +msgid " %-*s forces to %s" +msgstr " %-*s 强制推送至 %s" + +#: builtin/remote.c:1081 +#, c-format +msgid " %-*s pushes to %s" +msgstr " %-*s 推送至 %s" + +#: builtin/remote.c:1118 +#, c-format +msgid "* remote %s" +msgstr "* 远程 %s" + +#: builtin/remote.c:1119 +#, c-format +msgid " Fetch URL: %s" +msgstr " 获取地址:%s" + +#: builtin/remote.c:1120 builtin/remote.c:1285 +msgid "(no URL)" +msgstr "(无 URL)" + +#: builtin/remote.c:1129 builtin/remote.c:1131 +#, c-format +msgid " Push URL: %s" +msgstr " 推送地址:%s" + +#: builtin/remote.c:1133 builtin/remote.c:1135 builtin/remote.c:1137 +#, c-format +msgid " HEAD branch: %s" +msgstr " HEAD分支:%s" + +#: builtin/remote.c:1139 +#, c-format +msgid "" +" HEAD branch (remote HEAD is ambiguous, may be one of the following):\n" +msgstr " HEAD 分支(远程 HEAD 模糊,可能是下列中的一个):\n" + +#: builtin/remote.c:1151 +#, c-format +msgid " Remote branch:%s" +msgid_plural " Remote branches:%s" +msgstr[0] " 远程分支:%s" +msgstr[1] " 远程分支:%s" + +# 译者:中文字符串拼接,可删除前导空格 +#: builtin/remote.c:1154 builtin/remote.c:1181 +msgid " (status not queried)" +msgstr "(状态未查询)" + +#: builtin/remote.c:1163 +msgid " Local branch configured for 'git pull':" +msgid_plural " Local branches configured for 'git pull':" +msgstr[0] " 为 'git pull' 配置的本地分支:" +msgstr[1] " 为 'git pull' 配置的本地分支:" + +#: builtin/remote.c:1171 +msgid " Local refs will be mirrored by 'git push'" +msgstr " 本地引用将在 'git push' 时被镜像" + +#: builtin/remote.c:1178 +#, c-format +msgid " Local ref configured for 'git push'%s:" +msgid_plural " Local refs configured for 'git push'%s:" +msgstr[0] " 为 'git push' 配置的本地引用%s:" +msgstr[1] " 为 'git push' 配置的本地引用%s:" + +#: builtin/remote.c:1216 +msgid "Cannot determine remote HEAD" +msgstr "无法确定远程 HEAD" + +#: builtin/remote.c:1218 +msgid "Multiple remote HEAD branches. Please choose one explicitly with:" +msgstr "多个远程 HEAD 分支。请明确地选择一个用命令:" + +#: builtin/remote.c:1228 +#, c-format +msgid "Could not delete %s" +msgstr "无法删除 %s" + +#: builtin/remote.c:1236 +#, c-format +msgid "Not a valid ref: %s" +msgstr "不是一个有效引用:%s" + +#: builtin/remote.c:1238 +#, c-format +msgid "Could not setup %s" +msgstr "不能设置 %s" + +# 译者:注意保持前导空格 +#: builtin/remote.c:1274 +#, c-format +msgid " %s will become dangling!" +msgstr " %s 将成为悬空状态!" + +# 译者:注意保持前导空格 +#: builtin/remote.c:1275 +#, c-format +msgid " %s has become dangling!" +msgstr " %s 已成为悬空状态!" + +#: builtin/remote.c:1281 +#, c-format +msgid "Pruning %s" +msgstr "修剪 %s" + +#: builtin/remote.c:1282 +#, c-format +msgid "URL: %s" +msgstr "URL:%s" + +#: builtin/remote.c:1295 +#, c-format +msgid " * [would prune] %s" +msgstr " * [将删除] %s" + +#: builtin/remote.c:1298 +#, c-format +msgid " * [pruned] %s" +msgstr " * [已删除] %s" + +#: builtin/remote.c:1387 builtin/remote.c:1461 +#, c-format +msgid "No such remote '%s'" +msgstr "没有此远程 '%s'" + +#: builtin/remote.c:1414 +msgid "no remote specified" +msgstr "未指定远程" + +#: builtin/remote.c:1447 +msgid "--add --delete doesn't make sense" +msgstr "--add --delete 无意义" + +#: builtin/remote.c:1487 +#, c-format +msgid "Invalid old URL pattern: %s" +msgstr "无效的旧URL匹配模版:%s" + +#: builtin/remote.c:1495 +#, c-format +msgid "No such URL found: %s" +msgstr "未找到此URL:%s" + +#: builtin/remote.c:1497 +msgid "Will not delete all non-push URLs" +msgstr "将不会删除所有非推送URL地址" + #: builtin/reset.c:33 msgid "mixed" msgstr "混杂" @@ -3010,6 +4413,10 @@ msgid "hard" msgstr "硬性" #: builtin/reset.c:33 +msgid "merge" +msgstr "合并" + +#: builtin/reset.c:33 msgid "keep" msgstr "保持" @@ -3084,15 +4491,15 @@ msgstr "不能重置索引文件至版本 '%s'。" msgid "%s: %s cannot be used with %s" msgstr "%s:%s 不能和 %s 共用" -#: builtin/revert.c:127 +#: builtin/revert.c:131 msgid "program error" msgstr "程序错误" -#: builtin/revert.c:213 +#: builtin/revert.c:221 msgid "revert failed" msgstr "还原失败" -#: builtin/revert.c:228 +#: builtin/revert.c:236 msgid "cherry-pick failed" msgstr "拣选失败" @@ -3138,32 +4545,32 @@ msgstr "git rm:不能删除 %s" msgid "Missing author: %s" msgstr "缺少作者:%s" -#: builtin/tag.c:58 +#: builtin/tag.c:60 #, c-format msgid "malformed object at '%s'" msgstr "非法的对象于 '%s'" -#: builtin/tag.c:205 +#: builtin/tag.c:207 #, c-format msgid "tag name too long: %.*s..." msgstr "tag 名字太长:%.*s..." -#: builtin/tag.c:210 +#: builtin/tag.c:212 #, c-format msgid "tag '%s' not found." msgstr "tag '%s' 未发现。" -#: builtin/tag.c:225 +#: builtin/tag.c:227 #, c-format msgid "Deleted tag '%s' (was %s)\n" msgstr "已删除 tag '%s'(曾为 %s)\n" -#: builtin/tag.c:237 +#: builtin/tag.c:239 #, c-format msgid "could not verify the tag '%s'" msgstr "不能校验 tag '%s'" -#: builtin/tag.c:247 +#: builtin/tag.c:249 msgid "" "\n" "#\n" @@ -3177,7 +4584,7 @@ msgstr "" "# 以 '#' 开头的行将被忽略。\n" "#\n" -#: builtin/tag.c:254 +#: builtin/tag.c:256 msgid "" "\n" "#\n" @@ -3192,85 +4599,209 @@ msgstr "" "# 以 '#' 开头的行将被忽略,您可以删除它们如果您想这样做。\n" "#\n" -#: builtin/tag.c:294 +#: builtin/tag.c:298 msgid "unable to sign the tag" msgstr "无法签署 tag" -#: builtin/tag.c:296 +#: builtin/tag.c:300 msgid "unable to write tag file" msgstr "无法写 tag 文件" -#: builtin/tag.c:321 +#: builtin/tag.c:325 msgid "bad object type." msgstr "坏的对象类型。" -#: builtin/tag.c:334 +#: builtin/tag.c:338 msgid "tag header too big." msgstr "tag 头信息太大。" -#: builtin/tag.c:366 +#: builtin/tag.c:370 msgid "no tag message?" msgstr "无 tag 说明?" -#: builtin/tag.c:372 +#: builtin/tag.c:376 #, c-format msgid "The tag message has been left in %s\n" msgstr "tag 说明被保留在 %s\n" -#: builtin/tag.c:421 +#: builtin/tag.c:425 msgid "switch 'points-at' requires an object" msgstr "开关 'points-at' 需要一个对象" -#: builtin/tag.c:423 +#: builtin/tag.c:427 #, c-format msgid "malformed object name '%s'" msgstr "非法的对象名 '%s'" -#: builtin/tag.c:502 +#: builtin/tag.c:506 +msgid "--column and -n are incompatible" +msgstr "--column 和 -n 不兼容" + +#: builtin/tag.c:523 msgid "-n option is only allowed with -l." msgstr "-n 选项只允许和 -l 共用。" -#: builtin/tag.c:504 +#: builtin/tag.c:525 msgid "--contains option is only allowed with -l." msgstr "--contains 选项只允许和 -l 共用。" -#: builtin/tag.c:506 +#: builtin/tag.c:527 msgid "--points-at option is only allowed with -l." msgstr "--points-at 选项只允许和 -l 共用。" -#: builtin/tag.c:514 +#: builtin/tag.c:535 msgid "only one -F or -m option is allowed." msgstr "只允许一个 -F 或 -m 选项。" -#: builtin/tag.c:534 +#: builtin/tag.c:555 msgid "too many params" msgstr "太多参数" -#: builtin/tag.c:540 +#: builtin/tag.c:561 #, c-format msgid "'%s' is not a valid tag name." msgstr "'%s' 不是一个有效的tag名称。" -#: builtin/tag.c:545 +#: builtin/tag.c:566 #, c-format msgid "tag '%s' already exists" msgstr "tag '%s' 已存在" -#: builtin/tag.c:563 +#: builtin/tag.c:584 #, c-format msgid "%s: cannot lock the ref" msgstr "%s:不能锁定引用" -#: builtin/tag.c:565 +#: builtin/tag.c:586 #, c-format msgid "%s: cannot update the ref" msgstr "%s:不能更新引用" -#: builtin/tag.c:567 +#: builtin/tag.c:588 #, c-format msgid "Updated tag '%s' (was %s)\n" msgstr "已更新tag '%s'(曾为 %s)\n" +#: git.c:16 +msgid "See 'git help <command>' for more information on a specific command." +msgstr "参见 'git help <command>' 以获得该特定命令的详细信息。" + +#: parse-options.h:133 parse-options.h:235 +msgid "n" +msgstr "数字" + +#: parse-options.h:141 +msgid "time" +msgstr "时间" + +#: parse-options.h:149 +msgid "file" +msgstr "文件" + +#: parse-options.h:151 +msgid "when" +msgstr "何时" + +#: parse-options.h:156 +msgid "no-op (backward compatibility)" +msgstr "空操作(向后兼容)" + +#: parse-options.h:228 +msgid "be more verbose" +msgstr "更加详细" + +#: parse-options.h:230 +msgid "be more quiet" +msgstr "更加安静" + +#: parse-options.h:236 +msgid "use <n> digits to display SHA-1s" +msgstr "用 <n> 位数字显示 SHA-1 哈希值" + +#: common-cmds.h:8 +msgid "Add file contents to the index" +msgstr "添加文件内容至索引" + +#: common-cmds.h:9 +msgid "Find by binary search the change that introduced a bug" +msgstr "通过二分查找定位引入 bug 的变更" + +#: common-cmds.h:10 +msgid "List, create, or delete branches" +msgstr "列出、创建或删除分支" + +#: common-cmds.h:11 +msgid "Checkout a branch or paths to the working tree" +msgstr "检出一个分支或路径到工作区" + +#: common-cmds.h:12 +msgid "Clone a repository into a new directory" +msgstr "克隆一个版本库到一个新目录" + +#: common-cmds.h:13 +msgid "Record changes to the repository" +msgstr "记录变更到版本库" + +#: common-cmds.h:14 +msgid "Show changes between commits, commit and working tree, etc" +msgstr "显示提交之间、提交和工作区之间等的差异" + +#: common-cmds.h:15 +msgid "Download objects and refs from another repository" +msgstr "从另外一个版本库下载对象和引用" + +#: common-cmds.h:16 +msgid "Print lines matching a pattern" +msgstr "输出和模式匹配的行" + +#: common-cmds.h:17 +msgid "Create an empty git repository or reinitialize an existing one" +msgstr "创建一个空的 git 版本库或者重新初始化一个" + +#: common-cmds.h:18 +msgid "Show commit logs" +msgstr "显示提交日志" + +#: common-cmds.h:19 +msgid "Join two or more development histories together" +msgstr "合并两个或更多开发历史" + +#: common-cmds.h:20 +msgid "Move or rename a file, a directory, or a symlink" +msgstr "移动或重命名一个文件、目录或符号链接" + +#: common-cmds.h:21 +msgid "Fetch from and merge with another repository or a local branch" +msgstr "获取并合并另外的版本库或一个本地分支" + +#: common-cmds.h:22 +msgid "Update remote refs along with associated objects" +msgstr "更新远程引用和相关的对象" + +#: common-cmds.h:23 +msgid "Forward-port local commits to the updated upstream head" +msgstr "本地提交转移至更新后的上游分支中" + +#: common-cmds.h:24 +msgid "Reset current HEAD to the specified state" +msgstr "重置当前HEAD到指定状态" + +#: common-cmds.h:25 +msgid "Remove files from the working tree and from the index" +msgstr "从工作区和索引中删除文件" + +#: common-cmds.h:26 +msgid "Show various types of objects" +msgstr "显示各种类型的对象" + +#: common-cmds.h:27 +msgid "Show the working tree status" +msgstr "显示工作区状态" + +#: common-cmds.h:28 +msgid "Create, list, delete or verify a tag object signed with GPG" +msgstr "创建、列出、删除或校验一个GPG签名的 tag 对象" + #: git-am.sh:50 msgid "You need to set your committer info first" msgstr "您需要先设置你的提交者信息" @@ -3362,7 +4893,7 @@ msgstr "您想让我为您这样做么[Y/n]? " #: git-bisect.sh:95 #, sh-format msgid "unrecognised option: '$arg'" -msgstr "未识别的选项:'$arg'" +msgstr "未能识别的选项:'$arg'" #: git-bisect.sh:99 #, sh-format @@ -3641,27 +5172,27 @@ msgstr "正在进入 '$prefix$sm_path'" msgid "Stopping at '$sm_path'; script returned non-zero status." msgstr "停止于 '$sm_path',脚本返回非零值。" -#: git-submodule.sh:405 +#: git-submodule.sh:406 #, sh-format msgid "No url found for submodule path '$sm_path' in .gitmodules" msgstr "在 .gitmodules 中未找到子模组路径 '$sm_path' 的 url" -#: git-submodule.sh:414 +#: git-submodule.sh:415 #, sh-format msgid "Failed to register url for submodule path '$sm_path'" msgstr "无法为子模组路径 '$sm_path' 注册 url" -#: git-submodule.sh:422 -#, sh-format -msgid "Failed to register update mode for submodule path '$sm_path'" -msgstr "无法为子模组路径 '$sm_path' 注册更新模式" - -#: git-submodule.sh:424 +#: git-submodule.sh:417 #, sh-format msgid "Submodule '$name' ($url) registered for path '$sm_path'" msgstr "子模组 '$name' ($url) 已为路径 '$sm_path' 注册" -#: git-submodule.sh:523 +#: git-submodule.sh:425 +#, sh-format +msgid "Failed to register update mode for submodule path '$sm_path'" +msgstr "无法为子模组路径 '$sm_path' 注册更新模式" + +#: git-submodule.sh:524 #, sh-format msgid "" "Submodule path '$sm_path' not initialized\n" @@ -3670,82 +5201,94 @@ msgstr "" "子模组路径 '$sm_path' 没有初始化\n" "也许您想用 'update --init'?" -#: git-submodule.sh:536 +#: git-submodule.sh:537 #, sh-format msgid "Unable to find current revision in submodule path '$sm_path'" msgstr "无法在子模组路径 '$sm_path' 中找到当前版本" -#: git-submodule.sh:555 +#: git-submodule.sh:556 #, sh-format msgid "Unable to fetch in submodule path '$sm_path'" msgstr "无法在子模组路径 '$sm_path' 中获取" -#: git-submodule.sh:569 +#: git-submodule.sh:570 #, sh-format msgid "Unable to rebase '$sha1' in submodule path '$sm_path'" msgstr "无法在子模组路径 '$sm_path' 中变基 '$sha1'" -#: git-submodule.sh:570 +#: git-submodule.sh:571 #, sh-format msgid "Submodule path '$sm_path': rebased into '$sha1'" msgstr "子模组路径 '$sm_path':变基至 '$sha1'" -#: git-submodule.sh:575 +#: git-submodule.sh:576 #, sh-format msgid "Unable to merge '$sha1' in submodule path '$sm_path'" msgstr "无法合并 '$sha1' 到子模组路径 '$sm_path' 中" -#: git-submodule.sh:576 +#: git-submodule.sh:577 #, sh-format msgid "Submodule path '$sm_path': merged in '$sha1'" msgstr "子模组路径 '$sm_path':已合并入 '$sha1'" -#: git-submodule.sh:581 +#: git-submodule.sh:582 #, sh-format msgid "Unable to checkout '$sha1' in submodule path '$sm_path'" msgstr "无法在子模组路径 '$sm_path' 中检出 '$sha1'" -#: git-submodule.sh:582 +#: git-submodule.sh:583 #, sh-format msgid "Submodule path '$sm_path': checked out '$sha1'" msgstr "子模组路径 '$sm_path':检出 '$sha1'" -#: git-submodule.sh:604 git-submodule.sh:927 +#: git-submodule.sh:605 git-submodule.sh:928 #, sh-format msgid "Failed to recurse into submodule path '$sm_path'" msgstr "无法递归进子模组路径 '$sm_path'" -#: git-submodule.sh:712 +#: git-submodule.sh:713 msgid "--" msgstr "--" # 译者:注意保持前导空格 -#: git-submodule.sh:770 +#: git-submodule.sh:771 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_src" msgstr " 警告:$name 未包含提交 $sha1_src" # 译者:注意保持前导空格 -#: git-submodule.sh:773 +#: git-submodule.sh:774 #, sh-format msgid " Warn: $name doesn't contain commit $sha1_dst" msgstr " 警告:$name 未包含提交 $sha1_dst" # 译者:注意保持前导空格 -#: git-submodule.sh:776 +#: git-submodule.sh:777 #, sh-format msgid " Warn: $name doesn't contain commits $sha1_src and $sha1_dst" msgstr " 警告:$name 未包含提交 $sha1_src 和 $sha1_dst" -#: git-submodule.sh:801 +#: git-submodule.sh:802 msgid "blob" msgstr "blob" -#: git-submodule.sh:802 +#: git-submodule.sh:803 msgid "submodule" msgstr "子模组" -#: git-submodule.sh:973 +#: git-submodule.sh:974 #, sh-format msgid "Synchronizing submodule url for '$name'" msgstr "为 '$name' 同步子模组 url" + +#~ msgid "Could not extract email from committer identity." +#~ msgstr "不能从提交者身份中提取邮件地址。" + +#~ msgid "cherry-pick" +#~ msgstr "拣选" + +#~ msgid "Please enter the commit message for your changes." +#~ msgstr "请为您的修改输入提交说明。" + +#~ msgid "Too many options specified" +#~ msgstr "指定了太多的选项" @@ -439,12 +439,14 @@ static char *get_header(const struct commit *commit, const char *key) int key_len = strlen(key); const char *line = commit->buffer; - for (;;) { + while (line) { const char *eol = strchr(line, '\n'), *next; if (line == eol) return NULL; if (!eol) { + warning("malformed commit (header is missing newline): %s", + sha1_to_hex(commit->object.sha1)); eol = line + strlen(line); next = NULL; } else @@ -456,6 +458,7 @@ static char *get_header(const struct commit *commit, const char *key) } line = next; } + return NULL; } static char *replace_encoding_header(char *buf, const char *encoding) @@ -547,8 +550,10 @@ static size_t format_person_part(struct strbuf *sb, char part, mail_end = s.mail_end; if (part == 'N' || part == 'E') { /* mailmap lookup */ - strlcpy(person_name, name_start, name_end - name_start + 1); - strlcpy(person_mail, mail_start, mail_end - mail_start + 1); + snprintf(person_name, sizeof(person_name), "%.*s", + (int)(name_end - name_start), name_start); + snprintf(person_mail, sizeof(person_mail), "%.*s", + (int)(mail_end - mail_start), mail_start); mailmap_name(person_mail, sizeof(person_mail), person_name, sizeof(person_name)); name_start = person_name; name_end = name_start + strlen(person_name); @@ -1010,6 +1015,7 @@ static size_t format_commit_one(struct strbuf *sb, const char *placeholder, get_reflog_selector(sb, c->pretty_ctx->reflog_info, c->pretty_ctx->date_mode, + c->pretty_ctx->date_mode_explicit, (placeholder[1] == 'd')); return 2; case 's': /* reflog message */ diff --git a/read-cache.c b/read-cache.c index 6c8f395836..ef355cc9a8 100644 --- a/read-cache.c +++ b/read-cache.c @@ -12,6 +12,8 @@ #include "commit.h" #include "blob.h" #include "resolve-undo.h" +#include "strbuf.h" +#include "varint.h" static struct cache_entry *refresh_cache_entry(struct cache_entry *ce, int really); @@ -1179,15 +1181,74 @@ static struct cache_entry *refresh_cache_entry(struct cache_entry *ce, int reall return refresh_cache_ent(&the_index, ce, really, NULL, NULL); } + +/***************************************************************** + * Index File I/O + *****************************************************************/ + +#define INDEX_FORMAT_DEFAULT 3 + +/* + * dev/ino/uid/gid/size are also just tracked to the low 32 bits + * Again - this is just a (very strong in practice) heuristic that + * the inode hasn't changed. + * + * We save the fields in big-endian order to allow using the + * index file over NFS transparently. + */ +struct ondisk_cache_entry { + struct cache_time ctime; + struct cache_time mtime; + unsigned int dev; + unsigned int ino; + unsigned int mode; + unsigned int uid; + unsigned int gid; + unsigned int size; + unsigned char sha1[20]; + unsigned short flags; + char name[FLEX_ARRAY]; /* more */ +}; + +/* + * This struct is used when CE_EXTENDED bit is 1 + * The struct must match ondisk_cache_entry exactly from + * ctime till flags + */ +struct ondisk_cache_entry_extended { + struct cache_time ctime; + struct cache_time mtime; + unsigned int dev; + unsigned int ino; + unsigned int mode; + unsigned int uid; + unsigned int gid; + unsigned int size; + unsigned char sha1[20]; + unsigned short flags; + unsigned short flags2; + char name[FLEX_ARRAY]; /* more */ +}; + +/* These are only used for v3 or lower */ +#define align_flex_name(STRUCT,len) ((offsetof(struct STRUCT,name) + (len) + 8) & ~7) +#define ondisk_cache_entry_size(len) align_flex_name(ondisk_cache_entry,len) +#define ondisk_cache_entry_extended_size(len) align_flex_name(ondisk_cache_entry_extended,len) +#define ondisk_ce_size(ce) (((ce)->ce_flags & CE_EXTENDED) ? \ + ondisk_cache_entry_extended_size(ce_namelen(ce)) : \ + ondisk_cache_entry_size(ce_namelen(ce))) + static int verify_hdr(struct cache_header *hdr, unsigned long size) { git_SHA_CTX c; unsigned char sha1[20]; + int hdr_version; if (hdr->hdr_signature != htonl(CACHE_SIGNATURE)) return error("bad signature"); - if (hdr->hdr_version != htonl(2) && hdr->hdr_version != htonl(3)) - return error("bad index version"); + hdr_version = ntohl(hdr->hdr_version); + if (hdr_version < 2 || 4 < hdr_version) + return error("bad index version %d", hdr_version); git_SHA1_Init(&c); git_SHA1_Update(&c, hdr, size - 20); git_SHA1_Final(sha1, &c); @@ -1221,7 +1282,74 @@ int read_index(struct index_state *istate) return read_index_from(istate, get_index_file()); } -static struct cache_entry *create_from_disk(struct ondisk_cache_entry *ondisk) +#ifndef NEEDS_ALIGNED_ACCESS +#define ntoh_s(var) ntohs(var) +#define ntoh_l(var) ntohl(var) +#else +static inline uint16_t ntoh_s_force_align(void *p) +{ + uint16_t x; + memcpy(&x, p, sizeof(x)); + return ntohs(x); +} +static inline uint32_t ntoh_l_force_align(void *p) +{ + uint32_t x; + memcpy(&x, p, sizeof(x)); + return ntohl(x); +} +#define ntoh_s(var) ntoh_s_force_align(&(var)) +#define ntoh_l(var) ntoh_l_force_align(&(var)) +#endif + +static struct cache_entry *cache_entry_from_ondisk(struct ondisk_cache_entry *ondisk, + unsigned int flags, + const char *name, + size_t len) +{ + struct cache_entry *ce = xmalloc(cache_entry_size(len)); + + ce->ce_ctime.sec = ntoh_l(ondisk->ctime.sec); + ce->ce_mtime.sec = ntoh_l(ondisk->mtime.sec); + ce->ce_ctime.nsec = ntoh_l(ondisk->ctime.nsec); + ce->ce_mtime.nsec = ntoh_l(ondisk->mtime.nsec); + ce->ce_dev = ntoh_l(ondisk->dev); + ce->ce_ino = ntoh_l(ondisk->ino); + ce->ce_mode = ntoh_l(ondisk->mode); + ce->ce_uid = ntoh_l(ondisk->uid); + ce->ce_gid = ntoh_l(ondisk->gid); + ce->ce_size = ntoh_l(ondisk->size); + ce->ce_flags = flags; + hashcpy(ce->sha1, ondisk->sha1); + memcpy(ce->name, name, len); + ce->name[len] = '\0'; + return ce; +} + +/* + * Adjacent cache entries tend to share the leading paths, so it makes + * sense to only store the differences in later entries. In the v4 + * on-disk format of the index, each on-disk cache entry stores the + * number of bytes to be stripped from the end of the previous name, + * and the bytes to append to the result, to come up with its name. + */ +static unsigned long expand_name_field(struct strbuf *name, const char *cp_) +{ + const unsigned char *ep, *cp = (const unsigned char *)cp_; + size_t len = decode_varint(&cp); + + if (name->len < len) + die("malformed name field in the index"); + strbuf_remove(name, name->len - len, len); + for (ep = cp; *ep; ep++) + ; /* find the end */ + strbuf_add(name, cp, ep - cp); + return (const char *)ep + 1 - cp_; +} + +static struct cache_entry *create_from_disk(struct ondisk_cache_entry *ondisk, + unsigned long *ent_size, + struct strbuf *previous_name) { struct cache_entry *ce; size_t len; @@ -1229,14 +1357,14 @@ static struct cache_entry *create_from_disk(struct ondisk_cache_entry *ondisk) unsigned int flags; /* On-disk flags are just 16 bits */ - flags = ntohs(ondisk->flags); + flags = ntoh_s(ondisk->flags); len = flags & CE_NAMEMASK; if (flags & CE_EXTENDED) { struct ondisk_cache_entry_extended *ondisk2; int extended_flags; ondisk2 = (struct ondisk_cache_entry_extended *)ondisk; - extended_flags = ntohs(ondisk2->flags2) << 16; + extended_flags = ntoh_s(ondisk2->flags2) << 16; /* We do not yet understand any bit out of CE_EXTENDED_FLAGS */ if (extended_flags & ~CE_EXTENDED_FLAGS) die("Unknown index entry format %08x", extended_flags); @@ -1246,27 +1374,22 @@ static struct cache_entry *create_from_disk(struct ondisk_cache_entry *ondisk) else name = ondisk->name; - if (len == CE_NAMEMASK) - len = strlen(name); - - ce = xmalloc(cache_entry_size(len)); - - ce->ce_ctime.sec = ntohl(ondisk->ctime.sec); - ce->ce_mtime.sec = ntohl(ondisk->mtime.sec); - ce->ce_ctime.nsec = ntohl(ondisk->ctime.nsec); - ce->ce_mtime.nsec = ntohl(ondisk->mtime.nsec); - ce->ce_dev = ntohl(ondisk->dev); - ce->ce_ino = ntohl(ondisk->ino); - ce->ce_mode = ntohl(ondisk->mode); - ce->ce_uid = ntohl(ondisk->uid); - ce->ce_gid = ntohl(ondisk->gid); - ce->ce_size = ntohl(ondisk->size); - ce->ce_flags = flags; - - hashcpy(ce->sha1, ondisk->sha1); - - memcpy(ce->name, name, len); - ce->name[len] = '\0'; + if (!previous_name) { + /* v3 and earlier */ + if (len == CE_NAMEMASK) + len = strlen(name); + ce = cache_entry_from_ondisk(ondisk, flags, name, len); + + *ent_size = ondisk_ce_size(ce); + } else { + unsigned long consumed; + consumed = expand_name_field(previous_name, name); + ce = cache_entry_from_ondisk(ondisk, flags, + previous_name->buf, + previous_name->len); + + *ent_size = (name - ((char *)ondisk)) + consumed; + } return ce; } @@ -1279,6 +1402,7 @@ int read_index_from(struct index_state *istate, const char *path) struct cache_header *hdr; void *mmap; size_t mmap_size; + struct strbuf previous_name_buf = STRBUF_INIT, *previous_name; errno = EBUSY; if (istate->initialized) @@ -1311,22 +1435,30 @@ int read_index_from(struct index_state *istate, const char *path) if (verify_hdr(hdr, mmap_size) < 0) goto unmap; + istate->version = ntohl(hdr->hdr_version); istate->cache_nr = ntohl(hdr->hdr_entries); istate->cache_alloc = alloc_nr(istate->cache_nr); istate->cache = xcalloc(istate->cache_alloc, sizeof(struct cache_entry *)); istate->initialized = 1; + if (istate->version == 4) + previous_name = &previous_name_buf; + else + previous_name = NULL; + src_offset = sizeof(*hdr); for (i = 0; i < istate->cache_nr; i++) { struct ondisk_cache_entry *disk_ce; struct cache_entry *ce; + unsigned long consumed; disk_ce = (struct ondisk_cache_entry *)((char *)mmap + src_offset); - ce = create_from_disk(disk_ce); + ce = create_from_disk(disk_ce, &consumed, previous_name); set_index_entry(istate, i, ce); - src_offset += ondisk_ce_size(ce); + src_offset += consumed; } + strbuf_release(&previous_name_buf); istate->timestamp.sec = st.st_mtime; istate->timestamp.nsec = ST_MTIME_NSEC(st); @@ -1510,13 +1642,10 @@ static void ce_smudge_racily_clean_entry(struct cache_entry *ce) } } -static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce) +/* Copy miscellaneous fields but not the name */ +static char *copy_cache_entry_to_ondisk(struct ondisk_cache_entry *ondisk, + struct cache_entry *ce) { - int size = ondisk_ce_size(ce); - struct ondisk_cache_entry *ondisk = xcalloc(1, size); - char *name; - int result; - ondisk->ctime.sec = htonl(ce->ce_ctime.sec); ondisk->mtime.sec = htonl(ce->ce_mtime.sec); ondisk->ctime.nsec = htonl(ce->ce_ctime.nsec); @@ -1533,11 +1662,52 @@ static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce) struct ondisk_cache_entry_extended *ondisk2; ondisk2 = (struct ondisk_cache_entry_extended *)ondisk; ondisk2->flags2 = htons((ce->ce_flags & CE_EXTENDED_FLAGS) >> 16); - name = ondisk2->name; + return ondisk2->name; + } + else { + return ondisk->name; + } +} + +static int ce_write_entry(git_SHA_CTX *c, int fd, struct cache_entry *ce, + struct strbuf *previous_name) +{ + int size; + struct ondisk_cache_entry *ondisk; + char *name; + int result; + + if (!previous_name) { + size = ondisk_ce_size(ce); + ondisk = xcalloc(1, size); + name = copy_cache_entry_to_ondisk(ondisk, ce); + memcpy(name, ce->name, ce_namelen(ce)); + } else { + int common, to_remove, prefix_size; + unsigned char to_remove_vi[16]; + for (common = 0; + (ce->name[common] && + common < previous_name->len && + ce->name[common] == previous_name->buf[common]); + common++) + ; /* still matching */ + to_remove = previous_name->len - common; + prefix_size = encode_varint(to_remove, to_remove_vi); + + if (ce->ce_flags & CE_EXTENDED) + size = offsetof(struct ondisk_cache_entry_extended, name); + else + size = offsetof(struct ondisk_cache_entry, name); + size += prefix_size + (ce_namelen(ce) - common + 1); + + ondisk = xcalloc(1, size); + name = copy_cache_entry_to_ondisk(ondisk, ce); + memcpy(name, to_remove_vi, prefix_size); + memcpy(name + prefix_size, ce->name + common, ce_namelen(ce) - common); + + strbuf_splice(previous_name, common, to_remove, + ce->name + common, ce_namelen(ce) - common); } - else - name = ondisk->name; - memcpy(name, ce->name, ce_namelen(ce)); result = ce_write(c, fd, ondisk, size); free(ondisk); @@ -1573,10 +1743,11 @@ int write_index(struct index_state *istate, int newfd) { git_SHA_CTX c; struct cache_header hdr; - int i, err, removed, extended; + int i, err, removed, extended, hdr_version; struct cache_entry **cache = istate->cache; int entries = istate->cache_nr; struct stat st; + struct strbuf previous_name_buf = STRBUF_INIT, *previous_name; for (i = removed = extended = 0; i < entries; i++) { if (cache[i]->ce_flags & CE_REMOVE) @@ -1590,24 +1761,34 @@ int write_index(struct index_state *istate, int newfd) } } + if (!istate->version) + istate->version = INDEX_FORMAT_DEFAULT; + + /* demote version 3 to version 2 when the latter suffices */ + if (istate->version == 3 || istate->version == 2) + istate->version = extended ? 3 : 2; + + hdr_version = istate->version; + hdr.hdr_signature = htonl(CACHE_SIGNATURE); - /* for extended format, increase version so older git won't try to read it */ - hdr.hdr_version = htonl(extended ? 3 : 2); + hdr.hdr_version = htonl(hdr_version); hdr.hdr_entries = htonl(entries - removed); git_SHA1_Init(&c); if (ce_write(&c, newfd, &hdr, sizeof(hdr)) < 0) return -1; + previous_name = (hdr_version == 4) ? &previous_name_buf : NULL; for (i = 0; i < entries; i++) { struct cache_entry *ce = cache[i]; if (ce->ce_flags & CE_REMOVE) continue; if (!ce_uptodate(ce) && is_racy_timestamp(istate, ce)) ce_smudge_racily_clean_entry(ce); - if (ce_write_entry(&c, newfd, ce) < 0) + if (ce_write_entry(&c, newfd, ce, previous_name) < 0) return -1; } + strbuf_release(&previous_name_buf); /* Write extension data here */ if (istate->cache_tree) { diff --git a/reflog-walk.c b/reflog-walk.c index 86d18843f5..b2fbdb2392 100644 --- a/reflog-walk.c +++ b/reflog-walk.c @@ -126,7 +126,12 @@ static void add_commit_info(struct commit *commit, void *util, } struct commit_reflog { - int flag, recno; + int recno; + enum selector_type { + SELECTOR_NONE, + SELECTOR_INDEX, + SELECTOR_DATE + } selector; struct complete_reflogs *reflogs; }; @@ -150,6 +155,7 @@ int add_reflog_for_walk(struct reflog_walk_info *info, struct complete_reflogs *reflogs; char *branch, *at = strchr(name, '@'); struct commit_reflog *commit_reflog; + enum selector_type selector = SELECTOR_NONE; if (commit->object.flags & UNINTERESTING) die ("Cannot walk reflogs for %s", name); @@ -162,7 +168,10 @@ int add_reflog_for_walk(struct reflog_walk_info *info, if (*ep != '}') { recno = -1; timestamp = approxidate(at + 2); + selector = SELECTOR_DATE; } + else + selector = SELECTOR_INDEX; } else recno = 0; @@ -200,7 +209,6 @@ int add_reflog_for_walk(struct reflog_walk_info *info, commit_reflog = xcalloc(sizeof(struct commit_reflog), 1); if (recno < 0) { - commit_reflog->flag = 1; commit_reflog->recno = get_reflog_recno_by_time(reflogs, timestamp); if (commit_reflog->recno < 0) { free(branch); @@ -209,6 +217,7 @@ int add_reflog_for_walk(struct reflog_walk_info *info, } } else commit_reflog->recno = reflogs->nr - recno - 1; + commit_reflog->selector = selector; commit_reflog->reflogs = reflogs; add_commit_info(commit, commit_reflog, &info->reflogs); @@ -247,7 +256,7 @@ void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit) void get_reflog_selector(struct strbuf *sb, struct reflog_walk_info *reflog_info, - enum date_mode dmode, + enum date_mode dmode, int force_date, int shorten) { struct commit_reflog *commit_reflog = reflog_info->last_commit_reflog; @@ -267,7 +276,8 @@ void get_reflog_selector(struct strbuf *sb, } strbuf_addf(sb, "%s@{", printed_ref); - if (commit_reflog->flag || dmode) { + if (commit_reflog->selector == SELECTOR_DATE || + (commit_reflog->selector == SELECTOR_NONE && force_date)) { info = &commit_reflog->reflogs->items[commit_reflog->recno+1]; strbuf_addstr(sb, show_date(info->timestamp, info->tz, dmode)); } else { @@ -308,7 +318,7 @@ const char *get_reflog_ident(struct reflog_walk_info *reflog_info) } void show_reflog_message(struct reflog_walk_info *reflog_info, int oneline, - enum date_mode dmode) + enum date_mode dmode, int force_date) { if (reflog_info && reflog_info->last_commit_reflog) { struct commit_reflog *commit_reflog = reflog_info->last_commit_reflog; @@ -316,7 +326,7 @@ void show_reflog_message(struct reflog_walk_info *reflog_info, int oneline, struct strbuf selector = STRBUF_INIT; info = &commit_reflog->reflogs->items[commit_reflog->recno+1]; - get_reflog_selector(&selector, reflog_info, dmode, 0); + get_reflog_selector(&selector, reflog_info, dmode, force_date, 0); if (oneline) { printf("%s: %s", selector.buf, info->message); } diff --git a/reflog-walk.h b/reflog-walk.h index afb1ae3fde..50265f51c5 100644 --- a/reflog-walk.h +++ b/reflog-walk.h @@ -11,13 +11,13 @@ extern int add_reflog_for_walk(struct reflog_walk_info *info, extern void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit); extern void show_reflog_message(struct reflog_walk_info *info, int, - enum date_mode); + enum date_mode, int force_date); extern void get_reflog_message(struct strbuf *sb, struct reflog_walk_info *reflog_info); extern const char *get_reflog_ident(struct reflog_walk_info *reflog_info); extern void get_reflog_selector(struct strbuf *sb, struct reflog_walk_info *reflog_info, - enum date_mode dmode, + enum date_mode dmode, int force_date, int shorten); #endif @@ -101,11 +101,45 @@ int check_refname_format(const char *refname, int flags) struct ref_entry; +/* + * Information used (along with the information in ref_entry) to + * describe a single cached reference. This data structure only + * occurs embedded in a union in struct ref_entry, and only when + * (ref_entry->flag & REF_DIR) is zero. + */ struct ref_value { unsigned char sha1[20]; unsigned char peeled[20]; }; +struct ref_cache; + +/* + * Information used (along with the information in ref_entry) to + * describe a level in the hierarchy of references. This data + * structure only occurs embedded in a union in struct ref_entry, and + * only when (ref_entry.flag & REF_DIR) is set. In that case, + * (ref_entry.flag & REF_INCOMPLETE) determines whether the references + * in the directory have already been read: + * + * (ref_entry.flag & REF_INCOMPLETE) unset -- a directory of loose + * or packed references, already read. + * + * (ref_entry.flag & REF_INCOMPLETE) set -- a directory of loose + * references that hasn't been read yet (nor has any of its + * subdirectories). + * + * Entries within a directory are stored within a growable array of + * pointers to ref_entries (entries, nr, alloc). Entries 0 <= i < + * sorted are sorted by their component name in strcmp() order and the + * remaining entries are unsorted. + * + * Loose references are read lazily, one directory at a time. When a + * directory of loose references is read, then all of the references + * in that directory are stored, and REF_INCOMPLETE stubs are created + * for any subdirectories, but the subdirectories themselves are not + * read. The reading is triggered by get_ref_dir(). + */ struct ref_dir { int nr, alloc; @@ -117,24 +151,41 @@ struct ref_dir { */ int sorted; + /* A pointer to the ref_cache that contains this ref_dir. */ + struct ref_cache *ref_cache; + struct ref_entry **entries; }; /* ISSYMREF=0x01, ISPACKED=0x02, and ISBROKEN=0x04 are public interfaces */ #define REF_KNOWS_PEELED 0x08 + +/* ref_entry represents a directory of references */ #define REF_DIR 0x10 /* + * Entry has not yet been read from disk (used only for REF_DIR + * entries representing loose references) + */ +#define REF_INCOMPLETE 0x20 + +/* * A ref_entry represents either a reference or a "subdirectory" of - * references. Each directory in the reference namespace is - * represented by a ref_entry with (flags & REF_DIR) set and - * containing a subdir member that holds the entries in that - * directory. References are represented by a ref_entry with (flags & - * REF_DIR) unset and a value member that describes the reference's - * value. The flag member is at the ref_entry level, but it is also - * needed to interpret the contents of the value field (in other - * words, a ref_value object is not very much use without the - * enclosing ref_entry). + * references. + * + * Each directory in the reference namespace is represented by a + * ref_entry with (flags & REF_DIR) set and containing a subdir member + * that holds the entries in that directory that have been read so + * far. If (flags & REF_INCOMPLETE) is set, then the directory and + * its subdirectories haven't been read yet. REF_INCOMPLETE is only + * used for loose reference directories. + * + * References are represented by a ref_entry with (flags & REF_DIR) + * unset and a value member that describes the reference's value. The + * flag member is at the ref_entry level, but it is also needed to + * interpret the contents of the value field (in other words, a + * ref_value object is not very much use without the enclosing + * ref_entry). * * Reference names cannot end with slash and directories' names are * always stored with a trailing slash (except for the top-level @@ -171,6 +222,20 @@ struct ref_entry { char name[FLEX_ARRAY]; }; +static void read_loose_refs(const char *dirname, struct ref_dir *dir); + +static struct ref_dir *get_ref_dir(struct ref_entry *entry) +{ + struct ref_dir *dir; + assert(entry->flag & REF_DIR); + dir = &entry->u.subdir; + if (entry->flag & REF_INCOMPLETE) { + read_loose_refs(entry->name, dir); + entry->flag &= ~REF_INCOMPLETE; + } + return dir; +} + static struct ref_entry *create_ref_entry(const char *refname, const unsigned char *sha1, int flag, int check_name) @@ -194,8 +259,13 @@ static void clear_ref_dir(struct ref_dir *dir); static void free_ref_entry(struct ref_entry *entry) { - if (entry->flag & REF_DIR) + if (entry->flag & REF_DIR) { + /* + * Do not use get_ref_dir() here, as that might + * trigger the reading of loose refs. + */ clear_ref_dir(&entry->u.subdir); + } free(entry); } @@ -208,6 +278,12 @@ static void add_entry_to_dir(struct ref_dir *dir, struct ref_entry *entry) { ALLOC_GROW(dir->entries, dir->nr + 1, dir->alloc); dir->entries[dir->nr++] = entry; + /* optimize for the case that entries are added in order */ + if (dir->nr == 1 || + (dir->nr == dir->sorted + 1 && + strcmp(dir->entries[dir->nr - 2]->name, + dir->entries[dir->nr - 1]->name) < 0)) + dir->sorted = dir->nr; } /* @@ -228,13 +304,16 @@ static void clear_ref_dir(struct ref_dir *dir) * dirname is the name of the directory with a trailing slash (e.g., * "refs/heads/") or "" for the top-level directory. */ -static struct ref_entry *create_dir_entry(const char *dirname) +static struct ref_entry *create_dir_entry(struct ref_cache *ref_cache, + const char *dirname, size_t len, + int incomplete) { struct ref_entry *direntry; - int len = strlen(dirname); direntry = xcalloc(1, sizeof(struct ref_entry) + len + 1); - memcpy(direntry->name, dirname, len + 1); - direntry->flag = REF_DIR; + memcpy(direntry->name, dirname, len); + direntry->name[len] = '\0'; + direntry->u.subdir.ref_cache = ref_cache; + direntry->flag = REF_DIR | (incomplete ? REF_INCOMPLETE : 0); return direntry; } @@ -247,28 +326,42 @@ static int ref_entry_cmp(const void *a, const void *b) static void sort_ref_dir(struct ref_dir *dir); +struct string_slice { + size_t len; + const char *str; +}; + +static int ref_entry_cmp_sslice(const void *key_, const void *ent_) +{ + struct string_slice *key = (struct string_slice *)key_; + struct ref_entry *ent = *(struct ref_entry **)ent_; + int entlen = strlen(ent->name); + int cmplen = key->len < entlen ? key->len : entlen; + int cmp = memcmp(key->str, ent->name, cmplen); + if (cmp) + return cmp; + return key->len - entlen; +} + /* * Return the entry with the given refname from the ref_dir * (non-recursively), sorting dir if necessary. Return NULL if no - * such entry is found. + * such entry is found. dir must already be complete. */ -static struct ref_entry *search_ref_dir(struct ref_dir *dir, const char *refname) +static struct ref_entry *search_ref_dir(struct ref_dir *dir, + const char *refname, size_t len) { - struct ref_entry *e, **r; - int len; + struct ref_entry **r; + struct string_slice key; if (refname == NULL || !dir->nr) return NULL; sort_ref_dir(dir); - - len = strlen(refname) + 1; - e = xmalloc(sizeof(struct ref_entry) + len); - memcpy(e->name, refname, len); - - r = bsearch(&e, dir->entries, dir->nr, sizeof(*dir->entries), ref_entry_cmp); - - free(e); + key.len = len; + key.str = refname; + r = bsearch(&key, dir->entries, dir->nr, sizeof(*dir->entries), + ref_entry_cmp_sslice); if (r == NULL) return NULL; @@ -277,38 +370,56 @@ static struct ref_entry *search_ref_dir(struct ref_dir *dir, const char *refname } /* + * Search for a directory entry directly within dir (without + * recursing). Sort dir if necessary. subdirname must be a directory + * name (i.e., end in '/'). If mkdir is set, then create the + * directory if it is missing; otherwise, return NULL if the desired + * directory cannot be found. dir must already be complete. + */ +static struct ref_dir *search_for_subdir(struct ref_dir *dir, + const char *subdirname, size_t len, + int mkdir) +{ + struct ref_entry *entry = search_ref_dir(dir, subdirname, len); + if (!entry) { + if (!mkdir) + return NULL; + /* + * Since dir is complete, the absence of a subdir + * means that the subdir really doesn't exist; + * therefore, create an empty record for it but mark + * the record complete. + */ + entry = create_dir_entry(dir->ref_cache, subdirname, len, 0); + add_entry_to_dir(dir, entry); + } + return get_ref_dir(entry); +} + +/* * If refname is a reference name, find the ref_dir within the dir * tree that should hold refname. If refname is a directory name * (i.e., ends in '/'), then return that ref_dir itself. dir must - * represent the top-level directory. Sort ref_dirs and recurse into - * subdirectories as necessary. If mkdir is set, then create any - * missing directories; otherwise, return NULL if the desired - * directory cannot be found. + * represent the top-level directory and must already be complete. + * Sort ref_dirs and recurse into subdirectories as necessary. If + * mkdir is set, then create any missing directories; otherwise, + * return NULL if the desired directory cannot be found. */ static struct ref_dir *find_containing_dir(struct ref_dir *dir, const char *refname, int mkdir) { - char *refname_copy = xstrdup(refname); - char *slash; - struct ref_entry *entry; - for (slash = strchr(refname_copy, '/'); slash; slash = strchr(slash + 1, '/')) { - char tmp = slash[1]; - slash[1] = '\0'; - entry = search_ref_dir(dir, refname_copy); - if (!entry) { - if (!mkdir) { - dir = NULL; - break; - } - entry = create_dir_entry(refname_copy); - add_entry_to_dir(dir, entry); + const char *slash; + for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) { + size_t dirnamelen = slash - refname + 1; + struct ref_dir *subdir; + subdir = search_for_subdir(dir, refname, dirnamelen, mkdir); + if (!subdir) { + dir = NULL; + break; } - slash[1] = tmp; - assert(entry->flag & REF_DIR); - dir = &entry->u.subdir; + dir = subdir; } - free(refname_copy); return dir; } @@ -323,7 +434,7 @@ static struct ref_entry *find_ref(struct ref_dir *dir, const char *refname) dir = find_containing_dir(dir, refname, 0); if (!dir) return NULL; - entry = search_ref_dir(dir, refname); + entry = search_ref_dir(dir, refname, strlen(refname)); return (entry && !(entry->flag & REF_DIR)) ? entry : NULL; } @@ -434,8 +545,9 @@ static int do_for_each_ref_in_dir(struct ref_dir *dir, int offset, struct ref_entry *entry = dir->entries[i]; int retval; if (entry->flag & REF_DIR) { - sort_ref_dir(&entry->u.subdir); - retval = do_for_each_ref_in_dir(&entry->u.subdir, 0, + struct ref_dir *subdir = get_ref_dir(entry); + sort_ref_dir(subdir); + retval = do_for_each_ref_in_dir(subdir, 0, base, fn, trim, flags, cb_data); } else { retval = do_one_ref(base, fn, trim, flags, cb_data, entry); @@ -480,10 +592,12 @@ static int do_for_each_ref_in_dirs(struct ref_dir *dir1, if (cmp == 0) { if ((e1->flag & REF_DIR) && (e2->flag & REF_DIR)) { /* Both are directories; descend them in parallel. */ - sort_ref_dir(&e1->u.subdir); - sort_ref_dir(&e2->u.subdir); + struct ref_dir *subdir1 = get_ref_dir(e1); + struct ref_dir *subdir2 = get_ref_dir(e2); + sort_ref_dir(subdir1); + sort_ref_dir(subdir2); retval = do_for_each_ref_in_dirs( - &e1->u.subdir, &e2->u.subdir, + subdir1, subdir2, base, fn, trim, flags, cb_data); i1++; i2++; @@ -506,9 +620,10 @@ static int do_for_each_ref_in_dirs(struct ref_dir *dir1, i2++; } if (e->flag & REF_DIR) { - sort_ref_dir(&e->u.subdir); + struct ref_dir *subdir = get_ref_dir(e); + sort_ref_dir(subdir); retval = do_for_each_ref_in_dir( - &e->u.subdir, 0, + subdir, 0, base, fn, trim, flags, cb_data); } else { retval = do_one_ref(base, fn, trim, flags, cb_data, e); @@ -592,26 +707,26 @@ static int is_refname_available(const char *refname, const char *oldrefname, */ static struct ref_cache { struct ref_cache *next; - char did_loose; - char did_packed; - struct ref_dir loose; - struct ref_dir packed; + struct ref_entry *loose; + struct ref_entry *packed; /* The submodule name, or "" for the main repo. */ char name[FLEX_ARRAY]; } *ref_cache; static void clear_packed_ref_cache(struct ref_cache *refs) { - if (refs->did_packed) - clear_ref_dir(&refs->packed); - refs->did_packed = 0; + if (refs->packed) { + free_ref_entry(refs->packed); + refs->packed = NULL; + } } static void clear_loose_ref_cache(struct ref_cache *refs) { - if (refs->did_loose) - clear_ref_dir(&refs->loose); - refs->did_loose = 0; + if (refs->loose) { + free_ref_entry(refs->loose); + refs->loose = NULL; + } } static struct ref_cache *create_ref_cache(const char *submodule) @@ -725,22 +840,22 @@ static void read_packed_refs(FILE *f, struct ref_dir *dir) static struct ref_dir *get_packed_refs(struct ref_cache *refs) { - if (!refs->did_packed) { + if (!refs->packed) { const char *packed_refs_file; FILE *f; + refs->packed = create_dir_entry(refs, "", 0, 0); if (*refs->name) packed_refs_file = git_path_submodule(refs->name, "packed-refs"); else packed_refs_file = git_path("packed-refs"); f = fopen(packed_refs_file, "r"); if (f) { - read_packed_refs(f, &refs->packed); + read_packed_refs(f, get_ref_dir(refs->packed)); fclose(f); } - refs->did_packed = 1; } - return &refs->packed; + return get_ref_dir(refs->packed); } void add_packed_ref(const char *refname, const unsigned char *sha1) @@ -749,76 +864,90 @@ void add_packed_ref(const char *refname, const unsigned char *sha1) create_ref_entry(refname, sha1, REF_ISPACKED, 1)); } -static void get_ref_dir(struct ref_cache *refs, const char *base, - struct ref_dir *dir) +/* + * Read the loose references from the namespace dirname into dir + * (without recursing). dirname must end with '/'. dir must be the + * directory entry corresponding to dirname. + */ +static void read_loose_refs(const char *dirname, struct ref_dir *dir) { + struct ref_cache *refs = dir->ref_cache; DIR *d; const char *path; + struct dirent *de; + int dirnamelen = strlen(dirname); + struct strbuf refname; if (*refs->name) - path = git_path_submodule(refs->name, "%s", base); + path = git_path_submodule(refs->name, "%s", dirname); else - path = git_path("%s", base); + path = git_path("%s", dirname); d = opendir(path); - if (d) { - struct dirent *de; - int baselen = strlen(base); - char *refname = xmalloc(baselen + 257); - - memcpy(refname, base, baselen); - if (baselen && base[baselen-1] != '/') - refname[baselen++] = '/'; - - while ((de = readdir(d)) != NULL) { - unsigned char sha1[20]; - struct stat st; - int flag; - int namelen; - const char *refdir; - - if (de->d_name[0] == '.') - continue; - namelen = strlen(de->d_name); - if (namelen > 255) - continue; - if (has_extension(de->d_name, ".lock")) - continue; - memcpy(refname + baselen, de->d_name, namelen+1); - refdir = *refs->name - ? git_path_submodule(refs->name, "%s", refname) - : git_path("%s", refname); - if (stat(refdir, &st) < 0) - continue; - if (S_ISDIR(st.st_mode)) { - get_ref_dir(refs, refname, dir); - continue; - } + if (!d) + return; + + strbuf_init(&refname, dirnamelen + 257); + strbuf_add(&refname, dirname, dirnamelen); + + while ((de = readdir(d)) != NULL) { + unsigned char sha1[20]; + struct stat st; + int flag; + const char *refdir; + + if (de->d_name[0] == '.') + continue; + if (has_extension(de->d_name, ".lock")) + continue; + strbuf_addstr(&refname, de->d_name); + refdir = *refs->name + ? git_path_submodule(refs->name, "%s", refname.buf) + : git_path("%s", refname.buf); + if (stat(refdir, &st) < 0) { + ; /* silently ignore */ + } else if (S_ISDIR(st.st_mode)) { + strbuf_addch(&refname, '/'); + add_entry_to_dir(dir, + create_dir_entry(refs, refname.buf, + refname.len, 1)); + } else { if (*refs->name) { hashclr(sha1); flag = 0; - if (resolve_gitlink_ref(refs->name, refname, sha1) < 0) { + if (resolve_gitlink_ref(refs->name, refname.buf, sha1) < 0) { hashclr(sha1); flag |= REF_ISBROKEN; } - } else if (read_ref_full(refname, sha1, 1, &flag)) { + } else if (read_ref_full(refname.buf, sha1, 1, &flag)) { hashclr(sha1); flag |= REF_ISBROKEN; } - add_ref(dir, create_ref_entry(refname, sha1, flag, 1)); + add_entry_to_dir(dir, + create_ref_entry(refname.buf, sha1, flag, 1)); } - free(refname); - closedir(d); + strbuf_setlen(&refname, dirnamelen); } + strbuf_release(&refname); + closedir(d); } static struct ref_dir *get_loose_refs(struct ref_cache *refs) { - if (!refs->did_loose) { - get_ref_dir(refs, "refs", &refs->loose); - refs->did_loose = 1; + if (!refs->loose) { + /* + * Mark the top-level directory complete because we + * are about to read the only subdirectory that can + * hold references: + */ + refs->loose = create_dir_entry(refs, "", 0, 0); + /* + * Create an incomplete entry for "refs/": + */ + add_entry_to_dir(get_ref_dir(refs->loose), + create_dir_entry(refs, "refs/", 5, 1)); } - return &refs->loose; + return get_ref_dir(refs->loose); } /* We allow "recursive" symbolic refs. Only within reason, though */ @@ -1126,6 +1255,7 @@ static int warn_if_dangling_symref(const char *refname, const unsigned char *sha return 0; fprintf(d->fp, d->msg_fmt, refname); + fputc('\n', d->fp); return 0; } @@ -2223,57 +2353,59 @@ int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn, void *cb_dat return for_each_recent_reflog_ent(refname, fn, 0, cb_data); } -static int do_for_each_reflog(const char *base, each_ref_fn fn, void *cb_data) +/* + * Call fn for each reflog in the namespace indicated by name. name + * must be empty or end with '/'. Name will be used as a scratch + * space, but its contents will be restored before return. + */ +static int do_for_each_reflog(struct strbuf *name, each_ref_fn fn, void *cb_data) { - DIR *d = opendir(git_path("logs/%s", base)); + DIR *d = opendir(git_path("logs/%s", name->buf)); int retval = 0; + struct dirent *de; + int oldlen = name->len; - if (d) { - struct dirent *de; - int baselen = strlen(base); - char *log = xmalloc(baselen + 257); - - memcpy(log, base, baselen); - if (baselen && base[baselen-1] != '/') - log[baselen++] = '/'; + if (!d) + return name->len ? errno : 0; - while ((de = readdir(d)) != NULL) { - struct stat st; - int namelen; + while ((de = readdir(d)) != NULL) { + struct stat st; - if (de->d_name[0] == '.') - continue; - namelen = strlen(de->d_name); - if (namelen > 255) - continue; - if (has_extension(de->d_name, ".lock")) - continue; - memcpy(log + baselen, de->d_name, namelen+1); - if (stat(git_path("logs/%s", log), &st) < 0) - continue; + if (de->d_name[0] == '.') + continue; + if (has_extension(de->d_name, ".lock")) + continue; + strbuf_addstr(name, de->d_name); + if (stat(git_path("logs/%s", name->buf), &st) < 0) { + ; /* silently ignore */ + } else { if (S_ISDIR(st.st_mode)) { - retval = do_for_each_reflog(log, fn, cb_data); + strbuf_addch(name, '/'); + retval = do_for_each_reflog(name, fn, cb_data); } else { unsigned char sha1[20]; - if (read_ref_full(log, sha1, 0, NULL)) - retval = error("bad ref for %s", log); + if (read_ref_full(name->buf, sha1, 0, NULL)) + retval = error("bad ref for %s", name->buf); else - retval = fn(log, sha1, 0, cb_data); + retval = fn(name->buf, sha1, 0, cb_data); } if (retval) break; } - free(log); - closedir(d); + strbuf_setlen(name, oldlen); } - else if (*base) - return errno; + closedir(d); return retval; } int for_each_reflog(each_ref_fn fn, void *cb_data) { - return do_for_each_reflog("", fn, cb_data); + int retval; + struct strbuf name; + strbuf_init(&name, PATH_MAX); + retval = do_for_each_reflog(&name, fn, cb_data); + strbuf_release(&name); + return retval; } int update_ref(const char *action, const char *refname, diff --git a/remote-curl.c b/remote-curl.c index 08962214db..04a9d6277d 100644 --- a/remote-curl.c +++ b/remote-curl.c @@ -782,6 +782,7 @@ static int push_git(struct discovery *heads, int nr_spec, char **specs) argv[argc++] = "--quiet"; else if (options.verbosity > 1) argv[argc++] = "--verbose"; + argv[argc++] = options.progress ? "--progress" : "--no-progress"; argv[argc++] = url; for (i = 0; i < nr_spec; i++) argv[argc++] = specs[i]; @@ -7,6 +7,7 @@ #include "dir.h" #include "tag.h" #include "string-list.h" +#include "mergesort.h" enum map_direction { FROM_SRC, FROM_DST }; @@ -918,6 +919,27 @@ void free_refs(struct ref *ref) } } +int ref_compare_name(const void *va, const void *vb) +{ + const struct ref *a = va, *b = vb; + return strcmp(a->name, b->name); +} + +static void *ref_list_get_next(const void *a) +{ + return ((const struct ref *)a)->next; +} + +static void ref_list_set_next(void *a, void *next) +{ + ((struct ref *)a)->next = next; +} + +void sort_ref_list(struct ref **l, int (*cmp)(const void *, const void *)) +{ + *l = llist_mergesort(*l, ref_list_get_next, ref_list_set_next, cmp); +} + static int count_refspec_match(const char *pattern, struct ref *refs, struct ref **matched_ref) @@ -72,6 +72,8 @@ extern const struct refspec *tag_refspec; struct ref *alloc_ref(const char *name); struct ref *copy_ref(const struct ref *ref); struct ref *copy_ref_list(const struct ref *ref); +void sort_ref_list(struct ref **, int (*cmp)(const void *, const void *)); +int ref_compare_name(const void *, const void *); int check_ref_type(const struct ref *ref, int flags); diff --git a/sequencer.c b/sequencer.c index f83cdfd637..bf078f274b 100644 --- a/sequencer.c +++ b/sequencer.c @@ -261,9 +261,17 @@ static int is_index_unchanged(void) return error(_("Could not resolve HEAD commit\n")); head_commit = lookup_commit(head_sha1); - if (!head_commit || parse_commit(head_commit)) - return error(_("could not parse commit %s\n"), - sha1_to_hex(head_commit->object.sha1)); + + /* + * If head_commit is NULL, check_commit, called from + * lookup_commit, would have indicated that head_commit is not + * a commit object already. parse_commit() will return failure + * without further complaints in such a case. Otherwise, if + * the commit is invalid, parse_commit() will complain. So + * there is nothing for us to say here. Just return failure. + */ + if (parse_commit(head_commit)) + return -1; if (!active_cache_tree) active_cache_tree = cache_tree(); @@ -283,7 +291,8 @@ static int is_index_unchanged(void) * If we are revert, or if our cherry-pick results in a hand merge, * we had better say that the current user is responsible for that. */ -static int run_git_commit(const char *defmsg, struct replay_opts *opts) +static int run_git_commit(const char *defmsg, struct replay_opts *opts, + int allow_empty) { struct argv_array array; int rc; @@ -299,7 +308,7 @@ static int run_git_commit(const char *defmsg, struct replay_opts *opts) argv_array_push(&array, defmsg); } - if (opts->allow_empty) + if (allow_empty) argv_array_push(&array, "--allow-empty"); rc = run_command_v_opt(array.argv, RUN_GIT_CMD); @@ -327,6 +336,44 @@ static int is_original_commit_empty(struct commit *commit) return !hashcmp(ptree_sha1, commit->tree->object.sha1); } +/* + * Do we run "git commit" with "--allow-empty"? + */ +static int allow_empty(struct replay_opts *opts, struct commit *commit) +{ + int index_unchanged, empty_commit; + + /* + * Three cases: + * + * (1) we do not allow empty at all and error out. + * + * (2) we allow ones that were initially empty, but + * forbid the ones that become empty; + * + * (3) we allow both. + */ + if (!opts->allow_empty) + return 0; /* let "git commit" barf as necessary */ + + index_unchanged = is_index_unchanged(); + if (index_unchanged < 0) + return index_unchanged; + if (!index_unchanged) + return 0; /* we do not have to say --allow-empty */ + + if (opts->keep_redundant_commits) + return 1; + + empty_commit = is_original_commit_empty(commit); + if (empty_commit < 0) + return empty_commit; + if (!empty_commit) + return 0; + else + return 1; +} + static int do_pick_commit(struct commit *commit, struct replay_opts *opts) { unsigned char head[20]; @@ -336,8 +383,6 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts) char *defmsg = NULL; struct strbuf msgbuf = STRBUF_INIT; int res; - int empty_commit; - int index_unchanged; if (opts->no_commit) { /* @@ -463,10 +508,6 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts) free_commit_list(remotes); } - empty_commit = is_original_commit_empty(commit); - if (empty_commit < 0) - return empty_commit; - /* * If the merge was clean or if it failed due to conflict, we write * CHERRY_PICK_HEAD for the subsequent invocation of commit to use. @@ -487,27 +528,11 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts) print_advice(res == 1, opts); rerere(opts->allow_rerere_auto); } else { - index_unchanged = is_index_unchanged(); - /* - * If index_unchanged is less than 0, that indicates we either - * couldn't parse HEAD or the index, so error out here. - */ - if (index_unchanged < 0) - return index_unchanged; - - if (!empty_commit && !opts->keep_redundant_commits && index_unchanged) - /* - * The head tree and the index match - * meaning the commit is empty. Since it wasn't created - * empty (based on the previous test), we can conclude - * the commit has been made redundant. Since we don't - * want to keep redundant commits, we can just return - * here, skipping this commit - */ - return 0; - + int allow = allow_empty(opts, commit); + if (allow < 0) + return allow; if (!opts->no_commit) - res = run_git_commit(defmsg, opts); + res = run_git_commit(defmsg, opts, allow); } free_message(&msg); diff --git a/sha1_file.c b/sha1_file.c index ad314f08b9..4ccaf7ac19 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -229,7 +229,6 @@ char *sha1_pack_index_name(const unsigned char *sha1) struct alternate_object_database *alt_odb_list; static struct alternate_object_database **alt_odb_tail; -static void read_info_alternates(const char * alternates, int depth); static int git_open_noatime(const char *name); /* @@ -354,7 +353,7 @@ static void link_alt_odb_entries(const char *alt, const char *ep, int sep, } } -static void read_info_alternates(const char * relative_base, int depth) +void read_info_alternates(const char * relative_base, int depth) { char *map; size_t mapsz; @@ -2417,7 +2416,7 @@ int move_temp_to_file(const char *tmpfile, const char *filename) unlink_or_warn(tmpfile); if (ret) { if (ret != EEXIST) { - return error("unable to write sha1 filename %s: %s\n", filename, strerror(ret)); + return error("unable to write sha1 filename %s: %s", filename, strerror(ret)); } /* FIXME!!! Collision check here ? */ } @@ -2509,9 +2508,9 @@ static int write_loose_object(const unsigned char *sha1, char *hdr, int hdrlen, fd = create_tmpfile(tmp_file, sizeof(tmp_file), filename); if (fd < 0) { if (errno == EACCES) - return error("insufficient permission for adding an object to repository database %s\n", get_object_directory()); + return error("insufficient permission for adding an object to repository database %s", get_object_directory()); else - return error("unable to create temporary sha1 filename %s: %s\n", tmp_file, strerror(errno)); + return error("unable to create temporary file: %s", strerror(errno)); } /* Set it up */ @@ -464,3 +464,36 @@ void strbuf_addstr_urlencode(struct strbuf *sb, const char *s, { strbuf_add_urlencode(sb, s, strlen(s), reserved); } + +void strbuf_addf_ln(struct strbuf *sb, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + strbuf_vaddf(sb, fmt, ap); + va_end(ap); + strbuf_addch(sb, '\n'); +} + +int printf_ln(const char *fmt, ...) +{ + int ret; + va_list ap; + va_start(ap, fmt); + ret = vprintf(fmt, ap); + va_end(ap); + if (ret < 0 || putchar('\n') == EOF) + return -1; + return ret + 1; +} + +int fprintf_ln(FILE *fp, const char *fmt, ...) +{ + int ret; + va_list ap; + va_start(ap, fmt); + ret = vfprintf(fp, fmt, ap); + va_end(ap); + if (ret < 0 || putc('\n', fp) == EOF) + return -1; + return ret + 1; +} @@ -99,6 +99,8 @@ __attribute__((format (printf,2,3))) extern void strbuf_addf(struct strbuf *sb, const char *fmt, ...); __attribute__((format (printf,2,0))) extern void strbuf_vaddf(struct strbuf *sb, const char *fmt, va_list ap); +__attribute__((format (printf,2,3))) +extern void strbuf_addf_ln(struct strbuf *sb, const char *fmt, ...); extern void strbuf_add_lines(struct strbuf *sb, const char *prefix, const char *buf, size_t size); @@ -129,4 +131,9 @@ extern void strbuf_add_urlencode(struct strbuf *, const char *, size_t, extern void strbuf_addstr_urlencode(struct strbuf *, const char *, int reserved); +__attribute__((format (printf,1,2))) +extern int printf_ln(const char *fmt, ...); +__attribute__((format (printf,2,3))) +extern int fprintf_ln(FILE *fp, const char *fmt, ...); + #endif /* STRBUF_H */ diff --git a/streaming.c b/streaming.c index 7e7ee2be6f..4d978e54e4 100644 --- a/streaming.c +++ b/streaming.c @@ -99,7 +99,7 @@ int close_istream(struct git_istream *st) return r; } -ssize_t read_istream(struct git_istream *st, char *buf, size_t sz) +ssize_t read_istream(struct git_istream *st, void *buf, size_t sz) { return st->vtbl->read(st, buf, sz); } @@ -121,7 +121,7 @@ static enum input_source istream_source(const unsigned char *sha1, case OI_LOOSE: return loose; case OI_PACKED: - if (!oi->u.packed.is_delta && big_file_threshold <= size) + if (!oi->u.packed.is_delta && big_file_threshold < size) return pack_non_delta; /* fallthru */ default: diff --git a/streaming.h b/streaming.h index 3e827709c8..1d05c2a465 100644 --- a/streaming.h +++ b/streaming.h @@ -10,7 +10,7 @@ struct git_istream; extern struct git_istream *open_istream(const unsigned char *, enum object_type *, unsigned long *, struct stream_filter *); extern int close_istream(struct git_istream *); -extern ssize_t read_istream(struct git_istream *, char *, size_t); +extern ssize_t read_istream(struct git_istream *, void *, size_t); extern int stream_blob_to_fd(int fd, const unsigned char *, struct stream_filter *, int can_seek); diff --git a/submodule.c b/submodule.c index 784b58039d..959d349ea7 100644 --- a/submodule.c +++ b/submodule.c @@ -63,6 +63,9 @@ static int add_submodule_odb(const char *path) alt_odb->name[40] = '\0'; alt_odb->name[41] = '\0'; alt_odb_list = alt_odb; + + /* add possible alternates from the submodule */ + read_info_alternates(objects_directory.buf, 0); prepare_alt_odb(); done: strbuf_release(&objects_directory); diff --git a/t/Makefile b/t/Makefile index 6091211f10..88e289fc8b 100644 --- a/t/Makefile +++ b/t/Makefile @@ -28,7 +28,7 @@ test: pre-clean $(TEST_LINT) prove: pre-clean $(TEST_LINT) @echo "*** prove ***"; GIT_CONFIG=.git/config $(PROVE) --exec '$(SHELL_PATH_SQ)' $(GIT_PROVE_OPTS) $(T) :: $(GIT_TEST_OPTS) - $(MAKE) clean + $(MAKE) clean-except-prove-cache $(T): @echo "*** $@ ***"; GIT_CONFIG=.git/config '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS) @@ -36,9 +36,11 @@ $(T): pre-clean: $(RM) -r test-results -clean: +clean-except-prove-cache: $(RM) -r 'trash directory'.* test-results $(RM) -r valgrind/bin + +clean: clean-except-prove-cache $(RM) .prove test-lint: test-lint-duplicates test-lint-executable diff --git a/t/gitweb-lib.sh b/t/gitweb-lib.sh index 21d11d6c2d..ae2dc4604f 100644 --- a/t/gitweb-lib.sh +++ b/t/gitweb-lib.sh @@ -69,7 +69,7 @@ gitweb_run () { # written to web server logs, so we are not interested in that: # we are interested only in properly formatted errors/warnings rm -f gitweb.log && - perl -- "$SCRIPT_NAME" \ + "$PERL_PATH" -- "$SCRIPT_NAME" \ >gitweb.output 2>gitweb.log && perl -w -e ' open O, ">gitweb.headers"; diff --git a/t/perf/p5302-pack-index.sh b/t/perf/p5302-pack-index.sh new file mode 100755 index 0000000000..6cb5b0d55b --- /dev/null +++ b/t/perf/p5302-pack-index.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +test_description="Tests index-pack performance" + +. ./perf-lib.sh + +test_perf_large_repo + +test_expect_success 'repack' ' + git repack -ad && + PACK=`ls .git/objects/pack/*.pack | head -n1` && + test -f "$PACK" && + export PACK +' + +test_perf 'index-pack 0 threads' ' + GIT_DIR=t1 git index-pack --threads=1 --stdin < $PACK +' + +test_perf 'index-pack 1 thread ' ' + GIT_DIR=t2 GIT_FORCE_THREADS=1 git index-pack --threads=1 --stdin < $PACK +' + +test_perf 'index-pack 2 threads' ' + GIT_DIR=t3 git index-pack --threads=2 --stdin < $PACK +' + +test_perf 'index-pack 4 threads' ' + GIT_DIR=t4 git index-pack --threads=4 --stdin < $PACK +' + +test_perf 'index-pack 8 threads' ' + GIT_DIR=t5 git index-pack --threads=8 --stdin < $PACK +' + +test_perf 'index-pack default number of threads' ' + GIT_DIR=t6 git index-pack --stdin < $PACK +' + +test_done diff --git a/t/t0023-crlf-am.sh b/t/t0023-crlf-am.sh index aaed725402..f9bbb91f64 100755 --- a/t/t0023-crlf-am.sh +++ b/t/t0023-crlf-am.sh @@ -11,7 +11,7 @@ Date: Thu, 23 Aug 2007 13:00:00 +0200 Subject: test1 --- - foo | 1 + + foo | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 foo diff --git a/t/t1050-large.sh b/t/t1050-large.sh index 4d127f19b7..55ed955cef 100755 --- a/t/t1050-large.sh +++ b/t/t1050-large.sh @@ -134,4 +134,16 @@ test_expect_success 'repack' ' git repack -ad ' +test_expect_success 'tar achiving' ' + git archive --format=tar HEAD >/dev/null +' + +test_expect_success 'zip achiving, store only' ' + git archive --format=zip -0 HEAD >/dev/null +' + +test_expect_success 'zip achiving, deflate' ' + git archive --format=zip HEAD >/dev/null +' + test_done diff --git a/t/t1200-tutorial.sh b/t/t1200-tutorial.sh index 9356beaf4b..397ccb6909 100755 --- a/t/t1200-tutorial.sh +++ b/t/t1200-tutorial.sh @@ -154,8 +154,8 @@ test_expect_success 'git show-branch' ' cat > resolve.expect << EOF Updating VARIABLE..VARIABLE FASTFORWARD (no commit created; -m option ignored) - example | 1 + - hello | 1 + + example | 1 + + hello | 1 + 2 files changed, 2 insertions(+) EOF diff --git a/t/t1411-reflog-show.sh b/t/t1411-reflog-show.sh index caa687b5b4..9a105fe21f 100755 --- a/t/t1411-reflog-show.sh +++ b/t/t1411-reflog-show.sh @@ -65,20 +65,73 @@ test_expect_success 'using @{now} syntax shows reflog date (oneline)' ' ' cat >expect <<'EOF' -Reflog: HEAD@{1112911993 -0700} (C O Mitter <committer@example.com>) +HEAD@{Thu Apr 7 15:13:13 2005 -0700} +EOF +test_expect_success 'using @{now} syntax shows reflog date (format=%gd)' ' + git log -g -1 --format=%gd HEAD@{now} >actual && + test_cmp expect actual +' + +cat >expect <<'EOF' +Reflog: HEAD@{Thu Apr 7 15:13:13 2005 -0700} (C O Mitter <committer@example.com>) Reflog message: commit (initial): one EOF test_expect_success 'using --date= shows reflog date (multiline)' ' - git log -g -1 --date=raw >tmp && + git log -g -1 --date=default >tmp && grep ^Reflog <tmp >actual && test_cmp expect actual ' cat >expect <<'EOF' -e46513e HEAD@{1112911993 -0700}: commit (initial): one +e46513e HEAD@{Thu Apr 7 15:13:13 2005 -0700}: commit (initial): one EOF test_expect_success 'using --date= shows reflog date (oneline)' ' - git log -g -1 --oneline --date=raw >actual && + git log -g -1 --oneline --date=default >actual && + test_cmp expect actual +' + +cat >expect <<'EOF' +HEAD@{1112911993 -0700} +EOF +test_expect_success 'using --date= shows reflog date (format=%gd)' ' + git log -g -1 --format=%gd --date=raw >actual && + test_cmp expect actual +' + +cat >expect <<'EOF' +Reflog: HEAD@{0} (C O Mitter <committer@example.com>) +Reflog message: commit (initial): one +EOF +test_expect_success 'log.date does not invoke "--date" magic (multiline)' ' + test_config log.date raw && + git log -g -1 >tmp && + grep ^Reflog <tmp >actual && + test_cmp expect actual +' + +cat >expect <<'EOF' +e46513e HEAD@{0}: commit (initial): one +EOF +test_expect_success 'log.date does not invoke "--date" magic (oneline)' ' + test_config log.date raw && + git log -g -1 --oneline >actual && + test_cmp expect actual +' + +cat >expect <<'EOF' +HEAD@{0} +EOF +test_expect_success 'log.date does not invoke "--date" magic (format=%gd)' ' + test_config log.date raw && + git log -g -1 --format=%gd >actual && + test_cmp expect actual +' + +cat >expect <<'EOF' +HEAD@{0} +EOF +test_expect_success '--date magic does not override explicit @{0} syntax' ' + git log -g -1 --format=%gd --date=raw HEAD@{0} >actual && test_cmp expect actual ' diff --git a/t/t2015-checkout-unborn.sh b/t/t2015-checkout-unborn.sh index 6352b74e2e..37bdcedcc9 100755 --- a/t/t2015-checkout-unborn.sh +++ b/t/t2015-checkout-unborn.sh @@ -46,4 +46,15 @@ test_expect_success 'checking out another branch from unborn state' ' test_cmp expect actual ' +test_expect_success 'checking out in a newly created repo' ' + test_create_repo empty && + ( + cd empty && + git symbolic-ref HEAD >expect && + test_must_fail git checkout && + git symbolic-ref HEAD >actual && + test_cmp expect actual + ) +' + test_done diff --git a/t/t2020-checkout-detach.sh b/t/t2020-checkout-detach.sh index b37ce25c42..81005373d7 100755 --- a/t/t2020-checkout-detach.sh +++ b/t/t2020-checkout-detach.sh @@ -11,14 +11,13 @@ check_not_detached () { git symbolic-ref -q HEAD >/dev/null } -ORPHAN_WARNING='you are leaving .* commit.*behind' PREV_HEAD_DESC='Previous HEAD position was' check_orphan_warning() { - test_i18ngrep "$ORPHAN_WARNING" "$1" && + test_i18ngrep "you are leaving $2 behind" "$1" && test_i18ngrep ! "$PREV_HEAD_DESC" "$1" } check_no_orphan_warning() { - test_i18ngrep ! "$ORPHAN_WARNING" "$1" && + test_i18ngrep ! "you are leaving .* commit.*behind" "$1" && test_i18ngrep "$PREV_HEAD_DESC" "$1" } @@ -110,12 +109,24 @@ test_expect_success 'checkout warns on orphan commits' ' git checkout --detach two && echo content >orphan && git add orphan && - git commit -a -m orphan && + git commit -a -m orphan1 && + echo new content >orphan && + git commit -a -m orphan2 && + orphan2=$(git rev-parse HEAD) && git checkout master 2>stderr ' test_expect_success 'checkout warns on orphan commits: output' ' - check_orphan_warning stderr + check_orphan_warning stderr "2 commits" +' + +test_expect_success 'checkout warns orphaning 1 of 2 commits' ' + git checkout "$orphan2" && + git checkout HEAD^ 2>stderr +' + +test_expect_success 'checkout warns orphaning 1 of 2 commits: output' ' + check_orphan_warning stderr "1 commit" ' test_expect_success 'checkout does not warn leaving ref tip' ' diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh index 9fe1d8feab..a17f8b2a40 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh @@ -160,6 +160,83 @@ test_expect_success 'git branch --list -d t should fail' ' test_path_is_missing .git/refs/heads/t ' +test_expect_success 'git branch --column' ' + COLUMNS=81 git branch --column=column >actual && + cat >expected <<\EOF && + a/b/c bam foo l * master n o/p r + abc bar j/k m/m master2 o/o q +EOF + test_cmp expected actual +' + +test_expect_success 'git branch --column with an extremely long branch name' ' + long=this/is/a/part/of/long/branch/name && + long=z$long/$long/$long/$long && + test_when_finished "git branch -d $long" && + git branch $long && + COLUMNS=80 git branch --column=column >actual && + cat >expected <<EOF && + a/b/c + abc + bam + bar + foo + j/k + l + m/m +* master + master2 + n + o/o + o/p + q + r + $long +EOF + test_cmp expected actual +' + +test_expect_success 'git branch with column.*' ' + git config column.ui column && + git config column.branch "dense" && + COLUMNS=80 git branch >actual && + git config --unset column.branch && + git config --unset column.ui && + cat >expected <<\EOF && + a/b/c bam foo l * master n o/p r + abc bar j/k m/m master2 o/o q +EOF + test_cmp expected actual +' + +test_expect_success 'git branch --column -v should fail' ' + test_must_fail git branch --column -v +' + +test_expect_success 'git branch -v with column.ui ignored' ' + git config column.ui column && + COLUMNS=80 git branch -v | cut -c -10 | sed "s/ *$//" >actual && + git config --unset column.ui && + cat >expected <<\EOF && + a/b/c + abc + bam + bar + foo + j/k + l + m/m +* master + master2 + n + o/o + o/p + q + r +EOF + test_cmp expected actual +' + mv .git/config .git/config-saved test_expect_success 'git branch -m q q2 without config should succeed' ' diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index 7fd2127625..025c1c610e 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -247,6 +247,7 @@ test_expect_success '-p handles "no changes" gracefully' ' ' test_expect_failure 'exchange two commits with -p' ' + git checkout H && FAKE_LINES="2 1" git rebase -i -p HEAD~2 && test H = $(git cat-file commit HEAD^ | sed -ne \$p) && test G = $(git cat-file commit HEAD | sed -ne \$p) @@ -323,7 +324,7 @@ test_expect_success 'verbose flag is heeded, even after --continue' ' echo resolved > file1 && git add file1 && git rebase --continue > output && - grep "^ file1 | 2 +-$" output + grep "^ file1 | 2 +-$" output ' test_expect_success 'multi-squash only fires up editor once' ' diff --git a/t/t3406-rebase-message.sh b/t/t3406-rebase-message.sh index fe5f936988..6898377910 100755 --- a/t/t3406-rebase-message.sh +++ b/t/t3406-rebase-message.sh @@ -62,4 +62,9 @@ test_expect_success 'rebase -n overrides config rebase.stat config' ' ! grep "^ fileX | *1 +$" diffstat.txt ' +test_expect_success 'rebase --onto outputs the invalid ref' ' + test_must_fail git rebase --onto invalid-ref HEAD HEAD 2>err && + grep "invalid-ref" err +' + test_done diff --git a/t/t3411-rebase-preserve-around-merges.sh b/t/t3411-rebase-preserve-around-merges.sh index ace8e54e9b..dc81bf27eb 100755 --- a/t/t3411-rebase-preserve-around-merges.sh +++ b/t/t3411-rebase-preserve-around-merges.sh @@ -56,6 +56,7 @@ test_expect_success 'squash F1 into D1' ' # And rebase G1..M1 onto E2 test_expect_success 'rebase two levels of merge' ' + git checkout A1 && test_commit G1 && test_commit H1 && test_commit I1 && diff --git a/t/t3505-cherry-pick-empty.sh b/t/t3505-cherry-pick-empty.sh index 92f00cdf84..5a1340cee6 100755 --- a/t/t3505-cherry-pick-empty.sh +++ b/t/t3505-cherry-pick-empty.sh @@ -71,4 +71,34 @@ test_expect_success 'cherry pick with --keep-redundant-commits' ' git cherry-pick --keep-redundant-commits HEAD^ ' +test_expect_success 'cherry-pick a commit that becomes no-op (prep)' ' + git checkout master && + git branch fork && + echo foo >file2 && + git add file2 && + test_tick && + git commit -m "add file2 on master" && + + git checkout fork && + echo foo >file2 && + git add file2 && + test_tick && + git commit -m "add file2 on the side" +' + +test_expect_success 'cherry-pick a no-op without --keep-redundant' ' + git reset --hard && + git checkout fork^0 && + test_must_fail git cherry-pick master +' + +test_expect_success 'cherry-pick a no-op with --keep-redundant' ' + git reset --hard && + git checkout fork^0 && + git cherry-pick --keep-redundant-commits master && + git show -s --format='%s' >actual && + echo "add file2 on master" >expect && + test_cmp expect actual +' + test_done diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh index 3addb804d5..cd042633ba 100755 --- a/t/t3903-stash.sh +++ b/t/t3903-stash.sh @@ -443,7 +443,7 @@ test_expect_success 'stash show format defaults to --stat' ' STASH_ID=$(git stash create) && git reset --hard && cat >expected <<-EOF && - file | 1 + + file | 1 + 1 file changed, 1 insertion(+) EOF git stash show ${STASH_ID} >actual && diff --git a/t/t4006-diff-mode.sh b/t/t4006-diff-mode.sh index ff8c2f7532..7a3e1f9a24 100755 --- a/t/t4006-diff-mode.sh +++ b/t/t4006-diff-mode.sh @@ -8,23 +8,52 @@ test_description='Test mode change diffs. ' . ./test-lib.sh -test_expect_success \ - 'setup' \ - 'echo frotz >rezrov && - git update-index --add rezrov && - tree=`git write-tree` && - echo $tree' - -test_expect_success \ - 'chmod' \ - 'test_chmod +x rezrov && - git diff-index $tree >current' - -sed -e 's/\(:100644 100755\) \('"$_x40"'\) \2 /\1 X X /' <current >check -echo ":100644 100755 X X M rezrov" >expected - -test_expect_success \ - 'verify' \ - 'test_cmp expected check' +sed_script='s/\(:100644 100755\) \('"$_x40"'\) \2 /\1 X X /' + +test_expect_success 'setup' ' + echo frotz >rezrov && + git update-index --add rezrov && + tree=`git write-tree` && + echo $tree +' + +test_expect_success 'chmod' ' + test_chmod +x rezrov && + git diff-index $tree >current && + sed -e "$sed_script" <current >check && + echo ":100644 100755 X X M rezrov" >expected && + test_cmp expected check +' + +test_expect_success 'prepare binary file' ' + git commit -m rezrov && + printf "\00\01\02\03\04\05\06" >binbin && + git add binbin && + git commit -m binbin +' + +test_expect_success '--stat output after text chmod' ' + test_chmod -x rezrov && + echo " 0 files changed" >expect && + git diff HEAD --stat >actual && + test_cmp expect actual +' + +test_expect_success '--shortstat output after text chmod' ' + git diff HEAD --shortstat >actual && + test_cmp expect actual +' + +test_expect_success '--stat output after binary chmod' ' + test_chmod +x binbin && + echo " 0 files changed" >expect && + git diff HEAD --stat >actual && + test_cmp expect actual +' + +test_expect_success '--shortstat output after binary chmod' ' + git diff HEAD --shortstat >actual && + test_cmp expect actual +' test_done diff --git a/t/t4012-diff-binary.sh b/t/t4012-diff-binary.sh index ed24ddd88a..8b4e80de96 100755 --- a/t/t4012-diff-binary.sh +++ b/t/t4012-diff-binary.sh @@ -107,4 +107,23 @@ test_expect_success 'diff --no-index with binary creation' ' test_cmp expected actual ' +cat >expect <<EOF + binfile | Bin 0 -> 1026 bytes + textfile | 10000 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +EOF + +test_expect_success 'diff --stat with binary files and big change count' ' + echo X | dd of=binfile bs=1k seek=1 && + git add binfile && + i=0 && + while test $i -lt 10000; do + echo $i && + i=$(($i + 1)) + done >textfile && + git add textfile && + git diff --cached --stat binfile textfile >output && + grep " | " output >actual && + test_cmp expect actual +' + test_done diff --git a/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_master b/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_master index 2f8560c369..9951e3677d 100644 --- a/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_master +++ b/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_master @@ -1,7 +1,7 @@ $ git diff-tree --cc --patch-with-stat --summary master 59d314ad6f356dd08601a4cd5e530381da3e3c64 - dir/sub | 2 ++ - file0 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ 2 files changed, 5 insertions(+) diff --cc dir/sub diff --git a/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_side b/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_side index 72e03c14fb..cec33fa3f0 100644 --- a/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_side +++ b/t/t4013/diff.diff-tree_--cc_--patch-with-stat_--summary_side @@ -1,8 +1,8 @@ $ git diff-tree --cc --patch-with-stat --summary side c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 diff --git a/t/t4013/diff.diff-tree_--cc_--patch-with-stat_master b/t/t4013/diff.diff-tree_--cc_--patch-with-stat_master index 8b357d964b..db3c0a7b2c 100644 --- a/t/t4013/diff.diff-tree_--cc_--patch-with-stat_master +++ b/t/t4013/diff.diff-tree_--cc_--patch-with-stat_master @@ -1,7 +1,7 @@ $ git diff-tree --cc --patch-with-stat master 59d314ad6f356dd08601a4cd5e530381da3e3c64 - dir/sub | 2 ++ - file0 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ 2 files changed, 5 insertions(+) diff --cc dir/sub diff --git a/t/t4013/diff.diff-tree_--cc_--stat_--summary_master b/t/t4013/diff.diff-tree_--cc_--stat_--summary_master index e0568d6883..d019867dd9 100644 --- a/t/t4013/diff.diff-tree_--cc_--stat_--summary_master +++ b/t/t4013/diff.diff-tree_--cc_--stat_--summary_master @@ -1,6 +1,6 @@ $ git diff-tree --cc --stat --summary master 59d314ad6f356dd08601a4cd5e530381da3e3c64 - dir/sub | 2 ++ - file0 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ 2 files changed, 5 insertions(+) $ diff --git a/t/t4013/diff.diff-tree_--cc_--stat_--summary_side b/t/t4013/diff.diff-tree_--cc_--stat_--summary_side index 5afc8239a1..12b2eee17e 100644 --- a/t/t4013/diff.diff-tree_--cc_--stat_--summary_side +++ b/t/t4013/diff.diff-tree_--cc_--stat_--summary_side @@ -1,8 +1,8 @@ $ git diff-tree --cc --stat --summary side c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 $ diff --git a/t/t4013/diff.diff-tree_--cc_--stat_master b/t/t4013/diff.diff-tree_--cc_--stat_master index f48367a89a..40b91796b3 100644 --- a/t/t4013/diff.diff-tree_--cc_--stat_master +++ b/t/t4013/diff.diff-tree_--cc_--stat_master @@ -1,6 +1,6 @@ $ git diff-tree --cc --stat master 59d314ad6f356dd08601a4cd5e530381da3e3c64 - dir/sub | 2 ++ - file0 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ 2 files changed, 5 insertions(+) $ diff --git a/t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-stat_initial b/t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-stat_initial index 590864c2d7..817ed06f82 100644 --- a/t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-stat_initial +++ b/t/t4013/diff.diff-tree_--pretty=oneline_--root_--patch-with-stat_initial @@ -1,8 +1,8 @@ $ git diff-tree --pretty=oneline --root --patch-with-stat initial 444ac553ac7612cc88969031b02b3767fb8a353a Initial - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 +++ 3 files changed, 8 insertions(+) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.diff-tree_--pretty_--patch-with-stat_side b/t/t4013/diff.diff-tree_--pretty_--patch-with-stat_side index e05e77875c..fe3f6b7c7e 100644 --- a/t/t4013/diff.diff-tree_--pretty_--patch-with-stat_side +++ b/t/t4013/diff.diff-tree_--pretty_--patch-with-stat_side @@ -5,9 +5,9 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.diff-tree_--pretty_--root_--patch-with-stat_initial b/t/t4013/diff.diff-tree_--pretty_--root_--patch-with-stat_initial index 0e2c956633..06eb77e386 100644 --- a/t/t4013/diff.diff-tree_--pretty_--root_--patch-with-stat_initial +++ b/t/t4013/diff.diff-tree_--pretty_--root_--patch-with-stat_initial @@ -5,9 +5,9 @@ Date: Mon Jun 26 00:00:00 2006 +0000 Initial --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 +++ 3 files changed, 8 insertions(+) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.diff-tree_--pretty_--root_--stat_--summary_initial b/t/t4013/diff.diff-tree_--pretty_--root_--stat_--summary_initial index 384fa44ddd..680eab5f27 100644 --- a/t/t4013/diff.diff-tree_--pretty_--root_--stat_--summary_initial +++ b/t/t4013/diff.diff-tree_--pretty_--root_--stat_--summary_initial @@ -5,9 +5,9 @@ Date: Mon Jun 26 00:00:00 2006 +0000 Initial - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 dir/sub create mode 100644 file0 diff --git a/t/t4013/diff.diff-tree_--pretty_--root_--stat_initial b/t/t4013/diff.diff-tree_--pretty_--root_--stat_initial index 10384a83d3..9722d1b3a7 100644 --- a/t/t4013/diff.diff-tree_--pretty_--root_--stat_initial +++ b/t/t4013/diff.diff-tree_--pretty_--root_--stat_initial @@ -5,8 +5,8 @@ Date: Mon Jun 26 00:00:00 2006 +0000 Initial - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 +++ 3 files changed, 8 insertions(+) $ diff --git a/t/t4013/diff.diff-tree_--root_--patch-with-stat_initial b/t/t4013/diff.diff-tree_--root_--patch-with-stat_initial index f57062ea07..ad69ffe647 100644 --- a/t/t4013/diff.diff-tree_--root_--patch-with-stat_initial +++ b/t/t4013/diff.diff-tree_--root_--patch-with-stat_initial @@ -1,8 +1,8 @@ $ git diff-tree --root --patch-with-stat initial 444ac553ac7612cc88969031b02b3767fb8a353a - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 +++ 3 files changed, 8 insertions(+) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.diff-tree_-c_--stat_--summary_master b/t/t4013/diff.diff-tree_-c_--stat_--summary_master index 7088683444..81c3021541 100644 --- a/t/t4013/diff.diff-tree_-c_--stat_--summary_master +++ b/t/t4013/diff.diff-tree_-c_--stat_--summary_master @@ -1,6 +1,6 @@ $ git diff-tree -c --stat --summary master 59d314ad6f356dd08601a4cd5e530381da3e3c64 - dir/sub | 2 ++ - file0 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ 2 files changed, 5 insertions(+) $ diff --git a/t/t4013/diff.diff-tree_-c_--stat_--summary_side b/t/t4013/diff.diff-tree_-c_--stat_--summary_side index ef216abb1d..e8dc12bfbf 100644 --- a/t/t4013/diff.diff-tree_-c_--stat_--summary_side +++ b/t/t4013/diff.diff-tree_-c_--stat_--summary_side @@ -1,8 +1,8 @@ $ git diff-tree -c --stat --summary side c7a2ab9e8eac7b117442a607d5a9b3950ae34d5a - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 $ diff --git a/t/t4013/diff.diff-tree_-c_--stat_master b/t/t4013/diff.diff-tree_-c_--stat_master index ad19f103eb..89d59b1548 100644 --- a/t/t4013/diff.diff-tree_-c_--stat_master +++ b/t/t4013/diff.diff-tree_-c_--stat_master @@ -1,6 +1,6 @@ $ git diff-tree -c --stat master 59d314ad6f356dd08601a4cd5e530381da3e3c64 - dir/sub | 2 ++ - file0 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ 2 files changed, 5 insertions(+) $ diff --git a/t/t4013/diff.diff_--patch-with-stat_-r_initial..side b/t/t4013/diff.diff_--patch-with-stat_-r_initial..side index ddad917ae8..be8d1ea1bd 100644 --- a/t/t4013/diff.diff_--patch-with-stat_-r_initial..side +++ b/t/t4013/diff.diff_--patch-with-stat_-r_initial..side @@ -1,7 +1,7 @@ $ git diff --patch-with-stat -r initial..side - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.diff_--patch-with-stat_initial..side b/t/t4013/diff.diff_--patch-with-stat_initial..side index bdbd114d8e..5424e6d566 100644 --- a/t/t4013/diff.diff_--patch-with-stat_initial..side +++ b/t/t4013/diff.diff_--patch-with-stat_initial..side @@ -1,7 +1,7 @@ $ git diff --patch-with-stat initial..side - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.diff_--stat_initial..side b/t/t4013/diff.diff_--stat_initial..side index 6d08f3d355..b7741e2b83 100644 --- a/t/t4013/diff.diff_--stat_initial..side +++ b/t/t4013/diff.diff_--stat_initial..side @@ -1,6 +1,6 @@ $ git diff --stat initial..side - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) $ diff --git a/t/t4013/diff.diff_-r_--stat_initial..side b/t/t4013/diff.diff_-r_--stat_initial..side index 2ddb2540e6..5d514f55b9 100644 --- a/t/t4013/diff.diff_-r_--stat_initial..side +++ b/t/t4013/diff.diff_-r_--stat_initial..side @@ -1,6 +1,6 @@ $ git diff -r --stat initial..side - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) $ diff --git a/t/t4013/diff.format-patch_--attach_--stdout_--suffix=.diff_initial..side b/t/t4013/diff.format-patch_--attach_--stdout_--suffix=.diff_initial..side index 3cab049f7d..547ca065a5 100644 --- a/t/t4013/diff.format-patch_--attach_--stdout_--suffix=.diff_initial..side +++ b/t/t4013/diff.format-patch_--attach_--stdout_--suffix=.diff_initial..side @@ -12,9 +12,9 @@ Content-Type: text/plain; charset=UTF-8; format=fixed Content-Transfer-Encoding: 8bit --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 diff --git a/t/t4013/diff.format-patch_--attach_--stdout_initial..master b/t/t4013/diff.format-patch_--attach_--stdout_initial..master index 564a4d38f2..52fedc179e 100644 --- a/t/t4013/diff.format-patch_--attach_--stdout_initial..master +++ b/t/t4013/diff.format-patch_--attach_--stdout_initial..master @@ -14,9 +14,9 @@ Content-Transfer-Encoding: 8bit This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -73,8 +73,8 @@ Content-Type: text/plain; charset=UTF-8; format=fixed Content-Transfer-Encoding: 8bit --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 @@ -121,9 +121,9 @@ Content-Type: text/plain; charset=UTF-8; format=fixed Content-Transfer-Encoding: 8bit --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 diff --git a/t/t4013/diff.format-patch_--attach_--stdout_initial..master^ b/t/t4013/diff.format-patch_--attach_--stdout_initial..master^ index 4f28460b83..1c3cde251b 100644 --- a/t/t4013/diff.format-patch_--attach_--stdout_initial..master^ +++ b/t/t4013/diff.format-patch_--attach_--stdout_initial..master^ @@ -14,9 +14,9 @@ Content-Transfer-Encoding: 8bit This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -73,8 +73,8 @@ Content-Type: text/plain; charset=UTF-8; format=fixed Content-Transfer-Encoding: 8bit --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 diff --git a/t/t4013/diff.format-patch_--attach_--stdout_initial..side b/t/t4013/diff.format-patch_--attach_--stdout_initial..side index b10cc2e251..4717bd8313 100644 --- a/t/t4013/diff.format-patch_--attach_--stdout_initial..side +++ b/t/t4013/diff.format-patch_--attach_--stdout_initial..side @@ -12,9 +12,9 @@ Content-Type: text/plain; charset=UTF-8; format=fixed Content-Transfer-Encoding: 8bit --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 diff --git a/t/t4013/diff.format-patch_--inline_--stdout_--numbered-files_initial..master b/t/t4013/diff.format-patch_--inline_--stdout_--numbered-files_initial..master index a976a8aaf4..02c4db7ec5 100644 --- a/t/t4013/diff.format-patch_--inline_--stdout_--numbered-files_initial..master +++ b/t/t4013/diff.format-patch_--inline_--stdout_--numbered-files_initial..master @@ -14,9 +14,9 @@ Content-Transfer-Encoding: 8bit This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -73,8 +73,8 @@ Content-Type: text/plain; charset=UTF-8; format=fixed Content-Transfer-Encoding: 8bit --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 @@ -121,9 +121,9 @@ Content-Type: text/plain; charset=UTF-8; format=fixed Content-Transfer-Encoding: 8bit --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 diff --git a/t/t4013/diff.format-patch_--inline_--stdout_--subject-prefix=TESTCASE_initial..master b/t/t4013/diff.format-patch_--inline_--stdout_--subject-prefix=TESTCASE_initial..master index b4fd66477a..c7677c5951 100644 --- a/t/t4013/diff.format-patch_--inline_--stdout_--subject-prefix=TESTCASE_initial..master +++ b/t/t4013/diff.format-patch_--inline_--stdout_--subject-prefix=TESTCASE_initial..master @@ -14,9 +14,9 @@ Content-Transfer-Encoding: 8bit This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -73,8 +73,8 @@ Content-Type: text/plain; charset=UTF-8; format=fixed Content-Transfer-Encoding: 8bit --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 @@ -121,9 +121,9 @@ Content-Type: text/plain; charset=UTF-8; format=fixed Content-Transfer-Encoding: 8bit --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 diff --git a/t/t4013/diff.format-patch_--inline_--stdout_initial..master b/t/t4013/diff.format-patch_--inline_--stdout_initial..master index 0d31036e7f..5b3e34e2c0 100644 --- a/t/t4013/diff.format-patch_--inline_--stdout_initial..master +++ b/t/t4013/diff.format-patch_--inline_--stdout_initial..master @@ -14,9 +14,9 @@ Content-Transfer-Encoding: 8bit This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -73,8 +73,8 @@ Content-Type: text/plain; charset=UTF-8; format=fixed Content-Transfer-Encoding: 8bit --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 @@ -121,9 +121,9 @@ Content-Type: text/plain; charset=UTF-8; format=fixed Content-Transfer-Encoding: 8bit --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 diff --git a/t/t4013/diff.format-patch_--inline_--stdout_initial..master^ b/t/t4013/diff.format-patch_--inline_--stdout_initial..master^ index 18d4714423..d13f8a8128 100644 --- a/t/t4013/diff.format-patch_--inline_--stdout_initial..master^ +++ b/t/t4013/diff.format-patch_--inline_--stdout_initial..master^ @@ -14,9 +14,9 @@ Content-Transfer-Encoding: 8bit This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -73,8 +73,8 @@ Content-Type: text/plain; charset=UTF-8; format=fixed Content-Transfer-Encoding: 8bit --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 diff --git a/t/t4013/diff.format-patch_--inline_--stdout_initial..master^^ b/t/t4013/diff.format-patch_--inline_--stdout_initial..master^^ index 29e00ab8af..caec5537de 100644 --- a/t/t4013/diff.format-patch_--inline_--stdout_initial..master^^ +++ b/t/t4013/diff.format-patch_--inline_--stdout_initial..master^^ @@ -14,9 +14,9 @@ Content-Transfer-Encoding: 8bit This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 diff --git a/t/t4013/diff.format-patch_--inline_--stdout_initial..side b/t/t4013/diff.format-patch_--inline_--stdout_initial..side index 3572f20b5d..d3a6762130 100644 --- a/t/t4013/diff.format-patch_--inline_--stdout_initial..side +++ b/t/t4013/diff.format-patch_--inline_--stdout_initial..side @@ -12,9 +12,9 @@ Content-Type: text/plain; charset=UTF-8; format=fixed Content-Transfer-Encoding: 8bit --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 diff --git a/t/t4013/diff.format-patch_--stdout_--cover-letter_-n_initial..master^ b/t/t4013/diff.format-patch_--stdout_--cover-letter_-n_initial..master^ index 54cdcdab40..244d964fc6 100644 --- a/t/t4013/diff.format-patch_--stdout_--cover-letter_-n_initial..master^ +++ b/t/t4013/diff.format-patch_--stdout_--cover-letter_-n_initial..master^ @@ -10,10 +10,10 @@ A U Thor (2): Second Third - dir/sub | 4 ++++ - file0 | 3 +++ - file1 | 3 +++ - file2 | 3 --- + dir/sub | 4 ++++ + file0 | 3 +++ + file1 | 3 +++ + file2 | 3 --- 4 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 file1 delete mode 100644 file2 @@ -28,9 +28,9 @@ Subject: [DIFFERENT_PREFIX 1/2] Second This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -73,8 +73,8 @@ Date: Mon, 26 Jun 2006 00:02:00 +0000 Subject: [DIFFERENT_PREFIX 2/2] Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 diff --git a/t/t4013/diff.format-patch_--stdout_--no-numbered_initial..master b/t/t4013/diff.format-patch_--stdout_--no-numbered_initial..master index 23194ebdaa..bfc287a147 100644 --- a/t/t4013/diff.format-patch_--stdout_--no-numbered_initial..master +++ b/t/t4013/diff.format-patch_--stdout_--no-numbered_initial..master @@ -6,9 +6,9 @@ Subject: [PATCH] Second This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -51,8 +51,8 @@ Date: Mon, 26 Jun 2006 00:02:00 +0000 Subject: [PATCH] Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 @@ -85,9 +85,9 @@ Date: Mon, 26 Jun 2006 00:03:00 +0000 Subject: [PATCH] Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 diff --git a/t/t4013/diff.format-patch_--stdout_--numbered_initial..master b/t/t4013/diff.format-patch_--stdout_--numbered_initial..master index 78f1a80a97..568f6f584e 100644 --- a/t/t4013/diff.format-patch_--stdout_--numbered_initial..master +++ b/t/t4013/diff.format-patch_--stdout_--numbered_initial..master @@ -6,9 +6,9 @@ Subject: [PATCH 1/3] Second This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -51,8 +51,8 @@ Date: Mon, 26 Jun 2006 00:02:00 +0000 Subject: [PATCH 2/3] Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 @@ -85,9 +85,9 @@ Date: Mon, 26 Jun 2006 00:03:00 +0000 Subject: [PATCH 3/3] Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 diff --git a/t/t4013/diff.format-patch_--stdout_initial..master b/t/t4013/diff.format-patch_--stdout_initial..master index a3dab7f773..5f0352f9f7 100644 --- a/t/t4013/diff.format-patch_--stdout_initial..master +++ b/t/t4013/diff.format-patch_--stdout_initial..master @@ -6,9 +6,9 @@ Subject: [PATCH 1/3] Second This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -51,8 +51,8 @@ Date: Mon, 26 Jun 2006 00:02:00 +0000 Subject: [PATCH 2/3] Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 @@ -85,9 +85,9 @@ Date: Mon, 26 Jun 2006 00:03:00 +0000 Subject: [PATCH 3/3] Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 diff --git a/t/t4013/diff.format-patch_--stdout_initial..master^ b/t/t4013/diff.format-patch_--stdout_initial..master^ index 39f4a3f2d1..2ae454d807 100644 --- a/t/t4013/diff.format-patch_--stdout_initial..master^ +++ b/t/t4013/diff.format-patch_--stdout_initial..master^ @@ -6,9 +6,9 @@ Subject: [PATCH 1/2] Second This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -51,8 +51,8 @@ Date: Mon, 26 Jun 2006 00:02:00 +0000 Subject: [PATCH 2/2] Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 diff --git a/t/t4013/diff.format-patch_--stdout_initial..side b/t/t4013/diff.format-patch_--stdout_initial..side index 88109209db..a7d52fbeea 100644 --- a/t/t4013/diff.format-patch_--stdout_initial..side +++ b/t/t4013/diff.format-patch_--stdout_initial..side @@ -5,9 +5,9 @@ Date: Mon, 26 Jun 2006 00:03:00 +0000 Subject: [PATCH] Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 diff --git a/t/t4013/diff.log_--patch-with-stat_--summary_master_--_dir_ b/t/t4013/diff.log_--patch-with-stat_--summary_master_--_dir_ index 4085bbde87..a18f1472a9 100644 --- a/t/t4013/diff.log_--patch-with-stat_--summary_master_--_dir_ +++ b/t/t4013/diff.log_--patch-with-stat_--summary_master_--_dir_ @@ -12,7 +12,7 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ + dir/sub | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dir/sub b/dir/sub @@ -31,7 +31,7 @@ Date: Mon Jun 26 00:02:00 2006 +0000 Third --- - dir/sub | 2 ++ + dir/sub | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dir/sub b/dir/sub @@ -53,7 +53,7 @@ Date: Mon Jun 26 00:01:00 2006 +0000 This is the second commit. --- - dir/sub | 2 ++ + dir/sub | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.log_--patch-with-stat_master b/t/t4013/diff.log_--patch-with-stat_master index 458627953e..ae425c4672 100644 --- a/t/t4013/diff.log_--patch-with-stat_master +++ b/t/t4013/diff.log_--patch-with-stat_master @@ -12,9 +12,9 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/dir/sub b/dir/sub @@ -54,8 +54,8 @@ Date: Mon Jun 26 00:02:00 2006 +0000 Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) diff --git a/dir/sub b/dir/sub @@ -86,9 +86,9 @@ Date: Mon Jun 26 00:01:00 2006 +0000 This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.log_--patch-with-stat_master_--_dir_ b/t/t4013/diff.log_--patch-with-stat_master_--_dir_ index 6e172cfadd..d5207cadf4 100644 --- a/t/t4013/diff.log_--patch-with-stat_master_--_dir_ +++ b/t/t4013/diff.log_--patch-with-stat_master_--_dir_ @@ -12,7 +12,7 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ + dir/sub | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dir/sub b/dir/sub @@ -31,7 +31,7 @@ Date: Mon Jun 26 00:02:00 2006 +0000 Third --- - dir/sub | 2 ++ + dir/sub | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dir/sub b/dir/sub @@ -53,7 +53,7 @@ Date: Mon Jun 26 00:01:00 2006 +0000 This is the second commit. --- - dir/sub | 2 ++ + dir/sub | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.log_--root_--cc_--patch-with-stat_--summary_master b/t/t4013/diff.log_--root_--cc_--patch-with-stat_--summary_master index 48b0d4b91d..0fc1e8cd71 100644 --- a/t/t4013/diff.log_--root_--cc_--patch-with-stat_--summary_master +++ b/t/t4013/diff.log_--root_--cc_--patch-with-stat_--summary_master @@ -6,8 +6,8 @@ Date: Mon Jun 26 00:04:00 2006 +0000 Merge branch 'side' - dir/sub | 2 ++ - file0 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ 2 files changed, 5 insertions(+) diff --cc dir/sub @@ -44,9 +44,9 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 @@ -87,8 +87,8 @@ Date: Mon Jun 26 00:02:00 2006 +0000 Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 @@ -120,9 +120,9 @@ Date: Mon Jun 26 00:01:00 2006 +0000 This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -162,9 +162,9 @@ Date: Mon Jun 26 00:00:00 2006 +0000 Initial --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 dir/sub create mode 100644 file0 diff --git a/t/t4013/diff.log_--root_--patch-with-stat_--summary_master b/t/t4013/diff.log_--root_--patch-with-stat_--summary_master index f9dc5122e2..dffc09dde9 100644 --- a/t/t4013/diff.log_--root_--patch-with-stat_--summary_master +++ b/t/t4013/diff.log_--root_--patch-with-stat_--summary_master @@ -12,9 +12,9 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 @@ -55,8 +55,8 @@ Date: Mon Jun 26 00:02:00 2006 +0000 Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 @@ -88,9 +88,9 @@ Date: Mon Jun 26 00:01:00 2006 +0000 This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -130,9 +130,9 @@ Date: Mon Jun 26 00:00:00 2006 +0000 Initial --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 dir/sub create mode 100644 file0 diff --git a/t/t4013/diff.log_--root_--patch-with-stat_master b/t/t4013/diff.log_--root_--patch-with-stat_master index 0807ece234..55aa98012d 100644 --- a/t/t4013/diff.log_--root_--patch-with-stat_master +++ b/t/t4013/diff.log_--root_--patch-with-stat_master @@ -12,9 +12,9 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/dir/sub b/dir/sub @@ -54,8 +54,8 @@ Date: Mon Jun 26 00:02:00 2006 +0000 Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) diff --git a/dir/sub b/dir/sub @@ -86,9 +86,9 @@ Date: Mon Jun 26 00:01:00 2006 +0000 This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dir/sub b/dir/sub @@ -127,9 +127,9 @@ Date: Mon Jun 26 00:00:00 2006 +0000 Initial --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 +++ 3 files changed, 8 insertions(+) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.log_--root_-c_--patch-with-stat_--summary_master b/t/t4013/diff.log_--root_-c_--patch-with-stat_--summary_master index 84f5ef6911..019d85f7de 100644 --- a/t/t4013/diff.log_--root_-c_--patch-with-stat_--summary_master +++ b/t/t4013/diff.log_--root_-c_--patch-with-stat_--summary_master @@ -6,8 +6,8 @@ Date: Mon Jun 26 00:04:00 2006 +0000 Merge branch 'side' - dir/sub | 2 ++ - file0 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ 2 files changed, 5 insertions(+) diff --combined dir/sub @@ -44,9 +44,9 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 @@ -87,8 +87,8 @@ Date: Mon Jun 26 00:02:00 2006 +0000 Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 @@ -120,9 +120,9 @@ Date: Mon Jun 26 00:01:00 2006 +0000 This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -162,9 +162,9 @@ Date: Mon Jun 26 00:00:00 2006 +0000 Initial --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 dir/sub create mode 100644 file0 diff --git a/t/t4013/diff.show_--patch-with-stat_--summary_side b/t/t4013/diff.show_--patch-with-stat_--summary_side index e60384d24d..95a474ef1d 100644 --- a/t/t4013/diff.show_--patch-with-stat_--summary_side +++ b/t/t4013/diff.show_--patch-with-stat_--summary_side @@ -5,9 +5,9 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 diff --git a/t/t4013/diff.show_--patch-with-stat_side b/t/t4013/diff.show_--patch-with-stat_side index a3a3255fd3..974e99be82 100644 --- a/t/t4013/diff.show_--patch-with-stat_side +++ b/t/t4013/diff.show_--patch-with-stat_side @@ -5,9 +5,9 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.show_--stat_--summary_side b/t/t4013/diff.show_--stat_--summary_side index d16f464aca..a71492f9bf 100644 --- a/t/t4013/diff.show_--stat_--summary_side +++ b/t/t4013/diff.show_--stat_--summary_side @@ -5,9 +5,9 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 $ diff --git a/t/t4013/diff.show_--stat_side b/t/t4013/diff.show_--stat_side index 6300c0535f..9be712458f 100644 --- a/t/t4013/diff.show_--stat_side +++ b/t/t4013/diff.show_--stat_side @@ -5,8 +5,8 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) $ diff --git a/t/t4013/diff.whatchanged_--patch-with-stat_--summary_master_--_dir_ b/t/t4013/diff.whatchanged_--patch-with-stat_--summary_master_--_dir_ index 16ae54345f..c8b6af2f43 100644 --- a/t/t4013/diff.whatchanged_--patch-with-stat_--summary_master_--_dir_ +++ b/t/t4013/diff.whatchanged_--patch-with-stat_--summary_master_--_dir_ @@ -5,7 +5,7 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ + dir/sub | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dir/sub b/dir/sub @@ -24,7 +24,7 @@ Date: Mon Jun 26 00:02:00 2006 +0000 Third --- - dir/sub | 2 ++ + dir/sub | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dir/sub b/dir/sub @@ -46,7 +46,7 @@ Date: Mon Jun 26 00:01:00 2006 +0000 This is the second commit. --- - dir/sub | 2 ++ + dir/sub | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.whatchanged_--patch-with-stat_master b/t/t4013/diff.whatchanged_--patch-with-stat_master index f3e45ec270..1ac431ba92 100644 --- a/t/t4013/diff.whatchanged_--patch-with-stat_master +++ b/t/t4013/diff.whatchanged_--patch-with-stat_master @@ -5,9 +5,9 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/dir/sub b/dir/sub @@ -47,8 +47,8 @@ Date: Mon Jun 26 00:02:00 2006 +0000 Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) diff --git a/dir/sub b/dir/sub @@ -79,9 +79,9 @@ Date: Mon Jun 26 00:01:00 2006 +0000 This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.whatchanged_--patch-with-stat_master_--_dir_ b/t/t4013/diff.whatchanged_--patch-with-stat_master_--_dir_ index c77f0bc320..b30c28588f 100644 --- a/t/t4013/diff.whatchanged_--patch-with-stat_master_--_dir_ +++ b/t/t4013/diff.whatchanged_--patch-with-stat_master_--_dir_ @@ -5,7 +5,7 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ + dir/sub | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dir/sub b/dir/sub @@ -24,7 +24,7 @@ Date: Mon Jun 26 00:02:00 2006 +0000 Third --- - dir/sub | 2 ++ + dir/sub | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dir/sub b/dir/sub @@ -46,7 +46,7 @@ Date: Mon Jun 26 00:01:00 2006 +0000 This is the second commit. --- - dir/sub | 2 ++ + dir/sub | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.whatchanged_--root_--cc_--patch-with-stat_--summary_master b/t/t4013/diff.whatchanged_--root_--cc_--patch-with-stat_--summary_master index 8d03efea6c..30aae7817b 100644 --- a/t/t4013/diff.whatchanged_--root_--cc_--patch-with-stat_--summary_master +++ b/t/t4013/diff.whatchanged_--root_--cc_--patch-with-stat_--summary_master @@ -6,8 +6,8 @@ Date: Mon Jun 26 00:04:00 2006 +0000 Merge branch 'side' - dir/sub | 2 ++ - file0 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ 2 files changed, 5 insertions(+) diff --cc dir/sub @@ -44,9 +44,9 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 @@ -87,8 +87,8 @@ Date: Mon Jun 26 00:02:00 2006 +0000 Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 @@ -120,9 +120,9 @@ Date: Mon Jun 26 00:01:00 2006 +0000 This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -162,9 +162,9 @@ Date: Mon Jun 26 00:00:00 2006 +0000 Initial --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 dir/sub create mode 100644 file0 diff --git a/t/t4013/diff.whatchanged_--root_--patch-with-stat_--summary_master b/t/t4013/diff.whatchanged_--root_--patch-with-stat_--summary_master index 1874d0616c..db90e51525 100644 --- a/t/t4013/diff.whatchanged_--root_--patch-with-stat_--summary_master +++ b/t/t4013/diff.whatchanged_--root_--patch-with-stat_--summary_master @@ -5,9 +5,9 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 @@ -48,8 +48,8 @@ Date: Mon Jun 26 00:02:00 2006 +0000 Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 @@ -81,9 +81,9 @@ Date: Mon Jun 26 00:01:00 2006 +0000 This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -123,9 +123,9 @@ Date: Mon Jun 26 00:00:00 2006 +0000 Initial --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 dir/sub create mode 100644 file0 diff --git a/t/t4013/diff.whatchanged_--root_--patch-with-stat_master b/t/t4013/diff.whatchanged_--root_--patch-with-stat_master index 5211ff2a75..9a6cc92ce7 100644 --- a/t/t4013/diff.whatchanged_--root_--patch-with-stat_master +++ b/t/t4013/diff.whatchanged_--root_--patch-with-stat_master @@ -5,9 +5,9 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/dir/sub b/dir/sub @@ -47,8 +47,8 @@ Date: Mon Jun 26 00:02:00 2006 +0000 Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) diff --git a/dir/sub b/dir/sub @@ -79,9 +79,9 @@ Date: Mon Jun 26 00:01:00 2006 +0000 This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dir/sub b/dir/sub @@ -120,9 +120,9 @@ Date: Mon Jun 26 00:00:00 2006 +0000 Initial --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 +++ 3 files changed, 8 insertions(+) diff --git a/dir/sub b/dir/sub diff --git a/t/t4013/diff.whatchanged_--root_-c_--patch-with-stat_--summary_master b/t/t4013/diff.whatchanged_--root_-c_--patch-with-stat_--summary_master index ad30245a59..d1d32bd34c 100644 --- a/t/t4013/diff.whatchanged_--root_-c_--patch-with-stat_--summary_master +++ b/t/t4013/diff.whatchanged_--root_-c_--patch-with-stat_--summary_master @@ -6,8 +6,8 @@ Date: Mon Jun 26 00:04:00 2006 +0000 Merge branch 'side' - dir/sub | 2 ++ - file0 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ 2 files changed, 5 insertions(+) diff --combined dir/sub @@ -44,9 +44,9 @@ Date: Mon Jun 26 00:03:00 2006 +0000 Side --- - dir/sub | 2 ++ - file0 | 3 +++ - file3 | 4 ++++ + dir/sub | 2 ++ + file0 | 3 +++ + file3 | 4 ++++ 3 files changed, 9 insertions(+) create mode 100644 file3 @@ -87,8 +87,8 @@ Date: Mon Jun 26 00:02:00 2006 +0000 Third --- - dir/sub | 2 ++ - file1 | 3 +++ + dir/sub | 2 ++ + file1 | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 file1 @@ -120,9 +120,9 @@ Date: Mon Jun 26 00:01:00 2006 +0000 This is the second commit. --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 --- + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 --- 3 files changed, 5 insertions(+), 3 deletions(-) delete mode 100644 file2 @@ -162,9 +162,9 @@ Date: Mon Jun 26 00:00:00 2006 +0000 Initial --- - dir/sub | 2 ++ - file0 | 3 +++ - file2 | 3 +++ + dir/sub | 2 ++ + file0 | 3 +++ + file2 | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 dir/sub create mode 100644 file0 diff --git a/t/t4016-diff-quote.sh b/t/t4016-diff-quote.sh index 3ec71184ba..97b81778cb 100755 --- a/t/t4016-diff-quote.sh +++ b/t/t4016-diff-quote.sh @@ -73,13 +73,13 @@ test_expect_success TABS_IN_FILENAMES 'git diff --numstat -M HEAD' ' test_expect_success TABS_IN_FILENAMES 'git diff --stat -M HEAD' ' cat >expect <<-\EOF && - pathname.1 => "Rpathname\twith HT.0" | 0 - pathname.3 => "Rpathname\nwith LF.0" | 0 - "pathname\twith HT.3" => "Rpathname\nwith LF.1" | 0 - pathname.2 => Rpathname with SP.0 | 0 - "pathname\twith HT.2" => Rpathname with SP.1 | 0 - pathname.0 => Rpathname.0 | 0 - "pathname\twith HT.0" => Rpathname.1 | 0 + pathname.1 => "Rpathname\twith HT.0" | 0 + pathname.3 => "Rpathname\nwith LF.0" | 0 + "pathname\twith HT.3" => "Rpathname\nwith LF.1" | 0 + pathname.2 => Rpathname with SP.0 | 0 + "pathname\twith HT.2" => Rpathname with SP.1 | 0 + pathname.0 => Rpathname.0 | 0 + "pathname\twith HT.0" => Rpathname.1 | 0 7 files changed, 0 insertions(+), 0 deletions(-) EOF git diff --stat -M HEAD >actual && diff --git a/t/t4030-diff-textconv.sh b/t/t4030-diff-textconv.sh index 06b05df848..d4ab4f2ccf 100755 --- a/t/t4030-diff-textconv.sh +++ b/t/t4030-diff-textconv.sh @@ -85,7 +85,7 @@ test_expect_success 'status -v produces text' ' ' cat >expect.stat <<'EOF' - file | Bin 2 -> 4 bytes + file | Bin 2 -> 4 bytes 1 file changed, 0 insertions(+), 0 deletions(-) EOF test_expect_success 'diffstat does not run textconv' ' diff --git a/t/t4041-diff-submodule-option.sh b/t/t4041-diff-submodule-option.sh index bf9a7526bd..6c01d0c056 100755 --- a/t/t4041-diff-submodule-option.sh +++ b/t/t4041-diff-submodule-option.sh @@ -458,4 +458,38 @@ EOF test_cmp expected actual ' +test_expect_success 'diff --submodule with objects referenced by alternates' ' + mkdir sub_alt && + (cd sub_alt && + git init && + echo a >a && + git add a && + git commit -m a + ) && + mkdir super && + (cd super && + git clone -s ../sub_alt sub && + git init && + git add sub && + git commit -m "sub a" + ) && + (cd sub_alt && + sha1_before=$(git rev-parse --short HEAD) + echo b >b && + git add b && + git commit -m b + sha1_after=$(git rev-parse --short HEAD) + echo "Submodule sub $sha1_before..$sha1_after: + > b" >../expected + ) && + (cd super && + (cd sub && + git fetch && + git checkout origin/master + ) && + git diff --submodule > ../actual + ) + test_cmp expected actual +' + test_done diff --git a/t/t4045-diff-relative.sh b/t/t4045-diff-relative.sh index 18fadcf06e..3950f5034d 100755 --- a/t/t4045-diff-relative.sh +++ b/t/t4045-diff-relative.sh @@ -44,7 +44,7 @@ test_expect_success "--numstat $*" " check_stat() { expect=$1; shift cat >expected <<EOF - $expect | 1 + + $expect | 1 + 1 file changed, 1 insertion(+) EOF test_expect_success "--stat $*" " diff --git a/t/t4049-diff-stat-count.sh b/t/t4049-diff-stat-count.sh index 591ffbc075..b41eb61ca8 100755 --- a/t/t4049-diff-stat-count.sh +++ b/t/t4049-diff-stat-count.sh @@ -14,8 +14,8 @@ test_expect_success setup ' echo a >a && echo b >b && cat >expect <<-\EOF - a | 1 + - b | 1 + + a | 1 + + b | 1 + 2 files changed, 2 insertions(+) EOF git diff --stat --stat-count=2 >actual && diff --git a/t/t4052-stat-output.sh b/t/t4052-stat-output.sh index 328aa8f398..b68afefa3c 100755 --- a/t/t4052-stat-output.sh +++ b/t/t4052-stat-output.sh @@ -22,7 +22,7 @@ test_expect_success 'preparation' ' while read cmd args do cat >expect <<-'EOF' - ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1 + + ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1 + EOF test_expect_success "$cmd: small change with long name gives more space to the name" ' git $cmd $args >output && @@ -31,7 +31,7 @@ do ' cat >expect <<-'EOF' - ...aaaaaaaaaaaaaaaaaaaaaaaaaa | 1 + + ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1 + EOF test_expect_success "$cmd --stat=width: a long name is given more room when the bar is short" ' git $cmd $args --stat=40 >output && @@ -46,7 +46,7 @@ do ' cat >expect <<-'EOF' - ...aaaaaaaaaaaaaaaaaaaaaaaaaaa | 1 + + ...aaaaaaaaaaaaaaaaaaaaaaaaaaa | 1 + EOF test_expect_success "$cmd --stat=...,name-width with long name" ' git $cmd $args --stat=60,30 >output && @@ -82,11 +82,15 @@ test_expect_success 'preparation for big change tests' ' cat >expect80 <<'EOF' abcd | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EOF - +cat >expect80-graph <<'EOF' +| abcd | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +EOF cat >expect200 <<'EOF' abcd | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EOF - +cat >expect200-graph <<'EOF' +| abcd | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +EOF while read verb expect cmd args do test_expect_success "$cmd $verb COLUMNS (big change)" ' @@ -94,6 +98,14 @@ do grep " | " output >actual && test_cmp "$expect" actual ' + + test "$cmd" != diff || continue + + test_expect_success "$cmd --graph $verb COLUMNS (big change)" ' + COLUMNS=200 git $cmd $args --graph >output + grep " | " output >actual && + test_cmp "$expect-graph" actual + ' done <<\EOF ignores expect80 format-patch -1 --stdout respects expect200 diff HEAD^ HEAD --stat @@ -104,7 +116,9 @@ EOF cat >expect40 <<'EOF' abcd | 1000 ++++++++++++++++++++++++++ EOF - +cat >expect40-graph <<'EOF' +| abcd | 1000 ++++++++++++++++++++++++ +EOF while read verb expect cmd args do test_expect_success "$cmd $verb not enough COLUMNS (big change)" ' @@ -113,11 +127,41 @@ do test_cmp "$expect" actual ' + test "$cmd" != diff || continue + + test_expect_success "$cmd --graph $verb not enough COLUMNS (big change)" ' + COLUMNS=40 git $cmd $args --graph >output + grep " | " output >actual && + test_cmp "$expect-graph" actual + ' +done <<\EOF +ignores expect80 format-patch -1 --stdout +respects expect40 diff HEAD^ HEAD --stat +respects expect40 show --stat +respects expect40 log -1 --stat +EOF + +cat >expect40 <<'EOF' + abcd | 1000 ++++++++++++++++++++++++++ +EOF +cat >expect40-graph <<'EOF' +| abcd | 1000 ++++++++++++++++++++++++++ +EOF +while read verb expect cmd args +do test_expect_success "$cmd $verb statGraphWidth config" ' git -c diff.statGraphWidth=26 $cmd $args >output grep " | " output >actual && test_cmp "$expect" actual ' + + test "$cmd" != diff || continue + + test_expect_success "$cmd --graph $verb statGraphWidth config" ' + git -c diff.statGraphWidth=26 $cmd $args --graph >output + grep " | " output >actual && + test_cmp "$expect-graph" actual + ' done <<\EOF ignores expect80 format-patch -1 --stdout respects expect40 diff HEAD^ HEAD --stat @@ -129,6 +173,9 @@ EOF cat >expect <<'EOF' abcd | 1000 ++++++++++++++++++++++++++ EOF +cat >expect-graph <<'EOF' +| abcd | 1000 ++++++++++++++++++++++++++ +EOF while read cmd args do test_expect_success "$cmd --stat=width with big change" ' @@ -143,11 +190,25 @@ do test_cmp expect actual ' - test_expect_success "$cmd --stat-graph--width with big change" ' + test_expect_success "$cmd --stat-graph-width with big change" ' git $cmd $args --stat-graph-width=26 >output grep " | " output >actual && test_cmp expect actual ' + + test "$cmd" != diff || continue + + test_expect_success "$cmd --stat-width=width --graph with big change" ' + git $cmd $args --stat-width=40 --graph >output + grep " | " output >actual && + test_cmp expect-graph actual + ' + + test_expect_success "$cmd --stat-graph-width --graph with big change" ' + git $cmd $args --stat-graph-width=26 --graph >output + grep " | " output >actual && + test_cmp expect-graph actual + ' done <<\EOF format-patch -1 --stdout diff HEAD^ HEAD --stat @@ -164,6 +225,9 @@ test_expect_success 'preparation for long filename tests' ' cat >expect <<'EOF' ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 ++++++++++++ EOF +cat >expect-graph <<'EOF' +| ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 ++++++++++++ +EOF while read cmd args do test_expect_success "$cmd --stat=width with big change is more balanced" ' @@ -171,6 +235,14 @@ do grep " | " output >actual && test_cmp expect actual ' + + test "$cmd" != diff || continue + + test_expect_success "$cmd --stat=width --graph with big change is balanced" ' + git $cmd $args --stat-width=60 --graph >output && + grep " | " output >actual && + test_cmp expect-graph actual + ' done <<\EOF format-patch -1 --stdout diff HEAD^ HEAD --stat @@ -181,9 +253,15 @@ EOF cat >expect80 <<'EOF' ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 ++++++++++++++++++++ EOF +cat >expect80-graph <<'EOF' +| ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 ++++++++++++++++++++ +EOF cat >expect200 <<'EOF' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EOF +cat >expect200-graph <<'EOF' +| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa | 1000 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +EOF while read verb expect cmd args do test_expect_success "$cmd $verb COLUMNS (long filename)" ' @@ -191,6 +269,14 @@ do grep " | " output >actual && test_cmp "$expect" actual ' + + test "$cmd" != diff || continue + + test_expect_success "$cmd --graph $verb COLUMNS (long filename)" ' + COLUMNS=200 git $cmd $args --graph >output + grep " | " output >actual && + test_cmp "$expect-graph" actual + ' done <<\EOF ignores expect80 format-patch -1 --stdout respects expect200 diff HEAD^ HEAD --stat @@ -198,6 +284,36 @@ respects expect200 show --stat respects expect200 log -1 --stat EOF +cat >expect1 <<'EOF' + ...aaaaaaa | 1000 ++++++ +EOF +cat >expect1-graph <<'EOF' +| ...aaaaaaa | 1000 ++++++ +EOF +while read verb expect cmd args +do + test_expect_success COLUMNS_CAN_BE_1 \ + "$cmd $verb prefix greater than COLUMNS (big change)" ' + COLUMNS=1 git $cmd $args >output + grep " | " output >actual && + test_cmp "$expect" actual + ' + + test "$cmd" != diff || continue + + test_expect_success COLUMNS_CAN_BE_1 \ + "$cmd --graph $verb prefix greater than COLUMNS (big change)" ' + COLUMNS=1 git $cmd $args --graph >output + grep " | " output >actual && + test_cmp "$expect-graph" actual + ' +done <<\EOF +ignores expect80 format-patch -1 --stdout +respects expect1 diff HEAD^ HEAD --stat +respects expect1 show --stat +respects expect1 log -1 --stat +EOF + cat >expect <<'EOF' abcd | 1000 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EOF diff --git a/t/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh new file mode 100755 index 0000000000..4dc8c67edc --- /dev/null +++ b/t/t4053-diff-no-index.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +test_description='diff --no-index' + +. ./test-lib.sh + +test_expect_success 'setup' ' + mkdir a && + mkdir b && + echo 1 >a/1 && + echo 2 >a/2 +' + +test_expect_success 'git diff --no-index directories' ' + git diff --no-index a b >cnt + test $? = 1 && test_line_count = 14 cnt +' + +test_done diff --git a/t/t4202-log.sh b/t/t4202-log.sh index 32cf0bd218..71be59d446 100755 --- a/t/t4202-log.sh +++ b/t/t4202-log.sh @@ -528,7 +528,7 @@ cat >expect <<\EOF | | | | reach | | --- -| | reach.t | 1 + +| | reach.t | 1 + | | 1 file changed, 1 insertion(+) | | | | diff --git a/reach.t b/reach.t @@ -551,7 +551,7 @@ cat >expect <<\EOF | | | | | | octopus-b | | | --- -| | | octopus-b.t | 1 + +| | | octopus-b.t | 1 + | | | 1 file changed, 1 insertion(+) | | | | | | diff --git a/octopus-b.t b/octopus-b.t @@ -567,7 +567,7 @@ cat >expect <<\EOF | | | | octopus-a | | --- -| | octopus-a.t | 1 + +| | octopus-a.t | 1 + | | 1 file changed, 1 insertion(+) | | | | diff --git a/octopus-a.t b/octopus-a.t @@ -583,7 +583,7 @@ cat >expect <<\EOF | | seventh | --- -| seventh.t | 1 + +| seventh.t | 1 + | 1 file changed, 1 insertion(+) | | diff --git a/seventh.t b/seventh.t @@ -617,7 +617,7 @@ cat >expect <<\EOF | | | | | | | | tangle-a | | | | --- -| | | | tangle-a | 1 + +| | | | tangle-a | 1 + | | | | 1 file changed, 1 insertion(+) | | | | | | | | diff --git a/tangle-a b/tangle-a @@ -639,7 +639,7 @@ cat >expect <<\EOF | |/| | | | | | side-2 | | | | --- -| | | | 2 | 1 + +| | | | 2 | 1 + | | | | 1 file changed, 1 insertion(+) | | | | | | | | diff --git a/2 b/2 @@ -655,7 +655,7 @@ cat >expect <<\EOF | | | | | | | | side-1 | | | | --- -| | | | 1 | 1 + +| | | | 1 | 1 + | | | | 1 file changed, 1 insertion(+) | | | | | | | | diff --git a/1 b/1 @@ -671,7 +671,7 @@ cat >expect <<\EOF | | | | | | | | Second | | | | --- -| | | | one | 1 + +| | | | one | 1 + | | | | 1 file changed, 1 insertion(+) | | | | | | | | diff --git a/one b/one @@ -687,7 +687,7 @@ cat >expect <<\EOF |/| | | | | sixth | | | --- -| | | a/two | 1 - +| | | a/two | 1 - | | | 1 file changed, 1 deletion(-) | | | | | | diff --git a/a/two b/a/two @@ -703,7 +703,7 @@ cat >expect <<\EOF | | | | | | fifth | | | --- -| | | a/two | 1 + +| | | a/two | 1 + | | | 1 file changed, 1 insertion(+) | | | | | | diff --git a/a/two b/a/two @@ -719,7 +719,7 @@ cat >expect <<\EOF | | | | fourth | | --- -| | ein | 1 + +| | ein | 1 + | | 1 file changed, 1 insertion(+) | | | | diff --git a/ein b/ein @@ -735,8 +735,8 @@ cat >expect <<\EOF | | third | --- -| ichi | 1 + -| one | 1 - +| ichi | 1 + +| one | 1 - | 2 files changed, 1 insertion(+), 1 deletion(-) | | diff --git a/ichi b/ichi @@ -759,7 +759,7 @@ cat >expect <<\EOF | | second | --- -| one | 2 +- +| one | 2 +- | 1 file changed, 1 insertion(+), 1 deletion(-) | | diff --git a/one b/one @@ -775,7 +775,7 @@ cat >expect <<\EOF initial --- - one | 1 + + one | 1 + 1 file changed, 1 insertion(+) diff --git a/one b/one diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index 2ae9faa8b3..4afd77815f 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -71,4 +71,32 @@ test_expect_success 'alias loop' ' test_must_fail git log --pretty=test-foo ' +test_expect_success 'NUL separation' ' + printf "add bar\0initial" >expected && + git log -z --pretty="format:%s" >actual && + test_cmp expected actual +' + +test_expect_success 'NUL termination' ' + printf "add bar\0initial\0" >expected && + git log -z --pretty="tformat:%s" >actual && + test_cmp expected actual +' + +test_expect_success 'NUL separation with --stat' ' + stat0_part=$(git diff --stat HEAD^ HEAD) && + stat1_part=$(git diff --stat --root HEAD^) && + printf "add bar\n$stat0_part\n\0initial\n$stat1_part\n" >expected && + git log -z --stat --pretty="format:%s" >actual && + test_cmp expected actual +' + +test_expect_failure 'NUL termination with --stat' ' + stat0_part=$(git diff --stat HEAD^ HEAD) && + stat1_part=$(git diff --stat --root HEAD^) && + printf "add bar\n$stat0_part\n\0initial\n$stat1_part\n\0" >expected && + git log -z --stat --pretty="tformat:%s" >actual && + test_cmp expected actual +' + test_done diff --git a/t/t5000-tar-tree.sh b/t/t5000-tar-tree.sh index 527c9e7548..ecf00edab2 100755 --- a/t/t5000-tar-tree.sh +++ b/t/t5000-tar-tree.sh @@ -31,6 +31,26 @@ GUNZIP=${GUNZIP:-gzip -d} SUBSTFORMAT=%H%n +check_zip() { + zipfile=$1.zip + listfile=$1.lst + dir=$1 + dir_with_prefix=$dir/$2 + + test_expect_success UNZIP " extract ZIP archive" " + (mkdir $dir && cd $dir && $UNZIP ../$zipfile) + " + + test_expect_success UNZIP " validate filenames" " + (cd ${dir_with_prefix}a && find .) | sort >$listfile && + test_cmp a.lst $listfile + " + + test_expect_success UNZIP " validate file contents" " + diff -r a ${dir_with_prefix}a + " +} + test_expect_success \ 'populate workdir' \ 'mkdir a b c && @@ -84,6 +104,12 @@ test_expect_success \ 'git archive vs. git tar-tree' \ 'test_cmp b.tar b2.tar' +test_expect_success 'git archive on large files' ' + test_config core.bigfilethreshold 1 && + git archive HEAD >b3.tar && + test_cmp b.tar b3.tar +' + test_expect_success \ 'git archive in a bare repo' \ '(cd bare.git && git archive HEAD) >b3.tar' @@ -175,10 +201,19 @@ test_expect_success \ test_cmp a/substfile2 g/prefix/a/substfile2 ' +$UNZIP -v >/dev/null 2>&1 +if [ $? -eq 127 ]; then + say "Skipping ZIP tests, because unzip was not found" +else + test_set_prereq UNZIP +fi + test_expect_success \ 'git archive --format=zip' \ 'git archive --format=zip HEAD >d.zip' +check_zip d + test_expect_success \ 'git archive --format=zip in a bare repo' \ '(cd bare.git && git archive --format=zip HEAD) >d1.zip' @@ -201,42 +236,25 @@ test_expect_success 'git archive with --output, override inferred format' ' test_cmp b.tar d4.zip ' -$UNZIP -v >/dev/null 2>&1 -if [ $? -eq 127 ]; then - say "Skipping ZIP tests, because unzip was not found" -else - test_set_prereq UNZIP -fi - -test_expect_success UNZIP \ - 'extract ZIP archive' \ - '(mkdir d && cd d && $UNZIP ../d.zip)' - -test_expect_success UNZIP \ - 'validate filenames' \ - '(cd d/a && find .) | sort >d.lst && - test_cmp a.lst d.lst' - -test_expect_success UNZIP \ - 'validate file contents' \ - 'diff -r a d/a' - test_expect_success \ 'git archive --format=zip with prefix' \ 'git archive --format=zip --prefix=prefix/ HEAD >e.zip' -test_expect_success UNZIP \ - 'extract ZIP archive with prefix' \ - '(mkdir e && cd e && $UNZIP ../e.zip)' +check_zip e prefix/ -test_expect_success UNZIP \ - 'validate filenames with prefix' \ - '(cd e/prefix/a && find .) | sort >e.lst && - test_cmp a.lst e.lst' +test_expect_success 'git archive -0 --format=zip on large files' ' + test_config core.bigfilethreshold 1 && + git archive -0 --format=zip HEAD >large.zip +' -test_expect_success UNZIP \ - 'validate file contents with prefix' \ - 'diff -r a e/prefix/a' +check_zip large + +test_expect_success 'git archive --format=zip on large files' ' + test_config core.bigfilethreshold 1 && + git archive --format=zip HEAD >large-compressed.zip +' + +check_zip large-compressed test_expect_success \ 'git archive --list outside of a git repo' \ diff --git a/t/t5100/patch0001 b/t/t5100/patch0001 index 8ce155167d..02c97746d6 100644 --- a/t/t5100/patch0001 +++ b/t/t5100/patch0001 @@ -1,5 +1,5 @@ --- - foo | 2 +- + foo | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/foo b/foo diff --git a/t/t5100/patch0002 b/t/t5100/patch0002 index 8ce155167d..02c97746d6 100644 --- a/t/t5100/patch0002 +++ b/t/t5100/patch0002 @@ -1,5 +1,5 @@ --- - foo | 2 +- + foo | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/foo b/foo diff --git a/t/t5100/patch0003 b/t/t5100/patch0003 index 8ce155167d..02c97746d6 100644 --- a/t/t5100/patch0003 +++ b/t/t5100/patch0003 @@ -1,5 +1,5 @@ --- - foo | 2 +- + foo | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/foo b/foo diff --git a/t/t5100/patch0005 b/t/t5100/patch0005 index 7d24b24af8..ab7a38373b 100644 --- a/t/t5100/patch0005 +++ b/t/t5100/patch0005 @@ -1,7 +1,7 @@ --- - Documentation/git-cvsimport-script.txt | 9 ++++++++- - git-cvsimport-script | 4 ++-- + Documentation/git-cvsimport-script.txt | 9 ++++++++- + git-cvsimport-script | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) 50452f9c0c2df1f04d83a26266ba704b13861632 diff --git a/t/t5100/patch0006 b/t/t5100/patch0006 index 8ce155167d..02c97746d6 100644 --- a/t/t5100/patch0006 +++ b/t/t5100/patch0006 @@ -1,5 +1,5 @@ --- - foo | 2 +- + foo | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/foo b/foo diff --git a/t/t5100/patch0010 b/t/t5100/patch0010 index f055481d56..436821c97a 100644 --- a/t/t5100/patch0010 +++ b/t/t5100/patch0010 @@ -1,5 +1,5 @@ --- - builtin-mailinfo.c | 2 +- + builtin-mailinfo.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c diff --git a/t/t5100/patch0011 b/t/t5100/patch0011 index 8841d3c139..0988713761 100644 --- a/t/t5100/patch0011 +++ b/t/t5100/patch0011 @@ -1,5 +1,5 @@ --- - builtin-mailinfo.c | 4 ++-- + builtin-mailinfo.c | 4 ++-- diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c index 3e5fe51..aabfe5c 100644 diff --git a/t/t5100/patch0014 b/t/t5100/patch0014 index 124efd234f..3f3825f9f2 100644 --- a/t/t5100/patch0014 +++ b/t/t5100/patch0014 @@ -1,5 +1,5 @@ --- - builtin-mailinfo.c | 37 ++++++++++++++++++++++++++++++++++++- + builtin-mailinfo.c | 37 ++++++++++++++++++++++++++++++++++++- 1 files changed, 36 insertions(+), 1 deletions(-) diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c diff --git a/t/t5100/patch0014--scissors b/t/t5100/patch0014--scissors index 124efd234f..3f3825f9f2 100644 --- a/t/t5100/patch0014--scissors +++ b/t/t5100/patch0014--scissors @@ -1,5 +1,5 @@ --- - builtin-mailinfo.c | 37 ++++++++++++++++++++++++++++++++++++- + builtin-mailinfo.c | 37 ++++++++++++++++++++++++++++++++++++- 1 files changed, 36 insertions(+), 1 deletions(-) diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c diff --git a/t/t5100/sample.mbox b/t/t5100/sample.mbox index de1031241d..34a09a0fc1 100644 --- a/t/t5100/sample.mbox +++ b/t/t5100/sample.mbox @@ -12,7 +12,7 @@ Subject: [PATCH] a commit. Here is a patch from A U Thor. --- - foo | 2 +- + foo | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/foo b/foo @@ -52,7 +52,7 @@ two truly blank and another full of spaces in between. Hope this helps. --- - foo | 2 +- + foo | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/foo b/foo @@ -83,7 +83,7 @@ Message-Id: <nitpicker.12121212@example.net> Hopefully this would fix the problem stated there. --- - foo | 2 +- + foo | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/foo b/foo @@ -249,8 +249,8 @@ actual flags. Signed-off-by: David K=E5gedal <davidk@lysator.liu.se> --- - Documentation/git-cvsimport-script.txt | 9 ++++++++- - git-cvsimport-script | 4 ++-- + Documentation/git-cvsimport-script.txt | 9 ++++++++- + git-cvsimport-script | 4 ++-- 2 files changed, 10 insertions(+), 3 deletions(-) 50452f9c0c2df1f04d83a26266ba704b13861632 @@ -379,7 +379,7 @@ Subject: [PATCH] a commit. Here is a patch from A U Thor. --- - foo | 2 +- + foo | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/foo b/foo @@ -449,7 +449,7 @@ memcmp("Subject: ", header[i], 7) will never match. Signed-off-by: Lukas Sandström <lukass@etek.chalmers.se> Signed-off-by: Junio C Hamano <gitster@pobox.com> --- - builtin-mailinfo.c | 2 +- + builtin-mailinfo.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c @@ -482,7 +482,7 @@ Content-Transfer-Encoding: quoted-printable Here comes a commit log message, and its second line is here. --- - builtin-mailinfo.c | 4 ++-- + builtin-mailinfo.c | 4 ++-- diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c index 3e5fe51..aabfe5c 100644 @@ -587,7 +587,7 @@ everything before it in the message body. Signed-off-by: Junio C Hamano <gitster@pobox.com> --- - builtin-mailinfo.c | 37 ++++++++++++++++++++++++++++++++++++- + builtin-mailinfo.c | 37 ++++++++++++++++++++++++++++++++++++- 1 files changed, 36 insertions(+), 1 deletions(-) diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c diff --git a/t/t5528-push-default.sh b/t/t5528-push-default.sh index c334c51a07..4736da8f36 100755 --- a/t/t5528-push-default.sh +++ b/t/t5528-push-default.sh @@ -13,16 +13,36 @@ test_expect_success 'setup bare remotes' ' git push parent2 HEAD ' +# $1 = local revision +# $2 = remote revision (tested to be equal to the local one) +check_pushed_commit () { + git log -1 --format='%h %s' "$1" >expect && + git --git-dir=repo1 log -1 --format='%h %s' "$2" >actual && + test_cmp expect actual +} + +# $1 = push.default value +# $2 = expected target branch for the push +test_push_success () { + git -c push.default="$1" push && + check_pushed_commit HEAD "$2" +} + +# $1 = push.default value +# check that push fails and does not modify any remote branch +test_push_failure () { + git --git-dir=repo1 log --no-walk --format='%h %s' --all >expect && + test_must_fail git -c push.default="$1" push && + git --git-dir=repo1 log --no-walk --format='%h %s' --all >actual && + test_cmp expect actual +} + test_expect_success '"upstream" pushes to configured upstream' ' git checkout master && test_config branch.master.remote parent1 && test_config branch.master.merge refs/heads/foo && - test_config push.default upstream && test_commit two && - git push && - echo two >expect && - git --git-dir=repo1 log -1 --format=%s foo >actual && - test_cmp expect actual + test_push_success upstream foo ' test_expect_success '"upstream" does not push on unconfigured remote' ' @@ -30,7 +50,7 @@ test_expect_success '"upstream" does not push on unconfigured remote' ' test_unconfig branch.master.remote && test_config push.default upstream && test_commit three && - test_must_fail git push + test_push_failure upstream ' test_expect_success '"upstream" does not push on unconfigured branch' ' @@ -39,7 +59,7 @@ test_expect_success '"upstream" does not push on unconfigured branch' ' test_unconfig branch.master.merge && test_config push.default upstream test_commit four && - test_must_fail git push + test_push_failure upstream ' test_expect_success '"upstream" does not push when remotes do not match' ' @@ -51,4 +71,48 @@ test_expect_success '"upstream" does not push when remotes do not match' ' test_must_fail git push parent2 ' +test_expect_success 'push from/to new branch with upstream, matching and simple' ' + git checkout -b new-branch && + test_push_failure simple && + test_push_failure matching && + test_push_failure upstream +' + +test_expect_success 'push from/to new branch with current creates remote branch' ' + test_config branch.new-branch.remote repo1 && + git checkout new-branch && + test_push_success current new-branch +' + +test_expect_success 'push to existing branch, with no upstream configured' ' + test_config branch.master.remote repo1 && + git checkout master && + test_push_failure simple && + test_push_failure upstream +' + +test_expect_success 'push to existing branch, upstream configured with same name' ' + test_config branch.master.remote repo1 && + test_config branch.master.merge refs/heads/master && + git checkout master && + test_commit six && + test_push_success upstream master && + test_commit seven && + test_push_success simple master +' + +test_expect_success 'push to existing branch, upstream configured with different name' ' + test_config branch.master.remote repo1 && + test_config branch.master.merge refs/heads/other-name && + git checkout master && + test_commit eight && + test_push_success upstream other-name && + test_commit nine && + test_push_failure simple && + git --git-dir=repo1 log -1 --format="%h %s" "other-name" >expect-other-name && + test_push_success current master && + git --git-dir=repo1 log -1 --format="%h %s" "other-name" >actual-other-name && + test_cmp expect-other-name actual-other-name +' + test_done diff --git a/t/t5541-http-push.sh b/t/t5541-http-push.sh index 5b170be2c0..312e484090 100755 --- a/t/t5541-http-push.sh +++ b/t/t5541-http-push.sh @@ -216,13 +216,36 @@ test_expect_success 'push --mirror to repo with alternates' ' git push --mirror "$HTTPD_URL"/smart/alternates-mirror.git ' -test_expect_success TTY 'quiet push' ' +test_expect_success TTY 'push shows progress when stderr is a tty' ' + cd "$ROOT_PATH"/test_repo_clone && + test_commit noisy && + test_terminal git push >output 2>&1 && + grep "^Writing objects" output +' + +test_expect_success TTY 'push --quiet silences status and progress' ' cd "$ROOT_PATH"/test_repo_clone && test_commit quiet && - test_terminal git push --quiet --no-progress 2>&1 | tee output && + test_terminal git push --quiet >output 2>&1 && test_cmp /dev/null output ' +test_expect_success TTY 'push --no-progress silences progress but not status' ' + cd "$ROOT_PATH"/test_repo_clone && + test_commit no-progress && + test_terminal git push --no-progress >output 2>&1 && + grep "^To http" output && + ! grep "^Writing objects" +' + +test_expect_success 'push --progress shows progress to non-tty' ' + cd "$ROOT_PATH"/test_repo_clone && + test_commit progress && + git push --progress >output 2>&1 && + grep "^To http" output && + grep "^Writing objects" output +' + test_expect_success 'http push gives sane defaults to reflog' ' cd "$ROOT_PATH"/test_repo_clone && test_commit reflog-test && diff --git a/t/t5570-git-daemon.sh b/t/t5570-git-daemon.sh index 7cbc9994a3..a3a4e47e1d 100755 --- a/t/t5570-git-daemon.sh +++ b/t/t5570-git-daemon.sh @@ -103,14 +103,12 @@ test_remote_error() esac done - if test $# -ne 3 - then - error "invalid number of arguments" - fi - + msg=$1 + shift cmd=$1 - repo=$2 - msg=$3 + shift + repo=$1 + shift || error "invalid number of arguments" if test -x "$GIT_DAEMON_DOCUMENT_ROOT_PATH/$repo" then @@ -122,7 +120,7 @@ test_remote_error() fi fi - test_must_fail git "$cmd" "$GIT_DAEMON_URL/$repo" 2>output && + test_must_fail git "$cmd" "$GIT_DAEMON_URL/$repo" "$@" 2>output && echo "fatal: remote error: $msg: /$repo" >expect && test_cmp expect output ret=$? @@ -131,18 +129,18 @@ test_remote_error() } msg="access denied or repository not exported" -test_expect_success 'clone non-existent' "test_remote_error clone nowhere.git '$msg'" -test_expect_success 'push disabled' "test_remote_error push repo.git '$msg'" -test_expect_success 'read access denied' "test_remote_error -x fetch repo.git '$msg'" -test_expect_success 'not exported' "test_remote_error -n fetch repo.git '$msg'" +test_expect_success 'clone non-existent' "test_remote_error '$msg' clone nowhere.git " +test_expect_success 'push disabled' "test_remote_error '$msg' push repo.git master" +test_expect_success 'read access denied' "test_remote_error -x '$msg' fetch repo.git " +test_expect_success 'not exported' "test_remote_error -n '$msg' fetch repo.git " stop_git_daemon start_git_daemon --informative-errors -test_expect_success 'clone non-existent' "test_remote_error clone nowhere.git 'no such repository'" -test_expect_success 'push disabled' "test_remote_error push repo.git 'service not enabled'" -test_expect_success 'read access denied' "test_remote_error -x fetch repo.git 'no such repository'" -test_expect_success 'not exported' "test_remote_error -n fetch repo.git 'repository not exported'" +test_expect_success 'clone non-existent' "test_remote_error 'no such repository' clone nowhere.git " +test_expect_success 'push disabled' "test_remote_error 'service not enabled' push repo.git master" +test_expect_success 'read access denied' "test_remote_error -x 'no such repository' fetch repo.git " +test_expect_success 'not exported' "test_remote_error -n 'repository not exported' fetch repo.git " stop_git_daemon test_done diff --git a/t/t5701-clone-local.sh b/t/t5701-clone-local.sh index 6972258b27..c6feca44e3 100755 --- a/t/t5701-clone-local.sh +++ b/t/t5701-clone-local.sh @@ -3,7 +3,10 @@ test_description='test local clone' . ./test-lib.sh -D=`pwd` +repo_is_hardlinked() { + find "$1/objects" -type f -links 1 >output && + test_line_count = 0 output +} test_expect_success 'preparing origin repository' ' : >file && git add . && git commit -m1 && @@ -19,105 +22,72 @@ test_expect_success 'preparing origin repository' ' ' test_expect_success 'local clone without .git suffix' ' - cd "$D" && git clone -l -s a b && - cd b && + (cd b && test "$(GIT_CONFIG=.git/config git config --bool core.bare)" = false && - git fetch + git fetch) ' test_expect_success 'local clone with .git suffix' ' - cd "$D" && git clone -l -s a.git c && - cd c && - git fetch + (cd c && git fetch) ' test_expect_success 'local clone from x' ' - cd "$D" && git clone -l -s x y && - cd y && - git fetch + (cd y && git fetch) ' test_expect_success 'local clone from x.git that does not exist' ' - cd "$D" && - if git clone -l -s x.git z - then - echo "Oops, should have failed" - false - else - echo happy - fi + test_must_fail git clone -l -s x.git z ' test_expect_success 'With -no-hardlinks, local will make a copy' ' - cd "$D" && git clone --bare --no-hardlinks x w && - cd w && - linked=$(find objects -type f ! -links 1 | wc -l) && - test 0 = $linked + ! repo_is_hardlinked w ' test_expect_success 'Even without -l, local will make a hardlink' ' - cd "$D" && rm -fr w && git clone -l --bare x w && - cd w && - copied=$(find objects -type f -links 1 | wc -l) && - test 0 = $copied + repo_is_hardlinked w ' test_expect_success 'local clone of repo with nonexistent ref in HEAD' ' - cd "$D" && echo "ref: refs/heads/nonexistent" > a.git/HEAD && git clone a d && - cd d && + (cd d && git fetch && - test ! -e .git/refs/remotes/origin/HEAD' + test ! -e .git/refs/remotes/origin/HEAD) +' test_expect_success 'bundle clone without .bundle suffix' ' - cd "$D" && git clone dir/b3 && - cd b3 && - git fetch + (cd b3 && git fetch) ' test_expect_success 'bundle clone with .bundle suffix' ' - cd "$D" && git clone b1.bundle && - cd b1 && - git fetch + (cd b1 && git fetch) ' test_expect_success 'bundle clone from b4' ' - cd "$D" && git clone b4 bdl && - cd bdl && - git fetch + (cd bdl && git fetch) ' test_expect_success 'bundle clone from b4.bundle that does not exist' ' - cd "$D" && - if git clone b4.bundle bb - then - echo "Oops, should have failed" - false - else - echo happy - fi + test_must_fail git clone b4.bundle bb ' test_expect_success 'bundle clone with nonexistent HEAD' ' - cd "$D" && git clone b2.bundle b2 && - cd b2 && + (cd b2 && git fetch && - test ! -e .git/refs/heads/master + test_must_fail git rev-parse --verify refs/heads/master) ' test_expect_success 'clone empty repository' ' - cd "$D" && mkdir empty && (cd empty && git init && @@ -135,7 +105,6 @@ test_expect_success 'clone empty repository' ' ' test_expect_success 'clone empty repository, and then push should not segfault.' ' - cd "$D" && rm -fr empty/ empty-clone/ && mkdir empty && (cd empty && git init) && @@ -145,13 +114,11 @@ test_expect_success 'clone empty repository, and then push should not segfault.' ' test_expect_success 'cloning non-existent directory fails' ' - cd "$D" && rm -rf does-not-exist && test_must_fail git clone does-not-exist ' test_expect_success 'cloning non-git directory fails' ' - cd "$D" && rm -rf not-a-git-repo not-a-git-repo-clone && mkdir not-a-git-repo && test_must_fail git clone not-a-git-repo not-a-git-repo-clone diff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh index a01d244502..f94f0c48e6 100755 --- a/t/t6006-rev-list-format.sh +++ b/t/t6006-rev-list-format.sh @@ -283,4 +283,11 @@ test_expect_success 'oneline with empty message' ' test_line_count = 5 testg.txt ' +test_expect_success 'single-character name is parsed correctly' ' + git commit --author="a <a@example.com>" --allow-empty -m foo && + echo "a <a@example.com>" >expect && + git log -1 --format="%an <%ae>" >actual && + test_cmp expect actual +' + test_done diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh index f8c247a750..5189446534 100755 --- a/t/t7004-tag.sh +++ b/t/t7004-tag.sh @@ -263,6 +263,50 @@ test_expect_success 'tag -l can accept multiple patterns' ' test_cmp expect actual ' +test_expect_success 'listing tags in column' ' + COLUMNS=40 git tag -l --column=row >actual && + cat >expected <<\EOF && +a1 aa1 cba t210 t211 +v0.2.1 v1.0 v1.0.1 v1.1.3 +EOF + test_cmp expected actual +' + +test_expect_success 'listing tags in column with column.*' ' + git config column.tag row && + git config column.ui dense && + COLUMNS=40 git tag -l >actual && + git config --unset column.ui && + git config --unset column.tag && + cat >expected <<\EOF && +a1 aa1 cba t210 t211 +v0.2.1 v1.0 v1.0.1 v1.1.3 +EOF + test_cmp expected actual +' + +test_expect_success 'listing tag with -n --column should fail' ' + test_must_fail git tag --column -n +' + +test_expect_success 'listing tags -n in column with column.ui ignored' ' + git config column.ui "row dense" && + COLUMNS=40 git tag -l -n >actual && + git config --unset column.ui && + cat >expected <<\EOF && +a1 Foo +aa1 Foo +cba Foo +t210 Foo +t211 Foo +v0.2.1 Foo +v1.0 Foo +v1.0.1 Foo +v1.1.3 Foo +EOF + test_cmp expected actual +' + # creating and verifying lightweight tags: test_expect_success \ diff --git a/t/t7408-submodule-reference.sh b/t/t7408-submodule-reference.sh index a45fadc58e..b770b2f04d 100755 --- a/t/t7408-submodule-reference.sh +++ b/t/t7408-submodule-reference.sh @@ -28,7 +28,7 @@ git prune' cd "$base_dir" -test_expect_success 'preparing supermodule' \ +test_expect_success 'preparing superproject' \ 'test_create_repo super && cd super && echo file > file && git add file && @@ -55,7 +55,7 @@ diff expected current' cd "$base_dir" -test_expect_success 'cloning supermodule' \ +test_expect_success 'cloning superproject' \ 'git clone super super-clone' cd "$base_dir" diff --git a/t/t7508-status.sh b/t/t7508-status.sh index fc57b135c5..28e184829c 100755 --- a/t/t7508-status.sh +++ b/t/t7508-status.sh @@ -59,6 +59,30 @@ test_expect_success 'status (1)' ' test_i18ngrep "use \"git rm --cached <file>\.\.\.\" to unstage" output ' +test_expect_success 'status --column' ' + COLUMNS=50 git status --column="column dense" >output && + cat >expect <<\EOF && +# On branch master +# Changes to be committed: +# (use "git reset HEAD <file>..." to unstage) +# +# new file: dir2/added +# +# Changes not staged for commit: +# (use "git add <file>..." to update what will be committed) +# (use "git checkout -- <file>..." to discard changes in working directory) +# +# modified: dir1/modified +# +# Untracked files: +# (use "git add <file>..." to include in what will be committed) +# +# dir1/untracked dir2/untracked untracked +# dir2/modified output +EOF + test_cmp expect output +' + cat >expect <<\EOF # On branch master # Changes to be committed: @@ -271,6 +295,15 @@ test_expect_success 'status -s -b' ' ' +test_expect_success 'status -s -z -b' ' + tr "\\n" Q <expect >expect.q && + mv expect.q expect && + git status -s -z -b >output && + nul_to_q <output >output.q && + mv output.q output && + test_cmp expect output +' + test_expect_success 'setup dir3' ' mkdir dir3 && : >dir3/untracked1 && @@ -647,9 +680,14 @@ test_expect_success 'status --porcelain ignores color.status' ' git config --unset color.status git config --unset color.ui -test_expect_success 'status --porcelain ignores -b' ' +test_expect_success 'status --porcelain respects -b' ' git status --porcelain -b >output && + { + echo "## master" && + cat expect + } >tmp && + mv tmp expect && test_cmp expect output ' diff --git a/t/t7602-merge-octopus-many.sh b/t/t7602-merge-octopus-many.sh index 3b72c097ee..955f09f8e8 100755 --- a/t/t7602-merge-octopus-many.sh +++ b/t/t7602-merge-octopus-many.sh @@ -54,9 +54,9 @@ Trying simple merge with c2 Trying simple merge with c3 Trying simple merge with c4 Merge made by the 'octopus' strategy. - c2.c | 1 + - c3.c | 1 + - c4.c | 1 + + c2.c | 1 + + c3.c | 1 + + c4.c | 1 + 3 files changed, 3 insertions(+) create mode 100644 c2.c create mode 100644 c3.c @@ -71,7 +71,7 @@ test_expect_success 'merge output uses pretty names' ' cat >expected <<\EOF Merge made by the 'recursive' strategy. - c5.c | 1 + + c5.c | 1 + 1 file changed, 1 insertion(+) create mode 100644 c5.c EOF @@ -85,8 +85,8 @@ cat >expected <<\EOF Fast-forwarding to: c1 Trying simple merge with c2 Merge made by the 'octopus' strategy. - c1.c | 1 + - c2.c | 1 + + c1.c | 1 + + c2.c | 1 + 2 files changed, 2 insertions(+) create mode 100644 c1.c create mode 100644 c2.c diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh index 2763d795f0..9c3e997b9d 100755 --- a/t/t7800-difftool.sh +++ b/t/t7800-difftool.sh @@ -105,6 +105,19 @@ test_expect_success PERL 'difftool honors --gui' ' restore_test_defaults ' +test_expect_success PERL 'difftool --gui last setting wins' ' + git config diff.guitool bogus-tool && + git difftool --no-prompt --gui --no-gui && + + git config merge.tool bogus-tool && + git config diff.tool bogus-tool && + git config diff.guitool test-tool && + diff=$(git difftool --no-prompt --no-gui --gui branch) && + test "$diff" = "branch" && + + restore_test_defaults +' + test_expect_success PERL 'difftool --gui works without configured diff.guitool' ' git config diff.tool test-tool && @@ -317,4 +330,48 @@ test_expect_success PERL 'say no to the second file' ' echo "$diff" | stdin_doesnot_contain br2 ' +test_expect_success PERL 'difftool --tool-help' ' + tool_help=$(git difftool --tool-help) && + echo "$tool_help" | stdin_contains tool +' + +test_expect_success PERL 'setup change in subdirectory' ' + git checkout master && + mkdir sub && + echo master >sub/sub && + git add sub/sub && + git commit -m "added sub/sub" && + echo test >>file && + echo test >>sub/sub && + git add . && + git commit -m "modified both" +' + +test_expect_success PERL 'difftool -d' ' + diff=$(git difftool -d --extcmd ls branch) && + echo "$diff" | stdin_contains sub && + echo "$diff" | stdin_contains file +' + +test_expect_success PERL 'difftool --dir-diff' ' + diff=$(git difftool --dir-diff --extcmd ls branch) && + echo "$diff" | stdin_contains sub && + echo "$diff" | stdin_contains file +' + +test_expect_success PERL 'difftool --dir-diff ignores --prompt' ' + diff=$(git difftool --dir-diff --prompt --extcmd ls branch) && + echo "$diff" | stdin_contains sub && + echo "$diff" | stdin_contains file +' + +test_expect_success PERL 'difftool --dir-diff from subdirectory' ' + ( + cd sub && + diff=$(git difftool --dir-diff --extcmd ls branch) && + echo "$diff" | stdin_contains sub && + echo "$diff" | stdin_contains file + ) +' + test_done diff --git a/t/t7810-grep.sh b/t/t7810-grep.sh index d9ad633310..24e9b1974d 100755 --- a/t/t7810-grep.sh +++ b/t/t7810-grep.sh @@ -351,6 +351,11 @@ test_expect_success 'grep -f, multiple patterns' ' test_cmp expected actual ' +test_expect_success 'grep, multiple patterns' ' + git grep "$(cat patterns)" >actual && + test_cmp expected actual +' + cat >expected <<EOF file:foo mmap bar file:foo_mmap bar diff --git a/t/t9002-column.sh b/t/t9002-column.sh new file mode 100755 index 0000000000..89983527b6 --- /dev/null +++ b/t/t9002-column.sh @@ -0,0 +1,180 @@ +#!/bin/sh + +test_description='git column' +. ./test-lib.sh + +test_expect_success 'setup' ' + cat >lista <<\EOF +one +two +three +four +five +six +seven +eight +nine +ten +eleven +EOF +' + +test_expect_success 'never' ' + git column --indent=Z --mode=never <lista >actual && + test_cmp lista actual +' + +test_expect_success 'always' ' + cat >expected <<\EOF && +Zone +Ztwo +Zthree +Zfour +Zfive +Zsix +Zseven +Zeight +Znine +Zten +Zeleven +EOF + git column --indent=Z --mode=plain <lista >actual && + test_cmp expected actual +' + +test_expect_success '80 columns' ' + cat >expected <<\EOF && +one two three four five six seven eight nine ten eleven +EOF + COLUMNS=80 git column --mode=column <lista >actual && + test_cmp expected actual +' + +cat >expected <<\EOF +one +two +three +four +five +six +seven +eight +nine +ten +eleven +EOF + +test_expect_success COLUMNS_CAN_BE_1 'COLUMNS = 1' ' + COLUMNS=1 git column --mode=column <lista >actual && + test_cmp expected actual +' + +test_expect_success 'width = 1' ' + git column --mode=column --width=1 <lista >actual && + test_cmp expected actual +' + +COLUMNS=20 +export COLUMNS + +test_expect_success '20 columns' ' + cat >expected <<\EOF && +one seven +two eight +three nine +four ten +five eleven +six +EOF + git column --mode=column <lista >actual && + test_cmp expected actual +' + +test_expect_success '20 columns, nodense' ' + cat >expected <<\EOF && +one seven +two eight +three nine +four ten +five eleven +six +EOF + git column --mode=column,nodense < lista > actual && + test_cmp expected actual +' + +test_expect_success '20 columns, dense' ' + cat >expected <<\EOF && +one five nine +two six ten +three seven eleven +four eight +EOF + git column --mode=column,dense < lista > actual && + test_cmp expected actual +' + +test_expect_success '20 columns, padding 2' ' + cat >expected <<\EOF && +one seven +two eight +three nine +four ten +five eleven +six +EOF + git column --mode=column --padding 2 <lista >actual && + test_cmp expected actual +' + +test_expect_success '20 columns, indented' ' + cat >expected <<\EOF && + one seven + two eight + three nine + four ten + five eleven + six +EOF + git column --mode=column --indent=" " <lista >actual && + test_cmp expected actual +' + +test_expect_success '20 columns, row first' ' + cat >expected <<\EOF && +one two +three four +five six +seven eight +nine ten +eleven +EOF + git column --mode=row <lista >actual && + test_cmp expected actual +' + +test_expect_success '20 columns, row first, nodense' ' + cat >expected <<\EOF && +one two +three four +five six +seven eight +nine ten +eleven +EOF + git column --mode=row,nodense <lista >actual && + test_cmp expected actual +' + +test_expect_success '20 columns, row first, dense' ' + cat >expected <<\EOF && +one two three +four five six +seven eight nine +ten eleven +EOF + git column --mode=row,dense <lista >actual && + test_cmp expected actual +' + +test_done diff --git a/t/t9300-fast-import.sh b/t/t9300-fast-import.sh index 7da0e8da7b..2aa1824a94 100755 --- a/t/t9300-fast-import.sh +++ b/t/t9300-fast-import.sh @@ -1657,7 +1657,7 @@ M 160000 :6 sub INPUT_END test_expect_success \ - 'P: supermodule & submodule mix' \ + 'P: superproject & submodule mix' \ 'git fast-import <input && git checkout subuse1 && rm -rf sub && mkdir sub && (cd sub && diff --git a/t/t9800-git-p4-basic.sh b/t/t9800-git-p4-basic.sh index b2f08697ad..0f410c45f7 100755 --- a/t/t9800-git-p4-basic.sh +++ b/t/t9800-git-p4-basic.sh @@ -163,6 +163,112 @@ test_expect_success 'wildcard files git p4 clone' ' ) ' +test_expect_success 'wildcard files submit back to p4, add' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + echo git-wild-hash >git-wild#hash && + echo git-wild-star >git-wild\*star && + echo git-wild-at >git-wild@at && + echo git-wild-percent >git-wild%percent && + git add git-wild* && + git commit -m "add some wildcard filenames" && + git config git-p4.skipSubmitEdit true && + git p4 submit + ) && + ( + cd "$cli" && + test_path_is_file git-wild#hash && + test_path_is_file git-wild\*star && + test_path_is_file git-wild@at && + test_path_is_file git-wild%percent + ) +' + +test_expect_success 'wildcard files submit back to p4, modify' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + echo new-line >>git-wild#hash && + echo new-line >>git-wild\*star && + echo new-line >>git-wild@at && + echo new-line >>git-wild%percent && + git add git-wild* && + git commit -m "modify the wildcard files" && + git config git-p4.skipSubmitEdit true && + git p4 submit + ) && + ( + cd "$cli" && + test_line_count = 2 git-wild#hash && + test_line_count = 2 git-wild\*star && + test_line_count = 2 git-wild@at && + test_line_count = 2 git-wild%percent + ) +' + +test_expect_success 'wildcard files submit back to p4, copy' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + cp file2 git-wild-cp#hash && + git add git-wild-cp#hash && + cp git-wild\*star file-wild-3 && + git add file-wild-3 && + git commit -m "wildcard copies" && + git config git-p4.detectCopies true && + git config git-p4.detectCopiesHarder true && + git config git-p4.skipSubmitEdit true && + git p4 submit + ) && + ( + cd "$cli" && + test_path_is_file git-wild-cp#hash && + test_path_is_file file-wild-3 + ) +' + +test_expect_success 'wildcard files submit back to p4, rename' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git mv git-wild@at file-wild-4 && + git mv file-wild-3 git-wild-cp%percent && + git commit -m "wildcard renames" && + git config git-p4.detectRenames true && + git config git-p4.skipSubmitEdit true && + git p4 submit + ) && + ( + cd "$cli" && + test_path_is_missing git-wild@at && + test_path_is_file git-wild-cp%percent + ) +' + +test_expect_success 'wildcard files submit back to p4, delete' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git rm git-wild* && + git commit -m "delete the wildcard files" && + git config git-p4.skipSubmitEdit true && + git p4 submit + ) && + ( + cd "$cli" && + test_path_is_missing git-wild#hash && + test_path_is_missing git-wild\*star && + test_path_is_missing git-wild@at && + test_path_is_missing git-wild%percent + ) +' + test_expect_success 'clone bare' ' git p4 clone --dest="$git" --bare //depot && test_when_finished cleanup_git && diff --git a/t/t9801-git-p4-branch.sh b/t/t9801-git-p4-branch.sh index 2859256de3..99fe16b72d 100755 --- a/t/t9801-git-p4-branch.sh +++ b/t/t9801-git-p4-branch.sh @@ -218,7 +218,7 @@ test_expect_success 'git p4 clone simple branches' ' cd branch1 && p4 edit file2 && echo file2_ >>file2 && - p4 submit -d "update file2 in branch3" && + p4 submit -d "update file2 in branch1" && cd "$git" && git reset --hard p4/depot/branch1 && git p4 rebase && @@ -249,8 +249,6 @@ test_expect_success 'git p4 clone simple branches' ' # `- file2 # `- file3 test_expect_success 'git p4 add complex branches' ' - test_when_finished cleanup_git && - test_create_repo "$git" && ( cd "$cli" && changelist=$(p4 changes -m1 //depot/... | cut -d" " -f2) && @@ -306,6 +304,112 @@ test_expect_success 'git p4 clone complex branches' ' ) ' +# Move branch3/file3 to branch4/file3 in a single changelist +test_expect_success 'git p4 submit to two branches in a single changelist' ' + ( + cd "$cli" && + p4 integrate //depot/branch3/file3 //depot/branch4/file3 && + p4 delete //depot/branch3/file3 && + p4 submit -d "Move branch3/file3 to branch4/file3" + ) +' + +# Confirm that changes to two branches done in a single changelist +# are correctly imported by git p4 +test_expect_success 'git p4 sync changes to two branches in the same changelist' ' + test_when_finished cleanup_git && + test_create_repo "$git" && + ( + cd "$git" && + git config git-p4.branchList branch1:branch2 && + git config --add git-p4.branchList branch1:branch3 && + git config --add git-p4.branchList branch1:branch4 && + git config --add git-p4.branchList branch1:branch5 && + git p4 clone --dest=. --detect-branches //depot@all && + git log --all --graph --decorate --stat && + git reset --hard p4/depot/branch1 && + test_path_is_file file1 && + test_path_is_file file2 && + test_path_is_file file3 && + grep update file2 && + git reset --hard p4/depot/branch2 && + test_path_is_file file1 && + test_path_is_file file2 && + test_path_is_missing file3 && + ! grep update file2 && + git reset --hard p4/depot/branch3 && + test_path_is_file file1 && + test_path_is_file file2 && + test_path_is_missing file3 && + grep update file2 && + git reset --hard p4/depot/branch4 && + test_path_is_file file1 && + test_path_is_file file2 && + test_path_is_file file3 && + ! grep update file2 && + git reset --hard p4/depot/branch5 && + test_path_is_file file1 && + test_path_is_file file2 && + test_path_is_file file3 && + ! grep update file2 && + test_path_is_missing .git/git-p4-tmp + ) +' + +# Create a branch by integrating a single file +test_expect_success 'git p4 file subset branch' ' + ( + cd "$cli" && + p4 integrate //depot/branch1/file1 //depot/branch6/file1 && + p4 submit -d "Integrate file1 alone from branch1 to branch6" + ) +' + +# Check if git p4 creates a new branch containing a single file, +# instead of keeping the old files from the original branch +test_expect_failure 'git p4 clone file subset branch' ' + test_when_finished cleanup_git && + test_create_repo "$git" && + ( + cd "$git" && + git config git-p4.branchList branch1:branch2 && + git config --add git-p4.branchList branch1:branch3 && + git config --add git-p4.branchList branch1:branch4 && + git config --add git-p4.branchList branch1:branch5 && + git config --add git-p4.branchList branch1:branch6 && + git p4 clone --dest=. --detect-branches //depot@all && + git log --all --graph --decorate --stat && + git reset --hard p4/depot/branch1 && + test_path_is_file file1 && + test_path_is_file file2 && + test_path_is_file file3 && + grep update file2 && + git reset --hard p4/depot/branch2 && + test_path_is_file file1 && + test_path_is_file file2 && + test_path_is_missing file3 && + ! grep update file2 && + git reset --hard p4/depot/branch3 && + test_path_is_file file1 && + test_path_is_file file2 && + test_path_is_missing file3 && + grep update file2 && + git reset --hard p4/depot/branch4 && + test_path_is_file file1 && + test_path_is_file file2 && + test_path_is_file file3 && + ! grep update file2 && + git reset --hard p4/depot/branch5 && + test_path_is_file file1 && + test_path_is_file file2 && + test_path_is_file file3 && + ! grep update file2 && + git reset --hard p4/depot/branch6 && + test_path_is_file file1 && + test_path_is_missing file2 && + test_path_is_missing file3 + ) +' test_expect_success 'kill p4d' ' kill_p4d ' diff --git a/t/t9807-git-p4-submit.sh b/t/t9807-git-p4-submit.sh index 15417165e8..f23b4c3620 100755 --- a/t/t9807-git-p4-submit.sh +++ b/t/t9807-git-p4-submit.sh @@ -28,6 +28,11 @@ test_expect_success 'submit with no client dir' ' rm -rf "$cli" && git config git-p4.skipSubmitEdit true && git p4 submit + ) && + ( + cd "$cli" && + test_path_is_file file1 && + test_path_is_file file2 ) ' @@ -44,7 +49,6 @@ test_expect_success 'submit --origin' ' ) && ( cd "$cli" && - p4 sync && test_path_is_missing "file3.t" && test_path_is_file "file4.t" ) @@ -79,12 +83,105 @@ test_expect_success 'submit with master branch name from argv' ' ) && ( cd "$cli" && - p4 sync && test_path_is_file "file6.t" && test_path_is_missing "file7.t" ) ' +# +# Basic submit tests, the five handled cases +# + +test_expect_success 'submit modify' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + echo line >>file1 && + git add file1 && + git commit -m file1 && + git p4 submit + ) && + ( + cd "$cli" && + test_path_is_file file1 && + test_line_count = 2 file1 + ) +' + +test_expect_success 'submit add' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + echo file13 >file13 && + git add file13 && + git commit -m file13 && + git p4 submit + ) && + ( + cd "$cli" && + test_path_is_file file13 + ) +' + +test_expect_success 'submit delete' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + git rm file4.t && + git commit -m "delete file4.t" && + git p4 submit + ) && + ( + cd "$cli" && + test_path_is_missing file4.t + ) +' + +test_expect_success 'submit copy' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + git config git-p4.detectCopies true && + git config git-p4.detectCopiesHarder true && + cp file5.t file5.ta && + git add file5.ta && + git commit -m "copy to file5.ta" && + git p4 submit + ) && + ( + cd "$cli" && + test_path_is_file file5.ta && + test ! -w file5.ta + ) +' + +test_expect_success 'submit rename' ' + test_when_finished cleanup_git && + git p4 clone --dest="$git" //depot && + ( + cd "$git" && + git config git-p4.skipSubmitEdit true && + git config git-p4.detectRenames true && + git mv file6.t file6.ta && + git commit -m "rename file6.t to file6.ta" && + git p4 submit + ) && + ( + cd "$cli" && + test_path_is_missing file6.t && + test_path_is_file file6.ta && + test ! -w file6.ta + ) +' + test_expect_success 'kill p4d' ' kill_p4d ' diff --git a/t/t9809-git-p4-client-view.sh b/t/t9809-git-p4-client-view.sh index 796b02c7f3..7d993ef80a 100755 --- a/t/t9809-git-p4-client-view.sh +++ b/t/t9809-git-p4-client-view.sh @@ -349,7 +349,8 @@ test_expect_success 'subdir clone, submit copy' ' ) && ( cd "$cli" && - test_path_is_file dir1/file11a + test_path_is_file dir1/file11a && + test ! -w dir1/file11a ) ' @@ -368,14 +369,47 @@ test_expect_success 'subdir clone, submit rename' ' ( cd "$cli" && test_path_is_missing dir1/file13 && - test_path_is_file dir1/file13a + test_path_is_file dir1/file13a && + test ! -w dir1/file13a + ) +' + +# see t9800 for the non-client-spec case, and the rest of the wildcard tests +test_expect_success 'wildcard files submit back to p4, client-spec case' ' + client_view "//depot/... //client/..." && + test_when_finished cleanup_git && + git p4 clone --use-client-spec --dest="$git" //depot/dir1 && + ( + cd "$git" && + echo git-wild-hash >dir1/git-wild#hash && + echo git-wild-star >dir1/git-wild\*star && + echo git-wild-at >dir1/git-wild@at && + echo git-wild-percent >dir1/git-wild%percent && + git add dir1/git-wild* && + git commit -m "add some wildcard filenames" && + git config git-p4.skipSubmitEditCheck true && + git p4 submit + ) && + ( + cd "$cli" && + test_path_is_file dir1/git-wild#hash && + test_path_is_file dir1/git-wild\*star && + test_path_is_file dir1/git-wild@at && + test_path_is_file dir1/git-wild%percent + ) && + ( + # delete these carefully, cannot just do "p4 delete" + # on files with wildcards; but git-p4 knows how + cd "$git" && + git rm dir1/git-wild* && + git commit -m "clean up the wildcards" && + git p4 submit ) ' test_expect_success 'reinit depot' ' ( cd "$cli" && - p4 sync -f && rm files && p4 delete */* && p4 submit -d "delete all files" && diff --git a/t/t9811-git-p4-label-import.sh b/t/t9811-git-p4-label-import.sh index fb00ffab24..095238fffe 100755 --- a/t/t9811-git-p4-label-import.sh +++ b/t/t9811-git-p4-label-import.sh @@ -195,6 +195,26 @@ test_expect_success 'tag that cannot be exported' ' ) ' +test_expect_success 'use git config to enable import/export of tags' ' + git p4 clone --verbose --dest="$git" //depot@all && + ( + cd "$git" && + git config git-p4.exportLabels true && + git config git-p4.importLabels true && + git tag CFG_A_GIT_TAG && + git p4 rebase --verbose && + git p4 submit --verbose && + git tag && + git tag | grep TAG_F1_1 + ) && + ( + cd "$cli" && + p4 labels && + p4 labels | grep CFG_A_GIT_TAG + ) +' + + test_expect_success 'kill p4d' ' kill_p4d ' diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index 5bda6b6e18..9a80c60945 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -63,7 +63,7 @@ run_completion () local _cword _words=( $1 ) (( _cword = ${#_words[@]} - 1 )) - _git && print_comp + __git_wrap_main_git && print_comp } test_completion () diff --git a/t/test-lib.sh b/t/test-lib.sh index b7d7100c4e..9e2b71132a 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -615,6 +615,7 @@ case $(uname -s) in ;; esac +( COLUMNS=1 && test $COLUMNS = 1 ) && test_set_prereq COLUMNS_CAN_BE_1 test -z "$NO_PERL" && test_set_prereq PERL test -z "$NO_PYTHON" && test_set_prereq PYTHON test -n "$USE_LIBPCRE" && test_set_prereq LIBPCRE diff --git a/test-date.c b/test-date.c index 6bcd5b03c0..10afaabbfa 100644 --- a/test-date.c +++ b/test-date.c @@ -7,13 +7,14 @@ static const char *usage_msg = "\n" static void show_dates(char **argv, struct timeval *now) { - char buf[128]; + struct strbuf buf = STRBUF_INIT; for (; *argv; argv++) { time_t t = atoi(*argv); - show_date_relative(t, 0, now, buf, sizeof(buf)); - printf("%s -> %s\n", *argv, buf); + show_date_relative(t, 0, now, &buf); + printf("%s -> %s\n", *argv, buf.buf); } + strbuf_release(&buf); } static void parse_dates(char **argv, struct timeval *now) diff --git a/transport-helper.c b/transport-helper.c index f6b3b1fb79..61c928f6cd 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -199,7 +199,7 @@ static struct child_process *get_helper(struct transport *transport) data->import_marks = strbuf_detach(&arg, NULL); } else if (mandatory) { die("Unknown mandatory capability %s. This remote " - "helper probably needs newer version of Git.\n", + "helper probably needs newer version of Git.", capname); } } @@ -599,7 +599,7 @@ static void push_update_ref_status(struct strbuf *buf, status = REF_STATUS_REMOTE_REJECT; refname = buf->buf + 6; } else - die("expected ok/error, helper said '%s'\n", buf->buf); + die("expected ok/error, helper said '%s'", buf->buf); msg = strchr(refname, ' '); if (msg) { diff --git a/unpack-trees.c b/unpack-trees.c index 36523da22a..ad40109432 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1027,6 +1027,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options o->result.initialized = 1; o->result.timestamp.sec = o->src_index->timestamp.sec; o->result.timestamp.nsec = o->src_index->timestamp.nsec; + o->result.version = o->src_index->version; o->merge_size = len; mark_all_ce_unused(o->src_index); @@ -1209,7 +1210,7 @@ static int verify_uptodate_1(struct cache_entry *ce, return 0; /* * NEEDSWORK: the current default policy is to allow - * submodule to be out of sync wrt the supermodule + * submodule to be out of sync wrt the superproject * index. This needs to be tightened later for * submodules that are marked to be automatically * checked out. @@ -1792,7 +1793,7 @@ int bind_merge(struct cache_entry **src, struct cache_entry *a = src[1]; if (o->merge_size != 1) - return error("Cannot do a bind merge of %d trees\n", + return error("Cannot do a bind merge of %d trees", o->merge_size); if (a && old) return o->gently ? -1 : diff --git a/varint.c b/varint.c new file mode 100644 index 0000000000..4ed7729496 --- /dev/null +++ b/varint.c @@ -0,0 +1,29 @@ +#include "varint.h" + +uintmax_t decode_varint(const unsigned char **bufp) +{ + const unsigned char *buf = *bufp; + unsigned char c = *buf++; + uintmax_t val = c & 127; + while (c & 128) { + val += 1; + if (!val || MSB(val, 7)) + return 0; /* overflow */ + c = *buf++; + val = (val << 7) + (c & 127); + } + *bufp = buf; + return val; +} + +int encode_varint(uintmax_t value, unsigned char *buf) +{ + unsigned char varint[16]; + unsigned pos = sizeof(varint) - 1; + varint[pos] = value & 127; + while (value >>= 7) + varint[--pos] = 128 | (--value & 127); + if (buf) + memcpy(buf, varint + pos, sizeof(varint) - pos); + return sizeof(varint) - pos; +} diff --git a/varint.h b/varint.h new file mode 100644 index 0000000000..0321195796 --- /dev/null +++ b/varint.h @@ -0,0 +1,9 @@ +#ifndef VARINT_H +#define VARINT_H + +#include "git-compat-util.h" + +extern int encode_varint(uintmax_t, unsigned char *); +extern uintmax_t decode_varint(const unsigned char **); + +#endif /* VARINT_H */ diff --git a/vcs-svn/svndump.c b/vcs-svn/svndump.c index 644fdc71ba..0899790a33 100644 --- a/vcs-svn/svndump.c +++ b/vcs-svn/svndump.c @@ -175,7 +175,7 @@ static void read_props(void) int ch; if (!type || t[1] != ' ') - die("invalid property line: %s\n", t); + die("invalid property line: %s", t); len = atoi(&t[2]); strbuf_reset(&val); buffer_read_binary(&input, &val, len); @@ -201,7 +201,7 @@ static void read_props(void) strbuf_reset(&key); continue; default: - die("invalid property line: %s\n", t); + die("invalid property line: %s", t); } } } @@ -402,3 +402,15 @@ int remove_or_warn(unsigned int mode, const char *file) { return S_ISGITLINK(mode) ? rmdir_or_warn(file) : unlink_or_warn(file); } + +struct passwd *xgetpwuid_self(void) +{ + struct passwd *pw; + + errno = 0; + pw = getpwuid(getuid()); + if (!pw) + die(_("unable to look up current user in the passwd file: %s"), + errno ? strerror(errno) : _("no such user")); + return pw; +} diff --git a/wt-status.c b/wt-status.c index 9ffc535f1a..dd6d8c4106 100644 --- a/wt-status.c +++ b/wt-status.c @@ -11,6 +11,7 @@ #include "remote.h" #include "refs.h" #include "submodule.h" +#include "column.h" static char default_wt_status_colors[][COLOR_MAXLEN] = { GIT_COLOR_NORMAL, /* WT_STATUS_HEADER */ @@ -641,6 +642,8 @@ static void wt_status_print_other(struct wt_status *s, { int i; struct strbuf buf = STRBUF_INIT; + static struct string_list output = STRING_LIST_INIT_DUP; + struct column_options copts; if (!l->nr) return; @@ -649,12 +652,33 @@ static void wt_status_print_other(struct wt_status *s, for (i = 0; i < l->nr; i++) { struct string_list_item *it; + const char *path; it = &(l->items[i]); + path = quote_path(it->string, strlen(it->string), + &buf, s->prefix); + if (column_active(s->colopts)) { + string_list_append(&output, path); + continue; + } status_printf(s, color(WT_STATUS_HEADER, s), "\t"); status_printf_more(s, color(WT_STATUS_UNTRACKED, s), - "%s\n", quote_path(it->string, strlen(it->string), - &buf, s->prefix)); + "%s\n", path); } + + strbuf_release(&buf); + if (!column_active(s->colopts)) + return; + + strbuf_addf(&buf, "%s#\t%s", + color(WT_STATUS_HEADER, s), + color(WT_STATUS_UNTRACKED, s)); + memset(&copts, 0, sizeof(copts)); + copts.padding = 1; + copts.indent = buf.buf; + if (want_color(s->use_color)) + copts.nl = GIT_COLOR_RESET "\n"; + print_columns(&output, s->colopts, &copts); + string_list_clear(&output, 0); strbuf_release(&buf); } @@ -777,7 +801,7 @@ void wt_status_print(struct wt_status *s) } } -static void wt_shortstatus_unmerged(int null_termination, struct string_list_item *it, +static void wt_shortstatus_unmerged(struct string_list_item *it, struct wt_status *s) { struct wt_status_change_data *d = it->util; @@ -793,7 +817,7 @@ static void wt_shortstatus_unmerged(int null_termination, struct string_list_ite case 7: how = "UU"; break; /* both modified */ } color_fprintf(s->fp, color(WT_STATUS_UNMERGED, s), "%s", how); - if (null_termination) { + if (s->null_termination) { fprintf(stdout, " %s%c", it->string, 0); } else { struct strbuf onebuf = STRBUF_INIT; @@ -804,7 +828,7 @@ static void wt_shortstatus_unmerged(int null_termination, struct string_list_ite } } -static void wt_shortstatus_status(int null_termination, struct string_list_item *it, +static void wt_shortstatus_status(struct string_list_item *it, struct wt_status *s) { struct wt_status_change_data *d = it->util; @@ -818,7 +842,7 @@ static void wt_shortstatus_status(int null_termination, struct string_list_item else putchar(' '); putchar(' '); - if (null_termination) { + if (s->null_termination) { fprintf(stdout, "%s%c", it->string, 0); if (d->head_path) fprintf(stdout, "%s%c", d->head_path, 0); @@ -846,10 +870,10 @@ static void wt_shortstatus_status(int null_termination, struct string_list_item } } -static void wt_shortstatus_other(int null_termination, struct string_list_item *it, +static void wt_shortstatus_other(struct string_list_item *it, struct wt_status *s, const char *sign) { - if (null_termination) { + if (s->null_termination) { fprintf(stdout, "%s %s%c", sign, it->string, 0); } else { struct strbuf onebuf = STRBUF_INIT; @@ -889,8 +913,8 @@ static void wt_shortstatus_print_tracking(struct wt_status *s) if (s->is_initial) color_fprintf(s->fp, header_color, _("Initial commit on ")); if (!stat_tracking_info(branch, &num_ours, &num_theirs)) { - color_fprintf_ln(s->fp, branch_color_local, - "%s", branch_name); + color_fprintf(s->fp, branch_color_local, "%s", branch_name); + fputc(s->null_termination ? '\0' : '\n', s->fp); return; } @@ -914,14 +938,15 @@ static void wt_shortstatus_print_tracking(struct wt_status *s) color_fprintf(s->fp, branch_color_remote, "%d", num_theirs); } - color_fprintf_ln(s->fp, header_color, "]"); + color_fprintf(s->fp, header_color, "]"); + fputc(s->null_termination ? '\0' : '\n', s->fp); } -void wt_shortstatus_print(struct wt_status *s, int null_termination, int show_branch) +void wt_shortstatus_print(struct wt_status *s) { int i; - if (show_branch) + if (s->show_branch) wt_shortstatus_print_tracking(s); for (i = 0; i < s->change.nr; i++) { @@ -931,28 +956,28 @@ void wt_shortstatus_print(struct wt_status *s, int null_termination, int show_br it = &(s->change.items[i]); d = it->util; if (d->stagemask) - wt_shortstatus_unmerged(null_termination, it, s); + wt_shortstatus_unmerged(it, s); else - wt_shortstatus_status(null_termination, it, s); + wt_shortstatus_status(it, s); } for (i = 0; i < s->untracked.nr; i++) { struct string_list_item *it; it = &(s->untracked.items[i]); - wt_shortstatus_other(null_termination, it, s, "??"); + wt_shortstatus_other(it, s, "??"); } for (i = 0; i < s->ignored.nr; i++) { struct string_list_item *it; it = &(s->ignored.items[i]); - wt_shortstatus_other(null_termination, it, s, "!!"); + wt_shortstatus_other(it, s, "!!"); } } -void wt_porcelain_print(struct wt_status *s, int null_termination) +void wt_porcelain_print(struct wt_status *s) { s->use_color = 0; s->relative_paths = 0; s->prefix = NULL; - wt_shortstatus_print(s, null_termination, 0); + wt_shortstatus_print(s); } diff --git a/wt-status.h b/wt-status.h index 682b4c8f7d..14aa9f7e13 100644 --- a/wt-status.h +++ b/wt-status.h @@ -56,6 +56,9 @@ struct wt_status { enum untracked_status_type show_untracked_files; const char *ignore_submodule_arg; char color_palette[WT_STATUS_MAXSLOT][COLOR_MAXLEN]; + unsigned colopts; + int null_termination; + int show_branch; /* These are computed during processing of the individual sections */ int commitable; @@ -72,8 +75,8 @@ void wt_status_prepare(struct wt_status *s); void wt_status_print(struct wt_status *s); void wt_status_collect(struct wt_status *s); -void wt_shortstatus_print(struct wt_status *s, int null_termination, int show_branch); -void wt_porcelain_print(struct wt_status *s, int null_termination); +void wt_shortstatus_print(struct wt_status *s); +void wt_porcelain_print(struct wt_status *s); void status_printf_ln(struct wt_status *s, const char *color, const char *fmt, ...) ; diff --git a/xdiff-interface.c b/xdiff-interface.c index 0e2c169227..ecfa05f616 100644 --- a/xdiff-interface.c +++ b/xdiff-interface.c @@ -156,50 +156,6 @@ int xdi_diff_outf(mmfile_t *mf1, mmfile_t *mf2, return ret; } -struct xdiff_emit_hunk_state { - xdiff_emit_hunk_consume_fn consume; - void *consume_callback_data; -}; - -static int process_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, - xdemitconf_t const *xecfg) -{ - long s1, s2, same, p_next, t_next; - xdchange_t *xch, *xche; - struct xdiff_emit_hunk_state *state = ecb->priv; - xdiff_emit_hunk_consume_fn fn = state->consume; - void *consume_callback_data = state->consume_callback_data; - - for (xch = xscr; xch; xch = xche->next) { - xche = xdl_get_hunk(xch, xecfg); - - s1 = XDL_MAX(xch->i1 - xecfg->ctxlen, 0); - s2 = XDL_MAX(xch->i2 - xecfg->ctxlen, 0); - same = s2 + XDL_MAX(xch->i1 - s1, 0); - p_next = xche->i1 + xche->chg1; - t_next = xche->i2 + xche->chg2; - - fn(consume_callback_data, same, p_next, t_next); - } - return 0; -} - -int xdi_diff_hunks(mmfile_t *mf1, mmfile_t *mf2, - xdiff_emit_hunk_consume_fn fn, void *consume_callback_data, - xpparam_t const *xpp, xdemitconf_t *xecfg) -{ - struct xdiff_emit_hunk_state state; - xdemitcb_t ecb; - - memset(&state, 0, sizeof(state)); - memset(&ecb, 0, sizeof(ecb)); - state.consume = fn; - state.consume_callback_data = consume_callback_data; - xecfg->emit_func = (void (*)())process_diff; - ecb.priv = &state; - return xdi_diff(mf1, mf2, xpp, xecfg, &ecb); -} - int read_mmfile(mmfile_t *ptr, const char *filename) { struct stat st; diff --git a/xdiff-interface.h b/xdiff-interface.h index 49d1116fc3..eff7762ee1 100644 --- a/xdiff-interface.h +++ b/xdiff-interface.h @@ -4,15 +4,11 @@ #include "xdiff/xdiff.h" typedef void (*xdiff_emit_consume_fn)(void *, char *, unsigned long); -typedef void (*xdiff_emit_hunk_consume_fn)(void *, long, long, long); int xdi_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, xdemitconf_t const *xecfg, xdemitcb_t *ecb); int xdi_diff_outf(mmfile_t *mf1, mmfile_t *mf2, xdiff_emit_consume_fn fn, void *consume_callback_data, xpparam_t const *xpp, xdemitconf_t const *xecfg); -int xdi_diff_hunks(mmfile_t *mf1, mmfile_t *mf2, - xdiff_emit_hunk_consume_fn fn, void *consume_callback_data, - xpparam_t const *xpp, xdemitconf_t *xecfg); int parse_hunk_header(char *line, int len, int *ob, int *on, int *nb, int *nn); diff --git a/xdiff/xdiff.h b/xdiff/xdiff.h index 09215afe6e..219a3bbca6 100644 --- a/xdiff/xdiff.h +++ b/xdiff/xdiff.h @@ -86,13 +86,17 @@ typedef struct s_xdemitcb { typedef long (*find_func_t)(const char *line, long line_len, char *buffer, long buffer_size, void *priv); +typedef int (*xdl_emit_hunk_consume_func_t)(long start_a, long count_a, + long start_b, long count_b, + void *cb_data); + typedef struct s_xdemitconf { long ctxlen; long interhunkctxlen; unsigned long flags; find_func_t find_func; void *find_func_priv; - void (*emit_func)(); + xdl_emit_hunk_consume_func_t hunk_func; } xdemitconf_t; typedef struct s_bdiffparam { diff --git a/xdiff/xdiffi.c b/xdiff/xdiffi.c index bc889e8789..1b7012a119 100644 --- a/xdiff/xdiffi.c +++ b/xdiff/xdiffi.c @@ -538,13 +538,26 @@ void xdl_free_script(xdchange_t *xscr) { } } +static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, + xdemitconf_t const *xecfg) +{ + xdchange_t *xch, *xche; + + for (xch = xscr; xch; xch = xche->next) { + xche = xdl_get_hunk(xch, xecfg); + if (xecfg->hunk_func(xch->i1, xche->i1 + xche->chg1 - xch->i1, + xch->i2, xche->i2 + xche->chg2 - xch->i2, + ecb->priv) < 0) + return -1; + } + return 0; +} int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, xdemitconf_t const *xecfg, xdemitcb_t *ecb) { xdchange_t *xscr; xdfenv_t xe; - emit_func_t ef = xecfg->emit_func ? - (emit_func_t)xecfg->emit_func : xdl_emit_diff; + emit_func_t ef = xecfg->hunk_func ? xdl_call_hunk_func : xdl_emit_diff; if (xdl_do_diff(mf1, mf2, xpp, &xe) < 0) { diff --git a/xdiff/xutils.c b/xdiff/xutils.c index 0de084e53f..9504eaecb8 100644 --- a/xdiff/xutils.c +++ b/xdiff/xutils.c @@ -20,6 +20,8 @@ * */ +#include <limits.h> +#include <assert.h> #include "xinclude.h" @@ -120,35 +122,6 @@ void *xdl_cha_alloc(chastore_t *cha) { return data; } - -void *xdl_cha_first(chastore_t *cha) { - chanode_t *sncur; - - if (!(cha->sncur = sncur = cha->head)) - return NULL; - - cha->scurr = 0; - - return (char *) sncur + sizeof(chanode_t) + cha->scurr; -} - - -void *xdl_cha_next(chastore_t *cha) { - chanode_t *sncur; - - if (!(sncur = cha->sncur)) - return NULL; - cha->scurr += cha->isize; - if (cha->scurr == sncur->icurr) { - if (!(sncur = cha->sncur = sncur->next)) - return NULL; - cha->scurr = 0; - } - - return (char *) sncur + sizeof(chanode_t) + cha->scurr; -} - - long xdl_guess_lines(mmfile_t *mf, long sample) { long nl = 0, size, tsize = 0; char const *data, *cur, *top; @@ -276,6 +249,109 @@ static unsigned long xdl_hash_record_with_whitespace(char const **data, return ha; } +#ifdef XDL_FAST_HASH + +#define REPEAT_BYTE(x) ((~0ul / 0xff) * (x)) + +#define ONEBYTES REPEAT_BYTE(0x01) +#define NEWLINEBYTES REPEAT_BYTE(0x0a) +#define HIGHBITS REPEAT_BYTE(0x80) + +/* Return the high bit set in the first byte that is a zero */ +static inline unsigned long has_zero(unsigned long a) +{ + return ((a - ONEBYTES) & ~a) & HIGHBITS; +} + +static inline long count_masked_bytes(unsigned long mask) +{ + if (sizeof(long) == 8) { + /* + * Jan Achrenius on G+: microoptimized version of + * the simpler "(mask & ONEBYTES) * ONEBYTES >> 56" + * that works for the bytemasks without having to + * mask them first. + */ + /* + * return mask * 0x0001020304050608 >> 56; + * + * Doing it like this avoids warnings on 32-bit machines. + */ + long a = (REPEAT_BYTE(0x01) / 0xff + 1); + return mask * a >> (sizeof(long) * 7); + } else { + /* Carl Chatfield / Jan Achrenius G+ version for 32-bit */ + /* (000000 0000ff 00ffff ffffff) -> ( 1 1 2 3 ) */ + long a = (0x0ff0001 + mask) >> 23; + /* Fix the 1 for 00 case */ + return a & mask; + } +} + +unsigned long xdl_hash_record(char const **data, char const *top, long flags) +{ + unsigned long hash = 5381; + unsigned long a = 0, mask = 0; + char const *ptr = *data; + char const *end = top - sizeof(unsigned long) + 1; + + if (flags & XDF_WHITESPACE_FLAGS) + return xdl_hash_record_with_whitespace(data, top, flags); + + ptr -= sizeof(unsigned long); + do { + hash += hash << 5; + hash ^= a; + ptr += sizeof(unsigned long); + if (ptr >= end) + break; + a = *(unsigned long *)ptr; + /* Do we have any '\n' bytes in this word? */ + mask = has_zero(a ^ NEWLINEBYTES); + } while (!mask); + + if (ptr >= end) { + /* + * There is only a partial word left at the end of the + * buffer. Because we may work with a memory mapping, + * we have to grab the rest byte by byte instead of + * blindly reading it. + * + * To avoid problems with masking in a signed value, + * we use an unsigned char here. + */ + const char *p; + for (p = top - 1; p >= ptr; p--) + a = (a << 8) + *((const unsigned char *)p); + mask = has_zero(a ^ NEWLINEBYTES); + if (!mask) + /* + * No '\n' found in the partial word. Make a + * mask that matches what we read. + */ + mask = 1UL << (8 * (top - ptr) + 7); + } + + /* The mask *below* the first high bit set */ + mask = (mask - 1) & ~mask; + mask >>= 7; + hash += hash << 5; + hash ^= a & mask; + + /* Advance past the last (possibly partial) word */ + ptr += count_masked_bytes(mask); + + if (ptr < top) { + assert(*ptr == '\n'); + ptr++; + } + + *data = ptr; + + return hash; +} + +#else /* XDL_FAST_HASH */ unsigned long xdl_hash_record(char const **data, char const *top, long flags) { unsigned long ha = 5381; @@ -293,6 +369,7 @@ unsigned long xdl_hash_record(char const **data, char const *top, long flags) { return ha; } +#endif /* XDL_FAST_HASH */ unsigned int xdl_hashbits(unsigned int size) { unsigned int val = 1, bits = 0; @@ -324,20 +401,6 @@ int xdl_num_out(char *out, long val) { return str - out; } - -long xdl_atol(char const *str, char const **next) { - long val, base; - char const *top; - - for (top = str; XDL_ISDIGIT(*top); top++); - if (next) - *next = top; - for (val = 0, base = 1, top--; top >= str; top--, base *= 10) - val += base * (long)(*top - '0'); - return val; -} - - int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2, const char *func, long funclen, xdemitcb_t *ecb) { int nb = 0; diff --git a/xdiff/xutils.h b/xdiff/xutils.h index 714719a89c..ad1428ed69 100644 --- a/xdiff/xutils.h +++ b/xdiff/xutils.h @@ -31,14 +31,11 @@ int xdl_emit_diffrec(char const *rec, long size, char const *pre, long psize, int xdl_cha_init(chastore_t *cha, long isize, long icount); void xdl_cha_free(chastore_t *cha); void *xdl_cha_alloc(chastore_t *cha); -void *xdl_cha_first(chastore_t *cha); -void *xdl_cha_next(chastore_t *cha); long xdl_guess_lines(mmfile_t *mf, long sample); int xdl_recmatch(const char *l1, long s1, const char *l2, long s2, long flags); unsigned long xdl_hash_record(char const **data, char const *top, long flags); unsigned int xdl_hashbits(unsigned int size); int xdl_num_out(char *out, long val); -long xdl_atol(char const *str, char const **next); int xdl_emit_hunk_hdr(long s1, long c1, long s2, long c2, const char *func, long funclen, xdemitcb_t *ecb); int xdl_fall_back_diff(xdfenv_t *diff_env, xpparam_t const *xpp, |