Comment faire pour que Git ignore les fichiers sans utiliser .gitignore?

133

En raison de contraintes externes étranges, je ne peux pas modifier le .gitignorede mon référentiel. Existe-t-il un moyen d'ignorer les fichiers et répertoires autre que la modification d'un .gitignore? Même si c'est une solution globale comme une configuration globale qui sera appliquée à tous mes référentiels.

pupeno
la source

Réponses:

179

N'oubliez pas, selon gitignore , qu'il existe un ordre de priorité dans les différentes "sources de motif ignorées" que Git considère:

  • Les modèles lus à partir de la ligne de commande pour les commandes qui les prennent en charge.
  • Modèles lus à partir d'un fichier .gitignore dans le même répertoire que le chemin, ou dans n'importe quel répertoire parent, les modèles des fichiers de niveau supérieur (jusqu'à la racine) étant remplacés par ceux des fichiers de niveau inférieur jusqu'au répertoire contenant le fichier.
  • Modèles lus à partir de $GIT_DIR/info/exclude.
  • Modèles lus à partir du fichier spécifié par la variable de configuration core.excludesfile.

Les deux derniers peuvent être une solution à votre problème mais:

  • ils ne sont pas répliqués pour un référentiel distant
  • ils peuvent avoir leurs modèles remplacés par les autres sources

(Voir aussi cette question SO )


Les deux autres solutions impliquent la mise à jour de l'index ( git update-index):

Cependant, lorsque vous extrayez une autre branche ou lorsque vous git pull, ce statut «ignorer» peut être réinitialisé. D'où l'autre option:

La différence entre les deux est expliquée dans " Git - Différence entre ' assume-unchanged' et ' skip-worktree' ".

VonC
la source
Vous pouvez utiliser update-index --assume-unchanged@see stackoverflow.com/a/25253144/292408
Elijah Lynn
1
@ElijahLynn bien sûr. Vous avez également update-index --skip-work-tree. J'ai jave édité la réponse pour ajouter des liens vers d'anciennes réponses illustrant ces deux update-indexcommandes.
VonC
141

Si vous pouvez modifier, .git/info/excludevous pouvez y mettre les mêmes règles. Mais ce fichier se trouve uniquement dans votre dépôt local.

Ólafur Waage
la source
Il semble que ce soit probablement votre meilleur pari; vous permet d'exclure des fichiers de votre référentiel local.
Abizern
1
Comment cela fonctionne-t-il avec les sous-modules? Il n'y a pas de .gitrépertoire dans un sous-module ...
zakdances
10
@yourfriendzak dans le .gitdossier d' un sous-module parent_repo/.git/modules/submodule_name. Alors tu éditeraisparent_repo/.git/modules/submodule_name/info/exclude
Kara Brightwell
25

Il existe trois façons d'indiquer à GIT quels fichiers ignorer:

  • .gitignore des dossiers
  • $GIT_DIR/.git/info/exclude
  • Fichiers pointés via le core.excludesfileparamètre

Les deux derniers points pourraient résoudre votre problème.

Pour plus d'informations, consultez gitignore (5) .

Ferdinand Beyer
la source
5

Si vous souhaitez simplement avoir des fichiers locaux dans le référentiel et que l'emplacement du sous-répertoire est flexible, vous pouvez placer vos fichiers tracked_dir1/tracked_dir2/untracked_dir/, puis en ajouter un tracked_dir1/tracked_dir2/untracked_dir/.gitignoreavec un contenu comme:

*

C'est à dire

$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
*
<Ctrl+D>
David Winiecki
la source
4

J'ai été dans des situations similaires, alors j'ajoute ma solution préférée que je ne vois pas mentionnée. Le problème git update-index --assume-unchangeddans ce cas est que vous ne pouvez pas faire cela pour un fichier non suivi. Tu as dit

Je ne peux pas modifier le .gitignore de mon référentiel.

Je vais supposer que ce que vous voulez dire, c'est que vous ne pouvez pas pousser de changements .gitignoreà l'origine. Si tel est le cas, ce que vous pouvez faire est d'ajouter le fichier non suivi à votre local .gitignore, puis faites de git update-index --assume-unchanged .gitignoresorte que votre modification en .gitignorene soit jamais poussée. Vous ignorez maintenant le fichier (éventuellement) non suivi et n'affectez pas le .gitignorefichier distant .

Tony
la source
3

Ignorer les modifications locales apportées aux fichiers suivis: git update-index --assume-unchanged my-file.php

Ne pas ignorer les modifications locales apportées aux fichiers suivis: git update-index --no-assume-unchanged my-file.php

la source: git help update-index

--[no-]assume-unchanged
           ...
           This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked
           files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to
           modify this file in the index e.g. when merging in a commit; thus, in case the assumed-untracked file is
           changed upstream, you will need to handle the situation manually.
Elijah Lynn
la source
1

Autrement:

  • modifier local .gitignore
  • puis git update-index --assume-unchanged .gitignore
langpavel
la source