我需要从本地克隆到源(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-run)。所以这是后备...结帐数百个分支。但我正在寻找更好的方法。有什么建议吗?
EDIT 1:只是为了澄清。我仍然有我的本地克隆,没有删除分支。这就是我要用来还原分支的内容。
如果本地存储库中仍然有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
的分支名称。
您实际上只需要这些命令即可推送所有存储库:
git clone --bare /path/to/loca/repo /some/path/BareRepo
cd /some/path/BareRepo.git
git push --mirror https://github.com/xxx/Repo.git
祝你好运!