git - 服务器损坏后仅使用本地副本是否可以恢复远程 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 存储库吗?感谢您的时间,社区
解决方案
假设git branch -r
确实显示了所有(或大部分)分支的副本,则推送远程分支的本地副本的命令应该如下所示。这假定“origin”是用户用于远程存储库的名称。如果不是,请在发生的两个地方更改命令origin
。
git push origin --tags 'refs/remotes/origin/*:refs/heads/*'
现在,您完全有可能没有最新的 repo 副本并且不清楚谁拥有。但是假设远程仓库具有默认设置,即阻止所谓的“非快进”,所有用户都可以安全地运行相同的命令,并且只有当他们拥有比服务器上的新副本时,他们才会更新分支。
--tags
确保还将任何标签推送到远程仓库。
如果你已经将分支推送到你的仓库,你可能会得到一些额外的分支。如果你最终弄得一团糟,你可以尝试将远程仓库重命名为其他东西(以备不时之需)并创建一个新的远程仓库并使用我上面的命令重新开始。
您在示例中使用的git branch -d
命令完全错误,它们最终会删除您的本地副本,不要那样做!此外,您指定的结帐命令也可能不是一个好方法。除了上述命令之外,您不需要任何其他git push
命令来恢复远程存储库。
推荐阅读
- javascript - JavaScript:有条件的按钮创建和删除
- mysql - mysql 使用内部连接和 max() 将两个表插入到一个表中
- jquery - 未捕获的类型错误 - fadeToggle/Display, Jquery(它有效但仍然抛出错误)
- arrays - 将数据框中的分隔值拆分为 R 中的多维数组
- python - 计算引擎的服务帐户没有足够的云视觉 api 范围
- powershell - Powershell、Outlook隐藏邮箱管理。
- python - 子进程失效,`communicate()` 挂起
- python - 使用 sklearn 的 accuracy_score 函数输入错误
- javascript - JavaScript Promise.all - 如何检查解析状态?
- java - InvalidKeyException:从 Java 中的 PEM 文件中读取 EC 私钥时,密钥格式无效