Eso busca a través de todos los commits, que deben incluir todas las ramas.
Otra forma sería:
git rev-list --all | (
while read revision; do
git grep -F 'yourWord' $revision
done
)
Puedes encontrar aún más ejemplos en este artículo :
Intenté lo anterior en un proyecto lo suficientemente grande como para que git se quejara del tamaño del argumento, por lo que si se encuentra con este problema, haga algo como:
No es una buena idea canalizar la salida de git branchtr o sed; git branches un comando de porcelana destinado al consumo humano. Consulte stackoverflow.com/a/3847586/2562319 para conocer las alternativas preferidas.
Sí, bien. Mirando las otras respuestas, creo que la respuesta de @errordeveloper es la más limpia: stackoverflow.com/a/21284342/2562319 : "git grep <regexp> $ (git for-each-ref --format = '% (refname) 'refs /) "
jbyler
1
¿Hay alguna forma de mostrar el nombre de la rama que coincide con la búsqueda?
franksands
63
git log puede ser una forma más efectiva de buscar texto en todas las ramas, especialmente si hay muchas coincidencias y desea ver primero los cambios más recientes (relevantes).
Estos comandos de registro enumeran confirmaciones que agregan o eliminan la cadena de búsqueda / expresión regular dada, (generalmente) más reciente primero. La -popción hace que la diferencia relevante se muestre donde se agregó o eliminó el patrón, por lo que puede verlo en contexto.
Después de encontrar una confirmación relevante que agregue el texto que estaba buscando (por ejemplo, 8beeff00d), busque las ramas que contienen la confirmación:
Alias interesante +1. Más preciso que en mi respuesta.
VonC
¿Cómo hacer que su alias funcione para la búsqueda de frases? Cuando paso "foo bar" como parámetro, obtengo: fatal: argumento ambiguo 'bar': revisión desconocida o ruta no en el árbol de trabajo. Use '-' para separar las rutas de las revisiones
jutky
Intenta escapar del espacio: "foo \ bar"
Garry Gomez
Esta será claramente la respuesta aceptada;) Lo he expandido para buscar solo en las últimas ramas de mi proyecto (Tengo más de 500, no preguntes, y cada grep toma alrededor de 4 segundos, así que no quiero ni necesito para buscar en más de, digamos, 100 más recientes). Para esto he actualizado el git for-each-refcon --sort=-committerdate --count=100! Gracias por la idea original!
Vser
6
Es posible hacerlo de dos maneras comunes: alias Bash o Git
Aquí hay tres comandos:
git grep-branch - Buscar en todas las sucursales locales y remotas
git grep-branch-local - Buscar solo en sucursales locales
Nota: Cuando agrega alias y no se ejecutan, compruebe las barras diagonales inversas \que pueden requerir un escape adicional \\en comparación con los comandos bash .
git branch -a - Mostrar todas las ramas;
sed -e 's/[ \\*]*//'- Recortar espacios (desde branch -a) y * (el nombre de la rama activa lo tiene);
Suena bien, pero recibí este error de git grep-branch "find my text":fatal: ambiguous argument 'client': both revision and filename
nealmcb
¿Por qué usar siempre -a, que muestra todas las ramas? Sugeriría usar opciones para el git branchcomando para separar los braches. Al mirar las ramas locales, solo hay una sola *, por lo que no es necesario escapar por sed. Entonces: solo git branch | sed -e 's/*/ /' | xargs git grep "TEXT"para sucursales locales, solo git branch -r | grep -v -- "->" | xargs git grep "TEXT"para sucursales remotas y git branch -a | grep -v -- "->" | xargs git grep "TEXT"para todas las sucursales
Respuestas:
La pregunta " ¿Cómo grep (buscar) el código comprometido en el historial de git? " Recomienda:
Eso busca a través de todos los commits, que deben incluir todas las ramas.
Otra forma sería:
Puedes encontrar aún más ejemplos en este artículo :
(vea una alternativa en la última sección de esta respuesta, a continuación)
No olvides esas configuraciones, si las quieres:
Este alias también puede ayudar:
Nota: chernjie sugirió que
git rev-list --all
es una exageración.Actualización de agosto de 2016: RM recomienda en los comentarios
Es decir:
fuente
git branch
tr o sed;git branch
es un comando de porcelana destinado al consumo humano. Consulte stackoverflow.com/a/3847586/2562319 para conocer las alternativas preferidas.git log
puede ser una forma más efectiva de buscar texto en todas las ramas, especialmente si hay muchas coincidencias y desea ver primero los cambios más recientes (relevantes).Estos comandos de registro enumeran confirmaciones que agregan o eliminan la cadena de búsqueda / expresión regular dada, (generalmente) más reciente primero. La
-p
opción hace que la diferencia relevante se muestre donde se agregó o eliminó el patrón, por lo que puede verlo en contexto.Después de encontrar una confirmación relevante que agregue el texto que estaba buscando (por ejemplo, 8beeff00d), busque las ramas que contienen la confirmación:
fuente
Encontré esto más útil:
Tendría que ajustar los últimos argumentos dependiendo de si desea ver solo las ramas remotas frente a las locales, es decir:
git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)
El alias que creé se ve así:
fuente
git for-each-ref
con--sort=-committerdate --count=100
! Gracias por la idea original!Es posible hacerlo de dos maneras comunes: alias Bash o Git
Aquí hay tres comandos:
git grep-branch
- Buscar en todas las sucursales locales y remotasgit grep-branch-local
- Buscar solo en sucursales localesgit grep-branch-remote
- Solo ramas remotasEl uso es el mismo que
git grep
GREP usando: alias Git
Archivo ~ / .gitconfig
Los comandos deben agregarse manualmente al
~/.gitconfig
archivo, porquegit config --global alias
evalúa el código complejo que agregas y lo desordena.Nota: Cuando agrega alias y no se ejecutan, compruebe las barras diagonales inversas
\
que pueden requerir un escape adicional\\
en comparación con los comandos bash .git branch -a
- Mostrar todas las ramas;sed -e 's/[ \\*]*//'
- Recortar espacios (desdebranch -a
) y * (el nombre de la rama activa lo tiene);grep -v -e '\\->'
- Ignorar nombres complejos comoremotes/origin/HEAD -> origin/master
;grep '^remotes'
- Obtenga todas las ramas remotas;grep -v -e '^remotes'
- Obtener ramas excepto ramas remotas;Ejemplo
git grep-branch-local -n getTastyCookies
-n
Prefije el número de línea a líneas coincidentes.La estructura actual es:
:
- separadordev
53
modules/factory/getters.php
function getTastyCookies($user)
GREP usando: BASH
Como debe saber: los comandos Bash deben almacenarse en
.sh
scripts o ejecutarse en un shell.Solo sucursales locales
Solo ramas remotas
Sucursales locales y remotas
fuente
git grep-branch "find my text"
:fatal: ambiguous argument 'client': both revision and filename
-a
, que muestra todas las ramas? Sugeriría usar opciones para elgit branch
comando para separar los braches. Al mirar las ramas locales, solo hay una sola*
, por lo que no es necesario escapar por sed. Entonces: sologit branch | sed -e 's/*/ /' | xargs git grep "TEXT"
para sucursales locales, sologit branch -r | grep -v -- "->" | xargs git grep "TEXT"
para sucursales remotas ygit branch -a | grep -v -- "->" | xargs git grep "TEXT"
para todas las sucursalesAsí es como lo hago:
fuente
Si le da a commit un valor hash SHA-1,
git grep
haga que busque en ellos, en lugar de la copia de trabajo.Para buscar todas las ramas, puede obtener todos los árboles con
git rev-list --all
. Ponlo todo con... y ten paciencia
fuente