如何归档旧的git标签?

7

我在git仓库中有一些已经不重要的旧标签。我想将它们存档,这样在运行git tag时它们就不会默认显示出来。我不想删除它们,因为我想保留历史记录。我该怎么做?


这个问题类似于https://dev59.com/0nM_5IYBdhLWcg3wmkau,但我的问题是关于标签而不是分支。 (你可以通过将它们转换为标签来归档分支。但是如何归档标签?) - Dan Fabulich
3
克隆存储库,将标签保留在备份中,然后从您正在使用的存储库中删除它们。 - Andrew C
3个回答

11

可以在代码库中保留标签,避免将它们列为标签,并避免默认克隆从获取它们。

在原始版本(裸体代码库)中,假设您想要归档所有以“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

1
请注意,名称“archive”并没有什么特别之处,如果需要,它可以被命名为其他名称。 - Zitrax
他们的提交不会被垃圾回收吗? - Dan Fabulich
@DanFabulich 不,提交仍然被引用,只是不作为标签。例如在裸库中运行git show-ref,您将看到存档引用(或我在答案中提到的for-each版本)。你可以通过强制gc所有内容来验证,参见这个答案有关详细信息 - 但在运行该命令之前请阅读警告。 - Zitrax

2
当您删除标签时,应该小心。也许某个标签是对某些内容的唯一引用。
                      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的答案。使用隐藏的引用是我也经常做的事情。例如,当我想要备份stash时。我之前写了一个git扩展程序


0

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

(请注意@AndrewC在评论中编写了此答案,但它算作问题的答案。)


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