Cron-Jobprüfung auf Änderungen im Git-Repository

7

Wir haben gerade unsere Serverkonfigurationen in ein Git-Repository verschoben. Daher sollten in keinem der Repository-Ordner Änderungen vorgenommen werden. Ich dachte darüber nach, wie ich einen Cron-Job einrichten könnte, um nach nicht festgeschriebenen Änderungen zu suchen.

Wie kann ein Cron-Job eingerichtet werden, um nach Änderungen in einem Git-Repository zu suchen?

Wenn Sie die Ausgabe des git statusBefehls abtasten, ist dies möglicherweise der Fall . Grep- und Cron-Jobs sind nicht meine starke Seite. Hier sind einige Beispielausgaben von git status:

Stehender Ordner mit dem Git-Repository (z. B. /path/gitrepo/) mit geänderten Dateien :

$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   apache2/sites-enabled/000-default
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   apache2/conf.d/test
no changes added to commit (use "git add" and/or "git commit -a")

Stehen im Ordner, wenn keine Änderungen vorgenommen wurden :

$ git status
# On branch master
nothing to commit (working directory clean)

Aktualisieren:

Mit dem Ursprung synchronisiert ist nicht wichtig. Es sollten keine lokalen Änderungen vorgenommen werden. Lokale Dateien, die vorhanden sein müssen, werden in die .gitignore-Datei verschoben. Zusätzlich zu den Serverkonfigurationen gibt es auch Git-Repos für Inhalte (statische Websites, Web-Apps, WordPress usw.). Keines der Repositorys sollte lokale Änderungen aufweisen.

Wir könnten Puppet auf lange Sicht verwenden, da es für die Entwicklung einer der Web-Apps verwendet wird.

HNygard
quelle
1
Verwenden Sie etckeeper? Du solltest es dir ansehen. Es hört sich so an, als würden Sie versuchen, das Rad neu zu erfinden.
Zoredache
Etckeeper scheint einen Teil der Arbeit zu erledigen. Ich denke, das Git-Repository ist nicht so sauber, wie ich es haben möchte. Wir schreiben nicht alle Dateien fest, sondern nur diejenigen, die sich von den Standard-Ubuntu-Dateien unterscheiden.
HNygard

Antworten:

8

Du solltest benutzen git ls-files

Das -mFlag erhält eine Liste aller seit dem letzten Festschreiben geänderten Dateien. Wenn keine Dateien geändert werden , werden keine Daten ausgegeben . Dies macht es extrem einfach, einen Cronjob mit diesem Befehl einzurichten, da der Cronjob standardmäßig nur dann eine E-Mail sendet, wenn der Befehl etwas ausgibt .

Gelöschte Dateien sind pr. Definition geändert , sodass sie auch in der geänderten Ansicht angezeigt werden . In git ls-files -m -ddiesem Fall werden gelöschte Dateien zweimal aufgelistet.

Beachten Sie jedoch , dass git ls-files -mnur Dateien zeigen geändert , und deshalb ignorieren untracked Dateien. Um auch nicht verfolgte Dateien -oanzuzeigen , müssen Sie das Flag für "andere Dateien" übergeben und die Option --exclude-standardzum Ausschließen der in .gitignoreund aufgelisteten Dateien übergeben .git/info/exclude.

Angabe des Git-Verzeichnisses und des Arbeitsbaums

Wenn der Befehl von einem Cronjob, müssen Sie den Pfad zu dem geben .gitdir und Arbeits Baum mit --git-dirund --work-treejeweils. Siehe gitManpages als Referenz.

Cronjob-Setup

Der vollständige Befehl, den Sie in Ihrem Cronjob ausführen müssen:

$ git --git-dir "/PATH/TO/DIR/.git" --work-tree "/PATH/TO/DIR" ls-files -m -o --exclude-standard

Ihr Crontab sollte ungefähr so ​​aussehen:

$ crontab -l
# mh dom mon dow Befehl
* * * * * git --git-dir "/PATH/TO/DIR/.git" --work-tree "/ PATH / TO / DIR" ls-files -m -o --exclude-standard

Dies wird jede Minute eine E-Mail senden, wenn sich Änderungen ergeben. Wenn Sie ein anderes Setup wünschen, empfehlen wir Ihnen, die Beispiele auf der cronWikipedia-Seite zu lesen .

Warum git-ls-files?

Der Grund, den ich git ls-filesüber empfehle, git statusist, dass git statuses sich um einen sogenannten "Porzellan" -Befehl handelt, während git ls-fileses sich um einen "Sanitär" -Befehl handelt. Kurz gesagt, Porzellanbefehle sind für die Ausgabe an den Benutzer vorgesehen, während Installationsbefehle für Skripte vorgesehen sind. Lesen Sie mehr über die Unterschiede zwischen Git-Porzellan und Git-Sanitärbefehlen.

ohaal
quelle
6

Es gibt eine Menge Komplexität, die Sie in Ihrer Frage ignorieren, daher werde ich sie in meiner Antwort ignorieren:

if [ `git status | grep -c "working directory clean"` -ne 1 ]; then
    . . . you have changes . . .
else
    . . . you don't have any changes . . . 
fi

Beachten Sie jedoch, dass dies Ihnen nicht sagt, ob Sie synchronisiert sind oder ob die Änderungen lokal legitim sind oder wirklich viel von allem, was Sie wissen möchten, wenn es Änderungen gibt.

Sie sind wahrscheinlich besser dran, wenn Sie ein Konfigurationsmanagement-Tool wie Puppet oder Chef verwenden, um Ihre Konfigurationsdateien zu verwalten. Die Lernkurve ist anfangs möglicherweise etwas steiler, vereinfacht jedoch die Server- / Konfigurationsverwaltung erheblich.

voretaq7
quelle