41 votos

Manejo cambia el nombre de: svn vs git vs mercurial

Cómo hacer cada uno de estos VCS manejar cambia el nombre?

He encontrado una gran cantidad de información contradictoria que indica que git pistas LOC (líneas de código) en lugar de archivos, cambia el nombre sería, por tanto, no tienen ningún significado para él.

40voto

tonfa Puntos 8867
  • Git no cambia el nombre de la pista, pero utiliza heurística para re-descubrir durante combinar etc.
  • Mercurial pistas cambia el nombre (el origen de la versión y el origen de archivo se graba) y utiliza esa información durante funde. Así que usted tiene que decirle explícitamente hg acerca cambia el nombre de con hg mv, o el uso de hg addremove --similarity para el auto-descubrimiento. Se ha hablado un poco acerca de la adición de la heurística durante la mezcla.
  • Svn pistas cambia el nombre, pero yo no sé lo bien que se trata con ellos durante fusiona (nunca testado).

22voto

Jakub Narębski Puntos 87537

Git

Git es diferente por que no cambiar el nombre de seguimiento, lo que significa que no necesita ser dicho acerca cambia el nombre por el uso de SCM comandos para hacer cambiar el nombre (o ejecutar la detección automática de secuencia de comandos para marcar cambia el nombre antes de cometer), y no guardar dicha información en el repositorio, pero no cambiar el nombre de la detección. Esto significa que se encuentra cambia el nombre por el nombre de archivo y el contenido del archivo de similitud basado en un algoritmo heurístico, tanto durante la mezcla, y para diff cuando se solicita a través de -M opción (o utilizando configurado diff.renames opción de configuración).

Las ventajas de este método son los siguientes:

  • cambia el nombre no necesita ser marcado (o detección) de manera explícita: el cambia el nombre puede venir de un parche, o se puede hacer vie filemanager o la interfaz gráfica
  • la similitud algoritmo de detección puede ser mejorado, y no se congela en el momento de cometer como en el caso de detectar cambia el nombre a la marca de ellos antes de cometer, y guardar esta información en el repositorio; también es más fácil tratar con cambiar el nombre de la detección de errores si no están congelados en la historia
  • sigue Git ophilosophy que es el contenido lo que importa; ver cómo git culpa (y de interfaces gráficas a él como "git gui culpa") puede seguir el movimiento de los bloques de código a través del archivo de límites, algo que es más genérico que wholesame cambia el nombre de archivos.

Tenga en cuenta que pathspec filtrado no funcionan bien con cambiar el nombre de la detección; si quieres seguir la historia de un archivo a través cambia el nombre de utilizar "git log --follow <filename>"

9voto

jammycakes Puntos 2999

En la práctica:

Git detecta renombra automáticamente. (Por cierto, he escuchado los reclamos que git puede detectar cuando se mueve a una función desde un archivo a otro. Mis pruebas iniciales parecen indicar que este no es el caso, sin embargo.)

Con Mercurial, usted tiene que decirle explícitamente se acerca cambia el nombre, ya sea por hg mvo la --similarity opción de hg addremove, o TortoiseHg "supongo que cambia el nombre de" opción, o ciertas herramientas, por ejemplo, VisualHg se cambia el nombre de la bandera de la para usted. Si desea utilizar el Git enfoque con Mercurial, he escrito una extensión para detectar cambia el nombre en el momento de la confirmación, pero en una etapa muy experimental en el momento.

Subversion no maneja cambia el nombre a todos. Se registra un cambio de nombre como un archivo sea eliminado y otro archivo que se agrega. Esto significa, por ejemplo, que si Alice cambios de un archivo y Bob le cambia el nombre, se obtiene un árbol de conflicto. Esto ocurre ya sea que usted está haciendo en toda regla de ramificación y la fusión o, simplemente, svn update. Cambiar el nombre de seguimiento está prevista para la Subversión 1.8, que se estrenará el próximo año en algún momento.

6voto

divegeek Puntos 1754

Usted ha escuchado a la derecha, una especie de.

Git opera sobre el contenido de los archivos, no de los propios archivos, por lo que cambia son técnicamente sin sentido. A git, un cambio de nombre parece archivo de Un desaparecido y archivo B apareció con el mismo contenido que A. Pero git es en realidad bastante bueno en averiguar cuando un archivo ha sido cambiado de nombre.

Inténtelo: cambiar el nombre de un archivo, a continuación, ejecute 'git rm oldname' y 'git add newname' para decirle a git a la etapa de los cambios, a continuación, ejecutar git 'estado' para ver lo que git piensa que está haciendo ... vas a ver que te dice que el archivo ha cambiado de nombre. No estoy seguro de que significa algo más tarde, sin embargo. Mira un commit con git 'show' y no veo ninguna mención de un cambio de nombre, sólo un montón de líneas que se extrae de una ruta de acceso y se añade a otro.

Como alternativa, también puede utilizar el 'git mv' comando para cambiar el nombre de un archivo. No cambiar la forma de git ve la operación, sólo se da 'mv oldname newname', 'git rm oldname' y 'git add newname' en un solo paso.

Para una visión general, de Mercurial, ver tonfa la respuesta.

SVN, por otro lado, no puede detectar cambia el nombre, pero debe ser dicho acerca de ellos con el 'svn mv' comando. Cuando se le dijo, sin embargo, se cambia el nombre de las pistas como "primera clase" de los cambios, por lo que al ver la lista de cambios más adelante verás que el cambio fue un cambio de nombre.

Yo no recomendaría elegir un SVN sobre git o mercurial basa en esta característica, sin embargo. Hay mucho más grande y más importante de las diferencias entre las herramientas. Me gustaría en primer lugar decidir si desea distribuido sistema de control de versiones (git o mercurial) o un sistema centralizado sistema de control de versiones (svn).

3voto

Josh Lee Puntos 53741

Una cosa más acerca de git que no se ha mencionado todavía, además de la utilización de la heurística para determinar si un cambio de nombre que ha sucedido:

Si un archivo o un directorio completo de árbol es cambiar el nombre, copiar o mover, y nada debajo se modifica en forma alguna, el archivo o el árbol se almacena como el mismo objeto en el interior del repositorio, y no ocupa ningún espacio extra.

Si se modifica, a continuación, se almacena como un objeto nuevo, como de costumbre.

No estoy seguro acerca de hg y svn, pero sospecho que su changelist de arquitecturas orientadas a decir que se comportan de manera diferente en este escenario. Realmente no tiene ningún efecto sobre el uso, excepto podría darle la razón a evitar mover o copiar enormes árboles dentro de su repositorio.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X