git-annex jest rozproszonym system synchronizacji plików opartym o git.
inicjalizacja i konfiguracja repozytorium
Po zainicjalizowaniu repozytorium git należy zainicjalizować repozytorium annex. Można także podać jego nazwę, która pomoże w ustaleniu np. na którym nośniku się ono znajduje.
git init .
git annex init
Możliwe jest skonfigurowanie automatyczne dodawanie przez git add plików do annex (a nie do git) w oparciu o ich rozszerzenie (podobnie jak ma to miejsce w git-lfs):
echo '*.mp4 annex.largefiles=anything' >> .gitattributes
git add .gitattributes
UWAGA: dodawanie z użyciem git add sposób nie będzie respektować ustawienia annex.addunlocked == false.
tryby
Obecnie domyślnym trybem działania annex jest umieszczanie w repozytorium git w miejsce plików obsługiwanych przez git plików tekstowych wskazujących na obiekt w .git/annex/objects.
Git przy operacji checkout podmieni te pliki na kopię plików z .git/annex/objects.
UWAGA: Na systemach niewspierających „Copy on Write” spowoduje to zwiększenie rozmiaru repozytorium (te same pliki są trzymane w kopii roboczej i w .git/annex/objects.
Na systemach obsługujących „Copy on Write” (np. współczesny xfs) problem ten nie wystąpi - do momentu modyfikacji którejś z tych wersji dane na dysku będą współdzielone.
Jednak du będzie pokazywał błędny rozmiar - zobacz du kłamie, czyli copy-on-write i reflink.
tryb symlink
Annex może działać w trybie symlinków, gdzie w kopii roboczej znajduje się link symboliczny do pliku w .git/annex/objects, a plik ten jest ustawiony jako tylko do odczytu.
Możliwe jest wymuszenie tego trybu pracy poprzez:
git config annex.addunlocked false
W tym trybie git annex add przenosi dodawany plik do .git/annex/objects a w jego miejsce tworzy link symboliczny.
UWAGA: Działa tylko przy dodawaniu pliku poprzez git annex add (nie git add).
podstawowe operacje
- (jawne) dodanie do annex:
git annex add PLIK - odblokowanie pliku do edycji – zamiana symlinku na kopię (CoW / reflink) pliku:
git-annex unlock PLIK - zablokowanie pliku – zamiana na symlink do pliku read-only:
git-annex lock PLIK - wyszukanie nieaktualnych:
git annex unused- usuwanie nieaktualnych:
git-annex dropunused NUMER_PLIKU
- usuwanie nieaktualnych:
zasoby zdalne (remotes)
standardowy remove git na ssh
# konfiguracja
git remote add origin ssh://rrp@localhost/tmp/o1
# push do remote (zarówno git jak i pliki annex)
git annex push origin
UWAGA: Wymagana dostepność git-annex także po stronie zdalnej.
remote rsync trzymający katalog roboczy
# konfiguracja
git annex initremote ZDALNY1 type=rsync rsyncurl=rrp@localhost:/tmp/ZZ encryption=none exporttree=yes
# wysłanie danych do takiego remote
git annex export HEAD --to ZDALNY1
Google Drive trzymający katalog roboczy
# konfiguracja
rclone config # tworzymy nowy remote GZDALNY1
rclone lsd G1ZDALNY1 # opcjonalnie test tego remote
git annex initremote GZDALNY1 type=external externaltype=rclone target=GZDALNY1 rclonepath=REMOTE_DIR encryption=none exporttree=yes
# wysłanie danych do takiego remote
git annex export HEAD --to GZDALNY1