通过将 git 变更集传输为 tarball 来模拟“气隙”系统的“git pull”

2024-01-13

我需要将 git 存储库同步到“气隙”系统,在系统上创建镜像环境。文件必须通过专门批准的渠道传输。新代码在被允许进入系统之前还必须经过漫长的审查和批准过程。

代码开发得很快,我想每周同步特定分支 - 就像我只是执行 git pull 一样。重新传输整个 git 存储库并不是一个真正的选择。仅审查代码差异会更容易清除我们的审查和批准。

有没有办法使用捆绑包或存档或差异树或类似的东西将新的变更集转储到文件中,并在气隙系统上从该文件中执行 git pull/fetch 来更新存储库?

我已经浏览了有关补丁、档案、差异树和以前的答案的文档,但我认为这些都不能完全满足我的需要。


Git 不处理也不存储差异。 Git 使用并存储提交(依次存储树和 blob)和标签(通常标记提交,存储树和 blob)。

也就是说,git bundle is您正在寻找的命令:它本质上是服务器端的一半git fetch它的输出是一个文件git fetch在客户端可以读取。因此,您将生成捆绑包的机器视为服务器:您告诉它客户端已经有哪些提交,以及您认为客户端在收到客户端尚未获取的提取时应该看到的分支名称实际上运行。服务器(构建捆绑包)然后打包相同的数据git fetch会得到,如果以后git fetch实际上可以到达服务器。

然后,您将数据(例如,在 USB 记忆棒上)携带到客户端,将其插入客户端,然后在客户端上运行git fetch就客户端而言,它现在正在通过线路从位于文件内部(例如,USB 记忆棒内部)的服务器实时检索数据文件。

一个大问题是,由于 USB 记忆棒(或其他任何东西)isn't实际上是一个服务器,因此客户端实际上并没有与服务器实时对话,您必须已经获得git bundle直接在服务器上执行命令。如果您错过了任何提交,则获取将会失败。如果您包含太多提交,则获取将会成功,因此为了“正确执行”,您可以首先捆绑整个存储库或某些特定的分支集,然后在发送端保存标记以记住您捆绑的内容。因此,示例中the git bundle文档 https://git-scm.com/docs/git-bundle:

machineA$ cd R1
machineA$ git bundle create file.bundle master
machineA$ git tag -f lastR2bundle master

您现在转移file.bundle到“客户端”并可以从该文件克隆。

后来,之后machineA有新的提交,您可以运行:

machineA$ cd R1
machineA$ git bundle create file.bundle lastR2bundle..master
machineA$ git tag -f lastR2bundle master

(a) 向客户端发送新的提交,以及 (b) 更新服务器端内存中发送给客户端的提交内容。 (当然,实际的发送稍后会通过 USB 记忆棒或其他方式进行。)

该标记实际上只是任何任意提交哈希 ID,或者充当 ID 的名称,或者用于建立服务器假设客户端已经拥有的“基础提交”的其他内容。

