Merge branch 'mm/add-u-A-sans-pathspec'

Forbid "git add -u" and "git add -A" without pathspec run from a
subdirectory, to train people to type "." (or ":/") to make the
choice of default does not matter.

* mm/add-u-A-sans-pathspec:
  add: warn when -u or -A is used without pathspec
This commit is contained in:
Junio C Hamano 2013-02-04 10:25:13 -08:00
Родитель 370855e967 0fa2eb530f
Коммит 27d46a7072
2 изменённых файлов: 47 добавлений и 4 удалений

Просмотреть файл

@ -107,9 +107,10 @@ apply to the index. See EDITING PATCHES below.
from the index if the corresponding files in the working tree from the index if the corresponding files in the working tree
have been removed. have been removed.
+ +
If no <filepattern> is given, default to "."; in other words, If no <filepattern> is given, the current version of Git defaults to
update all tracked files in the current directory and its "."; in other words, update all tracked files in the current directory
subdirectories. and its subdirectories. This default will change in a future version
of Git, hence the form without <filepattern> should not be used.
-A:: -A::
--all:: --all::

Просмотреть файл

@ -321,6 +321,35 @@ static int add_files(struct dir_struct *dir, int flags)
return exit_status; return exit_status;
} }
static void warn_pathless_add(const char *option_name, const char *short_name) {
/*
* To be consistent with "git add -p" and most Git
* commands, we should default to being tree-wide, but
* this is not the original behavior and can't be
* changed until users trained themselves not to type
* "git add -u" or "git add -A". For now, we warn and
* keep the old behavior. Later, this warning can be
* turned into a die(...), and eventually we may
* reallow the command with a new behavior.
*/
warning(_("The behavior of 'git add %s (or %s)' with no path argument from a\n"
"subdirectory of the tree will change in Git 2.0 and should not be used anymore.\n"
"To add content for the whole tree, run:\n"
"\n"
" git add %s :/\n"
" (or git add %s :/)\n"
"\n"
"To restrict the command to the current directory, run:\n"
"\n"
" git add %s .\n"
" (or git add %s .)\n"
"\n"
"With the current Git version, the command is restricted to the current directory."),
option_name, short_name,
option_name, short_name,
option_name, short_name);
}
int cmd_add(int argc, const char **argv, const char *prefix) int cmd_add(int argc, const char **argv, const char *prefix)
{ {
int exit_status = 0; int exit_status = 0;
@ -331,6 +360,8 @@ int cmd_add(int argc, const char **argv, const char *prefix)
int add_new_files; int add_new_files;
int require_pathspec; int require_pathspec;
char *seen = NULL; char *seen = NULL;
const char *option_with_implicit_dot = NULL;
const char *short_option_with_implicit_dot = NULL;
git_config(add_config, NULL); git_config(add_config, NULL);
@ -350,8 +381,19 @@ int cmd_add(int argc, const char **argv, const char *prefix)
die(_("-A and -u are mutually incompatible")); die(_("-A and -u are mutually incompatible"));
if (!show_only && ignore_missing) if (!show_only && ignore_missing)
die(_("Option --ignore-missing can only be used together with --dry-run")); die(_("Option --ignore-missing can only be used together with --dry-run"));
if ((addremove || take_worktree_changes) && !argc) { if (addremove) {
option_with_implicit_dot = "--all";
short_option_with_implicit_dot = "-A";
}
if (take_worktree_changes) {
option_with_implicit_dot = "--update";
short_option_with_implicit_dot = "-u";
}
if (option_with_implicit_dot && !argc) {
static const char *here[2] = { ".", NULL }; static const char *here[2] = { ".", NULL };
if (prefix)
warn_pathless_add(option_with_implicit_dot,
short_option_with_implicit_dot);
argc = 1; argc = 1;
argv = here; argv = here;
} }