我有一个大型项目的脚本,十个存储库,用于检出分支(本地,远程或标记),并最终显示每个存储库中每个存储库的当前分支。
我使用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显示存在的随机标记(* detached from ..
),在本例中为7。
有没有办法显示最新的?或至少显示我要求结账的那个(即使ALL7与ALL9相同)?
答案 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应始终打印当前分支机构的名称(如果您是其中之一)。