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 paragit pull
para comunicarse congit fetch
y, 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
” cuandomaster
es la rama actual y hemos omitido--update-head-ok
está roto.
La prueba falla en la corrientemaster
.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
yD
.C
el padre esA
, yD
es el nodo justo antesB
: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 D
y 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 capasInformado 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 generacommit-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 unacommit-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 elcommit_graph_data_slab,
utilizamos la búsqueda binaria en elcommit-graph
capas para encontrar el compromiso y establecergraph_pos
.
Esa posición nunca se vuelve a utilizar en este caso. Sin embargo, cuando analizamos una confirmación delcommit-graph
archivo, cargamos sus padres desde elcommit-graph
y asignargraph_pos
en ese punto.
Si esos padres ya se analizaron a partir delcommit-graph
, entonces no es necesario hacer nada. De lo contrario, estegraph_pos
es un puesto válido en elcommit-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 elcommit-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é deshabilitadoInformado 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 delcommit-graph
archivo (s). Esto causa un problema al intentar escribir con "--split
"que necesita distinguir entre confirmaciones que están en el existentecommit-graph
capas y confirmaciones que no lo son.
El mecanismo existente utilizaparse_commit()
y sigue comprobando si hay un 'graph_pos
'que muestra que la confirmación se analizó desde elcommit-graph
expediente.Cuando
core.commitGraph=false
, no analizamos las confirmaciones delcommit-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 resultadocommit-graph
will no será leído por los procesos posteriores de Git. Esto es más natural que forzarcore.commitGraph
sertrue
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óncore.commitGraph
está deshabilitado, entonces este comando generará una advertencia, luego devolverá el éxito sin escribir uncommit-graph
expediente.
Te invitamos a asistir nuestra labor poniendo un comentario o dejando una puntuación te damos la bienvenida.