Szukam implementacji (w systemie Linux) mechanizmu, który automatycznie i przejrzyście aktualizowałby wszelkie zmiany w katalogu (rekurencyjnie). Ma to stanowić dodatek (ewentualnie zamiennik, jeśli wszystkie wymagane funkcje są dostępne) do standardowej wersji (SVN, git, ...)
Produktem w systemie MS Windows, który to robi, jest AutoVer (aby lepiej zrozumieć wymagania). Chciałbym mieć coś takiego, ale ukierunkowanego na Linuksa w środowisku nie graficznym.
Widziałem, że istnieją pewne próby posiadania tej funkcjonalności w Linuksie, najbliższą, którą znalazłem, jest autowersja w Subversion, ale nie jest oczywiste, aby zaimplementować ją w istniejących środowiskach (serwery, na przykład pliki konfiguracyjne są lokalne).
Może coś z czym współpracujesz inotify
?
Z góry dziękuję za wszelkie wskazówki! WoJ
Odpowiedzi:
1. Metoda ogólnego zastosowania przy użyciu bazaru i inotify
To nie jest testowane przeze mnie, ale znalazłem ten napis, który korzysta z
bzr
(bazar) iinotifywait
do monitorowania katalogu i kontroli wersji plików w nim za pomocą bazaru.Ten skrypt wykonuje całą pracę polegającą na obserwowaniu katalogu pod kątem zmian:
2. Zarządzanie / etc
W specjalnym przypadku zarządzania
/etc
katalogiem systemu możesz użyć etckeeper aplikacji .Oto dobry samouczek na początek.
3. Używanie git i incron
Ta technika wykorzystuje
git
iincron
. W przypadku tej metody musisz wykonać następujące czynności:A.Zrób repo
B. Utwórz
$HOME/bin/git-autocommit
skryptC. Dodaj wpis do incrontab
4. Korzystanie z Flashbake
Inną opcją jest użycie narzędzia takiego jak Flashbake . Flashbake to system kontroli wersji, którego Cory Doctorow (znany z BoingBoinga) używa do pisania swoich książek.
Flashbake używa git pod maską do śledzenia zmian, ale jest gdzieś pomiędzy robieniem automatycznych kopii zapasowych a samodzielnym korzystaniem z prostego systemu kontroli wersji.
Zasoby
źródło
Natychmiast przychodzi na myśl ZFS . Może tworzyć migawki - i istnieją pewne projekty do automatycznego tworzenia migawek .
źródło
Myślę, że jesteś na dobrej drodze
inotify
. W tym artykule szczegółowo opisano jego podstawowe użycie w przypadku podobnym do twojego. Sugerowałbym użycie go bezpośrednio lub skompilowanie narzędzia na poziomie jądra, takiego jak fschange . Jest to trochę kłopotliwe, ale możesz powiązać wykrycie zmian zgit commit
podobnym lub podobnym.Oba rozwiązania mają problem polegania na nieco niedoskonałych rozwiązaniach innych firm. Jeśli nie masz nic przeciwko zabrudzeniu rąk, NodeJS zapewnia doskonałe, międzyplatformowe narzędzie ( fs.watch ) do tego właśnie celu. Podstawowy samouczek na temat oglądania plików pod kątem zmian w NodeJS można znaleźć tutaj . W kilkudziesięciu wierszach lub mniej możesz napisać coś, co obejrzy katalog plików, a następnie wydostanie się (poprzez child_process ) i uruchomi
git commit
podobny lub (lub nawet ręcznie zwiększy indeks pliku wersji, jeśli podoba ci się roll-your- własne podejście).fs.watch
jest wspierany przezinotify
Linux, ale jest o wiele bardziej intuicyjny w użyciu. Istnieją inne projekty NodeJS, które obejmują tę funkcję oglądania plików na różnych poziomach wygody, takich jak ten lub ten .źródło
inotify
. Ale dzięki.inotify (2) w systemie Linux nie będzie w stanie oglądać dużego drzewa, ale prawdopodobnie system plików bezpieczników (zamontowany w oddzielnej lokalizacji) prawdopodobnie mógłby to obsłużyć, tłumacząc żądania systemu plików na wywołania svn lub git, lub bezpośrednio zmieniając metadane svn / git.
To bardzo interesujący pomysł, ale nie słyszałem o żadnych istniejących implementacjach.
źródło
Taki skrypt nie jest trudny do napisania.
Moja ulubiona kontrola wersji to git.
powinien to zrobić następujący skrypt:
albo okresowo sprawdzaj katalog - albo czy twój edytor jest skryptowym wywołaniem po zapisaniu.
Ale jeśli zrobisz to w ten sposób, sensowne może być wykluczenie dużych plików i być może niektórych „bezużytecznych”, takich jak automatyczne zapisywanie.
źródło
SparkleShare ( http://sparkleshare.org ) jest oparty na git i implementuje funkcjonalność Dropbox-Like z kontrolą wersji, ale musisz skonfigurować serwer ssh (może być localhost).
źródło
Polecam wypróbować NILFS. Zajrzyj na stronę about, a szybko zdecydujesz, czy to jest to, czego szukasz, czy nie.
HTH
źródło
Istnieje również sposób „biedaka” na robienie tego przy użyciu tylko rsync i zadania cron. Zasadniczo polegasz na narzędziu do tworzenia kopii zapasowych rsync i używasz dwóch oddzielnych ścieżek oraz prefiksu / sufiksu do śledzenia swoich plików.
Mniej więcej wygląda to tak: / usr / bin / rsync -a -A -X --backup --suffix =
date +".%Y-%m-%d_%H-%M-%S"
$ ścieżka_źródłowa $ ścieżka_kopii zapasowejWynik końcowy: zmiana pliku o nazwie test_rsync w ścieżce źródłowej po początkowym wykonaniu spowoduje utworzenie pliku o nazwie test_rsync.2017-02-09_11-00-01 w ścieżce kopii zapasowej.
Jest z tym wiele problemów (działa, jeśli masz tylko przyzwoitą liczbę plików i nie powiedzie się w przypadku zmian, które nastąpią między dwoma kolejnymi uruchomieniami rsync (w moim przypadku 1 minuta)), ale może to wystarczyć dla twoich potrzeb.
Jeśli mówimy tutaj o udostępnianiu samby, lista wykluczeń może być w porządku, nie mam jeszcze tego do czynienia, obawiam się.
Daj mi znać, jeśli to poprawisz.
źródło
Oto skrypt Python3, który wykonuje VMS, takie jak automatyczne wersjonowanie plików przy użyciu znacznika czasu dołączanego do oryginalnej nazwy pliku podczas zapisywania.
Umieściłem w skrypcie sporo komentarzy i uruchomiłem pół tuzina takich skryptów na mojej maszynie ubuntu, przy czym tylko katalogi są różne w każdej innej wersji skryptu, dzięki czemu jednocześnie wersjonuję wiele katalogów. Brak realnej kary dla wydajności maszyn.
! / usr / bin / env python3
print („ROZPOCZĘCIE WERSJI PLIKÓW PROJEKTOWYCH”) print („version_creation.py”) # umieść cały ten kod w skrypcie o tej nazwie print („uruchom jako .. 'python3 version_creation.py' z wiersza poleceń”) print („ctrl” c ', aby zatrzymać ”) print („ ”) print („ Aby uruchomić program w tle poniżej, do wiersza poleceń, a następnie zamknąć okno. ”) print („ nohup python3 version_creation.py ”) print („ .... to zatrzymaj proces przejdź do menu / administracja / monitor systemu ... i zabij python3 ”) drukuj („ ”) drukuj („ Zawsze zapisuj pliki w katalogu „ProjectFiles” i pliki wersji ”) drukuj (” również zostaną utworzone w tym katalogu . ”) print („ ”) print („ ”) print („ ”) print („ ”)
import shutil import os czas importu
--- ustaw przedział czasu, aby sprawdzić nowe pliki (w sekundach) poniżej
- interwał ten powinien być mniejszy niż interwał pojawiania się nowych plików!
t = 10
--- ustaw katalog źródłowy (dr1) i katalog docelowy (dr2)
dr1 = "/ path / to / source_directory"
dr2 = "/ path / to / target_directory"
import glob import os
dr1 = "/ home / michael / ProjectFiles" # oba oryginały i wersje zostaną zapisane w tym katalogu
dr2 = "/ home / michael / ProjectFileVersions"
podczas gdy prawda:
drukuj („Pusty”)
print („1 Ścieżka_pliku_ najnowszych =”, ścieżka_pliku_ najnowszych)
print („2 originalname =”, originalname)
print („filecreation =”, tworzenie plików)
print („fivesec_ago =”, fivesec_ago)
print („timedif =”, timedif)
dzielić
poniższe zostało wstawione wcześniej i działa, ale podoba mi się powyższy skrypt Pythona znacznie lepiej ...... (używam Pythona przez około 3 godziny)
źródło