2010-11-13 7 views
6

Planuję napisać kilka haków git jako projekt, który rejestruje działania użytkownika w bazie danych. Ta baza danych może następnie służyć do sprawdzania wszystkich swoich działań. Działania Próbuję zalogować sięGit global hook customization

  • popełnić
  • ciągnąć
  • Push
  • seryjnej
  • oddział

Chcę, aby to zapakowane w dystrybucji, które mogą być instalowane przez menedżer pakietów. Git zezwala na globalne przechwycenie przez umieszczenie dowolnego takiego w $PREFIX/share/templates/hooks

Obecnie ma kilka haków, które są wyłączone (.sample jest dołączany do ich nazwy). Kiedy nowy repozytorium jest tworzone, te haki są kopiowane w folderze .git repozytorium

Teraz, gdy użytkownik instaluje pakiet dla tych haków i haczyków jak post-commit i post-update są już włączone. W takim przypadku plik skryptu zostanie nadpisany! Brzmi to niepoprawnie

Oznacza to, że git ma tylko jeden plik haka na działanie. Jeśli potrzebuję trzech haczyków na jedno działanie, oznacza to, że nie jest to możliwe. Oznacza to, że zautomatyzowana instalacja z menedżera pakietów może powodować konflikty.

Teraz myślę, że zapakowaliśmy haki, aby nadpisać domyślny włączony plik. Jeśli użytkownik chce dodać więcej akcji do tego pliku, a następnie zdecydował się na odinstalowanie mojego pakietu, to jego niestandardowe polecenie również zniknęłoby?

Myślałem, że git było całkiem mądry w tym względzie i myliłem :(

Tam musi być folder o nazwie post-commit i post-update lub cokolwiek działań i git należy uruchomić wszystkie skrypty wewnątrz tego folderu. Jestem wciąż poszukując sposobu radzenia sobie z bieżącą sytuacją

+1

Możesz rzucić okiem na to [pytanie o śledzenie haków git] (http://stackoverflow.com/questions/3462955/putting-git-hooks-into-repository) - zamieściłem wersję barebone instalacji dowiązań symbolicznych w Katalog haków, które uruchamiają odpowiednie haki - można go łatwo rozszerzyć do wielu haczyków dla tego samego zadania, a także zapewnia użytkownikom pozostawiając własne lokalne haczyki. – Cascabel

+1

Uwaga: Prosta "uruchom listę skryptów" nie będzie działać poprawnie dla wszystkich typów haków, ponieważ niektórzy z nich oczekują otrzymania danych na stdin (np. Pre-receive, post-receive, post-rewrite); w większości naiwnych implementacji pierwszy skrypt uruchomiłby wszystkie dane, a reszta dostałaby nic (EOF). Może to jednorazowe przechwycenie danych i podanie ich do każdego skryptu, ale może nie być odpowiednie dla wszystkich skryptów/sytuacji. –

+0

Jefromi, dzięki. To dobrze, że dowiązanie może być rozwiązaniem, ale znowu problem polega na tym, jak łatać git na każdym komputerze, aby git init kopiował dowiązania symboliczne do folderu? Jakieś dobre przykłady? –

Odpowiedz

3

Dlaczego nie napisać post-commit hook (na przykład), który będzie szukał podkatalogu "post-commit-hooks" i wyświetli listę i wykona wszystkie znalezione skrypty ?
(pierwszy, który nie zostanie pomyślnie uruchomiony, zawiedzie cały hak po zatwierdzeniu)

Jeśli użytkownicy zainicjują swój Git repo from a predefined template directory, możesz upewnić się, że wszyscy otrzymają specjalne skrypty w swoim nowym repozytorium.

+0

Cóż, myślę, że jeśli pierwszy skrypt zawodzi, proces nie powinien się zatrzymywać. Jakiś specjalny powód zatrzymania wszystkich innych skryptów, jeśli się nie uda? –

+0

Tak, problem pojawia się, jeśli użytkownik inicjuje szablony z katalogu predefiniowanych. W tym przypadku moje osobiste skrypty lub zainstalowane z pakietu nie mogą być zawarte w takich. –