如何重新推送 Git 中的所有分支? (不仅是本地分支机构)

How do I re push all branches in Git? (not just local branches)

我需要 "re-push" 从我的本地克隆到我的源(github 服务器)的所有分支(不仅仅是本地分支)。

git push --all origin 只推送我之前签出的分支。我要全部推送,包括我没有签出的。

为什么我需要这样做?因为有人做了 git push -f --mirror 并且从服务器中删除了几乎所有分支(只保留了该人的本地分支)。

我尝试过的东西。 免责声明:在所有我将向我正在使用的服务器推送内容的命令中,--dry-run 因为我想先看到结果。

有什么建议吗?

编辑 1:澄清一下。我仍然有我的本地克隆,没有删除分支。这就是我试图用来恢复分支的东西。

您实际上只需要这些命令来推送所有存储库:

git clone --bare /path/to/loca/repo /some/path/BareRepo
cd /some/path/BareRepo.git
git push --mirror https://github.com/xxx/Repo.git

祝你好运!

如果您的本地存储库中仍有 origin/* 个远程跟踪名称,您可以这样做。警告:它有点笨拙。最好将名称列表抓取到文件中并进行编辑,而不是使用 grep -v HEAD 技巧。

git for-each-ref --format='%(refname):refs/heads/%(refname:lstrip=3)' refs/remotes/origin | 
    grep -v HEAD |
    xargs git push origin

(这实际上是一行,为了发布目的而被分解,尽管在 sh/bash 中作为三行它应该仍然有效)。

这里的总体思路是使用每个远程跟踪 refs/remotes/origin/* 引用来获取哈希 ID 以发送到 origin 的 Git,要求它创建或更新其相应命名的分支。

某些非常旧的 Git 版本不会有花哨的 %(refname:lstrip=3) 处理方式,因此最好 运行 只是:

git for-each-ref --format='%(refname):refs/heads/%(refname:lstrip=3)' refs/remotes/origin

首先将其自身分开并验证它是否产生预期的输出,例如:

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

我的 Git 克隆 Git 存储库 Git。注意额外的 HEAD 行,这就是我们使用 grep -v HEAD 的原因,它很笨拙,因为它会抛出一个分支名称,例如 SHEADWICK,如果你有这样的名称。