2013-05-02 145 views
6

我想在我的网站上显示git版本号。我想在我的网站上显示git版本

我发现它是一个提交散列,这不适合非技术用户参考。

我创建了这个类来显示当前git的版本号。

+5

所以,你现在想与世界分享?然后你应该分解这个:制定你的问题,然后离开决议作为答案。见http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ – hakre 2013-05-02 09:16:24

+0

['git describe'](https://www.kernel.org /pub/software/scm/git/docs/git-describe.html)与[标签](http://git-scm.com/book/en/Git-Basics-Tagging)一起使用会更有意义。 – Joe 2013-05-02 13:59:34

+0

而不是rev​​-list HEAD管道到头,只需使用'git rev-parse HEAD' – 2013-05-02 16:18:12

回答

14

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

} 
+3

所以你的版本号只是计数提交。如果你从不使用任何分支和合并,这将工作得很好。如果有任何分支,数字不一定唯一标识一次提交。可以试着用点符号来解决这个问题。例如。 4.1.5表示从4根提交后,取第一个分支并提前5个提交。这就要求分支是按例如通过承诺时间。 Git不保证新的提交有更新的提交时间,你需要通过你的程序来保证。编码这样的编号方案需要更多的工作。 – 2013-05-03 14:19:07

+0

其实第一个分支是默认分支。 (有些VCS会把它称为trunk,但是在git中,一切都是分支)。因此,在提交4之后,第一个分支中的提交将是编号5.如果分支由提交4构成,它将成为第二个分支。第二个分支中的第一个提交当然是4.1.1。所以第一个分支并不反映在编号中,它是默认的。第n个分支在编号中显示为n-1。 – 2013-05-03 14:29:50

+0

实际上,一个git树可以有多个根。也许不是一个很常见的情况,但是对于一个通用的解决方案,人们需要指出从哪个根开始。在这种情况下,第一个根不能像第一个分支那样优雅地隐藏起来,或者您需要用字母指定第二个根。 – 2013-05-03 15:26:32

29

首先,一些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:m:s')); 
    } 
} 

// Usage: echo 'MyApplication ' . ApplicationVersion::get(); 

// MyApplication v1.2.3-dev.474a1d0 (2016-11-02 14:11:22) 
+0

更好的解决方案!非常感谢! – 2017-12-22 10:26:46

1

简单的方法:

  • 短哈希$rev = exec('git rev-parse --short HEAD');
  • 完整的哈希值$rev = exec('git rev-parse HEAD');
相关问题