How to tell git branch name from commit hash?
我有一个bash脚本,它接受一个分支名称(例如"master"或"feature/foo")或提交哈希(例如"1234abcd")的字符串。
我已经签出了存储库,所以我可以调用Git。
确定字符串是分支名称还是提交哈希的最佳方法是什么?
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash commit_or_branch="$1" cd /path/to/my_repo git fetch if <is_branch $commit_or_branch> then echo"it's a branch" else echo"it's a commit" fi |
如果您想要一个强大的机制来告诉相关名称(例如,您sha1可能是一个命名分支后面的一个或多个提交),您可以使用
实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ git config remote.upstream.url https://github.com/RobotLocomotion/drake.git $ git log --oneline -n 5 7530a95 Merge pull request #5743 from soonho-tri/pr-reformat-mathematical_program ebc8f25 Suppresses console output of speed_bump.obj genrule. (#5726) d8b9a0b Merge pull request #5735 from david-german-tri/namespaces 79e10e8 Remove redundant 'symbolic::' prefix from mathematical_program code b68b590 Clean up mathematical_program code by adding using std::* $ git name-rev HEAD HEAD master $ git name-rev 79e10e8 79e10e8 master^2 $ git name-rev HEAD~20 HEAD~20 remotes/origin/issue/5646_return_binding~3 |
` `
参考:Git Tips
您可以使用
1 | git show-ref --head | grep refs |
如果它是空的,那么它是一个sha1(或者一个无效的对象,这是不好的)。如果不是,它是一个分支名称。
更好的技术来自"验证是否存在提交",使用
分支名称将产生不同的字符串(sha1)
1 2 | C:\Users\vonc\prog\b2d>git merge-base master master de4accfd28c5f25fcc057d56996b83450be5dc60 |
sha1将产生相同的结果(或至少以相同的结果开始):
1 2 | C:\Users\vonc\prog\b2d>git merge-base 03949c3d3f88a378c6a08e57daa97059b52813f1 03949c3d3f88a378c6a08e57daa97059b52813f1 03949c3d3f88a378c6a08e57daa97059b52813f1 |
foobar将失败:
1 2 | C:\Users\vonc\prog\b2d>git merge-base xxx xxx fatal: Not a valid object name xxx |
这意味着:
1 2 3 4 5 6 7 8 9 | if [[ git merge-base $string $string ]]; then if [[ $(git merge-base $string $string) == $string* ]]; then echo"SHA1" else echo"branch" fi else echo"Not a valid object name '$string'" fi |
IMO您不能可靠地检查这个,因为哈希也是一个有效的分支名称。尝试:
1 | git checkout -b 0c8158f47d7dda89226d4e816fee1fb9ac6c1204 |
这意味着可能存在这样一种情况:具有该名称的分支存在,但也存在提交。
因为您可以向大多数git命令传递分支名称或提交,所以不需要区分它们。
正如@vonc和@hek2mgl所提到的,这可能不是一个或另一个测试。您可以将脚本稍微修改为类似这样的内容(从这里借用,所以回答:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/bin/bash commit_or_branch="$1" cd /path/to/my_repo git fetch if git branch | grep $commit_or_branch 2> /dev/null then echo"it's a branch" fi if git cat-file -e $commit_or_branch 2> /dev/null then echo"it's a commit" fi |
注意,这只测试本地分支。如果您对远程分支感兴趣,请参阅本文。