Quelle est la différence entre Git ignorant le répertoire et le répertoire / *?

108

Je ne sais pas quelle est la bonne façon d'ignorer le contenu d'un répertoire dans git.

Supposons que j'ai la structure de répertoires suivante:

my_project  
     |--www  
         |--1.txt  
         |--2.txt
     |--.gitignore

Quelle est la différence entre mettre ceci:

www

Et ça?

www/*

La raison pour laquelle je pose cette question est la suivante: Dans git, si un répertoire est vide, git n'inclura pas ce répertoire vide dans le référentiel. J'essayais donc la solution qui consiste à ajouter un fichier .gitkeep supplémentaire sous le répertoire afin qu'il ne soit pas vide. Quand j'essayais cette solution, si dans le fichier .gitignore, j'écris comme ci-dessous:

www
!*.gitkeep

Cela ne fonctionne pas (mon intention est d'ignorer tout le contenu sous www mais de conserver le répertoire). Mais si j'essaye ce qui suit:

www/* 
!*.gitkeep

Alors ça marche! Je pense donc qu'il doit y avoir des différences entre les deux approches.

Aaron Shen
la source
Une simple différence entre binet bin/est que le premier ignorera les fichiers ou les dossiers, le second uniquement les dossiers. Je ne connais pas la différence avecbin/*
Colonel Panic

Réponses:

203

Il sont les différences entre www, www/et www/*.

Fondamentalement à partir de la documentation et de mes propres tests, wwwtrouvez une correspondance avec un fichier ou un répertoire, www/ne correspond qu'à un répertoire, tandis que www/*correspond aux répertoires et aux fichiers à l'intérieur www.

Je ne discuterai que des différences entre www/et www/*ici, car les différences entre wwwet www/sont évidentes.

Car www/, git ignore le répertoire wwwlui-même, ce qui signifie que git ne regardera même pas à l'intérieur. Mais pour www/*, git vérifie tous les fichiers / dossiers à l'intérieur www, et les ignore tous avec le modèle *. Cela semble conduire aux mêmes résultats puisque git ne suivra pas un dossier vide wwwsi tous ses fichiers / dossiers enfants sont ignorés. Et en effet, les résultats ne seront pas différents pour le cas d'OP avec www/ou www/*autonome. Mais cela fait des différences s'il est combiné avec d'autres règles.

Par exemple, que faire si nous voulons seulement inclure www/1.txtmais ignorer tous les autres à l'intérieur www?

Ce qui suit .gitignorene fonctionnera pas.

www/
!www/1.txt

Alors que ce qui suit .gitignorefonctionne, pourquoi?

www/*
!www/1.txt

Pour le premier, git ignore simplement le répertoire wwwet ne regardera même pas à l'intérieur pour l'inclure à www/1.txtnouveau. La première règle exclut le répertoire parent wwwmais pas www/1.txt, et par conséquent www/1.txtne peut pas être " inclus à nouveau ".

Mais pour ce dernier, git ignore d'abord tous les fichiers / folers sous www, puis inclut à nouveau l'un d'entre eux qui est www/1.txt.

Pour cet exemple, les lignes suivantes de la documentation peuvent aider:

Un préfixe facultatif "!" ce qui annule le modèle; tout fichier correspondant exclu par un modèle précédent sera de nouveau inclus. Il n'est pas possible de ré-inclure un fichier si un répertoire parent de ce fichier est exclu.

Landys
la source
Ne pensez-vous pas que www/1.txtet ensuite www/ferait la même chose que la deuxième approche ...
Naveed Butt
8

Je suis juste en train d'analyser la documentation, et pour autant que je sache, ils ne diffèrent que par des modèles plus avancés, par exemple

$ cat .gitignore
    # exclude everything except directory foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar

Je l'ai fait tester ce qui précède, et si vous remplacez !/fooavec !/foo/*, vous ne en effet obtenir un résultat différent.

Remarque

foo

Exclura tous les fichiers foo, mais

foo/

exclura uniquement les répertoires nommés foo.

Djechlin
la source
3

Outre les réponses parfaitement bonnes que vous avez déjà obtenues, vous devez noter que vous pouvez avoir .gitignoren'importe où dans votre projet, y compris les sous-dossiers.

Donc, si vous voulez ignorer tous les fichiers à l'intérieur www, mais que vous souhaitez que le wwwdossier soit versionné, au lieu d'utiliser un nom vide .gitkeep, .dummyou quel que soit le nom que vous choisissez, pourquoi ne pas utiliser un .gitignorelà, en disant d'ignorer tous les fichiers?

/
|- .gitignore   (a)
\- www
    |- .gitignore   (b)
    |- 1.jpg
    \- 2.jpg

Dans la racine .gitignore(a), vous ne dites rien sur le wwwdossier ou son contenu.

Dans le www/.gitignore(b) vous mettez ce qui suit:

# ignore all files in this folder except this .gitignore
*
!.gitignore

De cette façon, tout semble plus organisé (du moins pour moi).

Carlos Campderrós
la source
1

Pour ignorer tout ce qui se trouve dans un répertoire à l'exception des fichiers dot, vous pouvez utiliser le modèle global suivant dans votre .gitignore:

www/[^.]*

Donc pas besoin de supplément .gitignore, ajoutez simplement un .keepfichier dans votre wwwrépertoire.

Koen.
la source