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>
This commit is contained in:
Junio C Hamano 2006-12-25 17:46:38 -08:00
parent 1e423f5655
commit 6a1ad32519
2 changed files with 35 additions and 7 deletions

View file

@ -7,7 +7,7 @@ git-add - Add file contents to the changeset to be committed next
SYNOPSIS
--------
'git-add' [-n] [-v] [--interactive] [--] <file>...
'git-add' [-n] [-v] [-f] [--interactive] [--] <file>...
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.
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.
@ -48,6 +49,9 @@ OPTIONS
-v::
Be verbose.
-f::
Allow adding otherwise ignored files.
\--interactive::
Add modified contents in the working tree interactively to
the index.

View file

@ -10,7 +10,7 @@
#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)
{
@ -37,9 +37,6 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p
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;
@ -94,10 +91,13 @@ static void fill_directory(struct dir_struct *dir, const char **pathspec)
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;
@ -132,6 +132,10 @@ int cmd_add(int argc, const char **argv, const char *prefix)
show_only = 1;
continue;
}
if (!strcmp(arg, "-f")) {
ignored_too = 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 (!ignored_too && dir.entries[i]->ignored_entry)
continue;
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 (!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);