2010-05-08 11 views
10

Gibt es eine Möglichkeit zu haken, wenn ein Git-Pull auf der Fernbedienung passiert (ähnlich einem Pre-Receive oder Post-Receive). Grundsätzlich möchte ich in der Lage sein, die Fernbedienung zu veranlassen, alles zu begehen, was es hat, wenn es einen Zug gibt.Wie hake ich einen Git-Pull auf der Fernbedienung?

In meiner Situation ist alles, was auf der Fernbedienung live ist, eine autoritative Quelle, die ohne einen Git-Commit modifiziert werden kann. Ich möchte sicherstellen, dass ich immer, wenn ich ziehe, das Neueste von allem, was live ist, bekomme.

+1

Sie senden also einen Commit an einen Remote-Repo und möchten, dass der Remote-Repo festgeschrieben wird, bevor Ihre Änderungen in den Remote-Repo übernommen werden? –

+0

Nicht ganz. Mehr wie dies: 1: auf remote fileA.txt wird bearbeitet 2: auf lokalen ich renn 'git pull remote' Was ich möchte ist für die Bearbeitung von fileA.txt zu commit'ed, so dass meine ziehen bringt die Veränderungen, die gemacht wurden, herunter. – Danny

+0

Warum bearbeiten Sie fileA.txt nicht lokal, committen Sie es und führen Sie den Pull auf dem Remote-Server aus? Änderungen sollten im lokalen Setup des Entwicklers beginnen und in die Produktionsumgebung übertragen werden, nicht umgekehrt. – Mathew

Antwort

0

Ich habe keine direkte Erfahrung mit Git-Haken, und this page kann helfen, aber es sieht nicht so aus, als ob Sie in der Lage sein werden, es zu tun.

Die einfachere (und bessere IMO) Lösung wäre die Verwendung eines anderen Repos als die Produktionsumgebung als autorisierende Quelle. Kannst du das tun? Eine Produktionsumgebung wird sehr selten als maßgebliche Quelle verwendet, da die neuesten und stabilsten sind zwei sehr unterschiedliche Dinge ...

FYI, ich nur jemals Führen Sie einen Git Pull oder Git-Status in einer Produktionsumgebung. Alle Änderungen werden an meinem lokalen Repo vorgenommen, getestet, festgeschrieben, an github weitergeleitet und dann in die Produktionsumgebung übertragen.

UPDATE
Ich mag darauf hinweisen, dass eine der großen Stärken und Eigenschaften von Git ist, dass es ein Quellcodeverwaltungssystem verteilt ist. Als solche gibt es nicht wirklich eine autoritative Quelle.

+0

Vielleicht autoritativ war nicht der richtige Begriff, eher wie es eine "Peer" Quelle ist, die genau das ist, was Git fördert. Das einzige Problem ist, dass der Peer sich nicht selbst festlegen kann, also habe ich versucht herauszufinden, ob Git-Hooks helfen können. – Danny

0

Ich denke, dass Sie dies nicht mit Haken tun können, für was ich verstehe, die Haken 'Doc zu lesen, gibt es keinen Haken, der in Ihre Anforderung passt.

Wenn ich brauche etwas wie das, was Sie wollen, ich ein Skript erstellen, würde auf ‚Remote‘, die jede Stunde und überprüft, läuft, wenn eine Datei geändert wurde (git status) und verpflichten alle (git commit -a -m "Automatisches Festschreiben").

+0

Nicht wirklich möglich, da die Fernbedienung nur eine Dateifreigabe ist, die im Cloud-Speicher gespeichert ist. Danke, aber mir ist klar, dass das nicht zu existieren scheint. Ich habe die Haken, wenn ich einen Schub mache, nur nicht einen Zug. Ich denke, ich muss eine Art leeren Commit + Push machen. – Danny

+0

Versuchen Sie, eine Möglichkeit zu finden, diesen Dateispeicher lokal zu mounten, damit Sie den Befehl git Ihres lokalen Computers verwenden können. Ich vermute, wenn Sie auf den Cloud-Speicher als lokaler Speicher zugreifen könnten, könnten Sie alles direkt von Ihrem Computer aus tun. Wenn der Cloud-Speicher nur ein einfacher Speicher ist, der Ihre Dateien enthält und zufällig das .git-Verzeichnis enthält, aber kein Git läuft, ist es unmöglich, etwas dort anzuhängen. –

0

Es ist nicht etwas, das ich nie zuvor getan haben, aber Sie können Bash-Skripte von innen php ausführen:

http://www.devx.com/opensource/Article/40785

die es erlauben, sollten Sie zu begehen, und drücken Sie eine Reihe von Änderungen über ein PHP-Skript. Chuck eine Schnittstelle drüber oder integrieren Sie es in Ihren aktuellen Bearbeitungsprozess und Sie sollten gut gehen.

0

Wer/was bearbeitet diese Datei? Wenn etwas geändert wird, wenn jemand etwas auf einer Site ändert, muss dies durch etwas ausgelöst werden, was bedeutet, dass Sie dies automatisieren können. Wenn etwas passiert und die Datei gespeichert wird, sollten Sie das Commit auslösen. Das Commit muss irgendwann gemacht werden und es könnte genauso gut zu dieser Zeit sein.

+0

