【问题标题】:How can I archive old git tags?如何归档旧的 git 标签?
【发布时间】:2014-11-26 20:45:44
【问题描述】:

我的 git 存储库中有一些不再重要的旧标签。我想存档标签,以便在运行 git tag 时默认情况下不会显示它们。我不想删除它们,因为我想保留历史。我该怎么做?

【问题讨论】:

  • 这个问题类似于stackoverflow.com/questions/1307114/…,但我的问题是关于标签而不是分支。 (您通过将分支转换为标签来存档分支。但是如何存档标签?)
  • 克隆存储库,将标签保留在备份中,然后从您正在使用的标签中删除它们

标签: git


【解决方案1】:

可以将标签保留在 repo 中并避免将它们列为标签。它还避免了默认克隆获取它们。

假设您想要归档所有以“HIDE”开头的标签:

mkdir refs/archive
mv refs/tags/HIDE* refs/archive/

现在git tag 将不再列出这些引用,但它们仍将存在于存储库中。

如果您稍后想将归档标签下拉到本地克隆,您可以运行以下命令:

git fetch origin +refs/archive/*:refs/archive/*

您现在可以使用以下方式列出它们:

git for-each-ref refs/archive

【讨论】:

  • 请注意,'archive' 这个名称并没有什么特别之处,如果需要,可以将其命名为其他名称。
  • 他们的提交不会被垃圾收集吗?
  • @DanFabulich 不,提交仍然被引用,只是不是作为标签。如果您在裸存储库中运行 git show-reffor 例如,您将看到存档引用(或我在答案中提到的 for-each 版本)。您可以通过强制 gc 对所有内容进行验证,有关详细信息,请参阅 this answer - 但在运行该 cmd 之前请阅读警告。
【解决方案2】:

删除标签时应该小心。也许标签是对某个 sommit 的唯一引用。

                      branch
                      |
                      V
 o---o---o----o---o---o
     \
      o---o---o---o
                  ^
                  |
                  someTag

如果您删除对提交的最后一个引用,您将在某天失去该提交。有朝一日意味着git gc 收集它们。

如果你没有这个问题,你可以使用

$ git show-ref --tags > tag_refs-20141126.txt

将您的标签和提交 ID 转储到文件中。然后将此文件提交到您的存储库或将其保存在其他地方。之后你可以删除标签

$ git for-each-ref --format="%(refname)" refs/tags | cut -c11- | \
  while read tag; do git tag -d $tag; done

稍后恢复它们

$ cat tag_refs-20141126.txt | while read commitid tagref; do echo $tagref $commitid; done \
  | cut -c11- | while read tagname commitid; do git tag $tagname $commitid; done

编辑

我更喜欢Dan FabulichZitrax 的回答。使用隐藏的 refs 也是我的工作。例如。当我想备份存储时。我前段时间为此写了git extension

【讨论】:

    【解决方案3】:

    克隆 repo,将标签保留在备份中,然后从您正在使用的标签中删除它们。

    (请注意,@AndrewC 在对问题的评论中写下了这个答案,但它算作对问题的回答。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 2012-09-11
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      相关资源
      最近更新 更多