Applicare un hook post-commit git a tutti i repository attuali e futuri


275

Ho scritto un hook Git post-commit e funziona correttamente. Tuttavia, voglio aggiungere questo hook da applicare a tutti i repository git attuali (e futuri) su cui sto lavorando. Ho provato ad aggiungere l'hook al mio ~/.git/hooks/anziché nella directory hooks nella directory del progetto, tuttavia, questo non sembra funzionare.

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


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

Questo risponde alla tua domanda? cambia i git git predefiniti
Oliver Sieweke il

Risposte:


192

Voglio aggiungere questo hook da applicare a tutti i repository git attuali (e futuri) su cui sto lavorando

Con git 2.9+ (giugno 2016), tutto ciò che dovresti fare è:

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

Vedi " cambia hook git predefiniti ": questo è stato fatto per gestire hook centralizzati.


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

@Richlewis si fanno media stackoverflow.com/a/40550555/6309 non è stato del tutto chiaro?
VonC,

@Richlewis Dovresti impostare una cartella condivisa accessibile a tutti gli sviluppatori, affinché possano fare riferimento nella propria configurazione locale.
VonC,

purtroppo non riesco ancora a capirlo. all'interno del repository è /.git/hooks/pre_commitpossibile indicarlo?
Richlewis,

@Richlewis ti ho risposto alla tua domanda originale.
VonC,

290

A partire da git 1.7.1, puoi impostare init.templatedir in gitconfig per dire a git dove cercare i template.

Impostalo in questo modo:

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

Successivamente, i nuovi repository creati o clonati utilizzeranno questa directory per i modelli. Posiziona i ganci che desideri ~/.git_template/hooks. I repository esistenti possono essere reinizializzati con i modelli appropriati eseguendo git initnella stessa directory in cui si .gittrova.

Per le versioni git precedenti alla 1.7.1, l'esecuzione git init --template ~/.git_templatefunzionerà se sei come me e vuoi comunque gestire la .git_templatetua directory insieme al resto dei tuoi file dot. È inoltre possibile utilizzare l' $GIT_TEMPLATE_DIRambiente per dire git initdove si trova la directory del modello.


51
Bella risposta. Se qualcun altro si chiede se ri-esecuzione git initsu un repo esistente salviette esso - non è così , vedere: stackoverflow.com/questions/5149694/...
kontur

Per me non ha funzionato con il percorso relativo alla cartella dei template git per la copia dei file usando git init su repository esistenti. Ho usato invece il percorso completo.
user847988,

1
Su Windows senza virgolette: `git config --global init.templatedir d: \ git \ .git_template \`
Vladimir Vukanac

1
Suggerimento: i ganci modello vengono copiati. Se vuoi essere in grado di aggiornare gli hook globali insieme, metti l'hook altrove e aggiungi un link simbolico nella directory dei template (su Linux). Assicurarsi che il percorso del collegamento sia assoluto.
Tim Allclair,

1
La corsa in git initrealtà non ha aggiornato gli hook per me. Sembra che non sovrascriverà i file che sono già lì. stackoverflow.com/questions/10791486/ . Invece è necessario rimuovere prima i vecchi file hook.
Phil R,

69

Se li desideri ovunque sul tuo sistema (inclusi gli utenti oltre a te), puoi modificare i contenuti della directory dei modelli installati: quelli presenti $PREFIX/share/git-core/templates/hooks, dove $PREFIXè probabilmente /usr/localo /usr.

Se vuoi che questo sia solo per te, allora sì, la cosa più semplice sarebbe l' --templateopzione di git-init. Potresti facilmente mantenere una directory di modelli personali che contiene collegamenti simbolici alla versione installata delle impostazioni predefinite che desideri conservare (hook singoli, directory delle informazioni ...) e quindi il tuo contenuto hooks/post-commite qualsiasi altra cosa tu voglia personalizzare.


11
Grazie, ha funzionato bene. E per applicarlo retroattivamente ai miei progetti esistenti, ho appena corso di git initnuovo e ha aggiunto il mio nuovo gancio.
Swanson,

Questa è una soluzione alternativa, ma richiederebbe la modifica di tutti i repository. Questo è fattibile, ma non c'è alcuna possibilità con un plugin o qualcosa del genere (è così che si fa al Bazaar)?
Martin Ueding,

2
Per il git incorporato di SourceTree su OS X, sono in/Applications/SourceTree.app/Contents/Resources/git_local/share/git-core/templates/hooks
CupawnTae

1
Per Windows questo si trova nella directory di installazione di git sotto mingw64\share\templates\hooks(o mingw32 per 32 bit)
nerdherd

1
@nerdherd ora è alle mingw64\share\git-core\templates\hooks(gfw 2.25)
RJFalconer il

7

Un approccio minimalista consiste nel creare una git_hooks/directory nel repository per tenere traccia degli hook scritti per quel progetto, portarlo all'attenzione degli utenti futuri citandolo in un READMEe fare affidamento su di essi per fare la cosa giusta dopo aver clonato. Ho riflettuto su questo per un po 'e ho scelto un approccio incrementale. Lungo la strada potrei prendere in considerazione l'uso di uno strumento come git-hook .


1
È così, così lontano dall'essere una vera soluzione che ho dovuto sottovalutare, scusa.
Victor Schröder,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.