我有两个房间,我在其中使用 git 维护一些源代码,一个“开发”房间,其中大多数开发发生在一个“部署”房间,我们实际使用该软件。不可避免地,部署室也会发生一些变化。我希望两个房间在 git 中共享相同的历史记录。
限制:
- 出于安全原因,这两个房间没有网络连接。
- 只有文本文件(人类可读)可以离开部署室。
使用 将更改移动到部署室很简单git bundle
,并跟踪我们移动到部署室的最后一次提交。由于仅限文本的限制,将更改移出房间更加困难。
目标:在我的两个未连接的房间之间来回移动提交,就好像git pull
发生了一样,即两个房间中的 SHA1 哈希值相同。
至今:
我试图
git format-patch
将更改从部署移回开发,但这不会记录合并,因此需要为每个连续的更改集生成不同的补丁集以及如何重现确切的合并提交的一些记录发生在两者之间。有一些关于为合并提交制作差异的讨论,但这似乎并没有捕捉到实际的祖先,只有变化。看起来补丁可能不是一种足够丰富的格式来提供必要的信息。一些捆绑到文本的脚本可用于将捆绑转换为非压缩和人类可读(ish)格式,(然后在下载后再次返回),但我没有发现存在这样一个脚本的证据。
也许可以编写一个脚本来将历史从某个共同的祖先走到最新的提交,然后 a) 制作补丁或 b) 重新创建一些众所周知的 ref 的合并。
回退: 我总是可以将来自部署室的提交压缩到一个原始补丁中并破坏历史记录,但是从 dev->deploy 进一步下载会破坏任何现有的工作副本。不理想。
更新:
我相信git fast-export
可以做我需要的,尽管大多数例子都适用于整个存储库而不是部分历史,如git bundle
. 我有一个工作玩具示例,我可以在其中将部分历史记录导出到过时的克隆中,但它需要我手动编辑快速导出输出,以便我from <sha1>
在第一次提交中添加一个。如果不进行此修改,导入会创建不同的 sha1,然后使用Not updating refs/heads/master (new tip <hash> does not contain <master's hash>)
.
Update2:
我的git fast-export
解决方案确实有效,但存在带宽问题,因为它通过提供全新文件而不是与以前文件的差异来工作。这是不可接受的,因为我实际上必须阅读所有这些额外的行。