Чтение сообщения Git commit от PHP
Я ищу способ прочитать сообщение с сообщением Git с PHP. Я подозреваю, что мне нужно использовать Git hook, но я никогда не работал с ними раньше, поэтому мне нужен толчок в правильном направлении. В частности, я хотел бы реализовать следующий процесс:
- PHP script выполняется автоматически после каждой фиксации
- script фиксирует имя пользователя Git, время фиксации и контент фиксации
Если вообще возможно, я хотел бы придерживаться чистого PHP. Если есть учебники или ссылки, которые вы могли бы указать, это было бы огромной помощью.
Ответы
Ответ 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.
Я, например, вытащил два метода из нижеприведенного класса, которые, по моему мнению, наиболее важны для вас, чтобы вы могли видеть, как они работают.
/**
* 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];
}
Существует также библиотека в 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
Вторая строка - это то, что вам нужно.