Zastosowanie haka po zatwierdzeniu git do wszystkich bieżących i przyszłych repozytoriów

275

Napisałem haczyk Git po zatwierdzeniu i działa poprawnie. Chcę jednak dodać ten haczyk, aby zastosować go do wszystkich bieżących (i przyszłych) repozytoriów git, nad którymi pracuję. Próbowałem dodać hook do mojego ~/.git/hooks/zamiast w katalogu hooks w katalogu projektu, jednak to nie działało.

Czy istnieje sposób tworzenia globalnych haków Git, które będą miały zastosowanie do wszystkich repozytoriów w moim systemie (bez konieczności kopiowania ich do każdego katalogu projektu)? Jeśli nie, jakie byłoby najlepsze rozwiązanie na przyszłość - być może szablon git-init?

Swanson
źródło
3
W Git 2.9 zmieniło się to najlepsze podejście: odpowiedź VonC jest lepszym rozwiązaniem. stackoverflow.com/a/37293198/2741954
Simon Brahan
Czy to odpowiada na twoje pytanie? zmień domyślne git hooki
Oliver Sieweke

Odpowiedzi:

192

Chcę dodać ten hak, aby zastosować go do wszystkich bieżących (i przyszłych) repozytoriów git, nad którymi pracuję

W przypadku git 2.9+ (czerwiec 2016 r.) Wszystko, co możesz zrobić, to:

git config --global core.hooksPath /path/to/my/centralized/hooks

Zobacz „ zmiana domyślnych haków git ”: zostało to zrobione w celu zarządzania scentralizowanymi hakami.

VonC
źródło
jeśli mam istniejące repozytorium i chcę, aby wszyscy inni deweloperzy, którzy ściągają zmiany, mieli zaktualizowany haczyk przed zatwierdzeniem, na przykład jak to zrobić? dziękuję
Richlewis,
@Richlewis masz na myśli stackoverflow.com/a/40550555/6309 nie było całkowicie jasne?
VonC
@Richlewis Musisz skonfigurować folder współdzielony dostępny dla wszystkich programistów, aby mogli odwoływać się w swojej lokalnej konfiguracji.
VonC
niestety wciąż tego nie rozumiem. czy w repozytorium /.git/hooks/pre_commitmogę to wskazać?
Richlewis,
@Richlewis Odpowiedziałem na twoje oryginalne pytanie.
VonC
290

Począwszy od gita 1.7.1, możesz ustawić init.templatedir w swoim gitconfig, aby powiedzieć gitowi, gdzie szukać szablonów.

Ustaw to w ten sposób:

git config --global init.templatedir '~/.git_template'

Następnie nowe repozytoria, które utworzysz lub sklonujesz, użyją tego katalogu do szablonów. Umieść haki, w których chcesz ~/.git_template/hooks. Istniejące repozytoria można ponownie zainicjować za pomocą odpowiednich szablonów, uruchamiając je git initw tym samym katalogu .git.

Dla wersji git starszych niż 1.7.1, bieganie git init --template ~/.git_templatebędzie działać, jeśli jesteś podobny do mnie i nadal chcesz zarządzać .git_templatekatalogiem wraz z resztą plików kropek. Możesz także użyć $GIT_TEMPLATE_DIRśrodowiska, aby określić, git initgdzie znajduje się katalog szablonów.

sklnd
źródło
51
Świetna odpowiedź. Jeśli ktokolwiek zastanawia się, czy ponowne uruchomienie git initna istniejącym repozytorium go wyciera - nie robi tego , patrz: stackoverflow.com/questions/5149694/…
kontur
Dla mnie nie działało ze względną ścieżką do folderu szablonu git do kopiowania plików przy użyciu git init na istniejących repozytoriach. Zamiast tego użyłem pełnej ścieżki.
user847988,
1
W systemie Windows bez cytowania: `git config --global init.templatedir d: \ git \ .git_template \`
Vladimir Vukanac
1
Wskazówka: Haki szablonu są kopiowane. Jeśli chcesz mieć możliwość aktualizacji globalnych haków razem, umieść hak gdzie indziej i dodaj dowiązanie symboliczne w katalogu szablonów (w systemie Linux). Upewnij się, że ścieżka łącza jest bezwzględna.
Tim Allclair,
1
Bieganie git initnie zaktualizowało dla mnie haków. Wygląda na to, że nie zastąpi plików, które już tam są. stackoverflow.com/questions/10791486/ . Zamiast tego musisz najpierw usunąć stare pliki haka.
Phil R
69

Jeśli chcesz je w dowolnym miejscu w systemie (w tym poza użytkownikami), możesz zmodyfikować zawartość zainstalowanego katalogu szablonów - są $PREFIX/share/git-core/templates/hookstam, gdzie $PREFIXprawdopodobnie /usr/locallub /usr.

Jeśli chcesz, aby to było tylko dla Ciebie, tak, najprostszą rzeczą byłaby --templateopcja git-init. Możesz z łatwością zachować osobisty katalog szablonów, który zawiera dowiązania symboliczne z powrotem do zainstalowanej wersji ustawień domyślnych, które chcesz zachować (pojedyncze zaczepy, katalog informacji ...), a następnie własną zawartość hooks/post-commiti wszystko, co chcesz dostosować.

Cascabel
źródło
11
Dzięki, udało się. Aby zastosować z mocą wsteczną do moich istniejących projektów, po prostu uruchomiłem git initponownie i dodałem nowy hak.
swanson
Jest to miłe obejście, ale wymagałoby zmiany wszystkich repozytoriów. Jest to wykonalne, ale czy nie ma żadnej możliwości z wtyczką lub czymś takim (jak to się robi w Bazaar)?
Martin Ueding
2
Dla git SourceTree wbudowanego w OS X, są w/Applications/SourceTree.app/Contents/Resources/git_local/share/git-core/templates/hooks
CupawnTae
1
W systemie Windows można to znaleźć w katalogu instalacyjnym git pod mingw64\share\templates\hooks(lub mingw32 dla 32-bitów)
nerdherd
1
@nerdherd jest teraz w mingw64\share\git-core\templates\hooks(gfw 2.25)
RJFalconer
7

Minimalistyczne podejście polega na utworzeniu git_hooks/katalogu w repozytorium w celu śledzenia haczyków, które piszesz dla tego projektu, zwrócenia na niego uwagi przyszłych użytkowników, wspominając o nim README, i polegania na nich, aby zrobili właściwą rzecz po sklonowaniu. Zastanawiałem się nad tym przez jakiś czas i wybrałem podejście przyrostowe. W dół drogi mogę rozważyć użycie narzędzia takiego jak haczyki .

Neil Best
źródło
1
Jest to tak dalekie od bycia prawdziwym rozwiązaniem, że musiałem przegłosować, przepraszam.
Victor Schröder