2010-08-11 24 views
141

È considerato una cattiva pratica - inserire .git/hooks nel repository dei progetti (utilizzando i collegamenti simbolici, ad esempio). Se sì, qual è il modo migliore per consegnare gli stessi hook a utenti Git diversi?Inserire i git git nel repository

risposta

74

No, inserirli nel repository va bene, suggerirei anche di farlo (se sono utili anche per gli altri). L'utente deve abilitarli esplicitamente (come hai detto, ad esempio tramite symlinking), che da un lato è un po 'doloroso, ma protegge gli utenti dall'altro lato dall'eseguire codice arbitrario senza il loro consenso.

+6

e se si tratta di una politica aziendale, quindi il codice non è "arbitrario" questo è il codice richiesto, quindi questo sarebbe considerato una limitazione in GIT, per non avere un'altra directory (predefinita), che viene tracciata, che viene eseguito anche insieme ai normali hooks –

+8

L'invio automatico di hook è un problema di sicurezza, sono contento che Git non lo faccia direttamente - per far rispettare i criteri di team/società, utilizzare i ganci sul lato server o consentire agli utenti di decidere manualmente manualmente abilitali come @scy descrive :) –

+2

"protegge gli utenti [...] dall'esecuzione di codice arbitrario senza il loro consenso". Se uno sviluppatore farebbe come suggerisci (collegamento simbolico), allora l'hook potrebbe essere cambiato da qualcun altro, ed eseguire "codice arbitrario senza il loro consenso" – MiniGod

121

Sono generalmente d'accordo con Scytale, con un paio di suggerimenti aggiuntivi, abbastanza che valga una risposta separata.

In primo luogo, è necessario scrivere uno script che crei i collegamenti simbolici appropriati, soprattutto se questi hook riguardano la forzatura dei criteri o la creazione di notifiche utili. Le persone saranno molto più propense a usare gli hook se possono semplicemente digitare bin/create-hook-symlinks rispetto a se devono farlo da soli.

In secondo luogo, i ganci di collegamento diretto impediscono agli utenti di aggiungere i propri ganci personali. Ad esempio, preferisco l'hook di pre-commit di esempio che si assicura che non abbia errori di spazi vuoti. Un ottimo modo per aggirare questo è quello di inserire uno script wrapper hook nel repository e symlink tutti gli degli hook ad esso. Il wrapper può quindi esaminare $0 (supponendo che sia uno script bash, un equivalente come argv[0] in caso contrario) per capire quale hook è stato invocato come, quindi richiamare l'hook appropriato all'interno del repository, nonché il hook dell'utente appropriato, che dovrà essere rinominato, passando tutti gli argomenti a ciascuno. rapido esempio dalla memoria:

#!/bin/bash 
if [ -x $0.local ]; then 
    $0.local "[email protected]" || exit $? 
fi 
if [ -x tracked_hooks/$(basename $0) ]; then 
    tracked_hooks/$(basename $0) "[email protected]" || exit $? 
fi 

Lo script di installazione sposterebbe tutti i ganci preesistenti al lato (aggiungere .local ai loro nomi), e link simbolico tutti i nomi gancio noti allo script sopra:

#!/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 
+6

Ho aggiunto 'chmod + x .git/hooks/*' al tuo 'bin/create-hook-symlinks' per lavorarci. – guneysus

+6

@guneysus Non dovresti averne bisogno, perché gli hook dovrebbero essere già eseguibili (dovrebbero essere controllati in quel modo) ei link non hanno bisogno di permessi speciali, solo i file a cui si collegano. – Cascabel

+12

Un modo migliore per ottenere la dir hook è 'HOOK_DIR = $ (git rev-parse --show-toplevel) /. Git/hooks'. –

4

da http://git-scm.com/docs/git-init#_template_directory, è possibile utilizzare uno di questi meccanismi per aggiornare la .git/ganci dir di ogni repo git appena creato:

la directory modello contiene i file e diretta Oies che sarà copiato in $ GIT_DIR dopo che è stato creato.

La directory modello sarà uno dei seguenti (in ordine):

  • l'argomento data con l'opzione --template;

  • il contenuto della variabile d'ambiente $ GIT_TEMPLATE_DIR;

  • la variabile di configurazione init.templateDir; oppure

  • la directory di modello predefinita:/usr/share/git-core/templates.

+5

"potresti usare uno di questi meccanismi", ma ne specifichi solo uno. – Otheus