Ich möchte git verwenden, um alle Änderungen an einer Datei aufzuzeichnen.
Gibt es eine Möglichkeit, git 'commit' zu aktivieren, die bei jeder Aktualisierung einer Datei automatisch ausgeführt wird? Es gibt also für jede Änderung an einer Datei ein neues Commit?
Idealerweise möchte ich, dass meine Benutzer nicht einmal wissen, dass Git hinter den Kulissen läuft. Ein Benutzer könnte dann möglicherweise Änderungen an einer Datei "rückgängig machen" - und dies könnte erreicht werden, indem eine frühere Version aus git gezogen wird.
Antworten:
Unter Linux können Sie inotifywait verwenden , um bei jeder Änderung des Inhalts einer Datei automatisch einen Befehl auszuführen.
Bearbeiten: Der folgende Befehl schreibt file.txt fest, sobald es gespeichert wird:
quelle
-r
Flaginotifywait
, aber beachten Sie, dass der Kernel die Anzahl der inotifywait-Uhren, die er einrichten kann, begrenzt.man inotifywait
werde dir mehr erzählen.Die frühere Antwort von inotifywait ist großartig, aber keine vollständige Lösung. Wie geschrieben, handelt es sich um ein One-Shot-Commit für eine einmalige Änderung in einer Datei. Dies funktioniert nicht für den allgemeinen Fall, dass beim Bearbeiten einer Datei ein neuer Inode mit dem ursprünglichen Namen erstellt wird. inotifywait -m folgt Dateien anscheinend nach Inode, nicht nach Namen. Nachdem die Datei geändert wurde, wird sie nicht für git commit ohne git add oder git commit -a bereitgestellt . Ich nehme einige Anpassungen vor und verwende Folgendes in Debian, um alle Änderungen an meiner Kalenderdatei zu verfolgen:
/etc/rc.local:
/ home / <Benutzername> / bin / gitwait:
Dies kann verallgemeinert werden, um auf eine Liste von Dateien und / oder Verzeichnissen und die entsprechenden inotifywait- Prozesse zu warten und jedes inotifywait neu zu starten, wenn eine Datei geändert wird.
quelle
Die vorherigen Antworten, in denen inotifywait für diesen Job empfohlen wurde, haben mich in die richtige Richtung gelenkt, als ich dieses Problem selbst hatte, also habe ich ein kleines Skript geschrieben. Zuerst konnte dies nur ganze Ordner rekursiv anzeigen (das Gegenteil von Lester Buck 'Beispiel), aber dann wollte ich auch eine Datei woanders ansehen, also habe ich sie erweitert.
Das Ergebnis ist ein Skript, das derzeit aufgerufen wird
gitwatch
, da es eine Datei oder einen Ordner auf Änderungen überwacht (mithilfe von inotifywait) und diese in ein Git-Repository festschreibt.Das Skript, weitere Informationen und Anweisungen finden Sie auf github: https://github.com/nevik/gitwatch
quelle
Git-Wip ist eine großartige Lösung, die für mich gut funktioniert. "WIP" steht für "work in progress". Jedes Mal, wenn Sie 'git wip' ausführen, werden die Änderungen in einen separaten Zweig übernommen. Es kann in der Befehlszeile ausgeführt werden, es gibt jedoch Erweiterungen für vim und emacs, mit denen git-wip bei jedem Schreiben einer Datei automatisch ausgeführt wird.
quelle
Ich wollte dies in Windows tun und fand heraus, dass der beste Weg darin bestand, Directory Monitor zu verwenden, um nach Änderungen zu suchen , und diese dann auszuführen, wenn eine Änderung festgestellt wurde:
Programm: cmd.exe
Parameter: /CC:\pathToBatchFile.bat
Diese Batch-Datei enthielt:
Ich habe auch versucht, einen anderen Befehl zum Hinzufügen von files (
"%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git add *.*"
) zu verwenden, aber ich glaube nicht, dass das richtig funktioniert.Ich habe auch einen Post-Commit-Hook erstellt, der Folgendes enthält:
(Wenn es Konflikte gäbe, würde dies das Ziehen und das Drücken abbrechen, aber es gab keinen klaren Weg, um festzustellen, dass dies geschehen war - am Ende haben wir die gesamte Idee wegen dieses einen Fehlers aufgegeben.)
Dieser Curl-Befehl teilte meinem Server mit, dass der Code abgerufen werden muss. Alles, was benötigt wurde, um es in PHP zu handhaben, war:
Das einzige Problem dabei war, dass es vom Root-Benutzer anstelle des Apache-Benutzers ausgeführt werden musste, sodass ich auch eine Datei erstellen musste, die Folgendes
/etc/sudoers.d/
enthielt:Für mich hat das ziemlich solide funktioniert. Directory Monitor kann so konfiguriert werden, dass es beim Start ausgeführt und minimiert gestartet wird, und es kann mehrere verschiedene Ordner überwachen
quelle
Autopushing mit aktuellem Datum und Uhrzeit.
quelle
Inotify klingt wirklich nach dem richtigen Werkzeug für den Job.
Es gibt ein Tool namens incron, das genau das sein könnte, wonach Sie suchen. Sie können Dateien oder Ordner (und Ereignistypen wie "Ändern", "Erstellen", "Verknüpfung aufheben") in einer Crontab und einen Befehl angeben, der ausgeführt werden soll, wenn ein solches Ereignis auftritt.
Im Gegensatz zu inotifywait (das Analogon zum Cron des armen Mannes
sleep 10;do stuff
) wird dies jedes Ereignis erfassen , nicht nur das erste.Ich habe es selbst nicht verwendet, aber aus der Dokumentation geht hervor, dass die Einrichtung nicht zu komplex ist.
quelle
Ich habe ein Programm geschrieben, GitPrime , um die automatische Speicherung für Ihre lokalen Git-Repositorys bereitzustellen. Jetzt einfach zurück zu rollen, bevor Sie es kaputt gemacht haben! Bitbucket-Repository .
Dies sollte auf jeder Plattform funktionieren, die eine Bash-Shell unterstützt, einschließlich Windows + Cygwin.
quelle
Falls jemand versucht, dies von Powershell aus zu tun, hatte ich folgenden Erfolg:
quelle
Zwei Lösungen , dass Ich mag sind etckeeper - die zu einem benutzerdefinierten Verzeichnis angepasst werden können , anders als
/etc
:Und gitwatch - speziell die Gebrauchsanweisung
supervisord
.quelle
Wenn Sie den Namen der Datei kennen und nur eine (oder einige) Dateien überwachen möchten, können Sie einfach alle paar Minuten "git commit" aufrufen, um dies zu erreichen. Wenn sich die Datei nicht geändert hat, beschwert sich git nur und Sie müssen diesen Fehler ignorieren, aber ansonsten gibt es keine Beschädigung.
Darüber hinaus möchten Sie diese Dateien als "Auto Commit" markieren, um sie auch manuell festschreiben zu können. Auf diese Weise kann der Benutzer die automatischen Änderungen sowie die größeren "logischen" Änderungen sehen, die von Festschreibungskommentaren begleitet werden, um zu erklären, dass sich diese seit dem letzten manuellen Festschreiben geändert haben.
Verwenden Sie beispielsweise "AUTOCOMMIT" als Festschreibungsnachricht. Später können Sie ein Tool schreiben, um diese Commits mithilfe des Git-Protokolls zu löschen (um die zu tötenden Revisionen herauszufinden), oder Sie können versuchen, einen Zweig AUTOCOMMIT mithilfe einer Brute-Force-Kollisionslösungsstrategie zu erstellen, um die "manuellen Commits" einzuschlagen.
Eine andere Möglichkeit besteht darin, die git-Befehle auf niedriger Ebene zu verwenden, um ein eigenes spezialisiertes Repository zu erstellen.
Zuletzt können Sie die Datei unter automatischen Festschreibungen in einen neuen Namen ("$ filename.ac") kopieren, um zwischen der manuellen und der automatischen Version zu unterscheiden.
quelle
Ich bin mir ziemlich sicher, dass Sie das in den Editor einbinden müssen, den Ihre Benutzer verwenden. Sie könnten etwas schreiben, um Änderungen abzufragen, aber abhängig von den Verwendungsmustern muss die Abrufhäufigkeit möglicherweise unglaublich hoch sein, um sicherzustellen, dass einzelne Änderungen anstelle mehrerer Änderungen erfasst werden.
quelle
Es hört sich so an, als ob Sie nach etwas ähnlichem wie etckeeper suchen , das automatisch alle Änderungen an / etc / * in git (oder einem beliebigen VCS, das Sie möchten) überprüft, aber ich sehe keinen Grund, warum es nicht mit Dateien verwendet werden kann andere als die in / etc.
Wenn Sie sich nur mit einer einzigen Datei befassen möchten, wäre das vielleicht nicht perfekt, aber wenn Sie alles in einem bestimmten Verzeichnis im Auge behalten möchten, lohnt es sich, einen Blick darauf zu werfen.
quelle
Dieses Skript wird nicht ausgeführt, wenn ein Benutzer die Datei ändert, es kann jedoch als Cron-Job ausgeführt werden (indem es in ein Verzeichnis /etc/cron.* abgelegt wird). Dies ist auch eine sinnvolle Lösung.
Dieses Skript durchläuft Ihr Verzeichnis / srv / www (ändern Sie es in den Speicherort aller Ihrer Websites), fügt alle Dateien hinzu, schreibt sie fest und überträgt sie und protokolliert alles in /var/log/gitlog.txt
quelle
Ich hatte das gleiche Problem und auf Mac Launchd bietet Ihnen eine großartige Lösung. Es wird eine Datei oder ein Verzeichnis anzeigen und wenn es Änderungen gibt, können Sie eine App oder etwas anderes ausführen ...
quelle
Ich habe dieses winzige Shell-Skript erstellt, um den Dateistatus zu überwachen und Befehle wie git commit bei erfolgreichem Build auszulösen.
Fühlen Sie sich frei, es herunterzuladen und auszuprobieren.
https://github.com/nzvincent/nzvincent-github/blob/master/inotify-tools/inotify.sh
quelle
Dies erfüllt nicht den "Ideal" -Teil der Frage, aber dies war die Frage, die der Antwort, die ich wollte, am nächsten kam, also dachte ich, dass sie hier hingehen könnte. Mein erster Stackoverflow-Beitrag, also entschuldige mich, wenn ich mich irre.
Das folgende Skript stellt automatische Festschreibungen für gespeicherte Änderungen sicher, fordert den Benutzer jedoch zur Eingabe von Festschreibungen auf. (Mir ist klar, dass mein Szenario etwas anders ist als das von Git-Noob).
quelle
Für Windows
Gemäß diesem Artikel über Autocommit erstellen Sie eine
.bat
Datei mit Inhalten:und ausführen mit
Task Scheduler
. Wenn Sie nicht wissen, wie Sie Schritt für Schritt vorgehen, lesen Sie diesen Artikel.quelle