2010-09-13 7 views
58

Mit einem einzigen offiziellen Repository als Remote und mehreren lokalen Repositories, die daraus geklont werden, kann ein Pre-Commit-Hook in diesem Haupt-Repository geskriptet und auf allen Klonen davon erzwungen werden?Git Remote/Shared Pre-Commit Hook

+4

Wenn Sie * erzwingen wollen *, verwenden Sie einen Aktualisierungs-Hook im zentralen Repo. Wenn der Hook eine Pro-Commit-Verifizierung durchführt, können Sie immer noch einen Hook vor dem Commit bereitstellen. Entwickler werden es wahrscheinlich freiwillig übernehmen, so dass sie es sofort herausfinden können, wenn sie etwas falsch gemacht haben, anstatt zu warten, bis sie versuchen, etwas zu unternehmen. – Cascabel

+1

Mögliche Duplikate: (http://stackoverflow.com/questions/3462955/) und (http://stackoverflow.com/questions/427207/) – blong

Antwort

46

Ich glaube nicht, da Haken nicht geklont werden.
Kann sein, wenn dieses Hook-Skript selbst versioniert ist, und dann zu (symbolischer Verbindung) in den Clone-Servern verlinkt (vorausgesetzt, ihr Betriebssystem unterstützt diese Link-Funktion).

Oder vielleicht, wenn die Hooks Teil eines git template directory zum Erstellen der Klone verwendet werden (das würde nur ihre Präsenzen im Klon Repo sicherstellen, das würde nicht garantieren, dass sie tatsächlich verwendet und ausgeführt werden).

Aber ich glaube nicht, dass es eine "zentrale" Möglichkeit gibt, ein Commit zu erzwingen.


Wie Jefromi noch deutlicher in den Kommentaren (Hervorhebung von mir) erklärt:

Ich denke, es geht gegen die Idee eines Git Repository wirklich erzwungen Haken mit dem Repo verteilt zu haben.
Mein Klon ist mein Repository. Ich sollte in der Lage sein, git darauf zu verwenden, aber ich mag es, zu entscheiden, ob ich hooks ausführen soll oder nicht.
(Und von einem Standpunkt der Sicherheit aus, dass würde, wirklich etwas beängstigend -. Niemand die Möglichkeit, mich zu zwingen, sollte bestimmte Skripte ausgeführt werden, wenn ich bestimmte git Befehle ausführen)

ich mit diesem Kommentar zustimmen und haben nur Möglichkeiten gesehen, um Regeln durchzusetzen, die lokal in einem bestimmten spezialisierten Repo angewendet werden.
Zum Beispiel würden Sie nicht direkt zum zentralen Repo drängen, sondern zuerst zu einem QA-Repo, der Ihr Commit nur akzeptiert, wenn es bestimmten Regeln folgt. Wenn dies der Fall ist, wird das QA-Repo Ihr Commit auf das zentrale Repo übertragen.

Ein weiteres Beispiel direkt abgeleitet von dem, was ich „Serverless Continuous Integration with Git“ nur wäre erwähnt, eine Art und Weise lokal private bauen, dass sie überall vor drängen arbeitet zu erzwingen.

+6

Ich denke, es ist wirklich gegen die Idee eines Git-Repository zu haben erzwungene Hooks, die mit dem Repo verteilt werden. Mein Klon ist * mein * Repository. Ich sollte in der Lage sein, git darauf zu verwenden, aber ich mag es, zu entscheiden, ob ich hooks ausführen soll oder nicht. (Und aus Sicherheitsgründen wäre das wirklich beängstigend - niemand sollte die Fähigkeit haben, mich dazu zu zwingen, bestimmte Skripte auszuführen, wenn ich bestimmte git-Befehle ausführe.) – Cascabel

+1

@Jefromi: Weißt du, was scarry ist? Als ich den Kommentar eintippte, bevor ich meine bearbeitete Antwort einreichte, begann ich "add ..." zu tippen und FireFox auf meinem Computer schlug mir vor: "add Jefromi's comment". Nicht das erste Mal, dass ich dort gewesen bin, offensichtlich;) – VonC

+0

Hinweis für Selbst: siehe auch http://StackOverflow.com/Questions/3209208/what-is-the-Cleverest-use-of-source-repository-that-you -have-je-gesehen/3209767 # 3209767 – VonC

5

Kann ein Pre-Commit-Hook auf diesem Haupt-Repository geskriptet werden und auf allen Klonen davon erzwungen werden?

Von githooks(5):

 
    pre-commit 
     This hook is invoked by git commit, and can be bypassed with 
     --no-verify option. 

Da der Haken leicht umgangen werden kann, so scheint es, die Antwort auf Ihre Frage lautet „Nein“.

Da auch das .git/hooks-Verzeichnis nicht geklont wird, scheint es keinen Mechanismus zu geben, es auf den Client zu übertragen.

8

Sie können den Pre-Commit-Hook nicht auf lokalen lokalen Repositorys erzwingen, aber in Ihrem zentralen Repo können Sie weiterhin einen Pre-Receive-Hook ausführen.

F. ex Ich musste sicher sein, dass die Commit-Nachrichten bestimmte Regeln befolgten (für Trac-Integration etc) so habe ich folgenden pre-receive-Hook verwendet, der jede Commit-Nachricht überprüft, die an das zentrale Repository gesendet wird, und verweigert drücken, wenn es nicht gut ist.

 
#!/bin/sh 
while read rev_old rev_new ref 
do 
    MALFORMED="$(git rev-list --oneline $rev_old..$rev_new | egrep -v '#[0-9]+' | awk '{print $1}')" 
    if [ x"$MALFORMED" != x ] 
    then 
     echo Invallid commit message on $MALFORMED 
     exit 1 
    fi 
done 

für weitere Informationen siehe f.ex https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

2

Angenommen, Sie Quellcode in Ihre git Repo haben, die ein Build-System zugeordnet ist, können Sie das Build-System konfigurieren, dass der einzurichten pre-commit hook, dh durch Verschieben oder Verknüpfen eines Pre-Commit-Hooks, der ~ versioniert ist.

Ich habe dies noch nicht versucht. Ich kam hierher, um nach einer besseren Lösung zu suchen.

Verwandte Themen