Commits

Junio C Hamano  committed 6a1ad32

git-add -f: allow adding otherwise ignored files.

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>

  • Participants
  • Parent commits 1e423f5

Comments (0)

Files changed (2)

File Documentation/git-add.txt

 
 SYNOPSIS
 --------
-'git-add' [-n] [-v] [--interactive] [--] <file>...
+'git-add' [-n] [-v] [-f] [--interactive] [--] <file>...
 
 DESCRIPTION
 -----------
 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.
 
 -v::
         Be verbose.
 
+-f::
+	Allow adding otherwise ignored files.
+
 \--interactive::
 	Add modified contents in the working tree interactively to
 	the index.

File builtin-add.c

 #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)
 {
 			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;
 
 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 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;
 			show_only = 1;
 			continue;
 		}
+		if (!strcmp(arg, "-f")) {
+			ignored_too = 1;
+			continue;
+		}
 		if (!strcmp(arg, "-v")) {
 			verbose = 1;
 			continue;
 	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";
 	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);