git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v3 2/2] worktree add: add --orphan flag

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Nov 15, 2022, 22:35 UTC
Message-ID
<221116.86a64rkdcj.gmgdl@evledraar.gmail.com>
In-Reply-To
<CAPig+cRuJVN2Hc-oNF10sx=ZzArb8skXUQ8m5Qek2e-o4c9VEg@mail.gmail.com>
On Tue, Nov 15 2022, Eric Sunshine wrote:
Show 39 quoted lines
> On Tue, Nov 15, 2022 at 4:13 PM Ævar Arnfjörð Bjarmason
> <avarab@gmail.com> wrote:
>> On Thu, Nov 10 2022, Jacob Abel wrote:
>> > Adds support for creating an orphan branch when adding a new worktree.
>> > This functionality is equivalent to git switch's --orphan flag.
>> >
>> > The original reason this feature was implemented was to allow a user
>> > to initialise a new repository using solely the worktree oriented
>> > workflow. Example usage included below.
>> >
>> > $ GIT_DIR=".git" git init --bare
>> > $ git worktree add --orphan master master/
>> >
>> > Signed-off-by: Jacob Abel <jacobabel@nullpo.dev>
>> > ---
>> > +Create a worktree containing an orphan branch named `<branch>` with a
>> > +clean working directory.  See `--orphan` in linkgit:git-switch[1] for
>> > +more details.
>>
>> Seeing as "git switch" is still marked "EXPERIMENTAL", it may be prudent
>> in general to avoid linking to it in lieu of "git checkout".
>>
>> In this case in particular though the "more details" are almost
>> completely absent from the "git-switch" docs, and they don't (which is
>> their won flaw) link to the more detailed "git-checkout" docs.
>>
>> But for this patch, it seems much better to link to the "checkout" docs,
>> no?
>
> Sorry, no. The important point here is that the --orphan option being
> added to `git worktree add` closely follows the behavior of `git
> switch --orphan`, which is quite different from the behavior of `git
> checkout --orphan`.
>
> The `git switch --orphan` documentation doesn't seem particularly
> lacking; it correctly describes the (very) simplified behavior of that
> command over `git checkout --orphan`. I might agree that there isn't
> much reason to link to git-switch for "more details", though, since
> there isn't really anything else that needs to be said.

Aside from what it says now: 1/2 of what I'm saying is that linking to it while it says it's "EXPERIMENTAL" might be either jumping the gun.

Or maybe we should just declare it non-"EXPERIMENTAL", but in any case this unrelated topic might want to avoid that altogether and just link to the "checkout" version.

A quick grep of our docs (for linkgit:git-switch) that this would be the first mention outside of user-manual.txt where we link to it when it's not in the context of "checkout or switch", or where we're explaining something switch-specific (i.e. the "suggestDetachingHead" advice).

Having said that I don't really care, just a suggestion...
Show 10 quoted lines
> If we did want to say something else here, we might copy one sentence
> from the `git checkout --orphan` documentation:
>
>     The first commit made on this new branch will have no parents and
>     it will be the root of a new history totally disconnected from all
>     the other branches and commits.
>
> The same sentence could be added to `git switch --orphan`
> documentation, but that's outside the scope of this patch series (thus
> can be done later by someone).

I think I was partially confused by skimming the SYNOPSIS and thinking this supported <start-point> like checkout, which as I found in https://lore.kernel.org/git/221115.86edu3kfqz.gmgdl@evledraar.gmail.com/ just seems to be a missing assertion where we want to die() if that's provided in this mode.

What I also found a bit confusing (but maybe it's just me) is that the "with a clean working directory" seemed at first to be drawing a distinction between this behavior and that of "git switch", but from poking at it some more it seems to be expressing "this is like git switch's --orphan" with that.

I think instead of "clean working tree" it would be better to talk about "tracked files", as "git switch --orphan" does, which AFAICT is what it means. But then again the reason "switch" does that is because you have *existing* tracked files, which inherently doesn't apply for "worktree".

Hrm.

So, I guess it depends on your mental model of this operation, but at least I think it's more intuitive to explain it in terms of "git checkout --orphan", not "git switch --orphan". I.e.:

	Create a worktree containing an orphan branch named
	`<branch>`. This works like linkgit:git-checkout[1]'s `--orphan'
	option, except '<start-point>` isn't supported, and the "clear
	the index" doesn't apply (as "worktree add" will always have a
	new index)".

Whereas defining this in terms of git-switch's "All tracked files are removed" might just be more confusing. What files? Since it's "worktree add" there weren't any in the first place.

