I'm a solo developer, working in a local Git repository. For backups, I want to send an exact copy of that repository off to another server.
Is it sufficient to do this?
git push --mirror
I'm asking because I can sometimes run this command two or three times before Git tells me "Everything up-to-date", so apparently it's not an exact mirror. It seems to be re-pushing tracking branches...?
$ git push --mirror Counting objects: 42, done. Delta compression using up to 8 threads. Compressing objects: 100% (30/30), done. Writing objects: 100% (30/30), 5.09 KiB, done. Total 30 (delta 17), reused 0 (delta 0) To ssh://my/repo/url c094a10..0eedc92 mybranch -> mybranch $ git push --mirror Total 0 (delta 0), reused 0 (delta 0) To ssh://my/repo/url c094a10..0eedc92 origin/mybranch -> origin/mybranch $ git push --mirror Everything up-to-date
What is happening, and is this a good strategy?
Edit: I don't like to use something like git bundle
or .tar.bz2
archives, because I'd like the backup to be an accessible working copy. Since my backup server is connected to the net and always on, this is a nice way to access the repository when I'm on the road.
"--mirror also pushes your remote branches". This only applies to remote branches that you've already fetched/tracked, right? For example, if you just did a git clone , you would only have the master branch, so git push --mirror would only mirror the master branch, and none of the other remote branches.
You first have to get the original Git repository on your machine. Then, go into the repository. Finally, use the --mirror flag to copy everything in your local Git repository into the new repo.
By default, git push only updates the corresponding branch on the remote. So, if you are checked out to the main branch when you execute git push , then only the main branch will be updated. It's always a good idea to use git status to see what branch you are on before pushing to the remote.
The reason you see something pushed the second time is that --mirror
pushes a little more than you expect. Apart from your local branches, it also pushes your remote branches, because mirror implies everything. So when you push normally (or with --mirror
), mybranch
is pushed and origin/mybranch
is updated to reflect the new status on origin. When you push with --mirror
, origin/mybranch
is also pushed.
This results in the strangeness you see, and also in a worse strangeness when you pull from that remote; you would get branches named origin/origin/mybranch
etc. So it's usually best to use --mirror
for one time copies, and just use normal push (maybe with --all
) for normal uses.
To always push all branches and tags, you can update .git/config
like so:
[remote "origin"] url = ... fetch = ... push = +refs/heads/* push = +refs/tags/*
That will make a normal push similar to a mirror, except that it won't delete branches that don't exist at the source or for non-fast-forward updates.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With