git2-rs icon indicating copy to clipboard operation
git2-rs copied to clipboard

git2rs equivalent to "git push --mirror remote"

Open akxhw1996 opened this issue 10 months ago • 0 comments

Hi, I am making a tool to mirror my repo from one git hosting platform to github. What I want to do is using git2rs to achieve:

  1. git clone --bare https://platfrom.repo.git
  2. cd to the cloned repo
  3. git push --mirror https://github.repo.git

Step 1 and 2 are successful, but I am not able to implement step 3. Can anyone tell me what is the git2rs equivalent to step 3?

I tried the following appoach:

  • query all refs of local repo and push to remote, the issue is that the deleted tags/branches are not pushed
  • do not specify refs, set the config for remote as mirror, nothing is pushed after the program runs
pub fn push_mirror(repo_path: &PathBuf, remote_url: &str) -> Result<(), git2::Error> {
    let repo = Repository::open(repo_path)?;

    if repo.find_remote("mirror").is_ok() {
        repo.remote_delete("mirror")?;
    }

    let mut remote = repo.remote_with_fetch("mirror", remote_url, "+refs/*:refs/*")?;

    let mut config = repo.config()?;
    config.set_bool("remote.mirror.mirror", true)?;

    let mut push_opts = PushOptions::new();
    remote.push(&[] as &[&str], Some(&mut push_opts))?;

    Ok(())
}

akxhw1996 avatar Dec 03 '24 10:12 akxhw1996