Ha agregado vendor/plugins/open_flash_chart_2
como entrada "gitlink", pero nunca la definió como un submódulo. Efectivamente, está utilizando la función interna que utiliza git submodule (entradas de gitlink) pero no está utilizando la función de submódulo en sí.
Probablemente hiciste algo como esto:
git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2
Este último comando es el problema. El directorio vendor/plugins/open_flash_chart_2
comienza como un repositorio Git independiente. Por lo general, estos sub-repositorios se ignoran, pero si le dice a git add que lo agregue explícitamente, creará una entrada gitlink que apunte a la confirmación HEAD del sub-repositorio en lugar de agregar el contenido del directorio. Puede ser bueno si git add se negara a crear tales "semi-submódulos".
Los directorios normales se representan como objetos de árbol en Git; los objetos de árbol dan nombres y permisos a los objetos que contienen (generalmente otros objetos de árbol y blob: directorios y archivos, respectivamente). Los submódulos se representan como entradas "gitlink"; Las entradas de gitlink solo contienen el nombre del objeto (hash) de la confirmación HEAD del submódulo. El "repositorio de origen" para la confirmación de un gitlink se especifica en el .gitmodules
archivo (y el .git/config
archivo una vez que se ha inicializado el submódulo).
Lo que tiene es una entrada que apunta a una confirmación particular, sin registrar el repositorio de origen para esa confirmación. Puede solucionar esto ya sea convirtiendo su gitlink en un submódulo apropiado, o quitando el gitlink y reemplazándolo con contenido "normal" (archivos y directorios simples).
Convertirlo en un submódulo adecuado
Lo único que falta para definir correctamente vendor/plugins/open_flash_chart_2
como un submódulo es un .gitmodules
archivo. Normalmente (si aún no lo hubiera agregado como entrada desnuda de gitlink), simplemente usaría git submodule add
:
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Como descubrió, esto no funcionará si la ruta ya existe en el índice. La solución es eliminar temporalmente la entrada gitlink del índice y luego agregar el submódulo:
git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Esto usará su sub-repositorio existente (es decir, no volverá a clonar el repositorio de origen) y organizará un .gitmodules
archivo que se verá así:
[submodule "vendor/plugins/open_flash_chart_2"]
path = vendor/plugins/open_flash_chart_2
url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
También hará una entrada similar en el repositorio principal .git/config
(sin la path
configuración).
Compromételo y tendrás un submódulo adecuado. Cuando clona el repositorio (o presiona GitHub y clona desde allí), debería poder reinicializar el submódulo mediante git submodule update --init
.
Reemplácelo con contenido simple
El siguiente paso asume que su sub-repositorio vendor/plugins/open_flash_chart_2
no tiene ningún historial local que desee conservar (es decir, lo único que le importa es el árbol de trabajo actual del sub-repositorio, no el historial).
Si tiene un historial local en el repositorio secundario que le interesa, debe hacer una copia de seguridad del .git
directorio del repositorio secundario antes de eliminarlo en el segundo comando a continuación. (Considere también el subárbol git siguiente ejemplo de que conserva el historial de HEAD del sub-repositorio).
git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2
Esta vez, al agregar el directorio, no es un repositorio secundario, por lo que los archivos se agregarán normalmente. Desafortunadamente, dado que eliminamos el .git
directorio, no hay una manera súper fácil de mantener las cosas actualizadas con el repositorio de origen.
Puede considerar usar una combinación de subárbol en su lugar. Hacerlo le permitirá introducir fácilmente los cambios desde el repositorio de origen mientras mantiene los archivos "planos" en su repositorio (sin submódulos). El comando git subtree de terceros es un buen envoltorio alrededor de la funcionalidad de combinación de subárbol.
git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history
Luego:
git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master
git subtree push --prefix=vendor/plugins/open_flash_chart_2 git@github.com:me/my_ofc2_fork.git changes_for_pull_request
git subtree también tiene una --squash
opción que le permite evitar incorporar el historial del repositorio de origen en su historial, pero aún le permite incorporar cambios ascendentes.