Pregunta

Tengo un proyecto con un submódulo que se señala a un válido cometer:el submódulo de cometer mantuvo local y cuando trato de buscarla de otra repo puedo conseguir:

$ git submodule update
fatal: reference is not a tree: 2d7cfbd09fc96c04c4c41148d44ed7778add6b43
Unable to checkout '2d7cfbd09fc96c04c4c41148d44ed7778add6b43' in submodule path 'mysubmodule'

Yo sé cuál es el submódulo de la CABEZA debe ser, no puedo cambiar de esta forma local, sin empujando desde la repo que ¿ han cometer 2d7cfbd09fc96c04c4c41148d44ed7778add6b43 ?

No estoy seguro de si estoy siendo claro... he aquí una situación similar He encontrado.

¿Fue útil?

Solución

Si se asume el repositorio del submódulo contiene una compromete desea utilizar (al contrario que el commit que se hace referencia desde el estado actual de la super-proyecto), hay dos maneras de hacerlo.

La primera requiere que usted ya conoce la confirmación desde el submódulo que desea utilizar. Funciona desde “adentro, hacia fuera” ajustando directamente el submódulo continuación, la actualización de los super-proyecto. El segundo trabaja desde el “exterior, en” mediante la búsqueda de la década de los super-proyecto se comprometen que modificó el submódulo y luego resetear el índice de super-proyecto para referirse a un submódulo diferente cometió.

dentro, hacia fuera

Si ya sabe que practican desea que el submódulo de uso, cd al submódulo, echa un vistazo a la confirmación tiene que desea, luego git add y git commit de nuevo en el super-proyecto.

Ejemplo:

$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'

Vaya, alguien hizo un super-proyecto que cometen se refiere a un inéditos cometen en el sub submódulo. De alguna manera, ya sabemos que queremos que el submódulo de estar en comprometerse 5d5a3ee314476701a20f2c6ec4a53f88d651df6c. Ir allí y comprobar que funciona directamente.

Pedido en el submódulo

$ cd sub
$ git checkout 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Note: moving to '5d5a3ee314476701a20f2c6ec4a53f88d651df6c' which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at 5d5a3ee... quux
$ cd ..

Dado que estamos comprobando a cabo una confirmación, esto produce una cabeza separada en el submódulo. Si desea asegurarse de que el submódulo está utilizando una rama, a continuación, utilizar git checkout -b newbranch <commit> para crear, y obtenga una rama en el compromiso o la comprobación de la rama que desee (por ejemplo, uno con el que desee comprometerse en la punta).

Actualización de la Super-proyecto

A la caja en el submódulo se refleja en la super-proyecto como un cambio al árbol de trabajo. Por lo que necesitamos para organizar el cambio en el índice de la super-proyecto y verificar los resultados.

$ git add sub

Comprobar los resultados

$ git submodule update
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c

La actualización submódulo estaba en silencio porque el submódulo ya está en la confirmación especificada. La primera muestra diff que el índice y worktree son los mismos. Los terceros diff muestra que el único por etapas cambio se está moviendo el submódulo sub a una diferente de comprometerse.

Commit

git commit

Esto compromete a la entrada submódulo fija en marcha.


En el exterior, en

Si no está seguro de qué comprometerse usted debe utilizar desde el submódulo, se puede ver en la historia en el SuperProject para guiarlo. También puede administrar el restablecimiento directamente de la super-proyecto.

$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'

Esta es la misma situación que anteriormente. Pero esta vez se centrará en la fijación de la super-proyecto en lugar de la inmersión en el submódulo.

Para errante de la Super-Commit proyecto

$ git log --oneline -p -- sub
ce5d37c local change in sub
diff --git a/sub b/sub
index 5d5a3ee..e47c0a1 160000
--- a/sub
+++ b/sub
@@ -1 +1 @@
-Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
+Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
bca4663 added sub
diff --git a/sub b/sub
new file mode 160000
index 0000000..5d5a3ee
--- /dev/null
+++ b/sub
@@ -0,0 +1 @@
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c

OK, parece que salió mal en ce5d37c, por lo que vamos a restaurar el submódulo de su matriz (ce5d37c~).

Como alternativa, se puede tomar el submódulo de confirmación desde el texto parche (5d5a3ee314476701a20f2c6ec4a53f88d651df6c) y el uso de las anteriores “dentro, hacia fuera” proceso de cambio.

Pedido en el proyecto Super

$ git checkout ce5d37c~ -- sub

Esto restablece la entrada submódulo de sub a lo que era al cometer ce5d37c~ en el super-proyecto.

Actualizar el submódulo

$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'

La actualización submódulo ha ido bien (que indica una cabeza separada).

Comprobar los resultados

$ git diff ce5d37c~ -- sub
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c

Los primeros diff muestra que sub es ahora el mismo en ce5d37c~. El segundo muestra diff que el índice y worktree son los mismos. La tercera muestra diff el único por etapas cambio se está moviendo el submódulo sub a un diferente cometer.

Commit

git commit

Esto compromete a la entrada submódulo fija en marcha.

Otros consejos

intente lo siguiente:

git submodule sync
git submodule update

Este error puede significar que una confirmación no se encuentra en el submódulo. Es decir, el repositorio (A) tiene un submódulo (B). A quiere carga B, de manera que apunte a un cierto cometen (en B). Si es de alguna manera que asignan un faltante, obtendrá ese error. Una vez causa posible:. La referencia a la confirmación fue empujado en A, pero el real se comprometen a no fue empujado de B. Así que me gustaría empezar por ahí

