web-dev-qa-db-fra.com

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

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

113
pupeno

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

  • Les modèles sont lus à partir de la ligne de commande pour les commandes qui les prennent en charge.
  • Les modèles sont lus à partir d'un fichier .gitignore dans le même répertoire que le chemin d'accès 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 dans le 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 ceci SO question )


Les deux autres solutions consistent à mettre à jour l'index ( git update-index ):

Cependant, lorsque vous extrayez une autre succursale ou lorsque vous git pull, cet état "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 ' ".

155
VonC

Si vous pouvez modifier .git/info/exclude vous pouvez y mettre les mêmes règles. Mais ce fichier se trouve uniquement dans votre référentiel local.

121
Ólafur Waage

Il existe trois façons de dire à GIT quels fichiers ignorer:

  • Fichiers .gitignore
  • $ GIT_DIR/.git/info/exclude
  • Fichiers pointés via le core.excludesfile réglage

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

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

20
Ferdinand Beyer

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 dans tracked_dir1/tracked_dir2/untracked_dir/ puis ajoutez un tracked_dir1/tracked_dir2/untracked_dir/.gitignore avec un contenu comme:

*

C'est à dire.

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

J'ai été dans des situations similaires, donc j'ajoute ma solution préférée que je ne vois pas mentionnée. Le problème avec git update-index --assume-unchanged Dans 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 vous voulez dire que vous ne pouvez pas pousser les modifications de .gitignore Vers Origin. Si tel est le cas, vous pouvez ajouter le fichier non suivi à votre .gitignore Local, puis faire git update-index --assume-unchanged .gitignore Pour que votre changement en .gitignore Ne soit jamais poussé. Vous ignorez maintenant le fichier (éventuellement) non suivi et n'affectez pas le fichier distant .gitignore.

2
Tony

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

Annuler les modifications locales des 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.
1
Elijah Lynn

Autrement:

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

Vous pouvez utiliser la méthode globale gitignore au lieu de modifier celle du projet https://help.github.com/articles/ignoring-files/#create-a-global-gitignore

0
frazras