He eliminado un archivo o algún código en un archivo en algún momento del pasado. ¿Puedo grep en el contenido (no en los mensajes de confirmación)?
Una solución muy pobre es grep el registro:
git log -p | grep <pattern>
Sin embargo, esto no devuelve el hash de confirmación de inmediato. He jugado un poco con git grep
vano.
git log -S
y culpa) * [Diversión con "git log --grep"] [2] (búsqueda de mensajes de confirmación ) * [Diversión con "git grep"] [3] [2]: gitster.livejournal.com/30195.html [3]: gitster.livejournal.com/27674.htmlRespuestas:
Para buscar contenido de confirmación (es decir, líneas de origen reales, en lugar de mensajes de confirmación y similares), debe hacer lo siguiente:
git rev-list --all | xargs git grep <expression>
funcionará si te encuentras con un error "Lista de argumentos demasiado larga".Si desea limitar la búsqueda a algún subárbol (por ejemplo, "lib / util"), deberá pasar eso al
rev-list
subcomando ygrep
también:Esto buscará en todo su texto de confirmación
regexp
.La razón para pasar la ruta en ambos comandos es porque
rev-list
devolverá la lista de revisiones dondelib/util
ocurrieron todos los cambios , pero también debe pasar paragrep
que solo busquelib/util
.Solo imagine el siguiente escenario:
grep
podría encontrar lo mismo<regexp>
en otros archivos que están contenidos en la misma revisión devuelta porrev-list
(incluso si no hubo cambios en ese archivo en esa revisión).Aquí hay otras formas útiles de buscar su fuente:
Busque en el árbol de trabajo el texto que coincida con la expresión regular regexp:
Busque en el árbol de trabajo líneas de texto que coincidan con la expresión regular regexp1 o regexp2:
Busque en el árbol de trabajo líneas de texto que coincidan con la expresión regular regexp1 y regexp2, informando solo las rutas de los archivos:
Busque en el árbol de trabajo archivos que tengan líneas de texto que coincidan con la expresión regular regexp1 y líneas de texto que coincidan con la expresión regular regexp2:
Busque en el árbol de trabajo líneas modificadas de patrones de coincidencia de texto
Busque en todas las revisiones el texto que coincida con la expresión regular regexp:
Busque en todas las revisiones entre rev1 y rev2 el texto que coincida con la expresión regular regexp:
fuente
sh.exe": /bin/git: Bad file number
. La respuesta de VonC también funciona con msysgit.git gc
o eche un vistazo: stackoverflow.com/questions/1507463/…Debe usar la opción pickaxe (
-S
) degit log
.Para buscar
Foo
:Vea el historial de Git: encuentre la línea perdida por palabra clave para obtener más información.
Como Jakub Narębski comentó:
esto busca diferencias que introducen o eliminan una instancia de
<string>
. Por lo general, significa "revisiones donde agregó o eliminó la línea con 'Foo'".la
--pickaxe-regex
opción le permite usar expresiones regulares POSIX extendidas en lugar de buscar una cadena. Ejemplo (degit log
):git log -S"frotz\(nitfol" --pickaxe-regex
Como comentó Rob , esta búsqueda distingue entre mayúsculas y minúsculas: abrió una pregunta de seguimiento sobre cómo buscar entre mayúsculas y minúsculas.
fuente
git log
parte de tu pregunta me confundió;)-p
bandera para generar también la diferencia.--branches --all
opciones para buscar el repositorio completo.Mi forma favorita de hacerlo es con
git log
la-G
opción (agregada en la versión 1.7.4).Hay una sutil diferencia entre la forma en que las opciones
-G
y-S
determinan si una confirmación coincide:-S
opción esencialmente cuenta el número de veces que su búsqueda coincide en un archivo antes y después de una confirmación. La confirmación se muestra en el registro si los conteos antes y después son diferentes. Esto, por ejemplo, no mostrará confirmaciones donde se movió una línea que coincide con su búsqueda.-G
opción, la confirmación se muestra en el registro si su búsqueda coincide con cualquier línea que se agregó, eliminó o modificó.Tome este compromiso como un ejemplo:
Debido a que el número de veces que aparece "hola" en el archivo es el mismo antes y después de esta confirmación, no coincidirá con el uso
-Shello
. Sin embargo, dado que hubo un cambio en una coincidencia de líneahello
, la confirmación se mostrará usando-Ghello
.fuente
-p
opción de mostrar una diferencia para cada confirmación. Luego, cuando el registro se abre en mi buscapersonas, busco lo que sea que esté buscando. Si su buscapersonas esless
y ustedgit log -Ghello -p
, puede escribir/hello
, presionarEnter
y usarn
yN
para encontrar las ocurrencias siguientes / anteriores de "hola".-G
y Regex: si la línea de comando usa UTF-8 y el archivo que está mirando usa algo de codificación ISO-Latina (8 bits),.*
falla. Por ejemplo, tengo un cambioVierter Entwurf
->Fünfter Entwurf
, y aunque'V.*ter Entwurf'
produce una coincidencia,'F.*ter Entwurf'
no.Si desea examinar los cambios en el código (vea lo que realmente se ha cambiado con la palabra dada en todo el historial) vaya al
patch
modo: encontré una combinación muy útil de hacer:fuente
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. los
-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
'
comillas no agrupan su cadena de búsqueda como un solo argumento. En cambio,'public
es el argumento de-S
, y trata el resto como argumentos separados. No estoy seguro de en qué entorno se está ejecutando, pero ese contexto sería necesario para ayudar a solucionar problemas. Sugeriría abrir una pregunta separada de StackOverflow si es necesario para ayudarlo a solucionar problemas, con todo el contexto de cómo se envía su comando git al shell. ¿Me parece que se está enviando a través de algún otro comando? Los comentarios aquí no son el lugar correcto para resolver esto.Tomé la respuesta de Jeet y la adapté a Windows (gracias a esta respuesta ):
Tenga en cuenta que para mí, por alguna razón, la confirmación real que eliminó esta expresión regular no apareció en la salida del comando, sino que una confirmación anterior.
fuente
--no-pager
al comando git al final>>results.txt
para aquellos que no versado en Windows tuberías ...Buscar en cualquier revisión, cualquier archivo :
Buscar solo en algunos archivos, por ejemplo, archivos XML:
Las líneas de resultado deberían verse así: 6988bec26b1503d45eb0b2e8a4364afb87dde7af: bla.xml: texto de la línea que encontró ...
Luego puede obtener más información como autor, fecha y diferencia usando
git show
:fuente
Para simplificar, sugeriría usar GUI: gitk : el navegador de repositorios Git . Es bastante flexible
Y puede navegar por los resultados con las flechas arriba / abajo.
fuente
Para cualquier otra persona que intente hacer esto en Sourcetree , no hay un comando directo en la interfaz de usuario (a partir de la versión 1.6.21.0). Sin embargo, puede usar los comandos especificados en la respuesta aceptada abriendo Terminal ventana (botón disponible en la barra de herramientas principal) y copiándolos / pegándolos allí.
Nota: La vista de búsqueda de Sourcetree puede hacer búsquedas de texto en parte. Presione Ctrl+ 3para ir a la vista de Búsqueda (o haga clic en la pestaña Buscar disponible en la parte inferior). Desde el extremo derecho, configure el tipo de búsqueda en Cambios de archivo y luego escriba la cadena que desea buscar. Este método tiene las siguientes limitaciones en comparación con el comando anterior:
fuente
Cada vez que me encuentro en su lugar, uso la siguiente línea de comando:
Explicación:
git log
- Necesito escribir más aquí; Muestra los registros en orden cronológico.-S "<words/phrases i am trying to find>"
- Muestra todas las confirmaciones de Git donde cualquier archivo (agregado / modificado / eliminado) tiene las palabras / frases que estoy tratando de encontrar sin los símbolos '<>'.--all
- Hacer cumplir y buscar en todas las ramas.--oneline
- Comprime el registro de Git en una línea.--graph
- Crea el gráfico de confirmaciones ordenadas cronológicamente.fuente
La respuesta de Jeet funciona en PowerShell.
A continuación se muestran todos los archivos, en cualquier confirmación, que contengan a
password
.fuente
Entonces, ¿estás tratando de buscar versiones anteriores del código para ver dónde existe algo por última vez?
Si estuviera haciendo esto, probablemente usaría git bisect . Con bisect, puede especificar una versión buena conocida, una versión mala conocida y un script simple que verifica si la versión es buena o mala (en este caso, un grep para ver si el código que está buscando está presente) ) Al ejecutar esto, se encontrará cuando se eliminó el código.
fuente
Escenario: realizó una gran limpieza de su código utilizando su IDE. Problema: el IDE limpió más de lo debido y ahora el código no se compila (faltan recursos, etc.)
Solución:
Encontrará el archivo donde se modificó "text_to_find".
Ahora puede deshacer este cambio y compilar su código.
fuente
es un ajuste a la solución de Jeet , por lo que muestra resultados mientras busca y no solo al final (lo que puede llevar mucho tiempo en un repositorio grande).
fuente
En mi caso, necesitaba buscar un commit corto y, por desgracia, las soluciones enumeradas no funcionaban.
Logré hacerlo con (reemplazar el token REGEX ):
fuente