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>
This commit is contained in:
Junio C Hamano 2011-08-25 11:29:57 -07:00
parent ccef6048cd
commit b6194678b0
2 changed files with 9 additions and 6 deletions

View File

@ -47,12 +47,14 @@ OPTIONS
-e <pattern>:: -e <pattern>::
--exclude=<pattern>:: --exclude=<pattern>::
Specify special exceptions to not be cleaned. Each <pattern> is In addition to those found in .gitignore (per directory) and
the same form as in $GIT_DIR/info/excludes and this option can be $GIT_DIR/info/exclude, also consider these patterns to be in the
given multiple times. set of the ignore rules in effect.
-x:: -x::
Don't use the ignore rules. This allows removing all untracked Don't use the standard ignore rules read from .gitignore (per
directory) and $GIT_DIR/info/exclude, but do still use the ignore
rules given with `-e` options. This allows removing all untracked
files, including build products. This can be used (possibly in files, including build products. This can be used (possibly in
conjunction with 'git reset') to create a pristine conjunction with 'git reset') to create a pristine
working directory to test a clean build. working directory to test a clean build.

View File

@ -54,7 +54,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
OPT_BOOLEAN('d', NULL, &remove_directories, OPT_BOOLEAN('d', NULL, &remove_directories,
"remove whole directories"), "remove whole directories"),
{ OPTION_CALLBACK, 'e', "exclude", &exclude_list, "pattern", { OPTION_CALLBACK, 'e', "exclude", &exclude_list, "pattern",
"exclude <pattern>", PARSE_OPT_NONEG, exclude_cb }, "add <pattern> to ignore rules", PARSE_OPT_NONEG, exclude_cb },
OPT_BOOLEAN('x', NULL, &ignored, "remove ignored files, too"), OPT_BOOLEAN('x', NULL, &ignored, "remove ignored files, too"),
OPT_BOOLEAN('X', NULL, &ignored_only, OPT_BOOLEAN('X', NULL, &ignored_only,
"remove only ignored files"), "remove only ignored files"),
@ -98,7 +98,8 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
setup_standard_excludes(&dir); setup_standard_excludes(&dir);
for (i = 0; i < exclude_list.nr; i++) 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); pathspec = get_pathspec(prefix, argv);