【问题标题】:Delete all tags from a Git repository从 Git 存储库中删除所有标签
【发布时间】:2013-11-01 18:22:23
【问题描述】:

我想从 Git 存储库中删除所有标签。我该怎么做?

使用git tag -d tagname在本地删除标签tagname,使用git push --tags更新git提供者上的标签。

我试过了:

git tag -d *

但我看到* 表示当前目录中的文件。

$ git tag -d *
error: tag 'file1' not found.
error: tag 'file2' not found.
...

考虑到我有很多标签,我想全部删除。

【问题讨论】:

    标签: git git-tag


    【解决方案1】:

    在本地,git标签只是存储在.git/refs/tags子文件夹中的磁盘上的文件。

    您可以使用您最喜欢的删除文件方法(rm *、从文件资源管理器 UI 中删除等)删除所有存储在那里的文件。

    【讨论】:

      【解决方案2】:

      使用通配符模式删除本地和远程标签的单行。

      TAGPATTERN="0.1.*" ; git push origin --delete $(git tag -l $TAGPATTERN) ; git tag -d $(git tag -l $TAGPATTERN)

      由于列表是从本地生成的,所以首先删除远程标签。

      【讨论】:

        【解决方案3】:
        git tag | xargs git tag -d
        

        只需按照Unix philosophy 进行所有操作即可。

        在 Windows 上使用 git bash 和相同的命令。

        【讨论】:

        • 谢谢。该命令删除本地标签。我使用git tag -l | xargs -n 1 git push --delete origin 将它们从遥控器中删除。
        • @CoDEmanX 在 Windows 上,您应该使用 git bash 和相同的命令。
        • 不删除远程标签,数千个标签也很慢。
        • @AdrianBaker 也许你可以增加-n 后面的数字来并行化。我不确定这种方法是否安全
        • 'xargs' 在 Windows 10 上未被识别为内部或外部命令
        【解决方案4】:

        显示所有包含“v”的标签

        git tag -l | grep v | xargs -n 1 sh -c 'echo "Processing tag $0\n" && git show -s $0'
        

        【讨论】:

          【解决方案5】:

          我必须删除带有前缀的标签

          例如,我必须删除标签 v0.0.1、v0.0.2、v0.0.3、v0.0.4、v0.0.5

          git tag -d $(git tag -l "v0.0.*")
          

          分解并解释上面的陈述:

          1. 列出所有带前缀的标签

            git tag -l "v0.0.*"

          2. 删除标签

            git 标签 -d $tag_names 这就是该语句的工作原理

          【讨论】:

            【解决方案6】:

            如果您有大量需要删除的上游(来源)标签,Powershell v7 支持并行 foreach:

            git tag | foreach-object -Parallel { 
            git push origin --delete $_ 
            git tag -d $_ 
            }
            

            【讨论】:

              【解决方案7】:

              由于所有这些选项仅在 linux 中有效,因此对于任何必须处理该问题的人来说,这里是 windows 等效项:

              FOR /F usebackq %t IN (`git tag`) DO @git tag --delete %t
              

              【讨论】:

                【解决方案8】:

                要删除远程标签(在删除本地标签之前),只需:

                git tag -l | xargs -n 1 git push --delete origin
                

                然后删除本地副本:

                git tag | xargs git tag -d
                

                【讨论】:

                • 远程删除对于几十个标签来说太慢了。
                • 如果你有很多远程标签,这个答案会更快:stackoverflow.com/a/34395864/747044
                • 这个答案中的命令顺序假定没有本地标签。
                • 这太慢了,下面的解决方案更好。
                • 如果您需要为提交输入密码,这需要每个标签的密码。另一种解决方案更好。
                【解决方案9】:

                如果您的本地仓库中没有标签,您可以删除远程标签而无需将其带到本地仓库。

                git ls-remote --tags --refs origin | cut -f2 | xargs git push origin --delete
                

                不要忘记将“origin”替换为您的远程处理程序名称。

                【讨论】:

                • 太棒了!这一口气将它们全部删除。另一个命令是每 2 秒删除一个
                【解决方案10】:

                你也可以使用:

                git tag -d $(git tag)
                

                【讨论】:

                • 如果您有很多标签,例如数千个,这将不起作用
                • 在这种情况下,您可以使用类似: git tag -d $(git tag | head -n 999) 并执行 x 次
                【解决方案11】:

                添加到 Stefan 的答案中缺少如何从远程删除标签。对于 windows powershell,您可以运行它来删除远程标签,然后是本地标签。

                git tag | foreach-object -process { git push origin --delete $_ }
                git tag | foreach-object -process { git tag -d $_ }  
                

                【讨论】:

                  【解决方案12】:

                  在一个命令中推送删除所有标签可能更有效。特别是如果你有几百个。

                  在合适的非windows shell中,删除所有远程标签:

                  git tag | xargs -L 1 | xargs git push origin --delete
                  

                  然后删除所有本地标签:

                  git tag | xargs -L 1 | xargs git tag --delete
                  

                  只要您的标签名称中没有',这应该没问题。为此,以下命令应该没问题。

                  git tag | xargs -I{} echo '"{}"' | tr \\n \\0 | xargs --null git push origin --delete
                  git tag | xargs -I{} echo '"{}"' | tr \\n \\0 | xargs --null git tag --delete
                  

                  可能存在其他获取行列表、将它们括在引号中、使它们成为单行然后将该行传递给命令的方法。考虑到这是终极的猫剥皮环境。

                  【讨论】:

                  • 我有几千个标签,从远程云存储库中逐个删除它们需要几天时间,这解决了。
                  • xargs -L 1 是做什么的?
                  • -L max-lines --max-lines[=max-lines] -l[max-lines] 每个命令行最多使用 max-lines 个非空白输入行。对于“-l”,如果省略,max-lines 默认为 1。对于“-L”,参数是强制性的。尾随空格导致输入行在逻辑上继续到下一个输入行,以计算行数。暗示“-x”。此选项的“-l”形式已弃用,取而代之的是符合 POSIX 的“-L”选项。 gnu.org/software/findutils/manual/html_node/find_html/…
                  • @RichardAQuadling 好的,但这对答案有什么影响? git tag 返回标签,每行一个,然后xargs -L 1 每行输出一个,那它有什么用呢?
                  • 嗯。在这种情况下似乎什么都没有!除了让事情变慢一点!
                  【解决方案13】:

                  对于使用 PowerShell 的 Windows 用户:

                  git tag | foreach-object -process { git tag -d $_ }
                  

                  这会删除git tag 返回的所有标签,方法是为返回的每一行执行git tag -d

                  【讨论】:

                    【解决方案14】:

                    Windows 用户:

                    这会通过运行 git tag 并将该列表提供给 git tag -d 来删除所有本地标签:

                    FOR /f "tokens=*" %a in ('git tag') DO git tag -d %a
                    

                    (发现于:https://gist.github.com/RandomArray/fdaa427878952d9768b0

                    【讨论】:

                      猜你喜欢
                      • 2015-09-18
                      • 1970-01-01
                      • 2020-01-15
                      • 2011-09-21
                      • 2012-07-17
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2021-05-24
                      相关资源
                      最近更新 更多