Jak wymuszasz zachowanie git, w tym lokalnie (szczególnie w systemie Windows)?

13

Zastanawiam się nad przeniesieniem tego sklepu .NET z svn do git, i zidentyfikowałem pewne dodatkowe problemy, które chciałbym znaleźć rozwiązanie, zanim przełączymy przełącznik.

Pytanie, o które pytam w szczególności w tym pytaniu, to egzekwowanie końca linii. Domyślnie git dla systemu Windows instaluje się z poleceniem „checkout crlf, commit lf”, co nie będzie działać dla grupy źródeł, która (o ile mi wiadomo) składa się wyłącznie z zakończeń crlf.

Nie wiem, czy ślepo ufam każdemu deweloperowi, że poprawnie skonfiguruje tę nawet podaną instrukcję, więc rozważam jeden (lub oba) z poniższych, ale byłem ciekawy, czy ktoś tutaj wybrał inną drogę.

  • Hak wstępnego sprawdzania, czy nie ma żadnych zakończeń linii LF (a może wszystkich zakończeń linii LF) i odrzuca w tym przypadku.
  • Skrypt instalacyjny dystrybuowany do deweloperów, który wypełnia globalną konfigurację „jak jest, jak jest”.

PS Pisząc to, przyszło mi do głowy, że początkowa konwersja z svn na git może zatwierdzić domyślny sposób i tak długo, jak ludzie trzymają się tej wartości domyślnej, będzie to również dość płynne. Będąc deweloperem używającym git w sklepie .NET, który zainstalował git z domyślnym „tak jak jest, tak jak jest”, również tam stworzyłem własne problemy (wszystkie zostały wprowadzone domyślnie przed moim przybyciem) . Więc nadal skłaniam się do jakiegoś mechanizmu egzekwowania.

ndarwincorn
źródło
2
Po stronie serwera przechwytującego przed otrzymaniem powinno to być poręczne (upewnij się, że kończą się crlf i jeśli nie, jeśli nie), dzięki zaczepowi aktualizacyjnemu powinieneś być w stanie zaktualizować również wstępne scalanie. Jakiego rodzaju serwera git używasz? Jeśli trzeba to zrobić po stronie stacji roboczej, menedżer konfiguracji może być dobrym rozwiązaniem, ale trudniejszy i z wieloma wadami. Ostatnią
deską
1
Zgadzam się z Tensibai i dodam, że wybrana opcja powinna opierać się na tym, jak ściśle Twoim zdaniem należy to egzekwować. Haczyki przed zatwierdzeniem dla ścisłego egzekwowania, szuflady do raportowania zgodności po zatwierdzeniu.
Dave Swersky
Dzięki Dave, moim uzasadnieniem dla po stronie klienta / bardziej rygorystycznego egzekwowania jest to, że pociągnęłoby to za sobą mniej pracy i szybciej wychwytuje błędy. Nie wchodzę na stacje robocze CM deweloperów, ale serwery deweloperów są w DSC, więc dodanie tego będzie trywialne. Edycja: Dziękuję również @Tensibai ... czy mógłbyś rozwinąć te wady, które widzisz po stronie klienta?
ndarwincorn
1
Głównie, jeśli wymusisz globalną stronę hakową klienta, możesz w efekcie uniemożliwić pracę nad projektami wymagającymi końcowych zakończeń. I musisz to jakoś skonfigurować, nie możesz być pewien, że wszyscy będą postępować zgodnie z prawidłową konfiguracją. Jestem pewien, że istnieją inne pistolety, o których teraz nie myślę
Tensibai,
Co ostatecznie zrobiłeś, aby rozwiązać swój problem?
Newtopian

Odpowiedzi:

6

