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

[PATCH v2 0/9] refs: ref storage format migrations

From
Patrick Steinhardt <ps@pks.im>
Date
May 24, 2024, 10:14 UTC
Message-ID
<cover.1716545235.git.ps@pks.im>
In-Reply-To
<cover.1716451672.git.ps@pks.im>
Hi,

this patch series implements support for migrating between ref storage formats in a repository via a new `git refs migrate` command. The scope of this command is currently limited to repositories without worktrees and reflogs. Furthermore, the user needs to make sure that there are no concurrent writes.

Changes compared to v1:
  - Improve commit messages.
  - Mention that `--dry-run` mode will print the path to the migrated
    directory to stdout.
  - Mention that the repository should be deregistered from maintenance
    before running the migration.
Thanks!
Patrick
Patrick Steinhardt (9):
  setup: unset ref storage when reinitializing repository version
  refs: convert ref storage format to an enum
  refs: pass storage format to `ref_store_init()` explicitly
  refs: allow to skip creation of reflog entries
  refs/files: refactor `add_pseudoref_and_head_entries()`
  refs/files: extract function to iterate through root refs
  refs: implement removal of ref storages
  refs: implement logic to migrate between ref storage formats
  builtin/refs: new command to migrate ref storage formats
 .gitignore                 |   1 +
 Documentation/git-refs.txt |  62 +++++++
 Makefile                   |   1 +
 builtin.h                  |   1 +
 builtin/clone.c            |   2 +-
 builtin/init-db.c          |   2 +-
 builtin/refs.c             |  75 +++++++++
 git.c                      |   1 +
 refs.c                     | 319 +++++++++++++++++++++++++++++++++++--
 refs.h                     |  41 ++++-
 refs/files-backend.c       | 121 ++++++++++++--
 refs/packed-backend.c      |  15 ++
 refs/refs-internal.h       |   7 +
 refs/reftable-backend.c    |  37 ++++-
 repository.c               |   3 +-
 repository.h               |  10 +-
 setup.c                    |  10 +-
 setup.h                    |   9 +-
 t/helper/test-ref-store.c  |   1 +
 t/t1460-refs-migrate.sh    | 243 ++++++++++++++++++++++++++++
 20 files changed, 916 insertions(+), 45 deletions(-)
 create mode 100644 Documentation/git-refs.txt
 create mode 100644 builtin/refs.c
 create mode 100755 t/t1460-refs-migrate.sh
Range-diff against v1:
 1:  8b11127daf =  1:  8b11127daf setup: unset ref storage when reinitializing repository version
 2:  25f740f395 =  2:  25f740f395 refs: convert ref storage format to an enum
 3:  6e7b9764f6 =  3:  6e7b9764f6 refs: pass storage format to `ref_store_init()` explicitly
 4:  03f4ac6ee7 =  4:  03f4ac6ee7 refs: allow to skip creation of reflog entries
 5:  71f31fe66c =  5:  71f31fe66c refs/files: refactor `add_pseudoref_and_head_entries()`
 6:  6b696690ca =  6:  6b696690ca refs/files: extract function to iterate through root refs
 7:  b758c419c6 =  7:  b758c419c6 refs: implement removal of ref storages
 8:  4e0edda6d3 !  8:  4d3eb5ea89 refs: implement logic to migrate between ref storage formats
    @@ Commit message
         whole repository. Add the logic to do so.
     
         The implementation is generic and works with arbitrary ref storage
    -    formats because we only use. It does have a few limitations though:
    +    formats so that a backend does not need to implement any migration
    +    logic. It does have a few limitations though:
     
           - We do not migrate repositories with worktrees, because worktrees
             have separate ref storages. It makes the overall affair more complex
    @@ Commit message
     
         In other words, this version is a minimum viable product for migrating a
         repository's ref storage format. It works alright for bare repos, which
    -    typically have neither worktrees nor reflogs. But it will not work for
    -    many other repositories without some preparations. These limitations are
    -    not set into stone though, and ideally we will eventually address them
    -    over time.
    +    often have neither worktrees nor reflogs. But it will not work for many
    +    other repositories without some preparations. These limitations are not
    +    set into stone though, and ideally we will eventually address them over
    +    time.
     
         The logic is not yet used by anything, and thus there are no tests for
         it. Those will be added in the next commit.
 9:  2ebcc0db65 !  9:  0df17a51b4 builtin/refs: new command to migrate ref storage formats
    @@ Documentation/git-refs.txt (new)
     +--dry-run::
     +	Perform the migration, but do not modify the repository. The migrated
     +	refs will be written into a separate directory that can be inspected
    -+	separately. This can be used to double check that the migration works
    -+	as expected before doing performing the actual migration.
    ++	separately. The name of the directory will be reported on stdout. This
    ++	can be used to double check that the migration works as expected doing
    ++	performing the actual migration.
     +
     +KNOWN LIMITATIONS
     +-----------------
    @@ Documentation/git-refs.txt (new)
     +
     +* There is no way to block concurrent writes to the repository during an
     +  ongoing migration. Concurrent writes can lead to an inconsistent migrated
    -+  state. Users are expected to block writes on a higher level.
    ++  state. Users are expected to block writes on a higher level. If your
    ++  repository is registered for scheduled maintenance, it is recommended to
    ++  unregister it first with git-maintenance(1).
     +
     +These limitations may eventually be lifted.
     +
