git:列出悬吊标签

时间:2018-07-31 13:45:08

标签: git git-branch git-log git-tag git-commands

上下文:

  • 假设您有一些相当依赖git标签的CI / CD工作流程
  • 构建功能分支并生成一些短暂的标签,以表示产生可部署工件的提交
  • 要素分支被壁球合并时,通常会被删除,但是,毫无疑问,标签可以生存
  • 例如,经过几个月的开发,标签列表可预测地变得多毛

因此,问题:

我将如何使用git命令行以及可选的基本bash工具

  1. 列出所有给定标签可达的分支(对偶是git tag -l --merged ${BRANCH_COMMITTISH},但我不需要给定分支的标签,而需要给定标签的分支)
  2. 列出所有从上面的点1输出为空的标签(显然,这对于for循环(鉴于1的任何终止实现)都是可行的),但是也许有些整洁的git one-liner )?

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

git log --simplify-by-decoration --tags --not --branches --remotes --pretty=%d

--simplify-by-decoration仅表示显示血统所需的最低要求(通常将其与--graph一起使用)。 --tags --not --branches --remotes说得好:列出分支或远程历史中没有的标签历史,即任何分支或远程跟踪分支都无法访问的标签。 --pretty=%d说只要显示裁判。

答案 2 :(得分:0)

仅举例说明到目前为止我所看到的所有解决方案:

~$ git init dangling_tags
Initialized empty Git repository in ~/dangling_tags/.git/
$ cd dangling_tags/
~/dangling_tags$ touch a.txt && git add a.txt && git commit -m a
[master (root-commit) f1b1070] a
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a.txt
~/dangling_tags$ git tag a
~/dangling_tags$ git checkout -b feature/add_some_tags
Switched to a new branch 'feature/add_some_tags'
~/dangling_tags$ touch b.txt && git add b.txt && git commit -m b 
[feature/add_some_tags 1871cde] b
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 b.txt
~/dangling_tags$ git tag b
~/dangling_tags$ touch c.txt && git add c.txt && git commit -m c 
[feature/add_some_tags 26f6611] c
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 c.txt
~/dangling_tags$ git tag c
~/dangling_tags$ git checkout master
Switched to branch 'master'
~/dangling_tags$ git merge --squash feature/add_some_tags 
Updating f1b1070..26f6611
Fast-forward
Squash commit -- not updating HEAD
 b.txt | 0
 c.txt | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 b.txt
 create mode 100644 c.txt
~/dangling_tags$ git commit
[master 99b33ae] Squashed commit of the following:
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 b.txt
 create mode 100644 c.txt
~/dangling_tags$ git branch --contains a
* master
~/dangling_tags$ git branch --contains b
  feature/add_some_tags 
~/dangling_tags$ git branch -D feature/add_some_tags 
Deleted branch feature/add_some_tags (was 26f6611).
~/dangling_tags$ git tag
a
b
c
~/dangling_tags$ git branch --contains a
* master
~/dangling_tags$ git branch --contains b
~/dangling_tags$ for t in $(git tag); do if test "$(git branch --contains $t | wc -l)" == "0" ; then echo $t; fi done
b
c
~/dangling_tags$ git log --simplify-by-decoration --tags --not --branches --remotes --pretty=%d
 (tag: c)
 (tag: b)