web-dev-qa-db-fra.com

Comment suivre le contenu non suivi?

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

J'ai un dossier dans mon répertoire local qui n'a pas été suivi. Quand je lance git status, je reçois:

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_2, puis que je réessaie git status, le message dit toujours non suivi. Que se passe-t-il? 


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

  • Découvert que mon dépôt Github ne suit pas mon plugin vendor/plugins/open_flash_chart_2. Plus précisément, il n'y a pas de contenu et il montre un 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 recherché un fichier nommé .gitmodules dans mon répertoire de référentiel/local mais n’en a pas trouvé.

Que dois-je faire pour faire fonctionner mes sous-modules alors git peut commencer à suivre correctement?


Cela peut ne pas être lié (je l'incline au cas où cela aiderait), mais chaque fois que je tape git commit -a plutôt que mon git commit -m "my comments" habituel, une erreur est générée:

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 chez Github et malgré les efforts que je déploie pour parcourir la documentation, je suis un peu déconcerté par ces problèmes particuliers. Je vous remercie.

146
sscirrus

Vous avez ajouté vendor/plugins/open_flash_chart_2 comme entrée «gitlink», mais vous ne l'avez jamais défini comme sous-module. Effectivement, 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 ç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 commence en tant que référentiel Git indépendant. Généralement, ces sous-référentiels sont ignorés, mais si vous indiquez git add pour l'ajouter explicitement, il créera une entrée gitlink qui pointe vers la validation HEAD du sous-référentiel au lieu d'ajouter le contenu du fichier. annuaire. Ce pourrait être bien si git add refuserait de créer de tels «semi-sous-modules».

Les répertoires normaux sont représentés sous forme d'arborescence dans Git; Les objets d'arborescence donnent des noms et des autorisations aux objets qu'ils contiennent (généralement d'autres objets d'arborescence et d'objets blob, respectivement des répertoires et des fichiers). Les sous-modules sont représentés sous forme d'entrées «gitlink»; Les entrées de gitlink ne contiennent que le nom d'objet (hachage) du commit HEAD du sous-module. Le «référentiel source» pour la validation de gitlink est spécifié dans le fichier .gitmodules (et dans le fichier .git/config une fois le sous-module initialisé).

Ce que vous avez est une entrée qui pointe vers un commit spécifique, sans enregistrer le référentiel source pour ce commit. Vous pouvez résoudre ce problème soit en transformant votre gitlink en un sous-module approprié, soit en supprimant le gitlink et en le remplaçant par un contenu «normal» (fichiers ordinaires et répertoires).

Transformez-le en un sous-module approprié

Le seul bit qui vous manque pour définir correctement vendor/plugins/open_flash_chart_2 en tant que sous-module est un fichier .gitmodules. Normalement (si vous ne l'aviez pas déjà ajouté en tant qu'entrée nue gitlink), 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 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

Ceci utilisera votre sous-référentiel existant (c'est-à-dire qu'il ne ré-clonera pas le référentiel source) et organisera 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

Une entrée similaire sera également créée dans le .git/config de votre référentiel principal (sans le paramètre path).

Engagez-le et vous aurez un sous-module approprié. Lorsque vous clonez le référentiel (ou que vous appuyez sur GitHub et clonez à partir de là), vous devriez pouvoir ré-initialiser le sous-module via git submodule update --init.

Remplacez-le par un contenu simple