-- 
2.45.1.216.g4365c6fcf9.dirty
Previous: Junio C HamanoNext: Patrick Steinhardt
Message 21 of 103 in “refs: ref storage format migrations”
  1. 0/9 refs: ref storage format migrationsPatrick Steinhardt, May 23, 2024
  2. 1/9 setup: unset ref storage when reinitializing repository versionPatrick Steinhardt, May 23, 2024
  3. 2/9 refs: convert ref storage format to an enumPatrick Steinhardt, May 23, 2024
  4. 3/9 refs: pass storage format to `ref_store_init()` explicitlyPatrick Steinhardt, May 23, 2024
  5. 4/9 refs: allow to skip creation of reflog entriesPatrick Steinhardt, May 23, 2024
  6. 5/9 refs/files: refactor `add_pseudoref_and_head_entries()`Patrick Steinhardt, May 23, 2024
  7. 6/9 refs/files: extract function to iterate through root refsPatrick Steinhardt, May 23, 2024
  8. 7/9 refs: implement removal of ref storagesPatrick Steinhardt, May 23, 2024
  9. 8/9 refs: implement logic to migrate between ref storage formatsPatrick Steinhardt, May 23, 2024
  10. Eric SunshineMay 23, 2024
  11. Patrick SteinhardtMay 24, 2024
  12. Eric SunshineMay 24, 2024
  13. 9/9 builtin/refs: new command to migrate ref storage formatsPatrick Steinhardt, May 23, 2024
  14. Eric SunshineMay 23, 2024
  15. Patrick SteinhardtMay 24, 2024
  16. Junio C HamanoMay 23, 2024
  17. Patrick SteinhardtMay 24, 2024
  18. Junio C HamanoMay 24, 2024
  19. Patrick SteinhardtMay 28, 2024
  20. Junio C HamanoMay 28, 2024
  21. 0/9 refs: ref storage format migrationsPatrick Steinhardt, May 24, 2024
  22. 1/9 setup: unset ref storage when reinitializing repository versionPatrick Steinhardt, May 24, 2024
  23. Justin ToblerMay 24, 2024
  24. Patrick SteinhardtMay 28, 2024
  25. 2/9 refs: convert ref storage format to an enumPatrick Steinhardt, May 24, 2024
  26. 3/9 refs: pass storage format to `ref_store_init()` explicitlyPatrick Steinhardt, May 24, 2024
  27. 4/9 refs: allow to skip creation of reflog entriesPatrick Steinhardt, May 24, 2024
  28. 5/9 refs/files: refactor `add_pseudoref_and_head_entries()`Patrick Steinhardt, May 24, 2024
  29. 6/9 refs/files: extract function to iterate through root refsPatrick Steinhardt, May 24, 2024
  30. 7/9 refs: implement removal of ref storagesPatrick Steinhardt, May 24, 2024
  31. 8/9 refs: implement logic to migrate between ref storage formatsPatrick Steinhardt, May 24, 2024
  32. Justin ToblerMay 24, 2024
  33. Patrick SteinhardtMay 28, 2024
  34. 9/9 builtin/refs: new command to migrate ref storage formatsPatrick Steinhardt, May 24, 2024
  35. Ramsay JonesMay 24, 2024
  36. Eric SunshineMay 24, 2024
  37. Patrick SteinhardtMay 28, 2024
  38. 00/12 refs: ref storage format migrationsPatrick Steinhardt, May 28, 2024
  39. 01/12 setup: unset ref storage when reinitializing repository versionPatrick Steinhardt, May 28, 2024
  40. 02/12 refs: convert ref storage format to an enumPatrick Steinhardt, May 28, 2024
  41. 03/12 refs: pass storage format to `ref_store_init()` explicitlyPatrick Steinhardt, May 28, 2024
  42. 04/12 refs: allow to skip creation of reflog entriesPatrick Steinhardt, May 28, 2024
  43. 05/12 refs/files: refactor `add_pseudoref_and_head_entries()`Patrick Steinhardt, May 28, 2024
  44. 06/12 refs/files: extract function to iterate through root refsPatrick Steinhardt, May 28, 2024
  45. 07/12 refs/files: fix NULL pointer deref when releasing ref storePatrick Steinhardt, May 28, 2024
  46. 08/12 reftable: inline `merged_table_release()`Patrick Steinhardt, May 28, 2024
  47. 09/12 worktree: don't store main worktree twicePatrick Steinhardt, May 28, 2024
  48. 10/12 refs: implement removal of ref storagesPatrick Steinhardt, May 28, 2024
  49. 11/12 refs: implement logic to migrate between ref storage formatsPatrick Steinhardt, May 28, 2024
  50. 12/12 builtin/refs: new command to migrate ref storage formatsPatrick Steinhardt, May 28, 2024
  51. Junio C HamanoMay 31, 2024
  52. Junio C HamanoJun 2, 2024
  53. Patrick SteinhardtJun 3, 2024
  54. Junio C HamanoMay 28, 2024
  55. Junio C HamanoMay 28, 2024
  56. 00/12 refs: ref storage migrationsPatrick Steinhardt, Jun 3, 2024
  57. 01/12 setup: unset ref storage when reinitializing repository versionPatrick Steinhardt, Jun 3, 2024
  58. 02/12 refs: convert ref storage format to an enumPatrick Steinhardt, Jun 3, 2024
  59. 03/12 refs: pass storage format to `ref_store_init()` explicitlyPatrick Steinhardt, Jun 3, 2024
  60. Karthik NayakJun 4, 2024
  61. 04/12 refs: allow to skip creation of reflog entriesPatrick Steinhardt, Jun 3, 2024
  62. Karthik NayakJun 4, 2024
  63. 05/12 refs/files: refactor `add_pseudoref_and_head_entries()`Patrick Steinhardt, Jun 3, 2024
  64. 06/12 refs/files: extract function to iterate through root refsPatrick Steinhardt, Jun 3, 2024
  65. Jeff KingJun 5, 2024
  66. Patrick SteinhardtJun 6, 2024
  67. Patrick SteinhardtJun 6, 2024
  68. Patrick SteinhardtJun 6, 2024
  69. 07/12 refs/files: fix NULL pointer deref when releasing ref storePatrick Steinhardt, Jun 3, 2024
  70. 08/12 reftable: inline `merged_table_release()`Patrick Steinhardt, Jun 3, 2024
  71. 09/12 worktree: don't store main worktree twicePatrick Steinhardt, Jun 3, 2024
  72. 10/12 refs: implement removal of ref storagesPatrick Steinhardt, Jun 3, 2024
  73. Karthik NayakJun 4, 2024
  74. Jeff KingJun 5, 2024
  75. Junio C HamanoJun 5, 2024
  76. Patrick SteinhardtJun 6, 2024
  77. 11/12 refs: implement logic to migrate between ref storage formatsPatrick Steinhardt, Jun 3, 2024
  78. Karthik NayakJun 4, 2024
  79. Patrick SteinhardtJun 5, 2024
  80. Jeff KingJun 5, 2024
  81. Junio C HamanoJun 5, 2024
  82. Patrick SteinhardtJun 6, 2024
  83. Jeff KingJun 6, 2024
  84. Junio C HamanoJun 6, 2024
  85. Jeff KingJun 8, 2024
  86. Junio C HamanoJun 8, 2024
  87. Patrick SteinhardtJun 6, 2024
  88. 12/12 builtin/refs: new command to migrate ref storage formatsPatrick Steinhardt, Jun 3, 2024
  89. 00/12 refs: ref storage migrationsPatrick Steinhardt, Jun 6, 2024
  90. 01/12 setup: unset ref storage when reinitializing repository versionPatrick Steinhardt, Jun 6, 2024
  91. 02/12 refs: convert ref storage format to an enumPatrick Steinhardt, Jun 6, 2024
  92. 03/12 refs: pass storage format to `ref_store_init()` explicitlyPatrick Steinhardt, Jun 6, 2024
  93. 04/12 refs: allow to skip creation of reflog entriesPatrick Steinhardt, Jun 6, 2024
  94. 05/12 refs/files: refactor `add_pseudoref_and_head_entries()`Patrick Steinhardt, Jun 6, 2024
  95. 06/12 refs/files: extract function to iterate through root refsPatrick Steinhardt, Jun 6, 2024
  96. 07/12 refs/files: fix NULL pointer deref when releasing ref storePatrick Steinhardt, Jun 6, 2024
  97. 08/12 reftable: inline `merged_table_release()`Patrick Steinhardt, Jun 6, 2024
  98. 09/12 worktree: don't store main worktree twicePatrick Steinhardt, Jun 6, 2024
  99. 10/12 refs: implement removal of ref storagesPatrick Steinhardt, Jun 6, 2024
  100. 11/12 refs: implement logic to migrate between ref storage formatsPatrick Steinhardt, Jun 6, 2024
  101. 12/12 builtin/refs: new command to migrate ref storage formatsPatrick Steinhardt, Jun 6, 2024
  102. Jeff KingJun 6, 2024
  103. Junio C HamanoJun 6, 2024

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.