Saltar al contenido

¿Por qué “git fetch origin branch: branch” solo funciona en una rama no actual?

Recabamos en el mundo on line para así regalarte la respuesta a tu dilema, si continúas con inquietudes puedes dejar la inquietud y te responderemos porque estamos para servirte.

Solución:

El mensaje de error proviene de builtin/fetch.c#check_not_current_branch().
Esa función se remonta a la confirmación 8ee5d73, octubre de 2008, git 1.6.0.4

El comentario es instructivo:

Algunos tutoriales confusos sugirieron que sería una buena idea buscar en la rama actual con algo como esto:

git fetch origin master:master

(o peor aún: la misma línea de comando con “pull” en lugar de “fetch”).
Si bien puede tener sentido almacenar lo que desea extraer, generalmente es incorrecto cuando la rama actual es “master“.
Esto solo debe permitirse cuando (una incorrecta) “git pull origin master:master“intenta solucionarlo dando --update-head-ok a subyacente “git fetch“, y de lo contrario deberíamos rechazarlo, pero en algún momento perdimos ese comportamiento.

El cheque de la rama actual es ahora solamente realizado en repositorios no desnudos, que es una mejora del comportamiento original.

Considerando que la función check_not_current_branch() se llama con:

if (!update_head_ok)
        check_not_current_branch(ref_map);

Eso significa un git fetch -u origin develop:develop Deberia trabajar.

-u
--update-head-ok

Por defecto, git fetch se niega a actualizar el encabezado que corresponde a la rama actual. Esta bandera deshabilita el cheque.
Esto es puramente para uso interno para git pull para comunicarse con git fetchy, a menos que esté implementando su propia porcelana, se supone que no debe usarla.

Aunque se supone que no debe usar esa opción, responde a su requisito inicial, lo que hace que “git fetch origin branch:branch“Trabajar en un Actual rama.


Con respecto al origen de este parche, siga la discusión allí.

Si bien puede tener sentido almacenar lo que desea extraer

Eso es el fetch parte: almacena el historial remoto de la actualización origin/master.
Pero eso se rompe especialmente cuando la sucursal local actual también está master.
Como se menciona en esta respuesta:

Creo “git fetch url side:master” cuando master es la rama actual y hemos omitido --update-head-ok está roto.
La prueba falla en la corriente master.

Tampoco podría actualizar el directorio de trabajo y dejaría el índice como si estuviera eliminando todo.


Ver “git pull con refspec “como ejemplo.
torek muestra un ejemplo donde:

supongamos que ejecuto git fetch y trae dos nuevas confirmaciones que etiquetaré C y D.
Cel padre es A, y Des el nodo justo antes B:

                C
               /
   ...--o--o--A   <-- master
               
                o--B   <-- develop
                 
                  D

La salida de este git fetch enumerará esto como:

  aaaaaaa..ccccccc  master     -> origin/master
+ bbbbbbb...ddddddd develop    -> origin/develop  (forced update)

Esa actualización forzada podría ser lo que desea si su rama actual es nodevelop.
Pero si tu eres sobredevelop cuando escribes git fetch origin develop:develop, y si se permitió la recuperación para actualizar HEAD, ... entonces su índice actual reflejaría Dy ya no B.
Entonces un git diff hecho en su árbol de trabajo mostraría diferencias entre sus archivos y D, no tu anterior HEAD B.

Eso es malo, porque tu inicial git checkout develop creó un árbol de trabajo idéntico a B Archivos HEAD.
Incluso si tu git status estaba limpio (sin modificación de ningún tipo), si git fetch origin develop:develop HEAD actualizado (forzando una actualización de B a D), git status ahora informaría diferencias donde no las había antes de la búsqueda.

Por eso, por defecto git fetch se niega a actualizar el encabezado que corresponde a la rama actual.


Nota: un error en Git 2.29 también desencadena un mensaje de error similar.

Cuando "git commit-graph"(hombre) detecta la misma confirmación grabada más de una vez mientras fusiona las capas, solía morir.
El código ahora ignora todos menos uno y continúa, corregido en Git 2.30 (Q1 2021).

Consulte la confirmación 85102ac, la confirmación 150f115 (09 de octubre de 2020) por Derrick Stolee (derrickstolee).
(Fusionada por Junio ​​C Hamano - gitster - en el compromiso 307a53d, 02 de noviembre de 2020)

commit-graph: ignora los duplicados al fusionar capas

Informado por: Thomas Braun
Ayudado por: Taylor Blau
Coautoría de: Jeff King
Firmado por: Derrick Stolee

