2013-03-05 12 views
14

Ho una patch gigante che vorrei suddividere in più commit logici di git. Un gran numero di modifiche sta semplicemente cambiando i nomi delle variabili o le chiamate alle funzioni, in modo che possano essere facilmente individuate con un grep. Se potessi aggiungere all'indice tutte le modifiche che corrispondono a una regex, quindi ripulire in git gui, mi farebbe risparmiare un sacco di lavoro manuale. C'è un buon modo per aggiornare l'indice su base riga per riga usando una regex all'interno di git o da qualche output di grep (ad esempio numeri di riga)?Git aggiunge linee all'indice di grep/regex

Ho trovato a similar question, ma non sono sicuro di come creare il file temporaneo da una ricerca di tipo regex.

+1

Alcuni esempi potrebbero fare molto per chiarire cosa si sta cercando di ottenere. – rvalvik

risposta

-1

xargs è quello che stai cercando. Prova questo:

grep -irl 'regex_term_to_find' * | xargs -I FILE git add FILE 

Fino al tubo | è il vostro comando grep standard per la ricerca di tutti i file *. Le opzioni sono:

  • i - case insensitive
  • r - ricorsivo nelle directory
  • l - Lista nomi dei file solo

Nella xargs parte della dichiarazione FILE è il nome del variabile da utilizzare per ogni argomento/corrispondenza passata dal comando grep. Quindi immettere il comando desiderato utilizzando la variabile, se appropriato.

+5

Grazie, ma voglio aggiungere solo una parte di un file, non interi file. – FazJaxton

+0

@FazJaxton, per quello dovresti aggiungere come patch. Usa il parametro '-p' dopo' git add', ma non sono sicuro di come funzionerà all'interno di xargs dato che il processo di patch è fatto da te (cioè selezionando cosa dovrebbe essere aggiunto e cosa non dovrebbe). – RDL

13

patchutils ha un comando grepdiff che può essere utilizzato per ottenere questo.

# check that the regex search correctly matches the changes you want. 
git diff -U0 | grepdiff 'regex search' --output-matching=hunk 

# then apply the changes to the index 
git diff -U0 | grepdiff 'regex search' --output-matching=hunk | git apply --cached --unidiff-zero 

Io uso -U0 sulla diff per evitare di ottenere modifiche non correlate. Potresti voler regolare questo valore per adattarlo alla tua situazione.

+0

Questo ha funzionato molto bene per me ma, come nota, 'hunk' non fornisce realmente granularità sufficiente se hai modificato le linee adiacenti che non corrispondono alla regex. – arcyqwerty

+0

Trovo che un buon metodo sia semplicemente eseguire la seconda riga e quindi controllare i risultati. 'git status -v' per le cose in scena e' git diff' per vedere tutte le cose che non sono state messe in scena. Quindi commetti se tutto sembra corretto. – Gerry

0

Più semplicemente, è possibile utilizzare git add -p e utilizzare l'opzione / per cercare tra le differenze per le patch da aggiungere. Non è completamente automatizzato, ma è più facile di altre alternative che ho trovato.

Problemi correlati