如何从本地仓库恢复意外删除的远程 Git 仓库

10
我已经做了以下操作:
(1) 克隆一个远程 git 仓库到本地主机
本地# git clone http://www.foo.com foo (2) 添加一个在 ssh 主机 (bar) 上的另一个项目作为第二个远程仓库
本地# git remote add bar ssh://bar/home/project 本地# git fetch bar (3) 在 ssh 主机 (bar) 上做了一些傻事:
bar# rm -rf /home/project 请问我该如何从我的本地副本恢复 ssh 主机 (bar) 上的项目,以便其他开发人员可以继续他们的工作,并且我可以运行 'git fetch bar' 来获取他们的提交,就像我没有对他们的 ssh 主机做错任何事情一样,即撤销我对主机 bar 所做的所有更改。非常感谢。
更新:
bar# mkdir -p /home/project && cd /home/project && git init --bare 本地# git branch remote show bar 本地# git push bar bar/master:refs/heads/master 本地# git push bar bar/branch1:refs/heads/branch1 本地# git push bar bar/branch2:refs/heads/branch2

如果您已经解决了问题,请将命令放在新回答中。 - Mike Weller
3个回答

8
你可以将远程主机设置为新的git仓库,然后将其推送到远程仓库。以下链接介绍了如何进行操作:Toolman Tim - 设置新的远程git仓库。假设你仍然将bar设置为远程仓库,则操作实质上是这样的:
ssh bar "mkdir -p /home/project && cd /home/project && git --init bare"
git push bar refspec

refspec 经常只是本地存储库中分支的简单名称,因此:

git push bar master

请参阅git push手册,了解符合refspec标准的详细信息。其中EXAMPLES部分对于理解更高级的respecs非常有帮助。

谢谢,但我无法使其工作:local#ssh bar“mkdir -p /home/project && cd /home/project && git init --bare”local#git push bar没有共同的参考和未指定的参考; 什么也没做。也许您应该指定一个分支,例如'master'。致命错误:远程端意外挂断错误:无法将一些引用推送到'ssh://bar/home/project' - yoda
这就是我引用该博客的原因,该博客深入阐述并使用了“本质上”的词语。我将使我的代码示例更明确,以便使答案完整。 - Mark Carey

4

取代这些中的一个:

$ git push bar bar/branchX:refs/heads/branchX

对于本地引用的每个分支。尝试这个。

$ git push bar refs/remotes/bar/*:refs/heads/*

以上命令应该将你本地缓存的所有远程引用推回到远程并放在正确的位置。

注意,你还需要推送任何可能存在的标签:

$ git push --tags bar

此外,在进行推送之前了解将要发生的事情也有所帮助:
$ git push --dry-run ...(rest of push cmd)  

注意:我在大多数人会使用“origin”的地方使用了“bar” - 请用您的远程名称替换。


1

跟随Mark Carey的回答,我已经部分恢复了被删除的存储库,如下所示:

bar# mkdir -p /home/project && cd /home/project && git init --bare

local# git branch remote show bar

local# git push bar bar/master:refs/heads/master

local# git push bar bar/branch1:refs/heads/branch1

local# git push bar bar/branch2:refs/heads/branch2

更新:

如何在git中备份私有分支


请遵循Mark Carey的回答...如果我的回答是“正确”的答案,那么将其授予“答案”状态不是合适的吗。 - Mark Carey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接