Thomas informó que un "git fetch"(hombre) El comando fallaba con un error que decía "ID de confirmación duplicada inesperada".

$ git fetch origin + refs / head / abcd: refs / remotes / origin / abcd fatal: id de confirmación duplicada inesperada 31a13139875bc5f49ddcbd42b4b4d3dc18c16576

La causa fundamental es que tenían fetch.writeCommitGraph habilitado que genera commit-graph cadenas, y esta instancia estaba fusionando dos capas que contenían el mismo ID de confirmación.

La suposición inicial es que Git no escribiría un ID de confirmación en un commit-graph capa si ya existe en una commit-graph capa.
De alguna manera, este caso específico se metió en esa situación, lo que llevó a este error.

Si bien es inesperado, esto en realidad no es inválido (siempre que las dos capas estén de acuerdo con los metadatos para la confirmación). Cuando analizamos una confirmación que no tiene un graph_pos en el commit_graph_data_slab, utilizamos la búsqueda binaria en el commit-graph capas para encontrar el compromiso y establecer graph_pos.
Esa posición nunca se vuelve a utilizar en este caso. Sin embargo, cuando analizamos una confirmación del commit-graph archivo, cargamos sus padres desde el commit-graph y asignar graph_pos en ese punto.
Si esos padres ya se analizaron a partir del commit-graph, entonces no es necesario hacer nada. De lo contrario, este graph_pos es un puesto válido en el commit-graph para que podamos analizar los padres, cuando sea necesario.

Por lo tanto, este die() es demasiado agresivo. Lo más fácil de hacer sería ignorar los duplicados.

Si solo ignoramos los duplicados, entonces produciremos un gráfico de confirmación que tiene identificaciones de confirmación idénticas enumeradas en posiciones adyacentes. Este exceso de datos nunca se eliminará de la commit-graph, que podría convertirse en cascada en tamaños de archivo significativamente inflados.

Afortunadamente, podemos contraer la lista para borrar los punteros de confirmación duplicados. Esto nos permite obtener el resultado final que deseamos sin costos de memoria adicionales y un tiempo de CPU mínimo.

La causa principal se debe a la desactivación core.commitGraph, que evita analizar las confirmaciones de las capas inferiores durante un 'git commit-graph write --split(hombre)'comando.
Dado que usamos el 'graph_pos'para determinar si una confirmación está en una capa inferior, nunca descubrimos que esas confirmaciones ya están en el commit-graph cadena y agréguelos a la capa superior. Esta capa luego se fusiona, creando duplicados.

La prueba agregada t5324-split-commit-graph.sh falla sin este cambio. Sin embargo, todavía no hemos eliminado por completo la necesidad de este control duplicado. Eso vendrá en un cambio de seguimiento.

Y:

commit-graph: no escriba commit-graph cuando esté deshabilitado

Informado por: Thomas Braun
Ayudado por: Jeff King
Ayudado por: Taylor Blau
Firmado por: Derrick Stolee

los core.commitGraph La configuración de configuración se puede establecer en 'false'para evitar el análisis de las confirmaciones del commit-graph archivo (s). Esto causa un problema al intentar escribir con "--split"que necesita distinguir entre confirmaciones que están en el existente commit-graph capas y confirmaciones que no lo son.
El mecanismo existente utiliza parse_commit() y sigue comprobando si hay un 'graph_pos'que muestra que la confirmación se analizó desde el commit-graph expediente.

Cuando core.commitGraph=false, no analizamos las confirmaciones del commit-graph y 'graph_pos'indica que no hay confirmaciones en el archivo existente.
los --split la lógica avanza creando una nueva capa en la parte superior que contiene todas las confirmaciones alcanzables, luego posiblemente se fusiona en esas capas, lo que resulta en confirmaciones duplicadas. El cambio anterior hace que el proceso de fusión sea más robusto a tal situación en caso de que ocurra en el escrito. commit-graph datos.

La respuesta fácil aquí es evitar escribir un commit-graph si la lectura del gráfico de confirmación está deshabilitada. Dado que el resultado commit-graph will no será leído por los procesos posteriores de Git. Esto es más natural que forzar core.commitGraph ser true Para el 'write' proceso.

git commit-graph ahora incluye en su página de manual:

Escribe un commit-graph archivo basado en las confirmaciones encontradas en packfiles. Si la opción de configuración core.commitGraph está deshabilitado, entonces este comando generará una advertencia, luego devolverá el éxito sin escribir un commit-graph expediente.

Te invitamos a asistir nuestra labor poniendo un comentario o dejando una puntuación te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *