Browse Source

worktree move: refuse to move worktrees with submodules

Submodules contains .git files with relative paths. After a worktree
move, these files need to be updated or they may point to nowhere.

This is a bandage patch to make sure "worktree move" don't break
people's worktrees by accident. When .git file update code is in
place, this validate_no_submodules() could be removed.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Nguyễn Thái Ngọc Duy 7 years ago committed by Junio C Hamano
parent
commit
78d986b252
  1. 2
      Documentation/git-worktree.txt
  2. 23
      builtin/worktree.c

2
Documentation/git-worktree.txt

@ -79,7 +79,7 @@ with `--reason`.
move:: move::


Move a working tree to a new location. Note that the main working tree Move a working tree to a new location. Note that the main working tree
cannot be moved. or linked working trees containing submodules cannot be moved.


prune:: prune::



23
builtin/worktree.c

@ -606,6 +606,27 @@ static int unlock_worktree(int ac, const char **av, const char *prefix)
return ret; return ret;
} }


static void validate_no_submodules(const struct worktree *wt)
{
struct index_state istate = { NULL };
int i, found_submodules = 0;

if (read_index_from(&istate, worktree_git_path(wt, "index")) > 0) {
for (i = 0; i < istate.cache_nr; i++) {
struct cache_entry *ce = istate.cache[i];

if (S_ISGITLINK(ce->ce_mode)) {
found_submodules = 1;
break;
}
}
}
discard_index(&istate);

if (found_submodules)
die(_("working trees containing submodules cannot be moved"));
}

static int move_worktree(int ac, const char **av, const char *prefix) static int move_worktree(int ac, const char **av, const char *prefix)
{ {
struct option options[] = { struct option options[] = {
@ -643,6 +664,8 @@ static int move_worktree(int ac, const char **av, const char *prefix)
if (file_exists(dst.buf)) if (file_exists(dst.buf))
die(_("target '%s' already exists"), dst.buf); die(_("target '%s' already exists"), dst.buf);


validate_no_submodules(wt);

reason = is_worktree_locked(wt); reason = is_worktree_locked(wt);
if (reason) { if (reason) {
if (*reason) if (*reason)

Loading…
Cancel
Save