最近就有个鬼需求,需要在对项目模块下,获取指定子模块的在git中的当前分支。
先说一下多模块,我的这里以两个Springboot项目为例:ql-sample,ql-redis
1. ql-sample就是入口程序
2. ql-redis是一个子模块项目,关于连接redis的
我在主程序ql-sample中通过settings.gradle
//ql-sample和ql-redis处于同一目录下才可以这么用
includeFlat 'ql-redis'
这样就将 ql-redis引入进来了
现在我希望在 ql-redis中的build.gradle中,通过自定义方法获取ql-redis当前所属的git分支(因为是两个项目,git仓库也是分开的,ql-sample当前处于master分支上,ql-redis处于dev分支上)
最开始我想的比较简单,直接在ql-redis中的build.gradle中写个方法,执行一下git获取当前分支的命令不就可以了嘛,so easy!我随意去网上抄了一份代码
task gitBranch() {
def branch = ""
def proc = "git rev-parse --abbrev-ref HEAD".execute()
proc.in.eachLine { line -> branch = line }
proc.err.eachLine { line -> println line }
proc.waitFor()
println branch
}
本以为执行一下task,问题就迎刃而解,没想到
打印了一个master,卧槽,不会是我将ql-redis切换到master分支了吧,吓得我赶紧检查了一遍
没问题呀,就是dev,为啥会打印一个master???
百思不得其解!
尝试了许久,还是不行,我想着,我干脆读文件吧,每个项目下面都有个.git文件夹,里面肯定有相关的分支信息
看了一下,里面有个HEAD文件,里面的内容正合我意
最后的就是我想要的dev,我就又去网上抄了一份代码
task loadConfig() {
def config = new File("./.git/HEAD")
String content = ""
config.eachLine { line ->
content = line
}
def split = content.split("/")
println split[split.size()-1]
}
心想,这样总没问题了吧,可是
结果是令人绝望的,还是master。抓狂头秃有没有,明明ql-sample才是master分支,为啥在ql-redis的gradle里面会出现这种结果。
解决方案:
只要下面的代码才能正确获取
task loadConfig() {
def config = file("./.git/HEAD")
String content = ""
config.eachLine { line ->
content = line
}
def split = content.split("/")
println split[split.size()-1]
}
new File换为file
这样才能正常获取到当前分支
具体原因未知,猜想是当ql-sample引入ql-redis模块的时候,ql-redis的gradle已经被合并到ql-sample里面了,就会出现以上情况。