Есть ли способ сказать git включить только определенные файлы вместо игнорирования определенных файлов?

166

Мои программы обычно генерируют огромные выходные файлы (~ 1 ГБ), резервное копирование которых я не хочу в репозиторий git. Так что вместо того, чтобы делать

git add .

Я должен сделать что-то вроде

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

что немного громоздко ...

Я уверен, что могу написать быстрый Perl-скрипт, содержащий содержимое каталога, в .gitignore, а затем удалить файлы, основанные на файле .gitinclude (или похожем имени), но это кажется слишком хакерским. Есть ли способ лучше?

Дейзи София Холлман
источник

Ответы:

233

Мне не нужно было пробовать это самому, но из моего прочтения TFM похоже, что отрицательный шаблон будет делать то, что вы хотите. Вы можете переопределить записи в .gitignore с последующими аннулированными записями. Таким образом, вы можете сделать что-то вроде:

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

Чтобы он игнорировал все файлы .c, за исключением custom.c и все, что начинается с «frob_»

ТЕД
источник
20
Спасибо, Тед Это сработало. Все, что мне нужно было сделать, это запустить файл .gitignore с помощью *, а затем перечислить все мои шаблоны включенных файлов, сопровождаемые восклицательным знаком.
Дейзи София Холлман
8
Как насчет папок? Я не могу найти способ включить папки и файлы внутрь, отрицая правило.
Марсио Круз
4
О папках, пожалуйста, проверьте stackoverflow.com/questions/12799855/…
uzsolt
2
очень хорошо. Я использую это, чтобы иметь репозиторий в своей домашней папке для таких вещей, как vimrc и bashrc
Martin Capodici
1
@uzsolt не работает, если вы хотите включить одну конкретную папку. см stackoverflow.com/questions/987142/...
ДиКаприо
73

создайте файл .gitignore в своем хранилище, и вы хотите отслеживать только файлы c и игнорировать все остальные файлы, а затем добавить в него следующие строки ....

*
!*.c

'*' будет игнорировать все файлы

и ! будет отменять файлы, чтобы их игнорировать .... поэтому здесь мы просим git не игнорировать файлы c ....

Винил Кумар Редди
источник
Вам также нужны .*скрытые файлы?
trusktr
2
Символ *подстановки даже для ., поэтому скрытые файлы также игнорируются, но затем .cвключаются все скрытые файлы, заканчивающиеся на .
Ромер
2
Используя этот метод, я думаю, что файлы из подпапок также игнорируются. Проверьте это для более подробной информации stackoverflow.com/a/11853075/739436
Stelian
1
Я использовал этот метод в своем домашнем каталоге, чтобы отслеживать только мои .bashrc и .bash_history, например, *затем !.bash*в файле
.gitignore
1
Возможно, вам понадобится *.*окно - посмотрите ответ @Smaranjit Maiti
Мартин
13

Лучшее решение для достижения этой цели

создать .gitignoreфайл в репозитории root, и если вы хотите включить только .cфайл, то вам нужно добавить следующие строки в .gitignoreфайл

*.*
!*.c

это будет включать в себя весь .cфайл из каталога и подкаталога рекурсивно.

с помощью

*
!*.c

не будет работать на всех версиях git.

Проверено на

git версия 2.12.2.windows.2

Smaranjit
источник
2
Да, у меня была такая же проблема *, и пришлось использовать *.*. Это на Windows с использованием gitbash и git версии 2.9.0.windows.1
Martin
2

Если вам нужно игнорировать файлы, но не конкретный файл в каталоге, вот как я это сделал:

# 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
источник
0

Поздно, но мое решение было бы иметь каталог для исходных файлов и другой каталог для исполняемых файлов и вывода программы, что-то вроде этого:

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

... а затем только добавить материал в src/мой репозиторий и bin/полностью игнорировать .

Кристиан Северин
источник