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.
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.
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.
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).
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
.