首页 > 解决方案 > 服务器损坏后仅使用本地副本是否可以恢复远程 git 存储库?

问题描述

出于某种原因,远程 git 存储库已损坏并且没有备份,但开发人员机器中有很多本地存储库。每台开发人员机器都有一些他们使用的分支,但任何人都在本地存储库中拥有所有分支检出。

建议使用本地存储库来重建远程存储库吗?

我们尝试将所有本地分支推送到远程存储库中,但是有几个分支在本地没有人。对于这些分支,我们构建了一个 shell 脚本来检查和推送,但我不确定这是否是正确的方法。

这是创建的 shell 脚本:

#!/bin/bash
clear

echo "*****************************************"
echo "Disaster Recovery. "
echo "Script for massive Git checkout and push."
echo "*****************************************"

for i in $(git branch -r)
do 
    find="origin/";
    replace="";
    branch=${i//$find/$replace}

    echo "Init checkout" $branch
    exec git branch -d $branch | git checkout -b $branch --track origin/$branch
    echo "End checkout" $branch 
done; 

echo "Init push -all"
echo exec git push --all
echo "End push -all"

所有分支机构都在恢复,但有些分支机构已经过时了很长时间的差异。在这种情况下,搜索并推送了最新的本地开发者分支。一些分支机构仍然过时,因为没有人拥有最近的本地分支机构

还有其他方法可以在没有 git 服务器备份的情况下重建所有远程 git 存储库吗?感谢您的时间,社区

标签: gitdisaster-recovery

解决方案


假设git branch -r确实显示了所有(或大部分)分支的副本,则推送远程分支的本地副本的命令应该如下所示。这假定“origin”是用户用于远程存储库的名称。如果不是,请在发生的两个地方更改命令origin

git push origin --tags 'refs/remotes/origin/*:refs/heads/*'

现在,您完全有可能没有最新的 repo 副本并且不清楚谁拥有。但是假设远程仓库具有默认设置,即阻止所谓的“非快进”,所有用户都可以安全地运行相同的命令,并且只有当他们拥有比服务器上的新副本时,他们才会更新分支。

--tags确保还将任何标签推送到远程仓库。

如果你已经将分支推送到你的仓库,你可能会得到一些额外的分支。如果你最终弄得一团糟,你可以尝试将远程仓库重命名为其他东西(以备不时之需)并创建一个新的远程仓库并使用我上面的命令重新开始。

您在示例中使用的git branch -d命令完全错误,它们最终会删除您的本地副本,不要那样做!此外,您指定的结帐命令也可能不是一个好方法。除了上述命令之外,您不需要任何其他git push命令来恢复远程存储库。


推荐阅读