Git 在包含多个标记的提交中显示最新标记

Git 在包含多个标记的提交中显示最新标记,git,git-tag,Git,Git Tag,我有一个大型项目的脚本,十个存储库,用于签出分支(本地、远程或标记),并最终显示每个分支在每个存储库中的当前位置 我使用git branch显示在当前存储库中签出的分支或标记。除了在同一个提交中有多个标记外,这在大多数情况下都可以正常工作,从而打印该提交中的标记的随机标记 我怎样才能解决这个问题?我应该以不同的方式实现它吗 范例 for repo in ... do cd repo git checkout $1 || git checkout $2 || git checkout $3

我有一个大型项目的脚本,十个存储库,用于签出分支(本地、远程或标记),并最终显示每个分支在每个存储库中的当前位置

我使用
git branch
显示在当前存储库中签出的分支或标记。除了在同一个提交中有多个标记外,这在大多数情况下都可以正常工作,从而打印该提交中的标记的随机标记

我怎样才能解决这个问题?我应该以不同的方式实现它吗

范例

for repo in ...
do
  cd repo
  git checkout $1 || git checkout $2 || git checkout $3 ....
  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 branch显示一个随机标记(
*从..
分离),在本例中为7。
有没有办法显示最新的?或者至少显示我让它签出的一个(即使ALL7与ALL9相同)?

不,没有办法:git并不总是认为你在一个分支上;如果您签出一个提交,例如签出一个标记,那么您不在分支上,因此git无法告诉您在哪个分支上


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

不清楚您想在哪里显示这些标记,但让我来帮助您

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

git rev-parse HEAD
然后,让我们查找所有标记:

git show-ref --tags --dereference
既然我们都有了,我们可以将它们匹配起来打印/显示您的要求。例如:

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

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

当您签出标记时,通常会以“无头”签出结束,
git branch
会说:

$ git branch
* (detached from TAG)
如果您想知道该标记“在”哪个分支上,您可以检查标记的ref是否是回购协议已知的任何分支的祖先。使用

$ git branch --contains TAG  # (or HEAD)
您通常会得到多个候选项,因为在放置标记后可以创建任意数量的分支。这将由您决定哪一个是“分支”

如果要查看指向当前签出参考的所有标记,请使用:

$ git tag --points-at TAG  # (or HEAD)
要查看所有符号参照,请使用

$ git log --oneline --decorate -1

当然,这将只显示为当前提交创建的标记。我不确定这是否是OP想要的。哇,太好了,我在你回答之前编辑了这个问题。