代码仓库迁移-保留历史提交记录和分支
一、项目仓库迁移,保留提交记录和分支
主要有以下几种方法:
1. 使用 GitHub 的 Import 功能 (推荐,最简单):
- 在 GitHub 上新建一个空的仓库。
- 在新仓库的 “Import code” 页面,输入原仓库的地址 (例如:
https://github.com/username/original-repo.git
或https://gitlab.com/username/original-repo.git
)。 - GitHub 会自动克隆原仓库,包括所有分支和提交记录。
2. 使用 git clone --mirror 和 git push --mirror (命令行,更灵活):
这是最常用的方法,适用于从任何 Git 平台迁移到另一个。
# 克隆原仓库,使用 --mirror 选项保留所有分支和引用。在终端执行(将 URL 替换为你的原始仓库地址) git clone --mirror https://github.com/username/old-repo.git # 或使用 SSH 地址 # git clone --mirror git@github.com:username/old-repo.git # 进入克隆后的仓库(注意带有 .git 后缀) cd old-repo.git # 添加新仓库的远程地址 git remote add origin <新仓库地址> # 或修改远程地址指向新仓库 # git remote set-url origin git@github.com:username/new-repo.git # 推送所有内容到新仓库,使用 --mirror 选项确保所有分支和引用都被推送 git push --mirror
遇到问题:! [remote rejected] master -> master (pre-receive hook declined)
原因:权限问题,Develop角色默认下没有远程访问master的权限
解决方案:
方案一:在项目的【Setting】中的【Protected branches】可以设置哪些分支是被保护的,默认情况下【master】分支是处于被保护状态下的,develop角色的人是无法提交到master分支的,在下面的【Developers can push】打上钩就可以了。
方案二:使用其他分支push 入
#方案二: git checkout -b 分支名 git add . git commit -m "提交的信息" git remote add origin 远程仓库地址 git push -u origin 分支名
3. 使用 使用 git push --all 和 git push --tags (命令行,简单但可能不完整):
这种方法相对简单,但可能不会迁移所有引用,例如 GitHub Actions workflows 或 protected branches 的设置。
# 克隆原仓库 git clone <原仓库地址> # 进入克隆后的仓库 cd <新仓库本地目录> # 添加新仓库的远程地址 git remote add origin <新仓库地址> # 推送所有分支 git push --all origin # 推送所有标签 git push --tags origin
4. Fork (仅限在同一平台内,例如 GitHub 到 GitHub):
- 在原仓库页面点击 "Fork" 按钮。
- 这会在你的账户下创建一个原仓库的副本。
- 如果你需要将 Fork 后的仓库转移到另一个组织或用户,可以在仓库设置中更改 ownership。
选择哪种方法?
- GitHub Import: 最简单,推荐首选,尤其适用于从其他平台迁移到 GitHub。
git clone --mirror
和git push --mirror
: 最灵活,适用于任何 Git 平台之间的迁移,也是最完整的迁移方式,推荐用于复杂项目。git push --all
和git push --tags
: 简单,但可能不完整,适用于简单的项目。- Fork: 仅限同一平台内部迁移,方便快捷,但需要额外的步骤来转移 ownership。
迁移后检查:
- 确认所有分支都已迁移:
git branch -a
- 确认提交记录完整:
git log
- 确认标签已迁移:
git tag
一些额外的提示:
- 如果你的仓库很大,迁移可能需要一些时间。
- 确保你有新仓库的写入权限。
- 如果使用 SSH 方式连接,确保你的 SSH key 已添加到新平台的账户中.
- 对于私有仓库,需要在新平台上重新设置访问权限。
- 一些 CI/CD 配置可能需要在新仓库中重新配置。
二、项目仓库迁移,迁移一个分支和提交记录
从A仓库只推送某个分支到B仓库,终端验证操作截图如下:
要将 A仓库 的某个特定分支(例如 分支a
)推送到 B仓库,并保留提交历史,可以按照以下步骤操作:
步骤 1:克隆 A 仓库(如果尚未克隆)
git clone https://github.com/username/old-repo.git cd old-repo # 进入克隆后的仓库
假设将A仓库已存在的develop/migration分支推送到B仓库,先拉分支代码,再切换分支
git fetch origin develop/migration
git checkout develop/migration
步骤 2:添加 B 仓库作为新的远程仓库
git remote add new-origin git@github.com:username/new-repo.git
步骤 3:推送 分支a
到 B 仓库
方法 1:直接推送(如果 B 仓库允许)
git push new-origin 分支a:分支a
- 如果
分支a
在 B 仓库不存在,会直接创建。 - 如果 B 仓库已有
分支a
,但允许强制推送(--force
),可以:
git push new-origin 分支a:分支a --force
方法 2:先拉取 B 仓库的 分支a
(如果已存在)
如果 B 仓库已有 分支a
,并且不能强制推送(--force
),可以尝试:
git fetch new-origin 分支a git checkout 分支a git merge new-origin/分支a # 或使用 `git rebase` git push new-origin 分支a
步骤 4:验证推送是否成功
git remote -v # 查看远程仓库 git branch -a # 查看所有分支 git log --oneline # 检查提交历史