Problema al agregar código común como submódulo git: "ya existe en el índice"

225

Soy nuevo en git y agradecería ayuda para agregar submódulos. He recibido dos proyectos que comparten un código común. El código compartido se copió en los dos proyectos. Creé un repositorio git separado para el código común y lo eliminé de los proyectos con el plan para agregarlo como un submódulo git.

Usé la opción de ruta de git submodule add para especificar la carpeta:

git submodule add url_to_repo projectfolder

pero luego recibí el error:

'projectfolder' already exists in the index"

Esta es la estructura deseada de mi repositorio:

repo
|-- projectfolder
    |-- folder with common code

Es posible agregar el submódulo git directamente en el repositorio o en una nueva carpeta allí, pero no en la carpeta del proyecto. El problema es que realmente necesita estar en la carpeta del proyecto. ¿Qué puedo hacer al respecto y qué he entendido mal sobre la opción de ruta de git submodule add?

Vanja
fuente
¿Qué obtienes si lo haces git ls-files --stage projectfolder?
Mark Longair
Recibo una lista con todo el contenido que comienza con 100644.
Vanja
relacionado: stackoverflow.com/questions/12696919/…
Julio Marins
8
para mí hacer un git rmen la carpeta existente ayudó: |
rogerdpack

Respuestas:

343

Me temo que no hay suficiente información en su pregunta para estar seguro de lo que está sucediendo, ya que no ha respondido a mi pregunta de seguimiento, pero esto puede ser de ayuda en cualquier caso.

Ese error significa que projectfolderya está en escena ("ya existe en el índice"). Para averiguar qué está pasando aquí, intente enumerar todo en el índice en esa carpeta con:

git ls-files --stage projectfolder

La primera columna de esa salida le dirá en qué tipo de objeto está en el índice projectfolder. (Estos se parecen a los modos de archivo Unix, pero tienen significados especiales en git).

Sospecho que verás algo como:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

(es decir, una línea que comienza con 160000), en cuyo caso el repositorio projectfolderya se ha agregado como "gitlink". Si no aparece en la salida de git submodule, y desea volver a agregarlo como un submódulo, puede hacer lo siguiente:

git rm --cached projectfolder

... para sacarlo del escenario y luego:

git submodule add url_to_repo projectfolder

... para agregar el repositorio como un submódulo.

Sin embargo, también es posible que vea muchos blobs enumerados (con modos de archivo 100644y 100755), lo que me sugeriría que no deshizo correctamente los archivos projectfolderantes de copiar el nuevo repositorio en su lugar. Si ese es el caso, puede hacer lo siguiente para desestabilizar todos esos archivos:

git rm -r --cached projectfolder

... y luego agregue el submódulo con:

git submodule add url_to_repo projectfolder
Mark Longair
fuente
13
Gracias a Mark por tu respuesta detallada. Hice una "carpeta de proyecto git rm -r --cached" e intenté volver a conectar el submódulo. Sin embargo, esta vez recibo el mensaje de error "'projectfolder' ya existe y no es un repositorio git válido".
Vanja
3
@Vanja: Eso indica que projectfolderno contenía un .gitdirectorio. Sonó a partir de su pregunta como si hubiera creado el nuevo repositorio para projectfolderotro lugar y lo haya copiado en su lugar, pero claramente ese no fue el caso. Debería mover el existente projectfolderfuera del camino y luego copiar el nuevo repositorio (completo con su .gitdirectorio) en su lugar antes de agregarlo como un submódulo. O, si ya lo ha empujado al repositorio representado por url_to_repo, simplemente puede moverse projectfoldery luego agregar el submódulo desde esa URL.
Mark Longair
respuesta increíble +1 todo el tiempo
abbood
Esto me ayudó mucho. ¡Gracias!
Evan Moran
1
Esto es lo que hice, que es el proceso de 3 pasos PASO 1: git rm -r - src / test / resources en caché, PASO 2: eliminó el directorio de recursos existente a otro lugar, PASO 3: submódulo git add add url_to_repo src / prueba / recursos
vikramvi
52

Eliminar el submódulo manualmente implica varios pasos y esto funcionó para mí.

Suponiendo que está en el directorio raíz del proyecto y el nombre del módulo git de muestra es "c3-pro-ios-framework"

Eliminar los archivos asociados al submódulo

rm -rf .git/modules/c3-pro-ios-framework/

Eliminar cualquier referencia al submódulo en la configuración

vim .git/config

ingrese la descripción de la imagen aquí

Eliminar .gitmodules

rm -rf .gitmodules

Eliminarlo de la caché sin el "git"

git rm --cached c3-pro-ios-framework

Agregar submódulo

git submodule add https://github.com/chb/c3-pro-ios-framework.git
Gajen Sunthara
fuente
2
Gran publicación, funciona muy bien. Genial de su parte compartirlo, señor. Realmente grandioso.
gabn88
1
Traté de enumerar los submódulos git submoduledespués de la eliminación y antes de agregar y me dio un error, confirmar la eliminación se encargó de ello.
mehmet
1
Votaría este 50x si pudiera; me acabas de salvar el dia!
Sensei James
touch .gitmodules(debe estar en el árbol de trabajo, por lo que eliminarlo ayuda. Pero debe volver a agregarlo). Impresionante publicación por cierto. Lo único que funcionó aquí.
Torxed
Era el .gitdirectorio que todavía tenía restos para mí. Esto funcionó muy bien. Gracias.
Kevin Anderson el
44

