OpCode.eu.org

Blog O autorze O serwisie
2026-09-23

Git LFS (+ repo check)

GIT LFS

Normalne repozytoria git działają out-of-box z ssh. Zmienia się to drastycznie przy repozytoriach korzystających z LFS. W standardowym podejściu wymagane jest zainstalownaie po stronie serwera narzędzia git-lfs-transfer, które posiada kilka implementacji (co najmniej dwie - porównaj https://me.micahrl.com/til/git-lfs-transfer/), jednak żadna z nich nie znajduje się w pakiecie git-lfs i żadna z nich nie jest dostarczana jako paczka Debiana.

Alternatywnie można skorzystać ze skryptu git-lfs-standalonetransfer-ssh. Lekko zmodyfikowaną jego wersję (przede wszystkim odporność na baner serwera wysyłany po ssh) zamieszczam w moim repo DesktopConfig.

Poniżej instrukcja konfiguracji repo git lfs korzystającego z tego skryptu.

konfiguracja repozytoriów LFS

repo zdalne

inicjalizacja jako typowe „bare” repo:

ssh $USER@$HOST "git init --bare $PATH"

repo lokalne

ORIGIN_SSH_URL="ssh://$USER@$HOST/$PATH"

git init .
git remote add origin "$ORIGIN_SSH_URL"

git lfs install
git config "remote.origin.lfsurl" "http://client_side_$ORIGIN_SSH_URL"
git config "lfs.http://client_side_$ORIGIN_SSH_URL.locksverify" false

git config lfs.customtransfer.client_side_ssh.path "git-lfs-standalonetransfer-ssh"  # gdy nie jest w $PATH należy podać pełną ścieżkę
git config "lfs.http://client_side_$ORIGIN_SSH_URL.standalonetransferagent" client_side_ssh

pobranie albo inicjalizacja nowego repo

pobieramy repo z $ORIGIN_SSH_URL

git fetch origin
git checkout origin/master -b master

inicjalizacja nowego repo:

# definiujemy typy plików które mają być obsługiwane przez lfs

git lfs track "*.jpg"
git lfs track "*.xz"
git add .gitattributes

# robimy pierwszy commit

git commit -m "Init"
git push origin master

(opcjonlne) testowanie LFS

git add grass.jpg
git commit -m test
git lfs ls-files -la

git push origin master

czyszczenie LFS

LFS pozwala na pozbywanie się zbędnych kopii plików binarnych. Powyższe podejście w odróżnieniu od:

REMOTE_LFS_PATH="$(git remote get-url ${REMOTE:-origin} | sed -Ee 's#ssh://(.*@)?##' -e 's#/#:/#')/lfs/objects"
rsync -e 'ssh' -rltuP --partial-dir=."~tmp~" --delete .git/lfs/objects/ "$REMOTE_LFS_PATH"

pozwala na pozbycie się wszystkich plików binarnych z lokalnej kopii repozytorium (pozwala to zmniejszyć zajętość dysku o połowę - mamy tylko pliki binarne w kopii roboczej a nie w .git).

Zamieszczam skrypt który w repo z kopią roboczą usuwa (dla bezpieczeństwa jedynie przenosi do /tmp) wszystkie pliki binarne z katalogu repozytorium (zostawiając jedynie kopię roboczą), a w repozytorium typu „bare” usuwa wszystkie pliki które nie znajdują się w branchu master.

bonus - sprawdzanie stanu repozytoriów

Bonusowo skrypt sprawdzający stan (opublikowanie w publicznym reopo, niezacomitowane zmiany, pliki nie dodane do repozytorium) w repozytoriach.

Tagi: git