гитиньоре без бинарных файлов - PullRequest
124 голосов
/ 19 апреля 2011

Как можно игнорировать двоичные файлы в git, используя файл .gitignore?

Пример:

$ g++ hello.c -o hello

Файл "hello" является двоичным файлом.Может ли git игнорировать этот файл?

Ответы [ 18 ]

108 голосов
/ 31 августа 2014
# 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
39 голосов
/ 19 апреля 2011

Добавить что-то вроде

*.o

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

Edit:

Для бинарных файлов без расширения лучше поместить их в bin/ или в другую папку. В конце концов, нет игнорирования в зависимости от типа контента.

Вы можете попробовать

*
!*.*

но это не надежно.

26 голосов
/ 20 октября 2011

Чтобы добавить все исполняемые файлы к вашему .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 '.*/.*/.*' в качестве опции, чтобы найти, если вы не хотите включать исполняемые файлы в подкаталоги.

23 голосов
/ 19 апреля 2011

Лучше всего использовать двоичные файлы, чтобы предоставить им расширение, которое можно легко отфильтровать по стандартному шаблону, или поместить их в каталоги, которые можно отфильтровать на уровне каталога.

Предложение расширенияболее применим в Windows, потому что расширения являются стандартными и в основном требуются, но в Unix вы можете или не можете использовать расширения в своих исполняемых двоичных файлах.В этом случае вы можете поместить их в папку / папку и добавить bin/ в свой .gitignore.

В своем очень конкретном примере с небольшим объемом вы можете просто поместить hello в свой.gitignore.

13 голосов
/ 26 июня 2012

Вы можете попробовать в своем .gitignore:

*
!*.c

У этого подхода много недостатков, но он подходит для небольших проектов.

12 голосов
/ 19 августа 2012

Если вы используете make-файл, вы можете попробовать изменить правила make, чтобы добавить имена новых двоичных файлов в ваш файл .gitignore.

Вот пример Makefile для небольшого проекта на Haskell;

all: $(patsubst %.hs, %, $(wildcard *.hs))

%: %.hs
    ghc $^
    grep -xq "$@" .gitignore || echo $@ >> .gitignore

Этот make-файл определяет правило для создания исполняемых файлов из кода на Haskell. После вызова ghc мы проверяем .gitignore, чтобы увидеть, есть ли в нем бинарный файл. Если это не так, мы добавляем имя файла в файл.

4 голосов
/ 03 ноября 2013

Вот еще одно решение с использованием файла. Таким образом, исполняемые скрипты не окажутся в 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)
3 голосов
/ 13 декабря 2013

Способ также игнорировать в некотором подкаталоге, не только в корне:

# 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

Начальные косые черты важны только в первых двух строках и необязательны в других. Хвостовая косая черта в !/*/ и !/subdir/ также необязательна, но только в этой строке.

3 голосов
/ 21 ноября 2018

Бинарные файлы часто без расширений. Если это ваш случай, попробуйте это:

*
!/**/
!*.*

REF: https://stackoverflow.com/a/19023985/1060487

1 голос
/ 19 апреля 2011

Я не знаю другого решения, но добавляю их одно за другим к .gitignore.

Необработанный способ проверки состоит в том, чтобы отобразить вывод команды файла:

find . \( ! -regex '.*/\..*' \) -type f | xargs -n 1 file | egrep "ASCII|text"

EDIT

Почему бы вам просто не назвать исполняемый файл hello.bin?

...