从本地还原远程存储库上的所有git分支

时间:2018-07-27 22:20:18

标签: git github

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

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

1 个答案:

答案 0 :(得分:1)

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

要推送到新的空存储库

首先,在服务器上创建存储库(git init --bare和所需的任何其他设置)。确保您具有对该服务器的推送访问权限。您可以通过以下方式添加其网址:

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中创建一个名为server/path/to的裸克隆。您可能需要执行以下操作来删除新克隆的origin

cd repo.git
git remote remove origin

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