git克隆代码保留提交记录,从源仓库迁移到新仓库地址

news/2025/10/10 9:28:32/文章来源:https://www.cnblogs.com/liubaihui/p/19132390

在 Git 中迁移代码并保留完整的提交历史记录,可以通过以下几种方法实现,具体选择取决于源仓库和目标仓库的访问权限、是否需要重写历史(如修改提交信息或作者信息)等因素。以下是详细的操作步骤:


方法 1:直接推送(适用于同平台或可访问的远程仓库)

适用场景:源仓库和目标仓库均可通过 Git 协议(如 HTTPS/SSH)访问,且无需修改历史记录。

步骤

  1. 将本地仓库与源仓库关联(如果尚未克隆):

    bash
      git clone <源仓库URL> # 克隆源仓库到本地
      cd <仓库目录>
  2. 添加目标仓库作为远程仓库:

    bash
      git remote add target <目标仓库URL> # 例如 GitHub/GitLab/Gitee 的仓库地址
  3. 推送所有分支和标签到目标仓库:

    bash
      git push --all target # 推送所有分支
      git push --tags target # 推送所有标签
  4. 验证:

    • 在目标仓库中检查分支和提交历史是否完整。

方法 2:镜像克隆(完整复制包括远程分支)

适用场景:需要完全复制源仓库的所有内容(包括远程分支、标签等),通常用于备份或迁移到不可写的仓库(如从 GitHub 迁移到自建 GitLab)。

步骤

  1. 使用 --mirror 参数克隆源仓库:

    bash
      git clone --mirror <源仓库URL> # 镜像克隆(仅克隆 .git 目录,不包含工作区)
      cd <镜像目录> # 进入克隆的 .git 目录
  2. 修改远程仓库地址为目标仓库:

    bash
      git remote set-url origin <目标仓库URL>
  3. 推送所有内容到目标仓库:

    bash
      git push --mirror # 推送所有分支、标签、远程引用等
  4. 验证:

    • 目标仓库将与源仓库完全一致(包括所有分支、标签和历史记录)。

方法 3:使用 git bundle(适用于离线迁移或无网络访问)

适用场景:源仓库和目标仓库之间无法直接通过网络访问(如内网到外网迁移),或需要打包历史记录供后续导入。

步骤

  1. 在源仓库所在机器上创建 Git 包:

    bash
      git bundle create <bundle文件名>.bundle --all # 打包所有分支和标签
      # 或指定分支范围:
      # git bundle create <bundle文件名>.bundle <源分支>..<目标分支>
  2. 将 .bundle 文件传输到目标机器(如通过 USB、SCP 等)。

  3. 在目标机器上克隆或拉取包:

    • 克隆新仓库:
      bash
        git clone <bundle文件名>.bundle <目标目录>
        cd <目标目录>
    • 或拉取到现有仓库:
      bash
        git pull <bundle文件名>.bundle <分支名>
  4. 验证:

    • 检查提交历史是否完整。

方法 4:修改历史后迁移(如重写作者信息、提交信息)

适用场景:需要修改提交历史(如修正错误的作者邮箱、合并提交等)后再迁移。

步骤

  1. 克隆源仓库并修改历史:
    bash
      git clone <源仓库URL>
      cd <仓库目录>
    • 使用 git filter-repogit rebase 或 git filter-branch 修改历史(例如修正作者信息):
      bash
        # 示例:修正所有提交的作者信息
        git filter-repo --author-name "旧名字" --author-email "旧邮箱@example.com" --author-name "新名字" --author-email "新邮箱@example.com"
  2. 推送修改后的历史到目标仓库:
    bash
      git remote add target <目标仓库URL>
      git push --all target
      git push --tags target

常见问题解决

1. 权限错误

  • 确保对目标仓库有写入权限(如 SSH 密钥已配置,或 HTTPS 用户名/密码正确)。
  • 如果是 GitHub/GitLab,检查是否生成了 Personal Access Token 并用于认证。

2. 历史记录不完整

  • 使用 git log --all --oneline 检查本地是否包含所有分支的历史。
  • 如果某些分支未推送,手动推送:
    bash
      git push target <分支名>

3. 大文件问题

  • 如果仓库包含大文件(如超过 100MB),需配置 Git LFS 或分批迁移。

4. 迁移后分支混乱

  • 在目标仓库中删除错误的分支并重新推送:
    bash
      git push target --delete <错误分支名>
      git push target <正确分支名>

总结

方法适用场景命令示例
直接推送 同平台迁移,无需修改历史 git push --all target + git push --tags target
镜像克隆 完全复制源仓库(包括远程分支) git clone --mirror + git push --mirror
Git Bundle 离线迁移或无网络访问 git bundle create + git clone/pull <bundle文件>
修改历史后迁移 需要重写作者信息、合并提交等 git filter-repo + git push --all target

推荐流程:

  1. 优先尝试 直接推送(简单快捷)。
  2. 如果需要完整复制(包括远程分支),使用 镜像克隆。
  3. 离线环境使用 Git Bundle。
  4. 需要修改历史时,结合 git filter-repo 或 git rebase 后再推送。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/933988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL从入门到熟练查询

