如何在我的开发网站的页面顶部显示当前的git分支名称?

时间:2011-09-16 16:01:51

标签: php git

这是我的情况:

我使用MAMP(PHP)在我的Mac上本地开发。我的网站受Git版本控制,我将我的开发服务器指向磁盘上版本控制下的站点根目录。

File structure:
--mysitehere/
---.git/ (.git folder is here versioning everything below)
---src/ (<-- web server root)
----index.php (need the codez here for displaying current git branch)

任何人都有我可以使用的示例代码,它在.git文件夹中查看并查看当前分支是什么,并将其输出到index.php页面(以及RoR dev的ruby解决方案)?当我切换分支时,这将非常有用,,当我刷新时,在我的浏览器中,我看到我会在页面顶部的'master'或'your-topic-branch-name-here'

我愿意使用以PHP编程方式访问git的第三方库,或者从.git中的磁盘上的文件中获取正确“当前分支”变量的东西。

9 个答案:

答案 0 :(得分:47)

这适用于PHP,包括它在我的网站顶部:

/**
 * @filename: currentgitbranch.php
 * @usage: Include this file after the '<body>' tag in your project
 * @author Kevin Ridgway 
 */
    $stringfromfile = file('.git/HEAD', FILE_USE_INCLUDE_PATH);

    $firstLine = $stringfromfile[0]; //get the string from the array

    $explodedstring = explode("/", $firstLine, 3); //seperate out by the "/" in the string

    $branchname = $explodedstring[2]; //get the one that is always the branch name

    echo "<div style='clear: both; width: 100%; font-size: 14px; font-family: Helvetica; color: #30121d; background: #bcbf77; padding: 20px; text-align: center;'>Current branch: <span style='color:#fff; font-weight: bold; text-transform: uppercase;'>" . $branchname . "</span></div>"; //show it on the page

答案 1 :(得分:6)

我使用这个功能:

protected function getGitBranch()
{
    $shellOutput = [];
    exec('git branch | ' . "grep ' * '", $shellOutput);
    foreach ($shellOutput as $line) {
        if (strpos($line, '* ') !== false) {
            return trim(strtolower(str_replace('* ', '', $line)));
        }
    }
    return null;
}

答案 2 :(得分:4)

分支,上次提交日期和哈希

<?php 
    $gitBasePath = '.git'; // e.g in laravel: base_path().'/.git';

    $gitStr = file_get_contents($gitBasePath.'/HEAD');
    $gitBranchName = rtrim(preg_replace("/(.*?\/){2}/", '', $gitStr));                                                                                            
    $gitPathBranch = $gitBasePath.'/refs/heads/'.$gitBranchName;
    $gitHash = file_get_contents($gitPathBranch);
    $gitDate = date(DATE_ATOM, filemtime($gitPathBranch));

    echo "version date: ".$gitDate."<br>branch: ".$gitBranchName."<br> commit: ".$gitHash;                                                       
?>

示例输出:

  

版本日期:2018-10-31T23:52:49 + 01:00

     

分支:开发

     

提交:2a52054ef38ba4b76d2c14850fa81ceb25847bab

文件refs/heads/your_branch的修改日期是(可接受的)上次提交日期的近似值(尤其是在测试/临时环境中,我们假设我们将部署新的提交(没有旧的提交))。

答案 3 :(得分:3)

PHP中的简单方法:

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

答案 4 :(得分:2)

为了扩展program247365's answer,我为此编写了一个帮助类,这对使用Git Flow的人也很有用。

class GitBranch
{
    /**
     * @var string
     */
    private $branch;

    const MASTER = 'master';
    const DEVELOP = 'develop';

    const HOTFIX = 'hotfix';
    const FEATURE = 'feature';

    /**
     * @param \SplFileObject $gitHeadFile
     */
    public function __construct(\SplFileObject $gitHeadFile)
    {
        $ref = explode("/", $gitHeadFile->current(), 3);

        $this->branch = rtrim($ref[2]);
    }

    /**
     * @param string $dir
     *
     * @return static
     */
    public static function createFromGitRootDir($dir)
    {
        try {
            $gitHeadFile = new \SplFileObject($dir.'/.git/HEAD', 'r');
        } catch (\RuntimeException $e) {
            throw new \RuntimeException(sprintf('Directory "%s" is not a Git repository.', $dir));
        }

        return new static($gitHeadFile);
    }

    /**
     * @return string
     */
    public function getName()
    {
        return $this->branch;
    }

    /**
     * @return boolean
     */
    public function isBasedOnMaster()
    {
        return $this->getFlowType() === self::HOTFIX || $this->getFlowType() === self::MASTER;
    }

    /**
     * @return boolean
     */
    public function isBasedOnDevelop()
    {
        return $this->getFlowType() === self::FEATURE || $this->getFlowType() === self::DEVELOP;
    }

    /**
     * @return string
     */
    private function getFlowType()
    {
        $name = explode('/', $this->branch);

        return $name[0];
    }
}

您可以像以下一样使用它:

echo GitBranch::createFromGitRootDir(__DIR__)->getName();

答案 5 :(得分:1)

PHP中的Git库(GLIP)是一个用于与Git存储库交互的PHP库。它不需要在您的服务器上安装Git,可以在GitHub上找到。

答案 6 :(得分:0)

如果你在repo的任何子目录中,那么

快速和脏选项:

$dir = __DIR__;
exec( "cd '$dir'; git br", $lines );
$branch = '';
foreach ( $lines as $line ) {
    if ( strpos( $line, '*' ) === 0 ) {
        $branch = ltrim( $line, '* ' );
        break;
    }
}

答案 7 :(得分:0)

要点:https://gist.github.com/reiaguilera/82d164c7211e299d63ac

<?php
// forked from lukeoliff/QuickGit.php

class QuickGit {
  private $version;

  function __construct() {
    exec('git describe --always',$version_mini_hash);
    exec('git rev-list HEAD | wc -l',$version_number);
    exec('git log -1',$line);
    $this->version['short'] = "v1.".trim($version_number[0]).".".$version_mini_hash[0];
    $this->version['full'] = "v1.".trim($version_number[0]).".$version_mini_hash[0] (".str_replace('commit ','',$line[0]).")";
  }

  public function output() {
    return $this->version;
  }

  public function show() {
    echo $this->version;
  }
}

答案 8 :(得分:0)

读取 .git/HEAD 文件的给定解决方案导致我的管道失败。

受到这个问题的启发:How to programmatically determine the current checked out Git branch

您可以使用以下命令获取 git 分支名称:

$gitBranchName = trim(shell_exec("git rev-parse --abbrev-ref HEAD"));