Anyway, I don't mind it as it is, but maybe the above write-up helps for #leftoverbits if we ever want to unify these docs. I.e. AFAICT we could:

 * Link from git-worktree to git-checkout, saying the above
 * Link from git-switch to git-checkout, ditto, but that we also "remove
   tracked files [of the current HEAD]".
Show 38 quoted lines
>> > +test_expect_success '"add" --orphan/-b mutually exclusive' '
>> > +     test_must_fail git worktree add --orphan poodle -b poodle bamboo
>> > +'
>> > +
>> > +test_expect_success '"add" --orphan/-B mutually exclusive' '
>> > +     test_must_fail git worktree add --orphan poodle -B poodle bamboo
>> > +'
>> > +
>> > +test_expect_success '"add" --orphan/--detach mutually exclusive' '
>> > +     test_must_fail git worktree add --orphan poodle --detach bamboo
>> > +'
>> > +
>> > +test_expect_success '"add" --orphan/--no-checkout mutually exclusive' '
>> > +     test_must_fail git worktree add --orphan poodle --no-checkout bamboo
>> > +'
>> > +
>> > +test_expect_success '"add" -B/--detach mutually exclusive' '
>> > +     test_must_fail git worktree add -B poodle --detach bamboo main
>> > +'
>> > +
>>
>> This would be much better as a for-loop:
>>
>> for opt in -b -B ...
>> do
>>         test_expect_success "...$opt" '<test here, uses $opt>'
>> done
>>
>> Note the ""-quotes for the description, and '' for the test, that's not
>> a mistake, we eval() the latter.
>
> Such a loop would need to be more complex than this, wouldn't it, to
> account for all the combinations? I'd normally agree about the loop,
> but given that it requires extra complexity, I don't really mind
> seeing the individual tests spelled out manually in this case; they're
> dead simple to understand as written. I don't feel strongly either
> way, but I also don't want to ask for extra work from the patch author
> for a subjective change.
Yeah, it's probably not worth it. This is partially cleaning up existing
tests, but maybe:
	
	diff --git a/t/t2400-worktree-add.sh b/t/t2400-worktree-add.sh
	index 93c340f4aff..5acfd48f418 100755
	--- a/t/t2400-worktree-add.sh
	+++ b/t/t2400-worktree-add.sh
	@@ -298,37 +298,21 @@ test_expect_success '"add" no auto-vivify with --detach and <branch> omitted' '
	 	test_must_fail git -C mish/mash symbolic-ref HEAD
	 '
	 
	-test_expect_success '"add" -b/-B mutually exclusive' '
	-	test_must_fail git worktree add -b poodle -B poodle bamboo main
	-'
	-
	-test_expect_success '"add" -b/--detach mutually exclusive' '
	-	test_must_fail git worktree add -b poodle --detach bamboo main
	-'
	-
	-test_expect_success '"add" -B/--detach mutually exclusive' '
	-	test_must_fail git worktree add -B poodle --detach bamboo main
	-'
	-
	-test_expect_success '"add" --orphan/-b mutually exclusive' '
	-	test_must_fail git worktree add --orphan poodle -b poodle bamboo
	-'
	-
	-test_expect_success '"add" --orphan/-B mutually exclusive' '
	-	test_must_fail git worktree add --orphan poodle -B poodle bamboo
	-'
	-
	-test_expect_success '"add" --orphan/--detach mutually exclusive' '
	-	test_must_fail git worktree add --orphan poodle --detach bamboo
	-'
	-
	-test_expect_success '"add" --orphan/--no-checkout mutually exclusive' '
	-	test_must_fail git worktree add --orphan poodle --no-checkout bamboo
	-'
	-
	-test_expect_success '"add" -B/--detach mutually exclusive' '
	-	test_must_fail git worktree add -B poodle --detach bamboo main
	-'
	+test_wt_add_excl() {
	+	local opts="$@" &&
	+	test_expect_success "'worktree add' with '$opts' has mutually exclusive options" '
	+		test_must_fail git worktree add $opts
	+	'
	+}
	+test_wt_add_excl -b poodle -B poodle bamboo main
	+test_wt_add_excl -b poodle --orphan poodle bamboo
	+test_wt_add_excl -b poodle --detach bamboo main
	+test_wt_add_excl -B poodle --detach bamboo main
	+test_wt_add_excl -B poodle --detach bamboo main
	+test_wt_add_excl -B poodle --orphan poodle bamboo
	+test_wt_add_excl --orphan poodle --detach bamboo
	+test_wt_add_excl --orphan poodle --no-checkout bamboo
	+test_wt_add_excl --orphan poodle bamboo main
	 
	 test_expect_success '"add -B" fails if the branch is checked out' '
	 	git rev-parse newmain >before &&
	
