如何将GIT存储库从一台服务器迁移到新服务器


263

我有一台要关闭的服务器。我剩下的唯一要迁移的是我的存储库。该服务器被列为我的一个项目的来源(主服务器)。移动存储库以保留历史记录的正确方法是什么?


有关存储库的所有信息(组织,中继等)都存储在名为“ .git”的文件夹中,您将在其中初始化存储库。因此,您需要使用此处
Mansab Uppal 2013年

1
只需git config remote.origin.url newurl参见stackoverflow.com/questions/3011402/…–
Niels

1
如果您想迁移您的仓库,并且所有分支机构都使用jzwiener或Roberto的答案,而不是接受的答案。
jonaglon

Answers:


246

要添加新的回购位置,

git remote add new_repo_name new_repo_url

然后将内容推送到新位置

git push new_repo_name master

最后删除旧的

git remote rm origin

之后,您可以执行bdonlan所说的操作,然后编辑.git / config文件以将new_repo_name更改为origin。如果您不删除原始资源(原始远程存储库),则只需使用以下命令将更改推送到新存储库即可

git push new_repo_name master

8
这只会将单个分支从旧存储库复制到新分支吗?
安德鲁·格林

34
迁移所有分支机构的解决方案是什么?
emmby 2012年

49
您应该可以通过一次推送所有分支git push -u new_repo_name --all
rmarscher 2013年

10
所有分支的迁移都可以在stackoverflow.com/a/18336145/923599中
jzwiener 2013年

10
这个命令对我git remote rename new_repo_name origin
有用

210

如果要迁移所有分支和标记,则应使用以下命令:

git clone --mirror [oldUrl]

用所有分支克隆旧仓库

cd the_repo
git remote add remoteName newRepoUrl

设置一个新的遥控器

