2010-02-19 20 views
211

Ho scritto un hook post-commit Git e funziona correttamente. Tuttavia, voglio aggiungere questo hook per applicarlo a tutti i repository git attuali (e futuri) su cui sto lavorando. Ho provato ad aggiungere il gancio al mio ~/.git/hooks/ anziché nella directory hooks nella directory del progetto, tuttavia, questo non sembrava funzionare.Git commit hooks - impostazioni globali

C'è un modo per creare hook Git globali che si applicheranno a tutti i repository sul mio sistema (senza doverli copiare in ogni directory di progetto)? In caso contrario, quale sarebbe la soluzione migliore in futuro, forse un modello git-init?

+3

A partire da Git 2.9 questo approccio migliore è cambiato: la risposta di VonC è una scommessa migliore. http://stackoverflow.com/a/37293198/2741954 –

risposta

81

voglio aggiungere questo gancio da applicare a tutti i repository git attuali (e futuri) sto lavorando

con git 2.9+ (giugno 2016), tutto quello che vi fare è:

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

Vedere "change default git hooks": questo è stato fatto per gestire i ganci centralizzati.

+0

se ho un repository esistente e voglio che tutti gli altri sviluppatori che eseguono le modifiche abbiano un hook pre-commit aggiornato, ad esempio come farei? grazie – Richlewis

+0

@Richlewis intendi http://stackoverflow.com/a/40550555/6309 non era completamente chiaro? – VonC

+0

@Richlewis Avresti bisogno di impostare una cartella condivisa accessibile da tutti gli sviluppatori, affinché possano fare riferimento nella propria configurazione locale. – VonC

67

Se li volete ovunque sul sistema (compresi gli utenti oltre a te), è possibile modificare il contenuto della directory dei modelli installati - questi sono in $PREFIX/share/git-core/templates/hooks, dove $PREFIX è probabilmente /usr/local o /usr.

Se vuoi che questo sia solo per te, allora sì, la cosa più semplice sarebbe l'opzione --template di git-init. Si può facilmente mantenere una directory di template personale che ha dei collegamenti simbolici alla versione installata dei valori di default che si desidera conservare (singoli hook, la directory delle informazioni ...) e quindi i propri contenuti in hooks/post-commit e qualsiasi altra cosa si desideri personalizzare.

+11

Grazie, ha funzionato bene. E per applicarlo retroattivamente ai miei progetti esistenti, ho appena eseguito di nuovo 'git init' e ho aggiunto il mio nuovo hook. – swanson

+1

Magnifico suggerimento Jefromi, grazie mille! –

+0

Questa è una soluzione ordinata, ma richiederebbe la modifica di tutti i repository. Questo è fattibile, ma non c'è qualche possibilità con un plugin o qualcosa del genere (questo è come si fa a Bazaar)? –

268

A partire da git 1.7.1, è possibile impostare init.templatedir nel proprio gitconfig per indicare a git dove cercare i modelli.

Set in questo modo:

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

In seguito, nuovi repository di creare o clone usate questo elenco per i modelli. Posiziona i ganci che desideri in ~/.git_template/hooks. repository esistenti possono essere reinizializzato con i modelli corretti eseguendo git init nella stessa directory .git è in.

Per le versioni git di età superiore a 1.7.1, in esecuzione git init --template ~/.git_template funziona se siete come me e ancora voglia di gestire il vostro .git_template dir insieme al resto dei tuoi file di punti. È inoltre possibile utilizzare l'ambiente $GIT_TEMPLATE_DIR per indicare git init dove si trova la directory del modello.

+1

gestire git git con dotfiles è una grande idea. Grazie. –

+47

Ottima risposta. Se qualcun altro si chiede se rieseguire "git init" su un repository esistente lo pulisce - ** non lo fa **, vedi: http://stackoverflow.com/questions/5149694/does-running-git-init-twice -initialize-a-repository-or-reinitialize-an-existing – kontur

+0

Per me non ha funzionato con il percorso relativo alla cartella template git per copiare i file usando git init su repository esistenti. Ho usato invece il percorso completo. – user847988

3

Un approccio minimalista è quello di creare una directory git_hooks/ nel repository per monitorare i ganci che si scrive per quel progetto, portarlo all'attenzione dei futuri utenti menzionando in un README, e fare affidamento su di loro per fare il giusto cosa dopo che hanno clonato. Ho riflettuto su questo per un po 'e ho scelto un approccio incrementale. In fondo alla strada potrei considerare l'utilizzo di uno strumento come git-hooks.