Vous avez ajouté vendor/plugins/open_flash_chart_2
comme entrée "gitlink", mais ne l'a jamais défini comme un sous-module. En fait, vous utilisez la fonctionnalité interne que sous-module git utilise (entrées gitlink) mais vous n'utilisez pas la fonctionnalité de submodule elle-même.
Vous avez probablement fait quelque chose comme ça :
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
Cette dernière commande est le problème. Le répertoire vendor/plugins/open_flash_chart_2
démarre comme un dépôt Git indépendant. Habituellement, de tels sous-dépositaires sont ignorés, mais si vous dites à git add pour l'ajouter explicitement, alors il créera une entrée gitlink qui pointera vers le commit HEAD du sous-référentiel au lieu d'ajouter le contenu du répertoire. Il pourrait être intéressant que git add refuserait de créer de tels "semi-sous-modules".
Dans Git, les répertoires normaux sont représentés sous forme d'objets arborescents ; les objets arborescents donnent des noms et des permissions aux objets qu'ils contiennent (généralement d'autres objets arborescents et blob - répertoires et fichiers, respectivement). Les sous-modules sont représentés comme des entrées "gitlink" ; les entrées gitlink contiennent uniquement le nom de l'objet (hash) du HEAD commit du sous-module. Le "référentiel source" pour le commit d'un gitlink est spécifié dans l'attribut .gitmodules
(et le fichier .git/config
une fois que le sous-module a été initialisé).
Ce que vous avez est une entrée qui pointe vers un commit particulier, sans enregistrer le dépôt source de ce commit. Vous pouvez corriger cela soit en transformant votre lien git en un sous-module approprié, soit en supprimant le lien git et en le remplaçant par un contenu "normal" (fichiers et répertoires simples).
Transformez-le en un sous-module approprié
La seule chose qui vous manque pour définir correctement vendor/plugins/open_flash_chart_2
comme un sous-module est un .gitmodules
fichier. Normalement (si vous ne l'aviez pas déjà ajouté en tant qu'entrée gitlink nue), vous devriez juste utiliser git submodule add
:
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
Comme vous l'avez constaté, cela ne fonctionnera pas si le chemin existe déjà dans l'index. La solution consiste à supprimer temporairement l'entrée gitlink de l'index, puis à ajouter le sous-module :
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
Cette opération utilisera votre sous-dépôt existant (c'est-à-dire qu'elle ne re-clonera pas le dépôt source) et mettra en place un fichier .gitmodules
qui ressemble à ceci :
[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
Il fera également une entrée similaire dans le répertoire principal de votre dépôt .git/config
(sans le path
).
Faites-le et vous aurez un sous-module approprié. Lorsque vous clonez le dépôt (ou que vous poussez sur GitHub et clonez à partir de là), vous devriez pouvoir réinitialiser le sous-module via git submodule update --init
.
Remplacez-la par un contenu simple
L'étape suivante suppose que votre sous-référentiel en vendor/plugins/open_flash_chart_2
n'a pas d'historique local que vous voulez préserver (c'est-à-dire que tout ce qui vous intéresse est l'arbre de travail actuel du sous-référentiel, pas l'historique).
Si vous avez un historique local dans le sous-référentiel auquel vous tenez, alors vous devriez sauvegarder l'historique de ce sous-référentiel. .git
avant de le supprimer dans la deuxième commande ci-dessous. (Considérez également le sous-arbre git exemple ci-dessous qui préserve l'historique du HEAD du sous-référentiel).
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
Cette fois, lors de l'ajout du répertoire, il ne s'agit pas d'un sous-référentiel, donc les fichiers seront ajoutés normalement. Malheureusement, puisque nous avons supprimé le .git
il n'y a pas de moyen super facile de garder les choses à jour avec le dépôt de sources.
Vous pouvez envisager d'utiliser un fusion de sous-arbres à la place. Cela vous permettra d'extraire facilement les modifications du référentiel des sources tout en conservant les fichiers "plats" dans votre référentiel (pas de sous-modules). L'application tierce sous-arbre git commande est une enveloppe agréable autour de la fonctionnalité de fusion de sous-arbres.
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
Plus tard :
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
sous-arbre git dispose également d'un --squash
qui vous permet d'éviter d'incorporer l'historique du dépôt source dans votre historique, mais qui vous permet quand même de tirer les changements en amont.