-
-
Notifications
You must be signed in to change notification settings - Fork 361
Description
Current behavior 😯
In cargo-generate/cargo-generate#1460 we try to get away from git2
and migrate to gix
. It looks all promising so far, only one thing does not work. It is checking out a specific branch, tag or revision.
What gix does, (see the code https://github.com/cargo-generate/cargo-generate/pull/1460/files#diff-dbcccd0cf247f619f177ddeb85fe8dfc4eb4c71c0de0bb47ec839764c7d4918dR82) it checks out the default branch (in our test case it is main
).
Expected behavior 🤔
when we configure the prepare_clone
with the refsepc like in https://github.com/cargo-generate/cargo-generate/pull/1460/files#diff-dbcccd0cf247f619f177ddeb85fe8dfc4eb4c71c0de0bb47ec839764c7d4918dR72
or here the excerpt:
let (mut prepare_checkout, _) = if let Some(branch) = self.branch {
let mut opts = Options::default();
let ref_spec = gix::refspec::parse(branch.as_str().into(), Operation::Fetch).unwrap();
dbg!(ref_spec);
opts.extra_refspecs.push(ref_spec.to_owned());
prepare_clone.with_fetch_options(opts)
Then I would expect that calling
let (repo, _) = prepare_checkout
.main_worktree(gix::progress::Discard, &gix::interrupt::IS_INTERRUPTED)?;
would check out the specific branch, tag or revision.
Git behavior
git2 has a .checkout_tree
that does behave exactly as described above
here is some sample code: https://github.com/cargo-generate/cargo-generate/blob/0e9471d4991764270de8940c7695d13f932c086b/src/git/clone_tool.rs#L183
Steps to reproduce 🕹
- in cargo-generate you can checkout the PR The kstring integration in gix-attributes is unsound #1460 (
gh pr checkout 1460
) - let the tests run simply
cargo test
- all failing tests (2) relate to this problem
gix::tests::test_cloning_a_repo_at_revision
gix::tests::test_cloning_a_repo_with_a_specific_branch
Activity
Byron commentedon Apr 5, 2025
Thanks for reporting.
gitoxide
doesn't have a way to checkout a branch yet akin togit2_repo.checkout_*()
, and the choice of ref to checkout after cloning is definitely specified differently.gix clone --ref <name> …
is able to clone and checkout a specific branch. I recommend looking at the source to see how this is specified - it should work for you.Please do feel free to post your findings here, maybe they are useful for others as well.
osoriano commentedon Jun 8, 2025
I'm migrating a project from
go
torust
which is supposed to fetch and checkout a single commit sha for a CI build.Originally, I thought it would work after seeing #1403, but I ran into this error
For now I'll continue to use the
go
code (example go usage and resolved issue), but looking forward to revisit this and migrate to Rust! 🦀Byron commentedon Jun 9, 2025
It looks like this can easily be reproduced by providing an object hash as reference:
It looks like this should be prevented to not run into this assertion, or one could try to actually make this work. Then it feels like
--ref
should be renamed to something that more officially allows object hashes (both in the CLI and in the API).