La prochaine étape suppose que votre sous-référentiel dans vendor/plugins/open_flash_chart_2 ne possède aucun historique local que vous souhaitez conserver (c'est-à-dire que tout ce qui vous préoccupe 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 qui vous intéresse, vous devez alors sauvegarder le répertoire .git du sous-référentiel avant de le supprimer dans la deuxième commande ci-dessous. (Prenez également l’exemple ci-dessous git subtree qui conserve 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, il ne s'agit pas d'un sous-référentiel. Les fichiers seront donc ajoutés normalement. Malheureusement, depuis que nous avons supprimé le répertoire .git, il n’existe aucun moyen très simple de garder les informations à jour avec le référentiel source.

Vous pouvez envisager d’utiliser une fusion de sous-arbre à 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 encapsuleur Nice autour de la fonctionnalité de fusion des 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 [email protected]:me/my_ofc2_fork.git changes_for_pull_request

git subtree a également une option --squash qui vous permet d’éviter d’incorporer l’historique du référentiel source dans votre historique, tout en vous permettant d’intégrer les modifications en amont.

230
Chris Johnsen

Je viens d'avoir le même problème. La raison en est qu’il y avait un sous-dossier contenant un dossier ".git". Le retirer rendait git heureux.

109
neoneye
  1. J'ai supprimé les répertoires .git de ces nouveaux répertoires (cela peut créer un drame de sous-module. Google si intéressé.)
  2. J'ai ensuite lancé git rm -rf --cached/the/new/directory
  3. Ensuite, j'ai ré-ajouté les répertoires avec un ajout de git. d'en haut

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

8
user2041369

Pour souligner ce que j'ai dû extraire de la discussion de Chris Johansen avec OP (liée à partir 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/ # AVIS LE SLASH !!!!

Le second formulaire l'ajoutera sans gitlink, et le contenu est traçable. Le répertoire .git est automatiquement et automatiquement ignoré. Merci Chris!

6
Peter Lada

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

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 référentiel, y compris le HEAD actuel de tous les référentiels git dans les répertoires de paquets elpa/el-get, afin de pouvoir facilement restaurer vers une version de travail connue quand une mise à jour casse quelque chose).

5
Eloici

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

Je pense que vous devriez lire ceci pour en apprendre un peu plus sur le sous-module. C'est bien écrit et sa lecture ne prend pas beaucoup de temps.

3
rmk

J'ai eu le même problème avec un grand projet avec plusieurs sous-modules . Basé sur les réponses de Chris Johnsenici et VonCici Je construis un court script bash qui itère à travers toutes les entrées existantes de gitlink 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 ne vous aidera pas.

2
nicolas

On a déjà répondu à cette question, mais je pensais ajouter au mélange ce que j'ai découvert lorsque j'ai reçu ces messages.

J'ai un référant appelé playground qui contient un certain nombre d'applications Sandbox. J'ai ajouté deux nouvelles applications d'un tutoriel au répertoire playground en clonant le référentiel du tutoriel. Le résultat a été que les choses git des nouvelles applications pointaient vers le dépôt du tutoriel et non vers mon dépôt. La solution consistait à supprimer le répertoire .git de chacun des répertoires de ces applications, mv les répertoires des applications situés en dehors du répertoire playground, puis à mv leur retour et à exécuter git add .. Après cela a fonctionné.

1
Dana Scheider

Cela a bien fonctionné pour moi:

git update-index --skip-worktree

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

Au revoir!

1
DarkCrazy

J'ai récemment rencontré ce problème alors que je travaillais sur un projet de contrat (réputé classé). Le système dans lequel je devais exécuter le code ne disposait pas d'accès Internet, pour des raisons de sécurité bien entendu, et l'installation de dépendances à l'aide de composer et de npm devenait donc extrêmement pénible.

Après de longues délibérations avec mon collègue, nous avons décidé de simplement le déployer et de copier/coller nos dépendances plutôt que de faire l’installation par composer ou npm.

Cela nous a conduit à ne PAS ajouter de vendeurs et npm_modules à gitignore. C'est à ce moment-là que j'ai rencontré ce problème.

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

J'ai googlé ceci un peu et j'ai trouvé ce fil utile sur SO. N'étant pas trop un professionnel de Git et étant un peu en état d'ébriété, j'ai juste cherché tous les sous-modules dans le dossier des vendeurs.

find . -name ".git"

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

1
SLearner

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

J'ai aussi touché le problème de 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 qu’un -dirty était ajouté à un hachage: La relecture de la documentation a résolu le problème pour moi. http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html Consultez la section "Pièges avec des sous-modules"

La raison en é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, ce nouveau HEAD du sous-module peut être validé dans le module maître.

1
nero

Allez d'abord dans le répertoire: fournisseur/plugins/open_flash_chart_2 et SUPPRIMEZ 


ALORS: 

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

git status  

SORTIE 

Sur le chef de branche
Votre branche est à jour avec 'Origin/master'.
rien à commettre, répertoire de travail propre 

0
Program-Me-Rev