Junio C Hamano <gitster@xxxxxxxxx> writes: > The documentation and the implementation of "git clean" is quite confused. > ... So here is a patch to fix the confusion. It does not add a new "--except=C" I alluded to, but at least it should be the right first step to make the document clearly describe what the existing option does. -- >8 -- Subject: [PATCH] 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). 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@xxxxxxxxx> --- Documentation/git-clean.txt | 6 +++--- builtin/clean.c | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt index 974e04e..a7a18e3 100644 --- a/Documentation/git-clean.txt +++ b/Documentation/git-clean.txt @@ -47,9 +47,9 @@ OPTIONS -e <pattern>:: --exclude=<pattern>:: - Specify special exceptions to not be cleaned. Each <pattern> is - the same form as in $GIT_DIR/info/excludes and this option can be - given multiple times. + In addition to what are found in .gitignore (per directory) and + $GIT_DIR/info/exclude, also consider these patterns to be in the + set of the ignore rules in effect. -x:: Don't use the ignore rules. This allows removing all untracked diff --git a/builtin/clean.c b/builtin/clean.c index 75697f7..3782718 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -76,6 +76,8 @@ int cmd_clean(int argc, const char **argv, const char *prefix) if (ignored && ignored_only) die(_("-x and -X cannot be used together")); + if (ignored && exclude_list.nr) + die(_("adding exclude with -e and ignoring it with -x is crazy")); if (!show_only && !force) { if (config_set) @@ -98,7 +100,8 @@ int cmd_clean(int argc, const char **argv, const char *prefix) setup_standard_excludes(&dir); for (i = 0; i < exclude_list.nr; i++) - add_exclude(exclude_list.items[i].string, "", 0, dir.exclude_list); + add_exclude(exclude_list.items[i].string, "", 0, + &dir.exclude_list[EXC_CMDL]); pathspec = get_pathspec(prefix, argv); -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html