如何从 Git 提交哈希中获取所有符号名称?
How can I get all symbolic names from a Git commit hash?
如果一个Git commit hash 关联了多个标签and/or 是多个分支的头,有没有好的方法列出all其中?
我查看了 git name-rev
、git describe
和 git symbolic-ref
的选项,但没有找到任何似乎符合我要求的选项。令人沮丧的是,git name-rev
有一个 --tags
选项来列出 仅 标签,但没有明显的机制来仅列出分支(而且 git name-rev
似乎总是更喜欢标签反正我的分支)。
$ git checkout -b branch1
$ git checkout -b branch2
$ git tag tag1
$ git tag tag2
$ git name-rev HEAD
HEAD tags/tag1
$ git describe --all HEAD
HEAD tags/tag1
$ git symbolic-ref HEAD
refs/heads/branch2
要将提交哈希映射到它的所有符号名称,我需要 运行 git tag --list
和 git branch --all --list
然后 运行 git rev-parse
所有结果?
多亏了git for-each-ref
命令,应该可以实现你想要的:
git for-each-ref --points-at=HEAD
完成示例会话:
$ git init
$ touch a
$ git add a
$ git commit -m a
[master (root-commit) eb3222d] a
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 a
$ git checkout -b branch1
Switched to a new branch 'branch1'
$ git checkout -b branch2
Switched to a new branch 'branch2'
$ git tag tag1
$ git tag tag2
$ git tag -a tag3 -m "annotated tag"
$ git for-each-ref --points-at=HEAD
eb3222db1821633a54ccd0a6434e883c4cb71b98 commit refs/heads/branch1
eb3222db1821633a54ccd0a6434e883c4cb71b98 commit refs/heads/branch2
eb3222db1821633a54ccd0a6434e883c4cb71b98 commit refs/heads/master
eb3222db1821633a54ccd0a6434e883c4cb71b98 commit refs/tags/tag1
eb3222db1821633a54ccd0a6434e883c4cb71b98 commit refs/tags/tag2
0dbba96f519c2ad1b470f97171230004addff896 tag refs/tags/tag3
我发现通常 git log
会显示我要查找的所有名称。查看 git log
的格式选项,我也可以使用:
$ git log --format='%d -1 HEAD
(HEAD -> branch2, tag: tag2, tag: tag1, branch1)
虽然 的输出格式可能更容易处理,所以这可能是我最终会使用的格式。
如果一个Git commit hash 关联了多个标签and/or 是多个分支的头,有没有好的方法列出all其中?
我查看了 git name-rev
、git describe
和 git symbolic-ref
的选项,但没有找到任何似乎符合我要求的选项。令人沮丧的是,git name-rev
有一个 --tags
选项来列出 仅 标签,但没有明显的机制来仅列出分支(而且 git name-rev
似乎总是更喜欢标签反正我的分支)。
$ git checkout -b branch1
$ git checkout -b branch2
$ git tag tag1
$ git tag tag2
$ git name-rev HEAD
HEAD tags/tag1
$ git describe --all HEAD
HEAD tags/tag1
$ git symbolic-ref HEAD
refs/heads/branch2
要将提交哈希映射到它的所有符号名称,我需要 运行 git tag --list
和 git branch --all --list
然后 运行 git rev-parse
所有结果?
多亏了git for-each-ref
命令,应该可以实现你想要的:
git for-each-ref --points-at=HEAD
完成示例会话:
$ git init
$ touch a
$ git add a
$ git commit -m a
[master (root-commit) eb3222d] a
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 a
$ git checkout -b branch1
Switched to a new branch 'branch1'
$ git checkout -b branch2
Switched to a new branch 'branch2'
$ git tag tag1
$ git tag tag2
$ git tag -a tag3 -m "annotated tag"
$ git for-each-ref --points-at=HEAD
eb3222db1821633a54ccd0a6434e883c4cb71b98 commit refs/heads/branch1
eb3222db1821633a54ccd0a6434e883c4cb71b98 commit refs/heads/branch2
eb3222db1821633a54ccd0a6434e883c4cb71b98 commit refs/heads/master
eb3222db1821633a54ccd0a6434e883c4cb71b98 commit refs/tags/tag1
eb3222db1821633a54ccd0a6434e883c4cb71b98 commit refs/tags/tag2
0dbba96f519c2ad1b470f97171230004addff896 tag refs/tags/tag3
我发现通常 git log
会显示我要查找的所有名称。查看 git log
的格式选项,我也可以使用:
$ git log --format='%d -1 HEAD
(HEAD -> branch2, tag: tag2, tag: tag1, branch1)
虽然