首页 > 解决方案 > 从本地恢复远程存储库上的所有 git 分支

问题描述

我有一个本地 git 存储库,其中包含从项目开始时的代码。但是远程存储库被完全删除(所有分支和提交历史都消失了)。

有没有办法恢复远程存储库上的所有分支(和提交历史记录)?

标签: gitgithub

解决方案


恢复丢失远程的方法取决于您是推送到新的空存储库,还是从您自己的副本中克隆。

推送到新的空存储库

首先,在服务器上创建存储库(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.gitin的裸克隆server/path/to。您可能希望origin通过执行以下操作删除新克隆:

cd repo.git
git remote remove origin

因为大概您永远不想重新镜像您刚刚克隆的存储库。


推荐阅读