
Poziom tortur: repozytorium w TFS
Zdarzyło Wam się tak, że najpierw ktoś pozwolił Wam dotknąć luksusu, pławić się w nim, a potem to wszystko zabrał? Jak tam mam teraz z repozytorium w projekcie.
Ogólnie wszystkie projekty jakie robimy dla klienta trzymamy w repozytorium Gita. Mamy dosyć dużą dowolność jeśli chodzi o sposób pracy z nimi. Wszystko jest świeże, przejrzyste, przyjemne w używaniu. Jednak trafiają się też projekty, które u klienta już istniały. A w ich przypadku nie zawsze migracja na Gita się odbyła. I właśnie do takiego projektu trafiłem. Nie ma Gita. Nie ma nawet SVNa. Jest za to „lubiany” przez wszystkich TFS.
Co jest nie tak z repo w TFSie?
Ale właściwie dlaczego tak narzekam na to repozytorium? Bierze się to z kilku rzeczy, które dużo lepiej widać w momencie gdy kilka lat pracowało się głównie z Gitem.
Brak lokalnych commitów
Pracując nad czymś albo commituję to od razu do serwera albo nie commituję wcale. Równa się to temu, że każdy commit idzie na build-server. Nie mogę więc zapisywać sobie efektów mojej pracy i na koniec wysłać tylko tego co uważam za finalną wersję. Dlatego mimo, że w Gicie commity robiłem dosyć często to w TFSie ograniczam je do minimum. Zdarza się, że przez to nie mogę pewnych zmian w łatwy sposób cofnąć. Ale z drugiej strony nie chcę mieć dziwnej historii zmian widocznej dla wszystkich (chociaż patrząc po historii w projekcie to nie wszyscy się tym przejmują).
Powolność i awaryjność
TFS działa bardzo wolno. Cokolwiek chcę w nim zrobić wymaga łączenia się z serwerem i zajmuje mnóstwo czasu (jeżeli w ogóle zadziała). Sprawdzanie historii jakiegoś pliku albo przechodzenie między branchami jest strasznie irytujące.
Raz nawet zdarzyło mi się, że chciałem scommitować zmiany ale wysyłanie ich na serwer zatrzymywało się pod koniec. Nic nie pomagało. Ile razy bym nie próbował od nowa. Po prostu nie i koniec. Dopiero na drugi dzień się udało.
No i taka prosta sprawa jak chwilowy brak internetu. Powoduje on przełączenie w tryb offline (z którego wyjść trzeba ręcznie). I uniemożliwia przeglądanie historii ani commitowania czegokolwiek. Przy okazji jesteśmy o braku połączenia informowani na tyle często, że tracimy ochotę na pracę dopóki połączenie nie zostanie przywrócone.
Narzędzia
TFS obsługuje się z poziomu Visual Studio. I jeżeli to co tutaj jest jest najlepszym narzędziem jakie Microsoft mógł wydać to lepiej żeby nie wydawali go wcale.
Pierwsza sprawa to wybór zmian, które chcę dodać do commita. Mogę albo wrzucić cały plik albo całego pliku nie wrzucać. Nadal nie znalazłem możliwości dodania tylko części zmian z pliku!
Wycofywanie zmian też jest tak niepraktyczne jak to tylko możliwe. Zaczynając od tego, że nie mogę odrzucić pojedynczych zmian w pliku to cofając zmiany na dodanym pliku robi się dziwnie. Jeżeli dodałem plik i cofam tą zmianę to plik jest usuwany z solucji ale pozostaje w folderze z projektem. Przez co kilka razy wywalił mi się build. Bo byłem przyzwyczajony, że w Gicie to działa intuicyjnie.
Dodatkowo Team Explorer, którego używamy do commitowania ciągle wykrywa zmiany w plikach, w których nie zmieniałem. Jedyne co z tymi plikami się działo to zostały sprawdzone przez Resharpera. I z jakiegoś powodu TFS wykrywa podkreślone błędy jako zmiany w plikach mimo, że przecież zmian żadnych nie ma o.O
Brak lokalnych gałęzi
Lokalne branche to jest coś co niesamowicie ułatwia testowanie pewnych rozwiązań. Dzięki temu można sobie na boku przetestować pewne zmiany bez konieczności modyfikacji aktualnie działającego kodu. Ale nie w TFSie. Bo on, wzorując się na jedynym słusznym SVNie, nie pozwala na to. Jakiekolwiek rozgałęzienie robimy powoduje ono skopiowanie wszystkiego na serwerze w postaci kolejnego folderu. Przez to nie dość, że serwer musi trzymać niesamowicie dużo danych to w dodatku taka operacja trwa bardzo długo i nie pozwala na szybkie eksperymenty.
Przez to, że gałęzie są tylko na serwerze i są w postaci folderów to aktualnie w projekcie muszę się przedzierać przez spore drzewo różnych zadań. Myślę, że spokojnie jest ich kilkaset bo różne osoby testują różne rozwiązania w różnych fragmentach aplikacji. I mimo, że potrzebują to robić sami nie musząc dzielić się zmianami to gałąź jest widoczna dla wszystkich. Dodatkowo wszystko ważny naprawdę sporo. Raz próbowałem zrzucić sobie projekt jako lokalne repozytorium Gita (żeby przynajmniej lokalnie pracować jakoś wygodnie). Ale kiedy wielkość tylko ostatnich zmian doszła do kilku GB i nie wyglądało na to, że pobieranie ich skończy się tego samego dnia, odpuściłem.
Doceń Gita swego
Można narzekać na złożoność Gita albo na to, że każdy zespół pracuje z nim inaczej. Jednak kiedy korzysta się z niego przez jakiś czas to potem powrót do narzędzi takich jak SVN czy TFS powoduje, że człowiek traci ochotę do pracy. Fakt, że Gita można używać lokalnie, nie musząc wszystkiego wysyłać na serwer dopóki tak nie zadecydujemy jest gigantycznym plusem.
Musząc wrócić do TFSa (bo 3 lata temu też w nim pracowałem) utwierdziłem się tylko w przekonaniu, że Git to najlepsze narzędzie jakie aktualnie mamy dostępne. Dlatego nie ma co narzekać, że firma go wymaga i trzeba się go nauczyć. Bo warto. Dla własnego zdrowia psychicznego.
Ja aby nie pozbawiać się góra przy projektach na tfs korzystałem z https://github.com/git-tfs/git-tfs
Dawno to było, ale dawało radę
Dokładnie tego próbowałem użyć, kiedy pisałem, że chciałem mieć lokalnie Gita. Efekt był taki, że po godzinie pobierania tylko „last changes” z repo TFSa i zajęciu chyba 6GB albo więcej na dysku nadal nie było widać końca tej operacji. Bo projekt ma kilkaset gałęzi w TFSie i każda z nich to kopia projektu i mają mnóstwo swoich zmian.
Jak to dobrze, że ostatni raz używałem TFSa jakieś 8 lat temu i potem nie miałem z nim styczności. Niestety nie wiem jak będzie :D. Z tego co piszesz, wynika, że nic się nie zmieniło. To narzędzie nadal nie nadaje się do pracy.