50 votes

Impossible de suivre les fichiers dans les sous-modules Git

Problème: pour ajouter des fichiers à l' ./shells/smallApps/* Git en ./.git/ quand je n'ai pas les fichiers en ./.git/info/exclude , ni à aucun .gitignore -fichiers.

Cette question est fondée sur cette bande de roulement où le problème n'est pas résolu complètement.

- Je exécuter

$git status                                                                                                                                          ~/bin
# On branch master
nothing to commit (working directory clean)
$git ls-files                                                                                                                                        ~/bin
Screen/dev/vim-open.screen
--- cut ---

Je remarque que je n'ai pas les fichiers "coquilles/smallApps/*" à mon Git

$ls shells/smallApps/                                                                                                                                ~/bin
devTodo     extract     
                                                                                                                                             ~/bin

Je veux ajouter à mon Git en cours d'exécution

$git add shells/smallApps/devTodo shells/smallApps/extract
fatal: Path 'shells/smallApps/devTodo' is in submodule 'shells/smallApps'
$git add .

Je remarque que les fichiers ne sont pas ajoutés à mon Git pour une raison quelconque, tels que

$git status                                                                                                                                          ~/bin 
# On branch master
nothing to commit (working directory clean)

Je n'ai pas les fichiers .git/info/exclure ni à l' .gitignore -fichiers.

Quel est le dernier avertissement signifie?

100voto

Tim Henigan Points 19948

Mise à JOUR

Il y a deux raisons pourquoi Git va ignorer un fichier: gitignore et submodules.

Pour être plus précis, les conditions suivantes s'entraîner à Git d'ignorer un fichier 'git add"est invoqué:

  1. Le fichier correspond à un modèle, $GIT_DIR/exclude.
  2. Le fichier correspond à un modèle en .gitignore le fichier à l'intérieur du repo.
  3. Le fichier correspond à un modèle spécifique à un utilisateur .gitignore le fichier (spécifié par 'git config --global core.excludesfile').
  4. Le fichier fait partie d'un sous-module.

Forcer 'git add"sur un ignorés fichier:

Vous pouvez vérifier pour voir si un fichier est ignoré en invoquant des"git add full/path/to/file'.

La page de man déclare que "Si un ignorés de fichier est spécifié sur la ligne de commande, la commande échouera avec une liste de fichiers ignorés."

Si le fichier est ignoré, vous pouvez le forcer à être ajouté avec 'git add --force full/path/to/file'.

Instructions pour éliminer un sous-module de référence:

Comme indiqué dans une précédente réponse, shells/smallApps est un sous-module dans votre référentiel.

Si le fichier fait partie d'un sous-module, la situation est plus complexe. Vous ne pouvez pas modifier le contenu de la sous-module de dans le projet principal.

Si vous voulez éliminer le sous-module de référence et directement un suivi des dossiers de pensions, il y a plusieurs étapes doivent être effectuées. Vous ne pouvez pas tout simplement supprimer le ".git" répertoire de la sous-module. Il y a trois liens entre votre dépôt principal et le sous-module:

  1. L' .gitmodules le fichier dans votre repo.
  2. Une entrée dans l' .git/config de votre principal des pensions.
  3. Tout s'engage liées à la sous-module dans votre principal des pensions de l'histoire.

Par cette connexes DONC, la question, vous devez effectuer les étapes suivantes pour supprimer complètement le sous-module:

REMARQUE: Si une autre branche dépend de ce sous-module, puis en retirant il peut corrompre votre dépôt! C'est une opération dangereuse...à utiliser avec prudence.

  1. Supprimer la ligne correspondante de l' .gitmodules le fichier.
  2. Supprimer la section pertinente de .git/config.
  3. Exécutez git rm --cached path_to_submodule (n slash).
  4. S'engager

Les fichiers qui ont été une partie de la sous-module sont maintenant sans traces et vous pouvez décider de conserver ou de les supprimer si vous le souhaitez (avec une mise en garde mentionnées ci-dessous).

Si vous n'avez pas besoin de ces fichiers, vous pouvez tout simplement les supprimer.

Mise en garde: Si vous souhaitez conserver ces fichiers (qui semblent vous voulez), vous devez supprimer manuellement le .git répertoire de la sous-module dossier:

  1. cd path_to_submodule
  2. rm .git
  3. cd ..
  4. git add path_to_submodule
  5. git status
  6. git commit

Mise à JOUR:

La demande pour de plus amples informations:

Pour aider le débogage de ce problème, merci de poster à la sortie de la suite de session complète de commandes:

cd to the top-level directory in your repo
ls -al
cat .git/config
find . -name ".git*"
git status
git add editors
git add shells
git status

Basée sur la description de ce que vous avez fait jusqu'à présent, je m'attends à voir:

  • Pas de .gitmodules le fichier n'importe où
  • Un seul .git répertoire (qui se trouve à la racine de votre repo)
  • Pas de .git - répertoire dans le répertoire editors/vim/vimdoclet
  • Pas de .git - répertoire dans le répertoire shells/smallApps

2voto

Greg Hewgill Points 356191

Je vois que vous avez git add train de dire quelque chose au sujet des sous-modules. Avez-vous des référentiels Git imbriqués? Faire ceci:

 $ find . -name .git
 

Combien de répertoires .git sont répertoriés? S'il y en a plus d'un, vous avez plusieurs référentiels imbriqués, ce qui peut être à l'origine de cette confusion.

2voto

Tim Henigan Points 19948

Vous devriez envisager de poster cette question sur le Git de la liste de courrier (git@vger.kernel.org). Vous obtiendrez probablement plus d'invite et de réponse complète.

Si vous décidez d'y poster, assurez-vous d'inclure:

  • Une description de ce que vous essayez d'atteindre.
  • Une description du problème que vous avez rencontré.
  • Une session complète de journal montrant:
    • cd vers le répertoire de niveau supérieur dans votre pension
    • ls -al
    • cat .git/config
    • find . -name ".git*"
    • git status
    • git add editors
    • git add shells
    • git status

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