问题和动机
我们在中央服务器上有一个较大的git存储库。它里面有很多历史记录我们想要保留,所以在那里进行rebase或者squash是不现实的选择。然而,在将存储库克隆到我们的开发服务器时,只有最近的历史记录才是真正相关的。对于我们来说,“最近”可以定义为给定的标签,并且历史记录中任何早于此标签的提交都可以省略。这里的目标是节省带宽、时间和磁盘空间。
方法的想法
当前的想法是仅克隆该标签,使用git clone --branch my-root-tag --depth 1
,将其视为本地存储库中的人工根提交。之后,添加我们希望手动获取的分支,使用git remote set-branches --add origin some-branch
。所有这些分支必须在它们的历史记录中包含my-root-tag
。然而,每次fetch现在都会再次传输整个历史记录。是否有任何方式限制fetch停止于my-root-tag
?这似乎需要像git shallow clone since specific commit中所要求的内容,理想情况下包装在一个git别名中以“动态”计算--depth
参数的值。
有没有人能想到让这个方法工作或者应用一些完全不同的方法?
结果
编辑:总结一下,似乎git fetch
确实只会传输直到嫁接的新存储库根(至少在Git v 2.25.1中)。只需要正确设置原始的clone
,而对存储库进行的后续操作可以使用常规(未经参数化的)git命令执行。现在实际上不需要shallow-include
或shallow-exclude
选项。这是个好消息,因为它使该配置比最初担心的更加稳健。
git fetch shallow-exclude=my-root-tag
对你无效。 - tkruse--shallow-since
和特别是--shallow-exclude
参数确实几乎像所需的用例那样工作。然而,我没有成功地将已拉取的分支连接到我的root-tag
。即使我在根标记之前创建了另一个标记,并使用该标记进行拉取。 - Michael Langgit branch -a --contains my-root-tag
没有返回任何分支。我添加的分支的根提交比传递给--shallow-exclude
参数的提交要新。然而,使用clone --depth 1
后跟常规的fetch
看起来已经按预期工作了。我已经感谢您的支持,@tkruse,今天会进行更多测试,之后关闭该问题。 - Michael Lang