2013-03-05 16 views
14

Mam wielką łatkę, którą chciałbym podzielić na wiele logicznych zatwierdzeń git. Duża liczba zmian polega po prostu na zmianie nazw zmiennych lub wywołań funkcji, dzięki czemu można je łatwo zlokalizować za pomocą polecenia grep. Gdybym mógł dodać do indeksu wszelkie zmiany, które pasują do wyrażenia regularnego, a następnie posprzątać w git gui, zaoszczędziłbym wiele pracy ręcznej. Czy istnieje dobry sposób aktualizowania indeksu w trybie liniowym, używając regex w git lub z jakiegoś wyjścia grep (np. Numery linii)?Git dodaj linie do indeksu przez grep/regex

Znalazłem a similar question, ale nie jestem pewien, jak zbudować plik tymczasowy z wyszukiwania typu regex.

+1

Niektóre przykłady prawdopodobnie posuną długą drogę do wyjaśnienia, co próbujesz osiągnąć. – rvalvik

Odpowiedz

-1

xargs jest tym, czego szukasz. Spróbuj tego:

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

Do rury | to standardowe polecenia grep do wyszukiwania wszystkich plików *. Dostępne są następujące opcje:

  • i - sprawa niewrażliwe
  • r - rekurencyjne katalogów
  • l - lista nazw plików tylko

W xargs części zestawienia FILE to nazwa z zmienna do użycia dla każdego argumentu/dopasowania przekazanego przez polecenie grep. Następnie wprowadź żądane polecenie, używając zmiennej w razie potrzeby.

+5

Dzięki, ale chcę dodać tylko część pliku, a nie całe pliki. – FazJaxton

+0

@FazJaxton, Do tego trzeba dodać jako łatkę. Użyj parametru '-p' po' git add', ale nie jestem pewien jak to będzie działać w xargs, ponieważ proces łatki jest wykonywany przez ciebie (np. Wybierając to, co powinno zostać dodane, a co nie). – RDL

13

patchutils ma polecenie grepdiff, które może być użyte do osiągnięcia tego.

# 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 

Używam -U0 na diff, aby uniknąć niepowiązanych zmian. Możesz dostosować tę wartość, aby dopasować swoją sytuację.

+0

To zadziałało bardzo dobrze, ale, jako uwaga, 'hunk' nie zapewnia tak naprawdę ziarnistości, jeśli zmodyfikowałeś sąsiednie linie, które nie pasują do wyrażenia regularnego. – arcyqwerty

+0

Uważam, że dobrym sposobem jest po prostu uruchomić drugą linię, a następnie sprawdzić wyniki. 'git status -v" dla inscenizowanych rzeczy i 'git diff' aby zobaczyć wszystkie rzeczy, które nie zostały zainscenizowane. Następnie zatwierdz, jeśli wszystko wygląda poprawnie. – Gerry

0

Po prostu możesz użyć git add -p i użyć opcji /, aby przeszukać różnicę, aby dodać łatki. Nie jest całkowicie zautomatyzowany, ale jest łatwiejszy niż inne alternatywy, które znalazłem.

Powiązane problemy