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

时间:2015-09-23 16:49:28

标签: git git-tag

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

我使用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

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

enter image description here

所以,我们说我跑git checkout tags/V9.00.00.ALL.04 然后git branch显示存在的随机标记(* detached from ..),在本例中为7。 有没有办法显示最新的?或至少显示我要求结账的那个(即使ALL7与ALL9相同)?

3 个答案:

答案 0 :(得分:3)

目前尚不清楚您要在哪里展示这些标签,但让我试着帮助您。

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

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' ' '

答案 1 :(得分:2)

当你签出一个标签时,你通常会得到一个"无头"结帐时,git branch会说:

$ git branch
* (detached from TAG)

如果你想知道这个标签是哪个分支"在"上,你可以检查你的标记引用是否是你的仓库已知的任何分支的祖先。使用

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

您通常会获得多个候选人,因为在放置标记后可能会创建任意数量的分支。你可以决定哪一个是""分支。

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

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

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

$ git log --oneline --decorate -1

答案 2 :(得分:1)

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

据我所知,git branch应始终打印当前分支机构的名称(如果您是其中之一)。