Debe eliminar su repositorio de submódulos git (carpeta de proyectos en este caso) primero para la ruta git.

rm -rf projectfolder

git rm -r projectfolder

y luego agregue submódulo

git submodule add <git_submodule_repository> projectfolder
Neeraj Kumar
fuente
44
git submodule add --force <git_submodule_repository>funcionó para mí mantener el mismo nombre de submódulo
Tenfrow
1
¡¡Gracias!! No tuve que agregar en la carpeta del proyecto, simplemente cambié al subdirectorio y clones desde allí.
Tony Fraser
32

Tuve el mismo problema y después de horas de búsqueda encontré la respuesta.

El error que recibí fue un poco diferente: <path> already exists and is not a valid git repo(y agregado aquí por valor de SEO)

La solución es NO crear el directorio que albergará el submódulo. El directorio se creará como parte del git submodule addcomando.

Además, se espera que el argumento sea relativo a la raíz del repositorio principal, no a su directorio de trabajo, así que tenga cuidado con eso.

Solución para el ejemplo anterior:

  1. Está bien que tu repositorio de padres ya esté clonado.
  2. Asegúrese de que el common_codedirectorio no exista.
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/( Tenga en cuenta la barra inclinada final requerida ) .
  5. La cordura restaurada.

Espero que esto ayude a alguien, ya que se puede encontrar muy poca información en otros lugares sobre esto.

indefinido
fuente
1
El paso 4 debería comenzar git submodule add, y no se requiere la barra inclinada final.
nulabilidad
Se corrigió el error tipográfico. Lo he vuelto a probar y el corte final ha marcado una diferencia para mí. Estoy usando zsh si eso tiene algún efecto.
indefinido el
Esto resolvió mi problema (crear el directorio con el comando add submodulend), ¡gracias!
jackJoe
18

si existe una carpeta llamada xbajo control git, desea agregar un submódulo del mismo nombre, debe eliminar la carpeta xy confirmarla primero .

Actualizado por @ ujjwal-singh:

No es necesario comprometerse, la puesta en escena es suficiente .. git add/git rm -r

justbilt
fuente
El compromiso fue lo que me perdí. Respuesta corta, pero correcta!
Qqwy
3
No es necesario comprometerse, la puesta en escena es suficiente .. git add/gir rm -r
Ujjwal Singh
3

Solo para aclarar en lenguaje humano lo que el error está tratando de decirte:

No puede crear un repositorio en esta carpeta que ya haya sido rastreado en el repositorio principal.

Por ejemplo: tiene una carpeta de tema llamada AwesomeThemeque es un repositorio dedicado, intenta volcarlo directamente en su repositorio principal como git submodule add sites/themesy obtiene esto "AwesomeTheme" index already exists.

Solo necesita asegurarse de que no haya un sites/themes/AwesomeThemeseguimiento de versión en el repositorio principal para que el submódulo pueda crearse allí.

Entonces, para solucionarlo, en su repositorio principal si tiene un sites/theme/AwesomeThemedirectorio vacío , elimínelo. Si ya ha realizado confirmaciones con el sites/theme/AwesomeThemedirectorio en su repositorio principal, necesita purgar todo el historial con un comando como este:

git filter-branch --index-filter \
              'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme'     HEAD

Ahora puedes correr git submodule add [email protected] sites/themes/AwesomeTheme

Dado que el repositorio principal nunca antes había visto nada (también conocido como index'd) sites/themes/AwesomeTheme, ahora puede crearlo.

Dylan Pierce
fuente
1

Lo hice funcionar al revés. Comenzando con un repositorio vacío, agregando el submódulo en una nueva carpeta llamada "projectfolder / common_code". Después de eso, fue posible agregar el código del proyecto en la carpeta del proyecto. Los detalles se muestran a continuación.

En un repositorio vacío, escriba:

git submodule add url_to_repo projectfolder/common_code

Eso creará la estructura de carpetas deseada:

repo
|-- projectfolder
    |-- common_code

Ahora es posible agregar más submódulos, y el código del proyecto se puede agregar a la carpeta del proyecto.

Todavía no puedo decir por qué funcionó de esta manera y no al otro.

Vanja
fuente
0

No sé si esto es útil, aunque tuve el mismo problema al tratar de confirmar mis archivos desde IntelliJ 15. Al final, abrí SourceTree y allí podría simplemente confirmar el archivo. Problema resuelto. No es necesario emitir ningún comando git elegante. Solo lo menciono en caso de que alguien tenga el mismo problema.

Lawrence
fuente
0

Vaya a la carpeta del repositorio. Eliminar submódulos relevantes de .gitmodules. Seleccione mostrar archivos ocultos. Vaya a la carpeta .git, elimine los submódulos de la carpeta del módulo y config.

Sam Biswas
fuente
0

Esto sucede si falta el archivo .git en la ruta de destino. Me pasó después de que ejecuté git clean -f -d.

Tuve que eliminar todas las carpetas de destino que se muestran en el mensaje y luego ejecutar git submodule update --remote

Negro
fuente
-18

En su directorio git, suponga que ha sincronizado todos los cambios.

rm -rf .git 

rm -rf .gitmodules

Entonces hazlo:

git init
git submodule add url_to_repo projectfolder
buscar verdadero
fuente
2
¡Esto eliminará toda la historia del proyecto!
redbandit