2012-07-18 14 views
5

He heredado una base de código bastante grande de otros desarrolladores, con código almacenado en varios repositorios git.grep para cosas en múltiples repositorios git

A veces, es difícil saber en qué proyecto podría estar contenido un código en particular, o si ese fragmento de código existe incluso en git.

Lo que quiero poder hacer es grep TODOS los proyectos para una determinada pieza de texto.

estoy usando gitosis, por lo que todos los repositorios Git se almacenan en/home/git/repositorios con una estructura como:

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

He intentado hacer un grep recursivo para la materia en los directorios de objetos de esta manera:

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

esto no funciona como pretendo, por supuesto, porque los objetos se almacenan en formato personalizado de git.

¿Qué hacer?

Respuesta

5

Uso git grep con una ref o --no-index:

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

Si usted está buscando un pedazo de código en particular, a diferencia de texto en un mensaje de confirmación, también puede usar 'git log -S" "' aquí. Se llama [búsqueda de pico]. (Http://gitfu.wordpress.com/2008/06/03/the-pickaxe-finding-changes-was-never-easier/) – Christopher

+0

el problema es que las carpetas en/home/git/repositorios no son realmente árboles de trabajo git así que git grep no funciona en ellos. – jdeuce

+0

@python_noob git grep funciona en un repositorio simple si especifica una referencia (p. Ej., HEAD) –

-1

Uso multi. Fue escrito específicamente en git grep a través de múltiples repositorios a la vez.

$ 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

Sé que es cuestión de edad, pero si se utiliza la línea de comandos se puede agregar esto a bash_profile o 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 
} 

esencia básica de la función anterior es la búsqueda de todos los directorios que contienen .git y la salida de la primera ese directorio a continuación, presentar junto con el número de línea donde se produce esa señal

luego ir a /home/git/repositories y la búsqueda utilizando

ggrep "InvalidToken"

será una salida como ésta

/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", 

también puede pasar opciones como ggrep -i "search" (para búsqueda que ignore)

Cuestiones relacionadas