![](/img/trans.png)
[英]How to parse the response from git log ? I need to get the commit hash and the commit message
[英]Reading a Git commit message from PHP
我正在寻找一种用PHP读取Git提交消息的方法。 我怀疑我需要使用Git钩子,但我以前从未使用它们,所以我需要向正确的方向推进 。 具体来说,我想实现以下过程:
如果可能的话,我想坚持使用纯PHP。 如果有可以指出的教程或参考资料,那将是一个巨大的帮助。
要获取提交哈希,您可以使用
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做什么都只是围绕你在cli上使用git做的事情的包装 - 也就是说“我怎么能用php从git做x”只是exec('the git answer', $output)
至于使用PHP来提取正确的提交:
有一个名为Indefero的项目是一个PHP forge工具,它有一个用于git的SCM连接器 。 您可以轻松地将他们的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];
}
PEAR中还有一个名为VersionControl_Git的库,可以在这种情况下提供帮助并记录在案 。
正如@Pawel所提到的,你将会想要使用钩子:
在localhost上,您可以导航到/.git/hooks并将post-commit.sample重命名为post-commit,然后放入#!/ usr / bin / php。还有其他一些可能更适合您的钩子。
在你提交并自动运行任何内容之后,Git将寻找post-commit
钩子。
你想要在这里做什么取决于任务,但我建议curl
脚本 - 这里的事情变得有趣。
为了提取您正在寻找的信息,您将要使用git log -1
- 这应该撤回最新的提交。
更具体地说,您将需要使用--pretty=format
toggle来构建提交,这可以使用您需要的信息输出最新的提交。 看看这个字符串:
git log -1 --pretty=format:'%h - %cn (%ce) - %s (%ci)'
这将返回您正在寻找的大部分内容。 查看git-log页面,查看可以与--pretty=format:
一起使用的所有不同%
变量。 一旦您完成了该字符串,您想,您可以POST
那些通过卷曲PHP脚本,或运行PHP脚本,并使用shell_exec(git log -1 --pretty=format:'%h - %cn (%ce) - %s (%ci)')
使用内联提交消息。
我正在挖掘同样的问题,并找到了一种更快更容易的方法。
获取您可以使用的提交消息
git rev-list --format=%B --max-count=1 HEAD
显然, HEAD
可以用任何提交哈希替换。
它会输出类似的东西
commit 4152601a42270440ad52680ac7c66ba87a506174
Improved migrations and models relations
第二行是你需要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.