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

[PATCH v6 00/15] Upstreaming the Scalar command

From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
Date
Oct 27, 2021, 08:27 UTC
Message-ID
<pull.1005.v6.git.1635323239.gitgitgadget@gmail.com>
In-Reply-To
<pull.1005.v5.git.1633604349.gitgitgadget@gmail.com>

tl;dr: This series contributes the core part of the Scalar command to the Git project. This command provides an opinionated way to create and configure Git repositories with a focus on very large repositories.

Changes since v5:
 * Fixed the commit message talking about make -C contrib/scalar/Makefile.
 * Fixed the git ls-tree invocation suggested in the manual for scalar
   clone.
 * Invoking make -C contrib/scalar, then changing a source file of libgit.a
   and then immediately invoking make -C contrib/scalar again will now
   implicitly rebuild libgit.a.
Changes since v4:
 * scalar delete now refuses to delete anything if it was started from
   within the enlistment.
 * scalar delete releases any handles to the object store before deleting
   the enlistment.
 * The OBJECTS list in the Makefile will now include Scalar.
 * scalar register now supports secondary worktrees, in addition to the
   primary worktree.
Changes since v3:
 * Moved the "Changes since" section to the top, to make it easier to see
   what changed.
 * Reworded the commit message of the first patch.
 * Removed the [RFC] prefix because I did not hear any objections against
   putting this into contrib/.
Changes since v2:
 * Adjusted the description of the list command in the manual page , as
   suggested by Bagas.
 * Addressed two style nits in cmd_run().
 * The documentation of git reconfigure -a was improved.
Changes since v1:
 * A couple typos were fixed
 * The code parsing the output of ls-remote was made more readable
 * The indentation used in scalar.txt now consistently uses tabs
 * We no longer hard-code core.bare = false when registering with Scalar

Background ==========

Years ago, Microsoft wanted to move the source code of the Windows operating system to Git. The challenge there was to prove that Git could scale to massive monorepos. The VFS for Git (formerly GVFS) project was born to take up that challenge.

The final solution included a virtual filesystem (with both user-mode and kernel components) and a customized fork of Git for Windows. This solution contained several key concepts, such as only populating a portion of the working directory, demand-fetching blobs, and performing periodic repo maintenance in the background. However, the required kernel drivers made it difficult to port the solution to other platforms.

But it was realized that many of these key concepts were independent of the actual VFS and its projection of the working directory. The Scalar project was created to make that separation, refine the key concepts, and then extract those features into the new Scalar command.

The present ===========

The Scalar project provides a completely functional non-virtual experience for monorepos. But why stop there. The Scalar project was designed to be a self-destructing vehicle to allow those key concepts to be moved into core Git itself for the benefit of all. For example, partial clone, sparse-checkout, and background maintenance have already been upstreamed and removed from Scalar proper. This patch series provides a C-based implementation of the final remaining portions of the Scalar command. This will make it easier for users to experiment with the Scalar command. It will also make it substantially easier to experiment with moving functionality from Scalar into core Git, while maintaining backwards-compatibility for existing Scalar users.

The C-based Scalar has been shipped to Scalar users, and can be tested by any interested reader: https://github.com/microsoft/git/releases/ (it offers a Git for Windows installer, a macOS package and an Ubuntu package, Scalar has been included since v2.33.0.vfs.0.0).

Next steps ==========

