Wspominałem o “nienajświetniejszym” działaniu Git pod Windows oraz o tym, że w Mercurialu udało mi się zrobić WIĘCEJ przez 2 godziny niż w Git przez kilka miesięcy. Główną czynnością, którą miałem wówczas na myśli, było udostępnienie swojego repozytorium na zewnątrz.
Linuxowa wersja Gita rozprowadzana jest z komendą git-daemon pozwalającą na zdalne dobranie się do repo po protokole git://. Taki odpowiednik svnserve. Niestety po zainstalowaniu msysgit okazuje się, że w tej wersji deamona po prostu nie ma. Spędziłem zatem… oj, aż wstyd się przyznawać ile czasu, nad udostępnieniem swojego repozytorium przez IIS, aby móc się nim pobawić przez http:// bądź https://. Całość podzielę na dwa etapy:
Repozytorium do odczytu
Na początek wyjaśnienie podstawowej kwestii. Typowe repozytorium które sami tworzymy bądź klonujemy ze zdalnej lokalizacji zawiera elementy należące do jednej z dwóch grup:
1) metadane, czyli informacje o repozytorium, zawarte w katalogu .git
2) working copy, czyli pliki z gałęzi, na której aktualnie pracujemy
Łatwo jednak jest się domyślić, że tworząc repozytorium mające służyć jedynie za mechanizm synchronizujący kod pomiędzy programistami nie potrzebujemy żadnego working copy. Nikt na nim bezpośrednio pracować nie będzie. W celu utworzenia takiego specjalnego “gołego” repo do komendy inicjalizującej przekazujemy dodatkowy parametr:
1: git init --bare procent-repo.git
Ta linijka utworzyła katalog procent-repo.git wraz z odpowiednimi plikami. Jak chwilę pochodzimy po wygenerowanej strukturze to łatwo natkniemy się na wpis w konfiguracji:
[core]
bare = true
I o to dokładnie nam chodzi.
Takie repozytorium już teraz możemy sobie gdzieś sklonować do lokalizacji mającej dostęp do dysku na którym się ono znajduje. Zróbmy więc to, ponieważ udostępnianie repozytorium nabiera sensu dopiero po pierwszym commicie:
1: git clone c:\gitrepos\procent-repo.git cloned-by-disk 2: cd cloned-by-disk 3: copy con firstfile.txt<enter><ctrl+z><enter> 4: git add . 5: git commit -m "initial commit" 6: git push origin master
Zanim zabierzemy się za udostępnianie przez IIS, musimy samego gita poinstruować, że repozytorium powinno być przygotowane na transport protokołem http://. Robi się to bardzo prosto: przez zlecenie komendy update-server-info:
1: C:\gitrepos\procent-repo.git>git update-server-info
Oprócz tego trzeba upewnić się, że ta instrukcja zostanie wykonana po każdej zmianie – każdy commit powoduje konieczność potraktowania repozytorium w ten sposób. Na szczęście rozwiązanie jest właściwie gotowe – odpowiedzią jest hook podpięty pod zdarzenie post-update. Skrypt realizujący dokładnie to zadanie znajdziemy w katalogu hooks, w pliku post-update.sample. Wystarczy zmienić jego nazwę na post-update (uciąć rozszerzenie .sample) i… już!
Została nam tylko konfiguracja samego IISa. Zaczniemy oczywiście od utworzenia katalogu wirtualnego, co żadną mecyją nie jest, zatem ograniczę się do mikrościągawki dla IIS 6.0:
inetmgr -> server -> web sites -> PPM na default web site -> new -> virtual directory -> next -> alias (u mnie: gitrepos) -> ścieżka do katalogu z repozytorium -> next -> finish.
Kolejny krok to zmapowanie plików bez rozszerzeń (bo tak wyglądają wszystkie configi w gicie) na odpowiedni MIME type: PPM na wirtualną ścieżkę gitrepos -> zakładka HTTP Headers -> przycisk MIME Types -> New -> Extension: *, MIME type: application/octet-stream -> OK -> OK -> OK.
Koniec! Prosta komenda:
1: git clone http://localhost/gitrepos/procent-repo.git cloned-by-http
sklonuje nam repozytorium przez http://. Ołjea, teraz każdorazowe pull ściągnie nam zawsze najnowsze zmiany.
Na IIS 7.x konfiguracja wygląda właściwie identycznie, więc nikt nie powinien mieć z tym problemu.
Repozytorium do zapisu
I tu niestety… zonk. Po prostu poległem. Nie wiem czy jest to zwyczajnie niemożliwe czy też zdebilałem do reszty niczym sklonowana owca. Po wielu zmarnowanych godzinach wnioski mam takie: implementacja WebDAV na IIS 6.0 jest niewystarczająca dla gita (komenda LOCK). Implementacji WebDAV na IIS 7.5 nie potrafiłem w żaden sposób zmusić do działania (chociaż zmapować dysk przez http się dało). Nie potrafiłem nawet przejść poza błąd “return code 22“, który w IIS 6.0 zniknął po… instalacji WebDAV.
Niewiele, prawda? Na szczęście nie było mi to do niczego potrzebne… po prostu trudno jest mi się poddać jak już zacznę dłubać w takiej pierdole. Ale tym razem przyznaję – przegrałem.
Jeżeli komuś udało się osiągnąć w pełni funkcjonalne, two-way repo gita na IIS to będę wdzięczy za pomoc :).
(i kolejny raz o Mercurialu: tam wystarczy wywołać komendę hg serve i już, mamy udostępnione repozytorium przez http://)
Przejrzałem jeszcze raz notki o kontroli wersji i nie mogę znaleźć dlaczego jednak wybrałeś tego gita (a nie hg)?
Ciekawe rozwiązania? Geekowa ciekawość?
Jestem również ciekawy Twojej opinii, od którego momentu opłaca się przejście z SVN na DVCS (mam swoje zdanie). Co jest według Ciebie decydujące? Wielkość projektu, liczba developerów, częstotliwość bluzgów przy merge, może stopień rozproszenia?
@PiotrB:
W tym projekcie wybor alternatywy dla SVN nie nalezal do mnie. Ale mysle ze tak czy siak wybralbym gita z jednego z powodow ktore podales – "geekowa ciekawosc":) Tyle o tym ostatnimi czasy w sieci…
Co do przejscia z SVN na DVCS – decydujace jest samo uzycie scentralizowanego repozytorium kodu. Idea taka vs idea rozproszonego modelu przegrywa moim zdaniem w kazdym przypadku. Ja zwykle (choc nie zawsze) pracuje jednoosobowo od bardzo malych – 1,2dniowych – robótek po duze systemy (przewidywany ponad rok pracy) i nigdy nie zdecydowalbym sie juz na SVN. Oczywiscie im wieksze rozproszenie zespolu tym bardziej odczuje sie zalezy plynace z wykorzystania DVCS.