Usually you can use the POSIX api and use fork and wait and some I/O related functions for your purpose
fun main() {
    val childPid: pid_t = fork()
    if (childPid == 0) {
        val commands = listOf("git", "diff", "HEAD^1", "$projectDir/path/to/file", null)
        val cwd = "$projectDir"
        chdir(cwd)
        memScoped {
            execvp(commands[0], allocArrayOf(commands.map { it?.cstr?.ptr }))
        }
    } else {
        wait(null)
    }
}
Of course, this needs to deal with a lot of c-style code, so I also wrote a more practical library for this
repositories {
    mavenCentral()
}
// add dependencies into your native target sourceSet
dependencies {
    implementation("com.kgit2:kommand:1.0.1")
}
It is also very simple to use
fun main(args: Array<String>) {
    val diffResult = Command("git")
    .args("diff", "HEAD^1", "$projectDir/path/to/file")
    .cwd("$projectDir")
    .spawn()
    .output()
}