-
-
Save JonasGroeger/7620911 to your computer and use it in GitHub Desktop.
| def getCheckedOutGitCommitHash() { | |
| def gitFolder = "$projectDir/.git/" | |
| def takeFromHash = 12 | |
| /* | |
| * '.git/HEAD' contains either | |
| * in case of detached head: the currently checked out commit hash | |
| * otherwise: a reference to a file containing the current commit hash | |
| */ | |
| def head = new File(gitFolder + "HEAD").text.split(":") // .git/HEAD | |
| def isCommit = head.length == 1 // e5a7c79edabbf7dd39888442df081b1c9d8e88fd | |
| // def isRef = head.length > 1 // ref: refs/heads/master | |
| if(isCommit) return head[0].trim().take(takeFromHash) // e5a7c79edabb | |
| def refHead = new File(gitFolder + head[1].trim()) // .git/refs/heads/master | |
| refHead.text.trim().take takeFromHash | |
| } | |
| // You can also use it somewhere else, not just in jar files. | |
| jar { | |
| // ... | |
| classifier = getCheckedOutGitCommitHash() | |
| // ... | |
| } |
That function is when you do not have git executable in your path. If you do have git in your path, you can use this instead:
def getCheckedOutGitCommitHash() {
'git rev-parse --verify --short HEAD'.execute().text.trim()
}
Same functionality, no?
After a while refs/heads/ folder is empty because git will pack them into packed-refs file. So this script work only for small unpacked git repository.
This is awesome, thanks so much for sharing!
You can use grgit as a plugin to support packed-refs as mentioned:
plugins {
id 'org.ajoberstar.grgit' version '4.1.0'
}
def getCheckedOutGitCommitHash() {
grgit.head().abbreviatedId
}
// You can also use it somewhere else, not just in jar files.
jar {
// ...
classifier = getCheckedOutGitCommitHash()
// ...
}Looks very nice. One detail one may need to account for is the exact location of the .git directory:
Higher level SCMs may provide and manage additional information in the
$GIT_DIR.
Then there also could be a .git file vs. directory:
Note: Also you can have a plain text file
.gitat the root of your working tree, containinggitdir: <path>to point at the real directory that has the repository. This mechanism is often used for a working tree of a submodule checkout...
Googled to this beautiful script, thanks a lot @JonasGroeger!
Nice piece, thank you for sharing at https://discuss.gradle.org/t/how-can-i-store-the-git-revision-for-use-in-the-project/6496/3, best wishes.