neu*_*242 44 git bash branch jenkins travis-ci
我可以通过执行以下任一操作找到当前的git分支名称:
git branch | awk '/^\*/ { print $2 }'
git describe --contains --all HEAD
Run Code Online (Sandbox Code Playgroud)
但是当处于分离的HEAD状态时,例如在Jenkins maven构建中的后构建阶段(或在Travis git fetch中),这些命令不起作用.
我目前的工作解决方案是:
git show-ref | grep $(git log --pretty=%h -1) | sed 's|.*/\(.*\)|\1|' | sort -u | grep -v HEAD
Run Code Online (Sandbox Code Playgroud)
它显示在其HEAD提示上具有最后一次提交的任何分支名称.这很好,但我觉得有一个强大的git-fu的人可能有一个更漂亮的解决方案?
Cas*_*bel 42
更多瓷器方式:
git log -n 1 --pretty=%d HEAD
# or equivalently:
git show -s --pretty=%d HEAD
Run Code Online (Sandbox Code Playgroud)
refs将以格式列出(HEAD, master)- 如果您打算在脚本中使用它而不是供人类使用,则必须稍微解析它.
你也可以自己更干净地实现它:
git for-each-ref --format='%(objectname) %(refname:short)' refs/heads | awk "/^$(git rev-parse HEAD)/ {print \$2}"
Run Code Online (Sandbox Code Playgroud)
有利于将候选人引用在单独的行上,没有额外的字符.
Epe*_*eli 28
我需要一个与Jenkins不同的解决方案,因为它没有分支的本地副本.因此,当前提交必须与远程分支匹配:
git ls-remote --heads origin | grep $(git rev-parse HEAD) | cut -d / -f 3
Run Code Online (Sandbox Code Playgroud)
或没有网络:
git branch --remote --verbose --no-abbrev --contains | sed -rne 's/^[^\/]*\/([^\ ]+).*$/\1/p'
Run Code Online (Sandbox Code Playgroud)
还值得注意的是,当您在同一次提交时有多个分支头时,这可能会返回多个分支名称.
更新:
我刚刚注意到Jenkins设置了GIT_BRANCH包含类似值的环境变量origin/master.这也可以用来获取Jenksin中的git分支:
echo $GIT_BRANCH | cut -d / -f 2
Run Code Online (Sandbox Code Playgroud)
git branch --contains HEAD
Run Code Online (Sandbox Code Playgroud)
显然丢弃(没有分支).当然,您可以获得任意数量的分支,这些分支可以描述当前的HEAD(当然包括没有取决于您如何进入无分支),这些分支可能已快速合并到本地分支中(许多充分理由之一)为什么你应该总是使用git merge --no-ff).
一个sed办法:
git log -1 --pretty=%D HEAD | sed 's/.*origin\///g;s/, .*//g'
Run Code Online (Sandbox Code Playgroud)
这用于log检查最后一个项目是否存在于分支上。然后sed找到前面的分支origin/并删除该短语及其前面的所有内容。然后sed再次删除任何可能的附加列出的分支(逗号及其后的所有内容)。最后的原因log被用作健全性检查,以确保这个分离的 HEAD 不是已知分支 HEAD 之上的提交。
如果这是空的,则可以实现故障安全逻辑来将分支标记为“分离”(或“未定义”?)或确保它是最新的或回滚到已知 HEAD 的尖端。
| 归档时间: |
|
| 查看次数: |
15501 次 |
| 最近记录: |