Come grep attraverso i file in scena prima di commettere?
-
29-09-2019 - |
Domanda
Quindi, prima di eseguire git commit
spesso mi verrà eseguito il seguente:
git grep --cached -l -I "debugger"
ho pensato che fosse simile a:
git diff --cached
(che vi mostrerà tutti i cambiamenti che si stanno per commettere, vale a dire. Vi mostrerà il diff nei file in scena).
Purtroppo, ho appena scoperto che l'opzione --cached
per git grep
dice semplicemente git a "soli" un'occhiata a tutto nel suo indice.
Così come posso correre git grep
e lo hanno grep solo attraverso i miei file in scena?
(Sì, lo so che potrei semplicemente fare git diff --cached
e la ricerca in questo, ma avrei preferito avere la capacità programmatica a grep attraverso i miei file in scena.)
Soluzione
Se si dispone di un sistema Unix-like scocca, la risposta è piuttosto semplice:
git grep --cached "debugger" $(git diff --cached --name-only)
Questo verrà eseguito git grep
nella lista dei file in scena.
Altri suggerimenti
Un sacco di pre-commit ganci usano git diff-index --cached -S<pat> REV
per trovare cambiamenti che aggiungono o rimuovono un particolare modello. Quindi nel tuo caso, git diff-index --cached -Sdebugger HEAD
. Si consiglia di aggiungere -u
per ottenere un diff pure, altrimenti solo identifica il file offendere.
Per prima cosa è necessario per ottenere un elenco di file dall'indice (esclusi i file cancellati). Questo può essere fatto con la seguente:
git diff --cached --name-only --diff-filter=d HEAD
In secondo luogo è necessario utilizzare il: prefisso per accedere al contenuto di un file nella indice corrente (messa in scena ma non ancora impegnati) vedi gitrevisions manuale per ulteriori informazioni.
git show :<file>
Infine ecco un esempio di mettere tutto insieme a grep questo elenco di file
# Get a list of files in the index excluding deleted files
file_list=$(git diff --cached --name-only --diff-filter=d HEAD)
# for each file we found grep it's contents for 'some pattern'
for file in ${file_list}; do
git show :"${file}" | grep 'some pattern'
done
ecco un esempio di un git pre-commit hook che utilizza questo metodo per verificare che gli anni di copyright siano aggiornati in file da impegnare.