迁移Git仓库到新主机是一个常见的任务,特别是在服务器更换、项目迁移或者备份仓库时。正确地迁移Git仓库可以确保代码的安全性和完整性。本文将详细介绍如何轻松地将Git仓库迁移到新主机,并提供一个一键操作的方法,帮助你避免数据丢失。
1. 准备工作
在开始迁移之前,请确保以下准备工作已经完成:
- 新主机已经安装了Git。
- 你有新主机的SSH访问权限。
- 你有原主机和目标主机的SSH密钥对。
2. 使用SSH密钥进行无密码登录
为了简化迁移过程,可以使用SSH密钥实现无密码登录。以下是生成SSH密钥对并添加到SSH免密码登录列表的步骤:
# 生成SSH密钥对
ssh-keygen -t rsa -b 4096
# 将公钥添加到SSH免密码登录列表
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 使SSH免密码登录生效
chmod 600 ~/.ssh/authorized_keys
确保在新主机上执行以上步骤,以便从原主机安全地迁移Git仓库。
3. 创建新主机上的Git仓库
在新主机上,你需要创建一个新的Git仓库。可以使用以下命令:
# 克隆原主机上的Git仓库到新主机
git clone ssh://[原主机IP]:[端口]/[仓库名] [新仓库名]
替换[原主机IP]、[端口]和[仓库名]为实际值。此步骤将克隆原主机上的Git仓库到新主机,但不会迁移分支、标签和历史记录。
4. 迁移分支、标签和历史记录
为了迁移分支、标签和历史记录,你需要执行以下步骤:
- 在原主机上,使用以下命令导出所有分支、标签和历史记录:
# 导出所有分支、标签和历史记录
git clone --bare ssh://[原主机IP]:[端口]/[仓库名] [临时目录]
cd [临时目录]
git filter-branch --subtree-path=. --env-filter '
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
'
- 将导出的内容复制到新主机:
# 将导出的内容复制到新主机
scp -r [临时目录] [新主机用户名]@[新主机IP]:[新主机目录]
- 在新主机上,将导出的内容添加到新仓库:
# 将导出的内容添加到新仓库
cd [新主机目录]
git clone --bare ssh://[新主机IP]:[端口]/[新仓库名]
cd [新仓库名]
git checkout --orphan temp-branch
git reset --hard [临时目录]
git branch -d temp-branch
git push origin --force
- 将原主机的仓库删除:
# 删除原主机上的仓库
rm -rf [临时目录]
5. 一键操作脚本
为了简化迁移过程,你可以将上述步骤整合到一个一键操作脚本中。以下是脚本的一个示例:
#!/bin/bash
# 原主机信息
ORIGIN_HOST_IP="192.168.1.1"
ORIGIN_PORT="22"
ORIGIN_REPO_NAME="old-repo"
# 新主机信息
NEW_HOST_IP="192.168.1.2"
NEW_PORT="22"
NEW_REPO_NAME="new-repo"
TEMP_DIR="/tmp/old-repo-filtered"
# 生成SSH密钥对
ssh-keygen -t rsa -b 4096
# 导出所有分支、标签和历史记录
git clone --bare ssh://$ORIGIN_HOST_IP:$ORIGIN_PORT/$ORIGIN_REPO_NAME $TEMP_DIR
cd $TEMP_DIR
git filter-branch --subtree-path=. --env-filter '
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
'
# 将导出的内容复制到新主机
scp -r $TEMP_DIR $NEW_HOST_IP:$NEW_REPO_NAME
# 在新主机上,将导出的内容添加到新仓库
ssh $NEW_HOST_IP "cd $NEW_REPO_NAME; git clone --bare ssh://$NEW_HOST_IP:$NEW_PORT/$NEW_REPO_NAME; cd new-repo; git checkout --orphan temp-branch; git reset --hard $TEMP_DIR; git branch -d temp-branch; git push origin --force"
# 删除原主机上的仓库
rm -rf $TEMP_DIR
将此脚本保存为一个文件,例如git-repo-migration.sh,并赋予执行权限:
chmod +x git-repo-migration.sh
在执行脚本之前,请确保已修改脚本中的变量值以匹配你的实际主机信息。
6. 总结
通过以上步骤,你可以轻松地将Git仓库迁移到新主机,并确保代码的安全性。在实际操作中,请注意以下几点:
- 在迁移过程中,务必备份重要数据。
- 在新主机上创建新仓库时,确保选择正确的路径和权限。
- 迁移过程中可能遇到各种问题,请仔细阅读相关文档,并耐心解决。
祝你好运!
