! [remote rejected] errors after mirroring a git repository
instead of
git clone --mirror
use
git clone --bare
instructions
As mentioned in this issue, that happens when you mirror a GitHub repo which has pull requests made to it.
The refs beginning '
refs/pull
' are synthetic read-only refs created by GitHub - you can't update (and therefore 'clean') them, because they reflect branches that may well actually come from other repositories - ones that submitted pull-requests to you.So, while you've pushed all your real refs, the pull requests don't get updated
You would need to mirror a GitHub repo without their pull requests.
Simply replace the catch-all refspec above with two more specific specs to just include all heads and tags, but not the pulls, and all the remote pull refs will no longer make it into your bare mirror:
fetch = +refs/heads/*:refs/heads/*
fetch = +refs/tags/*:refs/tags/*
fetch = +refs/change/*:refs/change/*
If push still fails, as commented by Ofek Shilon, add the push entries:
push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
push = +refs/change/*:refs/change/*
As mention in Git Refspec:
The
+
tells Git to update the reference even if it isn’t a fast-forward.
Full steps:
git clone --bare https://github.com/exampleuser/old-repository.git
cd old-repository
git push --mirror https://github.com/exampleuser/new-repository.git
Found working and simple solutions there https://www.metaltoad.com/blog/git-push-all-branches-new-remote
git push newremote refs/remotes/oldremote/*:refs/heads/*
or
git push newremote refs/remotes/oldremote/features/*:refs/heads/features/*