ver tipos tag pendientes modificados log etiquetas crear commits archivos git dvcs

tipos - git ver commits pendientes



Mostrar todas las confirmaciones cuyo diff contiene una cadena especĂ­fica (7)

¿Has considerado usar un comando pipe y grep?

Ejemplo:

git log -p | grep ''filename''

Como dice el título, quiero encontrar todas las confirmaciones cuyo diff contenga una cadena específica.

Por el momento, yo uso

git log -p ''filename''

Lo que muestra menos la interfaz de cada diff, donde busco la cadena. Luego retrocedo para encontrar el mensaje de confirmación real.

Una alternativa simple podría ser colocar git log -p en grep, pero no puedo encontrar el ID o mensaje de confirmación de esa manera.


Aquí hay una secuencia de comandos de shell de una línea (dividida en más de una línea para propósitos de formato) que extrae los números de rev de las path actuales que afectan a la path afecta a la path donde git show -p contiene el pattern dado. No es perfecto (coincidirá con los mensajes de confirmación y los difs), pero debería ser fácil de modificar como quieras, desde aquí.

git rev-list HEAD -- path | while read rev; do if git show -p $rev | grep pattern >/dev/null; then echo $rev fi done

Tenga en cuenta que puede reemplazar git show con, por ejemplo, git diff $rev^ $rev (tenga en cuenta que esto solo se compara con el primer padre si es una combinación), o git whatchanged $rev , o lo que quiera. El truco principal es comenzar con git rev-list para extraer todos los candidatos (confirmaciones que afectan a la ruta dada; omita la parte -- path para obtener todas las confirmaciones a partir de HEAD ). Vea git-rev-list(1) para muchas otras cosas que puede hacer con git rev-list .


Puedes usar git para esto, por ejemplo:

git log --grep="filename"

O en un archivo específico:

git log --grep="filename" README


Sé que esta pregunta ha sido respondida por un tiempo, pero encontré esto también y encontré una solución diferente, así que pensé en compartirla. El conmutador -G de Git-log debería hacer lo que se está preguntando, donde el conmutador -S solo generaría confirmaciones donde cambia el número de apariciones de la cadena coincidente.

De la página man de Git-log :

-G Busque diferencias cuyo texto de parche contenga líneas agregadas / eliminadas que coincidan.

Para ilustrar la diferencia entre -S --pickaxe-regex y -G, considere una confirmación con la siguiente diferencia en el mismo archivo:

+ return !regexec(regexp, two->ptr, 1, &regmatch, 0); ... - hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

Mientras que git log -G "regexec (regexp" mostrará esta confirmación, git log -S "regexec (regexp" --pickaxe-regex no lo hará (porque el número de ocurrencias de esa cadena no cambió).

Ver la entrada de piqueta en gitdiffcore (7) para más información.


Si está en Linux, diríjalo a través de egrep y busque en una expresión regular

git log -p ''filename'' | egrep ''(yourstring|commit-message)''


git log --all -G''my_search'' -i -m -p

mnemónico: git registra todos los GIMP

  • --all : buscar a través de todos los caminos posibles, no solo a través de HEAD.
  • -G : más general que -S porque -S busca solo diferencias que muestran un número diferente de apariciones de my_search . -G busca en difs completos y acepta expresiones regulares.
  • -i [opcional]: hacer -G ignorar el caso.
  • -m : de forma predeterminada, el registro de git no genera diferencias para las confirmaciones de mezcla. -m cambia este comportamiento predeterminado haciendo que la combinación cometa resultados de salida completos. Esto es crucial: si una confirmación de fusión con formato incorrecto cambiara su línea, no podría ver sin -m .
  • -p : también muestra el parche completo para cada confirmación encontrada.

Incluso puedes conectar esto a vim. Me resulta muy útil:

git log --no-color --all -G''regex'' -i -m -p | vim -

Aquí estoy usando --no-color porque vim resalta parches para mí.


git log -p -S''string''

se puede utilizar para buscar confirmaciones que agreguen o eliminen una cadena. No se comporta exactamente igual, ya que solo coincide con las confirmaciones que en realidad agregan o eliminan una instancia del patrón, y no (por ejemplo) las confianzas donde ocurre en el contexto de diff. Pero tal vez eso sea lo suficientemente bueno para ti.