Gibt es eine Möglichkeit, git anzuweisen, nur bestimmte Dateien einzuschließen, anstatt bestimmte Dateien zu ignorieren?

164

Meine Programme generieren im Allgemeinen riesige Ausgabedateien (~ 1 GB), die ich nicht im Git-Repository sichern möchte. Also anstatt es zu können

git add .

Ich muss so etwas tun

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

das ist ein bisschen umständlich ...

Ich bin mir ziemlich sicher, dass ich ein schnelles Perl-Skript für den Verzeichnisinhalt in .gitignore schreiben und dann Dateien entfernen kann, die auf einer .gitinclude-Datei (oder einem ähnlichen Namen) basieren, aber das scheint etwas zu hackig. Gibt es einen besseren Weg?

Daisy Sophia Hollman
quelle

Antworten:

230

Ich musste das nicht selbst ausprobieren, aber nach meiner Lektüre von TFM sieht es so aus, als würde ein negiertes Muster tun, was Sie wollen. Sie können Einträge in .gitignore mit später negierten Einträgen überschreiben. So könnten Sie etwas tun wie:

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

Damit es alle .c-Dateien außer custom.c und alles, was mit "frob_" beginnt, ignoriert.

TED
quelle
20
Danke, TED Das hat funktioniert. Alles, was ich tun musste, war, die .gitignore-Datei mit * zu starten und dann alle meine enthaltenen Dateimuster mit einem Ausrufezeichen aufzulisten.
Daisy Sophia Hollman
8
Wie wäre es mit Ordnern? Ich kann keine Möglichkeit finden, Ordner und Dateien durch Negieren einer Regel einzuschließen.
Marcio Cruz
4
Informationen zu
uzsolt
2
Sehr schön. Ich benutze dies, um ein Repository in meinem Home-Ordner für Dinge wie vimrc und bashrc zu haben
Martin Capodici
1
@uzsolt funktioniert nicht, wenn Sie einen bestimmten Ordner einschließen möchten. siehe stackoverflow.com/questions/987142/…
DiCaprio
73

Erstellen Sie eine Gitignore-Datei in Ihrem Repository, und Sie möchten nur c-Dateien verfolgen und alle anderen Dateien ignorieren. Fügen Sie dann die folgenden Zeilen hinzu.

*
!*.c

'*' ignoriert alle Dateien

und ! wird negieren Dateien zu ignorieren sein .... also hier bitten wir git c-Dateien nicht zu ignorieren ....

Vineel Kumar Reddy
quelle
Benötigen Sie auch .*versteckte Dateien?
Trusktr
2
Das *ist sogar ein Platzhalter für ., daher werden versteckte Dateien ebenfalls ignoriert, aber dann werden alle versteckten Dateien eingeschlossen, die auf enden .c.
Rohmer
2
Mit dieser Methode werden meiner Meinung nach auch Dateien aus Unterordnern ignoriert. Überprüfen Sie dies für weitere Details stackoverflow.com/a/11853075/739436
Stelian
1
Ich habe diese Methode in meinem Home-Verzeichnis verwendet, um nur meine .bashrc- und .bash_history zu verfolgen, z. B. *gefolgt von !.bash*der .gitignore-Datei
user5359531
1
Möglicherweise benötigen Sie *.*auf Windows - siehe die Antwort von @Smaranjit Maiti
Martin Capodici
13

Die beste Lösung, um dies zu erreichen

erstellen .gitignoreDatei im Repository root, und wenn Sie einschließen möchten .cDatei , dann müssen Sie unten Zeilen hinzuzufügen .gitignoreDatei

*.*
!*.c

Dies schließt alle .cDateien aus dem Verzeichnis und dem Unterverzeichnis rekursiv ein.

mit

*
!*.c

funktioniert nicht auf allen Versionen von Git.

Getestet am

Git Version 2.12.2.windows.2

Smaranjit
quelle
2
Ja, ich hatte das gleiche Problem mit *und musste verwenden *.*. Dies ist unter Windows mit Gitbash und Git Version 2.9.0.windows.1
Martin Capodici
2

Wenn Sie Dateien ignorieren müssen, aber keine bestimmte Datei in einem Verzeichnis, habe ich Folgendes getan:

# 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
quelle
0

Spät zur Party, aber meine Lösung wäre, ein Verzeichnis für Quelldateien und ein anderes Verzeichnis für ausführbare Dateien und Programmausgaben zu haben, ungefähr so:

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

... und dann nur das Zeug src/zu meinem Repository hinzufügen und bin/ganz ignorieren .

Christian Severin
quelle