概述
由于工作环境的要求,内部机器只能单机使用不能使用网络通讯等方式。本文将探讨如何在离线情况下实现多人多机的代码版本信息互通。
根据对 Git 相关命令的研究,有两种方式可以进行此工作。
- git format-patch 生成文件的补丁信息(多次提交生成多个信息),交由他人将补丁应用于各自的库中,实现代码的。
- 优点:每次交互的数据只有修改后的补丁信息,不包括全部文件内容。(除了第一次使用)
- 缺点:维护难度太大,特别是在多人同库双向使用时,若代码合并不当可能导致部分代码被覆盖的风险。同时在不同人的库中历史日志是不统一的问题。
- git bundle 将仓库内的所有提交信息打包为一个二进制文件,这个文件可以和正常的网上的库一样执行 pull fetch 等操作。
- 优点:只有一个文件,在大家的电脑内都是统一的日志信息。
- 缺点:每次都会将整个仓库拷贝走。
根据项目的特点,选用 git bundle 模式更方便好用。
实施步骤

- 此方案需要有一台中央管理主机存储所有仓库的历史记录,平时通过光盘将交互的二进制文件进行。
- 二进制文件的命名规范为: [项目]-[主机/其他机器]-日期
仓库的初始化(主机)
- 在存储代码的主机中使用
git init命令初始化仓库。 - 编写
.gitignore文件,不存储动态生成的文件。 - 将初始化代码提交到仓库,这里使用 GUI 工具进行。
主机→其他机器
【主机】将代码库中 master 分支导出为二进制库(此操作只能使用命令行输入)
git bundle create example-master-20220321.bundle master
git bundle create创建二进制库命令example-master-20220321.bundle包文件- example 项目名
- master 主机
- 20220321 日期
master表示库中的 master 分支
- 【主机】将导出的二进制文件刻盘并交付给需要使用的人。
- 【其他机器(首次)】将主机文件中的时间信息删除,放置到一个固定位置(可以知道路径即可)如:
D:/bundle/example-master.bundle。 【其他机器(首次)】将项目克隆到本地的一个位置(可以使用 GUI 工具)
git clone -b master D:/999-tmp/bundle/example-master.bundle D:/999-tmp/R1
git clone克隆命令-b master指定克隆 master 分支D:/bundle/example-master.bundle二进制文件路径D:/project/example项目存放路径
- 【其他机器(以后)】将获得的文件覆盖之前的文件。
【其他机器(以后)】拉取最新的主分支记录。(可以使用 GUI 工具)
git pull
【其他机器】新建分支,并在自己的分支中进行开发。(分支名称可以是当前功能名或者作者名,当之前分支名存在时请及时删除)
其他机器→主机
【其他机器】将代码库中 xx 分支导出为二进制库(此操作只能使用命令行输入)
git bundle create example-xx-20220321.bundle xx
git bundle create创建二进制库命令example-xx-20220321.bundle包文件- example 项目名
- xx 分支名
- 20220321 日期
xx表示库中的 xx 分支
- 【其他机器】刻盘将二进制文件导出给主机。
- 【主机(第一次)】将包拷贝到一个固定位置并使用固定名称如 :
D:/999-tmp/bundle/example-otehr.bundle 【主机(第一次)】配置远端地址为
D:/999-tmp/bundle/example-other.bundle(可以使用 GUI 工具)git remote add origin D:/999-tmp/bundle/example-other.bundle
【主机】获取远端分支(可以使用 GUI 工具)
- 【主机】将远端分支与 master 合并(可以使用 GUI 工具)
开发注意事项
- 除上述说明的情况外,其他使用方式和普通的 GIT 使用没有区别。
- 在本机新建分支开发代码,不要将代码提交到 master 分支。(后面通过 hook 实现阻止)
- 若二进制文件名已经被修改了之后,需要重新设置远端文件路径。(可以使用 GUI 工具)
git remote rm origingit remote add origin [url]
