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.