Existe-t-il un moyen de dire à git de n'inclure que certains fichiers au lieu d'ignorer certains fichiers?

166

Mes programmes génèrent généralement d'énormes fichiers de sortie (~ 1 Go) que je ne veux pas sauvegarder dans le référentiel git. Donc au lieu de pouvoir faire

git add .

Je dois faire quelque chose comme

git add *.c *.cc *.f *.F *.C *.h *.cu

ce qui est un peu encombrant ...

Je suis assez confiant que je pourrais écrire un script perl rapide pour le contenu du répertoire dans .gitignore, puis supprimer des fichiers basés sur un fichier .gitinclude (ou un nom similaire), mais cela semble un peu trop hackish. Y a-t-il un meilleur moyen?

Daisy Sophia Hollman
la source

Réponses:

233

Je n'ai pas eu besoin d'essayer cela moi-même, mais d'après ma lecture de TFM, il semble qu'un modèle annulé ferait ce que vous voulez. Vous pouvez remplacer les entrées dans .gitignore par des entrées annulées ultérieurement. Ainsi, vous pouvez faire quelque chose comme:

*.c
!frob_*.c
!custom.c

Pour qu'il ignore tous les fichiers .c sauf custom.c et tout ce qui commence par "frob_"

TED
la source
20
Merci, TED. Cela a fonctionné. Tout ce que j'avais à faire était de démarrer le fichier .gitignore avec *, puis de lister tous mes modèles de fichiers inclus, suivis d'un point d'exclamation.
Daisy Sophia Hollman
8
Et les dossiers? Je ne trouve pas un moyen d'inclure des dossiers et des fichiers à l'intérieur en annulant une règle.
Marcio Cruz
4
À propos des dossiers, veuillez consulter stackoverflow.com/questions/12799855/…
uzsolt
2
très agréable. J'utilise ceci pour avoir un référentiel dans mon dossier personnel pour des choses comme vimrc et bashrc
Martin Capodici
1
@uzsolt ne fonctionne pas si vous souhaitez inclure un dossier spécifique. voir stackoverflow.com/questions/987142/…
DiCaprio
73

créez un fichier .gitignore dans votre référentiel et vous souhaitez suivre uniquement les fichiers c et ignorer tous les autres fichiers, puis y ajouter les lignes suivantes ....

*
!*.c

'*' ignorera tous les fichiers

et ! va nier les fichiers à ignorer .... donc ici nous demandons à git de ne pas ignorer les fichiers c ....

Vineel Kumar Reddy
la source
Avez-vous également besoin .*de fichiers cachés?
trusktr
2
Le *est un caractère générique même pour ., donc les fichiers cachés sont également ignorés, mais tous les fichiers cachés se terminant par .csont inclus.
Rohmer
2
En utilisant cette méthode, je pense que les fichiers des sous-dossiers sont également ignorés. Vérifiez ceci pour plus de détails stackoverflow.com/a/11853075/739436
Stelian
1
J'ai utilisé cette méthode dans mon répertoire personnel pour suivre uniquement mon .bashrc et .bash_history, par exemple, *suivis par !.bash*le fichier
.gitignore
1
Vous pourriez avoir besoin *.*sur Windows - voir la réponse par @Smaranjit Maiti
Martin Capodici
13

La meilleure solution pour y parvenir

créer un .gitignorefichier dans le référentiel root, et si vous souhaitez inclure uniquement le .cfichier, vous devez ajouter les lignes ci-dessous au .gitignorefichier

*.*
!*.c

cela inclura tous les .cfichiers du répertoire et du sous-répertoire de manière récursive.

en utilisant

*
!*.c

ne fonctionnera pas sur toutes les versions de git.

Testé sur

git version 2.12.2.windows.2

Smaranjit
la source
2
Oui, j'ai eu le même problème *et j'ai dû l' utiliser *.*. Ceci est sur Windows en utilisant gitbash et git version 2.9.0.windows.1
Martin Capodici
2

Si vous devez ignorer des fichiers mais pas un fichier spécifique dans un répertoire, voici comment je l'ai fait:

# Ignore everything under "directory"
directory/*
# But don't ignore "another_directory"
!directory/another_directory
# But ignore everything under "another_directory"
directory/another_directory/*
# But don't ignore "file_to_be_staged.txt"
!directory/another_directory/file_to_be_staged.txt
gzfrancisco
la source
0

En retard à la fête, mais ma solution serait d'avoir un répertoire pour les fichiers source et un répertoire différent pour les exécutables et la sortie du programme, quelque chose comme ceci:

+ .git
|    (...)
+ bin
|    my_exe.exe
|    my_output.txt
+ src
     some_file.c
     some_file.h 

... puis n'ajoutez que le contenu src/à mon référentiel et ignorez bin/complètement.

Christian Severin
la source