Git-mezcla En público desnudo repos

0

Pregunta

Sitios como GitHub y GitLab proporcionar formas de combinar las ramas directamente en su interfaz web. Dado que los sitios de la tienda sólo desnuda repos, ¿cómo se realizan los fusiona? Puede lo mismo ser hecho en la línea de comandos en un simple clon? He encontrado esto como una respuesta posible el uso de plomería de comandos.

git github gitlab merge
2021-11-23 22:52:54
1

Mejor respuesta

3

Porque GitHub es de código cerrado, que no podemos decir con certeza cómo su backend maneja las operaciones de combinación. Sin embargo, GitLab es de código Abierto y podemos dar un vistazo a los detalles de la implementación, que han cambiado a lo largo del tiempo.

Cómo GitLab ¿

Hoy en día, la mayoría de git relacionados con las características que se muestran en la interfaz de usuario, incluyendo git se funde en GitLab son manejados por el gitaly componente de GitLab, que interactúa con el almacenamiento físico de repositorios git. Se utiliza principalmente su biblioteca dependiente, git2go, para la realización de la real git operaciones.

Mirando más de cerca en el código fuente de gitaly, la mejor evaluación que puedo hacer es que gitaly en realidad no hacen un amplio uso de los árboles de git operaciones, incluyendo para las combinaciones. Repositorios de trabajo y los árboles son generalmente abierto y clonado a "cuarentena" directorios, que son sólo directorios temporales hecho sobre la marcha y el repositorio del árbol de trabajo es clonado en el directorio temp. (ver la cuarentena.go#L40-58, llamado de combinar.go#L53).

¿cómo se realizan los fusiona?

Así que, para responder a su pregunta: al menos con GitLab, trabajando árboles son utilizados para fusiones (entre otras operaciones) y no se llevan a cabo en suelos de repositorios. Usted simplemente no ve debido a que los directorios temporales se utilizan antes de que ellos están comprometidos con el repositorio actual ruta.

Tal vez podemos asumir que GitHub hace algo similar, pero es imposible saber con certeza.

¿Se puede hacer?

Puede lo mismo ser hecho en la línea de comandos en un simple clon?

Se apuntaba a un ejemplo que parece trabajar sin retirar un árbol de trabajo? Pero funciona al escribir el árbol (el uso de git write-tree), que a nivel práctico no parece tener ninguna ventaja sobre la clonación a partir de la desnuda repo y revisando el árbol de trabajo y el uso de git operaciones normalmente. Para el rendimiento (anticipando las posibles objeciones), podría usar tempfs o algún otro de la memoria-ubicación asignada.

También estoy seguro que enlaza respuesta sería suficiente para llevar a cabo diversas combinación de las estrategias utilizadas por git merge.

Así, en un tecnicismo, tal vez? La respuesta que enlaza parece responder a esa pregunta así. En un nivel práctico que sería útil, no, no lo parecía.

2021-11-24 00:59:11

Gracias para el seguimiento de los fragmentos de código. Ellos se ven como evidencia de una "usar y tirar", no-desnudo clon. Curiosamente, estas líneas parece que puede estar tratando de compartir los objetos de la desnuda repo en el clon, tal vez para el rendimiento. Me recuerda a git clone --shared.
Jim

@Jim hmmm. Yo no estoy 100% seguro. Basado en mi lectura, parece relativePath en este caso es el directorio temporal, el cual es creado relativa a la repo en el disco. Parece que es clonar el repo, a continuación, reemplazar la ruta del objeto (quarantinedRepo.GitObjectDirectory = relativePath) en el quarantineRepo objeto de señalar a la tempdir (a diferencia de lo que supongo es el valor predeterminado actual de la repo de la ubicación de los objetos devueltos desde el método clone).
sytech

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................