Aby odpowiedzieć na pytanie, jak wymusić coś na poziomie lokalnym, nie można obejść się bez bardzo ciężkiego podnoszenia i zarządzania stanem każdej stacji roboczej dla programistów, i zazwyczaj jestem zdania, że ​​deweloperzy powinni być prawdopodobnie lokalnymi administratorami przy ich rozwoju. maszyny, ponieważ jeśli nie są, to po prostu spędzą czas zastanawiając się, jak uzyskać te przywileje.

I to prawdopodobnie dlatego, że nie powinieneś dbać o stan konfiguracji lokalnej podczas korzystania z rozproszonej kontroli wersji. Powinieneś dbać tylko o stan swojej konfiguracji. Zakładając, że używasz git jako scentralizowanego systemu kontroli wersji, ponieważ tak właśnie robi każdy, ponieważ jest to najłatwiejsze, to załóżmy, że „twoja” konfiguracja jest kopią kodu zapisaną na centralnym serwerze.

W takim przypadku nie należy akceptować scalania, które, jak wspomniałeś, przerywa zakończenia linii crlf / lf. Więc egzekwować, że gdy kilka innych prób klienckie do pchania zmiany logiki po stronie serwera, który odrzuca wniosek zanieczyszczać swoją repo z ich potencjalnie zerwania wyborów stylistycznych.

hvindin
źródło
4

Wymagamy procesu przeglądu przy użyciu żądań Pull w github do naszych głównych gałęzi deweloperów lub masterów. Podczas tego procesu recenzji oznaczymy żądania ściągnięcia jako wymagające zmian, jeśli wiele plików ma białe znaki lub różnice w końcówkach linii, i nalegamy, aby postępowali zgodnie z formatowaniem gałęzi deweloperskiej lub master, dla której żądają ściągnięcia.

Istnieje również kilka fajnych narzędzi w zależności od używanych języków i używanych narzędzi CI, które mogą podczas procesu kompilacji lub pobierania żądania automatycznie sformatować kod na podstawie skonfigurowanych reguł. Pomaga to również zachować spójność kodu i minimalizować problemy z formatowaniem podczas zatwierdzania kodu.

avi
źródło
Czy chciałbyś rozwinąć narzędzia, których używasz? Biorąc pod uwagę, że istnieje wiele sposobów na osiągnięcie tego, a my mamy swoje, ale musimy je jeszcze naprawdę wdrożyć w ten sposób, jestem ciekawy, jak to rozwiązujesz.
ndarwincorn 25.04.17
1
Używamy maszynopisu, githuba i jenkinsa. Maszynopis ma fajny ekosystem dla tego typu rzeczy.
avi
3

Możesz użyć konfiguracji dla każdego repozytorium, aby zastąpić konfigurację użytkownika dla poszczególnych repozytoriów. Po wykonaniu repo uważanego za centralne źródło powinno się ono rozprzestrzeniać za pomocą klonów i ściąga do innych repozytoriów, w tym lokalnych, zastępując centralnie lokalną konfigurację.

Możesz dodatkowo wymusić to poprzez przechwytywanie w centralnym repozytorium, aby sprawdzić, czy końce plików są takie, jakie powinny być, i odrzucić scalanie / wypychanie, jeśli nie jest to koszerne. Jednak te haczyki nie sklonują się z repozytorium, przynajmniej nie bezpośrednio, ale nie jest to konieczne, ponieważ reguły naprawdę trzeba egzekwować tylko w centralnym repozytorium.

Korzystając z szablonów w git init , możesz upewnić się, że repozytorium jest tworzone tak samo, jak wszystkie pliki gitignore, gitattributes itp. Tak, jak chcesz.

Ostatnią rzeczą, niezwiązaną bezpośrednio z twoim pytaniem, znalazłem największy punkt tarcia, gdy zabrałem zespół svn saavy do przepływu pracy opartego na git, co przyzwyczai ich do dodatkowego repo w środku. Odkryłem, że ten wizualny arkusz ze wskazówkami pomógł nieco wyjaśnić, które polecenie miało wpływ na jaką część.

Mam nadzieję, że to trochę pomogło.

Newtopian
źródło