web-dev-qa-db-fra.com

Impossible de suivre les fichiers dans les sous-modules Git

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

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

Je cours

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

Je note que je n'ai pas les fichiers "shells/smallApps/*" sur mon Git

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

Je veux les ajouter à mon Git en exécutant

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

Je note que les fichiers ne sont pas ajoutés à mon Git pour une raison telle que

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

Je n'ai pas les fichiers dans .git/info/exclude ni dans .gitignore -files.

Que signifie le dernier avertissement?

[~ # ~] mise à jour [~ # ~]

Il y a deux raisons générales pour lesquelles Git ignorera un fichier: gitignore et submodules .

Pour être plus précis, les conditions suivantes obligeront Git à ignorer un fichier lorsque "git add" Est invoqué:

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

Forcer 'git add' Sur un fichier ignoré:

Vous pouvez vérifier si un fichier particulier est ignoré en appelant 'git add full/path/to/file'.

La page de manuel indique que "Si un fichier ignoré est explicitement 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 une référence de sous-module:

Comme indiqué dans une réponse précédente, 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 du sous-module à partir du projet principal.

Si vous souhaitez supprimer la référence du sous-module et suivre directement les fichiers dans votre référentiel principal, plusieurs étapes doivent être effectuées. Vous ne pouvez pas simplement supprimer le répertoire ".git" du sous-module. Il existe trois liens entre votre référentiel principal et le sous-module:

  1. Le fichier .gitmodules Dans votre référentiel principal.
  2. Une entrée dans le .git/config De votre référentiel principal.
  3. Tout commit lié au sous-module dans votre historique de repo principal.

Par cela connexe SO 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, sa suppression peut corrompre votre référentiel! C'est une opération dangereuse ... à utiliser avec prudence.

  1. Supprimez la ligne appropriée du fichier .gitmodules.
  2. Supprimez la section appropriée de .git/config.
  3. Exécutez git rm --cached path_to_submodule (Pas de barre oblique de fin).
  4. Commettre

Les fichiers qui faisaient partie du sous-module ne sont plus suivis et vous pouvez décider de les conserver ou de les supprimer comme vous le souhaitez (avec la seule mise en garde mentionnée ci-dessous).

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

Avertissement: Si vous souhaitez conserver ces fichiers (que vous semblez vouloir), vous devez supprimer manuellement le répertoire .git Du 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:

Demande d'informations complémentaires:

Pour aider au débogage de ce problème, veuillez publier la sortie de la session complète de commandes suivante:

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

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

  • Aucun fichier .gitmodules N'importe où
  • Un seul répertoire .git (Trouvé à la racine de votre dépôt)
  • Aucun répertoire .git Dans editors/vim/vimdoclet
  • Aucun répertoire .git Dans shells/smallApps
99
Tim Henigan

Je vois que tu as git add dire quelque chose sur les sous-modules. Avez-vous des référentiels Git imbriqués? Faites ceci:

$ find . -name .git

Combien .git les répertoires sont-ils répertoriés? S'il y en a plusieurs, vous disposez de plusieurs référentiels imbriqués et cela pourrait être à l'origine d'une partie de cette confusion.

2
Greg Hewgill

Vous devriez envisager de publier cette question dans la liste de diffusion Git ([email protected]). Vous obtiendrez probablement une réponse plus rapide et complète.

Si vous décidez de poster là-bas, assurez-vous d'inclure:

  • Une description de ce que vous essayez de réaliser.
  • Une description du problème que vous avez rencontré.
  • Un journal de session complet montrant:
    • cd dans le répertoire de niveau supérieur de votre référentiel
    • ls -al
    • cat .git/config
    • find . -name ".git*"
    • git status
    • git add editors
    • git add shells
    • git status
2
Tim Henigan