tag remove practices crear best git version-control

remove - git tags best practices



¿Para qué son los.git/info/injertos? (3)

Estoy tratando de descubrir qué son los "injertos" en el Git.

Por ejemplo, en uno de los últimos comentarios here , Tobu supone usar git-filter-branch y .git / info / injertos para unir dos repositorios.

Pero no entiendo por qué necesito estos injertos ? Parece que todo funciona sin los dos últimos comandos.


Cuando se trabaja con git-svn:

Los injertos git son muy útiles para importar un árbol Git en un repositorio de Subversion.

Por ejemplo, creé un repositorio local de Git como inicio. Después de trabajar varios días, creando muchos commits, tuve que publicarlo en el repositorio central de Subversion y no quería perder el historial.

Encontré el siguiente artículo http://eikke.com/importing-a-git-tree-into-a-subversion-repository/ : http://eikke.com/importing-a-git-tree-into-a-subversion-repository/


De Git Wiki :

Los puntos de injerto o injertos permiten unir dos líneas de desarrollo diferentes. Funciona al permitir que los usuarios registren información de ancestros falsos para confirmaciones. De esta forma, puede hacer que git simule que el conjunto de padres que tiene un compromiso es diferente de lo que se registró cuando se creó el compromiso.

Razones para usar injertos

Los injertos pueden ser útiles al mover el desarrollo a git, ya que le permite hacer clonación del historial anterior importado de otro SCM opcional. Esto mantiene el clon inicial para los usuarios que solo desean seguir la última versión, mientras que los desarrolladores pueden tener el historial completo de desarrollo disponible.

Cuando Linus comenzó a usar git para mantener su kernel no existían herramientas para convertir el antiguo historial del kernel. Más tarde, cuando se importó el antiguo historial del kernel a git desde la puerta de enlace de bkcvs, se crearon los injertos como un método para hacer posible vincular los dos repositorios diferentes.


El enfoque de injertos mentioned por Chris Johnsen para unir dos repositorios ya no es completamente válido (solo con injertos).
Con Git 2.18 (Q2 2018), la funcionalidad de " $GIT_DIR/info/grafts " ha sido reemplazada por el mecanismo " refs/replace/ " (desde hace algún tiempo).
El código interno tenía soporte en muchos lugares, que se ha limpiado para dejar de admitir el mecanismo de "injertos" .

Consulte commit a3694d9 , commit f42fa47 , commit 8d0d81a , commit e2d65c1 , commit f9f99b3 , commit 0115e03 , commit fb40429 , commit 041c98e , commit e24e871 (28 de abril de 2018) y commit d398f2e , commit fef461e , commit c5aa6db (25 de abril de 2018) por Johannes Schindelin ( dscho ) .
(Fusionado por Junio ​​C Hamano - gitster - en commit 352cf6c , 23 de mayo de 2018)

Entonces, en lugar de

echo "$commit-id $graft-id" >> .git/info/grafts

Ahora lo haces:

git replace --graft $commit-id $graft-id git filter-branch $graft-id..HEAD

Despreciar el soporte para .git/info/grafts

La función de injertos fue una forma conveniente de "unir" la historia antigua con el nuevo comienzo de linux.git .

Sin embargo, su implementación no está a la altura de los estándares de Git, ya que hay demasiadas formas en que puede llevar a comportamientos sorprendentes y no deseados.

Por ejemplo, cuando se empuja desde un repositorio con injertos activos, es posible omitir compromisos que se han "injertado", lo que da como resultado un estado roto en el otro lado.

Además, la función de injertos se limita a "reescribir" la lista de padres de commits, no puede reemplazar a ninguna otra cosa.

La característica mucho más joven implementada como git replace estableció para remediar esas limitaciones y errores peligrosos.

Viendo que git replace está bastante maduro (ya que 4228e8b (reemplazar: agregar opción de --graft , 2014-07-19, Git 2.1.0) puede realizar las tareas del archivo de injerto), es hora de desaprobar el soporte para el injerto archivo, y para retirarlo eventualmente.

Ahora (nuevamente, Git 2.18, Q2 2018), tienes:

replace : agregar opción de --graft

La cadena de uso para esta opción es:

git replace [-f] --graft <commit> [<parent>...]

Primero creamos una nueva confirmación que es igual a <commit> excepto que sus padres son [<parents>...]

Luego creamos una referencia de reemplazo que reemplaza con la confirmación que acabamos de crear.

Con esta nueva opción, debería ser sencillo convertir injertos para reemplazar refs.