Vous avez ajouté une vendor/plugins/open_flash_chart_2
entrée «gitlink», mais ne l'avez jamais définie comme un sous-module. En fait, vous utilisez la fonctionnalité interne utilisée par git submodule (entrées gitlink) mais vous n'utilisez pas la fonctionnalité de sous-module elle-même.
Vous avez probablement fait quelque chose comme ceci:
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
commence comme un référentiel Git indépendant. Habituellement, ces sous-référentiels sont ignorés, mais si vous dites à git add de l'ajouter explicitement, alors il créera une entrée gitlink qui pointe vers le commit HEAD du sous-référentiel au lieu d'ajouter le contenu du répertoire. Ce serait bien si git add refusait de créer de tels «semi-sous-modules».
Les répertoires normaux sont représentés comme des objets d'arborescence dans Git; Les objets tree donnent des noms et des autorisations aux objets qu'ils contiennent (généralement d'autres objets tree 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 d'objet (hachage) du commit HEAD du sous-module. Le «référentiel source» pour un commit gitlink est spécifié dans le .gitmodules
fichier (et le .git/config
fichier 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 référentiel source pour ce commit. Vous pouvez résoudre ce problème en transformant votre gitlink dans un sous-module approprié, ou en supprimant le gitlink et en le remplaçant par du contenu «normal» (fichiers et répertoires simples).
Transformez-le en un sous-module approprié
Le seul élément qui vous manque pour définir correctement en vendor/plugins/open_flash_chart_2
tant que sous-module est un .gitmodules
fichier. Normalement (si vous ne l'aviez pas déjà ajouté en tant qu'entrée gitlink nue), vous utiliseriez simplement 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 trouvé, 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
Cela utilisera votre sous-référentiel existant (c'est-à-dire qu'il ne re-clonera pas le référentiel source) et mettra en scène un .gitmodules
fichier 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 votre référentiel principal .git/config
(sans le path
paramètre).
Engagez-vous et vous aurez un sous-module approprié. Lorsque vous clonez le référentiel (ou poussez sur GitHub et clonez à partir de là), vous devriez être en mesure de réinitialiser le sous-module via git submodule update --init
.
Remplacez-le par du contenu brut
L'étape suivante suppose que votre sous-référentiel dans vendor/plugins/open_flash_chart_2
n'a pas d'historique local que vous souhaitez conserver (c'est-à-dire que tout ce dont vous vous souciez est l'arborescence de travail actuelle du sous-référentiel, pas l'historique).
Si vous avez un historique local dans le sous-référentiel qui vous intéresse, vous devez alors sauvegarder le répertoire du sous-référentiel .git
avant de le supprimer dans la deuxième commande ci-dessous. (Considérez également l' exemple de sous-arbre git ci-dessous qui préserve l'historique de 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, ce n'est pas un sous-référentiel, donc les fichiers seront ajoutés normalement. Malheureusement, depuis que nous avons supprimé le .git
répertoire, il n'y a pas de moyen très simple de garder les choses à jour avec le référentiel source.
Vous pouvez envisager d'utiliser une fusion de sous - arborescence à la place. Cela vous permettra d'extraire facilement les modifications du référentiel source tout en gardant les fichiers «à plat» dans votre référentiel (pas de sous-modules). La commande tierce git subtree est un bon wrapper autour de la fonctionnalité de fusion de sous-arborescence.
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
git subtree a également une --squash
option qui vous permet d'éviter d'incorporer l'historique du référentiel source dans votre historique mais vous permet tout de même d'extraire les modifications en amont.