Comment suivre le contenu non suivi?

159

Voir ci-dessous la ligne continue pour ma question initiale.

J'ai un dossier dans mon répertoire local qui n'est pas suivi. Quand je cours git status, j'obtiens:

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

Lorsque je tape git add vendor/plugins/open_flash_chart_2puis réessaye git status, il est toujours dit non suivi. Que se passe-t-il?


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

  • J'ai découvert que mon dépôt Github ne suivait pas mon vendor/plugins/open_flash_chart_2plugin. Plus précisément, il n'y a pas de contenu et une flèche verte apparaît sur l'icône du dossier.

  • A essayé git submodule init

    No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2'
    
  • A 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)
    
  • J'ai recherché n'importe quel fichier nommé .gitmodulesdans mon référentiel / répertoire local mais je n'en ai pas trouvé.

Que dois-je faire pour que mes sous-modules fonctionnent afin que git puisse commencer le suivi correctement?


Cela peut être sans rapport (je l'inclus au cas où cela aiderait), mais chaque fois que je tape git commit -aplutôt que mon habituel git commit -m "my comments", cela génère 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 un débutant complet chez Github et malgré mes efforts pour parcourir la documentation, je suis un peu perplexe face à ces problèmes particuliers. Je vous remercie.

sscirrus
la source
2
Je suis confus sur certaines choses. Un: pourquoi continuez-vous à dire github? tout ce dont vous parlez semble local (sauf cette flèche verte - je n'en sais rien). Est-ce vrai, ou s'agit-il d'une question sur la transmission de mises à jour à github? Deux: avez-vous fait quelque chose pour créer ce plugin en tant que sous-module? Un sous-module est un référentiel git à part entière. Vous le créez séparément, puis vous l'ajoutez au superprojet.
Cascabel
1
Hm, la sortie de git status suggère qu'il y a bien un sous-module là-bas ... mais vous n'avez vraiment pas de fichier .gitmodules? Honnêtement, si ce plugin a son propre référentiel et que vous savez quelle version vous voulez, vous pouvez simplement supprimer ce répertoire de votre projet, vous assurer qu'il n'y a pas d'entrée dans .gitmodules et passer par la configuration du sous-module: git submodule add, git submodule update --init.
Cascabel
Jefromi - Je n'ai en fait pas mentionné Github plus de deux fois - la première fois, c'est parce que la flèche verte apparaît au-dessus de l'image du dossier jaune dans le référentiel Github pour open_flash_chart_2. Je serai heureux de modifier la réponse pour la rendre plus claire.
sscirrus
1
@sscirrus: Vous devriez certainement avoir une préférence, sous-module ou non. S'il s'agit d'un élément externe sur lequel vous n'allez pas travailler, mais sur lequel vous voudrez peut-être des mises à jour, il devrait s'agir d'un sous-module. Si vous ne vous souciez pas d'obtenir des mises à jour de son dépôt d'origine et que vous souhaitez peut-être pirater la source vous-même, cela ne devrait pas être un sous-module.
Cascabel
1
Cette question semble concerner uniquement les sous-modules git. J'ai supprimé certaines balises car cette question n'est pas directement liée aux rails ou à github, elle s'appliquerait à tous les cas d'utilisation de git . Et la trackingbalise semble être utilisée pour les sujets de `` suivi des visiteurs du site Web '', de sorte que cela ne s'applique pas non plus.
edgerunner

Réponses:

239

Vous avez ajouté une vendor/plugins/open_flash_chart_2entré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_2commence 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 .gitmodulesfichier (et le .git/configfichier 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_2tant que sous-module est un .gitmodulesfichier. 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 .gitmodulesfichier 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 pathparamè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_2n'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 .gitavant 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 .gitré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 [email protected]:me/my_ofc2_fork.git changes_for_pull_request

git subtree a également une --squashoption 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.

Chris Johnsen
la source
Chris, je viens d'essayer rm -rf vendor/plugins/open_flash_chart_2/.gitet il dit que «rm» n'est pas reconnu. Ensuite, j'ai essayé git rm -rf vendor/plugins/open_flash_chart_2/.gitet c'est dit fatal: pathspec 'vendor/plugins/open_flash_chart_2/.git' did not match any files(mais je peux y arriver dans l'explorateur Windows!).
sscirrus
2
Nous avons un peu discuté du problème dans le chat . L'OP a pu supprimer le répertoire du sous-référentiel .gitet ré-ajouter les fichiers «à plat» (la première option «Plain Content»).
Chris Johnsen
1
Cela m'a tellement sauvé le cul l'autre jour. J'avais accidentellement ajouté quelque chose avec un répertoire .git à mon dépôt git, puis git un peu-sorta pensait qu'il y avait un sous-module, ce qui faisait paniquer mes git svn dcommits. Je vous voterais 3 fois si je le pouvais.
davidtbernal
Vous voulez souligner, le plugin tiers subtreene doit pas être confondu avec la fusion de sous-arbres. Ce n'est pas un emballage. L'auteur le dit: P
NebulaFox
@NebulaFox: Bien que git subtree ne soit pas seulement un wrapper autour des fusions de sous-arbres, il utilise certainement les mêmes techniques que la procédure standard de «fusion de sous-arbres» (c'est git readtree --prefix=path-à- dire et fusion de sous-arbres: git mergeavec -s subtreeou-Xsubtree=path ). Il a également de jolis extras «en plus»: le --squashmode, la splitcommande et les assistants pushet pull.
Chris Johnsen
114

J'ai juste eu le même problème. La raison était qu'il y avait un sous-dossier contenant un dossier «.git». Le retirer a rendu git heureux.

neoneye
la source
Oui, cela m'est arrivé dans AndroidStudio. Le repo git avait déjà été créé dans le dossier / app alors que j'essayais de créer un dossier git repo one up. Merci.
ZirconCode
J'avais une application cli angulaire créée sous de nombreux autres dossiers et ce dossier avait un dossier .git: / C'est le vrai problème, pas les sous-modules!
Pascal
cela fonctionne pour moi ... J'ai essayé le git add plusieurs fois, mais rien ne s'est passé. puis je supprime le .gitdossier
Ninja
1
Mais que faire si je veux toujours suivre mon sous-dossier? Que devrais-je faire ?
cyber8200
Avoir le même cas. Je veux toujours suivre ce sous-dossier qui contenait malheureusement aussi un dossier .git. Après avoir supprimé ce dossier .git du sous-dossier, il n'est plus suivi dans mon dossier principal .git .... :(
sqp_125
14
  1. J'ai supprimé les répertoires .git de ces nouveaux répertoires (cela peut créer un drame de sous-module. Google si cela vous intéresse.)
  2. J'ai ensuite lancé git rm -rf --cached / les / new / répertoires
  3. Ensuite, j'ai ré-ajouté les répertoires avec un git add. d'en haut

URL de référence https://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U

user2041369
la source
6

Pour souligner ce que j'ai dû extraire de la discussion de Chris Johansen avec OP (lié d'une réponse à une réponse):

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

git add vendor/plugins/open_flash_chart_2/ # NOTEZ LE SLASH !!!!

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!

Peter Lada
la source
5

J'utilise tout le temps l'astuce suggérée par Peter Lada, surnommée "faux sous-modules":

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

C'est très utile dans plusieurs scénarios (pe je l'utilise pour conserver toute ma configuration Emacs dans un référentiel, y compris le HEAD actuel de tous les référentiels git dans les répertoires de packages elpa / el-get, donc je pourrais facilement revenir en arrière / avancer vers un connu version de travail quand une mise à jour casse quelque chose).

Eloici
la source
3

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

Je pense que vous devriez lire ceci pour en savoir un peu plus sur le sous-module. Il est bien écrit et il ne faut pas beaucoup de temps pour le lire.

rmk
la source
3

J'ai eu le même problème avec un gros projet avec de nombreux sous-modules. Sur la base des réponses de Chris Johnsen ici et de VonC ici, je construis un court script bash qui itère à travers toutes les entrées gitlink existantes et les ajoute en tant que sous-modules appropriés.

#!/bin/bash

# Read all submodules in current git
MODULES=`git ls-files --stage | grep 160000`

# Iterate through every submodule path
while read -r MOD; do
  # extract submodule path (split line at whitespace and take string with index 3)
  ARRIN=(${MOD})
  MODPATH=${ARRIN[3]}

  # grep module url from .git file in submodule path
  MODURL=`grep "url = " $MODPATH/.git/config`
  MODURL=${MODURL##*=}

  # echo path and url for information
  echo $MODPATH
  echo $MODURL

  # remove existing entry in submodule index
  git rm --cached $MODPATH
  # add new entry in submodule index
  git submodule add $MODURL $MODPATH
done <<< "$MODULES"

Cela a résolu le problème pour moi, j'espère que cela vous sera utile.

Nicolas
la source
2

Cela a très bien fonctionné pour moi:

git update-index --skip-worktree

Si cela ne fonctionne pas avec le chemin, essayez le nom de fichier. Faites-moi savoir si cela a fonctionné pour vous aussi.

Au revoir!

DarkCrazy
la source
1

Eu le même problème, mais il n'a pas été résolu dans cette discussion.

J'ai également rencontré le problème du sous-module comme décrit dans l'ouverture du fil.

% git status          
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (untracked content)

En regardant le diff, j'ai reconnu un -dirty ajouté à un hachage: relire la documentation a résolu le problème pour moi. http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html Regardez la section "Pièges avec les sous-modules"

La raison était qu'il y avait des changements ou du contenu non suivi dans le sous-module. Je devais d'abord accéder au répertoire du sous-module, faire un "git add" + "git commit" pour que tout le contenu soit suivi dans le sous-module.

Then "git status" on the master stated
% git commit
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (new commits)

Maintenant, cette nouvelle HEAD du sous-module pourrait être validée dans le module maître.

nero
la source
1

J'ai récemment rencontré ce problème en travaillant sur un projet contractuel (réputé classifié). Le système dans lequel je devais exécuter le code n'avait pas d'accès Internet, pour des raisons de sécurité bien sûr, et donc l'installation de dépendances, en utilisant composer et npm, devenait une énorme douleur.

Après de longues délibérations avec mon collègue, nous avons décidé de simplement l'ailer et de copier-coller nos dépendances plutôt que de faire installer composer ou installer npm.

Cela nous a conduit à NE PAS ajouter de fournisseurs et npm_modules dans gitignore. C'est à ce moment que j'ai rencontré ce problème.

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

J'ai un peu cherché sur Google et trouvé ce fil de discussion utile sur SO. N'étant pas trop pro dans Git, et étant un peu enivré en travaillant dessus, j'ai juste cherché tous les sous-modules dans le dossier des fournisseurs

find . -name ".git"

Cela m'a donné quelques 4-5 dépendances qui avaient git sur eux. J'ai supprimé tous ces dossiers .git et voila, cela a fonctionné. Je sais que c'est un hack, et pas très geek de toute façon. Ô dieux de SO, pardonnez-moi! La prochaine fois, je promets de lire sur gitlinks et d'obéir à O puissant Linus Tovalds.

SLearner
la source
1

Cette question a déjà reçu une réponse, mais j'ai pensé ajouter au mélange ce que j'ai découvert lorsque j'ai reçu ces messages.

J'ai un dépôt appelé playgroundqui contient un certain nombre d'applications sandbox. J'ai ajouté deux nouvelles applications à partir d'un tutoriel au playgroundrépertoire en clonant le repo du tutoriel. Le résultat était que les trucs git des nouvelles applications pointaient vers le dépôt du tutoriel et non vers mon dépôt. La solution était de supprimer le .gitrépertoire de chacun des répertoires de ces applications, les répertoires mvdes applications en dehors du playgroundrépertoire, puis de mvles remettre en marche git add .. Après cela, cela a fonctionné.

Dana Scheider
la source
1

J'ai résolu ce problème en supprimant le fichier .git de mon sous-dossier.

  1. Supprimez d'abord le fichier .git de votre sous-dossier
  2. Ensuite, supprimez votre sous-dossier de git en exécutant ce code, git rm -rf --cached your_subfolder_name
  3. Ensuite, ajoutez à nouveau votre dossier par git add. commander
MehediTCF
la source
0

Allez d'abord dans le répertoire : vendor / plugins / open_flash_chart_2 et DELETE


PUIS :

git rm --cached vendor/plugins/open_flash_chart_2  
git add .  
git commit -m "Message"  
git push -u origin master  

git status  

PRODUCTION

Sur le maître de succursale
Votre succursale est à jour avec «origine / maître».
rien à valider, le répertoire de travail est nettoyé

Program-Me-Rev
la source