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

Re: [PATCH 24/34] checkout: reject if the branch is already checked out elsewhere

From
Mark Levedahl <mlevedahl@gmail.com>
Date
Dec 3, 2014, 11:30 UTC
Message-ID
<547EF46F.3000007@gmail.com>
In-Reply-To
<xmqq4mtem029.fsf@gitster.dls.corp.google.com>
On 12/02/2014 12:30 PM, Junio C Hamano wrote:
Show 14 quoted lines
> Duy Nguyen <pclouds@gmail.com> writes:
>
>> FWIW git-branch usually can show the original branch of detached head
>> (must not always). I don't think we have a plumbing equivalent for it
>> though. People can "tail -1 $GIT_DIR/logs/HEAD| sed .." but that seems
>> hacky.
> @{-1}, i.e. "the last branch I checked out"?
>
>> I do like "read-only" ref concept where we can keep ref name
>> (especially tags) in HEAD until the next commit. But it didn't go
>> anywhere
> Remind me.  That sounds somewhat interesting.
>
>

I think these ideas support solutions more complicated than the "problem" trying to be solved. Consider a use case: multiple algorithms, each a different branch in one repository, any of which can be used to analyze the same kinds of data. We also have multiple data sets, each a separate branch in a other repository. For development / test / analysis it is necessary to have multiple checked out pairs (algorithm + data) on the same machine to allow comparison / debugging in place of different combinations. Assume one algorithm, multiple data sets are checked out and being worked on.

With new-workdir, or Duy's approach with --ignore-other-checkouts, all are checked out normally in git, git-branch, git-status, git log all work normally. If a change needs to be made that affects the branch in more than one checked out repository, once done the other copies are out of date. It does not matter which instance is modified, once committed the change is already visible in all others, and "git reset --hard" in all the others completes the process. This is not difficult to understand, requires no new code, no special methods.

Consider the alternatives: a) Use separate complete repositories + work trees: now the new branch needs to be broadcast to all using fetch or pull, and as the change might have been an amend, fetch + reset --hard may be required. This is not "simpler" to implement in practice, nor do I find it easier to explain. Note also that if using push, it is possible to force push into the current branch of the other copies, with receive.denyCurrentBranch = false, resulting in exactly the same situation as above using new-workdir (checked out code not matching the ref).

b) Use Duy's approach without --ignore-other-checkouts. First, you have to find the copy that is not on a detached HEAD, detach the HEAD their, then go back to the copy where the problem is found, attach the HEAD in that one, and make the change. Then go back and do git reset --hard $branch in the others.

I just don't see how these alternatives are in the end any simpler to use or explain.

