Czy istnieje sposób, aby powiedzieć gitowi, aby zawierał tylko określone pliki, zamiast ignorować niektóre pliki?

165

Moje programy generalnie generują ogromne pliki wyjściowe (~ 1 GB), których nie chcę tworzyć kopii zapasowej w repozytorium git. Więc zamiast być w stanie to zrobić

git add .

Muszę zrobić coś takiego

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

co jest trochę uciążliwe ...

Czuję się dość pewny, że mógłbym napisać szybki skrypt w Perlu ls zawartość katalogu do .gitignore, a następnie usunąć pliki oparte na pliku .gitinclude (lub podobnej nazwie), ale wydaje się to trochę zbyt hakerskie. Czy jest lepszy sposób?

Daisy Sophia Hollman
źródło

Odpowiedzi:

231

Nie musiałem sam tego próbować, ale z mojego czytania TFM wygląda na to, że zanegowany wzór zrobiłby to, co chcesz. Możesz zastąpić wpisy w .gitignore później zanegowanymi wpisami. W ten sposób możesz zrobić coś takiego:

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

Aby ignorował wszystkie pliki .c z wyjątkiem custom.c i wszystkiego, co zaczyna się od „frob_”

PRZETRZĄSAĆ
źródło
20
Dzięki, TED. To zadziałało. Wszystko, co musiałem zrobić, to uruchomić plik .gitignore od *, a następnie wyświetlić listę wszystkich dołączonych wzorców plików, poprzedzonych wykrzyknikiem.
Daisy Sophia Hollman
8
A co z folderami? Nie mogę znaleźć sposobu na umieszczenie folderów i plików wewnątrz, negując regułę.
Marcio Cruz
4
Jeśli chodzi o foldery, sprawdź stackoverflow.com/questions/12799855/ ...
uzsolt
2
bardzo dobrze. Używam tego, aby mieć repozytorium w moim folderze domowym dla rzeczy takich jak vimrc i bashrc
Martin Capodici
1
@uzsolt nie działa, jeśli chcesz dołączyć jeden określony folder. patrz stackoverflow.com/questions/987142/…
DiCaprio,
73

utwórz plik .gitignore w swoim repozytorium i chcesz śledzić tylko pliki c i zignorować wszystkie inne pliki, a następnie dodaj do niego następujące wiersze ....

*
!*.c

„*” zignoruje wszystkie pliki

i ! zaneguje pliki do zignorowania .... więc tutaj prosimy git, aby nie ignorował plików c ....

Vineel Kumar Reddy
źródło
Czy potrzebujesz również .*ukrytych plików?
trusktr
2
*Jest wieloznaczny nawet dla .tak ukryte pliki są ignorowane, ale wtedy wszystkie ukryte pliki kończące się .cznajdują.
Rohmer
2
Myślę, że przy użyciu tej metody pliki z podfolderów również są ignorowane. Sprawdź to, aby uzyskać więcej informacji stackoverflow.com/a/11853075/739436
Stelian
1
Użyłem tej metody w moim katalogu domowym, aby śledzić tylko moje .bashrc i .bash_history, np. *Po nich !.bash*w pliku
.gitignore
1
Możesz potrzebować *.*w systemie Windows - zobacz odpowiedź autorstwa @Smaranjit Maiti
Martin Capodici,
13

Najlepsze rozwiązanie, aby to osiągnąć

utwórz .gitignoreplik w repozytorium root, a jeśli chcesz dołączyć tylko .cplik, musisz dodać poniższe linie do .gitignorepliku

*.*
!*.c

obejmie to .crekurencyjnie cały plik z katalogu i podkatalogu.

za pomocą

*
!*.c

nie będzie działać na wszystkich wersjach git.

Testowany

git w wersji 2.12.2. windows.2

Smaranjit
źródło
2
Tak, miałem ten sam problem *i musiałem go użyć *.*. To jest w systemie Windows przy użyciu gitbash i git w wersji 2.9.0.windows.1
Martin Capodici
2

Jeśli chcesz zignorować pliki, ale nie konkretny plik w katalogu, oto jak to zrobiłem:

# 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
źródło
0

Spóźniłem się na imprezę, ale moim rozwiązaniem byłoby posiadanie katalogu na pliki źródłowe i inny katalog na pliki wykonywalne i dane wyjściowe programu, coś takiego:

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

... a potem tylko dodaj te rzeczy src/do mojego repozytorium i bin/całkowicie zignoruj .

Christian Severin
źródło