Chciałbym użyć git do zapisania wszystkich zmian w pliku.
Czy istnieje sposób, w jaki mogę włączyć „zatwierdzenie” git, aby było wykonywane automatycznie za każdym razem, gdy plik jest aktualizowany - więc dla każdej zmiany w pliku jest nowe zatwierdzenie?
Idealnie chciałbym, aby moi użytkownicy nawet nie wiedzieli, że git działa za kulisami. Użytkownik mógłby wtedy potencjalnie „cofnąć” zmiany w pliku - a można to osiągnąć, wyciągając poprzednią wersję z gita.
Odpowiedzi:
W Linuksie możesz użyć inotifywait, aby automatycznie wykonać polecenie za każdym razem, gdy zawartość pliku zostanie zmieniona.
Edytuj: poniższe polecenie zatwierdza plik.txt zaraz po jego zapisaniu:
źródło
-r
flagi, abyinotifywait
, ale pamiętaj, że jądro ma ograniczenie liczby zegarków inotifywait, które może ustawić.man inotifywait
powie ci więcej.Wcześniejsza odpowiedź inotifywait jest świetna, ale nie jest to kompletne rozwiązanie. Jak napisano, jest to jednorazowe zatwierdzenie jednorazowej zmiany w pliku. Nie działa to w typowym przypadku, w którym edycja pliku tworzy nowy i-węzeł z oryginalną nazwą. inotifywait -m najwyraźniej podąża za plikami według i-węzła, a nie według nazwy. Ponadto po zmianie pliku nie jest on przemieszczany do git commit bez git add lub git commit -a . Dokonując pewnych poprawek, oto czego używam w Debianie do śledzenia wszystkich zmian w moim pliku kalendarza:
/etc/rc.local:
/ home / <nazwa użytkownika> / bin / gitwait:
Można to uogólnić, aby czekać na liście plików i / lub katalogów oraz odpowiednich procesów inotifywait i ponownie uruchamiać każdy inotifywait, gdy plik zostanie zmieniony.
źródło
Poprzednie odpowiedzi, które zalecały inotifywait do tej pracy, wskazały mi właściwy kierunek, kiedy sam miałem ten problem, więc napisałem mały skrypt. Na początku można było oglądać rekursywnie tylko całe foldery (przeciwieństwo przykładu Lestera Bucka), ale potem chciałem też obejrzeć plik gdzie indziej, więc go rozszerzyłem.
Rezultatem jest obecnie wywoływany skrypt
gitwatch
, ponieważ to właśnie robi: obserwuje plik lub folder pod kątem zmian (używając inotifywait) i zatwierdza je do repozytorium git.Możesz znaleźć skrypt, więcej informacji i instrukcji na github: https://github.com/nevik/gitwatch
źródło
git-wip to świetne rozwiązanie, które dobrze mi się sprawdza. „WIP” oznacza „prace w toku”. Za każdym razem, gdy uruchamiasz 'git wip', zmiany są zatwierdzane w oddzielnej gałęzi. Można go uruchomić z wiersza poleceń, ale istnieją rozszerzenia dla vim i emacs, które automatycznie uruchamiają git-wip za każdym razem, gdy plik jest zapisywany.
źródło
Chciałem to zrobić w systemie Windows i stwierdziłem, że najlepszym sposobem jest użycie Monitora katalogów do sprawdzenia zmian, a następnie po wykryciu zmiany uruchom:
Program: cmd.exe
Parametry: /CC:\pathToBatchFile.bat
Ten plik wsadowy zawierał:
Próbowałem też mieć tam inne polecenie dodawania plików (
"%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git add *.*"
), ale nie sądzę, że działało poprawnie.Zrobiłem również hak po zatwierdzeniu zawierający:
(Gdyby były jakieś konflikty, przerwałoby to wyciąganie i przerwanie pchania, ale nie było żadnego jasnego sposobu, aby to stwierdzić - w końcu porzuciliśmy cały pomysł z powodu tej jednej wady).
To polecenie curl powiedziało mojemu serwerowi, że musi wyciągnąć kod. Wszystko, co było potrzebne do obsługi tego w php, to:
Jedynym problemem było to, że musiał być uruchamiany przez użytkownika root zamiast użytkownika apache, więc musiałem również zrobić plik
/etc/sudoers.d/
zawierający:Myślę, że to działało całkiem solidnie. Directory Monitor można skonfigurować tak, aby działał przy starcie i uruchomieniu zminimalizowanym i może obserwować kilka różnych folderów
źródło
autopushing z aktualną datą i godziną.
źródło
Inotify naprawdę brzmi jak odpowiednie narzędzie do pracy.
Istnieje narzędzie o nazwie incron, które może być dokładnie tym, czego szukasz. Możesz określić pliki lub foldery (i typy zdarzeń, takie jak „zmień”, „utwórz”, „odłącz”) w czymś takim jak tabela crontab oraz polecenie, które ma być uruchamiane, gdy takie zdarzenie wystąpi.
W przeciwieństwie do inotifywait (który byłby odpowiednikiem crona biednego człowieka
sleep 10;do stuff
), to złapie każde zdarzenie, nie tylko pierwsze.Sam tego nie używałem, ale z dokumentacji wynika, że konfiguracja nie jest zbyt skomplikowana.
źródło
Napisałem program GitPrime , aby zapewnić automatyczne zapisywanie dla lokalnych repozytoriów Git. Teraz łatwo cofnąć się, zanim go zepsułeś! Repozytorium Bitbucket .
Powinno to działać na każdej platformie obsługującej powłokę bash, w tym Windows + Cygwin.
źródło
Na wypadek, gdyby ktoś próbował to zrobić z Powershell, odniosłem sukces, używając następującego:
źródło
Dwa rozwiązania, które mi się podobają, to etckeeper - które można dostosować do niestandardowego katalogu innego niż
/etc
:Oraz gitwatch - zwłaszcza instrukcje, jak go używać z
supervisord
.źródło
Jeśli znasz nazwę pliku i chcesz monitorować tylko jeden (lub kilka plików), możesz po prostu wywoływać „git commit” co kilka minut, aby to osiągnąć. Jeśli plik się nie zmienił, git po prostu narzeknie i będziesz musiał zignorować ten błąd, ale poza tym nie będzie korupcji.
Oprócz tego będziesz chciał oznaczyć te pliki jako „automatyczne zatwierdzanie”, aby móc również zatwierdzać ręcznie. W ten sposób użytkownik może zobaczyć automatyczne zmiany, a także większe „logiczne” zmiany, którym towarzyszą komentarze dotyczące zatwierdzania, wyjaśniające, co zmieniło się od ostatniego ręcznego zatwierdzenia.
Na przykład użyj „AUTOCOMMIT” jako komunikatu o zatwierdzeniu. Później możesz napisać narzędzie do usuwania tych zatwierdzeń za pomocą dziennika git (aby znaleźć wersje do zabicia) lub możesz spróbować utworzyć gałąź AUTOCOMMIT, używając strategii rozwiązywania kolizji brutalnej siły, aby wbić w "ręczne zatwierdzenie".
Inną opcją jest użycie niskopoziomowych poleceń git do zbudowania własnego wyspecjalizowanego repozytorium.
Wreszcie, możesz skopiować plik do nowej nazwy („$ filename.ac”) podczas wykonywania automatycznych zatwierdzeń, aby odróżnić wersję ręczną od automatycznej.
źródło
Jestem prawie pewien, że musiałbyś podłączyć to do dowolnego edytora, którego używają Twoi użytkownicy. Możesz napisać coś do sondowania pod kątem zmian, ale w zależności od wzorców użytkowania częstotliwość odpytywania może być niewiarygodnie wysoka, aby upewnić się, że zbiera poszczególne zmiany zamiast wielu zmian.
źródło
Wygląda na to, że szukasz czegoś podobnego do etckeeper , który jest zaprojektowany do automatycznego sprawdzania wszystkich twoich zmian w / etc / * w git (lub jakimkolwiek VCS, który chcesz), ale nie widzę powodu, dla którego nie można go używać z plikami inne niż te w / etc.
Jeśli chcesz zajmować się tylko jednym plikiem, może nie byłoby to idealne, ale jeśli chcesz śledzić wszystko w danym katalogu, myślę, że warto to sprawdzić.
źródło
Ten skrypt nie działa, gdy użytkownik zmienia plik, ale można go uruchomić jako zadanie cron (upuszczając go do katalogu /etc/cron.*), co również jest rozsądnym rozwiązaniem.
Ten skrypt przejdzie przez twój katalog / srv / www (zmień go na miejsce, w którym są przechowywane wszystkie twoje witryny), doda, zatwierdza i wypycha wszystkie pliki oraz loguje wszystko do /var/log/gitlog.txt
źródło
Miałem ten sam problem i na mac launchd zapewnia świetne rozwiązanie. będzie obserwować plik lub katalog, a jeśli są zmiany, możesz uruchomić aplikację lub cokolwiek innego ...
źródło
Zrobiłem ten mały skrypt powłoki, aby monitorować stan plików i uruchamiać polecenia, takie jak git commit po powodzeniu kompilacji.
Zapraszam do pobrania i wypróbowania.
https://github.com/nzvincent/nzvincent-github/blob/master/inotify-tools/inotify.sh
źródło
To nie odpowiada części „Idealnie” pytania, ale było to najbliższe pytanie, które widziałem, odpowiadające odpowiedzi, której szukałem, więc pomyślałem, że może tu trafić. Mój pierwszy post dotyczący stackoverflow, więc przepraszam, jeśli się mylę.
Poniższy skrypt zapewnia automatyczne zobowiązuje zapisanych na zmiany, ale nie pyta użytkownika o popełnić wejście. (Zdaję sobie sprawę, że mój scenariusz różni się nieco od scenariusza git-noob).
źródło
Dla Windowsa
Zgodnie z tym artykułem o autocommit , powinieneś utworzyć
.bat
plik z zawartością:i wykonaj za pomocą
Task Scheduler
. Jeśli nie wiesz, jak to zrobić krok po kroku, zapoznaj się z tym artykułem.źródło