¿Cómo search a través de todas las confirmaciones de Git y Mercurial en el repository para una determinada cadena?

Tengo un repository de Git con pocas twigs y confirmaciones pendientes. Me gustaría search todos los commits en el repository de una cadena específica.

Sé cómo get un logging de todos los commits en la historia, pero estos no incluyen twigs o blobs colgantes, solo la historia de HEAD. Quiero getlos a todos, para encontrar un compromiso específico que se extravió.

También me gustaría saber cómo hacer esto en Mercurial, ya que estoy considerando el cambio.

Puedes ver confirmaciones colgantes con git log -g .

 -g, --walk-reflogs Instead of walking the commit ancestry chain, walk reflog entries from the most recent one to older ones. 

Entonces puede hacer esto para encontrar una cadena en particular en un post de compromiso que está colgando:

 git log -g --grep=search_for_this 

Alternativamente, si desea search los cambios para una cadena en particular, puede usar la opción de búsqueda de picos, "-S":

 git log -g -Ssearch_for_this # this also works but may be slower, it only shows text-added results git grep search_for_this $(git log -g --pretty=format:%h) 

Git 1.7.4 agregará la opción -G , lo que le permite pasar -G <regexp> para encontrar cuando se movió una línea que contiene <regexp>, lo que -S no puede hacer. -S solo le dirá cuándo cambió la cantidad total de líneas que contenían la cadena (es decir, si agregó / eliminó la cadena).

Finalmente, puedes usar gitk para visualizar los commits pendientes con:

 gitk --all $(git log -g --pretty=format:%h) 

Y luego use sus funciones de búsqueda para search el file extraviado. Todo este trabajo supone que la confirmación faltante no ha "expirado" y se ha recolectado basura, lo que puede suceder si está pendiente durante 30 días y expira los reflogs o ejecuta un command que los expira.

En Mercurial, utiliza hg log --keyword para search palabras key en los posts de confirmación y hg log --user para search un usuario en particular. Consulte hg help log para conocer otras forms de limitar el logging.

Además de la respuesta ricaq de usar git log -g --grep=<regexp> o git grep -e <regexp> $(git log -g --pretty=format:%h) : eche un vistazo a las siguientes publicaciones de blog por Junio ​​C Hamano, actual mantenedor git

  • Diversión con "git log –grep"
  • Diversión con "git grep"

Resumen

Tanto git grep como git log –grep están orientados a la línea , ya que buscan líneas que coincidan con el patrón especificado.

Puede usar git log --grep=<foo> --grep=<bar> (o git log --author=<foo> --grep=<bar> que internamente se traduce en dos --grep ) para encontrar confirmaciones que coinciden con cualquiera de los patrones (implícita O semántica).

Debido a que está orientado a la línea, la semántica AND útil es usar git log --all-match --grep=<foo> --grep=<bar> para encontrar la confirmación que tiene tanto coincidencia de línea primero como coincidencia de línea de segundo en alguna parte.

Con git grep puede combinar varios patrones (todos los cuales deben usar la forma -e <regexp> ) con – --or (que es el valor pnetworkingeterminado), --and , --not , ( y ) . Para grep – --all-match significa que el file debe tener líneas que coincidan con cada una de las alternativas.

Basándome en la respuesta de rq, encontré que esta línea hace lo que quiero:

 git grep "search for something" $(git log -g --pretty=format:%h -S"search for something") 

Que informará el ID de confirmación, el nombre del file y mostrará la línea correspondiente, como esta:

 91ba969:testFile:this is a test 

… ¿Alguien acepta que esta sería una buena opción para ser incluido en el command estándar de git grep?

Cualquier command que tome references como arguments aceptará la --all opción documentada en la página de manual para git rev-list siguiente manera:

  --all Pretend as if all the refs in $GIT_DIR/refs/ are listed on the command line as <commit>. 

Entonces, por ejemplo, git log -Sstring --all mostrará todos los commits que mencionen string y que sean accesibles desde una twig o desde una label (supongo que tus commits colgantes son al less nombrados con una label).

Con Mercurial haces una

 $ hg grep "search for this" [file...] 

Hay otras opciones que networkingucen el range de revisiones que se buscan.

No sé nada acerca de git, pero en Mercurial simplemente canalizaba la salida de hg log a algún script sed / perl / lo que sea para search lo que sea que estés buscando. Puede personalizar la salida de hg log utilizando una plantilla o un estilo para facilitar la búsqueda, si lo desea.

Esto includeá todas las sucursales nombradas en el repository. Mercurial no tiene algo así como burbujas afaik.

si usted es un usuario de vim, puede instalar tig (apt-get install tig) y usar /, mismo command para search en vim

https://blogs.atlassian.com/2013/05/git-tig/

Para agregar una solución más aún no mencionada, tuve que decir que el uso del cuadro de búsqueda gráfica de gitg fue la solución más simple para mí. Seleccionará la primera ocurrencia y podrá encontrar la siguiente con Ctrl-G.

Un command en git que creo que es mucho más fácil encontrar una cadena:

 git log --pretty=oneline --grep "string to search" 

funciona en Git 2.0.4