Napisałem własny, niestandardowy hook post-merge, teraz dodałem katalog "hooks" do mojego głównego folderu projektu (ponieważ git nie śledzi zmian w .git / hooks), gdzieś przeczytałem, że mogę utworzyć symboliczne łącze z hooków do .git / hooks, więc nie muszę kopiować pliku z jednego folderu do drugiego za każdym razem, gdy ktoś go zmieni, więc spróbowałem:
ln -s -f hooks/post-merge .git/hooks/post-merge
Ale to nie działa, jakieś pomysły dlaczego? "ln hooks / post-merge .git / hooks / post-merge" działa dobrze, ale tworzenie twardego linku jest takie samo jak kopiowanie.
.git/hooks/
wskazujące nahooks/post-merge
zostanie rozwiązane na.git/hooks/hooks/post-merge
, które nie istnieje. Chceszln -s -f ../../hooks/post-merge .git/hooks/post-merge
. Lub ułatwić Ci życie:ln -s -f ../hooks .git/hooks
. Twój problem nie ma nic wspólnego z git..git/hooks
.Odpowiedzi:
właśnie użyłeś złej ścieżki, powinno to być:
źródło
cd
znajdowałem. Czy nie powinno tak byćln -s ./hooks/
?.git/hooks
jako swojego katalogu roboczego, więc ścieżki względne powinny być względne w stosunku do tego katalogu. Jest to bardziej oczywiste, jeśli najpierwcd
się.git/hooks
przed podjęciem dowiązania i dowiedzieć się ścieżki względnej stamtąd.ln
zostanie zapisane jako cel i rozstrzygnięte w zależności od lokalizacji łącza.cd
wejście do programu.git/hooks
przed utworzeniem łącza pomoże ci napisać polecenie, ponieważ możesz następnie automatycznie uzupełnić do prawidłowej ścieżki.prepare-commit-msg
. Problem polega na tym, że jeśli edytuję komunikat o zatwierdzeniu za pomocą nano, a następnie Ctl + X wychodzi, aby przerwać, git i tak nadal kończy zatwierdzanie zamiast przerywać, tak jak przed wprowadzeniem tej zmiany. Czy istnieje sposób na wyjście z nano bez powodowania zakończenia tego zobowiązania?Chociaż możesz używać dowiązań symbolicznych, możesz także zmienić folder hooks dla swojego projektu w ustawieniach git za pomocą:
Który jest domyślnie lokalny, więc nie zepsuje przechwytywania git dla innych projektów. Działa dla wszystkich haków w tym repozytorium, więc jest szczególnie przydatne, jeśli masz więcej niż jeden punkt zaczepienia.
Jeśli masz już niestandardowe hooki
.git/hooks/
, których nie chcesz udostępniać swojemu zespołowi, możesz dodać je w hookach / i dodać,.gitignore
aby nie były udostępniane.źródło
Zmiana katalogu przed połączeniem
źródło
cd
:ln -s -f ../../hooks/post-merge
Obliczanie ścieżki odbywa się względem łącza symbolicznego. Rozumiemy na przykładzie,
ln -s path/to/file symlink/file
Tutaj ścieżka do pliku powinna faktycznie być ścieżką względną ze ścieżki dowiązania symbolicznego.
System faktycznie oblicza ścieżkę pliku, jak
symlink/path/path/to/file
Powyższe polecenie powinno zostać ponownie zapisane jako
ln -s ../path/to/file symlink/path
Struktura folderów jest taka ,
źródło
Korzystając z komentarza Michaela Cihara, oto przykład skryptu bash, który napisałem, aby po prostu utworzyć te dowiązania symboliczne. Ten skrypt znajduje się w git_hooks / dir, który znajduje się w katalogu głównym projektu. Mój folder .git / również znajduje się na tym samym poziomie katalogu.
Mój skrypt musi być uruchamiany z rzeczywistego katalogu git_hooks /. Jeśli chcesz, możesz go zmodyfikować, aby zachowywał się inaczej.
Ten skrypt dowiązuje symbolicznie do każdego pliku, który nie ma rozszerzenia pliku w katalogu git_hooks /. Mam plik README.txt w tym katalogu + ten skrypt (o nazwie symlink.sh). Wszystkie rzeczywiste punkty zaczepienia gita noszą nazwy „pre-commit”, „pre-push” itd., Więc będą dowiązane symbolicznie.
źródło
dlaczego nie tylko cp ./hooks/* .git / hooks /
to działało dla mnie w systemie Mac OS
źródło
I don't have to copy the file from one folder to the other every time someone changes