我有一个bash脚本,它接受一个分支名称(例如,"master"或"feature/foo")或提交哈希(例如"1234abcd")的字符串.
我已经检出了存储库,所以我可以调用git.
确定字符串是分支名称还是提交哈希的最佳方法是什么?
#!/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
Run Code Online (Sandbox Code Playgroud)
如果您想要一个强大的机制来告诉相对名称(例如,SHA1可能是一个左右提交命名分支),您可以使用git name-rev
它来解决它.
例子:
$ 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
Run Code Online (Sandbox Code Playgroud)
```
参考:Git Tips
您可以使用git show-ref
:
git show-ref --head | grep refs
Run Code Online (Sandbox Code Playgroud)
如果它为空,则它是 SHA1(或无效对象,这不好)。如果不是,则它是一个分支名称。
更好的技术来自“验证提交是否存在”,使用git merge-base
:
分支名称将产生不同的字符串(SHA1)
C:\Users\vonc\prog\b2d>git merge-base master master
de4accfd28c5f25fcc057d56996b83450be5dc60
Run Code Online (Sandbox Code Playgroud)
SHA1 将产生相同的结果(或至少以相同的结果开始):
C:\Users\vonc\prog\b2d>git merge-base 03949c3d3f88a378c6a08e57daa97059b52813f1 03949c3d3f88a378c6a08e57daa97059b52813f1
03949c3d3f88a378c6a08e57daa97059b52813f1
Run Code Online (Sandbox Code Playgroud)
foobar 将失败:
C:\Users\vonc\prog\b2d>git merge-base xxx xxx
fatal: Not a valid object name xxx
Run Code Online (Sandbox Code Playgroud)
这意味着:
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6029 次 |
最近记录: |