git-add: add ignored files when asked explicitly.

One thing many people found confusing about git-add was that a
file whose name matches an ignored pattern could not be added to
the index.  With this, such a file can be added by explicitly
spelling its name to git-add.

Fileglobs and recursive behaviour do not add ignored files to
the index.  That is, if a pattern '*.o' is in .gitignore, and
two files foo.o, bar/baz.o are in the working tree:

    $ git add foo.o
    $ git add '*.o'
    $ git add bar

Only the first form adds foo.o to the index.

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 2006-12-25 03:13:45 -08:00
parent 4888c53409
commit e23ca9e1f9
2 changed files with 18 additions and 4 deletions

View File

@ -25,8 +25,9 @@ the commit.
The 'git status' command can be used to obtain a summary of what is included The 'git status' command can be used to obtain a summary of what is included
for the next commit. for the next commit.


This command only adds non-ignored files, to add ignored files use This command can be used to add ignored files, but they have to be
"git update-index --add". explicitly and exactly specified from the command line. File globbing
and recursive behaviour do not add ignored files.


Please see gitlink:git-commit[1] for alternative ways to add content to a Please see gitlink:git-commit[1] for alternative ways to add content to a
commit. commit.
@ -35,7 +36,11 @@ commit.
OPTIONS OPTIONS
------- -------
<file>...:: <file>...::
Files to add content from. Files to add content from. Fileglobs (e.g. `*.c`) can
be given to add all matching files. Also a
leading directory name (e.g. `dir` to add `dir/file1`
and `dir/file2`) can be given to add all files in the
directory, recursively.


-n:: -n::
Don't actually add the file(s), just show if they exist. Don't actually add the file(s), just show if they exist.

View File

@ -26,7 +26,14 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p
i = dir->nr; i = dir->nr;
while (--i >= 0) { while (--i >= 0) {
struct dir_entry *entry = *src++; struct dir_entry *entry = *src++;
if (!match_pathspec(pathspec, entry->name, entry->len, prefix, seen)) { int how = match_pathspec(pathspec, entry->name, entry->len,
prefix, seen);
/*
* ignored entries can be added with exact match,
* but not with glob nor recursive.
*/
if (!how ||
(entry->ignored_entry && how != MATCHED_EXACTLY)) {
free(entry); free(entry);
continue; continue;
} }
@ -55,6 +62,8 @@ static void fill_directory(struct dir_struct *dir, const char **pathspec)


/* Set up the default git porcelain excludes */ /* Set up the default git porcelain excludes */
memset(dir, 0, sizeof(*dir)); memset(dir, 0, sizeof(*dir));
if (pathspec)
dir->show_both = 1;
dir->exclude_per_dir = ".gitignore"; dir->exclude_per_dir = ".gitignore";
path = git_path("info/exclude"); path = git_path("info/exclude");
if (!access(path, R_OK)) if (!access(path, R_OK))