Mark
Previous: Junio C HamanoNext: Duy Nguyen
Message 32 of 45 in “nd/multiple-work-trees reroll”
  1. 00/34 nd/multiple-work-trees rerollNguyễn Thái Ngọc Duy, Nov 30, 2014
  2. 01/34 path.c: make get_pathname() return strbuf instead of static bufferNguyễn Thái Ngọc Duy, Nov 30, 2014
  3. 02/34 path.c: make get_pathname() call sites return const char *Nguyễn Thái Ngọc Duy, Nov 30, 2014
  4. 03/34 git_snpath(): retire and replace with strbuf_git_path()Nguyễn Thái Ngọc Duy, Nov 30, 2014
  5. 04/34 path.c: rename vsnpath() to do_git_path()Nguyễn Thái Ngọc Duy, Nov 30, 2014
  6. 05/34 path.c: group git_path(), git_pathdup() and strbuf_git_path() togetherNguyễn Thái Ngọc Duy, Nov 30, 2014
  7. 06/34 git_path(): be aware of file relocation in $GIT_DIRNguyễn Thái Ngọc Duy, Nov 30, 2014
  8. 07/34 *.sh: respect $GIT_INDEX_FILENguyễn Thái Ngọc Duy, Nov 30, 2014
  9. 08/34 reflog: avoid constructing .lock path with git_pathNguyễn Thái Ngọc Duy, Nov 30, 2014
  10. 09/34 fast-import: use git_path() for accessing .git dir instead of get_git_dir()Nguyễn Thái Ngọc Duy, Nov 30, 2014
  11. 10/34 commit: use SEQ_DIR instead of hardcoding "sequencer"Nguyễn Thái Ngọc Duy, Nov 30, 2014
  12. 11/34 $GIT_COMMON_DIR: a new environment variableNguyễn Thái Ngọc Duy, Nov 30, 2014
  13. 12/34 git-sh-setup.sh: use rev-parse --git-path to get $GIT_DIR/objectsNguyễn Thái Ngọc Duy, Nov 30, 2014
  14. 13/34 *.sh: avoid hardcoding $GIT_DIR/hooks/...Nguyễn Thái Ngọc Duy, Nov 30, 2014
  15. 14/34 git-stash: avoid hardcoding $GIT_DIR/logs/....Nguyễn Thái Ngọc Duy, Nov 30, 2014
  16. 15/34 setup.c: convert is_git_directory() to use strbufNguyễn Thái Ngọc Duy, Nov 30, 2014
  17. 16/34 setup.c: detect $GIT_COMMON_DIR in is_git_directory()Nguyễn Thái Ngọc Duy, Nov 30, 2014
  18. 17/34 setup.c: convert check_repository_format_gently to use strbufNguyễn Thái Ngọc Duy, Nov 30, 2014
  19. 18/34 setup.c: detect $GIT_COMMON_DIR check_repository_format_gently()Nguyễn Thái Ngọc Duy, Nov 30, 2014
  20. 19/34 setup.c: support multi-checkout repo setupNguyễn Thái Ngọc Duy, Nov 30, 2014
  21. 20/34 wrapper.c: wrapper to open a file, fprintf then closeNguyễn Thái Ngọc Duy, Nov 30, 2014
  22. 21/34 use new wrapper write_file() for simple file writingNguyễn Thái Ngọc Duy, Nov 30, 2014
  23. 22/34 checkout: support checking out into a new working directoryNguyễn Thái Ngọc Duy, Nov 30, 2014
  24. 23/34 prune: strategies for linked checkoutsNguyễn Thái Ngọc Duy, Nov 30, 2014
  25. 24/34 checkout: reject if the branch is already checked out elsewhereNguyễn Thái Ngọc Duy, Nov 30, 2014
  26. Mark LevedahlNov 30, 2014
  27. Duy NguyenDec 1, 2014
  28. Junio C HamanoDec 1, 2014
  29. Mark LevedahlDec 2, 2014
  30. Duy NguyenDec 2, 2014
  31. Junio C HamanoDec 2, 2014
  32. Mark LevedahlDec 3, 2014
  33. Duy NguyenDec 3, 2014
  34. Junio C HamanoDec 3, 2014
  35. Duy NguyenDec 2, 2014
  36. 25/34 checkout: clean up half-prepared directories in --to modeNguyễn Thái Ngọc Duy, Nov 30, 2014
  37. 26/34 gc: style change -- no SP before closing parenthesisNguyễn Thái Ngọc Duy, Nov 30, 2014
  38. 27/34 gc: factor out gc.pruneexpire parsing codeNguyễn Thái Ngọc Duy, Nov 30, 2014
  39. 28/34 gc: support prune --worktreesNguyễn Thái Ngọc Duy, Nov 30, 2014
  40. 29/34 count-objects: report unused files in $GIT_DIR/worktrees/...Nguyễn Thái Ngọc Duy, Nov 30, 2014
  41. 30/34 git_path(): keep "info/sparse-checkout" per work-treeNguyễn Thái Ngọc Duy, Nov 30, 2014
  42. 31/34 checkout: don't require a work tree when checking out into a new oneNguyễn Thái Ngọc Duy, Nov 30, 2014
  43. 32/34 t2025: add a test to make sure grafts is working from a linked checkoutNguyễn Thái Ngọc Duy, Nov 30, 2014
  44. 33/34 checkout: do not fail if target is an empty directoryNguyễn Thái Ngọc Duy, Nov 30, 2014
  45. 34/34 git-common-dir: make "modules/" per-working-directory directoryNguyễn Thái Ngọc Duy, Nov 30, 2014

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.