MySQL 作为世界上最流行的开源关系型数据库,是我们每一位码农、数据分析师乃至产品经理都应掌握的核心工具。它以其高性能、高可靠性和易用性而闻名。掌握其基础知识,是通往后端开发、数据科学等领域的必经之路。 我…

MySQL笔记8 - 指南

MySQL笔记8 - 指南2025-10-10 09:12 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

Elasticsearch 备份:方案篇

在 Elasticsearch 集群的日常运维中,制定完善的数据备份与恢复策略是保障业务连续性和数据安全的基石。在本文中,我们将探讨 ES 各类备份方案的实现逻辑,对比各自方案的优劣势,归纳它们适合的场景1. 为什么要备份 …

Atcoder Beginner Contest 422

ABC422A 按照题意输出即可。 /*********************************************************************程序名:作者: xAlec日期: 2025-10-01 15:45说明: sakana ~ *************************************************…

【Android】解决安卓在隐藏强大的系统栏后usb鼠标被隐藏的疑问

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

centos安装libgdiplus-6.1

centos安装libgdiplus-6.1参考:https://chat.deepseek.com/share/fhak78p0eprkm8reeh 源码:# 从Mono官方下载完整源码包 wget https://download.mono-project.com/sources/libgdiplus/libgdiplus-6.1.tar.gz tar -xz…

RapidJSON 自定义内存分配器详解与实战 - 详解

RapidJSON 自定义内存分配器详解与实战 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

完整教程:考研408计算机网络第47题(2024年)

完整教程:考研408计算机网络第47题(2024年)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

进步与现代化

线性方程组 线性无关、系数矩阵行列式、解的情况 简化行阶梯型矩阵:主元全 \(1\),所在行左侧全 \(0\),所在列剩余全 \(0\) 生成子空间:\(\langle A\rangle\),线性表出の所有向量 \(A\) 线性无关 \(\Longleftright…

2025 最新推荐!溴化锂回收公司精选榜单:含制冷机 / 溶液 / 机组回收服务商权威测评及选择指南

随着工业与商业领域溴化锂制冷设备迭代加速,老旧设备处置需求激增,但市场仍存在服务标准混乱、环保措施缺失、技术能力参差不齐等痛点。部分机构拆解流程不规范,既造成铜、铝等资源浪费,又易因溴化锂溶液泄漏引发污…

使用OpenCvSharp , Emgu.CV 手搓 视觉识别算法 以及 成果展示

举个🌰 一个培养皿里有若干条鱼苗,需要将它全部区分识别出来, 像如下图所示的小蝌蚪就是(培养皿里三个黑点是热带鱼苗,做实验用的,一毫米长) 用的是海康威视的黑白工业相机拍摄。 先讲讲思路,图片是一组庞大的…

PKC7300高频电流探头在新能源汽车车载充电机稳态电流测试中的应用方案

一、应用背景 新能源汽车车载充电机(OBC)是将外部电网电能转换为车载动力电池电能的关键部件。在工作过程中,它需要处理0-300A的电流,而其内部的高频开关电路容易产生干扰信号。因此,对电流测量的量程、高频信号捕…

质量检验知识专题讲座之六:抽样检验步骤

抽样检验步骤抽样检验是从一批产品中随机抽取部分样本进行检验,再根据样本结果判断整批产品是否合格的过程,主要步骤如下: 1)、确定抽样检验的对象和目的 明确需要检验的产品批次、检验的质量特性(如尺寸、性能、…

羡慕线段树

顺颂 YFST 板子 & 使用例 题。首先树剖,然后变成在 \(\text{dfn}\) 区间上插一个关于 \(\text{dis}\) 的一次函数。这个很神奇,一般的李超树是,在 \(x\) 轴区间上插入关于 \(x\) 的一次函数。然而这里,\(\text…

质量检验知识专题讲座之七:来料检验

来料检验(IQC)1、来料检验的定义: 来料检验是指对采购进来的原材料、部件或产品做品质确认和查核,即在供应商送原材料或部件时通过抽样的方式对品质进行检验,并最后做出判断该批产品是允收还是拒收。 来料检验是企业…

windows 10分区教程,win10自带分区教程

win10怎么分区?win10自带磁盘分区,有几个人会?win10磁盘分区 不需要任何软件,win10系统本身就有这个功能,下面开始操作 第一步 按快捷键【wins+X】的组合键,在弹出的选项中选择【磁盘管理】选项;如下图: ​​ …

巴斯勒相机:30 年工艺沉淀,重新定义机器视觉效率​

巴斯勒相机:30 年工艺沉淀,重新定义机器视觉效率​2025-10-10 08:43 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; dis…

决斗(模拟赛题目T3)分析

感觉很典,所以就记下来了。我们考虑一个非常重要的事实: - 田忌赛马对于每一个 $a_i$ 找的是第一个比他大的 $b_i$。 - 而字典序最大又需要前面的尽可能大。这似乎产生了矛盾,让这道题目看起来有点难。我们考虑不用…

Guidde:AI驱动的视频文档创建工具 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …