将一个git仓库迁移到另一台服务器

3

我在开发服务器上有一个git克隆/仓库,但现在要迁移到另一个服务器。我不想将所有本地分支和更改提交到主存储库中,那么我该如何在新服务器上制作旧服务器上的所有内容的精确副本?

我尝试了oldserver:〜$ scp -rp project newserver:〜/project

但是,当在新服务器上尝试执行任何操作时,我只会得到大量的“typechange”错误。

有人提到过x模式,但是在服务器之间移动文件时如何保留它呢?

3个回答

4
如果你需要一个git解决方案,可以尝试使用:
git clone --mirror <oldurl> <newurl>

虽然这只适用于裸仓库。

如果这是非裸仓库,您也可以进行正常的克隆,然后执行以下操作:

git fetch origin
git branch -r | grep '^ *origin/[^ ]*$' |
    while read rb; do git branch --no-track ${rb#*/} $rb; done
git remote rm origin

当然,中间步骤可以用5000种不同的方法完成,但这是其中之一!(请注意,在bash中,管道符后面不需要使用继续行符\ - 它知道它需要更多输入)

最后,如果你想直接复制文件,我建议使用rsync而不是scp(可能还要加上-avz选项?)。(这些typechange错误到底是什么?)


我并没有特别偏好如何复制文件,我只是选择使用scp,因为那是我通常使用的。我会看看rsync,或者回来参考你的解决方案。 - Jacob Rask
我仍然很好奇类型更改错误是什么 - 它们是在尝试在新存储库中使用 git 时出现的吗?它们是权限问题吗?新存储库的权限和所有权是否正确? - Cascabel
我运行了 git status 命令,并得到一堆文件被标记为修改: "typechange filename"。我的用户和组具有相同的名称,并且在 newserver 和 oldserver 上,这些文件具有相同的权限。 - Jacob Rask
我现在尝试了rsync,没有出现类型更改错误。然而,我得到的是“无法从工作树历史记录中确定上游SVN信息” - 我使用git-svn... - Jacob Rask
那个错误实际上与我必须更改.git/config中的远程仓库URL有关。我解决了它。你的答案建议使用rsync,这正是我用来解决问题的,谢谢。 - Jacob Rask

1

你也可以尝试简单的笨办法——不必担心类型更改是如何发生的,而是使用重置命令让 Git 来修复它们:

git reset --hard HEAD

只有在以下两种情况下才有意义:(1) 所有问题都涉及已检出的文件(而不是存储库结构本身),并且 (2) 您没有在 newserver 上进行需要保留的更改。

在满足这些注意事项的情况下,当我遇到同样的问题时,它对我起作用了,并且不需要考虑git的内部工作原理或您的文件传输过程如何保留属性。


1

我实际上已经做过这个,我所做的就是先将repo打包成tar文件,然后通过scp传输。我认为scp -rp也可以。

“Typechange”通常指的是符号链接变成文件或反之的情况。这两台服务器运行的是相同的操作系统吗?


是的,两者都在运行Debian Lenny。我会尝试在传输之前将repo打包成tar文件。 - Jacob Rask
这就可以解释为什么使用rsync修复了这个问题,因为它在处理符号链接时更加智能一些。 - Cascabel

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