Tengo un repositorio Git con pocas ramas y confirmaciones colgantes. Me gustaría buscar todas estas confirmaciones en el repositorio para una cadena específica.
Sé cómo obtener un registro de todas las confirmaciones en el historial, pero estas no incluyen ramas o blobs colgantes, solo el historial de HEAD. Quiero obtenerlos 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.
Respuestas:
Puedes ver confirmaciones colgantes con
git log -g
.Entonces, puede hacer esto para encontrar una cadena particular en un mensaje de confirmación que cuelga:
Alternativamente, si desea buscar los cambios para una cadena en particular, puede usar la opción de búsqueda de pico, "-S":
Git 1.7.4 agregará la opción -G , permitiéndole pasar -G <regexp> para encontrar cuándo se movió una línea que contiene <regexp>, lo que -S no puede hacer. -S solo le indicará cuándo cambió el número total de líneas que contienen la cadena (es decir, agregar / quitar la cadena).
Finalmente, puede usar gitk para visualizar las confirmaciones colgantes con:
Y luego use sus funciones de búsqueda para buscar el archivo fuera de lugar. Todo este trabajo suponiendo que el commit faltante no ha "caducado" y se ha recolectado basura, lo que puede suceder si está colgando durante 30 días y expira los registros o ejecuta un comando que caduca.
fuente
!git fsck --unreachable | sed -ne 's/^unreachable commit //p' | xargs git log --no-walk
En Mercurial, utiliza
hg log --keyword
para buscar palabras clave en los mensajes de confirmación yhg log --user
para buscar un usuario en particular. Consultehg help log
otras formas de limitar el registro.fuente
hg log -k
las búsquedas confirman el nombre de usuario y los nombres de archivo en los conjuntos de cambios también (lo veo en command.py:log), que es una de las pocas cosas que no entiendo en hg. Debería haber opciones separadas para buscar en mensajes de confirmación y nombres de archivo. Parece quehg log --template '{desc}\n'|grep
es el camino seguro.hg grep --all <term>
Además de la respuesta richq de usar
git log -g --grep=<regexp>
ogit grep -e <regexp> $(git log -g --pretty=format:%h)
: eche un vistazo a las siguientes publicaciones de blog de Junio C Hamano, actual mantenedor de gitResumen
Tanto git grep como git log --grep están orientados a líneas , ya que buscan líneas que coincidan con el patrón especificado.
Puede usar
git log --grep=<foo> --grep=<bar>
(ogit log --author=<foo> --grep=<bar>
eso se traduce internamente en dos--grep
) para buscar confirmaciones que coincidan con cualquiera de los patrones (implícito O semántico).Debido a que está orientado a la línea, lo útil Y semántico es usar
git log --all-match --grep=<foo> --grep=<bar>
para encontrar commit que tenga tanto la coincidencia de línea primero como la coincidencia de línea segunda en alguna parte.Con
git grep
puede combinar varios patrones (todos los cuales deben utilizar el-e <regexp>
formulario) con--or
(que es el valor por defecto),--and
,--not
,(
y)
. Para grep--all-match
significa que el archivo debe tener líneas que coincidan con cada una de las alternativas.fuente
Sobre la base de la respuesta de rq, encontré que esta línea hace lo que quiero:
Que informará el ID de confirmación, el nombre de archivo y mostrará la línea correspondiente, de esta manera:
... ¿Alguien está de acuerdo en que esta sería una buena opción para ser incluida en el comando estándar git grep?
fuente
Cualquier comando que tome referencias como argumentos aceptará la
--all
opción documentada en la página del manual de lagit rev-list
siguiente manera:Entonces, por ejemplo,
git log -Sstring --all
se mostrarán todos los commits que mencionanstring
y que son accesibles desde una rama o desde una etiqueta (supongo que sus commits colgantes se nombran al menos con una etiqueta).fuente
git grep
, donde--all
parece traducirse / usarse como--all-match
. Esto me parece un error ... usando Git 1.7.2.3 (usando$(git rev-list --all)
trabajos).Con Mercurial haces un
Hay otras opciones que reducen el rango de revisiones que se buscan.
fuente
hg grep --all
No sé sobre git, pero en Mercurial simplemente canalizaría la salida de hg log a algún script sed / perl / whatever para buscar lo que sea que esté buscando. Puede personalizar la salida del registro hg utilizando una plantilla o un estilo para facilitar la búsqueda, si lo desea.
Esto incluirá todas las ramas con nombre en el repositorio. Mercurial no tiene algo como colgar gotas de afaik.
fuente
si es un usuario de vim, puede instalar tig (apt-get install tig) y usar /, el mismo comando para buscar en vim
https://blogs.atlassian.com/2013/05/git-tig/
fuente
Para agregar solo una solución más aún no mencionada, tuve que decir que usar el cuadro de búsqueda gráfica de gitg fue la solución más simple para mí. Seleccionará la primera aparición y puede encontrar la siguiente con Ctrl-G.
fuente
Un comando en git que creo que es mucho más fácil encontrar una cadena:
funciona en Git 2.0.4
fuente