Es menos probable, hay un problema de permisos, y la cometen no se puede tirar (posible si está usando git + ssh).

Asegúrese de que los caminos submódulo se ven bien en .git / config y .gitmodules.

Una última cosa a intentar - dentro del directorio submódulo: git reset HEAD --hard

Posible causa

Esto puede sucede cuando:

  1. Submódulo(s) han sido editados en lugar
  2. Submódulo(s) comprometida, que actualiza el hash de la submódulo señalado
  3. Submódulo(s) no se pulsa.

por ejemplo,algo de esto sucedió:

$ cd submodule
$ emacs my_source_file  # edit some file(s)
$ git commit -am "Making some changes but will forget to push!"

Debe tener submódulo empujado en este punto.

$ cd .. # back to parent repository
$ git commit -am "updates to parent repository"
$ git push origin master

Como resultado, la falta la comete no podría ser encontrado por el usuario remoto debido a que aún están en el disco local.

Solución

Informa a la persona que modificó el submódulo de empuje, es decir,

$ cd submodule
$ git push

Tengo este error cuando lo hice:

$ git submodule update --init --depth 1

pero el commit en el proyecto principal estaba señalando una anterior comprometerse.

Eliminación de la carpeta submódulo y en funcionamiento:

$ git submodule update --init

no ha solucionado el problema. He eliminado el repositorio y lo intentó de nuevo sin el indicador de profundidad y funcionó.

Este error ocurre en Ubuntu 16.04 Git 2.7.4, pero no en Ubuntu 18.04 2.17 git, TODO encontrar fijación exacta de confirmación o versión.

Esto también puede ocurrir cuando se tiene un submódulo que apunta a un repositorio que se restablecen y el commit dado es "ido". Mientras que el commit todavía puede estar en el repositorio remoto, no está en una rama. Si no se puede crear una nueva rama (por ejemplo, no su repositorio), que está pegado con tener que actualizar el proyecto súper a punto para una nueva confirmación. Como alternativa se puede empujar una de sus copias de los submódulos en otro lugar y luego actualizar el super-proyecto a punto a este registro en su lugar.

Esta respuesta es para los usuarios de SourceTree con experiencia git terminales limitado.

Abrir el submódulo problemática desde dentro del proyecto Git (super-proyecto).

Obtener y asegurar 'Obtener todas las etiquetas' está marcada.

Rebase tirar de su proyecto Git.

Esto va a resolver la 'referencia no es un árbol' problema 9 de cada diez veces. Eso 1 vez no lo hará, es una solución de terminal como se describe por la respuesta superior.

Su historial submódulo se conserva de forma segura en el GIT submódulo de todos modos.

Así que, ¿por qué no eliminar el sub-módulo y poner de nuevo?

De lo contrario, ¿trató de la edición manual del HEAD o la refs/master/head dentro del submódulo .git

Sólo para estar seguro, intenta actualizar los binarios git.

GitHub para Windows tiene la versión git version 1.8.4.msysgit.0 que en mi caso era el problema. Actualizando resolvió.

En mi caso, ninguno de respuesta anterior resuelve el problema aún thoungh son buenas respuestas. Así que he puesto mi solución (en mi caso hay dos clientes GIT, el cliente A y B):

  1. ir a dir del submódulo:

    cd sub
    
  2. Pedido de dominar:

    git checkout master
    
  3. rebase a un código que cometen tanto cliente puede ver

  4. volver a dir de los padres:

  5. comprometerse a maestro

  6. cambiar a otro cliente, hacer rebase de nuevo.

  7. Por último funciona bien ahora! Tal vez perder un par de confirmaciones, pero funciona.

  8. Para su información, no trate de quitar su submódulo, permanecerá .git/modules allí y no puede readd este submódulo de nuevo, a menos que uno local de reactivos.

Para sincronizar el repositorio git con la cabeza del submódulo, en caso de que es realmente lo que quieres, he encontrado que la eliminación de la sub-módulo y luego readding Evita el retoques con la historia. Desafortunadamente eliminar un submódulo requiere la piratería en lugar de ser un solo comando git, pero factible.

Pasos I seguido para eliminar el submódulo, inspirado por https://gist.github.com/kyleturner/ 1563153 :

  1. Ejecutar git rm --cached
  2. Eliminar las líneas relevantes desde el archivo .gitmodules.
  3. Eliminar la sección correspondiente de .git / config.
  4. Borrar los archivos submódulo ahora sin seguimiento.
  5. directorio Quitar .git / modules /

Una vez más, esto puede ser útil si lo que quieres es señalar de nuevo a la cabeza del submódulo, y no se ha complicado las cosas por la necesidad de mantener la copia local del submódulo intacta. Se asume que tiene el submódulo "derecho" como su propio repo, siempre que sea el origen de la que es, y lo que desea es volver a incluir adecuadamente como un submódulo.

Nota: siempre hacer una copia completa de su proyecto antes de participar en este tipo de manipulación o cualquier comando git allá de la simple confirmación o empuje. Te aconsejo que con todas las otras respuestas, así, y como una guía general Git.

Tropecé con este problema, y ninguna de estas soluciones funciona para mí.Lo que resultó ser la solución para mi problema en realidad es mucho más simple:actualización de Git.El mío era 1.7.1, y después he actualizado a la 2.16.1 (el más reciente), el problema desapareció sin dejar rastro!Supongo que me voy de aquí, espero que ayude a alguien.

Su sarmiento no puede ser hasta la fecha, una solución simple pero trate git fetch

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top