OpCode.eu.org

Blog O autorze O serwisie
2026-10-13

git-annex

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

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
Tagi: git