Reputation: 1242
I want to display the Git version on my site.
How can I display a semantic version number from Git, that non-technical users of a site can easily reference when raising issues?
Upvotes: 30
Views: 34376
Reputation: 41796
Firstly, some git
commands to fetch version information:
git log --pretty="%H" -n1 HEAD
git log --pretty="%h" -n1 HEAD
git log --pretty="%ci" -n1 HEAD
git describe --tags --abbrev=0
git describe --tags
Secondly, use exec()
combined with the git commands of your choice from above to build the version identifier:
class ApplicationVersion
{
const MAJOR = 1;
const MINOR = 2;
const PATCH = 3;
public static function get()
{
$commitHash = trim(exec('git log --pretty="%h" -n1 HEAD'));
$commitDate = new \DateTime(trim(exec('git log -n1 --pretty=%ci HEAD')));
$commitDate->setTimezone(new \DateTimeZone('UTC'));
return sprintf('v%s.%s.%s-dev.%s (%s)', self::MAJOR, self::MINOR, self::PATCH, $commitHash, $commitDate->format('Y-m-d H:i:s'));
}
}
// Usage: echo 'MyApplication ' . ApplicationVersion::get();
// MyApplication v1.2.3-dev.b576fd7 (2016-11-02 14:11:22)
Please note that on a production system, PHP's exec
is often in the list of disabled_functions
, and git
may not be available. The code from above might then become part of your build scripts. This enables you to versionize the application during the build stage (e.g., on a development container with git
and PHP's exec
) and deploy it with static version strings to production.
Upvotes: 69
Reputation: 2454
public function getTagVersion()
{
$files = glob($this->projectDir.'/.git/refs/tags/*');
return basename(end($files));
}
Upvotes: 1
Reputation: 2971
If you'd like to do it without exec()
and you're using git lightweight (see comments below) tagging:
You can get the current HEAD commit hash from .git/HEAD
or .git/refs/heads/master
. We then loop to find matching. Reversing the array first for speed because you're more likely to at a higher recent tag.
So if the current php file sits in a public_html
or www
folder one level down from the .git
folder...
<?php
$HEAD_hash = trim(file_get_contents('../.git/refs/heads/master')); // or branch x
$files = glob('../.git/refs/tags/*');
foreach(array_reverse($files) as $file) {
$contents = trim(file_get_contents($file));
if($HEAD_hash === $contents)
{
print 'Current tag is ' . basename($file);
exit;
}
}
print 'No matching tag';
Upvotes: 18
Reputation: 206628
Run git tag
in terminal to preview your tags and say you got i.e:
v1.0.0
v1.1.0
v1.2.4
here's how to get the latest version v1.2.4
function getVersion() {
$hash = exec("git rev-list --tags --max-count=1");
return exec("git describe --tags $hash");
}
echo getVersion(); // "v1.2.4"
Coincidentally (if your tags are ordered), since exec
returns only the last row we could just do:
function getVersion() {
return exec("git tag");
}
echo getVersion(); // "v1.2.4"
To get all the rows string use shell_exec
:
function getVersions() {
return shell_exec("git tag");
}
echo getVersions(); // "v1.0.0
// v1.1.0
// v1.2.4"
To get an Array:
$tagsArray = explode(PHP_EOL, shell_exec("git tag"));
To sort tags by date:
git tag --sort=committerdate
Docs: git-for-each-ref#_field_names
For sorting purposes, fields with numeric values sort in numeric order (objectsize, authordate, committerdate, creatordate, taggerdate). All other fields are used to sort in their byte-value order.
Upvotes: 0
Reputation: 126
I did it just as:
substr(file_get_contents(GIT_DIR.'/refs/heads/master'),0,7)
resource friendly and the same as i have under eclipse shown
Upvotes: 5
Reputation: 974
Simple way:
$rev = exec('git rev-parse --short HEAD');
$rev = exec('git rev-parse HEAD');
Upvotes: 4
Reputation: 1242
Gist: https://gist.github.com/lukeoliff/5501074
<?php
class QuickGit {
public static function version() {
exec('git describe --always',$version_mini_hash);
exec('git rev-list HEAD | wc -l',$version_number);
exec('git log -1',$line);
$version['short'] = "v1.".trim($version_number[0]).".".$version_mini_hash[0];
$version['full'] = "v1.".trim($version_number[0]).".$version_mini_hash[0] (".str_replace('commit ','',$line[0]).")";
return $version;
}
}
Upvotes: 13