2010-11-04 25 views
11

Dlatego przed uruchomieniem git commit często będzie działać następujące:Jak przeglądać pliki etapowe przed ich zatwierdzeniem?

git grep --cached -l -I "debugger" 

myślałem, że był podobny do:

git diff --cached 

(który pokaże wszystkie zmiany masz zamiar popełnić, czyli wyświetli różnicę w twoich inscenizowanych plikach).

Niestety, właśnie stwierdziłem, że opcja --cached dla po prostu mówi git, aby "tylko" spojrzeć na wszystko w swoim indeksie.

Więc jak mogę uruchomić git grep i mam tylko grep przez moje pliki etapowe?

(Tak, wiem, że mogę po prostu zrobić git diff --cached i szukać w tym, ale wolałbym mieć programową możliwość grep przez moje inscenizowanych plików.)

+0

Czy udało Ci się rozwiązać ten problem? Byłbym zainteresowany odpowiedzią. – ZeroOne

Odpowiedz

10

Wiele pre-commit haki używać git diff-index --cached -S<pat> REV znaleźć zmiany, które dodają lub usuwają określony wzorzec. W twoim przypadku: git diff-index --cached -Sdebugger HEAD. Możesz również dodać -u, aby uzyskać także różnicę, w przeciwnym razie po prostu identyfikuje obrażliwy plik.

+4

Opcja '-S' przyjmuje stały łańcuch, a nie wyrażenie regularne. (Nie jestem pewien, o co ci chodziło "pat"). Jednak git diffcore ostatnio zyskał opcję '-G ', która powinna pozwolić ci zrobić wszystko, co próbujesz zrobić z 'git grep'. Nie ma jeszcze wersji wydanej, ale znajduje się w gałęzi master 'git.git'. – Cascabel

+2

OK to zbliża mnie do tego, czego potrzebuję, ale nie w 100%. To da ci pozytywny wynik dla twojego -S , jeśli został on dodany lub usunięty. Chcę tylko, aby mecz został zwrócony, jeśli był * dodany *. Czy istnieje jakiś sposób, aby to zrobić? – steve

0

Najpierw należy uzyskać listę plików z indeksu (z wyłączeniem usuniętych plików). Można to zrobić z następujących powodów:

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

drugie trzeba użyć: prefiks aby uzyskać dostęp do zawartości pliku w bieżącym Indeks (wystawił, ale jeszcze nie popełnił) zobaczyć gitrevisions manual aby uzyskać więcej informacji.

git show :<file> 

Wreszcie tutaj jest przykład wprowadzenie go wszystkie razem grep tę listę plików

# 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 

także here's an example z git pre-commit, który korzysta z tej metody, aby sprawdzić, że rok copyright wyczyniają jak dotąd w plikach do zatwierdzenia.

Powiązane problemy