2012-07-18 10 views
5

Więc odziedziczyłem dość dużą bazę kodu od innych programistów, z kodem przechowywanym w różnych repozytoriach git.grep dla rzeczy w wielu repozytoriach git

Czasami trudno jest określić, w którym projekcie może znajdować się dany fragment kodu lub czy ten fragment kodu istnieje nawet w git.

To, co chcę zrobić, to grep WSZYSTKIE projekty dla konkretnego fragmentu tekstu.

Używam gitosis, więc wszystkie repozytoria git są przechowywane w/home/git/repozytoria ze strukturą jak:

/home/git/repositories 
    |- project1 
    |- HEAD 
    |- branches 
    |- config 
    |- description 
    |- hooks 
    |- info 
    |- objects 
    |- refs 
    |- project2 
    |- ... 

próbowałem robić rekurencyjnych grep dla rzeczy w obiektach katalogów tak:

grep -Hr "text" /home/git/repositories/*/objects 

Nie działa tak, jak zamierzam, oczywiście, ponieważ obiekty są przechowywane w niestandardowym formacie git.

Co zrobić?

Odpowiedz

5

Zastosowanie git grep z ref lub --no-index:

cd /home/git/repositories 
for i in *; do (cd $i; git grep text HEAD); done 
+0

Jeśli szukasz konkretnego kawałka kodu, w przeciwieństwie do tekst w wiadomości zatwierdzenia, możesz również użyć 'git log -S" "' tutaj. Nazywa się to rewizją kilofa. (Http://gitfu.wordpress.com/2008/06/03/the-pickaxe-finding-changes-was-never-easier/) – Christopher

+0

Problem polega na tym, że foldery w/home/git/reositories nie są faktycznie drzewami roboczymi git, więc git grep nie działa na nich. – jdeuce

+0

@python_noob git grep działa w repozytorium, jeśli poda się ref (np. HEAD) –

-1

Zastosowanie multi. Został napisany specjalnie do git grep za pośrednictwem wielu repozytoriów jednocześnie.

$ ls 
vim spring-framework gradle phantomjs 
$ multi -i "fantastic" 
vim 
==================================================== 
runtime/doc/quotes.txt:VIM 4.5 is really a fantastic editor. It has sooooo many features and more 
runtime/doc/quotes.txt:fantastic it is! (Tony Nugent, Australia) 
spring-framework 
==================================================== 
gradle 
==================================================== 
subprojects/docs/src/docs/userguide/ant.xml:  simply by relying on Groovy, and the fantastic <literal>AntBuilder</literal>. 
subprojects/docs/src/docs/userguide/buildScriptsTutorial.xml:   relying on Groovy. Groovy is shipped with the fantastic <literal>AntBuilder</literal>. Using Ant tasks 
subprojects/docs/src/docs/userguide/ideSupport.xml:   if you do this you have a fantastic IDE support for developing Gradle scripts. Of course if you use 
phantomjs 
==================================================== 
test/ghostdriver-test/fixtures/common/macbeth.html:<A NAME=1.3.55>Are ye fantastical, or that indeed</A><br> 
test/ghostdriver-test/fixtures/common/macbeth.html:<A NAME=1.3.148>My thought, whose murder yet is but fantastical,</A><br> 
1

Znam swoje stare pytanie, ale jeśli używasz wiersza polecenia można dodać do bash_profile lub bashrc

ggrep() { 
    find . -type d -name .git | while read line; do 
     (
     cd $line/.. 
     cwd=$(pwd) 
     echo "$(tput setaf 2)$cwd$(tput sgr0)" 
     git grep -n "[email protected]" 
     ) 
    done 
} 

podstawowy Istotą powyższej funkcji jest wyszukanie wszystkich katalogów, które zawiera .git i wyjście pierwszy ten katalog następnie zostanie zapisany wraz z numerem wiersza, w którym token pojawi się

, a następnie przejdź do /home/git/repositories i wyszukaj za pomocą

ggrep "InvalidToken"

będzie wyjście jak ten

/home/git/org/repo1 
/home/git/org/repo2 
/home/git/org/repo3 
/home/git/org/repo3 
lib/v3/Utility.pm:59:   code    => 'InvalidToken', 
lib/v3/Utility.pm:142:  code    => "InvalidToken", 

można również przekazać flagi jak ggrep -i "search" (dla przypadku niewrażliwe wyszukiwania)

Powiązane problemy