git - 从本地恢复远程存储库上的所有 git 分支
问题描述
我有一个本地 git 存储库,其中包含从项目开始时的代码。但是远程存储库被完全删除(所有分支和提交历史都消失了)。
有没有办法恢复远程存储库上的所有分支(和提交历史记录)?
解决方案
恢复丢失远程的方法取决于您是推送到新的空存储库,还是从您自己的副本中克隆。
推送到新的空存储库
首先,在服务器上创建存储库(git init --bare
以及所需的任何其他设置)。确保您具有对该服务器的推送访问权限。您可以通过以下方式添加其 URL,例如:
git remote add new-server ssh://user@host/path/to/repo.git
假设您将使用 ssh 推送。如果通过 https 推送,请进行明显的调整。
此时您可以运行:
git push --tags new-server 'refs/remotes/origin/**:refs/heads/*'
这会推送原始远程的所有远程跟踪名称,origin
并将它们创建为 上的分支名称new-server
。如果您的遥控器未命名为 origin,请进行明显的替换。--tags
也推送所有标签。
克隆到新存储库
为了准备本地存储库以使其适合用作克隆,我们将要创建一个与每个远程跟踪名称相对应的本地分支名称。我将在这里假设每个远程跟踪名称都命名为origin/whatever
; 如果不是,origin
请用适当的字符串替换。
去做这个:
git for-each-ref --format='%(refname)' refs/remotes/origin |
while read rref; do
lref=${rref#refs/remotes/origin/} # strip the boilerplate
[ "$lref" = HEAD ] && continue # skip origin/HEAD
git branch $lref $rref ||
echo "WARNING: did not create $lref, make sure that's OK"
done
这可能会打印至少一个警告,关于无法创建master
. 对于每个警告(您拥有的每个本地分支都已经对应于远程跟踪名称),请确保分支是最新的或在远程跟踪名称之前。
现在确保可以通过您打算使用的任何 URL 访问客户端,然后在服务器上运行:
cd server/path/to
git clone --mirror --bare ssh://user@host/client/path/to/repo.git
这将创建一个名为repo.git
in的裸克隆server/path/to
。您可能希望origin
通过执行以下操作删除新克隆:
cd repo.git
git remote remove origin
因为大概您永远不想重新镜像您刚刚克隆的存储库。
推荐阅读
- python - 在 s3 上处理丢失文件的有效方法
- visual-studio - devenv /upgrade 通过本地 powershell 命令工作,但在 gitlab 作业中失败
- php - Laravel 7:使用 API 端点 + 单页应用程序验证电子邮件
- sql - 获取具有两个日期列的所有行,其中日期在指定间隔内或之间
- flutter - Flutter/Dart- 在 null 上调用了方法“replaceAll”。如何检查字符串是否存在?
- javascript - 我怎样才能延迟表单操作?
- swift - 观察者和图像获取无法按预期工作
- html - 我可以在 html 中做正则表达式来匹配 css 和 js 吗?
- sql - 如果前两列的答案匹配,则创建一个返回“是”的列
- javascript - 如何移动我的 h3 元素以与 span 元素垂直对齐?