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

Re: [PATCH] Rename git-config-set to git-repo-config

From
Junio C Hamano <junkio@cox.net>
Date
Nov 24, 2005, 21:24 UTC
Message-ID
<7vmzjtn3h1.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<Pine.LNX.4.63.0511241419390.14297@wbgn013.biozentrum.uni-wuerzburg.de>
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> Well, there are differences:

Thanks; I took yours (big thanks to Tony for teaching us how great topic branches are -- I can just blow my "hold/repoconfig" branch which had only one patch away, apply yours to "master" and merge with other topics), with one minor adjustment.

> - I did not adjust the length of the "=====" line in the dox,

In "make doc", asciidoc barfs if they do not match, so I adjusted this.

> Well, I don't use Emacs any longer, since it was such a hassle to install 
> it on every machine. I still like it, though.

I do not encourge use of Emacs to others; I was using it as an excuse for not debugging nor testing it personally myself ;-).

> As for git-mv: looks like we need a "git-perl-setup.perl", right?

Depends on what that git-$lang-setup.$lang does, but I am not quite sure. Currently, using git-sh-setup implies you run only from toplevel, with fairly convoluted logic.

I was looking at git-sh-setup does for the last couple of days; and it is really hard to decide what the best approach is to make various pieces subdirectory safe.

Currently git C-level tools works like this:
 - Natively, they work only from the project toplevel.  Period.
 - GIT_DIR defaults to ".git".  GIT_OBJECT_DIRECTORY defaults
   to "$GIT_DIR/objects".
 - If GIT_DIR environment variable does not exist, tools that
   use setup_git_directory() try to find a directory that has a
   subdirectory that looks like a valid GIT_DIR, and chdir() to
   that directory.  They remember the relative path from the new
   cwd() to the original.  If you started from a subdirectory,
   they work at the toplevel, but know where it came from
   e.g. "Documentation/howto/".
   The users of setup_git_directory() are responsible for
   prepending that relative path to user supplied repository
   relative pathnames.  Two functions, prefix_path() and
   get_pathspec(), are supplied to help this process.
   If GIT_DIR environment variable exists, setup_git_directory()
   does not do any ".git/" discovery (there is no point doing so
   because the user told us where it is).  HOWEVER, as a side
   effect of having GIT_DIR, they cannot know where their
   current directory is relative to the project toplevel.  IOW,
   they require to be started at the project toplevel if GIT_DIR
   environment variable exists, and I think this behaviour is
   the only one that makes sense [*1*].
 - The ones that use enter_repo() takes user supplied path,
   chdir() to it and sets GIT_DIR=. environment.  They work in
   naked repository without associated working tree so this is a
   sane behaviour.
 - The ones that use neither assume that they are at the project
   toplevel if they need to access working tree.

Among the scripts, the ones that do _not_ use git-sh-setup but can work in subdirectories work this way:

 - Do not do project toplevel discovery, do not do chdir.
 - Use only tools that use setup_git_directory().
 - If an access to ".git" is needed, find out where it is by
   running "git-rev-parse --git-dir", but _do_ _not_ export it
   as GIT_DIR; otherwise the tools that use
   setup_git_directory() would not work as expected.
 - They do _not_ work from subdirectory if the user has GIT_DIR
   environment set [*2*].

The ones that do use git-sh-setup can use GIT_DIR shell variable given by git-sh-setup, but git-sh-setup does _not_ export it (very important). If GIT_DIR environment was given by the user, the commands would not work from subdirectory because many C-level tools they use have setup_git_directory() internally as mentioned before. Otherwise, GIT_DIR is set to .git by this script, which means these commands can run from the toplevel only.

[Footnote]

*1* This is because GIT_DIR can point at totally out-of-tree. Your working tree can live in tmpfs filesystem and GIT_DIR on safer location. You may lose uncommitted changes in exchange for etter filesystem performance this way.

We _could_ special case when GIT_DIR is set to "/some/path/.git" and "/some/path/" is (grand)*parent directory of the current directory (e.g. /some/path/Documentation/howto), and do the usual chdir() + prefix, but I suspect this leads to more confusion not less. The rules when things work and do not in subdirectories become too complex.

