概述

由于工作环境的要求,内部机器只能单机使用不能使用网络通讯等方式。本文将探讨如何在离线情况下实现多人多机的代码版本信息互通。

根据对 Git 相关命令的研究,有两种方式可以进行此工作。

  • git format-patch 生成文件的补丁信息(多次提交生成多个信息),交由他人将补丁应用于各自的库中,实现代码的。
    • 优点:每次交互的数据只有修改后的补丁信息,不包括全部文件内容。(除了第一次使用)
    • 缺点:维护难度太大,特别是在多人同库双向使用时,若代码合并不当可能导致部分代码被覆盖的风险。同时在不同人的库中历史日志是不统一的问题。
  • git bundle 将仓库内的所有提交信息打包为一个二进制文件,这个文件可以和正常的网上的库一样执行 pull fetch 等操作。
    • 优点:只有一个文件,在大家的电脑内都是统一的日志信息。
    • 缺点:每次都会将整个仓库拷贝走。

根据项目的特点,选用 git bundle 模式更方便好用。

实施步骤

参考: Git - git-bundle Documentation (git-scm.com)

image.png

  • 此方案需要有一台中央管理主机存储所有仓库的历史记录,平时通过光盘将交互的二进制文件进行。
  • 二进制文件的命名规范为: [项目]-[主机/其他机器]-日期

仓库的初始化(主机)

  • 在存储代码的主机中使用 git init 命令初始化仓库。
  • 编写 .gitignore 文件,不存储动态生成的文件。
  • 将初始化代码提交到仓库,这里使用 GUI 工具进行。

主机→其他机器

  • 【主机】将代码库中 master 分支导出为二进制库(此操作只能使用命令行输入)

    1. 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 工具)

    1. 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 工具)

    1. git pull
  • 【其他机器】新建分支,并在自己的分支中进行开发。(分支名称可以是当前功能名或者作者名,当之前分支名存在时请及时删除)

其他机器→主机

  • 【其他机器】将代码库中 xx 分支导出为二进制库(此操作只能使用命令行输入)

    1. 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 工具)

    1. git remote add origin D:/999-tmp/bundle/example-other.bundle
  • 【主机】获取远端分支(可以使用 GUI 工具)

  • 【主机】将远端分支与 master 合并(可以使用 GUI 工具)

开发注意事项

  • 除上述说明的情况外,其他使用方式和普通的 GIT 使用没有区别。
  • 在本机新建分支开发代码,不要将代码提交到 master 分支。(后面通过 hook 实现阻止)
  • 若二进制文件名已经被修改了之后,需要重新设置远端文件路径。(可以使用 GUI 工具)
    1. git remote rm origin
    2. git remote add origin [url]