With the -e/--exclude option for git-clean, a user can specify files that they haven't yet told git about, but either need for a short amount of time or plan to tell git about them later. This allows one to still use git-clean while these files are around without losing data. Signed-off-by: Jared Hance <jaredhance@xxxxxxxxx> --- Documentation/git-clean.txt | 6 +++++- builtin/clean.c | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletions(-) diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt index a81cb6c..2bf9cf2 100644 --- a/Documentation/git-clean.txt +++ b/Documentation/git-clean.txt @@ -8,7 +8,7 @@ git-clean - Remove untracked files from the working tree SYNOPSIS -------- [verse] -'git clean' [-d] [-f] [-n] [-q] [-x | -X] [--] <path>... +'git clean' [-d] [-f] [-n] [-q] [-e] [-x | -X] [--] <path>... DESCRIPTION ----------- @@ -45,6 +45,10 @@ OPTIONS Be quiet, only report errors, but not the files that are successfully removed. +-e:: +--exclude:: + Specify special exceptions to not be cleaned. Separate with colon. + -x:: Don't use the ignore rules. This allows removing all untracked files, including build products. This can be used (possibly in diff --git a/builtin/clean.c b/builtin/clean.c index fac64e6..aa3eed8 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -13,6 +13,7 @@ #include "quote.h" static int force = -1; /* unset */ +static char *excludes; static const char *const builtin_clean_usage[] = { "git clean [-d] [-f] [-n] [-q] [-x | -X] [--] <paths>...", @@ -36,6 +37,8 @@ int cmd_clean(int argc, const char **argv, const char *prefix) struct dir_struct dir; static const char **pathspec; struct strbuf buf = STRBUF_INIT; + struct strbuf excludes_buf = STRBUF_INIT; + struct strbuf **excludes_split; const char *qname; char *seen = NULL; struct option options[] = { @@ -44,6 +47,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix) OPT_BOOLEAN('f', "force", &force, "force"), OPT_BOOLEAN('d', NULL, &remove_directories, "remove whole directories"), + OPT_STRING('e', "exclude", &excludes, "EXCLUDES", "specify files not to clean"), OPT_BOOLEAN('x', NULL, &ignored, "remove ignored files, too"), OPT_BOOLEAN('X', NULL, &ignored_only, "remove only ignored files"), @@ -81,6 +85,17 @@ int cmd_clean(int argc, const char **argv, const char *prefix) if (!ignored) setup_standard_excludes(&dir); + if (excludes) { + strbuf_addstr(&excludes_buf, excludes); + excludes_split = strbuf_split(&excludes_buf, ':'); + for (i = 0; excludes_split[i]; i++) { + if (excludes_split[i]->buf[excludes_split[i]->len - 1] == ':') { + strbuf_remove(excludes_split[i], excludes_split[i]->len - 1, 1); + } + add_exclude(excludes_split[i]->buf, "", 0, dir.exclude_list); + } + } + pathspec = get_pathspec(prefix, argv); fill_directory(&dir, pathspec); @@ -167,5 +182,11 @@ int cmd_clean(int argc, const char **argv, const char *prefix) free(seen); strbuf_release(&directory); + if (excludes) { + strbuf_release(&excludes_buf); + for (i = 0; excludes_split[i]; i++) { + strbuf_release(excludes_split[i]); + } + } return (errors != 0); } -- 1.7.1.1 -- 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