*2* This cannot be helped; see *1* above.
Previous: Johannes SchindelinNext: Johannes Schindelin
Message 23 of 62 in “Get rid of .git/branches/ and .git/remotes/?”
  1. Johannes SchindelinNov 20, 2005
  2. Linus TorvaldsNov 20, 2005
  3. Sven VerdoolaegeNov 20, 2005
  4. Linus TorvaldsNov 20, 2005
  5. Andreas EricssonNov 20, 2005
  6. Johannes SchindelinNov 20, 2005
  7. Petr BaudisNov 26, 2005
  8. Junio C HamanoNov 27, 2005
  9. Josef WeidendorferNov 20, 2005
  10. Johannes SchindelinNov 20, 2005
  11. Josef WeidendorferNov 22, 2005
  12. Johannes SchindelinNov 22, 2005
  13. Andreas EricssonNov 22, 2005
  14. Johannes SchindelinNov 23, 2005
  15. Junio C HamanoNov 23, 2005
  16. Andreas EricssonNov 23, 2005
  17. Johannes SchindelinNov 23, 2005
  18. Andreas EricssonNov 24, 2005
  19. Junio C HamanoNov 24, 2005
  20. Rename git-config-set to git-repo-configJohannes Schindelin, Nov 24, 2005
  21. Junio C HamanoNov 24, 2005
  22. Johannes SchindelinNov 24, 2005
  23. Junio C HamanoNov 24, 2005
  24. Johannes SchindelinNov 24, 2005
  25. Junio C HamanoNov 26, 2005
  26. Linus TorvaldsNov 26, 2005
  27. Linus TorvaldsNov 26, 2005
  28. 0/8 Make C-level operable from subdirectoriesJunio C Hamano, Nov 26, 2005
  29. Junio C HamanoNov 26, 2005
  30. Ryan AndersonNov 26, 2005
  31. Junio C HamanoNov 27, 2005
  32. Petr BaudisNov 27, 2005
  33. Linus TorvaldsNov 27, 2005
  34. Petr BaudisNov 27, 2005
  35. Linus TorvaldsNov 27, 2005
  36. Junio C HamanoNov 28, 2005
  37. Linus TorvaldsNov 28, 2005
  38. Junio C HamanoNov 28, 2005
  39. Linus TorvaldsNov 28, 2005
  40. Junio C HamanoNov 28, 2005
  41. Junio C HamanoNov 28, 2005
  42. ls-tree: Resurrect funny name quoting lost during rewrite.Junio C Hamano, Nov 28, 2005
  43. Junio C HamanoNov 26, 2005
  44. 1/8 git-apply: work from subdirectory.Junio C Hamano, Nov 26, 2005
  45. Linus TorvaldsNov 26, 2005
  46. Junio C HamanoNov 26, 2005
  47. Junio C HamanoNov 27, 2005
  48. Lars Magne IngebrigtsenNov 27, 2005
  49. 2/8 peek-remote: honor proxy config even from subdirectory.Junio C Hamano, Nov 26, 2005
  50. 3/8 fsck-objects: work from subdirectory.Junio C Hamano, Nov 26, 2005
  51. 4/8 checkout-index: work from subdirectory.Junio C Hamano, Nov 26, 2005
  52. 5/8 hash-object: work within subdirectory.Junio C Hamano, Nov 26, 2005
  53. 6/8 ls-tree: work from subdirectory.Junio C Hamano, Nov 26, 2005
  54. Linus TorvaldsNov 26, 2005
  55. 7/8 Make networking commands to work from a subdirectory.Junio C Hamano, Nov 26, 2005
  56. 8/8 Make the rest of commands work from a subdirectory.Junio C Hamano, Nov 26, 2005
  57. Josef WeidendorferNov 22, 2005
  58. Johannes SchindelinNov 23, 2005
  59. Josef WeidendorferNov 23, 2005
  60. Johannes SchindelinNov 23, 2005
  61. Lars Magne IngebrigtsenNov 27, 2005
  62. Junio C HamanoNov 27, 2005

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.