È 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
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.
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
Ho aggiunto 'chmod + x .git/hooks/*' al tuo 'bin/create-hook-symlinks' per lavorarci. – guneysus
@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
Un modo migliore per ottenere la dir hook è 'HOOK_DIR = $ (git rev-parse --show-toplevel) /. Git/hooks'. –
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.
"potresti usare uno di questi meccanismi", ma ne specifichi solo uno. – Otheus
Il https://www.npmjs.com/package/pre-commit pacchetto NPM gestisce questo elegante che consente di specificare-commit pre ganci nella tua package.json.
- 1. Elenca i file nel repository git locale?
- 2. Test VM nel repository GIT
- 3. Dove inserire i comandi git?
- 4. Git elimina il ramo remoto nel repository git TFS
- 5. Mantenimento del repository git contenente altro repository di git clonato
- 6. Creare un repository git che contenga un altro repository git
- 7. Scarica il repository Git senza tutti i file .git?
- 8. Git - Aggiungi tutti i nuovi file nel repository
- 9. C'è un modo per elencare i repository git nel terminale?
- 10. git con --git-dir = restituisce 'non un repository git'
- 11. Git, eliminazione del repository
- 12. Git - Sfoglia repository remoto
- 13. Riparare git repository danneggiato
- 14. Posso scaricare un repository git senza git?
- 15. "Non un repository git"
- 16. Recupero repository git rotto
- 17. Git Repository Too Large
- 18. Reimposta repository git locale
- 19. Jenkinsfile con due repository git
- 20. Come configurare i repository Git pubblici?
- 21. Come mantenere i repository GIT sincronizzati
- 22. Clonazione repository git mancata
- 23. Heroku Git Repository Size
- 24. Aggiornamento nome repository git
- 25. Repository git nidificati?
- 26. Avere più repository Git
- 27. Icona repository Git
- 28. logging git repository logging
- 29. Come posso rimuovere tutti i file nel mio repository git e aggiornare/push dal mio repository git locale?
- 30. come riavviare un repository git
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 –
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 :) –
"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