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 rm
en 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
projectfolder
ya 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 repositorioprojectfolder
ya 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
100644
y100755
), lo que me sugeriría que no deshizo correctamente los archivosprojectfolder
antes 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
projectfolder
no contenía un.git
directorio. Sonó a partir de su pregunta como si hubiera creado el nuevo repositorio paraprojectfolder
otro lugar y lo haya copiado en su lugar, pero claramente ese no fue el caso. Debería mover el existenteprojectfolder
fuera del camino y luego copiar el nuevo repositorio (completo con su.git
directorio) en su lugar antes de agregarlo como un submódulo. O, si ya lo ha empujado al repositorio representado porurl_to_repo
, simplemente puede moverseprojectfolder
y 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 submodule
despué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í..git
directorio 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 add
comando.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_code
directorio no exista.cd Repo
git 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
x
bajo control git, desea agregar un submódulo del mismo nombre, debe eliminar la carpetax
y confirmarla primero .Actualizado por @ ujjwal-singh:
No es necesario comprometerse, la puesta en escena es suficiente ..
git add
/git rm -r
fuente
git add
/gir rm -r
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
AwesomeTheme
que es un repositorio dedicado, intenta volcarlo directamente en su repositorio principal comogit submodule add sites/themes
y obtiene esto"AwesomeTheme" index already exists
.Solo necesita asegurarse de que no haya un
sites/themes/AwesomeTheme
seguimiento 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/AwesomeTheme
directorio vacío , elimínelo. Si ya ha realizado confirmaciones con elsites/theme/AwesomeTheme
directorio en su repositorio principal, necesita purgar todo el historial con un comando como este: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.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 --remote
fuente
En su directorio git, suponga que ha sincronizado todos los cambios.
Entonces hazlo:
fuente