如何在 Git 代码库中使用“人工根提交”?

4

问题和动机

我们在中央服务器上有一个较大的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-includeshallow-exclude选项。这是个好消息,因为它使该配置比最初担心的更加稳健。


相关:https://dev59.com/hpDea4cB1Zd3GeqPiOmY。你没有提到问题链接中提到的“-shallow-since”,这个命令对你无效吗? - tkruse
也许你需要解释一下为什么git fetch shallow-exclude=my-root-tag 对你无效。 - tkruse
--shallow-since和特别是--shallow-exclude参数确实几乎像所需的用例那样工作。然而,我没有成功地将已拉取的分支连接到我的root-tag。即使我在根标记之前创建了另一个标记,并使用该标记进行拉取。 - Michael Lang
我不确定你所说的“将拉取的分支连接到标签”是什么意思。也许,如果您能够绘制ASCII艺术或粘贴git glog等情况,会有所帮助。请参见https://dev59.com/VHI-5IYBdhLWcg3weoJO。您可能需要进行一些尝试,但是如果没有清楚了解远程和克隆上的git分支情况,很难回答您的问题。 - tkruse
我的意思是,git branch -a --contains my-root-tag 没有返回任何分支。我添加的分支的根提交比传递给 --shallow-exclude 参数的提交要新。然而,使用 clone --depth 1 后跟常规的 fetch 看起来已经按预期工作了。我已经感谢您的支持,@tkruse,今天会进行更多测试,之后关闭该问题。 - Michael Lang
很好。并非所有的获取都会获取标签,不确定这是否会影响您:https://dev59.com/RXDYa4cB1Zd3GeqPAnvb - tkruse
1个回答

3

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