23

我正在编写一个将我的应用程序部署到服务器的任务。但是,我希望仅当我当前的 git 分支是主分支时才运行此任务。如何获取当前的 git 分支?

gradle-git方法:

我知道有一个gradle-git 插件getWorkingBranch()在任务下有一个方法GitBranchList,但是任何时候我尝试执行

task getBranchName(type: GitBranchList) {
   print getWorkingBranch().name
}

我收到“任务尚未执行”错误。我查看了源代码,当没有设置分支时它会抛出该错误。这是否意味着这种方法并不像我认为的那样做?我需要在某个地方设置分支吗?

4

3 回答 3

47

您也可以在git branch name没有插件的情况下获得。

def 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()
    branch
}

参考:Gradle & GIT : How to map your branch to a deployment profile

于 2016-04-21T05:05:06.663 回答
19

不,这并不意味着没有设置分支。这意味着该任务还没有真正执行。您要做的是在配置闭包中调用一个方法,而您可能希望在任务执行后调用它。尝试将您的任务更改为:

task getBranchName(type: GitBranchList) << {
    print getWorkingBranch().name
}

随着<<您添加一个 doLast,它将在任务执行后执行。

于 2013-02-25T08:21:53.150 回答
1

这基本上是@Song Bi 的答案,但在kotlin DSL 中(受此线程启发):

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.io.ByteArrayOutputStream


/**
 * Utility function to retrieve the name of the current git branch.
 * Will not work if build tool detaches head after checkout, which some do!
 */
fun gitBranch(): String {
    return try {
        val byteOut = ByteArrayOutputStream()
        project.exec {
            commandLine = "git rev-parse --abbrev-ref HEAD".split(" ")
            standardOutput = byteOut
        }
        String(byteOut.toByteArray()).trim().also {
            if (it == "HEAD")
                logger.warn("Unable to determine current branch: Project is checked out with detached head!")
        }
    } catch (e: Exception) {
        logger.warn("Unable to determine current branch: ${e.message}")
        "Unknown Branch"
    }
}
于 2021-08-11T13:59:41.783 回答