ignorer tout répertoire 'bin' sur un projet git

1237

J'ai une structure de répertoires comme celle-ci:

.git/
.gitignore
main/
  ...
tools/
  ...
...

À l'intérieur de main et des outils, et de tout autre répertoire, à n'importe quel niveau, il peut y avoir un répertoire «bin», que je veux ignorer (et je veux aussi ignorer tout ce qu'il contient). J'ai essayé chacun de ces modèles en .gitignore mais aucun ne fonctionne:

/**/bin/**/*
/./**/bin/**/*
./**/bin/**/*
**/bin/**/*
*/bin/**/*
bin/**/*
/**/bin/* #and the others with just * at the end too

Quelqu'un peut m'aider? Le premier motif (celui que je pense devrait fonctionner) fonctionne très bien si je fais cela:

/main/**/bin/**/*

Mais je ne veux pas avoir une entrée pour chaque répertoire de niveau supérieur et je ne veux pas avoir à modifier .gitignore chaque fois que j'en ajoute un nouveau.

C'est sur Windows en utilisant le dernier msysgit.

EDIT: encore une chose, il y a des fichiers et des répertoires qui ont la sous-chaîne 'bin' dans leurs noms, je ne veux pas qu'ils soient ignorés :)

Ben Hymers
la source
14
Quelqu'un trouvera probablement aussi utile: si vous avez peu de référentiels et que chacun a le même fichier .gitignore, vous pouvez le placer dans un emplacement "commun" et lancer> git config --global core.excludesfile ~ / .gitignore_global Le dernier paramètre est path à l'emplacement commun. PS Je suis nouveau sur git et je ne sais pas si c'est une recommandation de «meilleure pratique». Alors s'il vous plaît, faites-moi savoir si vous ne voulez pas faire cela. Je vous remercie.
Budda
La **syntaxe semble désormais (mars 2013, git 1.8.2) officiellement documentée: voir ma réponse ci
VonC
2
Si quelqu'un veut lire la version la plus récente de la page de manuel, consultez la page de manuel de gitignore (5) .
option plus conviviale si vous êtes fatigué de lire des essais pour la valeur d'une ligne d'informations atlassian.com/git/tutorials/saving-changes/…
suazithustra

Réponses:

1835

Avant la version 1.8.2, **n'avait pas de signification particulière dans le .gitignore. Depuis 1.8.2, git prend **en charge zéro ou plusieurs sous-répertoires (voir les notes de publication ).

La façon d'ignorer tous les répertoires appelés bin n'importe où en dessous du niveau actuel dans une arborescence de répertoires est avec un .gitignorefichier avec le modèle:

bin/

Dans la manpage, il y a un exemple d'ignorer un répertoire appelé en fooutilisant un modèle analogue.

Edit: Si vous avez déjà des dossiers bin dans votre index git que vous ne souhaitez plus suivre, vous devez les supprimer explicitement. Git n'arrêtera pas de suivre les chemins qui sont déjà suivis simplement parce qu'ils correspondent maintenant à un nouveau .gitignoremodèle. Exécutez une suppression de dossier ( rm ) de l'index uniquement ( --cached ) récursivement ( -r ). Exemple de ligne de commande pour le dossier racine bin:

git rm -r --cached bin
CB Bailey
la source
72
À partir de git 1.8.2, git acceptera **dans les .gitignorefichiers (source: changelog 1.8.2 )
Carlos Campderrós
15
est binla même chose bin/?
Nisba
29
@Nisba, ils sont différents, ignoreront les binfichiers nommés bin, tandis que bin/pour les répertoires nommés bin
Rani Kheir
8
depuis que je suis tombé sur ceci: le nom du dossier dans git-command EST sensible à la casse :) "bin! = Bin" - peut-être que j'épargne quelques minutes à quelqu'un par cette astuce :)
dba
1
Dans Windows10, vous ne pouvez pas créer un fichier .gitignore, vous devez créer un gitignore.txt, puis exécuter ren gitignore.txt .gitignore dans l'invite de commande pour créer ce fichier
minable
463

Le .gitignorerêve semble être:

bin/

au niveau supérieur.

Michael Krelin - pirate
la source
Merci beaucoup pour votre aide, n'oubliez pas de consulter l'exemple des fichiers ignorés: git checkout bin *
Chris Sim
1
mettez-le dans gitignore_global
μολὼν.λαβέ
@GAlexander, pourquoi voudrait-on ignorer globalement les répertoires bin /? Ils ont souvent du contenu versionné. Et ignorer global n'affectera pas les autres utilisateurs du référentiel.
Michael Krelin - pirate
234

Je pense qu'il vaut la peine de mentionner pour les débutants git:

Si vous avez déjà un fichier archivé et que vous souhaitez l'ignorer, Git n'ignorera pas le fichier si vous ajoutez une règle ultérieurement . Dans ces cas, vous devez d'abord dépister le fichier, en exécutant la commande suivante dans votre terminal:

git rm --cached

Donc, si vous voulez ajouter pour ignorer certains répertoires de votre référentiel local (qui existent déjà) après avoir édité .gitignore, vous voulez l'exécuter sur votre répertoire racine

git rm --cached -r .
git add .

Il va essentiellement «rafraîchir» votre dépôt local et supprimer les fichiers ignorés.

