Як можна ігнорувати бінарні файли при git
використанні .gitignore
файлу?
Приклад:
$ g++ hello.c -o hello
Файл "привіт" - це двійковий файл. Можна git
ігнорувати цей файл?
[^\.]*
.
Як можна ігнорувати бінарні файли при git
використанні .gitignore
файлу?
Приклад:
$ g++ hello.c -o hello
Файл "привіт" - це двійковий файл. Можна git
ігнорувати цей файл?
[^\.]*
.
Відповіді:
# Ignore all
*
# Unignore all with extensions
!*.*
# Unignore all dirs
!*/
### Above combination will ignore all files without extension ###
# Ignore files with extension `.class` & `.sm`
*.class
*.sm
# Ignore `bin` dir
bin/
# or
*/bin/*
# Unignore all `.jar` in `bin` dir
!*/bin/*.jar
# Ignore all `library.jar` in `bin` dir
*/bin/library.jar
# Ignore a file with extension
relative/path/to/dir/filename.extension
# Ignore a file without extension
relative/path/to/dir/anotherfile
!/**/
замість нього !*/
; який з них правильний? / cc @VonC
Додайте щось подібне
*.o
у файлі .gitignore та розмістіть його у корені репортажу (або ви можете розмістити його в будь-якому підкаталозі, який ви хочете - він застосовуватиметься з цього рівня) та перевірте його.
Редагувати:
Для бінарних файлів без розширення краще розмістити їх у bin/
будь-якій іншій папці. Якщо не існує ігнору на основі типу вмісту.
Ви можете спробувати
*
!*.*
але це не дурно.
gcc
проходженні -o $@
.
Щоб додати до себе всі виконувані файли .gitignore
(що ви, мабуть, маєте на увазі під "двійковим файлом", судячи з вашого запитання), ви можете використовувати
find . -executable -type f >>.gitignore
Якщо вас не хвилює впорядкування рядків у вашому .gitignore
, ви також можете оновити свою .gitignore
команду за допомогою наступної команди, яка також видаляє дублікати та зберігає впорядкованість за алфавітом.
T=$(mktemp); (cat .gitignore; find . -executable -type f | sed -e 's%^\./%%') | sort | uniq >$T; mv $T .gitignore
Зауважте, що ви не можете передавати безпосередньо вихід .gitignore
, тому що це вріже файл перед cat
відкриттям його для читання. Також ви можете додати \! -regex '.*/.*/.*'
як опцію, щоб знайти, якщо ви не хочете включати виконувані файли у підкаталоги.
Ваша найкраща ставка з бінарними файлами - або надати їм розширення, які ви можете легко відфільтрувати за допомогою стандартного шаблону, або помістити їх у каталоги, які ви можете відфільтрувати на рівні каталогу.
Пропозиція щодо розширення більш застосовна в Windows, тому що розширення стандартні і в основному потрібні, але в Unix ви можете або не можете використовувати розширення на своїх виконуваних бінарних файлах. У цьому випадку ви можете помістити їх у бін / папку та додати bin/
до свого .gitignore.
У вашому дуже конкретному, hello
маломасштабному прикладі ви можете просто ввести .gitignore.
Ви можете спробувати у своєму .gitignore
:
*
!*.c
Цей підхід має багато недоліків, але він прийнятний для невеликих проектів.
Якщо ви використовуєте makefile, ви можете спробувати змінити свої правила make, щоб додати імена нових бінарних файлів у файл .gitignore.
Ось приклад Makefile для невеликого проекту Haskell;
all: $(patsubst %.hs, %, $(wildcard *.hs))
%: %.hs
ghc $^
grep -xq "$@" .gitignore || echo $@ >> .gitignore
Цей makefile визначає правило для створення виконуваних файлів з коду Haskell. Після виклику ghc ми перевіряємо .gitignore, щоб перевірити, чи є в ньому вже двійковий файл. Якщо це не так, ми додаємо до файлу назву двійкового файлу.
Двійкові файли часто без розширень. Якщо це ваш випадок, спробуйте:
*
!/**/
!*.*
Ось ще одне рішення за допомогою файлу. Таким чином виконувані сценарії не опиняться в gitignore. Можливо, вам доведеться змінити, як інтерпретується вихідний файл з відповідності вашій системі. Потім ви можете встановити гачок, що попередньо здійснює, для виклику цього сценарію кожного разу, коли ви здійснюєте їх виконання.
import subprocess, os
git_root = subprocess.check_output(['git', 'root']).decode("UTF-8").strip()
exes = []
cut = len(git_root)
for root, dirnames, filenames in os.walk(git_root+"/src/"):
for fname in filenames:
f = os.path.join(root,fname)
if not os.access(f,os.X_OK):
continue
ft = subprocess.check_output(['file', f]).decode("UTF-8")
if 'ELF' in ft and 'executable' in ft:
exes.append(f[cut:])
gifiles = [ str.strip(a) for a in open(git_root + "/.gitignore").readlines() ]
gitignore=frozenset(exes+gifiles)
with open(git_root+"/.gitignore", "w") as g:
for a in sorted(gitignore):
print(a, file=g)
Спосіб також ігнорувати в деякому підкаталозі, не тільки в корені:
# Ignore everything in a root
/*
# But not files with extension located in a root
!/*.*
# And not my subdir (by name)
!/subdir/
# Ignore everything inside my subdir on any level below
/subdir/**/*
# A bit of magic, removing last slash or changing combination with previous line
# fails everything. Though very possibly it just says not to ignore sub-sub-dirs.
!/subdir/**/
# ...Also excluding (grand-)children files having extension on any level
# below subdir
!/subdir/**/*.*
Або якщо ви хочете включити лише деякі певні типи файлів:
/*
!/*.c
!/*.h
!/subdir/
/subdir/**/*
!/subdir/**/
!/subdir/**/*.c
!/subdir/**/*.h
Здається, це може навіть працювати як для кожного нового підкаталогу, якщо ви хочете !:
/*
!/*.c
!/*.h
!/*/
/*/**/*
!/*/**/
!/*/**/*.c
!/*/**/*.h
Провідні косої риси важливі лише в перших двох рядках і необов’язкові в інших. Tailing слеш в !/*/
і !/subdir/
також є необов'язковим, але тільки в цьому рядку.
Стара нитка, але все ще актуальна. Я змінив makefile, щоб отриманий бінарний файл після посилання мав назву [filename]. бін замість лише [назва фільму]. Потім я додав * .bin файли в gitignore.
Ця рутина відповідає моїм потребам.
Я не знаю жодного іншого рішення, але додавання їх по одному до .gitignore
.
Грубий спосіб тестування - зібрати результат файлової команди:
find . \( ! -regex '.*/\..*' \) -type f | xargs -n 1 file | egrep "ASCII|text"
EDIT
Чому ви просто не назвете його виконуваним hello.bin
?
.bin
- це погана практика.
Просто додайте hello
або /hello
до своєї .gitignore. Або працює.
hello
.
Я створив файл .gitignore з двома записами в каталозі GOPATH.
/bin
/pkg
Він ігнорує всі складені розробки на даний момент.
.gitignore використовує глобальне програмування для фільтрації файлів, принаймні в Linux.
Я збираюся виступити з розмовою про кодування на Meetup, і під час підготовки я створив каталог з кількома підкаталогами, які названі відповідно до порядку, який я хочу їх представити: 01_subject1, 02_subject2, 03_subject3. Кожен підкаталог містить вихідний файл із залежним від мови розширенням, який компілюється у виконуваний файл, ім'я якого відповідає імені вихідного файла без розширення відповідно до загальної практики.
Я виключаю компільовані файли з каталогів з попередньою цифрою із наступним рядком .gitignore:
[0-9][0-9]_*/[!\.]*
Наскільки я розумію документацію, вона не повинна працювати. Наявність відмітки зосередження має бути невдалою, оскільки вона має відповідати будь-якій кількості невизначених символів, включаючи "." + розширення. Опущення задніх зірочок має бути невдалим (і так), оскільки [!\.]
відповідає лише одному неперіодичному символу. Однак я додав зірочку, як і для звичайного виразу, і вона працює. Під роботою я маю на увазі, що git помічає зміни у вихідному файлі, але не існування чи зміни у складених файлах.
Спираючись на відповідь VenomVendors
# Ignore all
*
# Unignore all files with extensions recursively
!**/*.*
# Unignore Makefiles recursively
!**/Makefile
# other .gitignore rules...
Додайте до файлу .gitignore:
[^\.]*
Пояснення:
[] encloses a character class, e.g. [a-zA-Z] means "any letter".
^ means "not"
\. means a literal dot - without the backslash . means "any character"
* means "any number of these characters"
.gitignore
Механізм працює тільки на основі файлів імен , а нема на файл вмісту . Бути бінарним файлом є властивістю вмісту, отже, ви не можете просити git ігнорувати бінарні файли безпосередньо, а лише ігнорувати їх по імені (і як інше пропонується, ви можете або додати всі назви бінарних файлів до свого .gitignore
або використовувати відповідне іменування конвенції).
Те, що .gitignore
працює з іменами файлів, є важливим для продуктивності властивості: Git потрібно лише перелічити файли, але не відкривати їх та читати, щоб знати, які файли ігнорувати. Іншими словами, Git був би дуже повільним, якби ви могли попросити його ігнорувати файли на основі їх вмісту.