Currently, 'git add' will complain about excluded files, even if they are already tracked:
$ mkdir dir && touch dir/file && cat > .gitignore <<< dir $ git add -f dir/file $ git status ... new file: dir/file ... $ git add dir/file The following paths are ignored by one of your .gitignore files: dir Use -f if you really want to add them. fatal: no files added
This commit changes 'git add' to disregard excludes for tracked files whose paths are explicitly specified on the command-line. So in the above example, 'git add dir/file' no longer requires a '-f'. However, 'git add dir' does.
Signed-off-by: Greg Brockman <gdb@mit.edu> --- builtin/add.c | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-)
What do people think of this behavior? My motivation in writing this patch is that I sometimes track files in an ignored directory, and it can be cumbersome to remember to pass '-f' when adding them. Related commands such as 'git add -p' and 'git commit -a' do not require a '-f' in this case, so it feels natural to me not to require extra user confirmation when an explicit path has been provided.
As always, thanks in advance for your comments.
Show changes to builtin/add.c +19 −0
diff --git a/builtin/add.c b/builtin/add.c index 56a4e0a..46b1fdb 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -423,8 +423,27 @@ int cmd_add(int argc, const char **argv, const char *prefix) /* Set up the default git porcelain excludes */ memset(&dir, 0, sizeof(dir)); if (!ignored_too) { + const char **tracked = xmalloc(sizeof(char *) * (argc + 1)); + const char **p; + int tidx = 0; + int pidx = 0; + dir.flags |= DIR_COLLECT_IGNORED; setup_standard_excludes(&dir); + + for (p = pathspec; *p; p++) { + if ((*p)[0] && cache_name_exists(*p, strlen(*p), 0)) + tracked[tidx++] = *p; + else + pathspec[pidx++] = *p; + } + + tracked[tidx] = NULL; + pathspec[pidx] = NULL; + exit_status |= add_files_to_cache(prefix, tracked, flags); + /* All files were tracked */ + if (pidx == 0) + goto finish; } /* This picks up the paths that are not tracked */
-- 1.7.0.4