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

问题描述:

我有了一个GIT回购在主机上的目录开发主机pats1:在Git中,我的起源丢失了,如何将工作副本转换为新的起源?

~pats/gitrepos/myrepo.git 

回购持有一些自己编写的脚本和开发工具,我克隆到其他盒子(说host1和host2),当我在其他主机上进行开发。我只是使用ssh克隆和推送更新;没有使用github或“真正的服务器”。

我pats1箱死亡(硬盘VM被歼灭),我想知道采取什么步骤来获得新的替换回购通过从现有数据复制设置。

我想知道采取什么步骤来转换在host1或host2上设置一个pats2 myrepo的工作git的副本之一:gitrepos/myrepo.git成为新的*服务器,并指出现有的工作回购(在host1和host2上)到新服务器。

类似这样的问题已经被问。有些是:

How to migrate GIT repository from one server to a new one

Convert a normal repo to a bare one

给出一些答案需要旧服务器是围绕这不是我的选择。以下是我认为需要遵循的步骤:

(1)选择其中一台主机以创建新的“*服务器(pats2)”。一个主机比另一个更好用吗?

对于此示例,我将选择host1

(2)确保在host1回购包含要复制的一切。

这篇文章Atlassian Developer Tip of Week - Copying a full git repo说要做到这一点,我想,以确保本地回购了所有的远程分支的正道 /产地签出,这样,当回购克隆,树枝都存在。

好吧,既然我的原始主机(pats1)不可用,我有可能未在当地的回购签出远程分支提供一些参考。 我相信当我复制使用基于什么我读,但无法找到的文章链接克隆的git这--mirror将自动清理。

因此,对于这一步,我坚持我在回购host1的东西,在我的情况是好的,因为我只有一个主分支。 :-)

本文how-to-properly-mirror-a-git-repository说我应该删除使用不存在的引用以及:

git fetch --prune 

注:此失败时,我试了一下,因为它无法访问源。

(3)在host1上创建回购的镜像。

ssh host1; cd proj 
git clone --mirror myrepo myrepo.git 

我用--mirror因为How to properly mirror a git repository说:

而且混帐克隆--mirror是首选过了Git克隆--bare因为前者还克隆git的笔记和一些其他属性。

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

ssh pats2 mkdir gitrepos 
scp -r myrepo.git pats2:gitrepos/ 

上面的命令将其放在正确的位置(〜PATS/gitrepos/myrepo git的),所以在未来我可以使用以下命令

git clone pats2:gitrepos/myrepo 

注克隆它:如果回购是大我可能要压缩和解压,以尽量减少网络带宽的焦油,例如tar czf - myrepo.git | mbuffer -s 1K -m 512 | ssh otherhost "cd gitrepos; tar zxf -"

(5)点都指向新的回购位置myrepo的工作副本(上pats2)的现有主机

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

Repeat above command for all hosts that were using the old "central1" host (pats1). 

我希望别人发现这个有用的和其他人可以确认我打算做的事情会奏效。

+0

“origin”只是* remote *的默认名称。 –

你的步骤似乎很好。

在5,你可以简单地做:

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

这将改变与origin相关的URL。

+0

感谢@VonC的改进。我已经更新了我的问题以反映这一点,并选择此作为答案。 – PatS