2010-12-17 22 views
496

Tengo una base de código que quiero enviar a GitHub como código abierto. En este árbol fuente controlado por git, tengo ciertos archivos de configuración que contienen contraseñas. Me aseguré de no rastrear este archivo y también lo agregué al archivo .gitignore. Sin embargo, quiero estar absolutamente seguro de que no se empujará información sensible, tal vez si algo se desliza entre compromisos o algo así. Dudo que fui lo suficientemente descuidado para hacer esto, pero quiero ser positivo.Buscar toda la historia de Git para una cadena?

¿Hay alguna manera de "grep" de todos los git? Sé que suena raro, pero por "todo" creo que me refiero a cada versión de archivo que alguna vez fue. Supongo que si hay un comando que vuelca el archivo diff para cada confirmación, ¿podría funcionar?

+0

es limitado, ya que solo buscará en una sola rama (¿principal?), Pero está bastante cerca de lo que quiere https://github.com/divinity76/SearchGithubHistory.js/blob/master/SearchGithubHistory.js/ – hanshenrik

+0

A pesar de las "Respuestas correctas", su requisito es verificar que cierta información no esté comprometida públicamente: la respuesta 'git' solo es relevante, ya que está cometiendo todo el historial. Por supuesto, si solo comprometes la revisión actual, sin historial (por ejemplo, "git archive"), bastará con un simple 'grep'. – MikeW

Respuesta

776

Git puede buscar diff con la opción -S (se llama pico in the docs)

git log -Spassword 

Esto encontrará ningún commit que añade o elimina la cadena password. Aquí algunas opciones:

  • -p: mostrará los diffs. Si proporciona un archivo (-p file), generará un parche para usted.
  • -G: busca las diferencias cuya línea agregada o eliminada coincide con la expresión regular dada, en oposición a -S, que "busca diferencias que introducen o eliminan una instancia de cadena".
  • --all: busca en todas las ramas y etiquetas; otra alternativa es utilizar --branches[=<pattern>] o --tags[=<pattern>]
+3

Si algo termina comprometido, ¿hay alguna manera fácil de eliminarlo? Supongamos en este escenario que hay un archivo de configuración que quiero mantener, pero una línea contiene una contraseña, que quiero eliminar de todo mi historial de git. ¿Alguna forma sencilla de hacerlo sin tener que volver a escribir cada confirmación? –

+2

@MattD Sí, 'git rebase -i ' hará el truco. Pregunta relevante: http://stackoverflow.com/questions/4963261/can-i-rebase-old-commits –

+2

hola, 'git log -Gpassword --all', cómo agregar condición para buscar solo un archivo (dando un regex para filtrar nombre de archivo + ruta de archivo) – atian25

67
git rev-list --all | (
    while read revision; do 
     git grep -F 'password' $revision 
    done 
) 
+8

+1: Habría hecho "una revisión en \ 'git rev-list --all \'; do git grep ... done", pero su enfoque es más reactivo, ya que greps mientras se encuentran las revisiones. – EOL

+1

¿Es posible usar esto en un repositorio remoto (como github)? – studgeek

+1

@reesd: solo si lo clonas, por supuesto. – cdhowie

16

Pruebe los siguientes comandos para buscar la cadena dentro de todos los archivos de orugas anteriores:

git log --patch | less +/searching_string 

o

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string' 

que debe ejecutar desde el directorio padre donde le gustaría hacer la búsqueda

Cuestiones relacionadas