submodulos - gitlab submodules
Problema al agregar código común como submódulo de git: "ya existe en el índice" (8)
Soy nuevo en git y agradecería ayuda con la adición de submódulos. He recibido dos proyectos que comparten un código común. El código compartido fue copiado en los dos proyectos. Creé un repositorio de git separado para el código común y lo eliminé de los proyectos con el plan de agregarlo como submódulo de git.
Usé la opción de ruta de git submodule add para especificar la carpeta:
git submodule add url_to_repo projectfolder
pero luego obtuve 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 debe estar en la carpeta del proyecto ... ¿Qué puedo hacer al respecto y qué he entendido mal sobre la opción de ruta del complemento del submódulo git?
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 de muestra git es "c3-pro-ios-framework"
Eliminar los archivos asociados al submódulo
rm -rf .git/modules/c3-pro-ios-framework/
Elimine cualquier referencia al submódulo en la configuración
vim .git/config
Eliminar .gitmodules
rm -rf .gitmodules
Eliminarlo de la memoria caché sin el "git"
git rm --cached c3-pro-ios-framework
Añadir submódulo
git submodule add https://github.com/chb/c3-pro-ios-framework.git
En su dir git, supongamos que tiene sincronizados todos los cambios.
rm -rf .git
rm -rf .gitmodules
Entonces hazlo:
git init
git submodule add url_to_repo projectfolder
Lo conseguí trabajando haciéndolo 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 tipo de repositorio vacío:
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 el otro.
No sé si esto es útil, aunque tuve el mismo problema al intentar enviar mis archivos desde IntelliJ 15. Al final, abrí SourceTree y allí simplemente pude confirmar el archivo. Problema resuelto. No es necesario emitir ningún comando de Git elegante. Solo mencionarlo en caso de que alguien tenga el mismo problema.
Solo para aclarar en lenguaje humano lo que el error intenta decirte:
No puede crear un repositorio en esta carpeta que ya fue rastreado en el repositorio principal.
Por ejemplo: usted tiene una carpeta de temas llamada AwesomeTheme
que es un repositorio dedicado, intente volcarla directamente en su repositorio principal como git submodule add sites/themes
y ya obtiene este "AwesomeTheme" index already exists
.
Solo necesita asegurarse de que no haya sites/themes/AwesomeTheme
en el seguimiento de la versión del repositorio principal para que el submódulo se pueda crear allí.
Por lo tanto, para solucionarlo, en su repositorio principal si tiene un directorio sites/theme/AwesomeTheme
, elimínelo. Si ya has realizado commits con el directorio sites/theme/AwesomeTheme
en tu repositorio principal, debes sites/theme/AwesomeTheme
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 ejecutar el git submodule add [email protected] sites/themes/AwesomeTheme
Como el repositorio principal nunca ha visto nada (también conocido como indexado) en sites/themes/AwesomeTheme
, ahora puede crearlo.
Tuve el mismo problema y después de horas de buscar encontré la respuesta.
El error que estaba obteniendo era un poco diferente: <path> already exists and is not a valid git repo
(y se agregó aquí para el valor SEO)
La solución es NO crear el directorio que albergará el submódulo. El directorio se creará como parte del comando git submodule add
.
Además, se espera que el argumento sea relativo a la raíz padre-repositorio, no a su directorio de trabajo, así que tenga cuidado con eso.
Solución para el ejemplo de arriba:
- Está bien tener el repositorio padre ya clonado.
- Asegúrese de que el directorio
common_code
no exista. -
cd Repo
-
git submodule add git://url_to_repo projectfolder/common_code/
( Observe la barra inclinada requerida ) . - Sanidad restaurada.
Espero que esto ayude a alguien, ya que hay muy poca información en otros lugares sobre esto.
si existe una carpeta llamada x
en el control de git, desea agregar un submódulo del mismo nombre, debe eliminar la carpeta x
y confirmarla primero .
Actualizado por @ ujjwal-singh:
No es necesario comprometerse, la puesta en escena es suficiente ... git add
/ git rm -r
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 etapas ("ya existe en el índice"). Para saber qué está pasando aquí, intente enumerar todo en el índice debajo de esa carpeta con:
git ls-files --stage projectfolder
La primera columna de esa salida le dirá qué tipo de objeto está en el índice en la projectfolder
. (Estos se parecen a los modos de archivo Unix, pero tienen un significado especial 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 en la projectfolder
ya se ha agregado como un "gitlink". Si no aparece en la salida del git submodule
, y desea volver a agregarlo como un submódulo, puede hacer lo siguiente:
git rm --cached projectfolder
... para desestabilizarlo, 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 en la lista (con los modos de archivo 100644
y 100755
), lo que me sugeriría que no ha extralimitado los archivos en la projectfolder
antes de copiar el nuevo repositorio en su lugar. Si ese es el caso, puede hacer lo siguiente para descomprimir todos esos archivos:
git rm -r --cached projectfolder
... y luego agrega el submódulo con:
git submodule add url_to_repo projectfolder