Documentation: clarify "git clean -e <pattern>"

The current explanation of -e can be misread as allowing the user to say I know 'git clean -XYZ' (substitute -XYZ with any option and/or parameter) will remove paths A, B, and C, and I want them all removed except for paths matching this pattern by adding '-e C' to the same command line, i.e. 'git clean -e C -XYZ'. But that is not what this option does. It augments the set of ignore rules from the command line, just like the same "-e <pattern>" argument does with the "ls-files" command (the user could probably pass "-e \!C" to tell the command to clean everything the command would normally remove, except for C). Also error out when both -x and -e are given with an explanation of what -e means---it is a symptom of misunderstanding what -e does. It also fixes small style nit in the parameter to add_exclude() call. The current code only works because EXC_CMDL happens to be defined as 0. Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Aug 25, 2011 at 11:29 UTC b6194678b0eebdaf36d41e894b484206810f8221
2 files changed +9 -6
Documentation/git-clean.txt
+6 -4
@@ -47,12 +47,14 @@ OPTIONS
47
48 -e <pattern>::
49 --exclude=<pattern>::
50 - Specify special exceptions to not be cleaned. Each <pattern> is
51 - the same form as in $GIT_DIR/info/excludes and this option can be
52 - given multiple times.
50 + In addition to those found in .gitignore (per directory) and
51 + $GIT_DIR/info/exclude, also consider these patterns to be in the
52 + set of the ignore rules in effect.
53
54 -x::
55 - Don't use the ignore rules. This allows removing all untracked
55 + Don't use the standard ignore rules read from .gitignore (per
56 + directory) and $GIT_DIR/info/exclude, but do still use the ignore
57 + rules given with `-e` options. This allows removing all untracked
58 files, including build products. This can be used (possibly in
59 conjunction with 'git reset') to create a pristine
60 working directory to test a clean build.
builtin/clean.c
+3 -2
@@ -54,7 +54,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
54 OPT_BOOLEAN('d', NULL, &remove_directories,
55 "remove whole directories"),
56 { OPTION_CALLBACK, 'e', "exclude", &exclude_list, "pattern",
57 - "exclude <pattern>", PARSE_OPT_NONEG, exclude_cb },
57 + "add <pattern> to ignore rules", PARSE_OPT_NONEG, exclude_cb },
58 OPT_BOOLEAN('x', NULL, &ignored, "remove ignored files, too"),
59 OPT_BOOLEAN('X', NULL, &ignored_only,
60 "remove only ignored files"),
@@ -98,7 +98,8 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
98 setup_standard_excludes(&dir);
99
100 for (i = 0; i < exclude_list.nr; i++)
101 - add_exclude(exclude_list.items[i].string, "", 0, dir.exclude_list);
101 + add_exclude(exclude_list.items[i].string, "", 0,
102 + &dir.exclude_list[EXC_CMDL]);
103
104 pathspec = get_pathspec(prefix, argv);
105