How do I re push all branches in Git? (not just local branches)
Answer a question
I need to "re-push" all branches (not just local branches) from my local clone to my origin (github server).
git push --all origin only pushes the branches that I had previously checked out. I want to push all of them, including the ones that I did not check out.
Why do I need to do this? Because someone did a git push -f --mirror and that removed almost all branches from the server (kept only the person's local branches).
Things that I have tried. Disclaimer: On all commands that I would be pushing something to the server I am using --dry-run because I want to see the result first.
git push --all origin. Only pushes branches that I had previously checked out.- Trying with a bare repository:
git clone --bare /path/to/loca/repo /some/path/BareRepoCreate a local bare repository from the local repo.git remote add origin2 https://github.com/xxx/Repo.gitAdding a new remote on the BareRepo to github.git push --all origin2Pushing. Again only pushed branches that I had checked out on the original repository.
- If I checkout a branch that I had never checked out and then run the
push --all originI see this branch on the output (--dry-run). So this is the fallback... checkout hundreds of branches. But I am looking for a better approach.
Any suggestions?
EDIT 1: Just to clarify. I still have my local clone without the removal of branches. This is what I am trying to use to restore the branches.
Answers
If you still have origin/* remote-tracking names in your local repository, you can do this. Warning: it's a bit clumsy. It's probably better to just grab the list of names into a file and edit it, rather than using the grep -v HEAD trick.
git for-each-ref --format='%(refname):refs/heads/%(refname:lstrip=3)' refs/remotes/origin |
grep -v HEAD |
xargs git push origin
(this is really all one line, broken up for posting purpses, though as three lines in sh/bash it should still work too).
The general idea here is to use each of your remote-tracking refs/remotes/origin/* references to obtain a hash ID to send to the Git at origin, asking it to create or update its correspondingly-named branch.
Some very old versions of Git won't have the fancy %(refname:lstrip=3) handling, so it's a good idea to run just the:
git for-each-ref --format='%(refname):refs/heads/%(refname:lstrip=3)' refs/remotes/origin
part by itself first and verify that it produces the output one would expect, e.g.:
refs/remotes/origin/HEAD:refs/heads/HEAD
refs/remotes/origin/maint:refs/heads/maint
refs/remotes/origin/master:refs/heads/master
refs/remotes/origin/next:refs/heads/next
refs/remotes/origin/pu:refs/heads/pu
refs/remotes/origin/todo:refs/heads/todo
for my Git clone of the Git repository for Git. Note the extra HEAD line, which is why we use grep -v HEAD, which is clumsy as it will toss a branch name such as SHEADWICK, should you have such a name.
更多推荐


所有评论(0)