Tengo un proyecto con un submódulo que apunta a una confirmación no válida: la confirmación del submódulo permaneció local y cuando trato de recuperarlo de otro repositorio obtengo:
$ git submodule update
fatal: reference is not a tree: 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
Unable to checkout '2d7cfbd09fc96c04c4c41148d44ed7778add6b43' in submodule path 'mysubmodule'
Yo sé lo que el submódulo CABEZA debe ser, ¿hay alguna manera de cambiar esta forma local, sin empujar desde el repositorio que hace han comprometerse 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
?
No estoy seguro si estoy siendo claro ... aquí hay una situación similar que encontré.
git
git-submodules
Mauricio Scheffer
fuente
fuente
Respuestas:
Suponiendo que el repositorio del submódulo contiene un compromiso que desea usar (a diferencia del compromiso al que se hace referencia desde el estado actual del superproyecto), hay dos formas de hacerlo.
El primero requiere que ya conozca la confirmación del submódulo que desea usar. Funciona desde adentro hacia afuera ajustando directamente el submódulo y luego actualizando el superproyecto. El segundo funciona desde el "afuera, adentro" al encontrar la confirmación del superproyecto que modificó el submódulo y luego restablecer el índice del superproyecto para referirse a una confirmación de submódulo diferente.
De adentro hacia afuera
Si ya sabe qué confirmación desea que use el submódulo,
cd
en el submódulo, verifique la confirmación que desea,git add
y luegogit commit
vuelva al superproyecto.Ejemplo:
Vaya, alguien realizó una confirmación de superproyecto que se refiere a una confirmación no publicada en el submódulo
sub
. De alguna manera, ya sabemos que queremos que el submódulo esté en commit5d5a3ee314476701a20f2c6ec4a53f88d651df6c
. Ve allí y échale un vistazo directamente.Pagar en el submódulo
Como estamos revisando un commit, esto produce un HEAD separado en el submódulo. Si desea asegurarse de que el submódulo esté usando una rama, use
git checkout -b newbranch <commit>
para crear y pagar una rama en la confirmación o retirar la rama que desea (por ejemplo, una con la confirmación deseada en la punta).Actualizar el superproyecto
Un pago en el submódulo se refleja en el superproyecto como un cambio en el árbol de trabajo. Por lo tanto, debemos organizar el cambio en el índice del superproyecto y verificar los resultados.
Verifica los resultados
La actualización del submódulo fue silenciosa porque el submódulo ya está en la confirmación especificada. La primera diferencia muestra que el índice y el árbol de trabajo son iguales. El tercer diferencial muestra que el único cambio por etapas es mover el
sub
submódulo a una confirmación diferente.Cometer
Esto confirma la entrada de submódulo arreglado.
De fuera hacia dentro
Si no está seguro de qué confirmación debe usar desde el submódulo, puede ver el historial en el superproyecto para guiarlo. También puede administrar el reinicio directamente desde el superproyecto.
Esta es la misma situación que la anterior. Pero esta vez nos centraremos en solucionarlo desde el superproyecto en lugar de sumergirnos en el submódulo.
Encuentra el compromiso errante del superproyecto
OK, parece que salió mal
ce5d37c
, así que restauraremos el submódulo desde su padre (ce5d37c~
).Alternativamente, puede tomar la confirmación del submódulo del texto del parche (
5d5a3ee314476701a20f2c6ec4a53f88d651df6c
) y utilizar el proceso anterior "adentro, afuera" en su lugar.Pagar en el Superproyecto
Esto restableció la entrada del submódulo para
sub
lo que estaba en commitce5d37c~
en el superproyecto.Actualice el submódulo
La actualización del submódulo salió bien (indica un HEAD separado).
Verifica los resultados
La primera diferencia muestra que
sub
ahora es lo mismo ence5d37c~
. El segundo diferencial muestra que el índice y el árbol de trabajo son iguales. El tercer diferencial muestra que el único cambio por etapas es mover elsub
submódulo a una confirmación diferente.Cometer
Esto confirma la entrada de submódulo arreglado.
fuente
e47c0a
una confirmación que no existe en el repositorio localsub
, pero lossub
puntos del superproyecto apuntan a esa confirmación. Esto podría haber sucedido porque alguien más creóe47c0a
en su copia desub
, actualizó su superproyecto para apuntar a esa confirmación y empujó el superproyecto sin empujare47c0a
al repositorio central / compartido parasub
. Cuando nos retiramos de la compartida super-proyecto / centro obtenemos una confirmación de que los puntossub
ae47c0a
, pero no podemos “ver” que cometió.ce5d37c
es sospechoso porque, en base a la diferencia, se introdujoe47c0a
.sub
repositorio principal que lo tiene como submódulo, y si se puede manipular directamente o no directamente al HEAD actualsub
, sin depender de un estado anterior del padre repo, que no siempre puede ayudar.prueba esto:
fuente
git submodule sync
es necesario en escenarios donde la URL del control remoto para un submódulo dado ha cambiado. En nuestro caso, agregamos nuestro submódulo desde un repositorio público y luego cambiamos la URL a una bifurcación privada, y nos metimos en este encurtido particular.Este error puede significar que falta una confirmación en el submódulo. Es decir, el repositorio (A) tiene un submódulo (B). A quiere cargar B para que apunte a un determinado commit (en B). Si esa confirmación falta de alguna manera, obtendrá ese error. Una vez posible causa: la referencia al commit fue empujada en A, pero el commit real no fue empujado desde B. Entonces comenzaría allí.
Es menos probable que haya un problema de permisos, y el commit no se puede extraer (posible si está utilizando git + ssh).
Asegúrese de que las rutas de submódulo se vean bien en .git / config y .gitmodules.
Una última cosa para probar: dentro del directorio de submódulos: git reset HEAD --hard
fuente
Causa posible
Esto puede suceder cuando:
Por ejemplo, algo así sucedió:
Debería haber submódulo empujado en este punto.
Como resultado, el usuario remoto no pudo encontrar las confirmaciones faltantes porque todavía están en el disco local.
Solución
Informa a la persona que modificó el submódulo para empujar, es decir
fuente
Recibí este error cuando lo hice:
pero el commit en el proyecto padre apuntaba a un commit anterior.
Eliminar la carpeta del submódulo y ejecutar:
NO resolvió el problema. Eliminé el repositorio e intenté nuevamente sin la bandera de profundidad y funcionó.
Este error ocurre en Ubuntu 16.04 git 2.7.4, pero no en Ubuntu 18.04 git 2.17, TODO encuentra la versión o confirmación de reparación exacta.
fuente
username/repo#sha
a package.json, una opción mucho más flexible es organizar su sistema con un conjunto de contenedores acoplables--depth=1
ahorra mucho ancho de banda cuando no necesito el historial de repositorios. Si alguien encuentra o sabe por qué sucede esto, me encantaría saberlo.deinit
enfoque que soluciona el problema la mayoría de las veces. Cuando se incluye con un sistema de compilación, el usuario final puede dejar que el sistema de compilación recupere los submódulos y abandone elrecursive
comando roto por completo. Todavía hay escenarios en los que esto se rompe, como que el submódulo ha hecho un esfuerzo forzado y ha borrado la confirmación por completo.Esto también puede suceder cuando tiene un submódulo que apunta a un repositorio que se modificó y la confirmación dada "desapareció". Si bien la confirmación aún puede estar en el repositorio remoto, no está en una rama. Si no puede crear una nueva rama (por ejemplo, no su repositorio), tiene que actualizar el superproyecto para señalar una nueva confirmación. Alternativamente, puede insertar una de sus copias de los submódulos en otro lugar y luego actualizar el superproyecto para que apunte a ese repositorio.
fuente
Es posible que su sucursal no esté actualizada, una solución simple, pero intente
git fetch
fuente
Esta respuesta es para usuarios de SourceTree con experiencia limitada en git de terminal.
Abra el submódulo problemático desde el proyecto Git (superproyecto).
Obtenga y asegúrese de que 'Obtener todas las etiquetas' esté marcado.
Rebase saca tu proyecto Git.
Esto resolverá el problema de 'referencia no es un árbol' 9 de cada diez veces. Esa 1 vez no lo hará, es una solución terminal como se describe en la respuesta superior.
fuente
Su historial de submódulos se conserva de forma segura en el submódulo git de todos modos.
Entonces, ¿por qué no simplemente eliminar el submódulo y agregarlo nuevamente?
De lo contrario, ¿intentó editar manualmente el
HEAD
orefs/master/head
el submódulo?.git
fuente
Solo para estar seguro, intente actualizar sus
git
archivos binarios.GitHub para Windows tiene la versión
git version 1.8.4.msysgit.0
que en mi caso fue el problema. La actualización lo resolvió.fuente
En mi caso, ninguna de las respuestas anteriores resuelve el problema aunque sean buenas respuestas. Entonces publico mi solución (en mi caso hay dos clientes git, el cliente A y B):
ir al directorio del submódulo:
pago al maestro:
volver a crear un código de confirmación que ambos clientes puedan ver
volver al directorio de los padres:
comprometerse a dominar
cambie al otro cliente,
rebase
vuelva a hacerlo .finalmente funciona bien ahora! Tal vez pierda un par de commits pero funciona.
Para su información, no intente eliminar su submódulo, permanecerá
.git/modules
allí y no podrá volver a leer este submódulo, a menos que sea uno reactivo local.fuente
Para sincronizar el repositorio de git con la cabeza del submódulo, en caso de que sea realmente lo que desea, descubrí que quitar el submódulo y luego volver a leerlo evita los ajustes en el historial. Desafortunadamente, eliminar un submódulo requiere piratería en lugar de ser un solo comando git, pero factible.
Pasos que seguí para eliminar el submódulo, inspirados en https://gist.github.com/kyleturner/1563153 :
Nuevamente, esto puede ser útil si todo lo que quiere es apuntar a la cabeza del submódulo nuevamente, y no ha complicado las cosas al necesitar mantener intacta la copia local del submódulo. Se supone que tiene el submódulo "correcto" como su propio repositorio, donde sea que se encuentre, y solo desea volver a incluirlo correctamente como submódulo.
Nota: siempre haga una copia completa de su proyecto antes de participar en este tipo de manipulación o cualquier comando git más allá de la simple confirmación o inserción. También lo recomendaría con todas las otras respuestas, y como una guía general de git.
fuente
Simplemente me topé con este problema, y ninguna de estas soluciones funcionó para mí. Lo que resultó ser la solución para mi problema es en realidad mucho más simple: actualizar Git. El mío era 1.7.1, y después de que lo actualicé a 2.16.1 (último), ¡el problema desapareció sin dejar rastro! Supongo que lo dejo aquí, espero que ayude a alguien.
fuente