tag remove practices log crear commits best git version-control diff cvs mercurial

remove - git tag best practices



¿Diffing entre dos directorios/proyectos completos? (6)

Heredé un proyecto originalmente almacenado en CVS con todas las revisiones. Hice algunas ediciones y trato de comparar todos los cambios que hice en el directorio original, con respecto a los nuevos archivos agregados en comparación con los viejos.

¿Hay algún tipo de utilidad para hg / git en la que pueda hacer un árbol diff o algo de esa naturaleza? Así que, por ejemplo, hay una marca entre los archivos recién agregados, los archivos eliminados, ¿estoy pidiendo demasiado?


¿Hay algún tipo de utilidad para hg / git donde puedo hacer una diferencia de árbol ... [s] o que dicen, hay una marca entre los archivos recién agregados, los archivos eliminados ... [énfasis añadido]

Sí. Podemos git diff el directorio actual contra otro directorio y ...

... marque los archivos agregados, eliminados y modificados:

git diff --name-status --no-index ./ path/to/other/dir

... mostrar solo los archivos agregados:

git diff --diff-filter=A --name-status --no-index ./ path/to/other/dir

... mostrar solo los archivos eliminados:

git diff --diff-filter=D --name-status --no-index ./ path/to/other/dir

... mostrar solo los archivos modificados:

git diff --diff-filter=M --name-status --no-index ./ path/to/other/dir

Ver también: https://git-scm.com/docs/git-diff


De la página de git diff :

git diff [--options] [--] [<path>...]

[...]
Si se proporcionan exactamente dos rutas, y al menos una no se rastrea, compare los dos archivos / directorios. Este comportamiento puede ser forzado por --no-index .

Si desea comparar dos versiones (por ejemplo, dos lanzamientos etiquetados o dos ramas) en dos repositorios diferentes, puede usar el truco descrito en la página GitTips en Wiki de Git, en "Cómo comparar dos repositorios locales".

Suponiendo que está dentro de un repositorio, y el segundo repositorio está en /path/to/repo , por lo que su GIT_DIR es /path/to/repo/.git si es un repositorio no vacío, puede hacer algo como lo siguiente:

$ GIT_ALTERNATE_OBJECT_DIRECTORIES=/path/to/repo/.git/objects / git diff $(git --git-dir=/path/to/repo/.git rev-parse --verify A) B

donde A y B son revisiones que desea comparar. Por supuesto, también puede especificar el limitador de ruta en la expresión anterior.

Explicación: GIT_ALTERNATE_OBJECT_REPOSITORIES variable GIT_ALTERNATE_OBJECT_REPOSITORIES se puede usar para hacer que los comandos de git concatenen la base de datos de objetos de los dos repositorios. git --git-dir=... rev-parse ... se usa para convertir el nombre (expresión SHA-1 extendida) en un repositorio dado como parámetro a la opción git-dir en el identificador único SHA-1. El constructo $( ... ) pone el resultado de llamar el comando dado en la línea de comando. git diff se usa para comparar dos revisiones (donde una es del repositorio de objetos alternativo).

La solución alternativa sería simplemente importar otro repositorio en el repositorio dado, usando git remote add (y git fetch ). Entonces tendría todo a nivel local, y podría hacer una comparación dentro del repositorio único.


No es específico de git, pero como utilidad general de diferencias para Windows, realmente me gusta WinMerge .


Para simplemente crear un parche diff en el formato diff de git desde dos archivos o directorios arbitrarios, sin ningún tipo de material de repositorio o control de versión :

git diff --no-index some/path other/path >> some_filename

El comentario de Jakub Narębski sobre la respuesta de Knittl insinuó la respuesta ... Por simplicidad, ese es el comando completo.

La parte >> crea un archivo y lo redirige a la salida. Si no quiere un archivo y solo quiere que se imprima el resultado en su consola para que pueda copiarlo, simplemente elimine la parte >> some_filename .

Para copiar y pegar de forma conveniente, si ya ha cd un directorio que contiene el directorio / archivo original llamado a y el directorio modificado b , será:

git diff --no-index a b >> patch


Realmente no entiendo lo que quieres, ¿pero no es suficiente para ti? Funcionará incluso en directorios sin ningún tipo de control de versión.


git diff hace exactamente eso. pero solo funciona para proyectos de git.

hg diff , svn diff pretty cada sistema de control de versiones puede diff directorio árboles