在具有多个标签的提交中显示最新标签

Display latest tag in a commit with multiple tags

我有一个大型项目的脚本,有 10 个存储库,用于检查分支(本地、远程或标签)并最终显示每个存储库中的当前分支。

我使用git branch来显示当前版本库中签出的分支或标签。这在大多数情况下工作正常,除非在同一个提交中有多个标签,导致打印该提交中的标签的随机标签。

我该如何解决这个问题?我应该以不同的方式实施它吗?

例子

for repo in ...
do
  cd repo
  git checkout  || git checkout  || git checkout  ....
  git branch ##(to verify what happened)
done

所以假设我 运行 ./checkoutAll feat1 origin/feat1 tags/ALL7 但是 ALL7 标记与 ALL6 在同一提交中, git branch 显示 ALL6 而不是我特别要求结帐的 ALL7

编辑:下图是为了帮助那些试图帮助我的人,

那么,假设我 运行 git checkout tags/V9.00.00.ALL.04 然后 git 分支显示存在的随机标签 (* detached from ..),在此示例中为 7。 有没有办法显示最新的?或者至少显示我要求它结帐的那个(即使 ALL7 与 ALL9 相同)?

不,没有办法:git并不总是有你在分支机构的想法;如果您签出单个提交,例如通过签出标签,你不在一个分支上,因此,git 无法告诉你你在哪个分支上。

据我所知,git 分支应该始终打印当前分支的名称,如果你在其中的话。

不清楚你想在哪里显示这些标签,但让我试着帮助你。

首先,让我们找到当前分支的最新提交哈希:

git rev-parse HEAD

然后,让我们找到所有标签:

git show-ref --tags --dereference

既然我们都有,我们可以将它们与 print/show 您的要求进行匹配。例如:

SHA_HEAD=$(git rev-parse HEAD)
ALL_TAGS=$(git show-ref --tags --dereference)
echo "$ALL_TAGS" | awk '/'$SHA_HEAD' refs\/tags\// { print  }' | tr '\n' ' '

或者在一行中:

git show-ref --tags --dereference | awk '/'$(git rev-parse HEAD)' refs\/tags\// { print  }' | tr '\n' ' '

签出标签时,通常会以 "headless" 签出,git branch 会说:

$ git branch
* (detached from TAG)

如果你想知道这个标签是哪个分支 "on",你可以检查你标记的 ref 是否是你的 repo 已知的任何分支的祖先。使用

$ git branch --contains TAG  # (or HEAD)

您通常会得到多个候选人,因为放置标签后可能会创建任意数量的分支。 "the" 分支由您决定。

如果您想查看所有指向您当前结帐参考的标签,请使用:

$ git tag --points-at TAG  # (or HEAD)

要查看所有符号引用,请使用

$ git log --oneline --decorate -1