如何克隆到 git 存储库中的特定标签,并且不包含该标签之后的历史记录或提交?

问题描述

我已经阅读了数十个措辞相似的问题,但似乎没有一个符合我的需求。我有一个包含许多标签和提交的存储库。我想回到几年前的提交/标签,然后克隆该标签以及导致该标签的历史记录,仅此而已。

这是一个简化的表示:

A - B - C - D - H - I - ... ZZZ
  \            /     \     /
   E - F - G          J - K

我想克隆 repo,但最多只能提交 H,导致出现如下所示的 repo:

A - B - C - D - H
  \            / 
   E - F - G

我知道我正在计划的行动的破坏性。我会在弄乱它之前备份现有的回购。我绝对不打算将我包含在生成的克隆中。

解决方法

您将不得不克隆比您想要的更多的历史记录。但是一旦拥有它,您就可以将历史记录截断为您选择的标签。首先克隆存储库:

git clone --no-tags someurl myrepo

现在,将存储库的头部重置为您选择的引用:

cd myrepo
git reset --hard ref-of-interest

你应该拥有你想要的。

请注意,这里我已经明确地使用 --no-tags 进行了克隆,因此标签在本地不可用。如果您确实想将历史记录截断为特定标签,您可以 (a) 不使用 --no-tags 选项进行克隆,或 (b) git reset --hard 为显式提交 ID,而不是标签名称。