Re: What's cooking in git.git (Apr 2013, #05; Mon, 15)

3 messages, 3 authors, 2016-06-15 · open the first message on its own page

Re: What's cooking in git.git (Apr 2013, #05; Mon, 15)

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:56:55

Jonathan Nieder [off-list ref] writes:
Junio C Hamano wrote:
quoted
    You ran 'git add' with neither '-A (--all)' or '--no-all', whose
    behaviour will change in Git 2.0 with respect to paths you
    removed from your working tree.

    * 'git add --no-all <pathspec>', which is the current default,
      ignores paths you removed from your working tree.

    * 'git add --all <pathspec>' will let you also record the
      removals.

    The removed paths (e.g. '%s') are ignored with this version of Git.
    Run 'git status' to remind yourself what paths you have removed
    from your working tree.

or something?
That looks good. :)
I think the direction may be good but the above is too tall to be
the final version. of the message.  Somebody good at phrasing needs
to trim it down without losing the essense.

Re: What's cooking in git.git (Apr 2013, #05; Mon, 15)

From: Jeff King <hidden>
Date: 2016-06-15 22:56:55

On Fri, Apr 19, 2013 at 10:25:46AM -0700, Junio C Hamano wrote:
Jonathan Nieder [off-list ref] writes:
quoted
Junio C Hamano wrote:
quoted
    You ran 'git add' with neither '-A (--all)' or '--no-all', whose
    behaviour will change in Git 2.0 with respect to paths you
    removed from your working tree.

    * 'git add --no-all <pathspec>', which is the current default,
      ignores paths you removed from your working tree.

    * 'git add --all <pathspec>' will let you also record the
      removals.

    The removed paths (e.g. '%s') are ignored with this version of Git.
    Run 'git status' to remind yourself what paths you have removed
    from your working tree.

or something?
That looks good. :)
I think the direction may be good but the above is too tall to be
the final version. of the message.  Somebody good at phrasing needs
to trim it down without losing the essense.
Hmph. I actually like it as it is. It says:

  1. Here's what triggered this warning (removed paths without -A).

  2. Here is how you tell git what you want to do (--all/--no-all)

  3. Here is how you get more information about what you wanted to do
     (mention one such path, point to "git status").

I would not want to cut out any of those three. You could perhaps cut
out the bullet points in the middle, which reduces (2), but the user may
be able to figure it out from the first sentence. However, I like the
explicitness of those bullet points (and I prefer them to a wall of text
which is more daunting to read).

-Peff

