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

In Git, my origin was lost, how do I convert a working copy to a new origin?

我有一个开发主机 pats1,它在主机的目录中有一个 GIT 回购协议:

~pats/gitrepos/myrepo.git 

当我在其他主机上进行开发时,该存储库包含一些我克隆到其他机器(比如 host1 和 host2)的个人脚本和开发工具。我只是使用 ssh 来克隆和推送更新;没有 git 集线器或 "real server" 正在使用。

我的 pats1 盒子坏了(硬盘 VM 被清除),我想知道要采取什么步骤来使用现有副本中的数据来设置新的替换存储库。

我想知道要采取哪些步骤来转换 host1 或 host2 上 myrepo 的工作 git 副本之一并设置 pats2: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) 选择其中一台主机创建新的 "central server (pats2)". 一台主机比另一台好用吗?

对于这个例子,我将选择 host1

(2) 确保 host1 上的 repo 包含您要复制的所有内容。

这个 post Atlassian Developer Tip of Week - Copying a full git repo 以正确的方式做这件事 我想确保本地仓库有 的所有分支=93=] 已签出,以便在克隆回购协议时存在分支。

好吧,由于我的原始主机 (pats1) 不可用,我可能有一些对未在本地存储库中签出的远程分支的引用。 我相信当我使用 git clone --mirror 根据我阅读但找不到文章的 link 进行复制时,它会自动清理。

所以对于这一步,我坚持使用我在 host1 上的回购协议中的内容,这对我来说很好,因为我只有一个主分支。 :-)

这篇文章 how-to-properly-mirror-a-git-repository 说我也应该使用以下方法删除不存在的引用:

git fetch --prune

注意:我尝试时失败了,因为它无法访问源。

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

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

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

Also git clone --mirror is prefered over git clone --bare because the former also clones git notes and some other attributes.

(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 很大,我可能想 tar 压缩和 untar 以最小化网络带宽,例如 tar czf - myrepo.git | mbuffer -s 1K -m 512 | ssh otherhost "cd gitrepos; tar zxf -"

(5) 将拥有 myrepo 工作副本的现有主机指向新的 repo 位置(在 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).

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

你的脚步看起来不错。

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

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

这将更改与 origin 关联的 URL。