通过将 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” 的相关文章

  • Git:在本地合并远程分支

    我已经通过以下方式拉取了所有远程分支git fetch all 我可以看到我想要合并的分支git branch a作为远程 原点 分支名称 问题是它无法访问 我无法合并或结帐 您可以参考那些远程跟踪分支 列出git branch r 及其遥
  • 使用两个帐户推送到 Git

    我跟着这个tuotrial http code tutsplus com tutorials how to work with github and multiple accounts net 22574关于如何在同一台计算机上拥有两个单独
  • 您对版本控制进行到什么程度了? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 致命:早期 EOF 致命:索引包失败

    我用谷歌搜索并找到了很多解决方案 但没有一个适合我 我试图通过连接到 LAN 网络中的远程服务器来从一台计算机进行克隆 从另一台机器运行此命令会导致错误 但是在服务器上使用 git 192 168 8 5 运行相同的克隆命令 一切正常并且成
  • 来自 eclipse 的部分 git 提交 (egit)

    假设我有一个有 2 个更改的文件 如何使用 egit 只提交其中之一 命令行版本可以在以下位置找到this https stackoverflow com questions 1085162 commit only part of a fi
  • 如何损坏 Git 存储库?

    创建损坏的 git 存储库有哪些方法 有没有有趣的方法可以永久损坏 git 存储库 你能否削弱一个 git 存储库 使其行为有些正常 但会做一些奇怪的事情 我的兴趣来自于当有人担心他们是否真的创建了不可恢复的状态时 它通常很容易修复或至少可
  • 在 git 提交消息中使用任何 utf-8 字符是否安全?

    我发现使用 UTF8 字符 例如 很有用 请参阅here http www utf8icons com subsets dingbats 在提交消息中 重构 NewService 添加了更好的服务 OldServiceA 据我所见 它see
  • 有关多个远程存储库的 Git 状态

    我有一个脚本 如果我忘记在 40 多个存储库中提交或推送一些代码 它会通过电子邮件向我发送提醒 在我的两个项目中 我遵循了这些帖子中的答案 其中我设置了 git push 来推送到多个存储库 从多个远程位置拉 推 https stackov
  • web2py git 集成 - localhost 和 pythonanywhere

    我完全不知道如何将 Github 集成到 web2py 中 我在 USB 上安装了 web2py任何地方的Python http www pythonanywhere com web2py概述文档chapter3http web2py co
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • git 命令显示所有(轻量级)标签创建日期

    是否有一个衬垫可以向我显示所有 git 轻量级标签的创建日期 就像是 git show tags format date 我在这个发现link http osdir com ml git 2009 05 msg01404 html适合我需求
  • 本地git,推送到tfs远程repo

    我厌倦了向我的队友解释使用 DVCS 相对于 CVCS 的好处 他们中的一些人害怕学习曲线 另一些人则看不出任何原因 因为对他们来说 这都是一样的 就我个人而言 我对 TFS 及其问题感到非常厌倦 每当我需要进行一些小的 修复 时 我都必须
  • 如何标记单个文件?或如何下载特定文件? - 胃肠道

    我想向文件添加标签以轻松下载该文件而不是整个分支 如何下载GIT中的特定文件 我不知道有什么方法可以标记特定文件git 对于第二个问题 如何下载特定文件git 仅当您的意思是 同时下载 时 以下内容才有效in a git存储库 这就是我理解
  • 在 GitHub 上执行拉取请求时避免不需要的合并提交和其他提交

    我在 Github 上分叉了一个项目 令远程上游为upstream我的远程存储库是origin 我当地的master分支设置为跟踪远程master分支 然后我在本地添加了一些东西master 时不时与上游汇合 直到今天我想发出pull re
  • hg 或 git 中的两个完整目录/项目之间存在差异?

    我继承了一个最初存储在 CVS 中的项目以及所有修订 我做了相当多的编辑 并且我试图比较我在原始目录中所做的所有更改 关于添加的新文件与旧文件 hg git 是否有某种实用程序可以让我进行树差异或类似性质的操作 也就是说 新添加的文件 删除
  • 通过链接进入 git-repo,无需冗长的对话框

    In a directory I have symbolic links into a git administered directory all under Linux Every time I want to e dit such a
  • 返回到存储库中的特定修订后提交并推送更改?

    我们需要及时返回到某个特定的提交 一些意外的改变是为了掌握 尝试恢复它挖得太深 所以 master 的状态很糟糕 现在我们希望master回到66ada4cc61d62afc 根据git 恢复到某个提交 https stackoverflo
  • 是否可以在 git 存储库之外添加和提交文件?

    我们的文本文件分布在系统的各个角落 我们计划将这些文件中所做的所有修改添加到 git 存储库中 每次对这些文件进行修改都是由脚本进行的 因此 我们计划向该脚本添加新命令 以将文件添加到 git 存储库 但是 这些修改是同时进行的 我们可以为
  • 自动生成/删除詹金斯工作

    我正在寻找一种自动创建一组詹金斯作业的方法 通常在创建新的 git 分支之后 我已经为maven尝试过这个插件 http evgeny goldin com wiki Maven jenkins plugin http evgeny gol
  • 致命:不是 git 存储库(或任何父目录):.git [重复]

    这个问题在这里已经有答案了 当我尝试推送 github com 上的现有存储库时 当我输入命令时 网站提示我将其输入终端 我收到了以下致命错误消息 Not a git repository or any of the parent dire

随机推荐