Come posso impostare un hook pre-commit, che cercherà una stringa nei file committed e If found fermerà il commit?Mercurial pre-commit hook
risposta
Chapter 10 di the mercurial book copre esattamente questo:
$ cat .hg/hgrc
[hooks]
pretxncommit.whitespace = hg export tip | (! egrep -q '^\+.*[ \t]$')
$ echo 'a ' > a
$ hg commit -A -m 'test with trailing whitespace'
adding a
transaction abort!
rollback completed
abort: pretxncommit.whitespace hook exited with status 1
$ echo 'a' > a
$ hg commit -A -m 'drop trailing whitespace and try again'
In questo esempio, si introduce un semplice gancio pretxncommit che verifica spazi finali. Questo hook è breve, ma non molto utile. Esce da con uno stato di errore se una modifica aggiunge una riga con spazi bianchi finali a qualsiasi file , ma non stampa alcuna informazione che potrebbe aiutarci a identificare il file o la riga incriminata. Ha anche la bella proprietà di non prestando attenzione alle linee non modificate; solo le righe che introducono nuovi spazi bianchi iniziali causano problemi.
Basta cambiare l'espressione regolare da '^\+.*[ \t]$'
a qualsiasi stringa che si sta cercando.
OK, naturalmente ho trovato quell'esempio, ma come funziona? perché ho bisogno di -> hg export tip e che cos'è questo ritorno (! egrep -q '^ \ +. * [\ t] $')? – danidacar
FYI, questo non funzionerà se non si aggiunge un tag ad ogni commit (cioè via '-A') –
questo è un terribile esempio per la maggior parte degli sviluppatori: utilizza uno script di shell ed egrep. gli sviluppatori nella maggior parte degli ambienti di lavoro sono a disagio con questa roba - per un'approssimazione molto buona nessuno la usa - inoltre non ci sono spiegazioni o modi per determinare, ad es. quali parametri sono/non vengono passati nel gancio da questo esempio ... – jheriko
La risposta di Ry4an è quasi corretta :) ma è necessario sostituire "hg export tip" con "hg diff".
tip è l'ultimo changeset attivato, ma è interessato alle modifiche locali non salvate, quindi è necessario diff. per le mie esigenze ho aggiunto il seguente al mio hgrc
precommit.removeDebug = hg diff -S | grep -v '^-' | (! egrep '(var_dump)|(exit)|(print_r)')
la -S comprende subrepos (maye ha bisogno, e può ancora essere buggy).
grep -v '^ -' rimuove le linee dal diff che indicano le linee rimosse. ho rimosso il -q così ho almeno un'idea di cosa rimuovere, ma sfortunatamente questo metodo non può stampare il file e il numero di caso (come viene convogliato). forse qualcuno ha un modo migliore per farlo.
Resto dalla mia risposta. :) Le modifiche locali sono già state commesse al momento dell'esecuzione del libro 'pretxncommit' - è dopo il lavoro ma prima che la transazione venga eseguita, quindi' hg export tip' funziona bene, e viene eseguito il rollback quando l'hook dice no. –
'hg export tip' funziona bene, sono d'accordo, ma, basato esclusivamente sulle mie osservazioni molto non scientifiche,' hg diff' funziona leggermente più velocemente. – gzzzur
BTW, su Windows è possibile utilizzare
[hooks]
pretxncommit.nocommit = hg export tip | findstr NOCOMMIT && EXIT /B 1 || EXIT /B 0
Questo gancio non riuscirà se le tue fonti contiene stringa "NOCOMMIT"
- 1. Usa gruntjs come hook precommit
- 2. Pre commit hook per JSLint in Mercurial e Git
- 3. Come si accede al messaggio di commit in un hook in corso di Mercurial?
- 4. Come posso condividere un commit-hook in mercurial con tutti i colleghi sviluppatori?
- 5. Come utilizzare un percorso relativo ad un hook Mercurial
- 6. È possibile aggiungere un "gancio di precommit" su TFS?
- 7. Git pre-commit hook: ottenere l'elenco dei file modificati
- 8. Ganci Mercurial utili
- 9. Un altro hook globale riguarda il mio hook globale
- 10. Git pre-push hook
- 11. SVN lato client hook
- 12. ASP.net MVC convalida Hook
- 13. Sails hook passport
- 14. Global Hook Keylogger problem
- 15. Gestione git hook
- 16. Rake before task hook
- 17. C#: Keyboard Hook
- 18. Spring Spring shutdown hook
- 19. Come eseguire un hook di pre-commit che impedisce codifiche di file non UTF-01
- 20. Mercurial to Mercurial to Subversion Workflow Problem
- 21. Login hook su Google Appengine
- 22. PowerShell Git Codice Hook Exit
- 23. CodeIgniter: hook (pre_controller) caricamento helper
- 24. Esecuzione script hook lato client
- 25. Account onLogin hook Meteor loop
- 26. Emacs hook per nuove cornici
- 27. Hook di emacsclient su kill
- 28. Editor di paginazione insertimagedialog hook
- 29. Configurazione Hook su messaggi Windows
- 30. Hook to time knitr chunks
Mi sembra che sarebbe andare contro concetto di repository decentrata. Il tuo repository può essere clonato su un'altra macchina con sistemi diversi, e il tuo script potrebbe semplicemente non funzionare lì. Forse il gancio pre-push sarebbe meglio? Sono interessato a sentire la risposta alla tua domanda. –
Ho un archivio centrale dove le persone stanno spingendo. Devo solo assicurarmi che i commit che ho fatto siano puliti prima di spingerli. – danidacar
Provate a controllare http://www.selenic.com/mercurial/hgrc.5.html#hooks –