@@ -136,4 +136,8 @@ advice.*::
Advice shown when either linkgit:git-add[1] or linkgit:git-rm[1]
is asked to update index entries outside the current sparse
checkout.
+ worktreeAddOrphan::
+ Advice shown when a user tries to create a worktree from an
+ invalid reference, to instruct how to create a new orphan
+ branch instead.
--
@@ -75,6 +75,7 @@ static struct {
[ADVICE_SUBMODULES_NOT_UPDATED] = { "submodulesNotUpdated", 1 },
[ADVICE_UPDATE_SPARSE_PATH] = { "updateSparsePath", 1 },
[ADVICE_WAITING_FOR_EDITOR] = { "waitingForEditor", 1 },
+ [ADVICE_WORKTREE_ADD_ORPHAN] = { "worktreeAddOrphan", 1 },
};
static const char turn_off_instructions[] =
@@ -50,6 +50,7 @@ struct string_list;
ADVICE_UPDATE_SPARSE_PATH,
ADVICE_WAITING_FOR_EDITOR,
ADVICE_SKIPPED_CHERRY_PICKS,
+ ADVICE_WORKTREE_ADD_ORPHAN,
};
int git_default_advice_config(const char *var, const char *value);
@@ -730,6 +730,12 @@ static int add(int ac, const char **av, const char *prefix)
if (opts.orphan) {
branch = new_branch;
} else if (!lookup_commit_reference_by_name(branch)) {
+ advise_if_enabled(ADVICE_WORKTREE_ADD_ORPHAN,
+ _("If you meant to create a worktree containing a new orphan branch\n"
+ "(branch with no commits) for this repository, you can do so\n"
+ "using the --orphan option:\n"
+ "\n"
+ " git worktree add --orphan %s %s\n"), new_branch, path);
die(_("invalid reference: %s"), branch);
} else if (new_branch) {
struct child_process cp = CHILD_PROCESS_INIT;
@@ -378,6 +378,24 @@ test_expect_success '"add" worktree with orphan branch, lock, and reason' '
test_cmp expect .git/worktrees/orphan-with-lock-reason/locked
'
+# Note: Quoted arguments containing spaces are not supported.
+test_wt_add_empty_repo_orphan_hint () {
+ local context="$1" &&
+ shift &&
+ local opts="$*" &&
+ test_expect_success "'worktree add' show orphan hint in empty repo w/ $context" '
+ test_when_finished "rm -rf empty_repo" &&
+ GIT_DIR="empty_repo" git init --bare &&
+ test_must_fail git -C empty_repo worktree add $opts foobar/ 2>actual &&
+ ! grep "error: unknown switch" actual &&
+ grep "hint: If you meant to create a worktree containing a new orphan branch" actual
+ '
+}
+
+test_wt_add_empty_repo_orphan_hint 'DWIM'
+test_wt_add_empty_repo_orphan_hint '-b' -b foobar_branch
+test_wt_add_empty_repo_orphan_hint '-B' -B foobar_branch
+
test_expect_success 'local clone from linked checkout' '
git clone --local here here-clone &&
( cd here-clone && git fsck )
Adds a new advice/hint in `git worktree add` for when the user tries to create a new worktree from a reference that doesn't exist. Current Behavior: % git init --bare foo.git Initialized empty Git repository in /path/to/foo.git/ % git -C foo.git worktree add main/ Preparing worktree (new branch 'main') fatal: invalid reference: HEAD % New Behavior: % git init --bare foo.git Initialized empty Git repository in /path/to/foo.git/ % git -C foo.git worktree add main/ Preparing worktree (new branch 'main') hint: If you meant to create a worktree containing a new orphan branch hint: (branch with no commits) for this repository, you can do so hint: using the --orphan option: hint: hint: git worktree add --orphan main ./main hint: hint: Disable this message with "git config advice.worktreeAddOrphan false" fatal: invalid reference: HEAD % Signed-off-by: Jacob Abel <jacobabel@nullpo.dev> --- Documentation/config/advice.txt | 4 ++++ advice.c | 1 + advice.h | 1 + builtin/worktree.c | 6 ++++++ t/t2400-worktree-add.sh | 18 ++++++++++++++++++ 5 files changed, 30 insertions(+) -- 2.38.2