I have lined up a few more patch series on top of this one:
 1. Implement a scalar diagnose command.
 2. Use the built-in FSMonitor (that patch series obviously needs to wait
    for FSMonitor to be integrated).
 3. Modify the config machinery to be more generous about concurrent writes,
    say, to the user-wide config.
 4. A few patches to optionally build and install scalar as part of a
    regular Git install (also teaching git help scalar to find the Scalar
    documentation

These are included in my vfs-with-scalar branch thicket [https://github.com/dscho/git/commits/vfs-with-scalar]. On top of that, this branch thicket also includes patches I do not plan on upstreaming, mainly because they are too specific either to VFS for Git, or they support Azure Repos (which does not offer partial clones but speaks the GVFS protocol, which can be used to emulate partial clones).

One other thing is very interesting about that vfs-with-scalar branch thicket: it contains a GitHub workflow which will run Scalar's quite extensive Functional Tests suite. This test suite is quite comprehensive and caught us a lot of bugs in the past, not only in the Scalar code, but also core Git.

Epilogue ========

Now, to address some questions that I imagine every reader has who made it this far:

 * Why not put the Scalar functionality directly into core Git, even a
   built-in? Creating a Git builtin requires scrutiny over every aspect of
   the feature, which is difficult to do while also maintaining the
   command-line interface contract and expected behavior of the Scalar
   command (there are existing users, after all). By having the Scalar
   command in contrib/, we present a simple option for users to have these
   features in the short term while the Git contributor community decides
   which bits to absorb into Git built-ins.
 * Why implement the Scalar command in the Git codebase? We ported Scalar to
   the microsoft/git fork for several reasons. First, we realized it was
   possible in the first place, now that the core features exist inside Git
   itself. Second, compiling Scalar directly within a version of Git allows
   us to remove a version compatibility check from each config option that
   might or might not apply based on the installed Git version. Finally,
   this new location has greatly simplified our release process and the
   installation process for users. We now have ways to install Scalar with
   microsoft/git via winget, brew, and apt-get. This has been the case since
   we shipped v2.32.0 to our users, read: this setup has served us well
   already.
 * Why contribute Scalar to the Git project? We are biased, of course, yet
   we do have evidence that the Scalar command is a helpful tool that offers
   an simple way to handle huge repositories with ease. By contributing it
   to the core Git project, we are able to share it with more users,
   especially some users who do not want to install the microsoft/git fork.
   We intend to include Scalar as a component in git-for-windows/git, but
   are contributing it here first. Further, we think there is benefit to the
   Git developer community as this presents an example of how to set certain
   defaults that work for large repositories.
Derrick Stolee (4):
  scalar: 'register' sets recommended config and starts maintenance
  scalar: 'unregister' stops background maintenance
  scalar: implement 'scalar list'
  scalar: implement the `run` command
Johannes Schindelin (10):
  scalar: create a rudimentary executable
  scalar: start documenting the command
  scalar: create test infrastructure
  scalar: let 'unregister' handle a deleted enlistment directory
    gracefully
  scalar: implement the `clone` subcommand
  scalar: teach 'clone' to support the --single-branch option
  scalar: allow reconfiguring an existing enlistment
  scalar: teach 'reconfigure' to optionally handle all registered
    enlistments
  scalar: implement the `version` command
  scalar: accept -C and -c options before the subcommand
Matthew John Cheetham (1):
  scalar: implement the `delete` command
 Makefile                         |   9 +
 contrib/scalar/.gitignore        |   5 +
 contrib/scalar/Makefile          |  57 +++
 contrib/scalar/scalar.c          | 845 +++++++++++++++++++++++++++++++
 contrib/scalar/scalar.txt        | 155 ++++++
 contrib/scalar/t/Makefile        |  78 +++
 contrib/scalar/t/t9099-scalar.sh |  88 ++++
 7 files changed, 1237 insertions(+)
 create mode 100644 contrib/scalar/.gitignore
 create mode 100644 contrib/scalar/Makefile
 create mode 100644 contrib/scalar/scalar.c
 create mode 100644 contrib/scalar/scalar.txt
 create mode 100644 contrib/scalar/t/Makefile
 create mode 100755 contrib/scalar/t/t9099-scalar.sh
base-commit: ebf3c04b262aa27fbb97f8a0156c2347fecafafb
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1005%2Fdscho%2Fscalar-the-beginning-v6
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1005/dscho/scalar-the-beginning-v6
Pull-Request: https://github.com/gitgitgadget/git/pull/1005
Range-diff vs v5:
  1:  7119a8efc21 !  1:  9b0b00438ec scalar: create a rudimentary executable
     @@ Commit message
      
          The idea here is that you can (optionally) build Scalar via
      
     -            make -C contrib/scalar/Makefile
     +            make -C contrib/scalar/
      
          This will build the `scalar` executable and put it into the
          contrib/scalar/ subdirectory.
     @@ contrib/scalar/Makefile (new)
      +TARGETS = scalar$(X) scalar.o
      +GITLIBS = ../../common-main.o ../../libgit.a ../../xdiff/lib.a
      +
     -+all: scalar$X
     ++all: scalar$(X)
      +
      +$(GITLIBS):
      +	$(QUIET_SUBDIR0)../.. $(QUIET_SUBDIR1) $(subst ../../,,$@)
     @@ contrib/scalar/Makefile (new)
      +clean:
      +	$(RM) $(TARGETS)
      +
     -+.PHONY: all clean FORCE
     ++.PHONY: $(GITLIBS) all clean FORCE
      
       ## contrib/scalar/scalar.c (new) ##
      @@
  2:  edc1e5f73bd !  2:  40fee75968e scalar: start documenting the command
     @@ contrib/scalar/Makefile: $(TARGETS): $(GITLIBS) scalar.c
       	$(RM) $(TARGETS)
      +	$(RM) scalar.1 scalar.html scalar.xml
       
     --.PHONY: all clean FORCE
     +-.PHONY: $(GITLIBS) all clean FORCE
      +docs: scalar.html scalar.1
      +
      +scalar.html: | scalar.1 # prevent them from trying to build `doc.dep` in parallel
     @@ contrib/scalar/Makefile: $(TARGETS): $(GITLIBS) scalar.c
      +		../contrib/scalar/$@
      +	$(QUIET)test scalar.1 != "$@" || mv ../../Documentation/$@ .
      +
     -+.PHONY: all clean docs FORCE
     ++.PHONY: $(GITLIBS) all clean docs FORCE
      
       ## contrib/scalar/scalar.txt (new) ##
      @@
  3:  9eeb66d5b5d !  3:  e3507c2d5f7 scalar: create test infrastructure
     @@ contrib/scalar/Makefile: include ../../config.mak.uname
       TARGETS = scalar$(X) scalar.o
       GITLIBS = ../../common-main.o ../../libgit.a ../../xdiff/lib.a
       
     --all: scalar$X
     -+all: scalar$X ../../bin-wrappers/scalar
     +-all: scalar$(X)
     ++all: scalar$(X) ../../bin-wrappers/scalar
       
       $(GITLIBS):
       	$(QUIET_SUBDIR0)../.. $(QUIET_SUBDIR1) $(subst ../../,,$@)
     @@ contrib/scalar/Makefile: scalar.html scalar.1: scalar.txt
       		../contrib/scalar/$@
       	$(QUIET)test scalar.1 != "$@" || mv ../../Documentation/$@ .
       
     --.PHONY: all clean docs FORCE
     -+.PHONY: all clean docs test FORCE
     +-.PHONY: $(GITLIBS) all clean docs FORCE
     ++.PHONY: $(GITLIBS) all clean docs test FORCE
      
       ## contrib/scalar/t/Makefile (new) ##
      @@
  4:  8ebfa51ae15 =  4:  53224e506ea scalar: 'register' sets recommended config and starts maintenance
  5:  51b5fc577c9 =  5:  3591e53700b scalar: 'unregister' stops background maintenance
  6:  0041477374e =  6:  fe04ae7ec66 scalar: let 'unregister' handle a deleted enlistment directory gracefully
  7:  12efa86e4cb =  7:  136aec439fd scalar: implement 'scalar list'
  8:  670891d14cc !  8:  ed24a5e9b4c scalar: implement the `clone` subcommand
     @@ contrib/scalar/scalar.txt: an existing Git worktree with Scalar whose name is no
      +`git sparse-checkout set` to expand the set of directories you want to see,
      +or `git sparse-checkout disable` to expand to all files (see
      +linkgit:git-sparse-checkout[1] for more details). You can explore the
     -+subdirectories outside your sparse-checkout by using `git ls-tree HEAD`.
     ++subdirectories outside your sparse-checkout by using `git ls-tree
     ++HEAD[:<directory>]`.
      +
      +-b <name>::
      +--branch <name>::
  9:  03b8385ebb5 !  9:  5ee54a9e25f scalar: teach 'clone' to support the --single-branch option
     @@ contrib/scalar/scalar.txt: scalar - an opinionated repository management tool
       scalar list
       scalar register [<enlistment>]
       scalar unregister [<enlistment>]
     -@@ contrib/scalar/scalar.txt: subdirectories outside your sparse-checkout by using `git ls-tree HEAD`.
     +@@ contrib/scalar/scalar.txt: HEAD[:<directory>]`.
       	Instead of checking out the branch pointed to by the cloned
       	repository's HEAD, check out the `<name>` branch instead.
       
 10:  5a0b3843f98 = 10:  3361eb8f091 scalar: implement the `run` command
 11:  6d9aaeb05fa = 11:  c4778c1dc5f scalar: allow reconfiguring an existing enlistment
 12:  2967d7f1425 = 12:  cd824e9e483 scalar: teach 'reconfigure' to optionally handle all registered enlistments
 13:  8069cc536fe = 13:  843026d5481 scalar: implement the `delete` command
 14:  2ecfaa5d0fe = 14:  5ca169b3f3a scalar: implement the `version` command
 15:  f81e8b3bcf1 = 15:  e3a6eea0534 scalar: accept -C and -c options before the subcommand
-- 
gitgitgadget
Previous: Ævar Arnfjörð BjarmasonNext: Johannes Schindelin via GitGitGadget
Message 158 of 303 in “[RFC] Upstreaming the Scalar command”
  1. 00/15 [RFC] Upstreaming the Scalar commandJohannes Schindelin via GitGitGadget, Aug 30, 2021
  2. 01/15 scalar: create a rudimentary executableJohannes Schindelin via GitGitGadget, Aug 30, 2021
  3. 02/15 scalar: start documenting the commandJohannes Schindelin via GitGitGadget, Aug 30, 2021
  4. 03/15 scalar: create test infrastructureJohannes Schindelin via GitGitGadget, Aug 30, 2021
  5. Ævar Arnfjörð BjarmasonAug 31, 2021
  6. 04/15 scalar: 'register' sets recommended config and starts maintenanceDerrick Stolee via GitGitGadget, Aug 30, 2021
  7. Ævar Arnfjörð BjarmasonAug 31, 2021
  8. Derrick StoleeAug 31, 2021
  9. Junio C HamanoSep 1, 2021
  10. Johannes SchindelinSep 3, 2021
  11. Junio C HamanoSep 3, 2021
  12. 05/15 scalar: 'unregister' stops background maintenanceDerrick Stolee via GitGitGadget, Aug 30, 2021
  13. 07/15 scalar: implement 'scalar list'Derrick Stolee via GitGitGadget, Aug 30, 2021
  14. 06/15 scalar: let 'unregister' handle a deleted enlistment directory gracefullyJohannes Schindelin via GitGitGadget, Aug 30, 2021
  15. 08/15 scalar: implement the `clone` subcommandJohannes Schindelin via GitGitGadget, Aug 30, 2021
  16. Ævar Arnfjörð BjarmasonAug 31, 2021
  17. Eric SunshineAug 31, 2021
  18. Johannes SchindelinSep 3, 2021
  19. Junio C HamanoSep 1, 2021
  20. Derrick StoleeSep 3, 2021
  21. Junio C HamanoSep 3, 2021
  22. Johannes SchindelinSep 3, 2021
  23. Junio C HamanoSep 3, 2021
  24. Johannes SchindelinSep 8, 2021
  25. Ævar Arnfjörð BjarmasonSep 9, 2021
  26. Elijah NewrenSep 28, 2021
  27. Johannes SchindelinOct 6, 2021
  28. Elijah NewrenOct 7, 2021
  29. 09/15 scalar: teach 'clone' to support the --single-branch optionJohannes Schindelin via GitGitGadget, Aug 30, 2021
  30. 10/15 scalar: implement the `run` commandDerrick Stolee via GitGitGadget, Aug 30, 2021
  31. Ævar Arnfjörð BjarmasonAug 31, 2021
  32. Johannes SchindelinSep 3, 2021
  33. Junio C HamanoSep 3, 2021
  34. Johannes SchindelinSep 8, 2021
  35. 11/15 scalar: allow reconfiguring an existing enlistmentJohannes Schindelin via GitGitGadget, Aug 30, 2021
  36. Ævar Arnfjörð BjarmasonAug 31, 2021
  37. Johannes SchindelinSep 3, 2021
  38. Ævar Arnfjörð BjarmasonSep 6, 2021
  39. 12/15 scalar: teach 'reconfigure' to optionally handle all registered enlistmentsJohannes Schindelin via GitGitGadget, Aug 30, 2021
  40. Eric SunshineAug 31, 2021
  41. Johannes SchindelinSep 3, 2021
  42. Eric SunshineSep 3, 2021
  43. Johannes SchindelinSep 8, 2021
  44. 13/15 scalar: implement the `delete` commandMatthew John Cheetham via GitGitGadget, Aug 30, 2021
  45. 15/15 scalar: accept -C and -c options before the subcommandJohannes Schindelin via GitGitGadget, Aug 30, 2021
  46. Ævar Arnfjörð BjarmasonAug 31, 2021
  47. Derrick StoleeAug 31, 2021
  48. Ævar Arnfjörð BjarmasonAug 31, 2021
  49. 14/15 scalar: implement the `version` commandJohannes Schindelin via GitGitGadget, Aug 30, 2021
  50. Eric SunshineAug 31, 2021
  51. Johannes SchindelinSep 3, 2021
  52. Derrick StoleeAug 31, 2021
  53. Elijah NewrenSep 1, 2021
  54. 00/15 [RFC] Upstreaming the Scalar commandJohannes Schindelin via GitGitGadget, Sep 3, 2021
  55. 01/15 scalar: create a rudimentary executableJohannes Schindelin via GitGitGadget, Sep 3, 2021
  56. Ævar Arnfjörð BjarmasonSep 14, 2021
  57. 03/15 scalar: create test infrastructureJohannes Schindelin via GitGitGadget, Sep 3, 2021
  58. 02/15 scalar: start documenting the commandJohannes Schindelin via GitGitGadget, Sep 3, 2021
  59. 04/15 scalar: 'register' sets recommended config and starts maintenanceDerrick Stolee via GitGitGadget, Sep 3, 2021
  60. 05/15 scalar: 'unregister' stops background maintenanceDerrick Stolee via GitGitGadget, Sep 3, 2021
  61. 06/15 scalar: let 'unregister' handle a deleted enlistment directory gracefullyJohannes Schindelin via GitGitGadget, Sep 3, 2021
  62. 07/15 scalar: implement 'scalar list'Derrick Stolee via GitGitGadget, Sep 3, 2021
  63. Bagas SanjayaSep 4, 2021
  64. Johannes SchindelinSep 8, 2021
  65. 08/15 scalar: implement the `clone` subcommandJohannes Schindelin via GitGitGadget, Sep 3, 2021
  66. Ævar Arnfjörð BjarmasonSep 6, 2021
  67. Johannes SchindelinSep 8, 2021
  68. 09/15 scalar: teach 'clone' to support the --single-branch optionJohannes Schindelin via GitGitGadget, Sep 3, 2021
  69. 10/15 scalar: implement the `run` commandDerrick Stolee via GitGitGadget, Sep 3, 2021
  70. 12/15 scalar: teach 'reconfigure' to optionally handle all registered enlistmentsJohannes Schindelin via GitGitGadget, Sep 3, 2021
  71. 13/15 scalar: implement the `delete` commandMatthew John Cheetham via GitGitGadget, Sep 3, 2021
  72. 11/15 scalar: allow reconfiguring an existing enlistmentJohannes Schindelin via GitGitGadget, Sep 3, 2021
  73. 14/15 scalar: implement the `version` commandJohannes Schindelin via GitGitGadget, Sep 3, 2021
  74. 15/15 scalar: accept -C and -c options before the subcommandJohannes Schindelin via GitGitGadget, Sep 3, 2021
  75. Ævar Arnfjörð BjarmasonSep 6, 2021
  76. 00/15 [RFC] Upstreaming the Scalar commandJohannes Schindelin via GitGitGadget, Sep 8, 2021
  77. 01/15 scalar: create a rudimentary executableJohannes Schindelin via GitGitGadget, Sep 8, 2021
  78. Elijah NewrenSep 9, 2021
  79. Johannes SchindelinSep 13, 2021
  80. 02/15 scalar: start documenting the commandJohannes Schindelin via GitGitGadget, Sep 8, 2021
  81. 03/15 scalar: create test infrastructureJohannes Schindelin via GitGitGadget, Sep 8, 2021
  82. 04/15 scalar: 'register' sets recommended config and starts maintenanceDerrick Stolee via GitGitGadget, Sep 8, 2021
  83. 05/15 scalar: 'unregister' stops background maintenanceDerrick Stolee via GitGitGadget, Sep 8, 2021
  84. 06/15 scalar: let 'unregister' handle a deleted enlistment directory gracefullyJohannes Schindelin via GitGitGadget, Sep 8, 2021
  85. 07/15 scalar: implement 'scalar list'Derrick Stolee via GitGitGadget, Sep 8, 2021
  86. Bagas SanjayaSep 9, 2021
  87. 08/15 scalar: implement the `clone` subcommandJohannes Schindelin via GitGitGadget, Sep 8, 2021
  88. 09/15 scalar: teach 'clone' to support the --single-branch optionJohannes Schindelin via GitGitGadget, Sep 8, 2021
  89. 10/15 scalar: implement the `run` commandDerrick Stolee via GitGitGadget, Sep 8, 2021
  90. 11/15 scalar: allow reconfiguring an existing enlistmentJohannes Schindelin via GitGitGadget, Sep 8, 2021
  91. 12/15 scalar: teach 'reconfigure' to optionally handle all registered enlistmentsJohannes Schindelin via GitGitGadget, Sep 8, 2021
  92. 13/15 scalar: implement the `delete` commandMatthew John Cheetham via GitGitGadget, Sep 8, 2021
  93. 14/15 scalar: implement the `version` commandJohannes Schindelin via GitGitGadget, Sep 8, 2021
  94. 15/15 scalar: accept -C and -c options before the subcommandJohannes Schindelin via GitGitGadget, Sep 8, 2021
  95. Ævar Arnfjörð BjarmasonSep 9, 2021
  96. Ævar Arnfjörð BjarmasonSep 13, 2021
  97. Johannes SchindelinSep 13, 2021
  98. Ævar Arnfjörð BjarmasonSep 14, 2021
  99. Train station analogy, was Re: [PATCH v3 00/15] [RFC] Upstreaming the Scalar commandJohannes Schindelin, Sep 14, 2021
  100. Junio C HamanoSep 14, 2021
  101. Ævar Arnfjörð BjarmasonSep 14, 2021
  102. Derrick StoleeSep 14, 2021
  103. Theodore Ts'oSep 14, 2021
  104. Ævar Arnfjörð BjarmasonSep 15, 2021
  105. Junio C HamanoSep 14, 2021
  106. Johannes SchindelinOct 6, 2021
  107. Junio C HamanoOct 6, 2021
  108. Johannes SchindelinOct 7, 2021
  109. Ævar Arnfjörð BjarmasonOct 7, 2021
  110. Ævar Arnfjörð BjarmasonSep 14, 2021
  111. 00/15 Upstreaming the Scalar commandJohannes Schindelin via GitGitGadget, Sep 14, 2021
  112. 01/15 scalar: create a rudimentary executableJohannes Schindelin via GitGitGadget, Sep 14, 2021
  113. Ævar Arnfjörð BjarmasonSep 24, 2021
  114. Junio C HamanoSep 24, 2021
  115. Ævar Arnfjörð BjarmasonSep 26, 2021
  116. Junio C HamanoSep 27, 2021
  117. 02/15 scalar: start documenting the commandJohannes Schindelin via GitGitGadget, Sep 14, 2021
  118. 03/15 scalar: create test infrastructureJohannes Schindelin via GitGitGadget, Sep 14, 2021
  119. 04/15 scalar: 'register' sets recommended config and starts maintenanceDerrick Stolee via GitGitGadget, Sep 14, 2021
  120. Elijah NewrenSep 28, 2021
  121. Ævar Arnfjörð BjarmasonSep 28, 2021
  122. Johannes SchindelinOct 6, 2021
  123. Elijah NewrenSep 28, 2021
  124. Johannes SchindelinOct 6, 2021
  125. 05/15 scalar: 'unregister' stops background maintenanceDerrick Stolee via GitGitGadget, Sep 14, 2021
  126. 06/15 scalar: let 'unregister' handle a deleted enlistment directory gracefullyJohannes Schindelin via GitGitGadget, Sep 14, 2021
  127. 07/15 scalar: implement 'scalar list'Derrick Stolee via GitGitGadget, Sep 14, 2021
  128. 08/15 scalar: implement the `clone` subcommandJohannes Schindelin via GitGitGadget, Sep 14, 2021
  129. 09/15 scalar: teach 'clone' to support the --single-branch optionJohannes Schindelin via GitGitGadget, Sep 14, 2021
  130. 11/15 scalar: allow reconfiguring an existing enlistmentJohannes Schindelin via GitGitGadget, Sep 14, 2021
  131. Elijah NewrenSep 28, 2021
  132. Johannes SchindelinOct 6, 2021
  133. 10/15 scalar: implement the `run` commandDerrick Stolee via GitGitGadget, Sep 14, 2021
  134. 12/15 scalar: teach 'reconfigure' to optionally handle all registered enlistmentsJohannes Schindelin via GitGitGadget, Sep 14, 2021
  135. 13/15 scalar: implement the `delete` commandMatthew John Cheetham via GitGitGadget, Sep 14, 2021
  136. Elijah NewrenSep 28, 2021
  137. 14/15 scalar: implement the `version` commandJohannes Schindelin via GitGitGadget, Sep 14, 2021
  138. 15/15 scalar: accept -C and -c options before the subcommandJohannes Schindelin via GitGitGadget, Sep 14, 2021
  139. Johannes SchindelinSep 14, 2021
  140. Junio C HamanoSep 14, 2021
  141. 00/15 Upstreaming the Scalar commandJohannes Schindelin via GitGitGadget, Oct 7, 2021
  142. 01/15 scalar: create a rudimentary executableJohannes Schindelin via GitGitGadget, Oct 7, 2021
  143. 02/15 scalar: start documenting the commandJohannes Schindelin via GitGitGadget, Oct 7, 2021
  144. 03/15 scalar: create test infrastructureJohannes Schindelin via GitGitGadget, Oct 7, 2021
  145. 04/15 scalar: 'register' sets recommended config and starts maintenanceDerrick Stolee via GitGitGadget, Oct 7, 2021
  146. 05/15 scalar: 'unregister' stops background maintenanceDerrick Stolee via GitGitGadget, Oct 7, 2021
  147. 06/15 scalar: let 'unregister' handle a deleted enlistment directory gracefullyJohannes Schindelin via GitGitGadget, Oct 7, 2021
  148. 07/15 scalar: implement 'scalar list'Derrick Stolee via GitGitGadget, Oct 7, 2021
  149. 08/15 scalar: implement the `clone` subcommandJohannes Schindelin via GitGitGadget, Oct 7, 2021
  150. 10/15 scalar: implement the `run` commandDerrick Stolee via GitGitGadget, Oct 7, 2021
  151. 09/15 scalar: teach 'clone' to support the --single-branch optionJohannes Schindelin via GitGitGadget, Oct 7, 2021
  152. 11/15 scalar: allow reconfiguring an existing enlistmentJohannes Schindelin via GitGitGadget, Oct 7, 2021
  153. 14/15 scalar: implement the `version` commandJohannes Schindelin via GitGitGadget, Oct 7, 2021
  154. 12/15 scalar: teach 'reconfigure' to optionally handle all registered enlistmentsJohannes Schindelin via GitGitGadget, Oct 7, 2021
  155. 13/15 scalar: implement the `delete` commandMatthew John Cheetham via GitGitGadget, Oct 7, 2021
  156. 15/15 scalar: accept -C and -c options before the subcommandJohannes Schindelin via GitGitGadget, Oct 7, 2021
  157. Ævar Arnfjörð BjarmasonOct 7, 2021
  158. 00/15 Upstreaming the Scalar commandJohannes Schindelin via GitGitGadget, Oct 27, 2021
  159. 01/15 scalar: create a rudimentary executableJohannes Schindelin via GitGitGadget, Oct 27, 2021
  160. 02/15 scalar: start documenting the commandJohannes Schindelin via GitGitGadget, Oct 27, 2021
  161. 03/15 scalar: create test infrastructureJohannes Schindelin via GitGitGadget, Oct 27, 2021
  162. 04/15 scalar: 'register' sets recommended config and starts maintenanceDerrick Stolee via GitGitGadget, Oct 27, 2021
  163. 05/15 scalar: 'unregister' stops background maintenanceDerrick Stolee via GitGitGadget, Oct 27, 2021
  164. 06/15 scalar: let 'unregister' handle a deleted enlistment directory gracefullyJohannes Schindelin via GitGitGadget, Oct 27, 2021
  165. 07/15 scalar: implement 'scalar list'Derrick Stolee via GitGitGadget, Oct 27, 2021
  166. 08/15 scalar: implement the `clone` subcommandJohannes Schindelin via GitGitGadget, Oct 27, 2021
  167. 09/15 scalar: teach 'clone' to support the --single-branch optionJohannes Schindelin via GitGitGadget, Oct 27, 2021
  168. 10/15 scalar: implement the `run` commandDerrick Stolee via GitGitGadget, Oct 27, 2021
  169. 11/15 scalar: allow reconfiguring an existing enlistmentJohannes Schindelin via GitGitGadget, Oct 27, 2021
  170. 12/15 scalar: teach 'reconfigure' to optionally handle all registered enlistmentsJohannes Schindelin via GitGitGadget, Oct 27, 2021
  171. 13/15 scalar: implement the `delete` commandMatthew John Cheetham via GitGitGadget, Oct 27, 2021
  172. 14/15 scalar: implement the `version` commandJohannes Schindelin via GitGitGadget, Oct 27, 2021
  173. 15/15 scalar: accept -C and -c options before the subcommandJohannes Schindelin via GitGitGadget, Oct 27, 2021
  174. Derrick StoleeOct 27, 2021
  175. 00/17 Upstreaming the Scalar commandJohannes Schindelin via GitGitGadget, Nov 17, 2021
  176. 01/17 scalar: add a README with a roadmapJohannes Schindelin via GitGitGadget, Nov 17, 2021
  177. Derrick StoleeNov 17, 2021
  178. Johannes SchindelinNov 18, 2021
  179. 02/17 scalar: create a rudimentary executableJohannes Schindelin via GitGitGadget, Nov 17, 2021
  180. 03/17 scalar: start documenting the commandJohannes Schindelin via GitGitGadget, Nov 17, 2021
  181. 04/17 scalar: create test infrastructureJohannes Schindelin via GitGitGadget, Nov 17, 2021
  182. 05/17 cmake: optionally build `scalar`, tooJohannes Schindelin via GitGitGadget, Nov 17, 2021
  183. Matt RogersNov 17, 2021
  184. Johannes SchindelinNov 18, 2021
  185. 10/17 scalar: implement 'scalar list'Derrick Stolee via GitGitGadget, Nov 17, 2021
  186. 11/17 scalar: implement the `clone` subcommandJohannes Schindelin via GitGitGadget, Nov 17, 2021
  187. 08/17 scalar: 'unregister' stops background maintenanceDerrick Stolee via GitGitGadget, Nov 17, 2021
  188. 09/17 scalar: let 'unregister' handle a deleted enlistment directory gracefullyJohannes Schindelin via GitGitGadget, Nov 17, 2021
  189. 12/17 scalar: teach 'clone' to support the --single-branch optionJohannes Schindelin via GitGitGadget, Nov 17, 2021
  190. 14/17 scalar: allow reconfiguring an existing enlistmentJohannes Schindelin via GitGitGadget, Nov 17, 2021
  191. 07/17 scalar: 'register' sets recommended config and starts maintenanceDerrick Stolee via GitGitGadget, Nov 17, 2021
  192. 16/17 scalar: implement the `delete` commandMatthew John Cheetham via GitGitGadget, Nov 17, 2021
  193. 06/17 ci: also run the `scalar` testsJohannes Schindelin via GitGitGadget, Nov 17, 2021
  194. 17/17 scalar: implement the `version` commandJohannes Schindelin via GitGitGadget, Nov 17, 2021
  195. 13/17 scalar: implement the `run` commandDerrick Stolee via GitGitGadget, Nov 17, 2021
  196. 15/17 scalar: teach 'reconfigure' to optionally handle all registered enlistmentsJohannes Schindelin via GitGitGadget, Nov 17, 2021
  197. Ævar Arnfjörð BjarmasonNov 18, 2021
  198. 00/17 Upstreaming the Scalar commandJohannes Schindelin via GitGitGadget, Nov 19, 2021
  199. 01/17 scalar: add a README with a roadmapJohannes Schindelin via GitGitGadget, Nov 19, 2021
  200. 02/17 scalar: create a rudimentary executableJohannes Schindelin via GitGitGadget, Nov 19, 2021
  201. 03/17 scalar: start documenting the commandJohannes Schindelin via GitGitGadget, Nov 19, 2021
  202. 04/17 scalar: create test infrastructureJohannes Schindelin via GitGitGadget, Nov 19, 2021
  203. Ævar Arnfjörð BjarmasonNov 30, 2021
  204. 05/17 cmake: optionally build `scalar`, tooJohannes Schindelin via GitGitGadget, Nov 19, 2021
  205. 06/17 ci: also run the `scalar` testsJohannes Schindelin via GitGitGadget, Nov 19, 2021
  206. 07/17 scalar: 'register' sets recommended config and starts maintenanceDerrick Stolee via GitGitGadget, Nov 19, 2021
  207. 08/17 scalar: 'unregister' stops background maintenanceDerrick Stolee via GitGitGadget, Nov 19, 2021
  208. 09/17 scalar: let 'unregister' handle a deleted enlistment directory gracefullyJohannes Schindelin via GitGitGadget, Nov 19, 2021
  209. 10/17 scalar: implement 'scalar list'Derrick Stolee via GitGitGadget, Nov 19, 2021
  210. 11/17 scalar: implement the `clone` subcommandJohannes Schindelin via GitGitGadget, Nov 19, 2021
  211. 12/17 scalar: teach 'clone' to support the --single-branch optionJohannes Schindelin via GitGitGadget, Nov 19, 2021
  212. 13/17 scalar: implement the `run` commandDerrick Stolee via GitGitGadget, Nov 19, 2021
  213. 14/17 scalar: allow reconfiguring an existing enlistmentJohannes Schindelin via GitGitGadget, Nov 19, 2021
  214. 15/17 scalar: teach 'reconfigure' to optionally handle all registered enlistmentsJohannes Schindelin via GitGitGadget, Nov 19, 2021
  215. 16/17 scalar: implement the `delete` commandMatthew John Cheetham via GitGitGadget, Nov 19, 2021
  216. 17/17 scalar: implement the `version` commandJohannes Schindelin via GitGitGadget, Nov 19, 2021
  217. Elijah NewrenNov 20, 2021
  218. Johannes SchindelinNov 22, 2021
  219. Ævar Arnfjörð BjarmasonNov 22, 2021
  220. Johannes SchindelinNov 22, 2021
  221. Ævar Arnfjörð BjarmasonNov 22, 2021
  222. Johannes SchindelinNov 23, 2021
  223. Ævar Arnfjörð BjarmasonNov 23, 2021
  224. Johannes SchindelinNov 23, 2021
  225. 00/17 Upstreaming the Scalar commandJohannes Schindelin via GitGitGadget, Nov 30, 2021
  226. 02/17 scalar: create a rudimentary executableJohannes Schindelin via GitGitGadget, Nov 30, 2021
  227. 03/17 scalar: start documenting the commandJohannes Schindelin via GitGitGadget, Nov 30, 2021
  228. 01/17 scalar: add a README with a roadmapJohannes Schindelin via GitGitGadget, Nov 30, 2021
  229. 05/17 cmake: optionally build `scalar`, tooJohannes Schindelin via GitGitGadget, Nov 30, 2021
  230. 04/17 scalar: create test infrastructureJohannes Schindelin via GitGitGadget, Nov 30, 2021
  231. 06/17 ci: also run the `scalar` testsJohannes Schindelin via GitGitGadget, Nov 30, 2021
  232. 07/17 scalar: 'register' sets recommended config and starts maintenanceDerrick Stolee via GitGitGadget, Nov 30, 2021
  233. 08/17 scalar: 'unregister' stops background maintenanceDerrick Stolee via GitGitGadget, Nov 30, 2021
  234. 12/17 scalar: teach 'clone' to support the --single-branch optionJohannes Schindelin via GitGitGadget, Nov 30, 2021
  235. 11/17 scalar: implement the `clone` subcommandJohannes Schindelin via GitGitGadget, Nov 30, 2021
  236. 10/17 scalar: implement 'scalar list'Derrick Stolee via GitGitGadget, Nov 30, 2021
  237. 15/17 scalar: teach 'reconfigure' to optionally handle all registered enlistmentsJohannes Schindelin via GitGitGadget, Nov 30, 2021
  238. 16/17 scalar: implement the `delete` commandMatthew John Cheetham via GitGitGadget, Nov 30, 2021
  239. 17/17 scalar: implement the `version` commandJohannes Schindelin via GitGitGadget, Nov 30, 2021
  240. 14/17 scalar: allow reconfiguring an existing enlistmentJohannes Schindelin via GitGitGadget, Nov 30, 2021
  241. 13/17 scalar: implement the `run` commandDerrick Stolee via GitGitGadget, Nov 30, 2021
  242. 09/17 scalar: let 'unregister' handle a deleted enlistment directory gracefullyJohannes Schindelin via GitGitGadget, Nov 30, 2021
  243. Ævar Arnfjörð BjarmasonNov 30, 2021
  244. Johannes SchindelinNov 30, 2021
  245. Ævar Arnfjörð BjarmasonNov 30, 2021
  246. Junio C HamanoDec 1, 2021
  247. Johannes SchindelinDec 2, 2021
  248. Junio C HamanoDec 2, 2021
  249. Elijah NewrenDec 2, 2021
  250. Junio C HamanoDec 2, 2021
  251. Johannes SchindelinDec 8, 2021
  252. Junio C HamanoDec 9, 2021
  253. 00/15 Upstreaming the Scalar commandJohannes Schindelin via GitGitGadget, Dec 3, 2021
  254. 01/15 scalar: add a README with a roadmapJohannes Schindelin via GitGitGadget, Dec 3, 2021
  255. 02/15 scalar: create a rudimentary executableJohannes Schindelin via GitGitGadget, Dec 3, 2021
  256. 03/15 scalar: start documenting the commandJohannes Schindelin via GitGitGadget, Dec 3, 2021
  257. 04/15 scalar: create test infrastructureJohannes Schindelin via GitGitGadget, Dec 3, 2021
  258. 05/15 scalar: 'register' sets recommended config and starts maintenanceDerrick Stolee via GitGitGadget, Dec 3, 2021
  259. 06/15 scalar: 'unregister' stops background maintenanceDerrick Stolee via GitGitGadget, Dec 3, 2021
  260. 09/15 scalar: implement the `clone` subcommandJohannes Schindelin via GitGitGadget, Dec 3, 2021
  261. 08/15 scalar: implement 'scalar list'Derrick Stolee via GitGitGadget, Dec 3, 2021
  262. 07/15 scalar: let 'unregister' handle a deleted enlistment directory gracefullyJohannes Schindelin via GitGitGadget, Dec 3, 2021
  263. 10/15 scalar: teach 'clone' to support the --single-branch optionJohannes Schindelin via GitGitGadget, Dec 3, 2021
  264. 11/15 scalar: implement the `run` commandDerrick Stolee via GitGitGadget, Dec 3, 2021
  265. 12/15 scalar: allow reconfiguring an existing enlistmentJohannes Schindelin via GitGitGadget, Dec 3, 2021
  266. 13/15 scalar: teach 'reconfigure' to optionally handle all registered enlistmentsJohannes Schindelin via GitGitGadget, Dec 3, 2021
  267. 14/15 scalar: implement the `delete` commandMatthew John Cheetham via GitGitGadget, Dec 3, 2021
  268. 15/15 scalar: implement the `version` commandJohannes Schindelin via GitGitGadget, Dec 3, 2021
  269. Elijah NewrenDec 3, 2021
  270. Junio C HamanoDec 5, 2021
  271. Ævar Arnfjörð BjarmasonDec 7, 2021
  272. Junio C HamanoDec 8, 2021
  273. Makefile: add test-all targetJunio C Hamano, Dec 8, 2021
  274. Derrick StoleeDec 8, 2021
  275. Junio C HamanoDec 8, 2021
  276. Jeff KingDec 8, 2021
  277. Junio C HamanoDec 8, 2021
  278. Junio C HamanoDec 9, 2021
  279. Jeff KingDec 10, 2021
  280. Junio C HamanoDec 13, 2021
  281. Ævar Arnfjörð BjarmasonDec 9, 2021
  282. Junio C HamanoDec 9, 2021
  283. Ævar Arnfjörð BjarmasonDec 10, 2021
  284. Jeff KingDec 10, 2021
  285. Ævar Arnfjörð BjarmasonDec 10, 2021
  286. Johannes SchindelinDec 10, 2021
  287. Elijah NewrenDec 10, 2021
  288. Junio C HamanoDec 13, 2021
  289. Johannes SchindelinDec 10, 2021
  290. Junio C HamanoDec 13, 2021
  291. Jeff KingDec 14, 2021
  292. Jeff KingDec 14, 2021
  293. Bagas SanjayaDec 11, 2021
  294. Johannes SchindelinDec 8, 2021
  295. Ævar Arnfjörð BjarmasonDec 8, 2021
  296. Derrick StoleeDec 8, 2021
  297. Elijah NewrenDec 8, 2021
  298. Junio C HamanoDec 9, 2021
  299. Johannes SchindelinDec 11, 2021
  300. Ævar Arnfjörð BjarmasonDec 11, 2021
  301. Elijah NewrenDec 11, 2021
  302. Johannes SchindelinDec 11, 2021
  303. Johannes SchindelinOct 6, 2021

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.