I re-arranged that a bit, but probably not worth a loop. I *did* spot in
doing that that if I sort the options I end up with a duplicate test,
i.e. we test "-B poodle --detach bamboo main" twice.

That seems to be added by mistake in 2/2, i.e. it's the existing test you can see in the diff context, just added at the end.

Previous: Eric SunshineNext: Eric Sunshine
Message 30 of 129 in “worktree: Support `--orphan` when creating new worktrees”
  1. 0/4 worktree: Support `--orphan` when creating new worktreesJacob Abel, Nov 4, 2022
  2. 1/4 worktree add: Include -B in usage docsJacob Abel, Nov 4, 2022
  3. Eric SunshineNov 4, 2022
  4. Jacob AbelNov 4, 2022
  5. 2/4 builtin/worktree.c: Update checkout_worktree() to use git-worktreeJacob Abel, Nov 4, 2022
  6. Ævar Arnfjörð BjarmasonNov 4, 2022
  7. Jacob AbelNov 4, 2022
  8. Taylor BlauNov 4, 2022
  9. 3/4 worktree add: add --orphan flagJacob Abel, Nov 4, 2022
  10. Ævar Arnfjörð BjarmasonNov 4, 2022
  11. Jacob AbelNov 4, 2022
  12. Eric SunshineNov 4, 2022
  13. Jacob AbelNov 4, 2022
  14. Eric SunshineNov 10, 2022
  15. Jacob AbelNov 10, 2022
  16. 4/4 worktree add: Add unit tests for --orphanJacob Abel, Nov 4, 2022
  17. Ævar Arnfjörð BjarmasonNov 4, 2022
  18. Jacob AbelNov 4, 2022
  19. Eric SunshineNov 4, 2022
  20. Jacob AbelNov 4, 2022
  21. Jacob AbelNov 4, 2022
  22. 0/2 worktree: Support `--orphan` when creating new worktreesJacob Abel, Nov 4, 2022
  23. 1/2 worktree add: Include -B in usage docsJacob Abel, Nov 4, 2022
  24. 2/2 worktree add: add --orphan flagJacob Abel, Nov 4, 2022
  25. 0/2 worktree: Support `--orphan` when creating new worktreesJacob Abel, Nov 10, 2022
  26. 1/2 worktree add: Include -B in usage docsJacob Abel, Nov 10, 2022
  27. 2/2 worktree add: add --orphan flagJacob Abel, Nov 10, 2022
  28. Ævar Arnfjörð BjarmasonNov 15, 2022
  29. Eric SunshineNov 15, 2022
  30. Ævar Arnfjörð BjarmasonNov 15, 2022
  31. Eric SunshineNov 16, 2022
  32. Jacob AbelNov 19, 2022
  33. Jacob AbelNov 19, 2022
  34. Ævar Arnfjörð BjarmasonNov 19, 2022
  35. Jacob AbelNov 19, 2022
  36. Eric SunshineNov 22, 2022
  37. Jacob AbelNov 22, 2022
  38. Ævar Arnfjörð BjarmasonNov 15, 2022
  39. Jacob AbelNov 19, 2022
  40. Ævar Arnfjörð BjarmasonNov 19, 2022
  41. Eric SunshineNov 16, 2022
  42. Ævar Arnfjörð BjarmasonNov 17, 2022
  43. Jacob AbelNov 19, 2022
  44. Ævar Arnfjörð BjarmasonNov 19, 2022
  45. Eric SunshineNov 22, 2022
  46. Jacob AbelNov 22, 2022
  47. Ævar Arnfjörð BjarmasonNov 22, 2022
  48. Jacob AbelNov 23, 2022
  49. Rubén JustoNov 23, 2022
  50. Jacob AbelNov 23, 2022
  51. Rubén JustoNov 23, 2022
  52. Phillip WoodNov 22, 2022
  53. Jacob AbelNov 23, 2022
  54. 0/3 worktree: Support `--orphan` when creating new worktreesJacob Abel, Dec 12, 2022
  55. 1/3 worktree add: Include -B in usage docsJacob Abel, Dec 12, 2022
  56. 2/3 worktree add: add --orphan flagJacob Abel, Dec 12, 2022
  57. Ævar Arnfjörð BjarmasonDec 12, 2022
  58. Jacob AbelDec 12, 2022
  59. Ævar Arnfjörð BjarmasonDec 12, 2022
  60. Jacob AbelDec 12, 2022
  61. 3/3 worktree add: Add hint to use --orphan when bad refJacob Abel, Dec 12, 2022
  62. Ævar Arnfjörð BjarmasonDec 12, 2022
  63. Jacob AbelDec 12, 2022
  64. Ævar Arnfjörð BjarmasonDec 12, 2022
  65. Eric SunshineDec 12, 2022
  66. Jacob AbelDec 12, 2022
  67. Jacob AbelDec 12, 2022
  68. 0/4 worktree: Support `--orphan` when creating new worktreesJacob Abel, Dec 20, 2022
  69. 1/4 worktree add: Include -B in usage docsJacob Abel, Dec 20, 2022
  70. Junio C HamanoDec 20, 2022
  71. Jacob AbelDec 20, 2022
  72. 2/4 worktree add: refactor opt exclusion testsJacob Abel, Dec 20, 2022
  73. Junio C HamanoDec 20, 2022
  74. Jacob AbelDec 20, 2022
  75. 3/4 worktree add: add --orphan flagJacob Abel, Dec 20, 2022
  76. Junio C HamanoDec 20, 2022
  77. Jacob AbelDec 21, 2022
  78. 4/4 worktree add: Add hint to use --orphan when bad refJacob Abel, Dec 20, 2022
  79. Junio C HamanoDec 20, 2022
  80. Jacob AbelDec 21, 2022
  81. 0/4 worktree: Support `--orphan` when creating new worktreesJacob Abel, Dec 28, 2022
  82. 1/4 worktree add: include -B in usage docsJacob Abel, Dec 28, 2022
  83. 2/4 worktree add: refactor opt exclusion testsJacob Abel, Dec 28, 2022
  84. Junio C HamanoDec 28, 2022
  85. Jacob AbelDec 29, 2022
  86. Junio C HamanoDec 29, 2022
  87. Jacob AbelDec 29, 2022
  88. Jacob AbelJan 6, 2023
  89. Junio C HamanoJan 6, 2023
  90. Jacob AbelJan 7, 2023
  91. 3/4 worktree add: add --orphan flagJacob Abel, Dec 28, 2022
  92. 4/4 worktree add: add hint to direct users towards --orphanJacob Abel, Dec 28, 2022
  93. Phillip WoodJan 6, 2023
  94. Ævar Arnfjörð BjarmasonDec 28, 2022
  95. Jacob AbelDec 29, 2022
  96. Ævar Arnfjörð BjarmasonDec 29, 2022
  97. Jacob AbelDec 29, 2022
  98. 0/4 worktree: Support `--orphan` when creating new worktreesJacob Abel, Jan 7, 2023
  99. 1/4 worktree add: include -B in usage docsJacob Abel, Jan 7, 2023
  100. 2/4 worktree add: refactor opt exclusion testsJacob Abel, Jan 7, 2023
  101. Junio C HamanoJan 8, 2023
  102. Jacob AbelJan 8, 2023
  103. 3/4 worktree add: add --orphan flagJacob Abel, Jan 7, 2023
  104. 4/4 worktree add: add hint to direct users towards --orphanJacob Abel, Jan 7, 2023
  105. Ævar Arnfjörð BjarmasonJan 9, 2023
  106. Jacob AbelJan 9, 2023
  107. Ævar Arnfjörð BjarmasonJan 9, 2023
  108. Jacob AbelJan 9, 2023
  109. 0/4 worktree: Support `--orphan` when creating new worktreesJacob Abel, Jan 9, 2023
  110. 1/4 worktree add: include -B in usage docsJacob Abel, Jan 9, 2023
  111. 3/4 worktree add: add --orphan flagJacob Abel, Jan 9, 2023
  112. Phillip WoodJan 13, 2023
  113. Junio C HamanoJan 13, 2023
  114. Jacob AbelJan 14, 2023
  115. Junio C HamanoJan 15, 2023
  116. rsbecker@nexbridge.comJan 15, 2023
  117. Junio C HamanoJan 15, 2023
  118. 'Jacob Abel'Jan 18, 2023
  119. Jacob AbelJan 18, 2023
  120. Ævar Arnfjörð BjarmasonJan 19, 2023
  121. Junio C HamanoJan 19, 2023
  122. Phillip WoodJan 16, 2023
  123. Jacob AbelJan 18, 2023
  124. Phillip WoodJan 19, 2023
  125. Jacob AbelJan 19, 2023
  126. 2/4 worktree add: refactor opt exclusion testsJacob Abel, Jan 9, 2023
  127. 4/4 worktree add: add hint to direct users towards --orphanJacob Abel, Jan 9, 2023
  128. Ævar Arnfjörð BjarmasonJan 9, 2023
  129. Junio C HamanoJan 13, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.