jc/add-2.0-delete-default (Re: What's cooking in git.git (Apr 2013, #05; Mon, 15))

From: Jonathan Nieder <hidden>
Date: 2016-06-15 22:56:56

On Fri, Apr 19, 2013 at 10:25:46AM -0700, Junio C Hamano wrote:
quoted
quoted
Junio C Hamano wrote:
quoted
quoted
quoted
    You ran 'git add' with neither '-A (--all)' or '--no-all', whose
    behaviour will change in Git 2.0 with respect to paths you
    removed from your working tree.

    * 'git add --no-all <pathspec>', which is the current default,
      ignores paths you removed from your working tree.

    * 'git add --all <pathspec>' will let you also record the
      removals.

    The removed paths (e.g. '%s') are ignored with this version of Git.
    Run 'git status' to remind yourself what paths you have removed
    from your working tree.

or something?
[...]
quoted
                                    Somebody good at phrasing needs
to trim it down without losing the essense.
By the way, it was mentioned on IRC that the above is a bit odd for
a different reason: the option --no-all that maintains the old behavior
is not intuitively named.

How about something like this?

	warning: "git add" run on path with files removed (e.g., '%s')
	hint: use "git add --ignore-removals <pathspec>" to ignore removals
	hint: or "git add --no-ignore-removals <pathspec>" to notice them
	hint: --ignore-removals is the default but this will change soon
	hint: see git-add(1) for details

Then the --ignore-removals option could be added using a patch like
the following.

Signed-off-by: Jonathan Nieder <redacted>
---
 Documentation/git-add.txt | 24 +++++++++++++++---------
 builtin/add.c             | 28 +++++++++++++++++++++++++---
 2 files changed, 40 insertions(+), 12 deletions(-)
diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt
index b0944e57..8607cf37 100644
--- a/Documentation/git-add.txt
+++ b/Documentation/git-add.txt
@@ -9,7 +9,8 @@ SYNOPSIS
 --------
 [verse]
 'git add' [-n] [-v] [--force | -f] [--interactive | -i] [--patch | -p]
-	  [--edit | -e] [--all | [--update | -u]] [--intent-to-add | -N]
+	  [--edit | -e] [--update | -u] [--no-ignore-removals | -A]
+	  [--intent-to-add | -N]
 	  [--refresh] [--ignore-errors] [--ignore-missing] [--]
 	  [<pathspec>...]
 
@@ -109,17 +110,22 @@ If no <pathspec> is given, the current version of Git defaults to
 and its subdirectories. This default will change in a future version
 of Git, hence the form without <pathspec> should not be used.
 
+--ignore-removals::
+--no-ignore-removals::
 -A::
 --all::
-	Update the index not only where the working tree has a file
-	matching <pathspec> but also where the index already has an
-	entry.	This adds, modifies, and removes index entries to
-	match the working tree.
+	Update the index only where the working tree has a file
+	matching <pathspec>.  This adds and modifies index entries
+	to match the working tree but ignores removed files.
 +
-If no <pathspec> is given, the current version of Git defaults to
-"."; in other words, update all files in the current directory
-and its subdirectories. This default will change in a future version
-of Git, hence the form without <pathspec> should not be used.
+This is currently the default.  Git 2.0 will change the default
+to --no-ignore-removals.
++
+With --no-ignore-removals (and its historical synonyms `-A` and
+`--all`), if no <pathspec> is given, the current version of Git
+defaults to "."; in other words, update all files in the current
+directory and its subdirectories. This default will change in a future
+version of Git, hence the form without <pathspec> should not be used.
 
 -N::
 --intent-to-add::
diff --git a/builtin/add.c b/builtin/add.c
index ab1c9e8f..4a4e71ad 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -28,6 +28,14 @@ struct update_callback_data {
 	int add_errors;
 };
 
+static int parse_opt_neg_tertiary(const struct option *opt, const char *arg,
+				  int unset)
+{
+	int *target = opt->value;
+	*target = unset ? 1 : 2;
+	return 0;
+}
+
 static int fix_unmerged_status(struct diff_filepair *p,
 			       struct update_callback_data *data)
 {
@@ -271,7 +279,8 @@ static const char ignore_error[] =
 N_("The following paths are ignored by one of your .gitignore files:\n");
 
 static int verbose = 0, show_only = 0, ignored_too = 0, refresh_only = 0;
-static int ignore_add_errors, addremove, intent_to_add, ignore_missing = 0;
+static int ignore_add_errors, intent_to_add, ignore_missing = 0;
+static int ignore_removals, addremove;
 
 static struct option builtin_add_options[] = {
 	OPT__DRY_RUN(&show_only, N_("dry run")),
@@ -283,10 +292,12 @@ static struct option builtin_add_options[] = {
 	OPT__FORCE(&ignored_too, N_("allow adding otherwise ignored files")),
 	OPT_BOOLEAN('u', "update", &take_worktree_changes, N_("update tracked files")),
 	OPT_BOOLEAN('N', "intent-to-add", &intent_to_add, N_("record only the fact that the path will be added later")),
-	OPT_BOOLEAN('A', "all", &addremove, N_("add changes from all tracked and untracked files")),
+	OPT_UYN( 0 , "ignore-removals", &ignore_removals, N_("do not record removal of tracked files")),
 	OPT_BOOLEAN( 0 , "refresh", &refresh_only, N_("don't add, only refresh the index")),
 	OPT_BOOLEAN( 0 , "ignore-errors", &ignore_add_errors, N_("just skip files which cannot be added because of errors")),
 	OPT_BOOLEAN( 0 , "ignore-missing", &ignore_missing, N_("check if - even missing - files are ignored in dry run")),
+	{ OPTION_CALLBACK, 'A', "all", &ignore_removals, NULL, N_("synonym for --no-ignore-removals"),
+	  PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, &parse_opt_neg_tertiary },
 	OPT_END(),
 };
 
@@ -377,8 +388,19 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 	argc--;
 	argv++;
 
+	if (ignore_removals == 2) {	/* --no-ignore-removals, or -A */
+		addremove = 1;
+		ignore_removals = 0;
+	}
+	if (ignore_removals && take_worktree_changes)
+		/*
+		 * NEEDSWORK: "git add -u --ignore-removals" should mean
+		 * "git diff --diff-filter=M | git apply --cached"
+		 */
+		die(_("--ignore-removals cannot be used with --update"));
 	if (addremove && take_worktree_changes)
-		die(_("-A and -u are mutually incompatible"));
+		/* -u --no-ignore-removals is the same as -u */
+		addremove = 0;
 	if (!show_only && ignore_missing)
 		die(_("Option --ignore-missing can only be used together with --dry-run"));
 	if (addremove) {
-- 
1.8.2.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help