Чи є спосіб сказати git включати лише певні файли замість ігнорування певних файлів?


165

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

git add .

Я повинен зробити щось подібне

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

що трохи громіздко ...

Я відчуваю себе досить впевнено, що можу написати швидкий скрипт Perl, якщо вміст каталогів у .gitignore, а потім видалити файли на основі. Чи є кращий спосіб?

Відповіді:


231

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

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

Щоб він ігнорував усі .c файли, крім custom.c і все, що починається з "frob_"


20
Дякую, TED Це спрацювало. Все, що мені потрібно було зробити, - це запустити файл .gitignore з *, а потім перерахувати всі мої включені шаблони файлів, якими керується знак оклику.
Дейзі Софія Холман

8
Як щодо папок? Я не можу знайти спосіб включити папки та файли всередину, відкинувши правило.
Марсіо Крус

4
Папки , будь ласка , перевірте stackoverflow.com/questions/12799855 / ...
uzsolt

2
дуже хороша. Я використовую це, щоб мати сховище у своїй домашній папці для таких речей, як vimrc та bashrc
Martin Capodici

1
@uzsolt не працює, якщо ви хочете включити одну конкретну папку. дивіться stackoverflow.com/questions/987142/…
DiCaprio

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
Martin Capodici

13

Найкраще рішення для досягнення цього

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

*.*
!*.c

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

використовуючи

*
!*.c

працюватиме не на всій версії git.

Випробуваний на

версія git 2.12.2.Windows.2


2
Так, у мене були ті ж проблеми *, що і довелося використовувати *.*. Це в Windows за допомогою gitbash та git версії 2.9.0.windows.1
Martin Capodici

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

0

Пізно до вечірки, але моїм рішенням було б мати каталог для вихідних файлів та інший каталог для виконуваних файлів та виведення програм, приблизно так:

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

... а потім додайте лише речі src/до мого сховища та bin/повністю ігноруйте .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.