在Git中,我的源代码丢失,如何将工作副本转换为新的源代码?

在Git中,我的源代码丢失,如何将工作副本转换为新的源代码?,git,copy,mirror,Git,Copy,Mirror,我有一个开发主机pats1,该主机上的目录中有一个GIT repo: ~pats/gitrepos/myrepo.git repo保存了一些个人脚本和开发工具,当我在其他主机上进行开发时,我会将它们克隆到其他框(比如host1和host2)。我只是使用ssh来克隆和推送更新;没有使用github或“真正的服务器” 我的pats1盒子死了(硬盘虚拟机被清除了),我想知道应该采取什么步骤通过使用现有副本中的数据来建立新的替换回购协议 我想知道需要采取哪些步骤来转换主机1或主机2上myrepo的一

我有一个开发主机pats1,该主机上的目录中有一个GIT repo:

~pats/gitrepos/myrepo.git 
repo保存了一些个人脚本和开发工具,当我在其他主机上进行开发时,我会将它们克隆到其他框(比如host1和host2)。我只是使用ssh来克隆和推送更新;没有使用github或“真正的服务器”

我的pats1盒子死了(硬盘虚拟机被清除了),我想知道应该采取什么步骤通过使用现有副本中的数据来建立新的替换回购协议

我想知道需要采取哪些步骤来转换主机1或主机2上myrepo的一个工作git副本,并将pats2:gitrepos/myrepo.git设置为新的中央服务器,并将现有的工作Repo(主机1和主机2上)指向新服务器。

ssh host1; cd proj
git clone --mirror myrepo myrepo.git
有人提出了类似的问题。其中包括:

给出的一些答案需要旧服务器,这对我来说不是一个选项。以下是我认为需要遵循的步骤:

(1)选择一台主机来创建新的“中央服务器(pats2)”。一台主机比另一台更好使用吗

对于本例,我将选择主机1

(2)确保主机1上的回购协议包含您想要复制的所有内容。

ssh host1; cd proj
git clone --mirror myrepo myrepo.git
这篇文章说要以正确的方式做这件事我想确保本地回购已签出远程/源站的所有分支,这样当回购被克隆时,分支就存在了

嗯,由于我的原始主机(pats1)不可用,我可能有一些未在本地repo中签出的远程分支的引用。 我相信,当我使用git clone复制时,这会自动被清除——镜像基于我读到的东西,但找不到文章的链接

因此,在这一步中,我坚持使用host1上的回购协议中的内容,在我的情况下,这很好,因为我只有一个主分支。:-)

这篇文章说我应该删除不存在的引用,也可以使用:

git fetch --prune
注意:我尝试时失败了,因为它无法访问源

(3)在主机1上创建回购镜像。

ssh host1; cd proj
git clone --mirror myrepo myrepo.git
我用的是镜子,因为上面写着:

此外,git clone(镜像)比git clone(裸)更受欢迎,因为前者还克隆git notes和其他一些属性

(4)将repo.git(repo)复制到我的新服务器(pats2):

ssh pats2 mkdir gitrepos
scp -r myrepo.git pats2:gitrepos/
上面的命令将它放在正确的位置(~pats/gitrepos/myrepo.git),因此将来我可以使用该命令克隆它

git clone pats2:gitrepos/myrepo
注意:例如,如果repo很大,我可能希望使用压缩和untar来最小化网络带宽

(5)将拥有myrepo工作副本的现有主机指向新的repo位置(在pats2上)

我希望其他人觉得这很有用,其他人可以确认我计划做的事情会奏效。

你的步骤看起来不错

在5中,您可以简单地执行以下操作:

cd proj/myrepo
git remote set-url origin pats2:gitrepos/myrepo.git

这将更改与
origin

关联的URL。“origin”只是远程设备的默认名称。感谢@VonC的改进。我更新了我的问题以反映这一点,并选择此作为答案。