Skip to content

Commit

Permalink
git-add: add ignored files when asked explicitly.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Dec 25, 2006
1 parent 4888c53 commit e23ca9e
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 4 deletions.
11 changes: 8 additions & 3 deletions Documentation/git-add.txt
Expand Up @@ -25,8 +25,9 @@ the commit.
The 'git status' command can be used to obtain a summary of what is included
for the next commit.

This command only adds non-ignored files, to add ignored files use
"git update-index --add".
This command can be used to add ignored files, but they have to be
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
commit.
Expand All @@ -35,7 +36,11 @@ commit.
OPTIONS
-------
<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::
Don't actually add the file(s), just show if they exist.
Expand Down
11 changes: 10 additions & 1 deletion builtin-add.c
Expand Up @@ -26,7 +26,14 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p
i = dir->nr;
while (--i >= 0) {
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);
continue;
}
Expand Down Expand Up @@ -55,6 +62,8 @@ static void fill_directory(struct dir_struct *dir, const char **pathspec)

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

0 comments on commit e23ca9e

Please sign in to comment.