Description
Summary
Tried to clone and submodule-update repo where some submodules point to detached commits; got "object not found" error; could not find any configuration option in git2-rs that would help.
Expected to work with default settings, since it works fine in git command line.
Details
I have a program built using git2-rs, and am trying to run it on the repo https://github.com/Cork-Technology/Depeg-swap .
This repo is interesting in that two of its submodules point to commits which are not in any branch in the target repo, namely Uniswap/v2-core@89b08b5 and Uniswap/v2-periphery@6820d8b .
Submodule::update fails when running on these submodules.
Simplified code:
info!("Cloning repo");
let path = Path::new("/some/tmp/path");
let mut repo = git2::build::RepoBuilder::new();
repo.clone("https://github.com/Cork-Technology/Depeg-swap", path)?;
let local_repo = git2::Repository::open(path)?;
for mut submodule in local_repo.submodules()? {
info!("Updating submodule: {:?}", submodule.name());
let mut update_opts = git2::SubmoduleUpdateOptions::new();
update_opts.allow_fetch(true);
match submodule.update(true, Some(&mut update_opts)) {
Ok(_) => (),
Err(e) => warn!("Failed to update submodule: {:?}", e),
}
}
Output (error lines bolded):
T08:15:59.175948Z INFO myprogram Cloning repo
2025-05-27T08:16:01.035119Z INFO myprogram: Updating submodule: Some("lib/BokkyPooBahsDateTimeLibrary")
2025-05-27T08:16:01.931884Z INFO myprogram: Updating submodule: Some("lib/Cork-Hook")
2025-05-27T08:16:02.528602Z INFO myprogram: Updating submodule: Some("lib/forge-std")
2025-05-27T08:16:03.243375Z INFO myprogram: Updating submodule: Some("lib/openzeppelin-contracts")
2025-05-27T08:16:19.119010Z INFO myprogram: Updating submodule: Some("lib/openzeppelin-contracts-upgradeable")
2025-05-27T08:16:31.146724Z INFO myprogram: Updating submodule: Some("lib/openzeppelin-foundry-upgrades")
2025-05-27T08:16:31.903167Z INFO myprogram: Updating submodule: Some("lib/permit2")
2025-05-27T08:16:33.215988Z INFO myprogram: Updating submodule: Some("lib/prb-math")
2025-05-27T08:16:35.373183Z INFO myprogram: Updating submodule: Some("lib/v2-core")
**2025-05-27T08:16:36.121215Z WARN myprogram: Failed to update submodule: Error { code: -3, klass: 9, message: "object not found - no match for id (89b08b5b8deac65f7bea81c5eea2183e31dc5dad)" }**
2025-05-27T08:16:36.121263Z INFO myprogram: Updating submodule: Some("lib/v2-periphery")
**2025-05-27T08:16:36.954935Z WARN myprogram: Failed to update submodule: Error { code: -3, klass: 9, message: "object not found - no match for id (6820d8be7e111cbda3358226cc3a13489b6a625e)" }**
I have scoured the docs and source of git2-rs looking for options that could potentially allow this operation to succeed. The only one I found is allow_fetch, which is already on. I tried looking through libgit2 as well, though I did not get very far.
Running git submodule update
from the command line works without a hitch, so it seems sensible to hope that this would work with default settings. Interestingly, when cloning the v2-core and v2-periphery repositories directly, I am not able to checkout the respective revisions (89b08b and 6820d8be7e) without first doing a git fetch origin.
Anyway,
Ask
Either
- There is a way to make this work with git2-rs that I did not find, or
- This is a missing configuration option in git2-rs, or
- This is a missing configuration option in libgit2, or
- It should just work; this is a bug in either git2-rs or libgit2
Which one is it?
And if it's (1), I would really appreciate some help making this work.