git-add -f: allow adding otherwise ignored files.
authorJunio C Hamano <junkio@cox.net>
Tue, 26 Dec 2006 01:46:38 +0000 (17:46 -0800)
committerJunio C Hamano <junkio@cox.net>
Tue, 26 Dec 2006 01:46:38 +0000 (17:46 -0800)
Instead of just warning, refuse to add otherwise ignored files
by default, and allow it with an -f option.

Signed-off-by: Junio C Hamano <junkio@cox.net>
Documentation/git-add.txt
builtin-add.c
index 2fef0681bfaf2155d667798eeb7d450fd1ccfcd8..95bea66374a6054ee6823b760dbc73d5b84cd5a0 100644 (file)
@@ -7,7 +7,7 @@ git-add - Add file contents to the changeset to be committed next
 
 SYNOPSIS
 --------
 
 SYNOPSIS
 --------
-'git-add' [-n] [-v] [--interactive] [--] <file>...
+'git-add' [-n] [-v] [-f] [--interactive] [--] <file>...
 
 DESCRIPTION
 -----------
 
 DESCRIPTION
 -----------
@@ -25,7 +25,8 @@ the commit.
 The 'git status' command can be used to obtain a summary of what is included
 for the next commit.
 
 The 'git status' command can be used to obtain a summary of what is included
 for the next commit.
 
-This command can be used to add ignored files, but they have to be
+This command can be used to add ignored files with `-f` (force)
+option, but they have to be
 explicitly and exactly specified from the command line.  File globbing
 and recursive behaviour do not add ignored files.
 
 explicitly and exactly specified from the command line.  File globbing
 and recursive behaviour do not add ignored files.
 
@@ -48,6 +49,9 @@ OPTIONS
 -v::
         Be verbose.
 
 -v::
         Be verbose.
 
+-f::
+       Allow adding otherwise ignored files.
+
 \--interactive::
        Add modified contents in the working tree interactively to
        the index.
 \--interactive::
        Add modified contents in the working tree interactively to
        the index.
index c54c6945327838c47caaf03da43235ac3fc2e87e..8ed4a6a9f32b9cd0f71289af2296cacf79864448 100644 (file)
@@ -10,7 +10,7 @@
 #include "cache-tree.h"
 
 static const char builtin_add_usage[] =
 #include "cache-tree.h"
 
 static const char builtin_add_usage[] =
-"git-add [-n] [-v] [--interactive] [--] <filepattern>...";
+"git-add [-n] [-v] [-f] [--interactive] [--] <filepattern>...";
 
 static void prune_directory(struct dir_struct *dir, const char **pathspec, int prefix)
 {
 
 static void prune_directory(struct dir_struct *dir, const char **pathspec, int prefix)
 {
@@ -37,9 +37,6 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p
                        free(entry);
                        continue;
                }
                        free(entry);
                        continue;
                }
-               if (entry->ignored_entry)
-                       fprintf(stderr, "warning: '%s' is an ignored path.\n",
-                               entry->name);
                *dst++ = entry;
        }
        dir->nr = dst - dir->entries;
                *dst++ = entry;
        }
        dir->nr = dst - dir->entries;
@@ -94,10 +91,13 @@ static void fill_directory(struct dir_struct *dir, const char **pathspec)
 
 static struct lock_file lock_file;
 
 
 static struct lock_file lock_file;
 
+static const char ignore_warning[] =
+"The following paths are ignored by one of your .gitignore files:\n";
+
 int cmd_add(int argc, const char **argv, const char *prefix)
 {
        int i, newfd;
 int cmd_add(int argc, const char **argv, const char *prefix)
 {
        int i, newfd;
-       int verbose = 0, show_only = 0;
+       int verbose = 0, show_only = 0, ignored_too = 0;
        const char **pathspec;
        struct dir_struct dir;
        int add_interactive = 0;
        const char **pathspec;
        struct dir_struct dir;
        int add_interactive = 0;
@@ -132,6 +132,10 @@ int cmd_add(int argc, const char **argv, const char *prefix)
                        show_only = 1;
                        continue;
                }
                        show_only = 1;
                        continue;
                }
+               if (!strcmp(arg, "-f")) {
+                       ignored_too = 1;
+                       continue;
+               }
                if (!strcmp(arg, "-v")) {
                        verbose = 1;
                        continue;
                if (!strcmp(arg, "-v")) {
                        verbose = 1;
                        continue;
@@ -150,6 +154,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
        if (show_only) {
                const char *sep = "", *eof = "";
                for (i = 0; i < dir.nr; i++) {
        if (show_only) {
                const char *sep = "", *eof = "";
                for (i = 0; i < dir.nr; i++) {
+                       if (!ignored_too && dir.entries[i]->ignored_entry)
+                               continue;
                        printf("%s%s", sep, dir.entries[i]->name);
                        sep = " ";
                        eof = "\n";
                        printf("%s%s", sep, dir.entries[i]->name);
                        sep = " ";
                        eof = "\n";
@@ -161,6 +167,24 @@ int cmd_add(int argc, const char **argv, const char *prefix)
        if (read_cache() < 0)
                die("index file corrupt");
 
        if (read_cache() < 0)
                die("index file corrupt");
 
+       if (!ignored_too) {
+               int has_ignored = -1;
+               for (i = 0; has_ignored < 0 && i < dir.nr; i++)
+                       if (dir.entries[i]->ignored_entry)
+                               has_ignored = i;
+               if (0 <= has_ignored) {
+                       fprintf(stderr, ignore_warning);
+                       for (i = has_ignored; i < dir.nr; i++) {
+                               if (!dir.entries[i]->ignored_entry)
+                                       continue;
+                               fprintf(stderr, "%s\n", dir.entries[i]->name);
+                       }
+                       fprintf(stderr,
+                               "Use -f if you really want to add them.\n");
+                       exit(1);
+               }
+       }
+
        for (i = 0; i < dir.nr; i++)
                add_file_to_index(dir.entries[i]->name, verbose);
 
        for (i = 0; i < dir.nr; i++)
                add_file_to_index(dir.entries[i]->name, verbose);