Commands requiring a work tree must not run in GIT_DIR
This patch helps when you accidentally run something like git-clean in the git directory instead of the work tree. Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
98d47d4ccf
commit
6d9ba67b0f
@ -323,7 +323,7 @@ static const char ls_files_usage[] =
|
|||||||
int cmd_ls_files(int argc, const char **argv, const char *prefix)
|
int cmd_ls_files(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int exc_given = 0;
|
int exc_given = 0, require_work_tree = 0;
|
||||||
struct dir_struct dir;
|
struct dir_struct dir;
|
||||||
|
|
||||||
memset(&dir, 0, sizeof(dir));
|
memset(&dir, 0, sizeof(dir));
|
||||||
@ -363,14 +363,17 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix)
|
|||||||
}
|
}
|
||||||
if (!strcmp(arg, "-m") || !strcmp(arg, "--modified")) {
|
if (!strcmp(arg, "-m") || !strcmp(arg, "--modified")) {
|
||||||
show_modified = 1;
|
show_modified = 1;
|
||||||
|
require_work_tree = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strcmp(arg, "-o") || !strcmp(arg, "--others")) {
|
if (!strcmp(arg, "-o") || !strcmp(arg, "--others")) {
|
||||||
show_others = 1;
|
show_others = 1;
|
||||||
|
require_work_tree = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strcmp(arg, "-i") || !strcmp(arg, "--ignored")) {
|
if (!strcmp(arg, "-i") || !strcmp(arg, "--ignored")) {
|
||||||
dir.show_ignored = 1;
|
dir.show_ignored = 1;
|
||||||
|
require_work_tree = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strcmp(arg, "-s") || !strcmp(arg, "--stage")) {
|
if (!strcmp(arg, "-s") || !strcmp(arg, "--stage")) {
|
||||||
@ -379,6 +382,7 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix)
|
|||||||
}
|
}
|
||||||
if (!strcmp(arg, "-k") || !strcmp(arg, "--killed")) {
|
if (!strcmp(arg, "-k") || !strcmp(arg, "--killed")) {
|
||||||
show_killed = 1;
|
show_killed = 1;
|
||||||
|
require_work_tree = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!strcmp(arg, "--directory")) {
|
if (!strcmp(arg, "--directory")) {
|
||||||
@ -447,6 +451,10 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (require_work_tree &&
|
||||||
|
(is_bare_repository() || is_inside_git_dir()))
|
||||||
|
die("This operation must be run in a work tree");
|
||||||
|
|
||||||
pathspec = get_pathspec(prefix, argv + i);
|
pathspec = get_pathspec(prefix, argv + i);
|
||||||
|
|
||||||
/* Verify that the pathspec matches the prefix */
|
/* Verify that the pathspec matches the prefix */
|
||||||
|
@ -347,6 +347,11 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
|||||||
printf("%s/.git\n", cwd);
|
printf("%s/.git\n", cwd);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!strcmp(arg, "--is-inside-git-dir")) {
|
||||||
|
printf("%s\n", is_inside_git_dir() ? "true"
|
||||||
|
: "false");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (!strncmp(arg, "--since=", 8)) {
|
if (!strncmp(arg, "--since=", 8)) {
|
||||||
show_datestring("--max-age=", arg+8);
|
show_datestring("--max-age=", arg+8);
|
||||||
continue;
|
continue;
|
||||||
|
@ -48,7 +48,8 @@ cd_to_toplevel () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
require_work_tree () {
|
require_work_tree () {
|
||||||
test $(is_bare_repository) = false ||
|
test $(is_bare_repository) = false &&
|
||||||
|
test $(git-rev-parse --is-inside-git-dir) = false ||
|
||||||
die "fatal: $0 cannot be used without a working tree."
|
die "fatal: $0 cannot be used without a working tree."
|
||||||
}
|
}
|
||||||
|
|
||||||
|
5
git.c
5
git.c
@ -299,8 +299,9 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
|
|||||||
prefix = setup_git_directory();
|
prefix = setup_git_directory();
|
||||||
if (p->option & USE_PAGER)
|
if (p->option & USE_PAGER)
|
||||||
setup_pager();
|
setup_pager();
|
||||||
if ((p->option & NOT_BARE) && is_bare_repository())
|
if ((p->option & NOT_BARE) &&
|
||||||
die("%s cannot be used in a bare git directory", cmd);
|
(is_bare_repository() || is_inside_git_dir()))
|
||||||
|
die("%s must be run in a work tree", cmd);
|
||||||
trace_argv_printf(argv, argc, "trace: built-in: git");
|
trace_argv_printf(argv, argc, "trace: built-in: git");
|
||||||
|
|
||||||
exit(p->fn(argc, argv, prefix));
|
exit(p->fn(argc, argv, prefix));
|
||||||
|
Loading…
Reference in New Issue
Block a user