Git development
 help / color / mirror / Atom feed
* [PATCH v7 1/4] git: make super-prefix option
From: Brandon Williams @ 2016-10-07 18:18 UTC (permalink / raw)
  To: git; +Cc: Brandon Williams, sbeller, peff, gitster
In-Reply-To: <20161007181851.15063-1-bmwill@google.com>

Add a super-prefix environment variable 'GIT_INTERNAL_SUPER_PREFIX'
which can be used to specify a path from above a repository down to its
root.  When such a super-prefix is specified, the paths reported by Git
are prefixed with it to make them relative to that directory "above".
The paths given by the user on the command line
(e.g. "git subcmd --output-file=path/to/a/file" and pathspecs) are taken
relative to the directory "above" to match.

The immediate use of this option is by commands which have a
--recurse-submodule option in order to give context to submodules about
how they were invoked.  This option is currently only allowed for
builtins which support a super-prefix.

Signed-off-by: Brandon Williams <bmwill@google.com>
---
 Documentation/git.txt |  6 ++++++
 cache.h               |  2 ++
 environment.c         | 13 +++++++++++++
 git.c                 | 25 +++++++++++++++++++++++++
 4 files changed, 46 insertions(+)

diff --git a/Documentation/git.txt b/Documentation/git.txt
index 7913fc2..2188ae6 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -13,6 +13,7 @@ SYNOPSIS
     [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
     [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
     [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
+    [--super-prefix=<path>]
     <command> [<args>]
 
 DESCRIPTION
@@ -601,6 +602,11 @@ foo.bar= ...`) sets `foo.bar` to the empty string.
 	details.  Equivalent to setting the `GIT_NAMESPACE` environment
 	variable.
 
+--super-prefix=<path>::
+	Currently for internal use only.  Set a prefix which gives a path from
+	above a repository down to its root.  One use is to give submodules
+	context about the superproject that invoked it.
+
 --bare::
 	Treat the repository as a bare repository.  If GIT_DIR
 	environment is not set, it is set to the current working
diff --git a/cache.h b/cache.h
index 3556326..8cf495d 100644
--- a/cache.h
+++ b/cache.h
@@ -408,6 +408,7 @@ static inline enum object_type object_type(unsigned int mode)
 #define GIT_NAMESPACE_ENVIRONMENT "GIT_NAMESPACE"
 #define GIT_WORK_TREE_ENVIRONMENT "GIT_WORK_TREE"
 #define GIT_PREFIX_ENVIRONMENT "GIT_PREFIX"
+#define GIT_SUPER_PREFIX_ENVIRONMENT "GIT_INTERNAL_SUPER_PREFIX"
 #define DEFAULT_GIT_DIR_ENVIRONMENT ".git"
 #define DB_ENVIRONMENT "GIT_OBJECT_DIRECTORY"
 #define INDEX_ENVIRONMENT "GIT_INDEX_FILE"
@@ -468,6 +469,7 @@ extern int get_common_dir_noenv(struct strbuf *sb, const char *gitdir);
 extern int get_common_dir(struct strbuf *sb, const char *gitdir);
 extern const char *get_git_namespace(void);
 extern const char *strip_namespace(const char *namespaced_ref);
+extern const char *get_super_prefix(void);
 extern const char *get_git_work_tree(void);
 
 /*
diff --git a/environment.c b/environment.c
index ca72464..d12d7db 100644
--- a/environment.c
+++ b/environment.c
@@ -100,6 +100,8 @@ static char *work_tree;
 static const char *namespace;
 static size_t namespace_len;
 
+static const char *super_prefix;
+
 static const char *git_dir, *git_common_dir;
 static char *git_object_dir, *git_index_file, *git_graft_file;
 int git_db_env, git_index_env, git_graft_env, git_common_dir_env;
@@ -120,6 +122,7 @@ const char * const local_repo_env[] = {
 	NO_REPLACE_OBJECTS_ENVIRONMENT,
 	GIT_REPLACE_REF_BASE_ENVIRONMENT,
 	GIT_PREFIX_ENVIRONMENT,
+	GIT_SUPER_PREFIX_ENVIRONMENT,
 	GIT_SHALLOW_FILE_ENVIRONMENT,
 	GIT_COMMON_DIR_ENVIRONMENT,
 	NULL
@@ -222,6 +225,16 @@ const char *strip_namespace(const char *namespaced_ref)
 	return namespaced_ref + namespace_len;
 }
 
+const char *get_super_prefix(void)
+{
+	static int initialized;
+	if (!initialized) {
+		super_prefix = getenv(GIT_SUPER_PREFIX_ENVIRONMENT);
+		initialized = 1;
+	}
+	return super_prefix;
+}
+
 static int git_work_tree_initialized;
 
 /*
diff --git a/git.c b/git.c
index 1c61151..469a83f 100644
--- a/git.c
+++ b/git.c
@@ -164,6 +164,20 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
 			setenv(GIT_WORK_TREE_ENVIRONMENT, cmd, 1);
 			if (envchanged)
 				*envchanged = 1;
+		} else if (!strcmp(cmd, "--super-prefix")) {
+			if (*argc < 2) {
+				fprintf(stderr, "No prefix given for --super-prefix.\n" );
+				usage(git_usage_string);
+			}
+			setenv(GIT_SUPER_PREFIX_ENVIRONMENT, (*argv)[1], 1);
+			if (envchanged)
+				*envchanged = 1;
+			(*argv)++;
+			(*argc)--;
+		} else if (skip_prefix(cmd, "--super-prefix=", &cmd)) {
+			setenv(GIT_SUPER_PREFIX_ENVIRONMENT, cmd, 1);
+			if (envchanged)
+				*envchanged = 1;
 		} else if (!strcmp(cmd, "--bare")) {
 			char *cwd = xgetcwd();
 			is_bare_repository_cfg = 1;
@@ -310,6 +324,7 @@ static int handle_alias(int *argcp, const char ***argv)
  * RUN_SETUP for reading from the configuration file.
  */
 #define NEED_WORK_TREE		(1<<3)
+#define SUPPORT_SUPER_PREFIX	(1<<4)
 
 struct cmd_struct {
 	const char *cmd;
@@ -344,6 +359,13 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
 	}
 	commit_pager_choice();
 
+	if (!help && get_super_prefix()) {
+		if (!(p->option & SUPPORT_SUPER_PREFIX))
+			die("%s doesn't support --super-prefix", p->cmd);
+		if (prefix)
+			die("can't use --super-prefix from a subdirectory");
+	}
+
 	if (!help && p->option & NEED_WORK_TREE)
 		setup_work_tree();
 
@@ -558,6 +580,9 @@ static void execv_dashed_external(const char **argv)
 	const char *tmp;
 	int status;
 
+	if (get_super_prefix())
+		die("%s doesn't support --super-prefix", argv[0]);
+
 	if (use_pager == -1)
 		use_pager = check_pager_config(argv[0]);
 	commit_pager_choice();
-- 
2.10.0


^ permalink raw reply related

* [PATCH v7 0/4] recursive support for ls-files
From: Brandon Williams @ 2016-10-07 18:18 UTC (permalink / raw)
  To: git; +Cc: Brandon Williams, sbeller, peff, gitster
In-Reply-To: <1475185723-36871-1-git-send-email-bmwill@google.com>

Few minor fixes pointed out Stefan

Brandon Williams (4):
  git: make super-prefix option
  ls-files: optionally recurse into submodules
  ls-files: pass through safe options for --recurse-submodules
  ls-files: add pathspec matching for submodules

 Documentation/git-ls-files.txt         |   7 +-
 Documentation/git.txt                  |   6 +
 builtin/ls-files.c                     | 181 +++++++++++++++++++++-------
 cache.h                                |   2 +
 dir.c                                  |  46 +++++++-
 dir.h                                  |   4 +
 environment.c                          |  13 ++
 git.c                                  |  27 ++++-
 t/t3007-ls-files-recurse-submodules.sh | 210 +++++++++++++++++++++++++++++++++
 9 files changed, 452 insertions(+), 44 deletions(-)
 create mode 100755 t/t3007-ls-files-recurse-submodules.sh

-- 
2.10.0


^ permalink raw reply

* Uninitialized submodules as symlinks
From: David Turner @ 2016-10-07 18:17 UTC (permalink / raw)
  To: git@vger.kernel.org

Presently, uninitialized submodules are materialized in the working tree as empty directories.  We would like to consider having them be symlinks.  Specifically, we'd like them to be symlinks into a FUSE filesystem which retrieves files on demand.

We've actually already got a FUSE filesystem written, but we use a different (semi-manual) means to connect it to the initialized submodules.  We hope to release this FUSE filesystem as free software at some point soon, but we do not yet have a fixed schedule for doing so.  Having to run a command to create the symlink-based "union" filesystem is not optimal (since we have to re-run it every time we initialize or deinitialize a submodule).

But if the uninitialized submodules could be symlinks into the FUSE filesystem, we wouldn't have this problem.  This solution isn't necessarily FUSE-specific -- perhaps someone would want copies of the same submodule in multiple repos, and would want to save disk space by having all copies point to the same place.  So the symlinks would be configured by a per-submodule config variable.

Naturally, this would require some changes to code that examines the working tree -- git status, git diff, etc.  They would have to report "unchanged" for submodules which were still symlinks to the configured location.  I have not yet looked at the implementation details beyond this.

Does this idea make any sense?  If I were to implement it (probably in a few months, but no official timeline yet), would patches be considered?

^ permalink raw reply

* Re: [PATCH v2 2/3] serialize collection of refs that contain submodule changes
From: Stefan Beller @ 2016-10-07 18:16 UTC (permalink / raw)
  To: Heiko Voigt
  Cc: Junio C Hamano, Jeff King, git@vger.kernel.org, Jens Lehmann,
	Fredrik Gustafsson, Leandro Lucarella
In-Reply-To: <81bdbf6a1295c17c1b9233c91da6e5eb4583785e.1475851621.git.hvoigt@hvoigt.net>

On Fri, Oct 7, 2016 at 8:06 AM, Heiko Voigt <hvoigt@hvoigt.net> wrote:
> We are iterating over each pushed ref and want to check whether it
> contains changes to submodules. Instead of immediately checking each ref
> lets first collect them and then do the check for all of them in one
> revision walk.
>
> Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net>
> ---
>  submodule.c | 36 +++++++++++++++++++++---------------
>  submodule.h |  5 +++--
>  transport.c | 29 +++++++++++++++++++++--------
>  3 files changed, 45 insertions(+), 25 deletions(-)
>
> diff --git a/submodule.c b/submodule.c
> index 59c9d15905..5044afc2f8 100644
> --- a/submodule.c
> +++ b/submodule.c
> @@ -522,6 +522,13 @@ static int has_remote(const char *refname, const struct object_id *oid,
>         return 1;
>  }
>
> +static int append_hash_to_argv(const unsigned char sha1[20], void *data)
> +{
> +       struct argv_array *argv = (struct argv_array *) data;
> +       argv_array_push(argv, sha1_to_hex(sha1));

Nit of the day:
When using the struct child-process, we have the oldstyle argv NULL
terminated array as
well as the new style args argv_array. So in that context we'd prefer
`args` as a name for
argv_array as that helps to distinguish from the old array type.
Here however `argv` seems to be a reasonable name, in fact whenever we
do not deal with
child processes, we seem to not like the `args` name:

    $ git grep argv_array |wc -l
    577
    $ git grep argv_array |grep args |wc -l
    293

The rest looks good to me. :)

^ permalink raw reply

* Re: [PATCH v2 1/3] serialize collection of changed submodules
From: Stefan Beller @ 2016-10-07 17:59 UTC (permalink / raw)
  To: Heiko Voigt
  Cc: Junio C Hamano, Jeff King, git@vger.kernel.org, Jens Lehmann,
	Fredrik Gustafsson, Leandro Lucarella
In-Reply-To: <10cd5be93601bc52388100e80b6c6735a7cacfb4.1475851621.git.hvoigt@hvoigt.net>

On Fri, Oct 7, 2016 at 8:06 AM, Heiko Voigt <hvoigt@hvoigt.net> wrote:
> To check whether a submodule needs to be pushed we need to collect all
> changed submodules. Lets collect them first and then execute the
> possibly expensive test whether certain revisions are already pushed
> only once per submodule.
>
> There is further potential for optimization since we can assemble one
> command and only issued that instead of one call for each remote ref in
> the submodule.
>
> Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net>
> ---
>  submodule.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
>  1 file changed, 58 insertions(+), 5 deletions(-)
>
> diff --git a/submodule.c b/submodule.c
> index 2de06a3351..59c9d15905 100644
> --- a/submodule.c
> +++ b/submodule.c
> @@ -554,19 +554,34 @@ static int submodule_needs_pushing(const char *path, const unsigned char sha1[20
>         return 0;
>  }
>
> +static struct sha1_array *get_sha1s_from_list(struct string_list *submodules,
> +               const char *path)

So this will take the stringlist `submodules` and insert the path into it,
if it wasn't already in there. In case it is newly inserted, add a sha1_array
as util, so each inserted path has it's own empty array.

So it is both init of the data structures as well as retrieving them. I was
initially confused by the name as I assumed it would give you sha1s out
of a string list (e.g. transform strings to internal sha1 things).
Maybe it's just
me having a hard time to understand that, but I feel like the name could be
improved.

    lookup_sha1_list_by_path,
    insert_path_and_return_sha1_list ?

> +{
> +       struct string_list_item *item;
> +
> +       item = string_list_insert(submodules, path);
> +       if (item->util)
> +               return (struct sha1_array *) item->util;
> +
> +       /* NEEDSWORK: should we have sha1_array_init()? */
> +       item->util = xcalloc(1, sizeof(struct sha1_array));
> +       return (struct sha1_array *) item->util;
> +}
> +
>  static void collect_submodules_from_diff(struct diff_queue_struct *q,
>                                          struct diff_options *options,
>                                          void *data)
>  {
>         int i;
> -       struct string_list *needs_pushing = data;
> +       struct string_list *submodules = data;
>
>         for (i = 0; i < q->nr; i++) {
>                 struct diff_filepair *p = q->queue[i];
> +               struct sha1_array *hashes;
>                 if (!S_ISGITLINK(p->two->mode))
>                         continue;
> -               if (submodule_needs_pushing(p->two->path, p->two->oid.hash))
> -                       string_list_insert(needs_pushing, p->two->path);
> +               hashes = get_sha1s_from_list(submodules, p->two->path);
> +               sha1_array_append(hashes, p->two->oid.hash);
>         }
>  }
>
> @@ -582,14 +597,41 @@ static void find_unpushed_submodule_commits(struct commit *commit,
>         diff_tree_combined_merge(commit, 1, &rev);
>  }
>
> +struct collect_submodule_from_sha1s_data {
> +       char *submodule_path;
> +       struct string_list *needs_pushing;
> +};
> +
> +static void collect_submodules_from_sha1s(const unsigned char sha1[20],
> +               void *data)
> +{
> +       struct collect_submodule_from_sha1s_data *me =
> +               (struct collect_submodule_from_sha1s_data *) data;
> +
> +       if (submodule_needs_pushing(me->submodule_path, sha1))
> +               string_list_insert(me->needs_pushing, me->submodule_path);
> +}
> +
> +static void free_submodules_sha1s(struct string_list *submodules)
> +{
> +       int i;
> +       for (i = 0; i < submodules->nr; i++) {
> +               struct string_list_item *item = &submodules->items[i];

You do not seem to make use of `i` explicitely, so
for_each_string_list_item might be more readable here?


> +               struct sha1_array *hashes = (struct sha1_array *) item->util;
> +               sha1_array_clear(hashes);
> +       }
> +       string_list_clear(submodules, 1);
> +}
> +
>  int find_unpushed_submodules(unsigned char new_sha1[20],
>                 const char *remotes_name, struct string_list *needs_pushing)
>  {
>         struct rev_info rev;
>         struct commit *commit;
>         const char *argv[] = {NULL, NULL, "--not", "NULL", NULL};
> -       int argc = ARRAY_SIZE(argv) - 1;
> +       int argc = ARRAY_SIZE(argv) - 1, i;
>         char *sha1_copy;
> +       struct string_list submodules = STRING_LIST_INIT_DUP;
>
>         struct strbuf remotes_arg = STRBUF_INIT;
>
> @@ -603,12 +645,23 @@ int find_unpushed_submodules(unsigned char new_sha1[20],
>                 die("revision walk setup failed");
>
>         while ((commit = get_revision(&rev)) != NULL)
> -               find_unpushed_submodule_commits(commit, needs_pushing);
> +               find_unpushed_submodule_commits(commit, &submodules);
>
>         reset_revision_walk();
>         free(sha1_copy);
>         strbuf_release(&remotes_arg);
>
> +       for (i = 0; i < submodules.nr; i++) {
> +               struct string_list_item *item = &submodules.items[i];

You do not seem to make use of `i` explicitely, so
for_each_string_list_item might be more readable here?


> +               struct collect_submodule_from_sha1s_data data;
> +               data.submodule_path = item->string;
> +               data.needs_pushing = needs_pushing;
> +               sha1_array_for_each_unique((struct sha1_array *) item->util,
> +                               collect_submodules_from_sha1s,
> +                               &data);
> +       }
> +       free_submodules_sha1s(&submodules);
> +
>         return needs_pushing->nr;
>  }
>
> --
> 2.10.1.637.g09b28c5
>

^ permalink raw reply

* Re: "Purposes, Concepts,Misfits, and a Redesign of Git" (a research paper)
From: Jakub Narębski @ 2016-10-07 18:05 UTC (permalink / raw)
  To: Santiago Perez De Rosso
  Cc: Konstantin Khomoutov, git, Daniel Jackson, Greg Wilson
In-Reply-To: <CAKbZu+CTobJ9omSDtK5WQxUZuq=b0g0r59k+9MFFy247YijgUw@mail.gmail.com>

On 7 October 2016 at 18:55, Santiago Perez De Rosso
<sperezde@csail.mit.edu> wrote:
> On Wed, Oct 5, 2016 at 6:15 AM Jakub Narębski <jnareb@gmail.com> wrote:
>> On 5 October 2016 at 04:55, Santiago Perez De Rosso
>> <sperezde@csail.mit.edu> wrote:
>>> On Fri, Sep 30, 2016 at 6:25 PM Jakub Narębski <jnareb@gmail.com> wrote:
>>>> W dniu 30.09.2016 o 18:14, Konstantin Khomoutov pisze:
>>>>
>>>>> The "It Will Never Work in Theory" blog has just posted a summary of a
>>>>> study which tried to identify shortcomings in the design of Git.
>>>>>
>>>>> In the hope it might be interesting, I post this summary here.
>>>>> URL: http://neverworkintheory.org/2016/09/30/rethinking-git.html
>>>>
>>>> I will comment on the article itself, not just on the summary.
>>>>
>>>> | 2.2 Git
>>>> [...]
>>>> | But tracked files cannot be ignored; to ignore a tracked file
>>>> | one has to mark it as “assume unchanged.” This “assume
>>>> | unchanged” file will not be recognized by add; to make it
>>>> | tracked again this marking has to be removed.
[...]
>> Yes, this is true that users may want to be able to ignore changes to
>> tracked files (commit with dirty tree), but using `assume-unchanged` is
>> wrong and dangerous solution.  Unfortunately the advice to use it is
>> surprisingly pervasive.  I would thank you to not further this error.
>
> Ok, I added a footnote in the paper when we first mention assume unchanged
> that says:
>
> Assume unchanged was intended to be used as a performance optimization but
> has since been appropriated by users as a way to ignore tracked files. The
> current advice is to use the “skip worktree” marking instead
>
> This should prompt readers to look into skip worktree next time they want to
> ignore tracked files. I don't think people reading the paper are doing so to
> learn Git but at least it should contribute to not furthering the error.

Thank you very much.

The problem with "assume-unchanged" is that by using it to ignore
changes to tracked files you are lying to Git (telling it 'assume this
is unchanged' while changing it), and can lead to DATA LOSS, that
is to losing those changes.

[...]
>>>> [...]
>>>> | The problem
>>>> | is the lack of connection between this purpose and the highlevel
>>>> | purposes for version control, which suggests that the
>>>> | introduction of stashing might be to patch flaws in the design
>>>> | of Git and not to satisfy a requirement of version control.
>>>>
>>>> Or the problem might be that you are missing some (maybe minor)
>>>> requirement of version control system. Just saying...
>>>
>>> What would that purpose be? and why would you say that's a
>>> high-level purpose for version control and not one that's
>>> git-specific?
>>
>> The stash (or rather its equivalent) is not something Git specific.
>> It is present also in other version control systems, among others:
>>
>> * Mercurial: as 'shelve' extension (in core since 1.8)
>> * Bazaar: as 'bzr shelve' command
>> * Fossil: as 'fossil stash' command (with subcommands)
>> * Subversion: Shelve planned for 1.10 (2017?)
>
> Do these other VCSs have the same "Switching branches" misfit? Do you
> usually need to stash if you want to switch with uncommitted changes? I know
> Mercurial has the same problem since ``bookmarks'' are like Git branches, so
> it makes sense for them to have added something like stashing (if otherwise
> switching with uncommitted changes would be very difficult).

I suspect that all those are inspired by each other, and that
they all use 'uncommitted changes are not tied to a branch'
paradigm, which allows for creating a branch for changes
after a fact (when it turns out that it would take more than
one commit to implement the feature) quite easy.

>> I would say that 'stash' could be considered about isolating work on
>> different features, different sub-branch sized parallel work.

Note that 'isolating work' is missing from your list of purposes
of a version control system; though it is fairly obvious.

>
> That sounds a lot like having independent lines of development, which is
> what branches are supposed to be for

Those are sub-commit changes. Branches are composed of
commits. But I agree that this may be a bit of a stretch in
trying to find a high-level purpose for stash (rather than it being
a convenience feature). As I said below...

>> But it might be that stash doesn't have connection with highlevel
>> purposes for version control, and that it is purely convenience
>> feature.  Just playing the role of Advocatus Diaboli (important in
>> scientific works, isn' it?)...

[...]

>>>> | 7. Gitless
[...]
>>>> |  Also, there
>>>> | is no possible way of getting in a “detached head” state; at
>>>> | any time, the user is always working on some branch (the
>>>> | “current” branch). Head is a per-branch reference to the last
>>>> | commit of the branch.
[...]
>>>> [...] during some long lived multi-step operations, like bisect
>>>> or interactive rebase, you are not really on any branch,
>>>
>>> In Gitless we don't have bisect but for rebase (fuse in Gitless) we
>>> record the current branch.
>>
>> No bisect?  This is very useful feature.  Though it might be done
>> without detached HEAD, but with specialized pseudo-branch 'bisect' (as
>> it was done in earlier versions of Git, or maybe even now).
>>
>> Anyway, for [interactive] rebase / transplant / graft / fuse you need
>> to be able to abort an operation and return to the state before
>> staring rebase.  Though you can or do solve this by remembering
>> the starting position.
>
> Yes, Gitless remembers the starting position. We should be able to get
> bisect working too in the same way. Internally, the head is detached but
> that's irrelevant to the user. As far as the user is concerned she's still
> working on the current branch.

There are quite a few problems with "remember the starting position"
approach. For one, the rebase / fuse operation should be recorded as
whole in the branch reflog (assuming that you implement this feature).
Working on a branch would ordinarily mean that all those intermediate
steps would be recorded (well, they are, but in separate reflog, namely
HEAD reflog).

The second issue is that you wouldn't want for your partially done rebase
to be visible; for example, you would want for 'git push' to not include
partial work (which might get abandoned).

I suppose all this can be solved without user-visible detached HEAD...


I have one more comment and one more issue about the article in
general.

First, while the entry into a list of version control systems (or even
interfaces to them) is hard, among others because of network effects,
it should be much easier to try to come up with a GUI or IDE plugin
starting from the same principles. Also with GUI there is not much
problem if you don;t implement everything; users would just fall back
on command line of underlying version control system.

Second, I think at least some of the concepts phase would not be
possible when Git was starting to be created. At the beginning, we
didn't know much about how distributed version control systems would
be used. For example, the very useful "topic branch" workflow was
not even imagined. Mercurial, which was created in parallel and at
the same time as Git, started with "clone to create a new branch"
paradigm!  Unfortunately the curse of "worse is better" is often many
misfits in paid for lots of power.

Best regards,
-- 
Jakub Narębski

^ permalink raw reply

* Re: What's cooking in git.git (Oct 2016, #02; Thu, 6)
From: Kevin Daudt @ 2016-10-07 17:54 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git
In-Reply-To: <xmqqzimggljy.fsf@gitster.mtv.corp.google.com>

On Fri, Oct 07, 2016 at 09:40:01AM -0700, Junio C Hamano wrote:
> Kevin Daudt <me@ikke.info> writes:
> 
> > Just wondering why the topic "kd/mailinfo-quoted-string (2016-09-28) 2
> > commits" is not listed anymore. Previous what's cooking said it was
> > merged to "next".
> 
> Thanks for your contribution.
> 
> The topic was listed as graduated to 'master' in issue #1 of this
> month:
> 
>     http://public-inbox.org/git/<xmqqtwct3w0p.fsf@gitster.mtv.corp.google.com>
> 
> After a topic graduates, it will not be included in the report.

Ok, was confused then about what the state was. Thanks.

^ permalink raw reply

* Re: "Purposes, Concepts,Misfits, and a Redesign of Git" (a research paper)
From: Konstantin Khomoutov @ 2016-10-07 17:52 UTC (permalink / raw)
  To: Konstantin Khomoutov; +Cc: git
In-Reply-To: <20160930191413.002049b94b3908b15881b77f@domain007.com>

On Fri, 30 Sep 2016 19:14:13 +0300
Konstantin Khomoutov <kostix+git@007spb.ru> wrote:

> The "It Will Never Work in Theory" blog has just posted a summary of a
> study which tried to identify shortcomings in the design of Git.
> 
> In the hope it might be interesting, I post this summary here.
> URL: http://neverworkintheory.org/2016/09/30/rethinking-git.html

I think it would be cool if someone among subscribers could post a link
to our discussion thread [2] back onto that page.  Unfortunatrly that
requires a Disqus login which I don't have, so may be someone in
possession of such login could do that? ;-)

2. https://public-inbox.org/git/ce42f934-4a94-fa29-cff0-5ebb0f004eb5@gmail.com/T/#e95875b7940512b432ab2e29b3dd50ca448df9720

^ permalink raw reply

* Re: [PATCH/RFC] git.c: support "!!" aliases that do not move cwd
From: Jeff King @ 2016-10-07 17:50 UTC (permalink / raw)
  To: Johannes Sixt
  Cc: Duy Nguyen, Johannes Schindelin, Junio C Hamano, Git Mailing List
In-Reply-To: <0347de20-72a7-b384-389f-4b2ad5789973@kdbg.org>

On Fri, Oct 07, 2016 at 07:42:35PM +0200, Johannes Sixt wrote:

> Maybe it's time to aim for
> 
>   git config alias.d2u.shell \
>        'f() { git ls-files "$@" | xargs dos2unix; }; f'
>   git config alias.d2u.cdup false
>   git d2u *.c   # yada!

That would be nice. It would also allow "alias.foo_bar.shell"; right now
"alias.foo_bar" is forbidden because of the config syntax, which does
not allow underscores outside of the "subsection" name.

-Peff

^ permalink raw reply

* Re: [PATCH/RFC] git.c: support "!!" aliases that do not move cwd
From: Johannes Sixt @ 2016-10-07 17:42 UTC (permalink / raw)
  To: Duy Nguyen; +Cc: Johannes Schindelin, Junio C Hamano, Git Mailing List
In-Reply-To: <CACsJy8ASc7Fxm5XDHFiX9E+bQ8s1MtmEHfc7bZY4C-_GEQr0og@mail.gmail.com>

Am 07.10.2016 um 14:27 schrieb Duy Nguyen:
> On Fri, Oct 7, 2016 at 6:20 PM, Johannes Schindelin
> <Johannes.Schindelin@gmx.de> wrote:
>> Hi Junio,
>>
>> On Thu, 6 Oct 2016, Junio C Hamano wrote:
>>
>>> Nguyễn Thái Ngọc Duy  <pclouds@gmail.com> writes:
>>>
>>>> Throwing something at the mailing list to see if anybody is
>>>> interested.
>>>>
>>>> Current '!' aliases move cwd to $GIT_WORK_TREE first, which could make
>>>> handling path arguments hard because they are relative to the original
>>>> cwd. We set GIT_PREFIX to work around it, but I still think it's more
>>>> natural to keep cwd where it is.
>>>>
>>>> We have a way to do that now after 441981b (git: simplify environment
>>>> save/restore logic - 2016-01-26). It's just a matter of choosing the
>>>> right syntax. I'm going with '!!'. I'm not very happy with it. But I
>>>> do like this type of alias.
>>>
>>> I do not know why you are not happy with the syntax, but I
>>> personally think it brilliant, both the idea and the preliminary
>>> clean-up that made this possible with a simple patch like this.
>>
>> I guess he is not happy with it because "!!" is quite unintuitive a
>> construct. I know that *I* would have been puzzled by it, asking "What the
>> heck does this do?".
>
> Yep. And I wouldn't want to set a tradition for the next alias type
> '!!!'. There's no good choice to represent a new alias type with a
> leading symbol. This just occurred to me, however, what do you think
> about a new config group for it? With can have something like
> externalAlias.* (or some other name) that lives in parallel with
> alias.*. Then we don't need '!' (or '!!') at all.

Maybe it's time to aim for

   git config alias.d2u.shell \
        'f() { git ls-files "$@" | xargs dos2unix; }; f'
   git config alias.d2u.cdup false
   git d2u *.c   # yada!

-- Hannes


^ permalink raw reply

* Re: [PATCH 1/2] submodule add: extend force flag to add existing repos
From: Stefan Beller @ 2016-10-07 17:25 UTC (permalink / raw)
  To: Heiko Voigt
  Cc: Junio C Hamano, git@vger.kernel.org, Linus Torvalds, Jeff King
In-Reply-To: <20161007125239.GB61543@book.hvoigt.net>

On Fri, Oct 7, 2016 at 5:52 AM, Heiko Voigt <hvoigt@hvoigt.net> wrote:
> On Thu, Oct 06, 2016 at 01:11:20PM -0700, Junio C Hamano wrote:
>> Stefan Beller <sbeller@google.com> writes:
>>
>> > Currently the force flag in `git submodule add` takes care of possibly
>> > ignored files or when a name collision occurs.
>> >
>> > However there is another situation where submodule add comes in handy:
>> > When you already have a gitlink recorded, but no configuration was
>> > done (i.e. no .gitmodules file nor any entry in .git/config) and you
>> > want to generate these config entries. For this situation allow
>> > `git submodule add` to proceed if there is already a submodule at the
>> > given path in the index.
>
> Is it important that the submodule is in the index?

If it is not in the index, it already works.

> How about worktree?
> From the index entry alone we can not deduce the values anyway.

Right, but as of now this is the only show stopper, i.e.
* you have an existing repo? -> fine, it works with --force
* you even ignored that repo -> --force knows how to do it.
* you already have a gitlink -> Sorry, you're out of luck.

So that is why I stressed index in this commit message, as it is only about this
case.

>
> [1] http://public-inbox.org/git/%3C20160916141143.GA47240@book.hvoigt.net%3E/

Current situation:

> clone the submodule into a directory
> git submodule add --force
> git commit everything

works fine, but:

> clone the submodule into a directory
> git add <gitlink>
> git commit <gitlink> -m "Add submodule"
> # me: "Oh crap! I did forget the configuration."
> git submodule add --force <url> <gitlink>
> # Git: "It already exists in the index, I am not going to produce the config for you."

The last step is changed with this patch, as
it will just work fine then.

^ permalink raw reply

* Re: [PATCH 4/4] mergetool: honor -O<order-file>
From: Johannes Sixt @ 2016-10-07 17:16 UTC (permalink / raw)
  To: David Aguilar; +Cc: Git Mailing List, Junio C Hamano, Luis Gutierrez
In-Reply-To: <1475797679-32712-4-git-send-email-davvid@gmail.com>

Am 07.10.2016 um 01:47 schrieb David Aguilar:
> diff --git a/git-mergetool.sh b/git-mergetool.sh
> index 65696d8..9dca58b 100755
> --- a/git-mergetool.sh
> +++ b/git-mergetool.sh
> @@ -9,7 +9,7 @@
>  # at the discretion of Junio C Hamano.
>  #
>
> -USAGE='[--tool=tool] [--tool-help] [-y|--no-prompt|--prompt] [file to merge] ...'
> +USAGE='[--tool=tool] [--tool-help] [-y|--no-prompt|--prompt] [-O<order-file>] [file to merge] ...'
>  SUBDIRECTORY_OK=Yes
>  NONGIT_OK=Yes
>  OPTIONS_SPEC=
> @@ -390,6 +390,7 @@ print_noop_and_exit () {
>  main () {
>  	prompt=$(git config --bool mergetool.prompt)
>  	guessed_merge_tool=false
> +	order_file=
>
>  	while test $# != 0
>  	do
> @@ -419,6 +420,9 @@ main () {
>  		--prompt)
>  			prompt=true
>  			;;
> +		-O*)
> +			order_file="$1"
> +			;;
>  		--)
>  			shift
>  			break
> @@ -459,8 +463,14 @@ main () {
>  		fi
>  	fi
>
> +	if test -n "$order_file"
> +	then
> +		set -- "$order_file" -- "$@"
> +	else
> +		set -- -- "$@"
> +	fi
>  	files=$(git -c core.quotePath=false \
> -		diff --name-only --diff-filter=U -- "$@")
> +		diff --name-only --diff-filter=U "$@")

You can write this as

	files=$(git -c core.quotePath=false \
		diff --name-only --diff-filter=U \
		${order_file:+"$order_file"} -- "$@")

without the case distinction earlier. This construct is usually used to 
attach the option (-O) in front of the argument, but it is already 
included in the value; so, we use the construct only to avoid an empty 
argument when the option is unset and to get a quoted string when it is set.

>
>  	cd_to_toplevel
>
> diff --git a/t/t7610-mergetool.sh b/t/t7610-mergetool.sh
> index fb2aeef..0f9869a 100755
> --- a/t/t7610-mergetool.sh
> +++ b/t/t7610-mergetool.sh
> @@ -637,6 +637,33 @@ test_expect_success 'diff.orderFile configuration is honored' '
>  	test_cmp expect actual &&
>  	git reset --hard >/dev/null
>  '
> +
> +test_expect_success 'mergetool -Oorder-file is honored' '
> +	test_config diff.orderFile order-file &&
> +	test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
> +	test_config mergetool.myecho.trustExitCode true &&
> +	test_must_fail git merge order-file-side1 &&
> +	cat >expect <<-\EOF &&
> +		Merging:
> +		a
> +		b
> +	EOF
> +	git mergetool -O/dev/null --no-prompt --tool myecho |
> +	grep -A 2 Merging: >actual &&
> +	test_cmp expect actual &&
> +	git reset --hard >/dev/null 2>&1 &&
> +
> +	git config --unset diff.orderFile &&
> +	test_must_fail git merge order-file-side1 &&
> +	cat >expect <<-\EOF &&
> +		Merging:
> +		b
> +		a
> +	EOF
> +	git mergetool -Oorder-file --no-prompt --tool myecho |
> +	grep -A 2 Merging: >actual &&

grep -A again. Furthermore, you call git mergetool in the upstream of a 
pipe. This will ignore the exit status.

> +	test_cmp expect actual &&
> +	git reset --hard >/dev/null 2>&1
>  '

Ah, the earlier lone quote should have been added in this patch.

-- Hannes


^ permalink raw reply

* Re: [PATCH 3/4] mergetool: honor diff.orderFile
From: Johannes Sixt @ 2016-10-07 17:08 UTC (permalink / raw)
  To: David Aguilar; +Cc: Git Mailing List, Junio C Hamano, Luis Gutierrez
In-Reply-To: <1475797679-32712-3-git-send-email-davvid@gmail.com>

Am 07.10.2016 um 01:47 schrieb David Aguilar:
> @@ -606,4 +606,37 @@ test_expect_success MKTEMP 'temporary filenames are used with mergetool.writeToT
>  	git reset --hard master >/dev/null 2>&1
>  '
>
> +test_expect_success 'diff.orderFile configuration is honored' '
> +	test_config diff.orderFile order-file &&
> +	test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
> +	test_config mergetool.myecho.trustExitCode true &&
> +	echo b >order-file &&
> +	echo a >>order-file &&
> +	git checkout -b order-file-start master &&
> +	echo start >a &&
> +	echo start >b &&
> +	git add a b &&
> +	git commit -m start &&
> +	git checkout -b order-file-side1 order-file-start &&
> +	echo side1 >a &&
> +	echo side1 >b &&
> +	git add a b &&
> +	git commit -m side1 &&
> +	git checkout -b order-file-side2 order-file-start &&
> +	echo side2 >a &&
> +	echo side2 >b &&
> +	git add a b &&
> +	git commit -m side2 &&
> +	test_must_fail git merge order-file-side1 &&
> +	cat >expect <<-\EOF &&
> +		Merging:
> +		b
> +		a
> +	EOF
> +	git mergetool --no-prompt --tool myecho | grep -A 2 Merging: >actual &&

Is grep -A universally available?

> +	test_cmp expect actual &&
> +	git reset --hard >/dev/null
> +'
> +'

Two single-quotes?

> +
>  test_done
>

Otherwise the patch looks good.

-- Hannes


^ permalink raw reply

* [PATCH v2] l10n: de.po: translate 260 new messages
From: Ralf Thielow @ 2016-10-07 16:45 UTC (permalink / raw)
  To: git, matthias.ruester
  Cc: tr, jk, stimming, phillip.szelat, magnus.goerlitz, Ralf Thielow
In-Reply-To: <20161002165946.19656-1-ralf.thielow@gmail.com>

Translate 260 new message came from git.pot updates in 9fa976f (l10n:
git.pot: v2.10.0 round 1 (248 new, 56 removed)) and 5bd166d (l10n:
git.pot: v2.10.0 round 2 (12 new, 44 removed)).

Signed-off-by: Ralf Thielow <ralf.thielow@gmail.com>
---
 po/de.po | 783 ++++++++++++++++++++++++++++++++++-----------------------------
 1 file changed, 421 insertions(+), 362 deletions(-)

diff --git a/po/de.po b/po/de.po
index e1865c6ca..0755cdf6c 100644
--- a/po/de.po
+++ b/po/de.po
@@ -14,72 +14,60 @@ msgstr ""
 "Language: de\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:55
 #, c-format
 msgid "hint: %.*s\n"
 msgstr "Hinweis: %.*s\n"
 
 #: advice.c:83
-#, fuzzy
 msgid "Cherry-picking is not possible because you have unmerged files."
-msgstr ""
-"\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr "Cherry-Picken ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
 #: advice.c:85
-#, fuzzy
 msgid "Committing is not possible because you have unmerged files."
-msgstr ""
-"\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr "Committen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
 #: advice.c:87
-#, fuzzy
 msgid "Merging is not possible because you have unmerged files."
-msgstr ""
-"\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr "Mergen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
 #: advice.c:89
-#, fuzzy
 msgid "Pulling is not possible because you have unmerged files."
-msgstr ""
-"\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr "Pullen ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
 #: advice.c:91
-#, fuzzy
 msgid "Reverting is not possible because you have unmerged files."
-msgstr ""
-"\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr "Reverten ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
 #: advice.c:93
-#, fuzzy, c-format
+#, c-format
 msgid "It is not possible to %s because you have unmerged files."
-msgstr ""
-"\"pull\" ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
+msgstr "%s ist nicht möglich, weil Sie nicht zusammengeführte Dateien haben."
 
 #: advice.c:101
 msgid ""
 "Fix them up in the work tree, and then use 'git add/rm <file>'\n"
 "as appropriate to mark resolution and make a commit."
 msgstr ""
 "Korrigieren Sie dies im Arbeitsverzeichnis, und benutzen Sie\n"
 "dann 'git add/rm <Datei>', um die Auflösung entsprechend zu markieren\n"
 "und zu committen."
 
 #: advice.c:109
-#, fuzzy
 msgid "Exiting because of an unresolved conflict."
-msgstr "Beende wegen nicht abgeschlossenem Merge."
+msgstr "Beende wegen unaufgelöstem Konflikt."
 
 #: advice.c:114 builtin/merge.c:1181
 msgid "You have not concluded your merge (MERGE_HEAD exists)."
 msgstr "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert)."
 
 #: advice.c:116
 msgid "Please, commit your changes before merging."
 msgstr "Bitte committen Sie Ihre Änderungen, bevor Sie mergen."
 
 #: advice.c:117
 msgid "Exiting because of unfinished merge."
 msgstr "Beende wegen nicht abgeschlossenem Merge."
@@ -90,24 +78,38 @@ msgid ""
 "Note: checking out '%s'.\n"
 "\n"
 "You are in 'detached HEAD' state. You can look around, make experimental\n"
 "changes and commit them, and you can discard any commits you make in this\n"
 "state without impacting any branches by performing another checkout.\n"
 "\n"
 "If you want to create a new branch to retain commits you create, you may\n"
 "do so (now or later) by using -b with the checkout command again. Example:\n"
 "\n"
 "  git checkout -b <new-branch-name>\n"
 "\n"
 msgstr ""
+"Hinweis: Checke '%s' aus.\n"
+"\n"
+"Sie befinden sich im Zustand eines 'lösgelösten HEAD'. Sie können sich\n"
+"umschauen, experimentelle Änderungen vornehmen und diese committen, und\n"
+"Sie können alle möglichen Commits, die Sie in diesem Zustand machen,\n"
+"ohne Auswirkungen auf irgendeinen Branch verwerfen, indem Sie einen\n"
+"weiteren Checkout durchführen.\n"
+"\n"
+"Wenn Sie einen neuen Branch erstellen möchten, um Ihre erstellten Commits\n"
+"zu behalten, können Sie das (jetzt oder später) durch einen weiteren Checkout\n"
+"mit der Option -b tun. Beispiel:\n"
+"\n"
+"  git checkout -b <neuer-Branchname>\n"
+"\n"
 
 #: archive.c:12
 msgid "git archive [<options>] <tree-ish> [<path>...]"
 msgstr "git archive [<Optionen>] <Commit-Referenz> [<Pfad>...]"
 
 #: archive.c:13
 msgid "git archive --list"
 msgstr "git archive --list"
 
 #: archive.c:14
 msgid ""
 "git archive --remote <repo> [--exec <cmd>] [<options>] <tree-ish> [<path>...]"
@@ -185,165 +187,176 @@ msgstr "Repository"
 msgid "retrieve the archive from remote repository <repo>"
 msgstr "Archiv vom Remote-Repository <Repository> abrufen"
 
 #: archive.c:453 builtin/archive.c:92 builtin/notes.c:483
 msgid "command"
 msgstr "Programm"
 
 #: archive.c:454 builtin/archive.c:93
 msgid "path to the remote git-upload-archive command"
 msgstr "Pfad zum externen \"git-upload-archive\"-Programm"
 
 #: archive.c:461
-#, fuzzy
 msgid "Unexpected option --remote"
-msgstr "unerwarteter Modus $mod_dst"
+msgstr "Unerwartete Option --remote"
 
 #: archive.c:463
-#, fuzzy
 msgid "Option --exec can only be used together with --remote"
-msgstr ""
-"Die Option --ignore-missing kann nur zusammen mit --dry-run verwendet werden."
+msgstr "Die Option --exec kann nur zusammen mit --remote verwendet werden."
 
 #: archive.c:465
 msgid "Unexpected option --output"
-msgstr ""
+msgstr "Unerwartete Option --output"
 
 #: archive.c:487
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown archive format '%s'"
-msgstr "Unbekanntes %.*s Format %s"
+msgstr "Unbekanntes Archivformat '%s'"
 
 #: archive.c:494
-#, fuzzy, c-format
+#, c-format
 msgid "Argument not supported for format '%s': -%d"
-msgstr "Kann \"reflog\" für '%s' nicht durchführen: %s\n"
+msgstr "Argument für Format '%s' nicht unterstützt: -%d"
 
 #: attr.c:263
 msgid ""
 "Negative patterns are ignored in git attributes\n"
 "Use '\\!' for literal leading exclamation."
 msgstr ""
 "Verneinende Muster werden in Git-Attributen ignoriert.\n"
 "Benutzen Sie '\\!' für führende Ausrufezeichen."
 
 #: bisect.c:441
-#, fuzzy, c-format
+#, c-format
 msgid "Could not open file '%s'"
-msgstr "Konnte '%s' nicht öffnen"
+msgstr "Konnte Datei '%s' nicht öffnen"
 
 #: bisect.c:446
-#, fuzzy, c-format
+#, c-format
 msgid "Badly quoted content in file '%s': %s"
-msgstr "Notizinhalte in einer Datei"
+msgstr "Ungültiger Inhalt bzgl. Anführungsstriche in Datei '%s': %s"
 
 #: bisect.c:655
-#, fuzzy, c-format
+#, c-format
 msgid "We cannot bisect more!\n"
-msgstr "keine binäre Suche im Gange"
+msgstr "Keine binäre Suche mehr möglich!\n"
 
 #: bisect.c:708
-#, fuzzy, c-format
+#, c-format
 msgid "Not a valid commit name %s"
-msgstr "%s ist kein gültiger Objekt-Name"
+msgstr "%s ist kein gültiger Commit-Name"
 
 #: bisect.c:732
 #, c-format
 msgid ""
 "The merge base %s is bad.\n"
 "This means the bug has been fixed between %s and [%s].\n"
 msgstr ""
+"Die Merge-Basis %s ist fehlerhaft.\n"
+"Das bedeutet, der Fehler wurde zwischen %s und [%s] behoben.\n"
 
 #: bisect.c:737
 #, c-format
 msgid ""
 "The merge base %s is new.\n"
 "The property has changed between %s and [%s].\n"
 msgstr ""
+"Die Merge-Basis %s ist neu.\n"
+"Das bedeutet, die Eigenschaft hat sich zwischen %s und [%s] geändert.\n"
 
 #: bisect.c:742
 #, c-format
 msgid ""
 "The merge base %s is %s.\n"
 "This means the first '%s' commit is between %s and [%s].\n"
 msgstr ""
+"Die Merge-Basis %s ist %s.\n"
+"Das bedeutet, der erste '%s' Commit befindet sich zwischen %s und [%s]\n"
 
 #: bisect.c:750
 #, c-format
 msgid ""
 "Some %s revs are not ancestor of the %s rev.\n"
 "git bisect cannot work properly in this case.\n"
 "Maybe you mistook %s and %s revs?\n"
 msgstr ""
+"Manche %s Commits sind keine Vorgänger des %s Commits.\n"
+"git bisect kann in diesem Fall nicht richtig arbeiten.\n"
+"Vielleicht verwechselten Sie %s und %s Commits?\n"
 
 #: bisect.c:763
 #, c-format
 msgid ""
 "the merge base between %s and [%s] must be skipped.\n"
 "So we cannot be sure the first %s commit is between %s and %s.\n"
 "We continue anyway."
 msgstr ""
+"Die Merge-Basis zwischen %s und [%s] muss ausgelassen werden.\n"
+"Es kann daher nicht sichergestellt werden, dass sich der\n"
+"erste %s Commit zwischen %s und %s befindet.\n"
+"Es wird dennoch fortgesetzt."
 
 #: bisect.c:798
 #, c-format
 msgid "Bisecting: a merge base must be tested\n"
-msgstr ""
+msgstr "binäre Suche: eine Merge-Basis muss geprüft werden\n"
 
 #: bisect.c:849
-#, fuzzy, c-format
+#, c-format
 msgid "a %s revision is needed"
-msgstr "%.*s ist zum Commit vorgemerkt"
+msgstr "ein %s Commit wird benötigt"
 
 #: bisect.c:866 builtin/notes.c:174 builtin/tag.c:248
 #, c-format
 msgid "could not create file '%s'"
 msgstr "konnte Datei '%s' nicht erstellen"
 
 #: bisect.c:917
-#, fuzzy, c-format
+#, c-format
 msgid "could not read file '%s'"
-msgstr "Konnte Log-Datei '%s' nicht lesen"
+msgstr "Konnte Datei '%s' nicht lesen"
 
 #: bisect.c:947
-#, fuzzy
 msgid "reading bisect refs failed"
-msgstr "Hinzufügen von Dateien fehlgeschlagen"
+msgstr "Lesen von Referenzen für binäre Suche fehlgeschlagen"
 
 #: bisect.c:967
-#, fuzzy, c-format
+#, c-format
 msgid "%s was both %s and %s\n"
-msgstr "%s folgt sowohl %s als auch %s"
+msgstr "%s war sowohl %s als auch %s\n"
 
 #: bisect.c:975
 #, c-format
 msgid ""
 "No testable commit found.\n"
 "Maybe you started with bad path parameters?\n"
 msgstr ""
+"Kein testbarer Commit gefunden.\n"
+"Vielleicht starteten Sie mit falschen Pfad-Parametern?\n"
 
 #: bisect.c:994
 #, c-format
 msgid "(roughly %d step)"
 msgid_plural "(roughly %d steps)"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "(ungefähr %d Schritt)"
+msgstr[1] "(ungefähr %d Schritte)"
 
 #. TRANSLATORS: the last %s will be replaced with
 #. "(roughly %d steps)" translation
 #: bisect.c:998
 #, c-format
 msgid "Bisecting: %d revision left to test after this %s\n"
 msgid_plural "Bisecting: %d revisions left to test after this %s\n"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "binäre Suche: danach noch %d Commit zum Testen übrig %s\n"
+msgstr[1] "binäre Suche: danach noch %d Commits zum Testen übrig %s\n"
 
 #: branch.c:53
 #, c-format
 msgid ""
 "\n"
 "After fixing the error cause you may try to fix up\n"
 "the remote tracking information by invoking\n"
 "\"git branch --set-upstream-to=%s%s%s\"."
 msgstr ""
 "\n"
 "Nachdem Sie die Fehlerursache behoben haben, können Sie\n"
 "die Tracking-Informationen mit\n"
@@ -571,120 +584,117 @@ msgid "could not parse %s"
 msgstr "konnte %s nicht parsen"
 
 #: commit.c:42
 #, c-format
 msgid "%s %s is not a commit!"
 msgstr "%s %s ist kein Commit!"
 
 #: compat/obstack.c:406 compat/obstack.c:408
 msgid "memory exhausted"
 msgstr "Speicher verbraucht"
 
 #: config.c:516
-#, fuzzy, c-format
+#, c-format
 msgid "bad config line %d in blob %s"
-msgstr "Zeile %d in Konfiguration %s %s ist ungültig."
+msgstr "Ungültige Konfigurationszeile %d in Blob %s"
 
 #: config.c:520
-#, fuzzy, c-format
+#, c-format
 msgid "bad config line %d in file %s"
-msgstr "Zeile %d in Konfiguration %s %s ist ungültig."
+msgstr "Ungültige Konfigurationszeile %d in Datei %s"
 
 #: config.c:524
-#, fuzzy, c-format
+#, c-format
 msgid "bad config line %d in standard input"
-msgstr "Zeile %d in Konfiguration %s %s ist ungültig."
+msgstr "Ungültige Konfigurationszeile %d in Standard-Eingabe"
 
 #: config.c:528
-#, fuzzy, c-format
+#, c-format
 msgid "bad config line %d in submodule-blob %s"
-msgstr "Zeile %d in Konfiguration %s %s ist ungültig."
+msgstr "Ungültige Konfigurationszeile %d in Submodul-Blob %s"
 
 #: config.c:532
-#, fuzzy, c-format
+#, c-format
 msgid "bad config line %d in command line %s"
-msgstr "Zeile %d in Konfiguration %s %s ist ungültig."
+msgstr "Ungültige Konfigurationszeile %d in Kommandozeile %s"
 
 #: config.c:536
-#, fuzzy, c-format
+#, c-format
 msgid "bad config line %d in %s"
-msgstr "Zeile %d in Konfiguration %s %s ist ungültig."
+msgstr "Ungültige Konfigurationszeile %d in %s"
 
 #: config.c:655
-#, fuzzy
 msgid "out of range"
-msgstr "Kein Commit-Bereich."
+msgstr "Außerhalb des Bereichs"
 
 #: config.c:655
-#, fuzzy
 msgid "invalid unit"
-msgstr "Ungültiger Objekt-Typ %s"
+msgstr "Ungültige Einheit"
 
 #: config.c:661
-#, fuzzy, c-format
+#, c-format
 msgid "bad numeric config value '%s' for '%s': %s"
 msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s': %s"
 
 #: config.c:666
-#, fuzzy, c-format
+#, c-format
 msgid "bad numeric config value '%s' for '%s' in blob %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in %s %s: %s"
+msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Blob %s: %s"
 
 #: config.c:669
-#, fuzzy, c-format
+#, c-format
 msgid "bad numeric config value '%s' for '%s' in file %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in %s %s: %s"
+msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Datei %s: %s"
 
 #: config.c:672
-#, fuzzy, c-format
+#, c-format
 msgid "bad numeric config value '%s' for '%s' in standard input: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in %s %s: %s"
+msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Standard-Eingabe: %s"
 
 #: config.c:675
-#, fuzzy, c-format
+#, c-format
 msgid "bad numeric config value '%s' for '%s' in submodule-blob %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in %s %s: %s"
+msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Submodul-Blob %s: %s"
 
 #: config.c:678
-#, fuzzy, c-format
+#, c-format
 msgid "bad numeric config value '%s' for '%s' in command line %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in %s %s: %s"
+msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in Befehlszeile %s: %s"
 
 #: config.c:681
-#, fuzzy, c-format
+#, c-format
 msgid "bad numeric config value '%s' for '%s' in %s: %s"
-msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in %s %s: %s"
+msgstr "Ungültiger numerischer Wert '%s' für Konfiguration '%s' in %s: %s"
 
 #: config.c:768
 #, c-format
 msgid "failed to expand user dir in: '%s'"
 msgstr "Fehler beim Erweitern des Nutzerverzeichnisses in: '%s'"
 
 #: config.c:849 config.c:860
 #, c-format
 msgid "bad zlib compression level %d"
 msgstr "ungültiger zlib Komprimierungsgrad %d"
 
 #: config.c:978
 #, c-format
 msgid "invalid mode for object creation: %s"
 msgstr "Ungültiger Modus für Objekterstellung: %s"
 
 #: config.c:1312
 msgid "unable to parse command-line config"
 msgstr ""
 "Konnte die über die Befehlszeile angegebene Konfiguration nicht parsen."
 
 #: config.c:1362
-#, fuzzy
 msgid "unknown error occurred while reading the configuration files"
 msgstr ""
 "Es trat ein unbekannter Fehler beim Lesen der Konfigurationsdateien auf."
 
 #: config.c:1716
 #, c-format
 msgid "unable to parse '%s' from command-line config"
 msgstr ""
 "Konnte Wert '%s' aus der über die Befehlszeile angegebenen Konfiguration\n"
 "nicht parsen."
 
 #: config.c:1718
@@ -854,27 +864,26 @@ msgstr "Fehler beim Sammeln von Namen und Informationen zum Kernel"
 
 #: dir.c:1942
 msgid "Untracked cache is disabled on this system or location."
 msgstr ""
 "Cache für unversionierte Dateien ist auf diesem System oder\n"
 "für dieses Verzeichnis deaktiviert."
 
 #: gpg-interface.c:178
 msgid "gpg failed to sign the data"
 msgstr "gpg beim Signieren der Daten fehlgeschlagen"
 
 #: gpg-interface.c:208
-#, fuzzy
 msgid "could not create temporary file"
-msgstr "konnte temporäre Datei '%s' nicht erstellen"
+msgstr "konnte temporäre Datei nicht erstellen"
 
 #: gpg-interface.c:210
 #, c-format
 msgid "failed writing detached signature to '%s'"
 msgstr "Fehler beim Schreiben der losgelösten Signatur nach '%s'"
 
 #: grep.c:1792
 #, c-format
 msgid "'%s': unable to read %s"
 msgstr "'%s': konnte %s nicht lesen"
 
 #: grep.c:1809 builtin/clone.c:382 builtin/diff.c:84 builtin/rm.c:155
@@ -1019,32 +1028,32 @@ msgstr "verweigere, da unversionierte Dateien in '%s' verloren gehen würden"
 
 #: merge-recursive.c:796
 #, c-format
 msgid "cannot read object %s '%s'"
 msgstr "kann Objekt %s '%s' nicht lesen"
 
 #: merge-recursive.c:798
 #, c-format
 msgid "blob expected for %s '%s'"
 msgstr "Blob erwartet für %s '%s'"
 
 #: merge-recursive.c:822
-#, fuzzy, c-format
+#, c-format
 msgid "failed to open '%s': %s"
-msgstr "Fehler beim Öffnen von '%s'"
+msgstr "Fehler beim Öffnen von '%s': %s"
 
 #: merge-recursive.c:833
-#, fuzzy, c-format
+#, c-format
 msgid "failed to symlink '%s': %s"
-msgstr "Fehler beim Erstellen einer symbolischen Verknüpfung für '%s'"
+msgstr "Fehler beim Erstellen einer symbolischen Verknüpfung für '%s': %s"
 
 #: merge-recursive.c:838
 #, c-format
 msgid "do not know what to do with %06o %s '%s'"
 msgstr "weiß nicht was mit %06o %s '%s' zu machen ist"
 
 #: merge-recursive.c:978
 msgid "Failed to execute internal merge"
 msgstr "Fehler bei Ausführung des internen Merges"
 
 #: merge-recursive.c:982
 #, c-format
@@ -1697,28 +1706,26 @@ msgstr ""
 msgid ""
 "not sending a push certificate since the receiving end does not support --"
 "signed push"
 msgstr ""
 "kein Versand des \"push\"-Zertifikates, da die Gegenseite keinen signierten\n"
 "Versand (\"--signed push\") unterstützt"
 
 #: send-pack.c:425
 msgid "the receiving end does not support --atomic push"
 msgstr "die Gegenseite unterstützt keinen atomaren Versand (\"--atomic push\")"
 
 #: send-pack.c:430
-#, fuzzy
 msgid "the receiving end does not support push options"
-msgstr ""
-"die Gegenseite unterstützt keinen signierten Versand (\"--signed push\")"
+msgstr "die Gegenseite unterstützt keine Push-Optionen"
 
 #: sequencer.c:174
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
 "with 'git add <paths>' or 'git rm <paths>'"
 msgstr ""
 "nach Auflösung der Konflikte, markieren Sie die korrigierten Pfade\n"
 "mit 'git add <Pfade>' oder 'git rm <Pfade>'"
 
 #: sequencer.c:177
 msgid ""
 "after resolving the conflicts, mark the corrected paths\n"
@@ -1745,27 +1752,27 @@ msgstr ""
 "Ihre lokalen Änderungen würden durch den Cherry-Pick überschrieben werden."
 
 #: sequencer.c:210
 msgid "Your local changes would be overwritten by revert."
 msgstr "Ihre lokalen Änderungen würden durch den Revert überschrieben werden."
 
 #: sequencer.c:213
 msgid "Commit your changes or stash them to proceed."
 msgstr ""
 "Committen Sie Ihre Änderungen oder benutzen Sie \"stash\", um fortzufahren."
 
 #: sequencer.c:228
-#, fuzzy, c-format
+#, c-format
 msgid "%s: fast-forward"
-msgstr "Vorspulen erlauben"
+msgstr "%s: Vorspulen"
 
 #. TRANSLATORS: %s will be "revert" or "cherry-pick"
 #: sequencer.c:303
 #, c-format
 msgid "%s: Unable to write new index file"
 msgstr "%s: Konnte neue Index-Datei nicht schreiben"
 
 #: sequencer.c:321
 msgid "Could not resolve HEAD commit\n"
 msgstr "Konnte Commit von HEAD nicht auflösen\n"
 
 #: sequencer.c:341
@@ -1829,44 +1836,38 @@ msgstr "leere Menge von Commits übergeben"
 
 #: sequencer.c:641
 #, c-format
 msgid "git %s: failed to read the index"
 msgstr "git %s: Fehler beim Lesen des Index"
 
 #: sequencer.c:645
 #, c-format
 msgid "git %s: failed to refresh the index"
 msgstr "git %s: Fehler beim Aktualisieren des Index"
 
 #: sequencer.c:705
-#, fuzzy
 msgid "Cannot revert during another revert."
-msgstr "Kann Zustand des Arbeitsverzeichnisses nicht aufzeichnen"
+msgstr "Kann Revert nicht während eines anderen Reverts ausführen."
 
 #: sequencer.c:706
-#, fuzzy
 msgid "Cannot revert during a cherry-pick."
-msgstr ""
-"Kann keinen Teil-Commit durchführen, während \"cherry-pick\" im Gange ist."
+msgstr "Kann Revert nicht während eines Cherry-Picks ausführen."
 
 #: sequencer.c:709
-#, fuzzy
 msgid "Cannot cherry-pick during a revert."
-msgstr "kein \"cherry-pick\" oder \"revert\" im Gang"
+msgstr "Kann Cherry-Pick nicht während eines Reverts ausführen."
 
 #: sequencer.c:710
-#, fuzzy
 msgid "Cannot cherry-pick during another cherry-pick."
-msgstr ""
-"Kann keinen Teil-Commit durchführen, während \"cherry-pick\" im Gange ist."
+msgstr "Kann Cherry-Pick nicht während eines anderen Cherry-Picks ausführen."
 
 #: sequencer.c:732
 #, c-format
 msgid "Could not parse line %d."
 msgstr "Konnte Zeile %d nicht parsen."
 
 #: sequencer.c:737
 msgid "No commits parsed."
 msgstr "Keine Commits geparst."
 
 #: sequencer.c:749
 #, c-format
@@ -1958,87 +1959,100 @@ msgid "%s: bad revision"
 msgstr "%s: ungültiger Commit"
 
 #: sequencer.c:1102
 msgid "Can't revert as initial commit"
 msgstr "Kann nicht als allerersten Commit einen Revert ausführen."
 
 #: setup.c:160
 #, c-format
 msgid ""
 "%s: no such path in the working tree.\n"
 "Use 'git <command> -- <path>...' to specify paths that do not exist locally."
 msgstr ""
+"%s: kein solcher Pfad im Arbeitsverzeichnis.\n"
+"Benutzen Sie 'git <Befehl> -- <Pfad>...' zur Angabe von Pfaden, die lokal\n"
+"nicht existieren."
 
 #: setup.c:173
 #, c-format
 msgid ""
 "ambiguous argument '%s': unknown revision or path not in the working tree.\n"
 "Use '--' to separate paths from revisions, like this:\n"
 "'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
+"mehrdeutiges Argument '%s': unbekannter Commit oder Pfad existiert nicht\n"
+"im Arbeitsverzeichnis\n"
+"Benutzen Sie '--', um Pfade und Commits zu trennen, ähnlich wie:\n"
+"'git <Befehl> [<Commit>...] -- [<Datei>...]'"
 
 #: setup.c:223
 #, c-format
 msgid ""
 "ambiguous argument '%s': both revision and filename\n"
 "Use '--' to separate paths from revisions, like this:\n"
 "'git <command> [<revision>...] -- [<file>...]'"
 msgstr ""
+"mehrdeutiges Argument '%s': sowohl Commit als auch Dateiname\n"
+"Benutzen Sie '--', um Pfade und Commits zu trennen, ähnlich wie:\n"
+"'git <Befehl> [<Commit>...] -- [<Datei>...]'"
 
 #: setup.c:248 builtin/apply.c:3362 builtin/apply.c:3373 builtin/apply.c:3419
 #, c-format
 msgid "failed to read %s"
 msgstr "Fehler beim Lesen von %s"
 
 #: setup.c:468
 #, c-format
 msgid "Expected git repo version <= %d, found %d"
 msgstr "Erwartete Git-Repository-Version <= %d, %d gefunden"
 
 #: setup.c:476
 msgid "unknown repository extensions found:"
 msgstr "Unbekannte Repository-Erweiterungen gefunden:"
 
 #: setup.c:762
 #, c-format
 msgid "Not a git repository (or any of the parent directories): %s"
-msgstr ""
+msgstr "Kein Git-Repository (oder irgendein Elternverzeichnis): %s"
 
 #: setup.c:764 setup.c:915 builtin/index-pack.c:1641
 msgid "Cannot come back to cwd"
 msgstr "Kann nicht zurück zu Arbeitsverzeichnis wechseln"
 
 #: setup.c:845
-#, fuzzy
 msgid "Unable to read current working directory"
-msgstr "Konnte aktuelles Arbeitsverzeichnis nicht bekommen."
+msgstr "Konnte aktuelles Arbeitsverzeichnis nicht lesen."
 
 #: setup.c:920
 #, c-format
 msgid ""
 "Not a git repository (or any parent up to mount point %s)\n"
 "Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."
 msgstr ""
+"Kein Git-Repository (oder irgendein Elternverzeichnis bis zum Einhängepunkt %s)\n"
+"Stoppe bei Dateisystemgrenze (GIT_DISCOVERY_ACROSS_FILESYSTEM nicht gesetzt)."
 
 #: setup.c:927
-#, fuzzy, c-format
+#, c-format
 msgid "Cannot change to '%s/..'"
-msgstr "kann nicht in Verzeichnis %s wechseln"
+msgstr "Kann nicht in Verzeichnis '%s/..' wechseln"
 
 #: setup.c:989
 #, c-format
 msgid ""
 "Problem with core.sharedRepository filemode value (0%.3o).\n"
 "The owner of files must always have read and write permissions."
 msgstr ""
+"Problem mit Wert für Dateimodus (0%.3o) von core.sharedRepository.\n"
+"Der Besitzer der Dateien muss immer Lese- und Schreibrechte haben."
 
 #: sha1_file.c:1046
 msgid "offset before end of packfile (broken .idx?)"
 msgstr "Offset vor Ende der Packdatei (fehlerhafte Indexdatei?)"
 
 #: sha1_file.c:2434
 #, c-format
 msgid "offset before start of pack index for %s (corrupt index?)"
 msgstr "Offset vor Beginn des Pack-Index für %s (beschädigter Index?)"
 
 #: sha1_file.c:2438
 #, c-format
@@ -2150,109 +2164,121 @@ msgid "file %s is not writable by user"
 msgstr "Datei %s ist vom Benutzer nicht beschreibbar."
 
 #: trailer.c:873
 msgid "could not open temporary file"
 msgstr "konnte temporäre Datei '%s' nicht öffnen"
 
 #: trailer.c:912
 #, c-format
 msgid "could not rename temporary file to %s"
 msgstr "konnte temporäre Datei nicht zu %s umbenennen"
 
 #: transport.c:62
-#, fuzzy, c-format
+#, c-format
 msgid "Would set upstream of '%s' to '%s' of '%s'\n"
-msgstr "Konnte Sektion '%s' in Konfiguration nicht nach '%s' umbenennen"
+msgstr "Würde Upstream-Branch von '%s' zu '%s' von '%s' setzen\n"
 
 #: transport.c:151
-#, fuzzy, c-format
+#, c-format
 msgid "transport: invalid depth option '%s'"
-msgstr "Ungültige Option für --decorate: %s"
+msgstr "transport: ungültige --depth Option '%s'"
 
 #: transport.c:771
 #, c-format
 msgid ""
 "The following submodule paths contain changes that can\n"
 "not be found on any remote:\n"
 msgstr ""
+"Die folgenden Submodul-Pfade enthalten Änderungen, die in keinem\n"
+"Remote-Repository gefunden wurden:\n"
 
 #: transport.c:775
 #, c-format
 msgid ""
 "\n"
 "Please try\n"
 "\n"
 "\tgit push --recurse-submodules=on-demand\n"
 "\n"
 "or cd to the path and use\n"
 "\n"
 "\tgit push\n"
 "\n"
 "to push them to a remote.\n"
 "\n"
 msgstr ""
+"\n"
+"Bitte versuchen Sie\n"
+"\n"
+"\tgit push --recurse-submodules=on-demand\n"
+"\n"
+"oder wechseln Sie in das Verzeichnis und benutzen Sie\n"
+"\n"
+"\tgit push\n"
+"\n"
+"zum Versenden zu einem Remote-Repository.\n"
+"\n"
 
 #: transport.c:783
-#, fuzzy
 msgid "Aborting."
-msgstr "Abbruch\n"
+msgstr "Abbruch."
 
 #: transport-helper.c:1041
 #, c-format
 msgid "Could not read ref %s"
 msgstr "Konnte Referenz %s nicht lesen."
 
 #: unpack-trees.c:64
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Your local changes to the following files would be overwritten by checkout:\n"
 "%%sPlease commit your changes or stash them before you switch branches."
 msgstr ""
 "Ihre lokalen Änderungen in den folgenden Dateien würden beim Auschecken\n"
 "überschrieben werden:\n"
-"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor Sie Branches "
+"%%sBitte committen oder stashen Sie Ihre Änderungen, bevor Sie Branches\n"
 "wechseln."
 
 #: unpack-trees.c:66
 #, c-format
 msgid ""
 "Your local changes to the following files would be overwritten by checkout:\n"
 "%%s"
 msgstr ""
 "Ihre lokalen Änderungen in den folgenden Dateien würden beim Auschecken\n"
 "überschrieben werden:\n"
 "%%s"
 
 #: unpack-trees.c:69
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Your local changes to the following files would be overwritten by merge:\n"
 "%%sPlease commit your changes or stash them before you merge."
 msgstr ""
 "Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
 "überschrieben werden:\n"
 "%%sBitte committen oder stashen Sie Ihre Änderungen, bevor sie mergen."
 
 #: unpack-trees.c:71
 #, c-format
 msgid ""
 "Your local changes to the following files would be overwritten by merge:\n"
 "%%s"
 msgstr ""
 "Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
 "überschrieben werden:\n"
 "%%s"
 
 #: unpack-trees.c:74
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Your local changes to the following files would be overwritten by %s:\n"
 "%%sPlease commit your changes or stash them before you %s."
 msgstr ""
 "Ihre lokalen Änderungen in den folgenden Dateien würden durch %s\n"
 "überschrieben werden:\n"
 "%%sBitte committen oder stashen Sie Ihre Änderungen, bevor Sie %s ausführen."
 
 #: unpack-trees.c:76
 #, c-format
 msgid ""
 "Your local changes to the following files would be overwritten by %s:\n"
@@ -2263,143 +2289,136 @@ msgstr ""
 
 #: unpack-trees.c:81
 #, c-format
 msgid ""
 "Updating the following directories would lose untracked files in it:\n"
 "%s"
 msgstr ""
 "Durch die Aktualisierung der folgenden Verzeichnisse würden unversionierte\n"
 "Dateien in diesen Verzeichnissen verloren gehen:\n"
 "%s"
 
 #: unpack-trees.c:85
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "The following untracked working tree files would be removed by checkout:\n"
 "%%sPlease move or remove them before you switch branches."
 msgstr ""
 "Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
 "den Checkout entfernt werden:\n"
 "%%sBitte verschieben oder entfernen Sie diese, bevor Sie Branches wechseln."
 
 #: unpack-trees.c:87
 #, c-format
 msgid ""
 "The following untracked working tree files would be removed by checkout:\n"
 "%%s"
 msgstr ""
 "Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
 "den\n"
 "Checkout entfernt werden:\n"
 "%%s"
 
 #: unpack-trees.c:90
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "The following untracked working tree files would be removed by merge:\n"
 "%%sPlease move or remove them before you merge."
 msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"Merge entfernt werden:\n"
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Merge entfernt werden:\n"
 "%%sBitte verschieben oder entfernen Sie diese, bevor sie mergen."
 
 #: unpack-trees.c:92
 #, c-format
 msgid ""
 "The following untracked working tree files would be removed by merge:\n"
 "%%s"
 msgstr ""
 "Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
 "den\n"
 "Merge entfernt werden:\n"
 "%%s"
 
 #: unpack-trees.c:95
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "The following untracked working tree files would be removed by %s:\n"
 "%%sPlease move or remove them before you %s."
 msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"%s entfernt werden:\n"
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den %s entfernt werden:\n"
 "%%sBitte verschieben oder entfernen Sie diese, bevor sie %s ausführen."
 
 #: unpack-trees.c:97
 #, c-format
 msgid ""
 "The following untracked working tree files would be removed by %s:\n"
 "%%s"
 msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"%s entfernt werden:\n"
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den %s entfernt werden:\n"
 "%%s"
 
 #: unpack-trees.c:102
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "The following untracked working tree files would be overwritten by "
 "checkout:\n"
 "%%sPlease move or remove them before you switch branches."
 msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"Checkout überschrieben werden:\n"
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Checkout überschrieben werden:\n"
 "%%sBitte verschieben oder entfernen Sie diese, bevor Sie Branches wechseln."
 
 #: unpack-trees.c:104
 #, c-format
 msgid ""
 "The following untracked working tree files would be overwritten by "
 "checkout:\n"
 "%%s"
 msgstr ""
 "Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
 "den\n"
 "Checkout überschrieben werden:\n"
 "%%s"
 
 #: unpack-trees.c:107
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "The following untracked working tree files would be overwritten by merge:\n"
 "%%sPlease move or remove them before you merge."
 msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"Merge überschrieben werden:\n"
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Merge überschrieben werden:\n"
 "%%sBitte verschieben oder entfernen Sie diese, bevor Sie mergen."
 
 #: unpack-trees.c:109
 #, c-format
 msgid ""
 "The following untracked working tree files would be overwritten by merge:\n"
 "%%s"
 msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"Merge überschrieben werden:\n"
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den Merge überschrieben werden:\n"
 "%%s"
 
 #: unpack-trees.c:112
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "The following untracked working tree files would be overwritten by %s:\n"
 "%%sPlease move or remove them before you %s."
 msgstr ""
-"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
-"den\n"
-"%s überschrieben werden:\n"
+"Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch\n"
+"den %s überschrieben werden:\n"
 "%%sBitte verschieben oder entfernen Sie diese, bevor sie %s ausführen."
 
 #: unpack-trees.c:114
 #, c-format
 msgid ""
 "The following untracked working tree files would be overwritten by %s:\n"
 "%%s"
 msgstr ""
 "Die folgenden unversionierten Dateien im Arbeitsverzeichnis würden durch "
 "den\n"
 "%s überschrieben werden:\n"
 "%%s"
@@ -2472,27 +2491,27 @@ msgstr "eine 'file:' URL darf keine Portnummer enthalten"
 msgid "invalid characters in host name"
 msgstr "Hostname enthält ungültige Zeichen"
 
 #: urlmatch.c:244 urlmatch.c:255
 msgid "invalid port number"
 msgstr "ungültige Portnummer"
 
 #: urlmatch.c:322
 msgid "invalid '..' path segment"
 msgstr "ungültiges '..' Pfadsegment"
 
 #: worktree.c:282
-#, fuzzy, c-format
+#, c-format
 msgid "failed to read '%s'"
-msgstr "Fehler beim Lesen von %s"
+msgstr "Fehler beim Lesen von '%s'"
 
 #: wrapper.c:222 wrapper.c:392
 #, c-format
 msgid "could not open '%s' for reading and writing"
 msgstr "Konnte '%s' nicht zum Lesen und Schreiben öffnen."
 
 #: wrapper.c:224 wrapper.c:394 builtin/am.c:778
 #, c-format
 msgid "could not open '%s' for writing"
 msgstr "Konnte '%s' nicht zum Schreiben öffnen."
 
 #: wrapper.c:226 wrapper.c:396 builtin/am.c:324 builtin/am.c:771
@@ -2682,29 +2701,26 @@ msgstr ""
 "Ändern Sie nicht die obige Zeile.\n"
 "Alles unterhalb von ihr wird entfernt."
 
 #: wt-status.c:950
 msgid "You have unmerged paths."
 msgstr "Sie haben nicht zusammengeführte Pfade."
 
 #: wt-status.c:953
 msgid "  (fix conflicts and run \"git commit\")"
 msgstr " (beheben Sie die Konflikte und führen Sie \"git commit\" aus)"
 
 #: wt-status.c:955
-#, fuzzy
 msgid "  (use \"git merge --abort\" to abort the merge)"
-msgstr ""
-"  (benutzen Sie \"git am --abort\", um den ursprünglichen Branch "
-"wiederherzustellen)"
+msgstr "  (benutzen Sie \"git merge --abort\", um den Merge abzubrechen)"
 
 #: wt-status.c:960
 msgid "All conflicts fixed but you are still merging."
 msgstr "Alle Konflikte sind behoben, aber Sie sind immer noch beim Merge."
 
 #: wt-status.c:963
 msgid "  (use \"git commit\" to conclude merge)"
 msgstr "  (benutzen Sie \"git commit\", um den Merge abzuschließen)"
 
 #: wt-status.c:973
 msgid "You are in the middle of an am session."
 msgstr "Eine \"am\"-Sitzung ist im Gange."
@@ -2984,25 +3000,25 @@ msgstr ""
 #, c-format
 msgid "nothing to commit\n"
 msgstr "nichts zu committen\n"
 
 #: wt-status.c:1557
 #, c-format
 msgid "nothing to commit (use -u to show untracked files)\n"
 msgstr ""
 "nichts zu committen (benutzen Sie die Option -u, um unversionierte Dateien "
 "anzuzeigen)\n"
 
 #: wt-status.c:1561
-#, fuzzy, c-format
+#, c-format
 msgid "nothing to commit, working tree clean\n"
 msgstr "nichts zu committen, Arbeitsverzeichnis unverändert\n"
 
 #: wt-status.c:1668
 msgid "Initial commit on "
 msgstr "Initialer Commit auf "
 
 #: wt-status.c:1672
 msgid "HEAD (no branch)"
 msgstr "HEAD (kein Branch)"
 
 #: wt-status.c:1701
@@ -3161,25 +3177,25 @@ msgstr "Hinzufügen von Dateien fehlgeschlagen"
 #: builtin/add.c:336
 msgid "-A and -u are mutually incompatible"
 msgstr "Die Optionen -A und -u sind zueinander inkompatibel."
 
 #: builtin/add.c:343
 msgid "Option --ignore-missing can only be used together with --dry-run"
 msgstr ""
 "Die Option --ignore-missing kann nur zusammen mit --dry-run verwendet werden."
 
 #: builtin/add.c:352
 #, c-format
 msgid "--chmod param '%s' must be either -x or +x"
-msgstr ""
+msgstr "--chmod Parameter '%s' muss entweder -x oder +x sein"
 
 #: builtin/add.c:367
 #, c-format
 msgid "Nothing specified, nothing added.\n"
 msgstr "Nichts spezifiziert, nichts hinzugefügt.\n"
 
 #: builtin/add.c:368
 #, c-format
 msgid "Maybe you wanted to say 'git add .'?\n"
 msgstr "Meinten Sie vielleicht 'git add .'?\n"
 
 #: builtin/add.c:373 builtin/check-ignore.c:172 builtin/checkout.c:279
@@ -4468,34 +4484,33 @@ msgstr "falsch benannten Branch '%s' umbenannt"
 #: builtin/branch.c:597
 #, c-format
 msgid "Branch renamed to %s, but HEAD is not updated!"
 msgstr "Branch umbenannt zu %s, aber HEAD ist nicht aktualisiert!"
 
 #: builtin/branch.c:604
 msgid "Branch is renamed, but update of config-file failed"
 msgstr ""
 "Branch ist umbenannt, aber die Aktualisierung der Konfigurationsdatei ist "
 "fehlgeschlagen."
 
 #: builtin/branch.c:620
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Please edit the description for the branch\n"
 "  %s\n"
 "Lines starting with '%c' will be stripped.\n"
 msgstr ""
-"\n"
-"Geben Sie eine Beschreibung für Tag\n"
+"Bitte ändern Sie die Beschreibung für den Branch\n"
 "  %s\n"
-"ein. Zeilen, die mit '%c' beginnen, werden ignoriert.\n"
+"Zeilen, die mit '%c' beginnen, werden entfernt.\n"
 
 #: builtin/branch.c:651
 msgid "Generic options"
 msgstr "Allgemeine Optionen"
 
 #: builtin/branch.c:653
 msgid "show hash and subject, give twice for upstream branch"
 msgstr "Hash und Betreff anzeigen; -vv: zusätzlich Upstream-Branch"
 
 #: builtin/branch.c:654
 msgid "suppress informational messages"
 msgstr "Informationsmeldungen unterdrücken"
@@ -6313,27 +6328,26 @@ msgstr "die angegebenen Dateien zusätzlich zum Commit vormerken"
 msgid "interactively add files"
 msgstr "interaktives Hinzufügen von Dateien"
 
 #: builtin/commit.c:1618
 msgid "interactively add changes"
 msgstr "interaktives Hinzufügen von Änderungen"
 
 #: builtin/commit.c:1619
 msgid "commit only specified files"
 msgstr "nur die angegebenen Dateien committen"
 
 #: builtin/commit.c:1620
-#, fuzzy
 msgid "bypass pre-commit and commit-msg hooks"
-msgstr "\"pre-commit hook\" umgehen"
+msgstr "Hooks pre-commit und commit-msg umgehen"
 
 #: builtin/commit.c:1621
 msgid "show what would be committed"
 msgstr "anzeigen, was committet werden würde"
 
 #: builtin/commit.c:1632
 msgid "amend previous commit"
 msgstr "vorherigen Commit ändern"
 
 #: builtin/commit.c:1633
 msgid "bypass post-rewrite hook"
 msgstr "\"post-rewrite hook\" umgehen"
@@ -6875,44 +6889,42 @@ msgstr "Refmap"
 
 #: builtin/fetch.c:131 builtin/pull.c:211
 msgid "specify fetch refmap"
 msgstr "Refmap für 'fetch' angeben"
 
 #: builtin/fetch.c:387
 msgid "Couldn't find remote ref HEAD"
 msgstr "Konnte Remote-Referenz von HEAD nicht finden."
 
 #: builtin/fetch.c:503
 #, c-format
 msgid "configuration fetch.output contains invalid value %s"
-msgstr ""
+msgstr "Konfiguration fetch.output enthält ungültigen Wert %s"
 
 #: builtin/fetch.c:592
 #, c-format
 msgid "object %s not found"
 msgstr "Objekt %s nicht gefunden"
 
 #: builtin/fetch.c:596
 msgid "[up to date]"
 msgstr "[aktuell]"
 
 #: builtin/fetch.c:609 builtin/fetch.c:689
 msgid "[rejected]"
 msgstr "[zurückgewiesen]"
 
 #: builtin/fetch.c:610
-#, fuzzy
 msgid "can't fetch in current branch"
-msgstr ""
-"! %-*s %-*s -> %s  (kann \"fetch\" im aktuellen Branch nicht ausführen)"
+msgstr "kann \"fetch\" im aktuellen Branch nicht ausführen"
 
 #: builtin/fetch.c:619
 msgid "[tag update]"
 msgstr "[Tag Aktualisierung]"
 
 #: builtin/fetch.c:620 builtin/fetch.c:653 builtin/fetch.c:669
 #: builtin/fetch.c:684
 msgid "unable to update local ref"
 msgstr "kann lokale Referenz nicht aktualisieren"
 
 #: builtin/fetch.c:639
 msgid "[new tag]"
@@ -6922,27 +6934,26 @@ msgstr "[neues Tag]"
 msgid "[new branch]"
 msgstr "[neuer Branch]"
 
 #: builtin/fetch.c:645
 msgid "[new ref]"
 msgstr "[neue Referenz]"
 
 #: builtin/fetch.c:684
 msgid "forced update"
 msgstr "Aktualisierung erzwungen"
 
 #: builtin/fetch.c:689
-#, fuzzy
 msgid "non-fast-forward"
-msgstr "(kein Vorspulen)"
+msgstr "kein Vorspulen"
 
 #: builtin/fetch.c:733
 #, c-format
 msgid "%s did not send all necessary objects\n"
 msgstr "%s hat nicht alle erforderlichen Objekte gesendet\n"
 
 #: builtin/fetch.c:753
 #, c-format
 msgid "reject %s because shallow roots are not allowed to be updated"
 msgstr ""
 "%s wurde zurückgewiesen, da Ursprungs-Commits von Repositoriesmit "
 "unvollständiger Historie (shallow) nicht aktualisiert werden dürfen."
@@ -7181,27 +7192,26 @@ msgstr "nur Konnektivität prüfen"
 msgid "enable more strict checking"
 msgstr "genauere Prüfung aktivieren"
 
 #: builtin/fsck.c:604
 msgid "write dangling objects in .git/lost-found"
 msgstr "unreferenzierte Objekte nach .git/lost-found schreiben"
 
 #: builtin/fsck.c:605 builtin/prune.c:107
 msgid "show progress"
 msgstr "Fortschrittsanzeige anzeigen"
 
 #: builtin/fsck.c:606
-#, fuzzy
 msgid "show verbose names for reachable objects"
-msgstr "unerreichbare Objekte anzeigen"
+msgstr "ausführliche Namen für erreichbare Objekte anzeigen"
 
 #: builtin/fsck.c:671
 msgid "Checking objects"
 msgstr "Prüfe Objekte"
 
 #: builtin/gc.c:25
 msgid "git gc [<options>]"
 msgstr "git gc [<Optionen>]"
 
 #: builtin/gc.c:72
 #, c-format
 msgid "Invalid %s: '%s'"
@@ -7748,27 +7758,27 @@ msgid "cannot open packfile '%s'"
 msgstr "Kann Paketdatei '%s' nicht öffnen"
 
 #: builtin/index-pack.c:333
 msgid "pack signature mismatch"
 msgstr "Paketsignatur stimmt nicht überein"
 
 #: builtin/index-pack.c:335
 #, c-format
 msgid "pack version %<PRIu32> unsupported"
 msgstr "Paketversion %<PRIu32> nicht unterstützt"
 
 #: builtin/index-pack.c:353
-#, fuzzy, c-format
+#, c-format
 msgid "pack has bad object at offset %<PRIuMAX>: %s"
-msgstr "Paket hat ein ungültiges Objekt bei Versatz %lu: %s"
+msgstr "Paket hat ein ungültiges Objekt bei Versatz %<PRIuMAX>: %s"
 
 #: builtin/index-pack.c:475
 #, c-format
 msgid "inflate returned %d"
 msgstr "Dekomprimierung gab %d zurück"
 
 #: builtin/index-pack.c:524
 msgid "offset value overflow for delta base object"
 msgstr "Wert für Versatz bei Differenzobjekt übergelaufen"
 
 #: builtin/index-pack.c:532
 msgid "delta base offset is out of bound"
@@ -7776,29 +7786,29 @@ msgstr ""
 "Wert für Versatz bei Differenzobjekt liegt außerhalb des gültigen Bereichs"
 
 #: builtin/index-pack.c:540
 #, c-format
 msgid "unknown object type %d"
 msgstr "Unbekannter Objekt-Typ %d"
 
 #: builtin/index-pack.c:571
 msgid "cannot pread pack file"
 msgstr "Kann Paketdatei %s nicht lesen"
 
 #: builtin/index-pack.c:573
-#, fuzzy, c-format
+#, c-format
 msgid "premature end of pack file, %<PRIuMAX> byte missing"
 msgid_plural "premature end of pack file, %<PRIuMAX> bytes missing"
-msgstr[0] "frühzeitiges Ende der Paketdatei, vermisse %lu Byte"
-msgstr[1] "frühzeitiges Ende der Paketdatei, vermisse %lu Bytes"
+msgstr[0] "frühzeitiges Ende der Paketdatei, vermisse %<PRIuMAX> Byte"
+msgstr[1] "frühzeitiges Ende der Paketdatei, vermisse %<PRIuMAX> Bytes"
 
 #: builtin/index-pack.c:599
 msgid "serious inflate inconsistency"
 msgstr "ernsthafte Inkonsistenz nach Dekomprimierung"
 
 #: builtin/index-pack.c:745 builtin/index-pack.c:751 builtin/index-pack.c:774
 #: builtin/index-pack.c:808 builtin/index-pack.c:817
 #, c-format
 msgid "SHA1 COLLISION FOUND WITH %s !"
 msgstr "SHA1 KOLLISION MIT %s GEFUNDEN !"
 
 #: builtin/index-pack.c:748 builtin/pack-objects.c:164
@@ -8028,42 +8038,42 @@ msgstr "%s existiert bereits"
 
 #: builtin/init-db.c:344
 #, c-format
 msgid "unable to handle file type %d"
 msgstr "kann nicht mit Dateityp %d umgehen"
 
 #: builtin/init-db.c:347
 #, c-format
 msgid "unable to move %s to %s"
 msgstr "Konnte %s nicht nach %s verschieben"
 
 #: builtin/init-db.c:402
-#, fuzzy, c-format
+#, c-format
 msgid "Reinitialized existing shared Git repository in %s%s\n"
-msgstr "%s%s Git-Repository in %s%s\n"
+msgstr "Bestehendes verteiltes Git-Repository in %s%s neuinitialisiert\n"
 
 #: builtin/init-db.c:403
-#, fuzzy, c-format
+#, c-format
 msgid "Reinitialized existing Git repository in %s%s\n"
-msgstr "%s%s Git-Repository in %s%s\n"
+msgstr "Bestehendes Git-Repository in %s%s neuinitialisiert\n"
 
 #: builtin/init-db.c:407
-#, fuzzy, c-format
+#, c-format
 msgid "Initialized empty shared Git repository in %s%s\n"
-msgstr "%s%s Git-Repository in %s%s\n"
+msgstr "Leeres verteiltes Git-Repository in %s%s initialisiert\n"
 
 #: builtin/init-db.c:408
-#, fuzzy, c-format
+#, c-format
 msgid "Initialized empty Git repository in %s%s\n"
-msgstr "%s%s Git-Repository in %s%s\n"
+msgstr "Leeres Git-Repository in %s%s initialisiert\n"
 
 #: builtin/init-db.c:455
 msgid ""
 "git init [-q | --quiet] [--bare] [--template=<template-directory>] [--"
 "shared[=<permissions>]] [<directory>]"
 msgstr ""
 "git init [-q | --quiet] [--bare] [--template=<Vorlagenverzeichnis>] [--"
 "shared[=<Berechtigungen>]] [<Verzeichnis>]"
 
 #: builtin/init-db.c:478
 msgid "permissions"
 msgstr "Berechtigungen"
@@ -8862,40 +8872,39 @@ msgstr "Kein Remote-Repository für den aktuellen Branch."
 msgid "No default upstream defined for the current branch."
 msgstr ""
 "Es ist kein Standard-Upstream-Branch für den aktuellen Branch definiert."
 
 #: builtin/merge.c:913
 #, c-format
 msgid "No remote-tracking branch for %s from %s"
 msgstr "Kein Remote-Tracking-Branch für %s von %s"
 
 #: builtin/merge.c:960
 #, c-format
 msgid "Bad value '%s' in environment '%s'"
-msgstr ""
+msgstr "Fehlerhafter Wert '%s' in Umgebungsvariable '%s'"
 
 #: builtin/merge.c:1034
 #, c-format
 msgid "could not close '%s'"
 msgstr "Konnte '%s' nicht schließen"
 
 #: builtin/merge.c:1061
-#, fuzzy, c-format
+#, c-format
 msgid "not something we can merge in %s: %s"
-msgstr "%s - nichts was wir zusammenführen können"
+msgstr "nichts was wir in %s zusammenführen können: %s"
 
 #: builtin/merge.c:1095
-#, fuzzy
 msgid "not something we can merge"
-msgstr "%s - nichts was wir zusammenführen können"
+msgstr "nichts was wir zusammenführen können"
 
 #: builtin/merge.c:1162
 msgid "There is no merge to abort (MERGE_HEAD missing)."
 msgstr "Es gibt keinen Merge zum Abbrechen (MERGE_HEAD fehlt)"
 
 #: builtin/merge.c:1178
 msgid ""
 "You have not concluded your merge (MERGE_HEAD exists).\n"
 "Please, commit your changes before you merge."
 msgstr ""
 "Sie haben Ihren Merge nicht abgeschlossen (MERGE_HEAD existiert).\n"
 "Bitte committen Sie Ihre Änderungen, bevor Sie den Merge ausführen."
@@ -8958,47 +8967,45 @@ msgid "Commit %s does not have a GPG signature."
 msgstr "Commit %s hat keine GPG-Signatur."
 
 #: builtin/merge.c:1296
 #, c-format
 msgid "Commit %s has a good GPG signature by %s\n"
 msgstr "Commit %s hat eine gültige GPG-Signatur von %s\n"
 
 #: builtin/merge.c:1358
 msgid "refusing to merge unrelated histories"
 msgstr "Verweigere den Merge von nicht zusammenhängenden Historien."
 
 #: builtin/merge.c:1367
-#, fuzzy
 msgid "Already up-to-date."
-msgstr "Bereits aktuell!"
+msgstr "Bereits aktuell."
 
 #: builtin/merge.c:1382
 #, c-format
 msgid "Updating %s..%s\n"
 msgstr "Aktualisiere %s..%s\n"
 
 #: builtin/merge.c:1419
 #, c-format
 msgid "Trying really trivial in-index merge...\n"
 msgstr "Probiere wirklich trivialen \"in-index\"-Merge ...\n"
 
 #: builtin/merge.c:1426
 #, c-format
 msgid "Nope.\n"
 msgstr "Nein.\n"
 
 #: builtin/merge.c:1451
-#, fuzzy
 msgid "Already up-to-date. Yeeah!"
-msgstr "Bereits aktuell!"
+msgstr "Bereits aktuell."
 
 #: builtin/merge.c:1457
 msgid "Not possible to fast-forward, aborting."
 msgstr "Vorspulen nicht möglich, breche ab."
 
 #: builtin/merge.c:1480 builtin/merge.c:1559
 #, c-format
 msgid "Rewinding the tree to pristine...\n"
 msgstr "Rücklauf des Verzeichnisses bis zum Ursprung ...\n"
 
 #: builtin/merge.c:1484
 #, c-format
@@ -9362,25 +9369,25 @@ msgid "git notes remove [<object>]"
 msgstr "git notes remove [<Objekt>]"
 
 #: builtin/notes.c:84
 msgid "git notes prune [<options>]"
 msgstr "git notes prune [<Optionen>]"
 
 #: builtin/notes.c:89
 msgid "git notes get-ref"
 msgstr "git notes get-ref"
 
 #: builtin/notes.c:94
 msgid "Write/edit the notes for the following object:"
-msgstr ""
+msgstr "Schreiben/Bearbeiten der Notizen für das folgende Objekt:"
 
 #: builtin/notes.c:147
 #, c-format
 msgid "unable to start 'show' for object '%s'"
 msgstr "konnte 'show' für Objekt '%s' nicht starten"
 
 #: builtin/notes.c:151
 msgid "could not read 'show' output"
 msgstr "Konnte Ausgabe von 'show' nicht lesen."
 
 #: builtin/notes.c:159
 #, c-format
@@ -9504,27 +9511,27 @@ msgid "Missing notes on source object %s. Cannot copy."
 msgstr "Keine Notizen für Quell-Objekt %s. Kopie nicht möglich."
 
 #: builtin/notes.c:587
 #, 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 ""
 "Die Optionen -m/-F/-c/-C sind für den Unterbefehl 'edit' veraltet.\n"
 "Bitte benutzen Sie stattdessen 'git notes add -f -m/-F/-c/-C'.\n"
 
 #: builtin/notes.c:753
-#, fuzzy, c-format
+#, c-format
 msgid "unknown notes merge strategy %s"
-msgstr "Konnte Merge-Strategie '%s' nicht finden.\n"
+msgstr "unbekannte Merge-Strategie '%s' für Notizen"
 
 #: builtin/notes.c:769
 msgid "General options"
 msgstr "Allgemeine Optionen"
 
 #: builtin/notes.c:771
 msgid "Merge options"
 msgstr "Merge-Optionen"
 
 #: builtin/notes.c:773
 msgid ""
 "resolve notes conflicts using the given strategy (manual/ours/theirs/union/"
@@ -9544,75 +9551,76 @@ msgstr ""
 "committet werden"
 
 #: builtin/notes.c:779
 msgid "Aborting notes merge resolution"
 msgstr "Konfliktauflösung beim Merge von Notizen abbrechen"
 
 #: builtin/notes.c:781
 msgid "abort notes merge"
 msgstr "Merge von Notizen abbrechen"
 
 #: builtin/notes.c:792
 msgid "cannot mix --commit, --abort or -s/--strategy"
-msgstr ""
+msgstr "Kann --commit, --abort oder -s/--strategy nicht kombinieren."
 
 #: builtin/notes.c:797
-#, fuzzy
 msgid "Must specify a notes ref to merge"
-msgstr "Sie müssen ein Repository angeben."
+msgstr "Sie müssen eine Notiz-Referenz zum Mergen angeben."
 
 #: builtin/notes.c:821
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown -s/--strategy: %s"
-msgstr "Unbekannter Typ: %d"
+msgstr "Unbekannter Wert für -s/--strategy: %s"
 
 #: builtin/notes.c:858
 #, c-format
 msgid "A notes merge into %s is already in-progress at %s"
 msgstr "Ein Merge von Notizen nach %s ist bereits im Gange bei %s"
 
 #: builtin/notes.c:861
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to store link to current notes ref (%s)"
-msgstr "Fehler beim Finden des \"Tree\"-Objektes von %s."
+msgstr "Fehler beim Speichern der Verknüpfung zur aktuellen Notes-Referenz (%s)"
 
 #: builtin/notes.c:863
 #, c-format
 msgid ""
 "Automatic notes merge failed. Fix conflicts in %s and commit the result with "
 "'git notes merge --commit', or abort the merge with 'git notes merge --"
 "abort'.\n"
 msgstr ""
+"Automatisches Zusammenführen der Notizen fehlgeschlagen. Beheben Sie die\n"
+"Konflikte in %s und committen Sie das Ergebnis mit 'git notes merge --commit',\n"
+"oder brechen Sie den Merge mit 'git notes merge --abort' ab.\n"
 
 #: builtin/notes.c:885
 #, c-format
 msgid "Object %s has no note\n"
 msgstr "Objekt %s hat keine Notiz\n"
 
 #: builtin/notes.c:897
 msgid "attempt to remove non-existent note is not an error"
 msgstr "der Versuch, eine nicht existierende Notiz zu löschen, ist kein Fehler"
 
 #: builtin/notes.c:900
 msgid "read object names from the standard input"
 msgstr "Objektnamen von der Standard-Eingabe lesen"
 
 #: builtin/notes.c:938 builtin/prune.c:105 builtin/worktree.c:127
 msgid "do not remove, show only"
 msgstr "nicht löschen, nur anzeigen"
 
 #: builtin/notes.c:939
-#, fuzzy
 msgid "report pruned notes"
-msgstr "gelöschte Objekte melden"
+msgstr "gelöschte Notizen melden"
 
 #: builtin/notes.c:981
 msgid "notes-ref"
 msgstr "Notiz-Referenz"
 
 #: builtin/notes.c:982
 msgid "use notes from <notes-ref>"
 msgstr "Notizen von <Notiz-Referenz> verwenden"
 
 #: builtin/notes.c:1017 builtin/remote.c:1623
 #, c-format
 msgid "Unknown subcommand: %s"
@@ -9767,27 +9775,26 @@ msgstr "Objekte einschließen, die vom Index referenziert werden"
 msgid "output pack to stdout"
 msgstr "Paket in die Standard-Ausgabe schreiben"
 
 #: builtin/pack-objects.c:2695
 msgid "include tag objects that refer to objects to be packed"
 msgstr "Tag-Objekte einschließen, die auf gepackte Objekte referenzieren"
 
 #: builtin/pack-objects.c:2697
 msgid "keep unreachable objects"
 msgstr "nicht erreichbare Objekte behalten"
 
 #: builtin/pack-objects.c:2699
-#, fuzzy
 msgid "pack loose unreachable objects"
-msgstr "nicht erreichbare Objekte behalten"
+msgstr "nicht erreichbare lose Objekte packen"
 
 #: builtin/pack-objects.c:2700 parse-options.h:142
 msgid "time"
 msgstr "Zeit"
 
 #: builtin/pack-objects.c:2701
 msgid "unpack unreachable objects newer than <time>"
 msgstr "nicht erreichbare Objekte entpacken, die neuer als <Zeit> sind"
 
 #: builtin/pack-objects.c:2704
 msgid "create thin packs"
 msgstr "dünnere Pakete erzeugen"
@@ -9985,25 +9992,25 @@ msgstr ""
 #: builtin/pull.c:503
 #, c-format
 msgid ""
 "Your configuration specifies to merge with the ref '%s'\n"
 "from the remote, but no such ref was fetched."
 msgstr ""
 "Ihre Konfiguration gibt an, den Merge mit Referenz '%s'\n"
 "des Remote-Repositories durchzuführen, aber diese Referenz\n"
 "wurde nicht angefordert."
 
 #: builtin/pull.c:820
 msgid "ignoring --verify-signatures for rebase"
-msgstr ""
+msgstr "Ignoriere --verify-signatures für Rebase"
 
 #: builtin/pull.c:867
 msgid "--[no-]autostash option is only valid with --rebase."
 msgstr "--[no-]autostash ist nur mit --rebase zulässig."
 
 #: builtin/pull.c:875
 msgid "Updating an unborn branch with changes added to the index."
 msgstr ""
 "Aktualisiere einen ungeborenen Branch mit Änderungen, die zum Commit "
 "vorgemerkt sind."
 
 #: builtin/pull.c:903
@@ -10323,42 +10330,41 @@ msgid "push missing but relevant tags"
 msgstr "fehlende, aber relevante Tags versenden"
 
 #: builtin/push.c:543 builtin/send-pack.c:166
 msgid "GPG sign the push"
 msgstr "signiert \"push\" mit GPG"
 
 #: builtin/push.c:545 builtin/send-pack.c:170
 msgid "request atomic transaction on remote side"
 msgstr "Referenzen atomar versenden"
 
 #: builtin/push.c:546
 msgid "server-specific"
-msgstr ""
+msgstr "serverspezifisch"
 
 #: builtin/push.c:546
-#, fuzzy
 msgid "option to transmit"
-msgstr "nichts zu committen\n"
+msgstr "Option übertragen"
 
 #: builtin/push.c:560
 msgid "--delete is incompatible with --all, --mirror and --tags"
 msgstr "Die Option --delete ist inkompatibel mit --all, --mirror und --tags."
 
 #: builtin/push.c:562
 msgid "--delete doesn't make sense without any refs"
 msgstr "Die Option --delete kann nur mit Referenzen verwendet werden."
 
 #: builtin/push.c:579
 msgid "push options must not have new line characters"
-msgstr ""
+msgstr "Push-Optionen dürfen keine Zeilenvorschubzeichen haben"
 
 #: builtin/read-tree.c:37
 msgid ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>) "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
 "index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"
 msgstr ""
 "git read-tree [(-m [--trivial] [--aggressive] | --reset | --prefix=<Präfix>) "
 "[-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--"
 "index-output=<Datei>] (--empty | <Commit-Referenz1> [<Commit-Referenz2> "
 "[<Commit-Referenz3>]])"
 
@@ -10689,42 +10695,42 @@ msgstr " ???"
 
 #: builtin/remote.c:955
 #, c-format
 msgid "invalid branch.%s.merge; cannot rebase onto > 1 branch"
 msgstr "ungültiges branch.%s.merge; kann Rebase nicht auf > 1 Branch ausführen"
 
 #: builtin/remote.c:963
 #, c-format
 msgid "rebases interactively onto remote %s"
 msgstr "interaktiver Rebase auf Remote-Branch %s"
 
 #: builtin/remote.c:964
-#, fuzzy, c-format
+#, c-format
 msgid "rebases onto remote %s"
-msgstr "interaktiver Rebase auf Remote-Branch %s"
+msgstr "Rebase auf Remote-Branch %s"
 
 #: builtin/remote.c:967
 #, c-format
 msgid " merges with remote %s"
 msgstr " führt mit Remote-Branch %s zusammen"
 
 #: builtin/remote.c:970
 #, c-format
 msgid "merges with remote %s"
 msgstr "führt mit Remote-Branch %s zusammen"
 
 #: builtin/remote.c:973
-#, fuzzy, c-format
+#, c-format
 msgid "%-*s    and with remote %s\n"
-msgstr "    und mit Remote-Branch"
+msgstr "%-*s    und mit Remote-Branch %s\n"
 
 #: builtin/remote.c:1016
 msgid "create"
 msgstr "erstellt"
 
 #: builtin/remote.c:1019
 msgid "delete"
 msgstr "gelöscht"
 
 #: builtin/remote.c:1023
 msgid "up to date"
 msgstr "aktuell"
@@ -10779,32 +10785,30 @@ msgstr "(keine URL)"
 #. the one in "  Fetch URL: %s" translation
 #: builtin/remote.c:1154 builtin/remote.c:1156
 #, c-format
 msgid "  Push  URL: %s"
 msgstr "  URL zum Versenden: %s"
 
 #: builtin/remote.c:1158 builtin/remote.c:1160 builtin/remote.c:1162
 #, c-format
 msgid "  HEAD branch: %s"
 msgstr "  Hauptbranch: %s"
 
 #: builtin/remote.c:1158
-#, fuzzy
 msgid "(not queried)"
-msgstr " (Zustand nicht abgefragt)"
+msgstr "(nicht abgefragt)"
 
 #: builtin/remote.c:1160
-#, fuzzy
 msgid "(unknown)"
-msgstr "unbekannt:"
+msgstr "(unbekannt)"
 
 #: builtin/remote.c:1164
 #, c-format
 msgid ""
 "  HEAD branch (remote HEAD is ambiguous, may be one of the following):\n"
 msgstr ""
 "  Hauptbranch (externer HEAD ist mehrdeutig, könnte einer der folgenden "
 "sein):\n"
 
 #: builtin/remote.c:1176
 #, c-format
 msgid "  Remote branch:%s"
@@ -10997,27 +11001,26 @@ msgstr "--local an git-pack-objects übergeben"
 msgid "write bitmap index"
 msgstr "Bitmap-Index schreiben"
 
 #: builtin/repack.c:177
 msgid "approxidate"
 msgstr "Datumsangabe"
 
 #: builtin/repack.c:178
 msgid "with -A, do not loosen objects older than this"
 msgstr "mit -A, keine Objekte älter als dieses Datum löschen"
 
 #: builtin/repack.c:180
-#, fuzzy
 msgid "with -a, repack unreachable objects"
-msgstr "nicht erreichbare Objekte behalten"
+msgstr "mit -a, nicht erreichbare Objekte neu packen"
 
 #: builtin/repack.c:182
 msgid "size of the window used for delta compression"
 msgstr "Größe des Fensters für die Delta-Kompression"
 
 #: builtin/repack.c:183 builtin/repack.c:187
 msgid "bytes"
 msgstr "Bytes"
 
 #: builtin/repack.c:184
 msgid "same as the above, but limit memory size instead of entries count"
 msgstr ""
@@ -11033,27 +11036,26 @@ msgid "maximum size of each packfile"
 msgstr "maximale Größe für jede Paketdatei"
 
 #: builtin/repack.c:190
 msgid "repack objects in packs marked with .keep"
 msgstr ""
 "Objekte umpacken, die sich in mit .keep markierten Pack-Dateien befinden"
 
 #: builtin/repack.c:200
 msgid "cannot delete packs in a precious-objects repo"
 msgstr "kann Pack-Dateien in precious-objects Repository nicht löschen"
 
 #: builtin/repack.c:204
-#, fuzzy
 msgid "--keep-unreachable and -A are incompatible"
-msgstr "--column und -n sind inkompatibel"
+msgstr "--keep-unreachable und -A sind inkompatibel"
 
 #: builtin/repack.c:391 builtin/worktree.c:115
 #, c-format
 msgid "failed to remove '%s'"
 msgstr "Fehler beim Löschen von '%s'"
 
 #: builtin/replace.c:19
 msgid "git replace [-f] <object> <replacement>"
 msgstr "git replace [-f] <Objekt> <Ersetzung>"
 
 #: builtin/replace.c:20
 msgid "git replace [-f] --edit <object>"
@@ -11821,32 +11823,32 @@ msgstr "Meinten Sie vielleicht 'update --init'?"
 
 #: builtin/submodule--helper.c:641
 #, c-format
 msgid "Skipping unmerged submodule %s"
 msgstr "Überspringe nicht zusammengeführtes Submodul %s"
 
 #: builtin/submodule--helper.c:662
 #, c-format
 msgid "Skipping submodule '%s'"
 msgstr "Überspringe Submodul '%s'"
 
 #: builtin/submodule--helper.c:792
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to clone '%s'. Retry scheduled"
-msgstr "Fehler beim Kopieren der Notizen von '%s' nach '%s'"
+msgstr "Fehler beim Klonen von '%s'. Weiterer Versuch geplant"
 
 #: builtin/submodule--helper.c:803
 #, c-format
 msgid "Failed to clone '%s' a second time, aborting"
-msgstr ""
+msgstr "Zweiter Versuch '%s' zu klonen fehlgeschlagen, breche ab."
 
 #: builtin/submodule--helper.c:824
 msgid "path into the working tree"
 msgstr "Pfad zum Arbeitsverzeichnis"
 
 #: builtin/submodule--helper.c:827
 msgid "path into the working tree, across nested submodule boundaries"
 msgstr ""
 "Pfad zum Arbeitsverzeichnis, über verschachtelte Submodul-Grenzen hinweg"
 
 #: builtin/submodule--helper.c:831
 msgid "rebase, merge, checkout or none"
@@ -11857,43 +11859,47 @@ msgid "Create a shallow clone truncated to the specified number of revisions"
 msgstr ""
 "Erstellung eines Klons mit unvollständiger Historie (shallow), abgeschnitten "
 "bei\n"
 "der angegebenen Anzahl von Commits."
 
 #: builtin/submodule--helper.c:838
 msgid "parallel jobs"
 msgstr "Parallele Ausführungen"
 
 #: builtin/submodule--helper.c:840
 msgid "whether the initial clone should follow the shallow recommendation"
 msgstr ""
+"ob das initiale Klonen den Empfehlungen für eine unvollständige\n"
+"Historie (shallow) folgen soll"
 
 #: builtin/submodule--helper.c:841
 msgid "don't print cloning progress"
 msgstr "keine Fortschrittsanzeige beim Klonen"
 
 #: builtin/submodule--helper.c:846
 msgid "git submodule--helper update_clone [--prefix=<path>] [<path>...]"
 msgstr "git submodule--helper update_clone [--prefix=<Pfad>] [<Pfad>...]"
 
 #: builtin/submodule--helper.c:856
 msgid "bad value for update parameter"
 msgstr "Fehlerhafter Wert für --update Parameter"
 
 #: builtin/submodule--helper.c:927
 #, c-format
 msgid ""
 "Submodule (%s) branch configured to inherit branch from superproject, but "
 "the superproject is not on any branch"
 msgstr ""
+"Branch von Submodul (%s) ist konfiguriert, den Branch des Hauptprojektes\n"
+"zu erben, aber das Hauptprojekt befindet sich auf keinem Branch."
 
 #: builtin/submodule--helper.c:977
 msgid "submodule--helper subcommand must be called with a subcommand"
 msgstr "submodule--helper muss mit einem Unterbefehl aufgerufen werden"
 
 #: builtin/submodule--helper.c:984
 #, c-format
 msgid "'%s' is not a valid submodule--helper subcommand"
 msgstr "'%s' ist kein gültiger Unterbefehl von submodule--helper"
 
 #: builtin/symbolic-ref.c:7
 msgid "git symbolic-ref [<options>] <name> [<ref>]"
@@ -12406,36 +12412,34 @@ msgstr "git verify-tag [-v | --verbose] <Tag>..."
 msgid "print tag contents"
 msgstr "Tag-Inhalte ausgeben"
 
 #: builtin/worktree.c:15
 msgid "git worktree add [<options>] <path> [<branch>]"
 msgstr "git worktree add [<Optionen>] <Pfad> [<Branch>]"
 
 #: builtin/worktree.c:16
 msgid "git worktree list [<options>]"
 msgstr "git worktree list [<Optionen>]"
 
 #: builtin/worktree.c:17
-#, fuzzy
 msgid "git worktree lock [<options>] <path>"
-msgstr "git worktree list [<Optionen>]"
+msgstr "git worktree lock [<Optionen>] <Pfad>"
 
 #: builtin/worktree.c:18
 msgid "git worktree prune [<options>]"
 msgstr "git worktree prune [<Optionen>]"
 
 #: builtin/worktree.c:19
-#, fuzzy
 msgid "git worktree unlock <path>"
-msgstr "git worktree prune [<Optionen>]"
+msgstr "git worktree unlock <Pfad>"
 
 #: builtin/worktree.c:42
 #, c-format
 msgid "Removing worktrees/%s: not a valid directory"
 msgstr "Lösche worktrees/%s: kein gültiges Verzeichnis"
 
 #: builtin/worktree.c:48
 #, c-format
 msgid "Removing worktrees/%s: gitdir file does not exist"
 msgstr "Lösche worktrees/%s: gitdir-Datei existiert nicht"
 
 #: builtin/worktree.c:53
@@ -12483,86 +12487,85 @@ msgid "create or reset a branch"
 msgstr "Branch erstellen oder umsetzen"
 
 #: builtin/worktree.c:329
 msgid "populate the new working tree"
 msgstr "das neue Arbeitsverzeichnis auschecken"
 
 #: builtin/worktree.c:337
 msgid "-b, -B, and --detach are mutually exclusive"
 msgstr "-b, -B und --detach schließen sich gegenseitig aus"
 
 #: builtin/worktree.c:470
 msgid "reason for locking"
-msgstr ""
+msgstr "Sperrgrund"
 
 #: builtin/worktree.c:482 builtin/worktree.c:515
-#, fuzzy, c-format
+#, c-format
 msgid "'%s' is not a working tree"
-msgstr "'%s' ist kein Commit"
+msgstr "'%s' ist kein Arbeitsverzeichnis"
 
 #: builtin/worktree.c:484 builtin/worktree.c:517
 msgid "The main working tree cannot be locked or unlocked"
-msgstr ""
+msgstr "Das Hauptarbeitsverzeichnis kann nicht gesperrt oder entsperrt werden."
 
 #: builtin/worktree.c:489
-#, fuzzy, c-format
+#, c-format
 msgid "'%s' is already locked, reason: %s"
-msgstr "'%s' ist bereits in '%s' ausgecheckt"
+msgstr "'%s' ist bereits gesperrt, Grund: %s"
 
 #: builtin/worktree.c:491
-#, fuzzy, c-format
+#, c-format
 msgid "'%s' is already locked"
-msgstr "'%s' ist bereits in '%s' ausgecheckt"
+msgstr "'%s' ist bereits gesperrt"
 
 #: builtin/worktree.c:519
-#, fuzzy, c-format
+#, c-format
 msgid "'%s' is not locked"
-msgstr "'%s' ist kein Commit"
+msgstr "'%s' ist nicht gesperrt"
 
 #: builtin/write-tree.c:13
 msgid "git write-tree [--missing-ok] [--prefix=<prefix>/]"
 msgstr "git write-tree [--missing-ok] [--prefix=<Präfix>/]"
 
 #: builtin/write-tree.c:26
 msgid "<prefix>/"
 msgstr "<Präfix>/"
 
 #: builtin/write-tree.c:27
 msgid "write tree object for a subdirectory <prefix>"
 msgstr "das \"Tree\"-Objekt für ein Unterverzeichnis <Präfix> schreiben"
 
 #: builtin/write-tree.c:30
 msgid "only useful for debugging"
 msgstr "nur nützlich für Fehlersuche"
 
 #: upload-pack.c:20
-#, fuzzy
 msgid "git upload-pack [<options>] <dir>"
-msgstr "git repack [<Optionen>]"
+msgstr "git upload-pack [<Optionen>] <Verzeichnis>"
 
 #: upload-pack.c:837
 msgid "quit after a single request/response exchange"
-msgstr ""
+msgstr "nach einem einzigen Request/Response-Austausch beenden"
 
 #: upload-pack.c:839
 msgid "exit immediately after initial ref advertisement"
-msgstr ""
+msgstr "direkt nach der initialen Angabe der Commits beenden"
 
 #: upload-pack.c:841
 msgid "do not try <directory>/.git/ if <directory> is no Git directory"
-msgstr ""
+msgstr "kein Versuch in <Verzeichnis>/.git/ wenn <Verzeichnis> kein Git-Verzeichnis ist"
 
 #: upload-pack.c:843
 msgid "interrupt transfer after <n> seconds of inactivity"
-msgstr ""
+msgstr "Übertragung nach <n> Sekunden Inaktivität unterbrechen"
 
 #: credential-cache--daemon.c:271
 msgid "print debugging messages to stderr"
 msgstr "Meldungen zur Fehlersuche in Standard-Fehlerausgabe ausgeben"
 
 #: git.c:14
 msgid ""
 "'git help -a' and 'git help -g' list available subcommands and some\n"
 "concept guides. See 'git help <command>' or 'git help <concept>'\n"
 "to read about a specific subcommand or concept."
 msgstr ""
 "'git help -a' und 'git help -g' listet verfügbare Unterbefehle und\n"
@@ -12759,27 +12762,27 @@ msgstr "Ungültiger HEAD - merkwürdige symbolische Referenz"
 
 #: git-bisect.sh:233
 #, sh-format
 msgid "Bad bisect_write argument: $state"
 msgstr "Ungültiges \"bisect_write\" Argument: $state"
 
 #: git-bisect.sh:262
 #, sh-format
 msgid "Bad rev input: $arg"
 msgstr "Ungültige Referenz-Eingabe: $arg"
 
 #: git-bisect.sh:281
-#, fuzzy, sh-format
+#, sh-format
 msgid "Bad rev input: $bisected_head"
-msgstr "Ungültige Referenz-Eingabe: $arg"
+msgstr "Ungültige Referenz-Eingabe: $bisected_head"
 
 #: git-bisect.sh:290
 #, sh-format
 msgid "Bad rev input: $rev"
 msgstr "Ungültige Referenz-Eingabe: $rev"
 
 #: git-bisect.sh:299
 #, sh-format
 msgid "'git bisect $TERM_BAD' can take only one argument."
 msgstr "'git bisect $TERM_BAD' kann nur ein Argument entgegennehmen."
 
 #: git-bisect.sh:322
@@ -12911,65 +12914,62 @@ msgid "no terms defined"
 msgstr "Keine Begriffe definiert."
 
 #: git-bisect.sh:653
 #, sh-format
 msgid ""
 "invalid argument $arg for 'git bisect terms'.\n"
 "Supported options are: --term-good|--term-old and --term-bad|--term-new."
 msgstr ""
 "Ungültiges Argument $arg für 'git bisect terms'.\n"
 "Unterstützte Optionen sind: --term-good|--term-old und --term-bad|--term-new."
 
 #: git-merge-octopus.sh:46
-#, fuzzy
 msgid ""
 "Error: Your local changes to the following files would be overwritten by "
 "merge"
 msgstr ""
-"Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
-"überschrieben werden:\n"
-"%%s"
+"Fehler Ihre lokalen Änderungen in den folgenden Dateien würden durch den Merge\n"
+"überschrieben werden"
 
 #: git-merge-octopus.sh:61
 msgid "Automated merge did not work."
-msgstr ""
+msgstr "Automatischer Merge hat nicht funktioniert."
 
 #: git-merge-octopus.sh:62
-#, fuzzy
 msgid "Should not be doing an Octopus."
-msgstr "Konnte Ausgabe nicht umleiten."
+msgstr "Sollte keinen Octopus-Merge ausführen."
 
 #: git-merge-octopus.sh:73
 #, sh-format
 msgid "Unable to find common commit with $pretty_name"
-msgstr ""
+msgstr "Konnte keinen gemeinsamen Commit mit $pretty_name finden."
 
 #: git-merge-octopus.sh:77
-#, fuzzy, sh-format
+#, sh-format
 msgid "Already up-to-date with $pretty_name"
-msgstr "Bereits aktuell!"
+msgstr "Bereits aktuell mit $pretty_name"
 
 #: git-merge-octopus.sh:89
-#, fuzzy, sh-format
+#, sh-format
 msgid "Fast-forwarding to: $pretty_name"
-msgstr "$branch_name zu $onto_name vorgespult."
+msgstr "Spule vor zu: $pretty_name"
 
 #: git-merge-octopus.sh:97
 #, sh-format
 msgid "Trying simple merge with $pretty_name"
-msgstr ""
+msgstr "Versuche einfachen Merge mit $pretty_name"
 
 #: git-merge-octopus.sh:102
 msgid "Simple merge did not work, trying automatic merge."
-msgstr ""
+msgstr "Einfacher Merge hat nicht funktioniert, versuche automatischen Merge."
 
 #: git-rebase.sh:56
 msgid ""
 "When you have resolved this problem, run \"git rebase --continue\".\n"
 "If you prefer to skip this patch, run \"git rebase --skip\" instead.\n"
 "To check out the original branch and stop rebasing, run \"git rebase --abort"
 "\"."
 msgstr ""
 "Wenn Sie das Problem aufgelöst haben, führen Sie \"git rebase --continue\" "
 "aus.\n"
 "Falls Sie diesen Patch auslassen möchten, führen Sie stattdessen \"git "
 "rebase --skip\" aus.\n"
@@ -13175,25 +13175,25 @@ msgstr "Keine lokalen Änderungen zum Speichern"
 
 #: git-stash.sh:263
 msgid "Cannot initialize stash"
 msgstr "Kann \"stash\" nicht initialisieren"
 
 #: git-stash.sh:267
 msgid "Cannot save the current status"
 msgstr "Kann den aktuellen Status nicht speichern"
 
 #: git-stash.sh:268
 #, sh-format
 msgid "Saved working directory and index state $stash_msg"
-msgstr ""
+msgstr "Speicherte Arbeitsverzeichnis und Index-Status $stash_msg"
 
 #: git-stash.sh:285
 msgid "Cannot remove worktree changes"
 msgstr "Kann Änderungen im Arbeitsverzeichnis nicht löschen"
 
 #: git-stash.sh:404
 #, sh-format
 msgid "unknown option: $opt"
 msgstr "unbekannte Option: $opt"
 
 #: git-stash.sh:414
 msgid "No stash found."
@@ -13236,25 +13236,25 @@ msgid "Could not save index tree"
 msgstr "Konnte Index-Verzeichnis nicht speichern"
 
 #: git-stash.sh:522
 msgid "Cannot unstage modified files"
 msgstr "Kann geänderte Dateien nicht aus dem Index entfernen"
 
 #: git-stash.sh:537
 msgid "Index was not unstashed."
 msgstr "Index wurde nicht aus dem Stash zurückgeladen."
 
 #: git-stash.sh:551
 msgid "The stash is kept in case you need it again."
-msgstr ""
+msgstr "Der Stash wird behalten, im Falle Sie benötigen diesen nochmal."
 
 #: git-stash.sh:560
 #, sh-format
 msgid "Dropped ${REV} ($s)"
 msgstr "Gelöscht ${REV} ($s)"
 
 #: git-stash.sh:561
 #, sh-format
 msgid "${REV}: Could not drop stash entry"
 msgstr "${REV}: Konnte \"stash\"-Eintrag nicht löschen"
 
 #: git-stash.sh:569
@@ -13310,24 +13310,29 @@ msgstr ""
 "Repositories:"
 
 #: git-submodule.sh:244
 #, sh-format
 msgid ""
 "If you want to reuse this local git directory instead of cloning again from\n"
 "  $realrepo\n"
 "use the '--force' option. If the local git directory is not the correct "
 "repo\n"
 "or you are unsure what this means choose another name with the '--name' "
 "option."
 msgstr ""
+"Wenn Sie das lokale Git-Verzeichnis wiederverwenden wollen, anstatt erneut von\n"
+"  $realrepo\n"
+"zu klonen, benutzen Sie die Option '--force'. Wenn das lokale Git-Verzeichnis\n"
+"nicht das korrekte Repository ist oder Sie unsicher sind, was das bedeutet,\n"
+"wählen Sie einen anderen Namen mit der Option '--name'."
 
 #: git-submodule.sh:250
 #, sh-format
 msgid "Reactivating local git directory for submodule '$sm_name'."
 msgstr "Reaktiviere lokales Git-Verzeichnis für Submodul '$sm_name'."
 
 #: git-submodule.sh:262
 #, sh-format
 msgid "Unable to checkout submodule '$sm_path'"
 msgstr "Kann Submodul '$sm_path' nicht auschecken"
 
 #: git-submodule.sh:267
@@ -13354,33 +13359,32 @@ msgstr "Stoppe bei '$displaypath'; Skript gab nicht-Null Status zurück."
 #, sh-format
 msgid "pathspec and --all are incompatible"
 msgstr "Pfadspezifikationen und --all sind inkompatibel."
 
 #: git-submodule.sh:419
 #, sh-format
 msgid "Use '--all' if you really want to deinitialize all submodules"
 msgstr ""
 "Verwenden Sie '--all', wenn Sie wirklich alle Submodule deinitialisieren\n"
 "möchten."
 
 #: git-submodule.sh:439
-#, fuzzy, sh-format
+#, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains a .git directory\n"
 "(use 'rm -rf' if you really want to remove it including all of its history)"
 msgstr ""
-"Submodul '%s' (oder ein geschachteltes Submodul hiervon) verwendet\n"
-"ein .git-Verzeichnis (benutzen Sie 'rm -rf' wenn Sie dieses wirklich "
-"mitsamt\n"
-"seiner Historie löschen möchten)"
+"Arbeitsverzeichnis von Submodul in '$displaypath' enthält ein .git-Verzeichnis\n"
+"(benutzen Sie 'rm -rf' wenn Sie dieses wirklich mitsamt seiner Historie löschen\n"
+"möchten)"
 
 #: git-submodule.sh:447
 #, sh-format
 msgid ""
 "Submodule work tree '$displaypath' contains local modifications; use '-f' to "
 "discard them"
 msgstr ""
 "Arbeitsverzeichnis von Submodul in '$displaypath' enthält lokale Änderungen; "
 "verwenden Sie '-f', um diese zu verwerfen"
 
 #: git-submodule.sh:450
 #, sh-format
@@ -13408,41 +13412,45 @@ msgstr ""
 
 #: git-submodule.sh:612
 #, sh-format
 msgid "Unable to find current revision in submodule path '$displaypath'"
 msgstr "Konnte aktuellen Commit in Submodul-Pfad '$displaypath' nicht finden."
 
 #: git-submodule.sh:622
 #, sh-format
 msgid "Unable to fetch in submodule path '$sm_path'"
 msgstr "Konnte \"fetch\" in Submodul-Pfad '$sm_path' nicht ausführen"
 
 #: git-submodule.sh:627
-#, fuzzy, sh-format
+#, sh-format
 msgid ""
 "Unable to find current ${remote_name}/${branch} revision in submodule path "
 "'$sm_path'"
-msgstr "Konnte aktuellen Commit in Submodul-Pfad '$displaypath' nicht finden."
+msgstr ""
+"Konnte aktuellen Commit von ${remote_name}/${branch} in Submodul-Pfad\n"
+"'$sm_path' nicht finden."
 
 #: git-submodule.sh:645
 #, sh-format
 msgid "Unable to fetch in submodule path '$displaypath'"
 msgstr "Konnte \"fetch\" in Submodul-Pfad '$displaypath' nicht ausführen"
 
 #: git-submodule.sh:651
 #, sh-format
 msgid ""
 "Fetched in submodule path '$displaypath', but it did not contain $sha1. "
 "Direct fetching of that commit failed."
 msgstr ""
+"\"fetch\" in Submodul-Pfad '$displaypath' ausgeführt, aber $sha1 nicht\n"
+"enthalten. Direktes Anfordern dieses Commits ist fehlgeschlagen."
 
 #: git-submodule.sh:658
 #, sh-format
 msgid "Unable to checkout '$sha1' in submodule path '$displaypath'"
 msgstr "Konnte '$sha1' in Submodul-Pfad '$displaypath' nicht auschecken."
 
 #: git-submodule.sh:659
 #, sh-format
 msgid "Submodule path '$displaypath': checked out '$sha1'"
 msgstr "Submodul-Pfad: '$displaypath': '$sha1' ausgecheckt"
 
 #: git-submodule.sh:663
@@ -13521,420 +13529,471 @@ msgstr "Fehler bei Rekursion in Submodul-Pfad '$sm_path'"
 #, sh-format
 msgid "Synchronizing submodule url for '$displaypath'"
 msgstr "Synchronisiere Submodul-URL für '$displaypath'"
 
 #: git-parse-remote.sh:89
 #, sh-format
 msgid "See git-${cmd}(1) for details."
 msgstr "Siehe git-${cmd}(1) für weitere Details."
 
 #: git-rebase--interactive.sh:131
 #, sh-format
 msgid "Rebasing ($new_count/$total)"
-msgstr ""
+msgstr "Führe Rebase aus ($new_count/$total)"
 
 #: git-rebase--interactive.sh:147
 msgid ""
 "\n"
 "Commands:\n"
 " p, pick = use commit\n"
 " r, reword = use commit, but edit the commit message\n"
 " e, edit = use commit, but stop for amending\n"
 " s, squash = use commit, but meld into previous commit\n"
 " f, fixup = like \"squash\", but discard this commit's log message\n"
 " x, exec = run command (the rest of the line) using shell\n"
 " d, drop = remove commit\n"
 "\n"
 "These lines can be re-ordered; they are executed from top to bottom.\n"
 msgstr ""
+"\n"
+"Befehle:\n"
+" p, pick = Commit verwenden\n"
+" r, reword = Commit verwenden, aber Commit-Beschreibung bearbeiten\n"
+" e, edit = Commit verwenden, aber zum Nachbessern anhalten\n"
+" s, squash = Commit verwenden, aber mit vorherigem Commit vereinen\n"
+" f, fixup = wie \"squash\", aber diese Commit-Beschreibung verwerfen\n"
+" x, exec = Befehl (Rest der Zeile) mittels Shell ausführen\n"
+" d, drop = Commit entfernen\n"
+"\n"
+"Diese Zeilen können umsortiert werden; Sie werden von oben nach unten\n"
+"ausgeführt.\n"
 
 #: git-rebase--interactive.sh:162
 msgid ""
 "\n"
 "Do not remove any line. Use 'drop' explicitly to remove a commit.\n"
 msgstr ""
+"\n"
+"Keine Zeile entfernen. Benutzen Sie 'drop', um explizit einen Commit zu\n"
+"entfernen.\n"
 
 #: git-rebase--interactive.sh:166
 msgid ""
 "\n"
 "If you remove a line here THAT COMMIT WILL BE LOST.\n"
-msgstr ""
+msgstr "\nWenn Sie hier eine Zeile entfernen, wird DIESER COMMIT VERLOREN GEHEN.\n"
 
 #: git-rebase--interactive.sh:202
 #, sh-format
 msgid ""
 "You can amend the commit now, with\n"
 "\n"
 "\tgit commit --amend $gpg_sign_opt_quoted\n"
 "\n"
 "Once you are satisfied with your changes, run\n"
 "\n"
 "\tgit rebase --continue"
 msgstr ""
+"Sie können den Commit nun nachbessern mit:\n"
+"\n"
+"\tgit commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Sobald Sie mit Ihren Änderungen zufrieden sind, führen Sie aus:\n"
+"\n"
+"\tgit rebase --continue"
 
 #: git-rebase--interactive.sh:227
 #, sh-format
 msgid "$sha1: not a commit that can be picked"
-msgstr ""
+msgstr "$sha1: kein Commit der gepickt werden kann"
 
 #: git-rebase--interactive.sh:266
-#, fuzzy, sh-format
+#, sh-format
 msgid "Invalid commit name: $sha1"
-msgstr "Ungültiger Commit: %s"
+msgstr "Ungültiger Commit-Name: $sha1"
 
 #: git-rebase--interactive.sh:308
-#, fuzzy
 msgid "Cannot write current commit's replacement sha1"
-msgstr "Kann den aktuellen Zustand des Arbeitsverzeichnisses nicht speichern"
+msgstr "Kann ersetzenden SHA-1 des aktuellen Commits nicht schreiben"
 
 #: git-rebase--interactive.sh:360
-#, fuzzy, sh-format
+#, sh-format
 msgid "Fast-forward to $sha1"
-msgstr "vorspulbar"
+msgstr "Spule vor zu $sha1"
 
 #: git-rebase--interactive.sh:362
-#, fuzzy, sh-format
+#, sh-format
 msgid "Cannot fast-forward to $sha1"
-msgstr "Kann $stash_sha1 nicht speichern."
+msgstr "Kann nicht zu $sha1 vorspulen"
 
 #: git-rebase--interactive.sh:371
 #, sh-format
 msgid "Cannot move HEAD to $first_parent"
-msgstr ""
+msgstr "Kann HEAD nicht auf $first_parent setzen"
 
 #: git-rebase--interactive.sh:376
 #, sh-format
 msgid "Refusing to squash a merge: $sha1"
-msgstr ""
+msgstr "\"squash\" eines Merges ($sha1) zurückgewiesen."
 
 #: git-rebase--interactive.sh:390
-#, fuzzy, sh-format
+#, sh-format
 msgid "Error redoing merge $sha1"
-msgstr "Fehler beim Erzeugen der \"Tree\"-Objekte"
+msgstr "Fehler beim Wiederholen des Merges von $sha1"
 
 #: git-rebase--interactive.sh:398
-#, fuzzy, sh-format
+#, sh-format
 msgid "Could not pick $sha1"
-msgstr "Konnte %s nicht öffnen"
+msgstr "Konnte $sha1 nicht picken"
 
 #: git-rebase--interactive.sh:407
-#, fuzzy, sh-format
+#, sh-format
 msgid "This is the commit message #${n}:"
-msgstr "Commit-Beschreibung bearbeiten"
+msgstr "Das ist Commit-Beschreibung #${n}:"
 
 #: git-rebase--interactive.sh:412
-#, fuzzy, sh-format
+#, sh-format
 msgid "The commit message #${n} will be skipped:"
-msgstr "Commit-Beschreibung bearbeiten"
+msgstr "Commit-Beschreibung #${n} wird ausgelassen:"
 
 #: git-rebase--interactive.sh:423
 #, sh-format
 msgid "This is a combination of $count commit."
 msgid_plural "This is a combination of $count commits."
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Das ist eine Kombination aus $count Commit."
+msgstr[1] "Das ist eine Kombination aus $count Commits."
 
 #: git-rebase--interactive.sh:431
-#, fuzzy, sh-format
+#, sh-format
 msgid "Cannot write $fixup_msg"
-msgstr "Kann nicht überschreiben"
+msgstr "Kann $fixup_msg nicht schreiben"
 
 #: git-rebase--interactive.sh:434
 msgid "This is a combination of 2 commits."
-msgstr ""
+msgstr "Das ist eine Kombination aus 2 Commits."
 
 #: git-rebase--interactive.sh:435
-#, fuzzy
 msgid "This is the 1st commit message:"
-msgstr "Commit-Beschreibung bearbeiten"
+msgstr "Das ist die erste Commit-Beschreibung:"
 
 #: git-rebase--interactive.sh:475 git-rebase--interactive.sh:518
 #: git-rebase--interactive.sh:521
-#, fuzzy, sh-format
+#, sh-format
 msgid "Could not apply $sha1... $rest"
-msgstr "Konnte %s... (%s) nicht anwenden"
+msgstr "Konnte $sha1... ($rest) nicht anwenden"
 
 #: git-rebase--interactive.sh:549
 #, sh-format
 msgid ""
 "Could not amend commit after successfully picking $sha1... $rest\n"
 "This is most likely due to an empty commit message, or the pre-commit hook\n"
 "failed. If the pre-commit hook failed, you may need to resolve the issue "
 "before\n"
 "you are able to reword the commit."
 msgstr ""
+"Konnte Commit nicht nachbessern, nachdem dieser verwendet wurde: $sha1... $rest\n"
+"Das passierte sehr wahrscheinlich wegen einer leeren Commit-Beschreibung, oder\n"
+"weil der pre-commit Hook fehlschlug. Falls der pre-commit Hook fehlschlug,\n"
+"sollten Sie das Problem beheben, bevor Sie die Commit-Beschreibung ändern können."
 
 #: git-rebase--interactive.sh:564
 #, sh-format
 msgid "Stopped at $sha1_abbrev... $rest"
-msgstr ""
+msgstr "Angehalten bei $sha1_abbrev... $rest"
 
 #: git-rebase--interactive.sh:579
 #, sh-format
 msgid "Cannot '$squash_style' without a previous commit"
-msgstr ""
+msgstr "Kann nicht '$squash_style' ohne vorherigen Commit"
 
 #: git-rebase--interactive.sh:621
 #, sh-format
 msgid "Executing: $rest"
-msgstr ""
+msgstr "Führe aus: $rest"
 
 #: git-rebase--interactive.sh:629
 #, sh-format
 msgid "Execution failed: $rest"
-msgstr ""
+msgstr "Ausführung fehlgeschlagen: $rest"
 
 #: git-rebase--interactive.sh:631
-#, fuzzy
 msgid "and made changes to the index and/or the working tree"
-msgstr "weder den Index, noch das Arbeitsverzeichnis aktualisieren"
+msgstr "Der Index und/oder das Arbeitsverzeichnis wurde geändert."
 
 #: git-rebase--interactive.sh:633
-#, fuzzy
 msgid ""
 "You can fix the problem, and then run\n"
 "\n"
 "\tgit rebase --continue"
 msgstr ""
-"  (beheben Sie die Konflikte und führen Sie dann \"git rebase --continue\" "
-"aus)"
+"Sie können das Problem beheben, und dann\n"
+"\n"
+"\tgit rebase --continue\n"
+"\n"
+"ausführen."
 
 #. TRANSLATORS: after these lines is a command to be issued by the user
 #: git-rebase--interactive.sh:646
 #, sh-format
 msgid ""
 "Execution succeeded: $rest\n"
 "but left changes to the index and/or the working tree\n"
 "Commit or stash your changes, and then run\n"
 "\n"
 "\tgit rebase --continue"
 msgstr ""
+"Ausführung erfolgreich: $rest\n"
+"Aber Änderungen in Index oder Arbeitsverzeichnis verblieben.\n"
+"Committen Sie Ihre Änderungen oder benutzen Sie \"stash\".\n"
+"Führen Sie dann aus:\n"
+"\n"
+"\tgit rebase --continue"
 
 #: git-rebase--interactive.sh:657
-#, fuzzy, sh-format
+#, sh-format
 msgid "Unknown command: $command $sha1 $rest"
-msgstr "Unbekannter Unterbefehl: %s"
+msgstr "Unbekannter Befehl: $command $sha1 $rest"
 
 #: git-rebase--interactive.sh:658
 msgid "Please fix this using 'git rebase --edit-todo'."
-msgstr ""
+msgstr "Bitte beheben Sie das, indem Sie 'git rebase --edit-todo' ausführen."
 
 #: git-rebase--interactive.sh:693
 #, sh-format
 msgid "Successfully rebased and updated $head_name."
-msgstr ""
+msgstr "Erfolgreich Rebase ausgeführt und $head_name aktualisiert."
 
 #: git-rebase--interactive.sh:740
 msgid "Could not skip unnecessary pick commands"
-msgstr ""
+msgstr "Fehler beim Auslassen von nicht erforderlichen \"pick\"-Befehlen."
 
 #: git-rebase--interactive.sh:898
 #, sh-format
 msgid ""
 "Warning: the SHA-1 is missing or isn't a commit in the following line:\n"
 " - $line"
 msgstr ""
+"Warnung: Der SHA-1 in der folgenden Zeile fehlt oder ist kein Commit:\n"
+" - $line"
 
 #: git-rebase--interactive.sh:931
 #, sh-format
 msgid ""
 "Warning: the command isn't recognized in the following line:\n"
 " - $line"
 msgstr ""
+"Warnung: Das Kommando in der folgenden Zeile wurde nicht erkannt:\n"
+" - $line"
 
 #: git-rebase--interactive.sh:970
-#, fuzzy
 msgid "could not detach HEAD"
-msgstr "Konnte nicht von %s anfordern"
+msgstr "Konnte HEAD nicht loslösen"
 
 #: git-rebase--interactive.sh:1008
 msgid ""
 "Warning: some commits may have been dropped accidentally.\n"
 "Dropped commits (newer to older):"
 msgstr ""
+"Warnung: Einige Commits könnten aus Versehen entfernt worden sein.\n"
+"Entfernte Commits (neu zu alt):"
 
 #: git-rebase--interactive.sh:1016
 msgid ""
 "To avoid this message, use \"drop\" to explicitly remove a commit.\n"
 "\n"
 "Use 'git config rebase.missingCommitsCheck' to change the level of "
 "warnings.\n"
 "The possible behaviours are: ignore, warn, error."
 msgstr ""
+"Um diese Meldung zu vermeiden, benutzen Sie \"drop\", um exlizit Commits zu\n"
+"entfernen.\n"
+"\n"
+"Benutzen Sie 'git config rebase.missingCommitsCheck', um die Stufe der Warnungen\n"
+"zu ändern.\n"
+"Die möglichen Verhaltensweisen sind: ignore, warn, error."
 
 #: git-rebase--interactive.sh:1027
 #, sh-format
 msgid ""
 "Unrecognized setting $check_level for option rebase.missingCommitsCheck. "
 "Ignoring."
 msgstr ""
+"Nicht erkannte Einstellung $check_level für Option rebase.missingCommitsCheck.\n"
+"Ignoriere."
 
 #: git-rebase--interactive.sh:1044
 msgid "You can fix this with 'git rebase --edit-todo'."
-msgstr ""
+msgstr "Sie können das mit 'git rebase --edit-todo' beheben."
 
 #: git-rebase--interactive.sh:1045
 msgid "Or you can abort the rebase with 'git rebase --abort'."
-msgstr ""
+msgstr "Oder Sie können den Rebase mit 'git rebase --abort' abbrechen."
 
 #: git-rebase--interactive.sh:1069
-#, fuzzy
 msgid "Could not remove CHERRY_PICK_HEAD"
-msgstr "Konnte Commit von HEAD nicht auflösen\n"
+msgstr "Konnte CHERRY_PICK_HEAD nicht löschen"
 
 #: git-rebase--interactive.sh:1074
 #, sh-format
 msgid ""
 "You have staged changes in your working tree.\n"
 "If these changes are meant to be\n"
 "squashed into the previous commit, run:\n"
 "\n"
 "  git commit --amend $gpg_sign_opt_quoted\n"
 "\n"
 "If they are meant to go into a new commit, run:\n"
 "\n"
 "  git commit $gpg_sign_opt_quoted\n"
 "\n"
 "In both case, once you're done, continue with:\n"
 "\n"
 "  git rebase --continue\n"
 msgstr ""
+"Es befinden sich zum Commit vorgemerkte Änderungen in Ihrem Arbeitsverzeichnis.\n"
+"Wenn diese Änderungen in den vorherigen Commit aufgenommen werden sollen,\n"
+"führen Sie aus:\n"
+"\n"
+"  git commit --amend $gpg_sign_opt_quoted\n"
+"\n"
+"Wenn daraus ein neuer Commit erzeugt werden soll, führen Sie aus:\n"
+"\n"
+"  git commit $gpg_sign_opt_quoted\n"
+"\n"
+"Im Anschluss führen Sie zum Fortfahren aus:\n"
+"\n"
+"  git rebase --continue\n"
 
 #: git-rebase--interactive.sh:1091
 msgid "Error trying to find the author identity to amend commit"
 msgstr ""
+"Fehler beim Versuch die Identität des Authors zum Verbessern des Commits zu\n"
+"finden"
 
 #: git-rebase--interactive.sh:1096
 msgid ""
 "You have uncommitted changes in your working tree. Please commit them\n"
 "first and then run 'git rebase --continue' again."
 msgstr ""
+"Sie haben nicht committete Änderungen in Ihrem Arbeitsverzeichnis. Bitte\n"
+"committen Sie diese zuerst und führen Sie dann 'git rebase --continue' erneut\n"
+"aus."
 
 #: git-rebase--interactive.sh:1101 git-rebase--interactive.sh:1105
-#, fuzzy
 msgid "Could not commit staged changes."
-msgstr "Konnte Commit-Beschreibung nicht lesen: %s"
+msgstr "Konnte Änderungen aus der Staging-Area nicht committen."
 
 #: git-rebase--interactive.sh:1129
 msgid ""
 "\n"
 "You are editing the todo file of an ongoing interactive rebase.\n"
 "To continue rebase after editing, run:\n"
 "    git rebase --continue\n"
 "\n"
 msgstr ""
+"\n"
+"Sie bearbeiten gerade die TODO-Datei eines laufenden interaktiven Rebase.\n"
+"Um den Rebase nach dem Editieren fortzusetzen, führen Sie aus:\n"
+"    git rebase --continue\n"
+"\n"
 
 #: git-rebase--interactive.sh:1137 git-rebase--interactive.sh:1298
-#, fuzzy
 msgid "Could not execute editor"
-msgstr "Konnte %s nicht entfernen"
+msgstr "Konnte Editor nicht ausführen."
 
 #: git-rebase--interactive.sh:1145
 msgid "You need to set your committer info first"
 msgstr "Sie müssen zuerst die Informationen zum Commit-Ersteller setzen."
 
 #: git-rebase--interactive.sh:1153
-#, fuzzy, sh-format
+#, sh-format
 msgid "Could not checkout $switch_to"
-msgstr "Konnte Verzeichnis '%s' nicht erstellen."
+msgstr "Konnte $switch_to nicht auschecken."
 
 #: git-rebase--interactive.sh:1158
 msgid "No HEAD?"
-msgstr ""
+msgstr "Kein HEAD?"
 
 #: git-rebase--interactive.sh:1159
-#, fuzzy, sh-format
+#, sh-format
 msgid "Could not create temporary $state_dir"
-msgstr "konnte temporäre Datei '%s' nicht erstellen"
+msgstr "Konnte temporäres Verzeichnis $state_dir nicht erstellen."
 
 #: git-rebase--interactive.sh:1161
-#, fuzzy
 msgid "Could not mark as interactive"
-msgstr "Konnte Bereitstellung nicht lesen"
+msgstr "Konnte nicht als interaktiven Rebase markieren."
 
 #: git-rebase--interactive.sh:1171 git-rebase--interactive.sh:1176
-#, fuzzy
 msgid "Could not init rewritten commits"
-msgstr "Konnte Eltern-Commit %s nicht parsen\n"
+msgstr "Konnte neu geschriebene Commits nicht initialisieren."
 
 #: git-rebase--interactive.sh:1276
 #, sh-format
 msgid "Rebase $shortrevisions onto $shortonto ($todocount command)"
 msgid_plural "Rebase $shortrevisions onto $shortonto ($todocount commands)"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Rebase von $shortrevisions auf $shortonto ($todocount Kommando)"
+msgstr[1] "Rebase von $shortrevisions auf $shortonto ($todocount Kommandos)"
 
 #: git-rebase--interactive.sh:1281
 msgid ""
 "\n"
 "However, if you remove everything, the rebase will be aborted.\n"
 "\n"
-msgstr ""
+msgstr "\nWenn Sie jedoch alles löschen, wird der Rebase abgebrochen.\n\n"
 
 #: git-rebase--interactive.sh:1288
 msgid "Note that empty commits are commented out"
-msgstr ""
+msgstr "Leere Commits sind auskommentiert."
 
 #: git-sh-setup.sh:89 git-sh-setup.sh:94
 #, sh-format
 msgid "usage: $dashless $USAGE"
-msgstr ""
+msgstr "Verwendung: $dashless $USAGE"
 
 #: git-sh-setup.sh:190
-#, fuzzy, sh-format
+#, sh-format
 msgid "Cannot chdir to $cdup, the toplevel of the working tree"
 msgstr ""
-"Relative Pfade können nur von der obersten Ebene des Arbeitsverzeichnisses "
-"benutzt werden."
+"Konnte nicht in Verzeichnis $cdup wechseln, der obersten Ebene des\n"
+"Arbeitsverzeichnisses."
 
 #: git-sh-setup.sh:199 git-sh-setup.sh:206
 #, sh-format
 msgid "fatal: $program_name cannot be used without a working tree."
-msgstr ""
+msgstr "fatal: $program_name kann ohne ein Arbeitsverzeichnis nicht verwendet werden."
 
 #: git-sh-setup.sh:220
-#, fuzzy
 msgid "Cannot rebase: You have unstaged changes."
-msgstr ""
-"Kann \"pull\" mit \"rebase\" nicht ausführen: Sie haben Änderungen, die "
-"nicht zum Commit vorgemerkt sind."
+msgstr "Rebase nicht möglich: Sie haben Änderungen, die nicht zum Commit vorgemerkt sind."
 
 #: git-sh-setup.sh:223
-#, fuzzy
 msgid "Cannot rewrite branches: You have unstaged changes."
 msgstr ""
-"Kann \"pull\" mit \"rebase\" nicht ausführen: Sie haben Änderungen, die "
-"nicht zum Commit vorgemerkt sind."
+"Kann Branches nicht neu schreiben: Sie haben Änderungen, die nicht zum Commit\n"
+"vorgemerkt sind."
 
 #: git-sh-setup.sh:229
-#, fuzzy, sh-format
+#, sh-format
 msgid "Cannot $action: You have unstaged changes."
 msgstr ""
-"Kann \"pull\" mit \"rebase\" nicht ausführen: Sie haben Änderungen, die "
-"nicht zum Commit vorgemerkt sind."
+"Kann $action nicht ausführen: Sie haben Änderungen, die nicht zum Commit\n"
+"vorgemerkt sind."
 
 #: git-sh-setup.sh:242
-#, fuzzy
 msgid "Cannot rebase: Your index contains uncommitted changes."
-msgstr ""
-"Kann \"pull\" mit \"rebase\" nicht ausführen: Die Staging-Area beinhaltet "
-"nicht committete Änderungen."
+msgstr "Rebase nicht möglich: Die Staging-Area beinhaltet nicht committete Änderungen."
 
 #: git-sh-setup.sh:248
-#, fuzzy, sh-format
+#, sh-format
 msgid "Cannot $action: Your index contains uncommitted changes."
 msgstr ""
-"Kann \"pull\" mit \"rebase\" nicht ausführen: Die Staging-Area beinhaltet "
-"nicht committete Änderungen."
+"Kann $action nicht ausführen: Die Staging-Area beinhaltet nicht committete\n"
+"Änderungen."
 
 #: git-sh-setup.sh:372
-#, fuzzy
 msgid "You need to run this command from the toplevel of the working tree."
-msgstr ""
-"Relative Pfade können nur von der obersten Ebene des Arbeitsverzeichnisses "
-"benutzt werden."
+msgstr "Sie müssen den Befehl von der obersten Ebene des Arbeitsverzeichnisses ausführen."
 
 #: git-sh-setup.sh:377
-#, fuzzy
 msgid "Unable to determine absolute path of git directory"
-msgstr "Konnte aktuelles Arbeitsverzeichnis nicht bekommen."
+msgstr "Konnte absoluten Pfad des Git-Verzeichnisses nicht bestimmen."
 
-- 
2.10.1.484.gd4ef107


^ permalink raw reply related

* Re: What's cooking in git.git (Oct 2016, #02; Thu, 6)
From: Junio C Hamano @ 2016-10-07 16:40 UTC (permalink / raw)
  To: Kevin Daudt; +Cc: git
In-Reply-To: <20161007045613.GB25613@ikke.info>

Kevin Daudt <me@ikke.info> writes:

> Just wondering why the topic "kd/mailinfo-quoted-string (2016-09-28) 2
> commits" is not listed anymore. Previous what's cooking said it was
> merged to "next".

Thanks for your contribution.

The topic was listed as graduated to 'master' in issue #1 of this
month:

    http://public-inbox.org/git/<xmqqtwct3w0p.fsf@gitster.mtv.corp.google.com>

After a topic graduates, it will not be included in the report.

^ permalink raw reply

* Re: [PATCH v4 0/6] Pull out require_clean_work_tree() functionality from builtin/pull.c
From: Jakub Narębski @ 2016-10-07 16:37 UTC (permalink / raw)
  To: Johannes Schindelin, git; +Cc: Junio C Hamano
In-Reply-To: <cover.1475856491.git.johannes.schindelin@gmx.de>

W dniu 07.10.2016 o 18:08, Johannes Schindelin pisze:

> - marked the hint "please commit or stash them" (reintroduced from the
>   original git-pull.sh script) as translatable.

I wonder if we can make automatic check if everything introduced is
translatable, for example with something akin to "English (XT)"
autogenerated pseudo-localization that Android uses?

Just food for thought.
-- 
Jakub Narębski


^ permalink raw reply

* Re: [PATCH v4 0/6] Pull out require_clean_work_tree() functionality from builtin/pull.c
From: Junio C Hamano @ 2016-10-07 16:34 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: git
In-Reply-To: <cover.1475856491.git.johannes.schindelin@gmx.de>

Johannes Schindelin <johannes.schindelin@gmx.de> writes:

> - changed the exit code to 128 (emulating a die()) if
>   require_clean_work-tree() was asked to be non-gentle.

Ah, I didn't spot this the last round.  Good change.

Thanks, will replace.

^ permalink raw reply

* [PATCH v4 6/6] wt-status: begin error messages with lower-case
From: Johannes Schindelin @ 2016-10-07 16:09 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano
In-Reply-To: <cover.1475856491.git.johannes.schindelin@gmx.de>

The previous code still followed the old git-pull.sh code which did not
adhere to our new convention.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 wt-status.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/wt-status.c b/wt-status.c
index 0020140..e8e5de4 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -2264,15 +2264,15 @@ int require_clean_work_tree(const char *action, const char *hint, int ignore_sub
 
 	if (has_unstaged_changes(ignore_submodules)) {
 		/* TRANSLATORS: the action is e.g. "pull with rebase" */
-		error(_("Cannot %s: You have unstaged changes."), _(action));
+		error(_("cannot %s: You have unstaged changes."), _(action));
 		err = 1;
 	}
 
 	if (has_uncommitted_changes(ignore_submodules)) {
 		if (err)
-			error(_("Additionally, your index contains uncommitted changes."));
+			error(_("additionally, your index contains uncommitted changes."));
 		else
-			error(_("Cannot %s: Your index contains uncommitted changes."),
+			error(_("cannot %s: Your index contains uncommitted changes."),
 			      _(action));
 		err = 1;
 	}
-- 
2.10.0.windows.1.325.ge6089c1

^ permalink raw reply related

* [PATCH v4 5/6] wt-status: teach has_{unstaged,uncommitted}_changes() about submodules
From: Johannes Schindelin @ 2016-10-07 16:09 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano
In-Reply-To: <cover.1475856491.git.johannes.schindelin@gmx.de>

Sometimes we are *actually* interested in those changes... For
example when an interactive rebase wants to continue with a staged
submodule update.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 builtin/pull.c |  2 +-
 wt-status.c    | 16 +++++++++-------
 wt-status.h    |  7 ++++---
 3 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/builtin/pull.c b/builtin/pull.c
index 01b6465..d6e46ee 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -810,7 +810,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 
 		if (!autostash)
 			require_clean_work_tree(N_("pull with rebase"),
-				_("please commit or stash them."), 0);
+				_("please commit or stash them."), 1, 0);
 
 		if (get_rebase_fork_point(rebase_fork_point, repo, *refspecs))
 			hashclr(rebase_fork_point);
diff --git a/wt-status.c b/wt-status.c
index 8fe7d0a..0020140 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -2213,13 +2213,14 @@ void wt_status_print(struct wt_status *s)
 /**
  * Returns 1 if there are unstaged changes, 0 otherwise.
  */
-int has_unstaged_changes(void)
+int has_unstaged_changes(int ignore_submodules)
 {
 	struct rev_info rev_info;
 	int result;
 
 	init_revisions(&rev_info, NULL);
-	DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
+	if (ignore_submodules)
+		DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
 	DIFF_OPT_SET(&rev_info.diffopt, QUICK);
 	diff_setup_done(&rev_info.diffopt);
 	result = run_diff_files(&rev_info, 0);
@@ -2229,7 +2230,7 @@ int has_unstaged_changes(void)
 /**
  * Returns 1 if there are uncommitted changes, 0 otherwise.
  */
-int has_uncommitted_changes(void)
+int has_uncommitted_changes(int ignore_submodules)
 {
 	struct rev_info rev_info;
 	int result;
@@ -2238,7 +2239,8 @@ int has_uncommitted_changes(void)
 		return 0;
 
 	init_revisions(&rev_info, NULL);
-	DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
+	if (ignore_submodules)
+		DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
 	DIFF_OPT_SET(&rev_info.diffopt, QUICK);
 	add_head_to_pending(&rev_info);
 	diff_setup_done(&rev_info.diffopt);
@@ -2250,7 +2252,7 @@ int has_uncommitted_changes(void)
  * If the work tree has unstaged or uncommitted changes, dies with the
  * appropriate message.
  */
-int require_clean_work_tree(const char *action, const char *hint, int gently)
+int require_clean_work_tree(const char *action, const char *hint, int ignore_submodules, int gently)
 {
 	struct lock_file *lock_file = xcalloc(1, sizeof(*lock_file));
 	int err = 0;
@@ -2260,13 +2262,13 @@ int require_clean_work_tree(const char *action, const char *hint, int gently)
 	update_index_if_able(&the_index, lock_file);
 	rollback_lock_file(lock_file);
 
-	if (has_unstaged_changes()) {
+	if (has_unstaged_changes(ignore_submodules)) {
 		/* TRANSLATORS: the action is e.g. "pull with rebase" */
 		error(_("Cannot %s: You have unstaged changes."), _(action));
 		err = 1;
 	}
 
-	if (has_uncommitted_changes()) {
+	if (has_uncommitted_changes(ignore_submodules)) {
 		if (err)
 			error(_("Additionally, your index contains uncommitted changes."));
 		else
diff --git a/wt-status.h b/wt-status.h
index 68e367a..54fec77 100644
--- a/wt-status.h
+++ b/wt-status.h
@@ -129,8 +129,9 @@ __attribute__((format (printf, 3, 4)))
 void status_printf(struct wt_status *s, const char *color, const char *fmt, ...);
 
 /* The following functions expect that the caller took care of reading the index. */
-int has_unstaged_changes(void);
-int has_uncommitted_changes(void);
-int require_clean_work_tree(const char *action, const char *hint, int gently);
+int has_unstaged_changes(int ignore_submodules);
+int has_uncommitted_changes(int ignore_submodules);
+int require_clean_work_tree(const char *action, const char *hint,
+	int ignore_submodules, int gently);
 
 #endif /* STATUS_H */
-- 
2.10.0.windows.1.325.ge6089c1



^ permalink raw reply related

* [PATCH v4 4/6] wt-status: export also the has_un{staged,committed}_changes() functions
From: Johannes Schindelin @ 2016-10-07 16:08 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano
In-Reply-To: <cover.1475856491.git.johannes.schindelin@gmx.de>

They will be used in the upcoming rebase helper.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 wt-status.c | 4 ++--
 wt-status.h | 4 +++-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/wt-status.c b/wt-status.c
index 89475f1..8fe7d0a 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -2213,7 +2213,7 @@ void wt_status_print(struct wt_status *s)
 /**
  * Returns 1 if there are unstaged changes, 0 otherwise.
  */
-static int has_unstaged_changes(void)
+int has_unstaged_changes(void)
 {
 	struct rev_info rev_info;
 	int result;
@@ -2229,7 +2229,7 @@ static int has_unstaged_changes(void)
 /**
  * Returns 1 if there are uncommitted changes, 0 otherwise.
  */
-static int has_uncommitted_changes(void)
+int has_uncommitted_changes(void)
 {
 	struct rev_info rev_info;
 	int result;
diff --git a/wt-status.h b/wt-status.h
index 68b4709..68e367a 100644
--- a/wt-status.h
+++ b/wt-status.h
@@ -128,7 +128,9 @@ void status_printf_ln(struct wt_status *s, const char *color, const char *fmt, .
 __attribute__((format (printf, 3, 4)))
 void status_printf(struct wt_status *s, const char *color, const char *fmt, ...);
 
-/* The following function expects that the caller took care of reading the index. */
+/* The following functions expect that the caller took care of reading the index. */
+int has_unstaged_changes(void);
+int has_uncommitted_changes(void);
 int require_clean_work_tree(const char *action, const char *hint, int gently);
 
 #endif /* STATUS_H */
-- 
2.10.0.windows.1.325.ge6089c1



^ permalink raw reply related

* [PATCH v4 3/6] wt-status: make the require_clean_work_tree() function reusable
From: Johannes Schindelin @ 2016-10-07 16:08 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano
In-Reply-To: <cover.1475856491.git.johannes.schindelin@gmx.de>

The function used by "git pull" to stop the user when the working
tree has changes is useful in other places.

Let's move it into a more prominent (and into an actually reusable)
spot: wt-status.[ch].

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 builtin/pull.c | 77 +---------------------------------------------------------
 wt-status.c    | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 wt-status.h    |  3 +++
 3 files changed, 80 insertions(+), 76 deletions(-)

diff --git a/builtin/pull.c b/builtin/pull.c
index 58fc176..01b6465 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -17,6 +17,7 @@
 #include "revision.h"
 #include "tempfile.h"
 #include "lockfile.h"
+#include "wt-status.h"
 
 enum rebase_type {
 	REBASE_INVALID = -1,
@@ -326,82 +327,6 @@ static int git_pull_config(const char *var, const char *value, void *cb)
 }
 
 /**
- * Returns 1 if there are unstaged changes, 0 otherwise.
- */
-static int has_unstaged_changes(void)
-{
-	struct rev_info rev_info;
-	int result;
-
-	init_revisions(&rev_info, NULL);
-	DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
-	DIFF_OPT_SET(&rev_info.diffopt, QUICK);
-	diff_setup_done(&rev_info.diffopt);
-	result = run_diff_files(&rev_info, 0);
-	return diff_result_code(&rev_info.diffopt, result);
-}
-
-/**
- * Returns 1 if there are uncommitted changes, 0 otherwise.
- */
-static int has_uncommitted_changes(void)
-{
-	struct rev_info rev_info;
-	int result;
-
-	if (is_cache_unborn())
-		return 0;
-
-	init_revisions(&rev_info, NULL);
-	DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
-	DIFF_OPT_SET(&rev_info.diffopt, QUICK);
-	add_head_to_pending(&rev_info);
-	diff_setup_done(&rev_info.diffopt);
-	result = run_diff_index(&rev_info, 1);
-	return diff_result_code(&rev_info.diffopt, result);
-}
-
-/**
- * If the work tree has unstaged or uncommitted changes, dies with the
- * appropriate message.
- */
-static int require_clean_work_tree(const char *action, const char *hint,
-		int gently)
-{
-	struct lock_file *lock_file = xcalloc(1, sizeof(*lock_file));
-	int err = 0;
-
-	hold_locked_index(lock_file, 0);
-	refresh_cache(REFRESH_QUIET);
-	update_index_if_able(&the_index, lock_file);
-	rollback_lock_file(lock_file);
-
-	if (has_unstaged_changes()) {
-		/* TRANSLATORS: the action is e.g. "pull with rebase" */
-		error(_("Cannot %s: You have unstaged changes."), _(action));
-		err = 1;
-	}
-
-	if (has_uncommitted_changes()) {
-		if (err)
-			error(_("Additionally, your index contains uncommitted changes."));
-		else
-			error(_("Cannot %s: Your index contains uncommitted changes."),
-			      _(action));
-		err = 1;
-	}
-
-	if (err) {
-		if (hint)
-			error("%s", hint);
-		if (!gently)
-			exit(128);
-	}
-
-	return err;
-}
-
-/**
  * Appends merge candidates from FETCH_HEAD that are not marked not-for-merge
  * into merge_heads.
  */
diff --git a/wt-status.c b/wt-status.c
index 99d1b0a..89475f1 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -16,6 +16,7 @@
 #include "strbuf.h"
 #include "utf8.h"
 #include "worktree.h"
+#include "lockfile.h"
 
 static const char cut_line[] =
 "------------------------ >8 ------------------------\n";
@@ -2208,3 +2209,78 @@ void wt_status_print(struct wt_status *s)
 		break;
 	}
 }
+
+/**
+ * Returns 1 if there are unstaged changes, 0 otherwise.
+ */
+static int has_unstaged_changes(void)
+{
+	struct rev_info rev_info;
+	int result;
+
+	init_revisions(&rev_info, NULL);
+	DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
+	DIFF_OPT_SET(&rev_info.diffopt, QUICK);
+	diff_setup_done(&rev_info.diffopt);
+	result = run_diff_files(&rev_info, 0);
+	return diff_result_code(&rev_info.diffopt, result);
+}
+
+/**
+ * Returns 1 if there are uncommitted changes, 0 otherwise.
+ */
+static int has_uncommitted_changes(void)
+{
+	struct rev_info rev_info;
+	int result;
+
+	if (is_cache_unborn())
+		return 0;
+
+	init_revisions(&rev_info, NULL);
+	DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
+	DIFF_OPT_SET(&rev_info.diffopt, QUICK);
+	add_head_to_pending(&rev_info);
+	diff_setup_done(&rev_info.diffopt);
+	result = run_diff_index(&rev_info, 1);
+	return diff_result_code(&rev_info.diffopt, result);
+}
+
+/**
+ * If the work tree has unstaged or uncommitted changes, dies with the
+ * appropriate message.
+ */
+int require_clean_work_tree(const char *action, const char *hint, int gently)
+{
+	struct lock_file *lock_file = xcalloc(1, sizeof(*lock_file));
+	int err = 0;
+
+	hold_locked_index(lock_file, 0);
+	refresh_cache(REFRESH_QUIET);
+	update_index_if_able(&the_index, lock_file);
+	rollback_lock_file(lock_file);
+
+	if (has_unstaged_changes()) {
+		/* TRANSLATORS: the action is e.g. "pull with rebase" */
+		error(_("Cannot %s: You have unstaged changes."), _(action));
+		err = 1;
+	}
+
+	if (has_uncommitted_changes()) {
+		if (err)
+			error(_("Additionally, your index contains uncommitted changes."));
+		else
+			error(_("Cannot %s: Your index contains uncommitted changes."),
+			      _(action));
+		err = 1;
+	}
+
+	if (err) {
+		if (hint)
+			error("%s", hint);
+		if (!gently)
+			exit(128);
+	}
+
+	return err;
+}
diff --git a/wt-status.h b/wt-status.h
index e401837..68b4709 100644
--- a/wt-status.h
+++ b/wt-status.h
@@ -128,4 +128,7 @@ void status_printf_ln(struct wt_status *s, const char *color, const char *fmt, .
 __attribute__((format (printf, 3, 4)))
 void status_printf(struct wt_status *s, const char *color, const char *fmt, ...);
 
+/* The following function expects that the caller took care of reading the index. */
+int require_clean_work_tree(const char *action, const char *hint, int gently);
+
 #endif /* STATUS_H */
-- 
2.10.0.windows.1.325.ge6089c1



^ permalink raw reply related

* [PATCH v4 2/6] pull: make code more similar to the shell script again
From: Johannes Schindelin @ 2016-10-07 16:08 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano
In-Reply-To: <cover.1475856491.git.johannes.schindelin@gmx.de>

When converting the pull command to a builtin, the
require_clean_work_tree() function was renamed and the pull-specific
parts hard-coded.

This makes it impossible to reuse the code, so let's modify the code to
make it more similar to the original shell script again.

Note: when the hint "Please commit or stash them" was introduced first,
Git did not have the convention of continuing error messages in lower
case, but now we do have that convention, therefore we reintroduce this
hint down-cased, obeying said convention.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 builtin/pull.c | 30 ++++++++++++++++++++----------
 1 file changed, 20 insertions(+), 10 deletions(-)

diff --git a/builtin/pull.c b/builtin/pull.c
index d4bd635..58fc176 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -365,10 +365,11 @@ static int has_uncommitted_changes(void)
  * If the work tree has unstaged or uncommitted changes, dies with the
  * appropriate message.
  */
-static void die_on_unclean_work_tree(void)
+static int require_clean_work_tree(const char *action, const char *hint,
+		int gently)
 {
 	struct lock_file *lock_file = xcalloc(1, sizeof(*lock_file));
-	int do_die = 0;
+	int err = 0;
 
 	hold_locked_index(lock_file, 0);
 	refresh_cache(REFRESH_QUIET);
@@ -376,20 +377,28 @@ static void die_on_unclean_work_tree(void)
 	rollback_lock_file(lock_file);
 
 	if (has_unstaged_changes()) {
-		error(_("Cannot pull with rebase: You have unstaged changes."));
-		do_die = 1;
+		/* TRANSLATORS: the action is e.g. "pull with rebase" */
+		error(_("Cannot %s: You have unstaged changes."), _(action));
+		err = 1;
 	}
 
 	if (has_uncommitted_changes()) {
-		if (do_die)
+		if (err)
 			error(_("Additionally, your index contains uncommitted changes."));
 		else
-			error(_("Cannot pull with rebase: Your index contains uncommitted changes."));
-		do_die = 1;
+			error(_("Cannot %s: Your index contains uncommitted changes."),
+			      _(action));
+		err = 1;
 	}
 
-	if (do_die)
-		exit(1);
+	if (err) {
+		if (hint)
+			error("%s", hint);
+		if (!gently)
+			exit(128);
+	}
+
+	return err;
 }
 
 /**
@@ -875,7 +884,8 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 			die(_("Updating an unborn branch with changes added to the index."));
 
 		if (!autostash)
-			die_on_unclean_work_tree();
+			require_clean_work_tree(N_("pull with rebase"),
+				_("please commit or stash them."), 0);
 
 		if (get_rebase_fork_point(rebase_fork_point, repo, *refspecs))
 			hashclr(rebase_fork_point);
-- 
2.10.0.windows.1.325.ge6089c1



^ permalink raw reply related

* [PATCH v4 0/6] Pull out require_clean_work_tree() functionality from builtin/pull.c
From: Johannes Schindelin @ 2016-10-07 16:08 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano
In-Reply-To: <cover.1475586229.git.johannes.schindelin@gmx.de>

This is the 5th last patch series of my work to accelerate interactive
rebases in particular on Windows.

Basically, all it does is to make reusable some functions that were
ported over from git-pull.sh but made private to builtin/pull.c.

Changes since v3:

- reworded 3/5's commit message according to Junio's suggestion.

- fixed a tyop in 4/5's commit message, pointed out by Jakub.

- marked the hint "please commit or stash them" (reintroduced from the
  original git-pull.sh script) as translatable.

- changed the exit code to 128 (emulating a die()) if
  require_clean_work-tree() was asked to be non-gentle.

- fixed a tyop in 3/6 (which was replaced in 4/6, but it is good not to
  introduce bugs only to fix them right away).

- prefixed the commit message of 4/6 with the "wt-status:" prefix,
  replicating Junio's commit message in the `pu` branch.


Johannes Schindelin (6):
  pull: drop confusing prefix parameter of die_on_unclean_work_tree()
  pull: make code more similar to the shell script again
  wt-status: make the require_clean_work_tree() function reusable
  wt-status: export also the has_un{staged,committed}_changes()
    functions
  wt-status: teach has_{unstaged,uncommitted}_changes() about submodules
  wt-status: begin error messages with lower-case

 builtin/pull.c | 71 +++-------------------------------------------------
 wt-status.c    | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 wt-status.h    |  6 +++++
 3 files changed, 87 insertions(+), 68 deletions(-)

Published-As: https://github.com/dscho/git/releases/tag/require-clean-work-tree-v4
Fetch-It-Via: git fetch https://github.com/dscho/git require-clean-work-tree-v4

Interdiff vs v3:

 diff --git a/builtin/pull.c b/builtin/pull.c
 index 0bf9802..d6e46ee 100644
 --- a/builtin/pull.c
 +++ b/builtin/pull.c
 @@ -810,7 +810,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
  
  		if (!autostash)
  			require_clean_work_tree(N_("pull with rebase"),
 -				"please commit or stash them.", 1, 0);
 +				_("please commit or stash them."), 1, 0);
  
  		if (get_rebase_fork_point(rebase_fork_point, repo, *refspecs))
  			hashclr(rebase_fork_point);
 diff --git a/wt-status.c b/wt-status.c
 index ef67593..e8e5de4 100644
 --- a/wt-status.c
 +++ b/wt-status.c
 @@ -2281,7 +2281,7 @@ int require_clean_work_tree(const char *action, const char *hint, int ignore_sub
  		if (hint)
  			error("%s", hint);
  		if (!gently)
 -			exit(err);
 +			exit(128);
  	}
  
  	return err;

-- 
2.10.0.windows.1.325.ge6089c1

base-commit: a23ca1b8dc42ffd4de2ef30d67ce1e21ded29886

^ permalink raw reply

* [PATCH v4 1/6] pull: drop confusing prefix parameter of die_on_unclean_work_tree()
From: Johannes Schindelin @ 2016-10-07 16:08 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano
In-Reply-To: <cover.1475856491.git.johannes.schindelin@gmx.de>

In cmd_pull(), when verifying that there are no changes preventing a
rebasing pull, we diligently pass the prefix parameter to the
die_on_unclean_work_tree() function which in turn diligently passes it
to the has_unstaged_changes() and has_uncommitted_changes() functions.

The casual reader might now be curious (as this developer was) whether
that means that calling `git pull --rebase` in a subdirectory will
ignore unstaged changes in other parts of the working directory. And be
puzzled that `git pull --rebase` (correctly) complains about those
changes outside of the current directory.

The puzzle is easily resolved: while we take pains to pass around the
prefix and even pass it to init_revisions(), the fact that no paths are
passed to init_revisions() ensures that the prefix is simply ignored.

That, combined with the fact that we will *always* want a *full* working
directory check before running a rebasing pull, is reason enough to
simply do away with the actual prefix parameter and to pass NULL
instead, as if we were running this from the top-level working directory
anyway.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 builtin/pull.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/builtin/pull.c b/builtin/pull.c
index 398aae1..d4bd635 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -328,12 +328,12 @@ static int git_pull_config(const char *var, const char *value, void *cb)
 /**
  * Returns 1 if there are unstaged changes, 0 otherwise.
  */
-static int has_unstaged_changes(const char *prefix)
+static int has_unstaged_changes(void)
 {
 	struct rev_info rev_info;
 	int result;
 
-	init_revisions(&rev_info, prefix);
+	init_revisions(&rev_info, NULL);
 	DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
 	DIFF_OPT_SET(&rev_info.diffopt, QUICK);
 	diff_setup_done(&rev_info.diffopt);
@@ -344,7 +344,7 @@ static int has_unstaged_changes(const char *prefix)
 /**
  * Returns 1 if there are uncommitted changes, 0 otherwise.
  */
-static int has_uncommitted_changes(const char *prefix)
+static int has_uncommitted_changes(void)
 {
 	struct rev_info rev_info;
 	int result;
@@ -352,7 +352,7 @@ static int has_uncommitted_changes(const char *prefix)
 	if (is_cache_unborn())
 		return 0;
 
-	init_revisions(&rev_info, prefix);
+	init_revisions(&rev_info, NULL);
 	DIFF_OPT_SET(&rev_info.diffopt, IGNORE_SUBMODULES);
 	DIFF_OPT_SET(&rev_info.diffopt, QUICK);
 	add_head_to_pending(&rev_info);
@@ -365,7 +365,7 @@ static int has_uncommitted_changes(const char *prefix)
  * If the work tree has unstaged or uncommitted changes, dies with the
  * appropriate message.
  */
-static void die_on_unclean_work_tree(const char *prefix)
+static void die_on_unclean_work_tree(void)
 {
 	struct lock_file *lock_file = xcalloc(1, sizeof(*lock_file));
 	int do_die = 0;
@@ -375,12 +375,12 @@ static void die_on_unclean_work_tree(const char *prefix)
 	update_index_if_able(&the_index, lock_file);
 	rollback_lock_file(lock_file);
 
-	if (has_unstaged_changes(prefix)) {
+	if (has_unstaged_changes()) {
 		error(_("Cannot pull with rebase: You have unstaged changes."));
 		do_die = 1;
 	}
 
-	if (has_uncommitted_changes(prefix)) {
+	if (has_uncommitted_changes()) {
 		if (do_die)
 			error(_("Additionally, your index contains uncommitted changes."));
 		else
@@ -875,7 +875,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 			die(_("Updating an unborn branch with changes added to the index."));
 
 		if (!autostash)
-			die_on_unclean_work_tree(prefix);
+			die_on_unclean_work_tree();
 
 		if (get_rebase_fork_point(rebase_fork_point, repo, *refspecs))
 			hashclr(rebase_fork_point);
-- 
2.10.0.windows.1.325.ge6089c1



^ permalink raw reply related

* Re: Systems with old regex system headers/libraries don't pick up git's compat/regex header file
From: Jeff King @ 2016-10-07 16:06 UTC (permalink / raw)
  To: Richard Lloyd; +Cc: git
In-Reply-To: <4ac0ce84-ca6c-3650-ef5e-e13c54c60504@connectinternetsolutions.com>

On Fri, Oct 07, 2016 at 04:45:08PM +0100, Richard Lloyd wrote:

> On 06/10/16 20:11, Jeff King wrote:
> > Junio mentioned the NO_REGEX knob in the Makefile. If that works for
> > you, the next step is probably to add a line to the HP-UX section of
> > config.mak.uname, so that it just works out of the box.
> 
> This doesn't work because the check in git-compat-util.h only looks
> for REG_STARTEND being defined (if it isn't, it #error's out).
> 
> That define is not mentioned anywhere else other than in the
> compat/regex tree, which is why I used -Icompat/regex to pick up
> <regex.h> from there - this was the "easiest" solution for me on
> HP-UX 11.

I'm confused. Setting NO_REGEX in the Makefile will add -Icompat/regex
to your compiler invocation. So git-compat-util.h should pick up our
compat regex routines, which _do_ have REG_STARTEND.

How are you building? Doing:

  make NO_REGEX=1

is supposed to work, and if it doesn't, there's a bug.

-Peff

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox