Verfolgung von Crontab-Änderungen mit Git

7

Ich möchte verwenden git, um Änderungen in zu verfolgen crontab.

Ich habe ein neues Git-Repository in initialisiert /var/spool/cron/crontabs/

Das Problem ist nun, dass beim Speichern von crontab die zweite Zeile des Headers geändert wird, da sie einen Zeitstempel enthält.

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.ubNueW/crontab installed on Thu Aug  1 06:29:24 2019)

Was wäre der einfachste Weg, diese irrelevanten Änderungen zu ignorieren?

Die mögliche doppelte Frage spricht nicht den Hauptpunkt meiner Frage an: Wie man die ersten 2 irrelevanten Zeilen von crontab ignoriert. Stattdessen werden einige andere Fragen behandelt, die ich nicht gestellt habe, z. B. einige Haken.

Martin Vegter
quelle
2
Wenn Sie git über ein Skript aufrufen, können Sie die Zeile einfach löschen, indem Sie sed -i "s/^# (.*installed on.*)/d"die Datei ausführen, bevor Sie die Änderungen in das Repository übernehmen.
Larsks
Dies kann hilfreich sein, je nachdem, was Sie erreichen möchten. github.com/Intika-Linux-Apps/Startup-Watcher
intika

Antworten:

9

Sie sollten die Dateien im Cron-Spool-Verzeichnis niemals manuell berühren. Wenn Sie dort Änderungen an den Dateien vornehmen, wird der Cron-Dämon nicht ordnungsgemäß benachrichtigt, und Aktualisierungen von Zeitplänen werden erst nach einem Neustart des Dämons aktiv. (Einige Cron-Daemon-Implementierungen überprüfen möglicherweise regelmäßig den Spool, um festzustellen, ob dort aktualisierte Dateien vorhanden sind. Dieses Verhalten ist jedoch nicht universell. Überprüfen Sie Ihr cron(8)Handbuch.)

Das cron(8)Handbuch unter Ubuntu sagt

Beachten Sie, dass auf crontabs in diesem Verzeichnis nicht direkt zugegriffen werden sollte - der crontabBefehl sollte verwendet werden, um auf sie zuzugreifen und sie zu aktualisieren.

Sie sollten den crontabBefehl immer verwenden , um neue Zeitpläne zu laden oder vorhandene zu löschen.

Was das Beibehalten von Crontabs in Git betrifft, sehe ich kein Problem damit, aber wie oben erwähnt, sollten Sie /var/spool/cron/crontabsdieses Repository nicht auschecken . Lassen Sie es stattdessen woanders leben und laden Sie Crontabs manuell mit z

crontab my-crontab.txt

Wo my-crontab.txtist eine Datei mit Git verwaltet.

Dies würde außerdem das Problem vermeiden, dass die Dateien von Ihrem Cron-Daemon geändert werden.

Kusalananda
quelle
4

Sie könnten einen Filter verwenden:

git config filter.dropSecondLine.clean "sed '2d'"

Bearbeiten / erstellen Sie .git / info / Attribute und fügen Sie hinzu:

* filter=dropSecondLine

Wenn der Filter nicht auf alle Dateien im Repo angewendet werden soll, ändern Sie das * so, dass es einem geeigneten Muster oder Dateinamen entspricht.

Der Effekt ist, dass das Arbeitsverzeichnis gleich bleibt, aber die Repo-Blobs nicht die zweite Zeile in den Dateien haben. Wenn Sie es also an einer anderen Stelle nach unten ziehen, wird die zweite Zeile nicht angezeigt (das Ergebnis des sed 'd2'). Und wenn Sie die zweite Zeile Ihrer Protokolldatei ändern, können Sie sie hinzufügen, aber nicht festschreiben, da die Änderung am Blob beim Hinzufügen erfolgt. An diesem Punkt handelt es sich um dieselbe Datei wie die im Repo.

Amos
quelle
2
Könnte ich vorschlagen, basierend auf git-scm.com/docs/gitattributes "clean sollte seine Ausgabe nicht weiter ändern, wenn es zweimal ausgeführt wird", dass der sedBefehl einen regulären Ausdruck verwendet, um einem kommentierten Zeitstempel (ala larsks 'Kommentar /^# (.*installed on.*)) statt blind zu entsprechen Zeile 2 löschen?
Jeff Schaller
Wenn eine Regex gewünscht wird, kann sie entsprechend bearbeitet werden. Wie in den Dokumenten angegeben, wird die Ausgabe nach dem ersten Mal nicht mehr geändert. Die zweite Zeile wird gelöscht, der resultierende Text wird für das Commit verwendet. Das Arbeitsverzeichnis ändert sich nicht. Wenn sich also die zweite Zeile (aber keine andere Zeile) im Arbeitsverzeichnis ändert, können Sie erneut ein Git hinzufügen, aber das Commit zeigt "bereits aktuell" an. Wie nach dem Hinzufügen wird der Filter ausgelöst und die resultierende Datei ist dieselbe wie die bereits festgeschriebene
Amos
0

Sie können Folgendes verwenden git blame: "Zeigen Sie an, welche Revision und welcher Autor jede Zeile einer Datei zuletzt geändert haben - Kommentiert jede Zeile in der angegebenen Datei mit Informationen aus der Revision, die die Zeile zuletzt geändert hat. Optional können Sie ab der angegebenen Revision mit Anmerkungen beginnen.") Siehe auch dies .

Insbesondere mit der -LOption:

-L <start>,<end>
<start> and <end> are optional. “-L <start>” or “-L <start>,” spans from <start> to end of file. “-L ,<end>” spans from start of file to <end>.

Auf diese Weise können Sie das Beste aus beiden Welten genießen ... die Informationen behalten (die Ihnen vielleicht nicht wirklich wichtig sind) und sie ignorieren, wann immer Sie möchten.

Ansonsten scheint es für die Konfiguration so, als ob der Git-Filter dies tun kann. Siehe Links unten und eine andere Antwort hier.

/programming/6557467/can-git-ignore-a-specific-line

/programming/16244969/how-to-tell-git-to-ignore-individual-lines-ie-gitignore-for-specific-lines-of

sancho.s ReinstateMonicaCellio
quelle