tl;dr: I enabled feature.experimental in my global git config, and now whenever I clone a new repo with git clone, sapling's dotgit mode fails.
AI Slop
Muse Spark 1.1's Issue Summary
Sapling dotgit mode does not work in new repos cloned with git clone when Git uses reftable ref storage. Old repos still work. π¨
π Environment
- Git:
2.55.0.141.g55526a1826.dirty
- Sapling:
SAPLING_VERSION 0.2
- Config:
~/.gitconfig has feature.experimental = true
- OS:
darwin
π₯ Error Message
abort: When constructing alloc::boxed::Box<dyn storemodel::StoreOutput> from dyn storemodel::StoreInfo, after being ignored by ["eager"], "git" reported error: opening git store: unsupported extension name extensions.refstorage; class=Repository (6)
Error comes from eden/scm/lib/gitstore/src/gitstore.rs:98 (GitStore::open -> git2::Repository::open).
π Reproduction Steps
-
Enable experimental features in global git config: π
[feature]
experimental = true
-
Clone any repo with git clone. Example: π₯
rm -rf /tmp/reftable-test
git clone https://github.com/git/git.git /tmp/reftable-test
cat /tmp/reftable-test/.git/config
Config shows:
[extensions]
refstorage = reftable
And .git/reftable/ exists. .git/refs/heads does not.
-
Run sl in repo: πΉοΈ
cd /tmp/reftable-test && sl status
This fails with error above.
-
Also reproduce in reporter path: π
cd ~/code/github.com/git/git.git/ && sl status
π¬ Root Cause
-
Git 2.55 enables init.defaultRefFormat=reftable when feature.experimental=true. See Documentation/config/feature.adoc:16. π
When this flag is set, git clone and git init create repos with extensions.refstorage = reftable and store refs in .git/reftable/ tables.
-
Sapling uses libgit2 via git2 = "0.20.4" in eden/scm/lib/gitstore/Cargo.toml:24. This version does not support extensions.refstorage. git2::Repository::open in eden/scm/lib/gitstore/src/gitstore.rs:98 fails. π§©
-
Low level ref reader in eden/scm/lib/gitcompat/src/refs.rs:141 only reads loose files under refs/ and packed-refs. It does not read reftable format. π
π Related Code
eden/scm/lib/gitstore/src/gitstore.rs:98 - opens repo with libgit2
eden/scm/lib/gitstore/Cargo.toml:24 - git2 = "0.20.4"
eden/scm/lib/gitcompat/src/refs.rs:141 - populate_packed_references
eden/scm/lib/gitcompat/src/refs.rs:210 - populate_loose_directory_references
π Impact
- Any user with
feature.experimental=true (or explicit init.defaultRefFormat=reftable) gets new clones that do not work with sl.
feature.experimental is popular. Git will likely make reftable default in future. Impact will grow. β οΈ
π οΈ Suggested Fix
-
Update libgit2 to version that supports reftable. Check if libgit2 main branch already supports reftable. β¬οΈ
-
Update gitcompat/src/refs.rs to support reftable backend:
- Option A: shell out to
git refs / git for-each-ref / git show-ref for ref list. Then Sapling uses Git binary which supports reftable. π§
- Option B: add reftable parser in Rust, or use
gitoxide which supports reftable. π¦
-
Alternatively, detect reftable and show clear error with migration hint. π‘
β
Workaround For Users
Until fix is available:
-
Force files format for new repos. Add to ~/.gitconfig: π§
[init]
defaultRefFormat = files
-
Migrate existing broken repos: π
git refs migrate --ref-format=files
This converts .git/reftable/ back to .git/refs/ and sets repositoryformatversion = 0.
tl;dr: I enabled
feature.experimentalin my global git config, and now whenever I clone a new repo withgit clone, sapling's dotgit mode fails.AI Slop
Muse Spark 1.1's Issue Summary
Sapling
dotgitmode does not work in new repos cloned withgit clonewhen Git usesreftableref storage. Old repos still work. π¨π Environment
2.55.0.141.g55526a1826.dirtySAPLING_VERSION 0.2~/.gitconfighasfeature.experimental = truedarwinπ₯ Error Message
Error comes from
eden/scm/lib/gitstore/src/gitstore.rs:98(GitStore::open->git2::Repository::open).π Reproduction Steps
Enable experimental features in global git config: π
Clone any repo with
git clone. Example: π₯Config shows:
And
.git/reftable/exists..git/refs/headsdoes not.Run
slin repo: πΉοΈThis fails with error above.
Also reproduce in reporter path: π
π¬ Root Cause
Git 2.55 enables
init.defaultRefFormat=reftablewhenfeature.experimental=true. SeeDocumentation/config/feature.adoc:16. πWhen this flag is set,
git cloneandgit initcreate repos withextensions.refstorage = reftableand store refs in.git/reftable/tables.Sapling uses
libgit2viagit2 = "0.20.4"ineden/scm/lib/gitstore/Cargo.toml:24. This version does not supportextensions.refstorage.git2::Repository::openineden/scm/lib/gitstore/src/gitstore.rs:98fails. π§©Low level ref reader in
eden/scm/lib/gitcompat/src/refs.rs:141only reads loose files underrefs/andpacked-refs. It does not readreftableformat. ππ Related Code
eden/scm/lib/gitstore/src/gitstore.rs:98- opens repo with libgit2eden/scm/lib/gitstore/Cargo.toml:24-git2 = "0.20.4"eden/scm/lib/gitcompat/src/refs.rs:141-populate_packed_referenceseden/scm/lib/gitcompat/src/refs.rs:210-populate_loose_directory_referencesπ Impact
feature.experimental=true(or explicitinit.defaultRefFormat=reftable) gets new clones that do not work withsl.feature.experimentalis popular. Git will likely makereftabledefault in future. Impact will grow.π οΈ Suggested Fix
Update
libgit2to version that supportsreftable. Check iflibgit2main branch already supports reftable. β¬οΈUpdate
gitcompat/src/refs.rsto supportreftablebackend:git refs/git for-each-ref/git show-reffor ref list. Then Sapling uses Git binary which supports reftable. π§gitoxidewhich supports reftable. π¦Alternatively, detect reftable and show clear error with migration hint. π‘
β Workaround For Users
Until fix is available:
Force
filesformat for new repos. Add to~/.gitconfig: π§Migrate existing broken repos: π
This converts
.git/reftable/back to.git/refs/and setsrepositoryformatversion = 0.