Подтвердить что ты не робот

Чтение сообщения Git commit от PHP

Я ищу способ прочитать сообщение с сообщением Git с PHP. Я подозреваю, что мне нужно использовать Git hook, но я никогда не работал с ними раньше, поэтому мне нужен толчок в правильном направлении. В частности, я хотел бы реализовать следующий процесс:

  • PHP script выполняется автоматически после каждой фиксации
  • script фиксирует имя пользователя Git, время фиксации и контент фиксации

Если вообще возможно, я хотел бы придерживаться чистого PHP. Если есть учебники или ссылки, которые вы могли бы указать, это было бы огромной помощью.

4b9b3361

Ответ 1

Чтобы получить хеш-код фиксации, вы можете использовать

git rev-parse --verify HEAD 2> /dev/null

Изнутри php:

exec('git rev-parse --verify HEAD 2> /dev/null', $output);
$hash = $output[0];

Вы можете получить сообщение о фиксации, автор и время (хотя - время будет просто "сейчас", если оно будет выполняться как часть сцепления после фиксации):

exec("git show $hash", $output);

Если это не очевидно, что бы вы ни делали с php, это просто обертка вокруг того, что вы делаете с git на cli - I.e. любой "как я могу сделать x с git из php", это просто exec('the git answer', $output)

Ответ 2

Что касается использования PHP для извлечения правильной фиксации:

Indefero

Существует проект под названием Indefero, который является инструментом подделки PHP, который имеет SCM-коннектор для git. Вы легко можете использовать свой git класс в качестве API для себя. Вы можете просто взять класс git и класс SCM.

Я, например, вытащил два метода из нижеприведенного класса, которые, по моему мнению, наиболее важны для вас, чтобы вы могли видеть, как они работают.

Получить список изменений: getChangeLog()

/**
 * Get latest changes.
 *
 * @param string Commit ('HEAD').
 * @param int Number of changes (10).
 * @return array Changes.
 */
public function getChangeLog($commit='HEAD', $n=10)
{
    if ($n === null) $n = '';
    else $n = ' -'.$n;
    $cmd = sprintf('GIT_DIR=%s '.Pluf::f('git_path', 'git').' log%s --date=iso --pretty=format:\'%s\' %s',
                   escapeshellarg($this->repo), $n, $this->mediumtree_fmt,
                   escapeshellarg($commit));
    $out = array();
    $cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
    self::exec('IDF_Scm_Git::getChangeLog', $cmd, $out);
    return self::parseLog($out);
}

Получить определенную фиксацию: getCommit()

/**
 * Get commit details.
 *
 * @param string Commit
 * @param bool Get commit diff (false)
 * @return array Changes
 */
public function getCommit($commit, $getdiff=false)
{
    if ($getdiff) {
        $cmd = sprintf('GIT_DIR=%s '.Pluf::f('git_path', 'git').' show --date=iso --pretty=format:%s %s',
                       escapeshellarg($this->repo),
                       "'".$this->mediumtree_fmt."'",
                       escapeshellarg($commit));
    } else {
        $cmd = sprintf('GIT_DIR=%s '.Pluf::f('git_path', 'git').' log -1 --date=iso --pretty=format:%s %s',
                       escapeshellarg($this->repo),
                       "'".$this->mediumtree_fmt."'",
                       escapeshellarg($commit));
    }
    $out = array();
    $cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd;
    self::exec('IDF_Scm_Git::getCommit', $cmd, $out, $ret);
    if ($ret != 0 or count($out) == 0) {
        return false;
    }
    if ($getdiff) {
        $log = array();
        $change = array();
        $inchange = false;
        foreach ($out as $line) {
            if (!$inchange and 0 === strpos($line, 'diff --git a')) {
                $inchange = true;
            }
            if ($inchange) {
                $change[] = $line;
            } else {
                $log[] = $line;
            }
        }
        $out = self::parseLog($log);
        $out[0]->diff = implode("\n", $change);
    } else {
        $out = self::parseLog($out);
        $out[0]->diff = '';
    }

    $out[0]->branch = implode(', ', $this->inBranches($commit, null));
    return $out[0];
}

VersionControl_Git от PEAR

Существует также библиотека в PEAR, называемая VersionControl_Git, которая была бы полезна в этой ситуации и документально зафиксирована.

Ответ 3

Как упоминал @Pawel, вы захотите работать с крючками на этом:

На локальном хосте вы можете перейти к /.git/hooks и переименовать post-commit.sample для пост-фиксации, а затем помещать внутри #!/usr/bin/php  Есть и другие крючки, которые могут быть больше подходит для вас.

Git будет искать крюк post-commit после фиксации и автоматического запуска чего-либо внутри.

То, что вы собираетесь делать здесь, зависит от задачи, но я предлагаю curl ing script - здесь, где все становится интересным.

Чтобы извлечь информацию, которую вы ищете, вы захотите использовать git log -1 -, который должен отменить последнюю фиксацию.

Более конкретно, вы захотите построить свою фиксацию с помощью переключателя --pretty=format, который может выводить последнюю фиксацию с необходимой информацией. Проверьте эту строку:

git log -1 --pretty=format:'%h - %cn (%ce) - %s (%ci)'

Это вернет большую часть вещей, которые вы ищете. Просмотрите страницу git-log, чтобы просмотреть все переменные %, которые вы можете использовать с --pretty=format:. После того, как вы сделали нужную строку, вы можете либо POST с помощью cURL на PHP скрипт, либо запустить PHP скрипт и использовать shell_exec(git log -1 --pretty=format:'%h - %cn (%ce) - %s (%ci)') для работы с встроенным сообщением фиксации.

Ответ 4

Я копал в том же вопросе и выяснил способ сделать это быстрее и проще.

Чтобы получить только сообщение фиксации, вы можете использовать

git rev-list --format=%B --max-count=1 HEAD

Очевидно, что HEAD может быть заменен любым хешем фиксации.

Он выведет что-то вроде

commit 4152601a42270440ad52680ac7c66ba87a506174
Improved migrations and models relations

Вторая строка - это то, что вам нужно.