source php7 net hypertext español codigo code php git

php7 - Leyendo un mensaje de Git commit desde PHP



php.net español (4)

Como mencionó @Pawel, querrás trabajar con ganchos en esto:

En localhost puede navegar a /.git/hooks y cambiar el nombre de post-commit.sample a post-commit y luego colocar dentro de #! / Usr / bin / php También hay otros ganchos que pueden ser más adecuados para usted.

Git buscará el enlace post-commit después de que haya confirmado y ejecutará automáticamente todo lo que haya dentro.

Lo que querrá hacer aquí depende de la tarea, pero sugeriría curl el guión: aquí es donde las cosas se ponen interesantes.

Para extraer la información que está buscando, querrá usar git log -1 , lo que debería hacer retroceder el último compromiso.

Más específicamente, querrá construir su compromiso usando el --pretty=format , que puede generar el último compromiso con la información que necesita. Echa un vistazo a esta cadena:

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

Esto devolvería la mayoría de las cosas que está buscando. Echa un vistazo a la página git-log para ver todas las diferentes % variables que puedes usar con el --pretty=format: Una vez que haya creado la cadena que desea, puede enviar la POST través de cURL a un script PHP, o ejecutar un script PHP y usar shell_exec(git log -1 --pretty=format:''%h - %cn (%ce) - %s (%ci)'') para trabajar con el mensaje de confirmación en línea.

Estoy buscando una manera de leer un mensaje de Git commit con PHP. Sospecho que necesito usar un gancho Git, pero nunca he trabajado con ellos antes, así que necesito un empujón en la dirección correcta. Específicamente, me gustaría implementar el siguiente proceso:

  • Un script PHP se ejecuta automáticamente después de cada confirmación
  • El script captura el nombre de usuario de Git, el momento de la confirmación y el contenido de confirmación

Si es posible, me gustaría seguir con PHP puro. Si hay tutoriales o referencias que podría señalar, sería una gran ayuda.


En cuanto a usar PHP para extraer el commit correcto:

Indefero

Hay un proyecto llamado Indefero que es una herramienta de forja de PHP que tiene un conector SCM para git . Podrías usar fácilmente su clase git como una API para ti. Puedes simplemente tomar la clase git y la clase SCM .

Por ejemplo, he extraído dos métodos de la clase a continuación, que creo que son los más relevantes para usted para que pueda ver cómo funcionan.

Obtener una lista de cambios: 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); }

Obtener un compromiso particular: 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 de PEAR

También hay una biblioteca en PEAR llamada VersionControl_Git que sería útil en esta situación y está documented .


Estaba investigando la misma pregunta y encontré la manera de hacerlo más rápido y más fácil.

Para obtener sólo el mensaje de confirmación que podría utilizar

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

Obviamente, HEAD puede ser reemplazado por cualquier hash de confirmación.

Saldrá algo como

commit 4152601a42270440ad52680ac7c66ba87a506174 Improved migrations and models relations

La segunda línea es lo que necesitas.


Para obtener el hash de confirmación, puede utilizar

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

Desde dentro de php:

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

Puede obtener el mensaje de confirmación, el autor y la hora (aunque, la hora simplemente será "ahora" si se ejecuta como parte de un enlace posterior a la confirmación) con:

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

Si no es obvio, cualquier cosa que hagas con php será simplemente una envoltura alrededor de las cosas que harías con git en el cli. Es decir, "¿cómo puedo hacer x con git de php?" Es solo exec(''the git answer'', $output)