Das setzt voraus, dass die Fernbedienung tatsächlich in der Lage ist, einen Git-Befehl auszuführen. Aber in meinem Fall ist es eine Dateiserver-/Schattenkopie auf skydrive, die ich gelegentlich aus dem Web bearbeiten kann. – Danny

3

Zuerst, um Ihre eigentliche Frage zu beantworten: Es gibt keine Haken auf der Gegenseite aufgerufen, wenn jemand holt. (Wenn jemand zieht, alle Remote-weiß ist, dass sie von ihm geholt - es nicht weiß, ob sie git pull lief, git fetch, git remote update ...)

Wie für Ihre aktuelle Situation: Ich mit Magnus darüber einig, dass es‘ Es ist am besten, wenn nach Änderungen nur Commits stattfinden, oder wenn dies nicht gelingt, eine Art periodischer Task (Cronjob?), der nach Änderungen sucht und festlegt, ob er etwas findet.Wenn Ihnen eine dieser Möglichkeiten nicht gefällt, müssen Sie die Dinge straffen, damit Sie schnell und einfach ein Commit im Remote-Repository auslösen können, bevor Sie ziehen.

Auch würde ich vorschlagen, nicht in Bezug auf ein Repository mit einem Arbeitsbaum als Ihre kanonische Repository. Es fragt nach Ärger, wenn Sie jemals drängen müssen. Stattdessen könnten Sie ein blosses kanonisches Repository haben, in das Ihr Live-Repository nach der Übertragung schiebt, und einen Post-Receive-Hook in diesem blanken Repository installieren, um das Live-Repository bei Bedarf zu aktualisieren.

+0

Wie für Ihren letzten Absatz löst das das Problem überhaupt nicht. Dies kann mit Gitolit gemacht werden, aber wenn jemand aus dem bloßen Repo zieht, wie lässt man es dem Nicht-Nackten sagen, alles zu begehen, es sei denn, der Gitolit-Benutzer hat direkte Privilegien, git commit zu nennen, was nicht immer eine gute Idee ist . Im Grunde brauchen viele Leute einen Hook auf einem Remote-Repository mit einem Noop. Deshalb denken Leute, dass Fetch gut sein könnte, nur um herauszufinden, dass es keinen Pre-Fetch-Haken gibt. Ich denke, es könnte gelöst werden, indem man auf eine nicht existierende Verzweigung drängt ... – nus

+0

... Das ist in Ordnung für etwas automatisiertes wie Gitolit, ist aber nervig, wenn Menschen sich daran erinnern müssen, bevor sie einen Zug machen ... – nus

1

Leider liefert git nativ keine Hooks dafür, da es ein perfekter Use-Case ist, um etwas überprüfen zu können, bevor ein Pull/Fetch erlaubt wird.

Ich weiß nicht, ob Ihr ‚Remote‘ auf einem lokalen Rechner ist, aber wenn es nicht, habe bei gitolite einen Blick ist der Haken hat, die genau dafür gedacht ist:

Vom v2 gitolite docs:

"gl-pre-git" Haken

Obwohl git hat viele schöne Haken Sie anzapfen können, sie alle laufen nur auf einem Stoß. Es gibt nichts, was auf einem Abruf oder einem Klon läuft, und gibt es keine Möglichkeit etwas vor git-receive-pack oder git-upload-pack auszuführen (je nachdem).

Dafür ist der gl-pre-git hook gedacht. Wenn ein ausführbarer Hook namens gl-pre-git vorhanden ist, wird er mit dem aktuellen Verzeichnis repo.git und mit einem einzelnen Argument aufgerufen, das entweder R oder W ist, je nachdem, was der Client versucht machen.

Für v3 gitolite, hier sind the docs about triggers. Die Dokumentation ist ein wenig kryptisch, aber hier ist, wie es funktioniert:

  1. in ~/.gitolite.rc hinzufügen (auf dem globalen Bereich):

    PRE_GIT => [ '<pre_git_trigger_script_name>' ]

  2. in der gleichen Datei Sehen Sie sich die Zeile an, in der Sie LOCAL_CODE setzen können und setzen Sie sie auf

  3. Legen Sie in dem Verzeichnis, das Sie für LOCAL_CODE festgelegt haben, ein Unterverzeichnis namens 'triggers' an und erstellen Sie ein Skript mit dem Namen <pre_git_trigger_script_name> Ameise an diesem Punkt zu tun ... (stellen Sie sicher, Sie zu: chmod +x <pre_git_trigger_script_name>

  4. Lauf gitolite setup

  5. Test & & haben einen guten Tag

Update: Eigentlich mit gitolite, Ich denke, dass Sie den pre-git Trigger haben könnten, etwas wie das Drücken zu einer nicht existierenden Verzweigung und dann Haken, um in Ihrem nicht-bloßen Ablagefach zu empfangen, um den Stoß abzulehnen, aber zu tun git add --all . && git commit -m"autocommit" && push gitolite in der p rozessieren. Dies ist praktisch, wenn Sie nicht zulassen möchten, dass die gitolite-hosting-Benutzerberechtigungen Befehle direkt in Ihrem nicht-bare-Repository ausführen.

+0

"Es gibt keinen Weg zu führe etwas vor git-receive-pack oder git-upload-pack "... außer natürlich, um sie einfach weiterzuentwickeln ... es ist nur Code. – jthill

Verwandte Themen