Ignorez-vous un sous-module git dans votre .gitignore ou le validez-vous dans votre dépôt?

94

J'ai ajouté un sous - module à mon projet en project_dir/vendor/submodule_onemaintenant chaque fois que je lance que git statusje reçois modified: vendor/submodule_one (new commits).

Ma question est quelle est la meilleure façon de traiter cela? Dois-je ajouter le vendor/submodule_one-folder à mon .gitignorecar mon projet principal ne devrait pas avoir besoin de connaître les spécificités de mon sous-module?

Ou lorsque je change et que je valide des modifications dans mon sous-module, dois-je également faire des commits dans mon projet principal?

Je ne fais que commencer avec les sous-modules et ne semble pas trouver beaucoup d'informations au-delà de leur configuration.

Sprysoft
la source

Réponses:

81

Non, vous n'avez pas besoin d'ajouter votre sous-module à votre .gitignore: ce que le parent verra de votre sous-module est un gitlink (une entrée spéciale,mode 160000 ).

Cela signifie: toute modification effectuée directement dans un sous-module doit être suivie d'un commit dans le répertoire parent.
De cette façon, le répertoire parent enregistrera le bon commit pour l'état du sous-module: Ce commit est le "gitlink" mentionné ci-dessus;

Vous pouvez en savoir plus sur cette politique dans " git submodule update (vraie nature des sous-modules) ".
L'idée principale des sous-modules est une approche basée sur les composants , dans laquelle vous référencez d'autres dépôts à des commits spécifiques. Mais si vous modifiez quelque chose dans ces sous-modules, vous devez également mettre à jour ces références dans le référentiel parent.


Notez qu'avec Git 2.13 (Q2 2017), sans ignorer le gitlink, vous pouvez toujours ignorer le sous-module avec:

git config submodule.<name>.active false

Pour en savoir plus, consultez " Ignorer les nouveaux commits pour le sous-module git ".


Remarque: avec Git 2.15.x / 2.16 (Q1 2018), ignorer un sous-module est plus précis.
" git status --ignored --untracked" ne s'est pas arrêté à une arborescence de travail d'un projet séparé qui est incorporé dans un répertoire ignoré et des fichiers répertoriés dans cet autre projet, au lieu de simplement afficher le répertoire lui-même comme ignoré.

Voir commit fadb482 (25 octobre 2017) par Johannes Schindelin ( dscho) .
(Fusionné par Junio ​​C Hamano - gitster- dans commit da7996a , 06 novembre 2017)

status: ne vous laissez pas confondre par les sous-modules dans les répertoires exclus

Nous transmettons méticuleusement le excludedrapeau à la treat_directory()fonction afin de pouvoir indiquer que les fichiers qu'elle contient sont exclus plutôt que non suivis lors de la récurrence.

Mais nous n'avons pas encore traité les sous-modules de la même manière.

Pour cette raison, git status --ignored --untrackedavec un sous-module submoduledans un gitignored tracked/afficherait le sous-module dans la Untracked filessection " ", par exemple

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

Au lieu de cela, nous voudrions qu'il affiche le sous-module dans la Ignored filessection " ":

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/
VonC
la source
1
Merci VonC, c'est parfaitement logique quand vous le mettez comme ça.
sprysoft
8
Cette réponse est déroutante car le titre de la question demande s'il faut ignorer les dossiers de sous-modules ou non, et vous répondez par oui à une question distincte plus loin dans le corps de la question.
SgtPooki
1
Je pense que cela a beaucoup plus de sens maintenant et que cela fournit des informations détaillées très utiles. Génial, merci pour la mise à jour :)
SgtPooki
Argument pour .gitignore: Pourquoi archiver le fichier .gitsubmodules alors que l'url qu'il contient pourrait éventuellement contenir une url git spécifique à l'utilisateur avec un paramètre de nom d'utilisateur?
djangofan
1
@djangofan la question (et ma réponse) consistait à ignorer le dossier du sous-module lui-même (celui représentant par un gitlink). Pas pour ignorer le .gitmodulesfichier. Il est vrai que ce fichier (le .gitmodules) peut inclure des informations d'identification, mais s'il est utilisé uniquement pour cloner des dépôts publics, il n'a pas à les inclure. De plus, ils peuvent quand même être mis en cache, même sous Windows, avec des aides d'identification comme le «Git Credential Manager for Windows» ( github.com/Microsoft/Git-Credential-Manager-for-Windows/… ). Donc, avoir des informations d'identification dans le .gitmodulesn'est pas une fatalité.
VonC
8

Pour une raison quelconque, submodule.module-name.active ne fonctionnait pas pour moi.

C'est pourquoi j'ai utilisé submodule.module-name.ignore

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules - vous trouverez ici une description des valeurs possibles pour le paramètre

Fonctionne pour moi pour les messages (nouveaux commits) et (contenu modifié).

Vladimir
la source
1

Pour ajouter à la réponse acceptée, j'ai constaté que l'ajout du dossier de sous-module Git à .gitignore causait en fait des problèmes - en particulier lorsque vous essayez de créer un nouveau clone du projet. Plus précisément, l'exécution des commandes de clonage de sous-module normales entraînait le vide du dossier du sous-module:

git submodule init
git submodule update
git pull --recurse-submodules

Seulement en essayant de réexécuter

git submodule add <Git repo> <submodule folder>

il était clair quel était le problème, en fonction du résultat:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

Au lieu d'ajouter -f, j'ai supprimé le dossier du sous-module Git de .gitignore et relancé les commandes de clonage du sous-module - qui ont maintenant créé le dossier avec succès. Je pense qu'il peut y avoir un bogue dans le fait qu'une des commandes de clonage de sous-module respecte .gitignore mais ne prévient pas qu'elle saute un sous-module en conséquence.

Woodz
la source