2010-11-04 4 views
11

So vor git commit zu laufen oft ich folgendes ausgeführt:Wie grep durch Ihre inszenierten Dateien vor dem Commit?

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

Ich dachte, es war ähnlich:

git diff --cached 

(die Sie alle Änderungen zeigen Sie sind zu begehen, dh . zeigt dir das diff in deinen inszenierten Dateien).

Leider habe ich gerade festgestellt, dass die --cached Option für git grep einfach sagt Git "nur" auf alles in seinem Index zu sehen.

Also wie kann ich git grep ausführen und habe es nur durch meine inszenierten Dateien grep?

(Ja, ich weiß, dass ich einfach git diff --cached tun konnte, und dass suchen, aber ich würde lieber die programmatische Fähigkeit, durch meine inszenierten Dateien zu grep haben.)

+0

Also, hast du es geschafft, dieses Problem zu lösen? Ich würde mich für die Antwort interessieren. – ZeroOne

Antwort

10

Viele pre-commit Haken git diff-index --cached -S<pat> REV verwenden zu finden Änderungen, die ein bestimmtes Muster hinzufügen oder entfernen. Also in Ihrem Fall, git diff-index --cached -Sdebugger HEAD. Sie können auch -u hinzufügen, um ein Diff zu erhalten, andernfalls wird nur die problematische Datei identifiziert.

+4

Die Option '-S' verwendet eine feste Zeichenfolge, keine Regex. (Ich bin mir nicht sicher, was du mit "pat" meintest.) Allerdings hat git diffcore kürzlich die '-G ' Option bekommen, die dir alles erlauben sollte, was du mit' git grep' machen wolltest. Es ist noch nicht in einer veröffentlichten Version, aber es ist auf dem 'git.git' Master-Zweig. – Cascabel

+2

OK, das bringt mich nahe an das, was ich brauche, aber nicht 100%. Dadurch erhalten Sie eine positive Übereinstimmung für Ihre -S , wenn es hinzugefügt oder gelöscht wurde. Ich möchte nur ein Match zurückgeben, wenn es * hinzugefügt * wurde. Gibt es eine Möglichkeit, das zu tun? – steve

0

Zuerst müssen Sie eine Liste von Dateien aus dem Index (ohne gelöschte Dateien) abrufen.

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

Zweite Sie verwenden müssen: Diese kann mit dem folgenden getan werden Präfix, um den Inhalt einer Datei zugreifen im aktuellen Index (inszeniert, aber noch nicht festgeschrieben) gitrevisions manual für weitere Informationen.

git show :<file> 

Schließlich ist hier ein Beispiel, sie alle zusammen der Umsetzung dieser Liste von Dateien

# 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 

Auch here's an example eines git grep-pre commit, die diese Methode verwendet, um zu überprüfen, dass die Copyright-Jahre sind bis bis heute in Dateien zu committen.

Verwandte Themen