166 votes

Git - comment suivre le contenu non suivi ?

Voir en dessous de la ligne pleine pour ma question initiale.

J'ai un dossier dans mon répertoire local qui est non suivi. Lorsque j'exécute git status j'obtiens :

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

Quand je tape git add vendor/plugins/open_flash_chart_2 alors essayez git status encore une fois, ça dit toujours "non suivi". Qu'est-ce qui se passe ?


Voici un simple résumé de ma dernière demi-heure :

  • J'ai découvert que mon repo Github ne suit pas mon vendor/plugins/open_flash_chart_2 plugin. Plus précisément, il n'y a pas de contenu et un message d'erreur est affiché. flèche verte sur l'icône du dossier.

  • Essayé git submodule init

    No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2'
  • Essayé git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

    vendor/plugins/open_flash_chart_2 already exists in the index
  • git status

    modified: vendor/plugins/open_flash_chart_2 (untracked content)
  • A la recherche de tout fichier nommé .gitmodules dans mon répertoire de dépôt/local mais je n'en ai pas trouvé.

Que dois-je faire pour faire fonctionner mes submodules pour que git puisse commencer à suivre correctement ?


Cela n'a peut-être aucun rapport (je l'inclus au cas où cela pourrait aider), mais chaque fois que je tape git commit -a plutôt que mon habituel git commit -m "my comments" il y a une erreur :

E325: ATTENTION
Found a swap file by the name ".git\.COMMIT-EDITMSG.swp"
         dated: Thu Nov 11 19:45:05 2010
     file name: c:/san/project/.git/COMMIT_EDITMSG
      modified: YES
     user name: San   host name: San-PC
    process ID: 4268
While opening file ".git\COMMIT_EDITMSG"
         dated: Thu Nov 11 20:56:09 2010
  NEWER than swap file!  
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

Je suis complètement novice en matière de Github et, bien que j'aie essayé de consulter la documentation, je reste un peu sur ma faim en ce qui concerne ces problèmes particuliers. Je vous remercie.

247voto

Chris Johnsen Points 50064

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.

116voto

neoneye Points 11545

J'ai eu le même problème. La raison était qu'il y avait un sous-dossier qui contenait un dossier ".git". En le supprimant, git était content.

6voto

Peter Lada Points 81

Pour souligner ce que j'ai dû extraire du chat de Chris Johansen avec OP (lien d'une réponse à une réponse) :

git add vendor/plugins/open_flash_chart_2 # ajoutera le lien git, le contenu restera non suivi

git add vendor/plugins/open_flash_chart_2/ # REMARQUEZ LA BARRE OBLIQUE !!!!

Le deuxième formulaire l'ajoutera sans gitlink, et le contenu est traçable. Le répertoire .git est commodément et automatiquement ignoré. Merci à Chris !

5voto

Eloici Points 53

J'utilise constamment l'astuce suggérée par Peter Lada, appelée "faux submodules" :

http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb

C'est très utile dans plusieurs scénarios (par exemple, je l'utilise pour garder toute ma configuration Emacs dans un dépôt, y compris le HEAD actuel de tous les dépôts git à l'intérieur des répertoires de paquets elpa/el-get, afin de pouvoir facilement revenir à une version connue et fonctionnelle lorsqu'une mise à jour casse quelque chose).

3voto

rmk Points 2349

http://progit.org/book/ch6-6.html

Je pense que vous devriez lire ceci pour en savoir un peu plus sur le submodule. C'est bien écrit et cela ne prend pas beaucoup de temps à lire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X