2010-11-04 17 views
11

Quindi prima di eseguire git commit spesso mi verrà eseguito il seguente:Come grep attraverso i file staged prima di commettere?

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 ti mostrerà il diff nei tuoi file di scena).

Purtroppo, ho appena trovato che l'opzione --cached per git grep dice semplicemente a git di "solo" guardare tutto nel suo indice.

Quindi, come posso eseguire git grep e averlo solo tramite i miei file di staged?

(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.)

+0

Quindi, sei riuscito a risolvere questo problema? Sarei interessato alla risposta. – ZeroOne

risposta

10

Un sacco di pre-commit ganci usano git diff-index --cached -S<pat> REV da trovare modifiche che aggiungono o rimuovono un particolare modello. Quindi nel tuo caso, git diff-index --cached -Sdebugger HEAD. Puoi anche aggiungere -u per ottenere un diff, altrimenti identifica solo il file incriminato.

+4

L'opzione '-S' prende una stringa fissa, non una regex. (Non sono sicuro di cosa intendessi per "pat"). Tuttavia, git diffcore ha recentemente ottenuto l'opzione '-G ', che dovrebbe permetterti di fare qualsiasi cosa stavi cercando di fare con 'git grep'. Non è ancora in una versione rilasciata, ma si trova sul ramo principale 'git.git'. – Cascabel

+2

OK questo mi avvicina a quello di cui ho bisogno, ma non al 100%. Questo ti darà una corrispondenza positiva per il tuo -S se è stato aggiunto o cancellato. Voglio solo una corrispondenza restituita se fosse * aggiunto *. C'è un modo per farlo? – steve

0

Per prima cosa è necessario ottenere un elenco di file dall'indice (esclusi i file cancellati). Questo può essere fatto con il seguente:

git diff --cached --name-only --diff-filter=d HEAD 

In secondo luogo è necessario utilizzare il: prefisso per accedere al contenuto di un file nell'indice corrente (messa in scena, ma non ancora impegnati) vedi gitrevisions manual 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 

anche here's an example di un git pre-commit hook che utilizza questo metodo per verificare che gli anni d'autore sono fino fino ad oggi nei file da impegnare.

Problemi correlati