web-dev-qa-db-fra.com

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

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: dans git, si un répertoire est vide, git n'inclura pas un tel répertoire vide dans le référentiel. J'essayais donc la solution qui consiste à ajouter un fichier .gitkeep supplémentaire dans le répertoire afin qu'il ne soit pas vide. Lorsque 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 quelques différences entre les deux approches.

108
Aaron Shen

Il existe des différences entre www, www/ et www/*.

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

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

Pour www/, git ignore le répertoire www lui-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 de 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 www si tous ses fichiers/dossiers enfants sont ignorés. Et en effet, les résultats ne feront aucune différence 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 inclure uniquement www/1.txt mais ignorer tous les autres contenus à l'intérieur www?

Le suivant .gitignore ne fonctionnera pas.

www/
!www/1.txt

Alors que les .gitignore fonctionne, pourquoi?

www/*
!www/1.txt

Pour les premiers, git ignore simplement le répertoire www, et ne cherchera même pas à l'intérieur pour inclure www/1.txt encore. La première règle exclut le répertoire parent www mais pas www/1.txt, et comme résultat www/1.txt ne peut pas être " inclus à nouveau ".

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

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

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

199
Landys

Je suis 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

I did testez ce qui précède, et si vous remplacez !/foo avec !/foo/*, vous obtenez en effet un résultat différent.

Remarque

foo

Exclura tout fichier foo, mais

foo/

exclura uniquement les répertoires nommés foo.

8
djechlin

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

Donc, si vous voulez ignorer tous les fichiers à l'intérieur de www, mais que vous souhaitez que le dossier www soit versionné, au lieu d'utiliser un .gitkeep, .dummy Ou autre chose vide nom que vous choisissez, pourquoi ne pas utiliser un .gitignore là-bas, 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 dossier www 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).

3
Carlos Campderrós

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

www/[^.]*

Donc pas besoin d'un supplément .gitignore, ajoutez simplement un .keep fichier dans votre répertoire www.

1
Koen.