2009-03-26 31 views
26

Tengo dos exportaciones diferentes de nuestro repositorio de CVS en git. Divergen en algún momento, y estoy investigando por qué. La línea de desarrollo se remonta a varios años y a más de decenas de miles de compromisos.¿Cómo comparo dos repositorios git?

Al comienzo de la línea de desarrollo, los ID de SHA1 para cada confirmación son idénticos, y me dicen que git-cvsimport es muy coherente sobre lo que hace cuando lee los resultados de cvsps e importaciones.

Pero en algún momento entre el primer compromiso y ayer, los identificadores SHA1 comienzan a divergir. Me gustaría saber dónde está esto al comparar una lista de identificadores de commit de cada repositorio y buscar qué falta. ¿Hay buenas herramientas o técnicas para hacer esto?

Respuesta

16

¿Por qué no anotar el registro git de cada repositorio en su propio archivo y comparar? La diferencia más cercana a la parte inferior del archivo es donde comenzaron a divergir ...

+0

Esto es realmente lo que terminé haciendo ayer, aunque hoy estoy un poco más avanzado con algunas sugerencias de las otras respuestas. – skiphoppy

+3

ver donde dos repositorios comenzaron a divergir está muy lejos de decirme las diferencias que se crearon desde esa divergencia. – masukomi

+0

Lo siento, pero esa no era la pregunta. La pregunta es ¿cómo se comparan dos repos? La respuesta está abajo. – awm

6

La manera obvia sería clonar un repositorio, buscar la punta de la rama principal del otro repositorio en el clon y usar git merge-base en los dos consejos para encontrar el ancestro común.

30

Dado que los dos repositorios git comienzan de la misma manera, puede obtener ambos en el mismo repositorio de trabajo.

$ git remote add cvsimport-a git://.../cvsimport-a.git 
$ git remote add cvsimport-b git://.../cvsimport-b.git 
$ git remote update 
$ git log cvsimport-a/master..cvsimport-b/master # in B, not in A? 
$ git log cvsimport-b/master..cvsimport-a/master # in A, not in B? 
+0

Probablemente va a necesitar cvsimport-a/master y cvsimport-b/master en esos comandos.Además, puede hacer "actualización remota de git" en lugar de conectar a xargs git fetch. –

+0

Originalmente iba a escribir 'git remote fetch cvsimport-a; git remote fetch cvsimport-b' (sin actualizar ningún otro control remoto), pero luego cambié de opinión ... hecho. Git se queja un poco si lo dejas/master, pero funciona. Lo cambiaré por claridad. – ephemient

12

En uno de sus repositorios, haga lo siguiente:

$ git remote add other-repo git://.../other-repo.git 
$ git remote update 
$ git log other-repo/master...master 
    # or maybe: 
$ gitk master... other-repo/master 

Esto le da la diferencia simétrica entre dos repositorios; esto muestra todas las confirmaciones que están en un repositorio, pero no en el otro.

0

Se puede retener (fetch) tanto de los depósitos en un solo repositorio, ya sea uno nuevo, o uno de los existentes, como en las respuestas por ephemient, Charles Bailey y Brian Campbell. O puede usar el truco de la página Tips and Tricks en Git Wiki, o para ser más exactos la pregunta "Cómo comparar dos repositorios locales" allí.

Pero puede ser más simple generar una lista de SHA-1 de confirmaciones en orden topológico usando "git rev-list" (o "git-log" con las opciones apropiadas) y verificar la primera revisión que difieren.

+0

El enlace Consejos y trucos muestra un "No encontrado", ¿se ha movido o se ha ido? – Chris

+0

Wiki de Git primero se movió de http://git.or.cz a http://git.wiki.kernel.org pero segundo después del asalto en kernel.org aún no ha vuelto (y no se sabe si lo haría) ser beack allí, o tal vez en algún lugar en http://git-scm.com). http://git.wiki.kernel.org está en modo de solo lectura, por lo que todos los enlaces han cambiado. ** Consejos y trucos ** (aka ** GitTips **) está disponible aquí: https://git.wiki.kernel.org/articles/g/i/t/GitTips_81aa.html –

0

Tuve una necesidad similar recientemente. Tenía un proyecto remoto clonado que necesitaba comparar con una base de código copiada actual. Los registros de git no eran relevantes, porque los commits no tenían nada en común, y no estaba seguro de que se derivaran de la misma base de código.

Para resolver el problema, utilicé git de una manera de fuerza bruta. Copié los archivos para ser registrados en el repositorio git, luego verifiqué el git status para ver una lista de archivos modificados.

Además, git diff <filename> también se puede utilizar para inspeccionar más. Pude comparar archivos dentro de

Cuestiones relacionadas