2013-04-18 13 views
11

Hintergrund: Entwicklung einer Facebook-App mit PHP Laravel Framework & MySQL für die Datenbank.Möchten Sie einen Hook einrichten, der festgeschriebene Dateien in einen bestimmten Ordner kopiert

Ich habe Gitlab auf unserem Entwicklungsserver eingerichtet und ein Repository darauf erstellt, auf dem das Team hinzugefügt wurde und & drückenden Code festlegt.

Was ich tun möchte, ist, wenn ich Code zu einem bestimmten Zweig auf GitLab (zum Beispiel Master) drücken möchte ich es unter/var/www/Produktname zur Verfügung, so dass ich es innerhalb der Facebook testen kann Leinwand (bestimmte Dinge passieren dort, die nicht auf Ihrem lokalen Rechner getestet werden können).

Allerdings möchte ich nicht den Haken alle Dateien über jedes Mal kopieren, wenn ein Push auf Master passiert, nur die Dateien, die geändert wurden.

Kann jemand mit einem solchen Haken helfen?

Vielen Dank.

+1

Sie hatten zuvor die richtige Antwort ausgewählt. Es ist am besten, git die Kasse verlassen, respektieren die.gitignore und andere git-Attribute, anstatt rsynch, die alles kopieren/synchronisieren. – VonC

Antwort

3

Verwenden Sie rsync statt cp für diese Operation. Es wird automatisch geprüft. So wird Ihr Post-Commit Hook nicht unnötig kompliziert.

+0

Dies ist ein ausgezeichneter Rat und ich habe es in meinen Workflow implementiert. Ich danke dir sehr. – Kopty

3

This post auf Seb Duggan Blog beschreiben es schön. Sie legen einfach post-receive Haken, enthalten:

#!/bin/sh 
GIT_WORK_TREE=/path/to/webroot/of/mywebsite git checkout -f 

hinzufügen es +x Flagge und es wird Ihre Repo in bestimmten Ordner Kasse.

+0

Genau das habe ich gesucht. Vielen Dank! – Kopty

+0

Sie können auch mein [gitdeploy] (https://github.com/hauleth/puppet-gitdeploy) Puppet-Manifest sehen. Es ist noch in der frühen Entwicklung, aber wie ich bisher getestet habe, funktioniert es :) – Hauleth

+0

Sorry, aber was meinst du mit + x Flagge? Gibt es auch einen Grund, warum mein Post-Commit-Hook läuft, aber nicht mein Post-Empfang? Vielen Dank! – andli

8

Sie müssten den nackten Repo (verwaltet von Gitlab) ein post-receive Haken hinzuzufügen, die würde:

  • einen Arbeitsbaum (git checkout -f Master) halten
  • kopieren Sie die gewünschten Dateien aus dass

arbeiten, das wäre:

cd ~git/repositories/yourRepo.git/hooks 
touch post-receive 
chmod +x post-receive 

Sie s machen kann ure, dass Haken nur dann aktiv sein, wenn jemand auf einem Ast schiebt master:

#!/bin/bash 
while read oldrev newrev refname 
do 
    branch=$(git rev-parse --symbolic --abbrev-ref $refname) 
    if [ "master" == "$branch" ]; then 
     # Do something 
    fi 
done 

Für die Kasse von diesem Haken getan, siehe „GIT post-receive checkout without root folder“, das heißt:
sicher, dass Sie angeben, machen --git-dir und --git-work-tree:

git --git-dir=/path/to/project_root.git --work-tree=/path/to/your/workingtree checkout -f 

Wiederum kann /path/to/your/workingtree sein:

  • nur ein Zwischenarbeits Baum für Sie, um daraus die relevanten Dateien zu extrahieren, die Sie kopieren möchten.
  • oder der Pfad zu Ihrer App, wenn Sie wollen alle die Dateien von Master im Zielverzeichnis Ihrer wab App aktualisiert werden.
+0

Das ist perfekt. Vielen Dank für Ihre ausführliche Antwort. – Kopty

+0

Können wir den sha-Schlüssel als neuen Unterverzeichnisnamen verwenden? –

+0

@dipievil Ich bin mir nicht sicher, wie ein sha-Schlüssel irgendeine Rolle in dieser Frage oder dieser Antwort spielt. – VonC