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

问题描述 投票:0回答:2

我需要从本地克隆到源(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:只是为了澄清。我仍然有我的本地克隆,没有删除分支。这就是我要用来还原分支的内容。

git github git-push
2个回答
2
投票

如果本地存储库中仍然有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的分支名称。


0
投票

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

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

祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.