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.
Odpowiedzi:
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.
źródło
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.
źródło
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.
źródło