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?
fuente

git ls-files --stage projectfolder?git rmen la carpeta existente ayudó: |Respuestas:
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: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:
(es decir, una línea que comienza con
160000), en cuyo caso el repositorioprojectfolderya se ha agregado como "gitlink". Si no aparece en la salida degit submodule, y desea volver a agregarlo como un submódulo, puede hacer lo siguiente:... para sacarlo del escenario y luego:
... para agregar el repositorio como un submódulo.
Sin embargo, también es posible que vea muchos blobs enumerados (con modos de archivo
100644y100755), lo que me sugeriría que no deshizo correctamente los archivosprojectfolderantes de copiar el nuevo repositorio en su lugar. Si ese es el caso, puede hacer lo siguiente para desestabilizar todos esos archivos:... y luego agregue el submódulo con:
fuente
projectfolderno contenía un.gitdirectorio. Sonó a partir de su pregunta como si hubiera creado el nuevo repositorio paraprojectfolderotro lugar y lo haya copiado en su lugar, pero claramente ese no fue el caso. Debería mover el existenteprojectfolderfuera 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 porurl_to_repo, simplemente puede moverseprojectfoldery luego agregar el submódulo desde esa URL.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
Eliminar cualquier referencia al submódulo en la configuración
Eliminar .gitmodules
Eliminarlo de la caché sin el "git"
Agregar submódulo
fuente
git submoduledespués de la eliminación y antes de agregar y me dio un error, confirmar la eliminación se encargó de ello.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í..gitdirectorio que todavía tenía restos para mí. Esto funcionó muy bien. Gracias.Debe eliminar su repositorio de submódulos git (carpeta de proyectos en este caso) primero para la ruta git.
y luego agregue submódulo
fuente
git submodule add --force <git_submodule_repository>funcionó para mí mantener el mismo nombre de submóduloTuve 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:
common_codedirectorio no exista.cd Repogit submodule add git://url_to_repo projectfolder/common_code/( Tenga en cuenta la barra inclinada final requerida ) .Espero que esto ayude a alguien, ya que se puede encontrar muy poca información en otros lugares sobre esto.
fuente
git submodule add, y no se requiere la barra inclinada final.si existe una carpeta llamada
xbajo control git, desea agregar un submódulo del mismo nombre, debe eliminar la carpetaxy confirmarla primero .Actualizado por @ ujjwal-singh:
No es necesario comprometerse, la puesta en escena es suficiente ..
git add/git rm -rfuente
git add/gir rm -rSolo 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 comogit 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 elsites/theme/AwesomeThemedirectorio en su repositorio principal, necesita purgar todo el historial con un comando como este:Ahora puedes correr
git submodule add [email protected] sites/themes/AwesomeThemeDado que el repositorio principal nunca antes había visto nada (también conocido como index'd)
sites/themes/AwesomeTheme, ahora puede crearlo.fuente
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:
Eso creará la estructura de carpetas deseada:
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.
fuente
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.
fuente
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.
fuente
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 --remotefuente
En su directorio git, suponga que ha sincronizado todos los cambios.
Entonces hazlo:
fuente