(请注意,该捆绑包包含一个“瘦包”,即针对服务器认为客户端拥有的对象进行增量压缩的对象。客户端将根据需要增大瘦包,因为 Git 不喜欢依赖于这种增量-压缩——仅在网络连接期间允许使用精简包,包括具有此类气隙的伪造包。空基础意味着该包毕竟不是精简包,而是整个存储库。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过将 git 变更集传输为 tarball 来模拟“气隙”系统的“git pull” 的相关文章

  • 如何使用 LibGit2Sharp 从 Git 获取更改?

    下面的代码将 Git url 克隆到测试目录 var url http abc 555 com team project 555 git var path E temp 555 var credential new Credentials
  • 如何在Git中手动合并所有文件?

    我想合并所有文件manually有了 meld 或任何其他 diff 工具 我如何使用 Git 来做到这一点 当我跑步时git mergetool它说no files need merging 所以我想只有当我有冲突时我才能做到这一点 有更
  • 无法快速删除 Git 中的许多文件

    我删除了 Git 分支中的 777 个文件新功能 by rm example 我愿意承诺 Git 要求我手动删除每个已删除的文件 git rm file 对于所有名称不相似的 777 个文件 编写上述命令将花费大量时间 如何删除我的 Git
  • 未签出...捆绑安装无法修复帮助!

    https github com intridea omniauth git at master is not checked out Please run bundle install Bundler GitError 那我该怎么办 捆绑
  • Mac 到 EC2 - 源代码控制三角问题 - git?同步?啥?

    我有一个日常 EC2 实例 事实上 请注意那些更改IP每次重新启动它们时 都会出现另一个问题 实例上有一个文件夹 我在文件夹 mysql express 等 中有一个简单的 比如说 节点项目 比方说 这是一个网站 那么在我的 Mac 上进行
  • 原始文件被分成另外两个文件,git 有没有办法查看内容去了哪里?

    我的问题 我是一名代码审查员 我在GIT中有一个情况 before a txt 然后开发人员决定拆分内容a txt分成 2 个文件 并在一次提交中添加一些更改 after b txt 很少的变化和c txt 一些变化 有没有简单的方法可以看
  • 以编程方式将工作项关联到拉取请求

    我可以得到 https www visualstudio com en us docs integrate api git pull requests get a pull request https www visualstudio co
  • 无论我做什么,我都无法推送我的代码并不断收到相同的错误

    我正在尝试将代码推送到远程分支 但不断收到此错误 rejected non fast forward error failed to push some refs to email protected cdn cgi l email pro
  • 将存储库从 Github 移至 Gitlab

    有没有办法将整个存储库从 Github 移动到 GitLab 对于代码本身来说 只需在 GitLab 上创建一个新的存储库并推送到它即可 Wiki 页面位于 Github 上的单独分支中 并通过 Git 机制进行管理 据我所知 GitLab
  • 詹金斯钩子不工作 - 詹金斯位桶

    您好 我正在使用 jenkins 和 bitbucket 当我向 bitbucket 存储库提交任何内容时 我想触发 jenkins 中的构建 在詹金斯 我创建了一个名为test 1 在配置部分Build Triggers我勾选的部分Tri
  • 防止在 Git 中签出

    我目前正在研究使用 Git 管理 OpenInsight 应用程序的源代码 由于 OI 代码存储在数据库表中 因此需要进行一定量的手动工作才能将源代码导出为文本 反之亦然 到目前为止 我已经成功地使用 Git 挂钩自动化了很多这项工作 但是
  • 获取 git 存储库中每个文件的提交计数

    我正在寻找一种方法来查看有关 git 存储库中每个文件更改频率的统计信息 基本上 文件提交的频率实际上与以前的版本不同 此外 有没有办法获取文件上次更改的日期 我是一个 git 新手 还没有发现任何关于此的信息 任何帮助将不胜感激 这里有两
  • 为什么 --first-parent 不是 git show 的默认值?

    我确信这个问题将作为基于意见的问题而结束 但没有其他地方所以问它 所以这里 我正在尝试查看我的分支的历史记录 其中包括合并提交 特别是更改的内容 我在这里找到了一篇非常有用的帖子git 显示合并提交 https stackoverflow
  • 反向合并具有干净历史记录的缝合功能分支

    我有这个 d0 f1 d1 d2 f2 d3 merge d4 f3 merge
  • 如何使用最近的标签来装饰 git 日志?

    git log decorate将相关引用的信息添加到日志输出中 commit 9e895ace5d82df8929b16f58e9f515f6d54ab82d tag v3 10 rc7 Author Linus Torvalds lt
  • 使用 reposurgeon 将 svn repo 转换为 git

    我正在尝试使用 svn repo 转换为 git再生外科医生 http www catb org esr reposurgeon 这是我所做的 有一个具有 svn 名称 gt git 名称映射的 repo map 文件 svnadmin d
  • 无法在 Eclipse 中运行从 Git 导入的项目

    我的 Eclipse 工作区中有一个来自 Github 的项目 通过 File gt Import gt Projects from GIT 但是 我无法运行该示例 因为 运行方式 下的唯一选项是 运行配置 转到 运行配置 后 我单击 浏览
  • 如何对私有 jelastic 环境进行版本控制

    为了跟踪 Jelastic 托管环境的配置 我想在 git 存储库中对其进行版本控制 该存储库应该是私有的 并包含多个具有不同版本的不同分支 例如master abc123 v1 1 我的第一次尝试是创建一个私有 github 存储库 其中
  • 删除 git Branch -a 列出的分支

    命令git branch a列出了一堆不在存储库上且不在本地分支上的分支 这些怎样才能删除呢 develop master remotes origin cloner 例如 remotes origin cloner曾经存在于存储库中 但它
  • Git 存储库损坏(标头检查不正确;松散对象已损坏)

    昨天晚上我在写提交消息时遇到了电源故障 当我重新启动机器时 我无法完成提交 我跑了git reset 添加回更改的文件 然后再次尝试 得到 git commit error inflate data stream error incorre

随机推荐