在PHP中显示当前的Git“版本”

huwehgph  于 2023-01-28  发布在  Git
关注(0)|答案(6)|浏览(173)

我想在我的网站上显示Git版本。
如何显示来自Git的语义版本号,以便网站的非技术用户在提出问题时可以轻松参考?

njthzxwz

njthzxwz1#

首先,使用一些git命令获取版本信息:

*提交哈希长

  • 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

其次,结合使用exec()和上面选择的git命令来构建版本标识符:

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)
jxct1oxe

jxct1oxe2#

如果你不想使用exec(),而是使用git lightweight(参见下面的注解)标记:
你可以从.git/HEAD.git/refs/heads/master得到当前的HEAD提交哈希值,然后循环查找匹配项。为了加快速度,首先反转数组,因为你更有可能找到最近的标签。
因此,如果当前php文件位于public_htmlwww文件夹下一级.git文件夹...

<?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';
y0u0uwnf

y0u0uwnf3#

要点: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;
  }

}
0x6upsns

0x6upsns4#

简单方法:

      • 短哈希**:$rev = exec('git rev-parse --short HEAD');
      • 完整哈希**:$rev = exec('git rev-parse HEAD');
qyyhg6bp

qyyhg6bp5#

我只是这样做:
substr(file_get_contents(GIT_DIR.'/refs/heads/master'),0,7)
资源友好,和我在eclipse下显示的一样

ie3xauqp

ie3xauqp6#

在终端中运行git tag预览您的标签,并说您得到了,即:

v1.0.0
v1.1.0
v1.2.4

这里是如何到获取这最新版本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"
  • 巧合的是 *(如果你的标签是有序的),由于exec只返回最后一行,我们可以这样做:
function getVersion() {
  return exec("git tag");
}
echo getVersion(); // "v1.2.4"

要获取所有行字符串,请使用shell_exec

function getVersions() {
  return shell_exec("git tag");
}
echo getVersions(); // "v1.0.0
                    // v1.1.0
                    // v1.2.4"

要获取数组:

$tagsArray = explode(PHP_EOL, shell_exec("git tag"));

要按日期对标记排序:

git tag --sort=committerdate

文档:git for each-ref #字段名称
为了便于排序,带有数值的字段按数值顺序排序(objectsize、authordate、committerdate、creatordate、taggerdate)。所有其他字段按字节值顺序排序。

相关问题