Lesen einer Git-Commit-Nachricht von PHP

Lesezeit: 5 Minuten

Ich suche nach einer Möglichkeit, eine Git-Commit-Nachricht mit PHP zu lesen. Ich vermute, dass ich einen Git-Hook verwenden muss, aber ich habe noch nie damit gearbeitet, also brauche ich einen drücken in die richtige Richtung. Konkret möchte ich den folgenden Prozess implementieren:

  • Nach jedem Commit wird automatisch ein PHP-Skript ausgeführt
  • Das Skript erfasst den Git-Benutzernamen, die Uhrzeit des Commit und den Commit-Inhalt

Wenn möglich, würde ich gerne bei reinem PHP bleiben. Wenn es Tutorials oder Referenzen gibt, auf die Sie hinweisen könnten, wäre das eine große Hilfe.

  • Ebenfalls, Dies sieht ziemlich cool aus.

    – cambraka

    31. Januar 2012 um 22:26 Uhr

  • Ich habe gerade eine ähnliche Frage beantwortet, aber sie bezog sich auf github stackoverflow.com/a/9150437/706466

    – Pawel Dubiel

    5. Februar 2012 um 23:32 Uhr


  • Danke @Pawel. Das wäre großartig für eine öffentlich zugängliche Site und unter der Annahme von GitHub, aber ich möchte es tatsächlich auf einem lokalen Host tun.

    – VirtuosiMedia

    6. Februar 2012 um 0:39 Uhr

  • @VirtuosiMedia Auf localhost können Sie zu /.git/hooks navigieren und post-commit.sample in post-commit umbenennen und dann #!/usr/bin/php einfügen Es gibt auch andere Hooks vielleicht besser für dich geeignet. Es ist mir jedoch nicht gelungen, etwas von php://stdin in diesen Skripten zu lesen. Wenn du herausfindest, wie das geht, lass es mich wissen :-). Hier wird erklärt, welcher Hook wann ausgeführt wird book.git-scm.com/5_git_hooks.html.

    – Pawel Dubiel

    6. Februar 2012 um 1:05 Uhr

  • Verwenden Sie ein Remote-Repository oder nur alle lokalen?

    – Nik

    6. Februar 2012 um 6:58 Uhr

Benutzer-Avatar
AD7sechs

Um den Commit-Hash zu erhalten, können Sie verwenden

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

Aus PHP heraus:

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

Sie können die Commit-Nachricht, den Autor und die Zeit abrufen (obwohl die Zeit einfach “jetzt” ist, wenn sie als Teil eines Post-Commit-Hooks ausgeführt wird) mit:

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

Wenn es nicht offensichtlich ist, wird alles, was Sie mit PHP tun, einfach ein Wrapper um die Dinge sein, die Sie mit Git auf der CLI machen würden – dh jedes “Wie kann ich x mit Git von PHP machen” ist nur exec('the git answer', $output)

Benutzer-Avatar
Treffynnon

Was die Verwendung von PHP zum Extrahieren des richtigen Commits betrifft:

Unaufhaltsam

Es gibt ein Projekt namens Unaufhaltsam das ist ein PHP-Forge-Tool, das eine hat SCM-Konnektor für git. Könntest du problemlos verwenden ihre Git-Klasse als API für sich selbst. Du kannst einfach greifen git-Klasse und die SCM-Klasse.

Ich habe zum Beispiel zwei Methoden aus der Klasse unten herausgezogen, die meiner Meinung nach für Sie am relevantesten sind, damit Sie sehen können, wie sie funktionieren.

Holen Sie sich eine Changelog-Liste: 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);
}

Holen Sie sich ein bestimmtes Commit: 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 von BIRNE

Es gibt auch eine Bibliothek in PEAR namens VersionControl_Git das wäre in dieser situation hilfreich und ist es auch dokumentiert.

Wie @Pawel erwähnt hat, sollten Sie hier mit Hooks arbeiten:

Auf localhost können Sie zu /.git/hooks navigieren und post-commit.sample in post-commit umbenennen und dann #!/usr/bin/php einfügen. Es gibt auch andere Hooks, die für Sie möglicherweise besser geeignet sind.

Git sucht nach der post-commit Hook nach dem Commit und führen automatisch alles darin aus.

Was Sie hier tun möchten, hängt von der Aufgabe ab, aber ich würde vorschlagen curldas Drehbuch – hier wird es interessant.

Um die Informationen zu extrahieren, nach denen Sie suchen, werden Sie verwenden wollen git log -1 – das sollte den letzten Commit zurückziehen.

Genauer gesagt möchten Sie Ihren Commit mithilfe von erstellen --pretty=format toggle, der den neuesten Commit mit den benötigten Informationen ausgeben kann. Schauen Sie sich diese Zeichenfolge an:

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

Dies würde die meisten Dinge zurückgeben, nach denen Sie suchen. Probier das aus git-log Seite, um all die verschiedenen zu sehen % Variablen, die Sie verwenden können --pretty=format:. Sobald Sie die gewünschte Zeichenfolge erstellt haben, können Sie beides tun POST diese über cURL zu einem PHP-Skript, oder führen Sie ein PHP-Skript aus und verwenden Sie es shell_exec(git log -1 --pretty=format:'%h - %cn (%ce) - %s (%ci)') um mit der Commit-Nachricht inline zu arbeiten.

Ich habe in der gleichen Frage gegraben und einen Weg gefunden, es schneller und einfacher zu machen.

Um nur die Commit-Nachricht zu erhalten, könnten Sie verwenden

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

Offensichtlich HEAD kann durch einen beliebigen Commit-Hash ersetzt werden.

Es wird so etwas wie ausgegeben

commit 4152601a42270440ad52680ac7c66ba87a506174
Improved migrations and models relations

Die zweite Zeile ist das, was Sie brauchen.

1180130cookie-checkLesen einer Git-Commit-Nachricht von PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy