如何在没有网络连接的情况下克隆Git存储库

3

基础设施:我有两个主机(A和B)。我无法从A连接到B,反之亦然。没有可从主机A和主机B访问的主机C。我可以在两个方向上发送电子邮件。文本附件是允许的,其他附件不允许。可能会出现其他问题...

我想要将git存储库从主机A克隆到主机B。我想要能够在两个主机上工作。我想要从A推送我的提交到B,反之亦然。

问题:是否有一种简单的方法来传输提交(可用于我的基础设施)?

我已经尝试过:我可以使用git format-patch制作我的提交的文本版本。但是生成的文件中只有作者日期,缺少提交者日期和父提交。我可以查看另一个主机-因此我知道这两个信息。然后,我可以使用GIT_AUTHOR_DATEGIT_COMMITER_DATEgit commit生成具有正确提交哈希的提交。

它有效:) 但我必须输入几个命令。如果我想要传输更多提交,我必须输入更多命令。


2
git bundle或者tar然后对整个内容进行base64编码?使用format-patch会得到新的、不同的提交记录(作者和提交者的日期/信息不一定与原始仓库中匹配)。 - knittl
谢谢,我不知道git bundle。它比我的GIT_AUTHOR_DATE-GIT_COMMITER_DATE-hack(也保留了日期)更容易。我会详细尝试一下,但目前看来它似乎是解决方案。 - Shear Plane
如果原始提交包含与提交者日期不同的作者日期,则无法保留日期。导入后,您最终会得到两个日期都相同的结果。 - knittl
我尝试了 GIT_AUTHOR_DATE="2023-04-08T00:00:00" GIT_COMMITTER_DATE="2023-04-09T12:34:56" git commit -m "..."。然后运行了 git cat-file -p head。在 author 行和 committer 行中的时间戳是不同的。因此,我认为通过我的方法,可以保留时间戳。我哪里理解错了吗? - Shear Plane
是的,日期不同。 现在,使用 format-patch 创建一个补丁并将其应用于另一个存储库。 作者和提交者日期会发生什么变化? 作者日期被保留,提交者日期为“现在”。 如果您强制提交者日期与补丁的作者日期相同,则现在有一个具有2个相同日期的提交(这与格式化补丁之前的提交不同)。也许我误解了你的意思,你想覆盖来自主机A的每个提交的作者和提交者日期? - knittl
也就是说,我所描述的“它可以工作”。我能够设置正确的提交者和作者日期。因此,我可以强制使用正确的提交哈希值。但这个“解决方案”并不是很好,因为我必须重新处理每一个提交。你提出的git bundle建议更好。好得多。 - Shear Plane
1个回答

1
你可以使用 git bundle 创建引用的存档文件。以下是该命令的说明:

创建、解包和操作 "bundle" 文件。Bundles 用于在网络连接的另一侧没有活动的“服务器”时“离线”传输 Git 对象。

它们可用于创建代码库的增量备份和完整备份,并将一个代码库中的引用状态转发到另一个代码库。

因为要求“只能使用文本”,所以可以对存档文件进行十六进制或 base64 编码,以获取可以在接收主机上还原的文本表示。
另一种快速且简单的解决方案是使用 tar 打包代码库并将其编码为文本。由于明显的原因,使用这种方法无法进行增量更新。
这两种解决方案都避免了更改提交者和作者信息的问题。如果原始代码库(在主机 A 上)包含具有不同作者和提交者信息的提交,则设置 author == committer 将丢失信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接