Как добавить исполняемые файлы Linux в .gitignore?

Как добавить исполняемые файлы Linux в .gitignore, не давая им явного расширения и не помещая их в определенный каталог или каталог /bin? Большинство из них названы так же, как файл C, из которого они были скомпилированы, без расширения «.c».


person haziz    schedule 23.11.2011    source источник
comment
Это в значительной степени дубликат stackoverflow.com/questions/5711120/ Можно было бы их объединить.   -  person Sam Watkins    schedule 01.02.2015
comment
Нет, есть разница между исполняемым файлом и бинарным файлом. Я вижу необходимость игнорировать как исполняемые скрипты, так и бинарные файлы. Я не думаю, что этот вопрос является дубликатом.   -  person Alexander    schedule 29.10.2015


Ответы (7)


Можете ли вы игнорировать все, кроме файлов исходного кода?

Например:

*
!*.c
!Makefile
person Havok    schedule 08.01.2013
comment
Это выбрасывает ребенка вместе с водой из ванны. Суть предупреждения git о неотслеживаемых файлах в том, что вы случайно не забываете git add новые файлы. Просто добавив в белый список файлы .c и Makefile, теперь можно легко забыть файлы .h, README и другие файлы, которые могут быть важны. Я бы оставил файл .gitignore более консервативным и добавлял только то, что, как вы точно знаете, следует игнорировать. - person G. Sliepen; 05.04.2021

Я бы явно поместил их в проект .gitignore. Это не очень элегантно, но я полагаю, что в вашем проекте их не так много.

person Ben    schedule 23.11.2011
comment
Причина, по которой я наткнулся на этот вопрос, заключается именно в том, что их имеет так много. - person René Nyffenegger; 09.09.2017

Большинство разработчиков обычно имеют в своем проекте каталог build, в котором выполняется фактический процесс сборки. Итак, все исполняемые файлы, .o, .so, .a и т. д. есть, и этот каталог сборки добавлен в .gitignore.

person Zaxter    schedule 19.10.2016

Я написал скрипт для автоматического добавления исполняемых файлов ELF в .gitignore.

git-ignore-elf:

#!/bin/sh
set -eu
cd "$(git rev-parse --show-toplevel)"
file=.gitignore
new=$file.new.$$
(
if [ -e "$file" ]; then
    cat "$file"
fi
find . -name .git -prune -o -type f ! -name '*.o' ! -name '*.so' \
    -print0 | xargs -0 file | grep ': *ELF ' | sed 's/:.*//' |
sed 's,^./,,'
) | perl -ne 'print if !$already{$_}++' >"$new"
mv "$new" "$file"

Функции:

  • начинает искать из папки верхнего уровня (может быть ошибка!)
  • игнорирует файлы ELF, за исключением файлов .o и .so, которые можно игнорировать с помощью общего правила
  • сохраняет существующие записи в .gitignore, не дублируя их

Эта версия с одним скриптом находится здесь: http://sam.nipl.net/b/git-ignore-elf-1

Вот более модульная версия, которая зависит от других скриптов (git-root, find-elf, uniqo) оттуда же: http://sam.nipl.net/b/git-ignore-elf

person Sam Watkins    schedule 01.02.2015
comment
есть аналогичный ответ с использованием python и файла (1) здесь: stackoverflow.com/a/19749478/218294 - person Sam Watkins; 01.02.2015

Способ создания различий с вашим .gitignore за один раз из всех исполняемых файлов из текущего каталога:

find . -perm /111 -type f | sed 's#^./##' | sort | diff -u .gitignore -

это создает diff, что означает, что вы не потеряете никаких ручных изменений в файле. Это предполагает, что ваш файл .gitignore уже отсортирован. Часть sed просто удаляет ведущее ./, которое генерирует find.

Не существует автоматического способа игнорировать только исполняемые файлы, поэтому вам всегда придется вручную управлять файлом.

person Mark Fisher    schedule 23.11.2011

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

for f in $(find . -perm /111 -type f | grep -v '.git' | sed 's#^./##' | sort -u); do grep -q "$f" .gitignore || echo "$f" >> .gitignore ; done
person nad2000    schedule 05.04.2021

Я тоже несколько раз пытался разобраться в этом вопросе. Хочу поделиться решением, которое застряло надолго. Хотя я пишу это с точки зрения Go, в остальном я считаю, что это применимо в целом.

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

Таким образом, решение состояло в том, чтобы принять соглашение о том, что исполняемые файлы имеют суффикс .e, а .gitignore имеет в нем *.e.

Это просто и хорошо работает.

person latitov    schedule 15.08.2020
comment
Я предположил, что это работает хорошо. Однако это нестандартно и не работает так же хорошо, как соглашение о размещении всех таких файлов в выделенном каталоге. - person leftaroundabout; 20.05.2021