git push -f --tags remoteName refs/heads/*:refs/heads/*

将所有裁判推到裁判/门下(这可能是您想要的)


5
Git抱怨--tags并与refs/heads/*:refs/heads/*兼容--mirrorstackoverflow.com/a/26552740/1484831运作良好。
2014年

3
我用了它,对我有用。大概应该是当选的答案。请注意,您在本地获取的“代码”似乎占用了大量元数据,这使得新手不清楚出现了什么问题。
尼克

3
这应该是批准的答案。比其他解决方案好得多
Travis Griggs 2015年

15
我最终将新远程存储库中的所有分支都前缀为refs/heads/refs/headsgit push -f --tags remoteName refs/heads/*:refs/heads/*所以我换成了git push remoteName --mirror
dumbledad

1
push也支持--mirrorgit clone --mirror; cd repo; git push --mirror new_remote应该可以解决问题
knittl

143

完美地为我工作。

git clone --mirror <URL to my OLD repo location>
cd <New directory where your OLD repo was cloned>
git remote set-url origin <URL to my NEW repo location>
git push -f origin

我必须提到,这会创建您当前回购的镜像,然后将其推送到新位置。因此,对于大型存储库或缓慢的连接,这可能需要一些时间


15
***这一个***
保罗·洛克伍德

1
这是一个很好的解决方案git remote set-url origin <URL到我的新仓库位置(将旧的资源同步到新的服务器/位置之后)
Toni Homedes i Saun

2
这个锅好极了。不会混淆多个遥控器
TaoPR

16
身高git push --mirror origin超过-f
Aidiakapi

78

复制过来。真的就是这么简单。:)

在客户端,只需在客户端的本地存储库中编辑.git / config即可根据需要将您的遥控器指向新的URL。


6
您也可以简单地克隆它。另外,可以直接使用git remote rm origin来代替直接编辑.git / config文件。git remote add origin <新存储库>。
ebneter

4
远程管理将丢失配置该部分下的任何配置-如果不采取任何额外步骤对其进行克隆将丢失除中继以外的其他分支。可以解决这些问题,但实际上-只需同步它即可。
bdonlan

1
仅使用git进行工作的解决方案是什么?rsync需要额外的难以克服的管理方面
emmby 2012年

2
这也保留了例如钩子和其他配置,因此我更喜欢纯git解决方案
mnagel

65

这是在其他一些答案中分部分完成的。

git clone --mirror git@oldserver:oldproject.git
cd oldproject.git
git remote add new git@newserver:newproject.git
git push --mirror new

6
实际上,这是最完整,直接的答案。
劳伦斯·多尔

3
--mirror推动中非常重要:这应该是正确的答案
PaoloC

当您在新服务器上初始化新存储库时,请记住执行裸初始化,否则推送将不会成功:git init --bare
marco

35

我只是按照简单的说明列表重新发布其他人说的话。

  1. 移动存储库:只需登录到新服务器,cd现在要保存存储库的父目录,然后用于rsync从旧服务器复制:

    new.server> rsync -a -v -e ssh user@old.server.com:path/to/repository.git .
    
  2. 让客户端指向新的存储库:现在,在使用该存储库的每个客户端上,只需删除指向旧源的指针,然后将指针添加到新的指针即可。

    client> git remote rm origin
    client> git remote add origin user@new.server.com:path/to/repository.git
    

简单有效。如果要限制服务器之间的流量,可以添加标志--bwlimit = XXX,其中XXX等于每秒的带宽(以KB为单位)。
Greg Glockner 2014年

7
比删除和添加更好:git remote set-url origin user@new.server.com:path/to/repository.git
Chris KL 2014年

对于那些使用git + capistrano部署到服务器的服务器,请注意,我必须在两个位置使用set-url origin:在localhost和服务器上的缓存副本上。
anandvc '16


10

我按照BitBucket上的说明将存储库及其所有分支移到那里。以下是有关该#字符的说明步骤:

cd path/to/local/repo
git remote remove origin # to get rid of the old setting, this was not in the BitBucket instructions
git remote add origin ssh://git@bitbucket.org/<username>/<newrepo> # modify URL as needed
git push -u origin --all # pushes _ALL_ branches in one go
git push -u origin --tags # pushes _ALL_ tags in one go

对我来说很好。


8

请按照以下步骤操作:

  • git remote add new-origin
  • git push-所有新起点
  • git push-标记新来源
  • git remote rm起源
  • git remote重命名新起点

5

这是此答案的一种变体,目前由gitlab建议将git存储库从一台服务器“迁移”到另一台服务器。

  1. 让我们假设您的旧项目名为existing_repo,存储在一个existing_repo文件夹中。

  2. 在新服务器上创建一个仓库。我们将假定该新项目的网址为git@newserver:newproject.git

  3. 打开命令行界面,然后输入以下内容:

    cd existing_repo
    git remote rename origin old-origin
    git remote add origin git@newserver:newproject.git
    git push -u origin --all
    git push -u origin --tags
    

这种方法的好处是您不会删除与旧服务器相对应的分支。


4

您可以使用以下命令:

git remote set-url --push origin new_repo_url

来自http://gitref.org/remotes/的示例

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/github/git-reference.git (push)
$ git remote set-url --push origin git://github.com/pjhyett/hw.git
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)

4

应该很简单:

git remote set-url origin git://new.url.here

这样,您可以origin为新存储库保留名称-然后将旧存储库推送到新存储库,如其他答案中所述。假设您一个人工作,并且有一个本地仓库,您想在其中镜像所有残骸,那么(在本地仓库内)您也可以

git push origin --mirror # origin points to your new repo

但是请参阅“ git push --mirror”是否足以备份我的存储库?--mirror总计一次不使用)。


3

请遵循以下说明,如果要保留所有提交和分支从旧到新的仓库

git clone --bare <old-repo-url>
cd <old-repo-directory>
git push --mirror <new-repo-url>

1

您可以使用git-copy复制所有历史记录的仓库。

git copy http://a.com/old.git http://a.com/new.git

1

如果要从一个原点移动到另一个原点,并且还要在本地计算机上保留当前原点的备份,则可以使用以下步骤:

  1. 首先在本地转到要移动的(git)文件夹
  2. 在线创建新的存储库此步骤创建一个存储库,我们可以在其中将代码推送到

现在在文件夹中

git remote get-url origin

上面的命令提供了当前的远程源URL,在最后一步中将源设置回

git remote set-url origin git@github.newlocation:folder/newrepo.git

上面的命令将远程原点设置为新位置

git push --set-upstream origin develop

上面的命令将当前活动的本地分支推送到具有branchname开发的远程。当然,它会保留所有历史记录,因为使用git还会推送所有历史记录。

git remote set-url origin <original old origin>

上面的命令将远程原点设置回当前原点:您需要这样做,因为您位于现有文件夹中,并且可能不希望将当前的本地文件夹名称与要创建的用于克隆存储库的新文件夹混合使用你只是推到。

希望这可以帮助,


0

如果要将#git存储库从一台服务器迁移到新服务器,可以这样进行:

git clone OLD_REPOSITORY_PATH
cd OLD_REPOSITORY_DIR
git remote add NEW_REPOSITORY_ALIAS  NEW_REPOSITORY_PATH
#check out all remote branches 
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done
git push --mirror NEW_REPOSITORY_PATH
git push NEW_REPOSITORY_ALIAS --tags

旧存储库中的所有远程分支和标签都将复制到新存储库中。

单独运行此命令:

git push NEW_REPOSITORY_ALIAS

只会将主分支(仅跟踪分支)复制到新存储库。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.