如何重新推送 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
因为我想先看到结果。
git push --all origin
。只推送我之前签出的分支。
- 尝试使用裸存储库:
git clone --bare /path/to/loca/repo /some/path/BareRepo
从本地仓库创建本地裸仓库。
git remote add origin2 https://github.com/xxx/Repo.git
在 BareRepo 上添加一个新的遥控器到 github。
git push --all origin2
推。再次只推送我在原始存储库中检出的分支。
- 如果我检出一个我从未检出过的分支,然后 运行
push --all origin
我会在输出中看到这个分支 (--dry-运行)。所以这是后备……检查数百个分支机构。但我正在寻找更好的方法。
有什么建议吗?
编辑 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
,如果你有这样的名称。
我需要 "re-push" 从我的本地克隆到我的源(github 服务器)的所有分支(不仅仅是本地分支)。
git push --all origin
只推送我之前签出的分支。我要全部推送,包括我没有签出的。
为什么我需要这样做?因为有人做了 git push -f --mirror
并且从服务器中删除了几乎所有分支(只保留了该人的本地分支)。
我尝试过的东西。 免责声明:在所有我将向我正在使用的服务器推送内容的命令中,--dry-run
因为我想先看到结果。
git push --all origin
。只推送我之前签出的分支。- 尝试使用裸存储库:
git clone --bare /path/to/loca/repo /some/path/BareRepo
从本地仓库创建本地裸仓库。git remote add origin2 https://github.com/xxx/Repo.git
在 BareRepo 上添加一个新的遥控器到 github。git push --all origin2
推。再次只推送我在原始存储库中检出的分支。
- 如果我检出一个我从未检出过的分支,然后 运行
push --all origin
我会在输出中看到这个分支 (--dry-运行)。所以这是后备……检查数百个分支机构。但我正在寻找更好的方法。
有什么建议吗?
编辑 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
,如果你有这样的名称。