Voir:

http://git-scm.com/docs/git-rm ,

https://help.github.com/articles/ignoring-files/

plancys
la source
si je fais habituellement un git add -Asur mes commits, puis-je l'utiliser à la place? et puis-je également remplacer le point par -A sur la première ligne?
ajax333221
69

Le **n'a jamais fonctionné correctement auparavant, mais depuis git 1.8.2 (8 mars 2013) , il semble être explicitement mentionné et pris en charge:

Les modèles dans .gitignoreet les .gitattributesfichiers peuvent avoir **/, comme un modèle qui correspond à 0 ou plusieurs niveaux de sous-répertoire .

Par exemple, " foo/**/bar" correspond à " bar" dans " foo" lui-même ou dans un sous-répertoire de " foo".

Dans votre cas, cela signifie que cette ligne peut désormais être prise en charge:

/main/**/bin/
VonC
la source
46
[Bb]in/

correspond aux majuscules et aux minuscules

wisbucky
la source
2
[B]in/être le seul majuscule
Gank
Comment ne laisser Binignorer que le dossier et laisser binvalider sur git? [B]in/va à la fois commettre Binet bin.
Gank
5
Cela devrait le faire, @Gank: Bin/ !bin/
Marco G
34

Je ne l'ai pas vu mentionné ici, mais cela semble être sensible à la casse. Une fois que je suis passé à / Bin, les fichiers ont été ignorés comme prévu.

Cory
la source
3
Ce n'est pas une réponse à la question d'origine qui était explicitement à propos bin, non Bin.
CB Bailey,
50
Bien que ce ne soit pas une réponse, cela ajoute à l'exhaustivité pour les autres cherchant sur le même problème (moi-même, tout à l'heure).
Jay
25

[Bb]in résoudra le problème, mais ... Voici une liste plus complète de choses que vous devez ignorer (liste d'exemples par GitExtension):

#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.sbr
obj/
[Rr]elease*/
_ReSharper*/
Jaider
la source
3
Note: Des choses comme cela devrait être dans votre GLOBAL gitignore (généralement dans votre répertoire personnel.) Le gitignore du projet ne devrait ignorer les choses spécifiques à votre projet (fichiers .o pour une application C.)
BraveNewCurrency
18

Si vous recherchez un excellent .gitignorefichier global pour n'importe quelle solution Visual Studio (.NET) - je vous recommande d'utiliser celui-ci: https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

AFAIK il a le plus complet .gitignorepour les projets .NET.

Jochen van Wylick
la source
5
Cela ne répond pas vraiment à la question, mais c'est exactement ce que je cherchais.
Dave
18

Étape 1: ajoutez le contenu suivant au fichier .gitignore.

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/

# Visual Studio 2015 cache/options directory
.vs/

Étape 2: assurez-vous de prendre effet

Si le problème persiste, c'est parce que les paramètres de .gitignore ne peuvent ignorer que les fichiers qui n'ont pas été suivis à l'origine . Si certains fichiers ont déjà été inclus dans le système de contrôle de version, la modification de .gitignore n'est pas valide. Pour résoudre complètement ce problème, vous devez ouvrir Git Bash ou la console du gestionnaire de packages (voir capture d'écran ci-dessous) pour exécuter les commandes suivantes dans le dossier racine du référentiel.

$ git rm -r --cached .
$ git add .
$ git commit -m 'Update .gitignore'

Console PM Ensuite, le problème sera complètement résolu.

Bravo Yeung
la source
8

Littéralement, aucune des réponses n'a vraiment fonctionné pour moi; le seul qui a fonctionné pour moi était (sous Linux):

**/bin
(yes without the / in the end)

git version 2.18.0 
AnthonyC
la source
Cela a-t-il également ignoré tous les dossiers nommés bindans les sous-répertoires?
vineeshvs
5

À titre d'avis;

Si vous pensez que .gitignorecela ne fonctionne pas d'une manière (donc ajouté un foo/*dossier mais git statusen montrant toujours le contenu du dossier comme modifié ou quelque chose comme ça), alors vous pouvez utiliser cette commande;

git checkout -- foo/*

K-Gun
la source
3

pour 2.13.3 et les versions ultérieures, écrire uniquement bin dans votre fichier .gitignore devrait ignorer le bin et tous ses sous-répertoires et fichiers

poubelle

Nikhil Karanjkar
la source
2

L'ajout de ** / bin / au fichier .gitignore a fait l'affaire pour moi (Remarque: le dossier bin n'a pas été ajouté à l'index).

Dhwaneel
la source
1

Si le motif à l'intérieur .gitignorese termine par une barre oblique/ , il ne trouvera une correspondance qu'avec un répertoire.

En d'autres termes, bin/correspondra à un répertoire binet à des chemins en dessous, mais ne correspondra pas à un fichier normal ou à un lien symbolique bin.


Si le motif ne contient pas de barre oblique , comme dans binGit, il le traite comme un motif de glob de shell (gourmand). Le mieux serait donc d’utiliser/bin .

bin ne serait pas la meilleure solution pour ce problème particulier.

prosti
la source
Voulez-vous dire «commencer par» un /?
Vineeshvs
0

Dans mon cas, l'encodage du fichier gitignore était problématique, vérifiez s'il est UTF-8

Jacek Plesnar
la source