Quelles sont les différences entre .gitignore et .gitkeep?

1927

Quelles sont les différences entre .gitignoreet .gitkeep? S'agit-il de la même chose avec un nom différent, ou remplissent-ils tous les deux une fonction différente?

Je ne semble pas pouvoir trouver beaucoup de documentation sur .gitkeep.

Matty
la source

Réponses:

3443

.gitkeep n'est pas documenté, car ce n'est pas une fonctionnalité de Git.

Git ne peut pas ajouter un répertoire complètement vide . Les personnes qui souhaitent suivre les répertoires vides dans Git ont créé la convention de placer les fichiers appelés .gitkeepdans ces répertoires. Le fichier peut s'appeler n'importe quoi; Git n'accorde aucune signification particulière à ce nom.

Il existe une convention concurrente consistant à ajouter un .gitignorefichier aux répertoires vides pour les suivre, mais certaines personnes voient cela comme déroutant car le but est de conserver les répertoires vides, pas de les ignorer; .gitignoreest également utilisé pour répertorier les fichiers qui devraient être ignorés par Git lors de la recherche de fichiers non suivis.

Wooble
la source
414
Ne serait-il pas préférable de placer un READMEfichier dans le sous-répertoire par ailleurs vide qui contient un peu d'informations sur l'utilisation de ce sous-répertoire? Cela semble déroutant d'avoir un fichier appelé .gitkeepqui ne fait pas réellement partie de git.
tamouse
423
@tamouse plusieurs fois, le chemin du répertoire vide (par exemple les noms des dossiers) est suffisant pour exprimer sa fonction (exemples: modèles / cache, upload / thumbs etc.). Dans ces cas, mettre un fichier Lisez-moi dans chacun d'eux semble redondant.
Halil Özgür
16
les personnes qui souhaitent garder une trace des répertoires vides doivent indiquer dans un fichier README que le répertoire doit être créé ou créer les répertoires à l'aide de leur outil de construction ou de tout outil nécessitant que le répertoire existe; /
32
@tamouse, @omouse: Un .gitignorefichier avec deux lignes: *et !.gitignoreest plus que suffisamment clair pour transmettre ce qui se passe. Si plus d'élaboration est nécessaire, ajoutez un commentaire en haut du fichier en utilisant la # syntaxe.
Droogans
63
Il convient de noter que le framework Rails populaire a légèrement modifié cette convention en utilisant des .keepfichiers au lieu de .gitkeepconserver ces dossiers vides, car git n'est pas le seul système de contrôle de source qui ne suit pas les dossiers vides. Plus de détails ici: github.com/rails/rails/issues/2800
Claudio Floreani
330

.gitkeepest juste un espace réservé. Un fichier factice, donc Git n'oubliera pas le répertoire, car Git ne suit que les fichiers.


Si vous voulez un répertoire vide et assurez-vous qu'il reste «propre» pour Git, créez un .gitignorecontenant les lignes suivantes dans:

# .gitignore sample
###################

# Ignore all files in this dir...
*

# ... except for this one.
!.gitignore

Si vous souhaitez qu'un seul type de fichiers soit visible par Git, voici un exemple de filtrage de tout, à l'exception de .gitignore et de tous les .txtfichiers:

# .gitignore to keep just .txt files
###################################

# Filter everything...
*

# ... except the .gitignore...
!.gitignore

# ... and all text files.
!*.txt

('#' indique des commentaires.)

sjas
la source
3
J'aime moi-même cette pratique. S'il y avait du code source dans ces répertoires, il n'y aurait pas besoin de .gitkeep et en général c'est du contenu temporaire / cache / utilisateur qui pendant le test serait généré de toute façon, vous obligeant à devoir également .gitignore ces fichiers
chrisan
1
Pourquoi avez-vous besoin !devant .gitignore? Est-ce pour échapper au point?
Will
7
@Will - Non, le !nie la partie suivante, comme il le fait habituellement en programmation.
sjas
3
Il n'y a pas besoin de mettre !.gitignoredans un fichier git ignorer, soit ajouter le fichier puis le modifier, ou la force ajouter avec le contenu approprié ( « * » pour ignorer tout ou rien à faire simplement que le dossier existe) autre exemple .
AD7six
13
À partir de votre lien: Since the git ignore file is already in the repo it is not necessary to not-ignore it - it is already tracked.------ Si ce n'est pas le cas, et que vous n'effectuez pas un ajout forcé, vous pouvez l'oublier. Dans les cas triviaux, pas de problème, mais s'il s'agit d'un fichier plus volumineux, vous pourriez être contrarié. L'utilisation !.gitignorevous empêche de vous tirer une balle dans le pied. Je le préfère, après m'être brûlé par le passé.
sjas
125
.gitignore

est un fichier texte comprenant une liste de fichiers dans votre répertoire que git ignorera ou n'ajoutera pas / mettra à jour dans le référentiel.

.gitkeep

Étant donné que Git supprime ou n'ajoute pas de répertoires vides à un référentiel, .gitkeep est une sorte de hack (je ne pense pas qu'il soit officiellement nommé comme faisant partie de Git) pour conserver des répertoires vides dans le référentiel.

Faites simplement un touch /path/to/emptydirectory/.gitkeeppour ajouter le fichier, et Git sera désormais en mesure de maintenir ce répertoire dans le référentiel.

Jim Munro
la source
18
Vous pouvez avoir autant de .gitignores que vous le souhaitez, si vous ne souhaitez pas spécifier le chemin d'accès complet à chaque dossier à chaque fois.
sjas
1
J'essaie de mentionner la liste des répertoires vides dans le .gitkeepfichier, mais il ne suivra pas les répertoires vides, seule la piste du dossier où le .gitkeepfichier existe. pourquoi
Pardeep Jain
2
.gitkeep ne fonctionne pas comme .gitignore. Ce n'est pas une liste de répertoires à conserver. Il s'agit simplement d'un fichier vide qui réside dans le répertoire que vous souhaitez conserver. Il peut être nommé comme vous voulez .keep, etc. Vous pouvez donc avoir un répertoire comme / foo / bar et le fichier gitkeep sera /foo/bar/.gitkeep
Jim Munro
@sjas comment le fait d'avoir plusieurs .gitignores vous éviterait- il de spécifier le chemin complet vers chaque dossier à chaque fois? Je pense que je manque quelque chose d'évident.
Willwsharp