Czy uważa się to za złą praktykę - umieszczanie .git / hooks w repozytorium projektów (na przykład przy użyciu dowiązań symbolicznych). Jeśli tak, jaki jest najlepszy sposób na dostarczenie tych samych haków różnym użytkownikom git?
Ogólnie zgadzam się z Scytale, z kilkoma dodatkowymi sugestiami, na tyle, że warto osobną odpowiedź.
Najpierw powinieneś napisać skrypt, który utworzy odpowiednie dowiązania symboliczne, szczególnie jeśli te haki dotyczą egzekwowania zasad lub tworzenia przydatnych powiadomień. Ludzie będą o wiele bardziej skłonni do używania haczyków, jeśli będą mogli po prostu pisać, bin/create-hook-symlinks
niż jeśli sami to zrobią.
Po drugie, bezpośrednie łączenie haczyków zapobiega dodawaniu własnych haczyków przez użytkowników. Na przykład podoba mi się przykładowy hak wstępnego zatwierdzania, który zapewnia, że nie mam żadnych błędów spacji. Świetnym sposobem na obejście tego jest umieszczenie skryptu opakowującego haczyki w repozytorium i dowiązanie do niego wszystkich haków. Opakowanie może następnie zbadać $0
(zakładając, że jest to skrypt bash; odpowiednik jak w argv[0]
innym przypadku), aby dowiedzieć się, który hak został wywołany, a następnie wywołać odpowiedni hak w repozytorium, a także hak odpowiedniego użytkownika, którego nazwa będzie musiała zostać zmieniona , przekazując każdemu wszystkie argumenty. Szybki przykład z pamięci:
#!/bin/bash
if [ -x $0.local ]; then
$0.local "$@" || exit $?
fi
if [ -x tracked_hooks/$(basename $0) ]; then
tracked_hooks/$(basename $0) "$@" || exit $?
fi
Skrypt instalacyjny przesunąłby wszystkie istniejące zaczepy na bok (dopisał .local
do ich nazw) i dowiązał wszystkie znane nazwy zaczepów do powyższego skryptu:
#!/bin/bash
HOOK_NAMES="applypatch-msg pre-applypatch post-applypatch pre-commit prepare-commit-msg commit-msg post-commit pre-rebase post-checkout post-merge pre-receive update post-receive post-update pre-auto-gc"
# assuming the script is in a bin directory, one level into the repo
HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks
for hook in $HOOK_NAMES; do
# If the hook already exists, is executable, and is not a symlink
if [ ! -h $HOOK_DIR/$hook -a -x $HOOK_DIR/$hook ]; then
mv $HOOK_DIR/$hook $HOOK_DIR/$hook.local
fi
# create the symlink, overwriting the file if it exists
# probably the only way this would happen is if you're using an old version of git
# -- back when the sample hooks were not executable, instead of being named ____.sample
ln -s -f ../../bin/hooks-wrapper $HOOK_DIR/$hook
done
chmod +x .git/hooks/*
do ciebie,bin/create-hook-symlinks
żeby to zrobić.HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks
.Nie, umieszczenie ich w repozytorium jest w porządku, sugeruję nawet zrobienie tego (jeśli są one przydatne również dla innych). Użytkownik musi je wyraźnie włączyć (jak powiedziałeś, na przykład poprzez symlinkowanie), co z jednej strony jest trochę uciążliwe, ale z drugiej strony chroni użytkowników przed uruchomieniem dowolnego kodu bez ich zgody.
źródło
Obecnie można wykonać następujące czynności, aby ustawić katalog, który jest pod kontrolą wersji, aby mieć swój katalog haki git, na przykład,
MY_REPO_DIR/.githooks
byłobyNadal nie można go bezpośrednio wyegzekwować, ale jeśli dodasz notatkę do README (lub cokolwiek innego), wymaga to minimalnego wysiłku ze strony każdego programisty.
źródło
Ze strony http://git-scm.com/docs/git-init#_template_directory możesz użyć jednego z tych mechanizmów, aby zaktualizować katalog .git / hooks każdego nowo utworzonego repozytorium git:
źródło
Zapisz w projekcie i zainstaluj w kompilacji
Jak twierdzą inni w swojej odpowiedzi: Jeśli twoje haki są specyficzne dla twoich konkretnych projektów, dołącz je do samego projektu, zarządzanego przez git. Chciałbym pójść jeszcze dalej i powiedzieć, że biorąc pod uwagę, że dobrą praktyką jest budowanie projektu za pomocą jednego skryptu lub polecenia, podczas kompilacji należy zainstalować haki.
Napisałem artykuł o zarządzaniu git hookami , jeśli chcesz przeczytać o tym nieco głębiej.
Java i Maven
Pełne wyłączenie odpowiedzialności; Napisałem wtyczkę Maven opisaną poniżej.
Jeśli zajmujesz się zarządzaniem kompilacją za pomocą Maven dla swoich projektów Java, następująca wtyczka Maven obsługuje instalowanie haków z lokalizacji w twoim projekcie.
https://github.com/rudikershaw/git-build-hook
Umieść wszystkie swoje haki Git w katalogu w swoim projekcie, a następnie skonfiguruj,
pom.xml
aby zawierał następującą deklarację wtyczki, cel i konfigurację.Po uruchomieniu kompilacji projektu wtyczka skonfiguruje git, aby uruchamiał przechwytywanie z określonego katalogu. To skutecznie ustawi haki w tym katalogu dla wszystkich pracujących nad twoim projektem.
JavaScript i NPM
W przypadku NPM istnieje zależność o nazwie Husky, która pozwala instalować haki, w tym te napisane w JavaScript.
Inne
Dodatkowo istnieje wstępne zatwierdzenie dla projektów Python, Overcommit dla projektów Ruby i Lefthook dla projektów Ruby lub Node.
źródło
Pakiet https://www.npmjs.com/package/pre-commit npm obsługuje to elegancko, umożliwiając określenie przechwyceń przed zatwierdzeniem w pliku package.json.
źródło
W przypadku projektów PHP opartych na Composer możesz automatycznie dystrybuować je do inżynierów. Oto przykład haków poprzedzających zatwierdzenie i zatwierdzenie msg.
Utwórz
hooks
folder, a następnie w pliku composer.json:Następnie możesz je nawet aktualizować, gdy projekt jest kontynuowany, gdy wszyscy są uruchomieni
composer install
regularnie działają.źródło
Oto skrypt add-git-hook.sh, który można wysłać jako zwykły plik w repozytorium i można go wykonać w celu dołączenia haka git do pliku skryptu. Dostosuj używany hak (pre-commit, post-commit, pre-push itp.) Oraz definicję haka w heredoc kota.
Ten skrypt może mieć sens z uprawnieniami do wykonywania lub użytkownik może go uruchomić bezpośrednio. Użyłem tego do automatycznego ściągania git-pull na innych maszynach po popełnieniu.
EDYCJA - odpowiedziałem na łatwiejsze pytanie, które nie było pytaniem i nie było tym, czego szukał OP. Opinie o przypadkach użycia i argumentach dotyczących wysyłania skryptów przechwytujących w repozytorium w porównaniu do zarządzania nimi zewnętrznie w komentarzach poniżej. Mam nadzieję, że to było więcej, czego szukasz.
źródło
Możesz użyć rozwiązania zarządzanego do zarządzania przechwytem przed zatwierdzeniem, takiego jak zatwierdzenie wstępne . Lub scentralizowane rozwiązanie dla haczyków typu git po stronie serwera, takich jak Datree.io . Ma wbudowane zasady, takie jak:
Nie zastąpi wszystkich twoich haków, ale może pomóc twoim programistom w najbardziej oczywistych, bez konfiguracji konfiguracji instalowania haków na każdym komputerze / repozytorium każdego programisty.
Oświadczenie: Jestem jednym z założycieli Datrees
źródło