Игнорировать файлы .pyc в репозитории git

107

Как я могу игнорировать .pycфайлы в git?

Если я его .gitignoreвставлю, это не сработает. Мне нужно, чтобы они не отслеживались и не проверялись на коммиты.

закрепить
источник
4
.gitignore должен работать. Можете ли вы предоставить копию строк, которые вы добавили в .gitignore, чтобы попытаться решить эту проблему?
Al Riddoch

Ответы:

41

Вставьте это .gitignore. Но со gitignore(5)страницы руководства :

  ·   If the pattern does not contain a slash /, git treats it as a shell
       glob pattern and checks for a match against the pathname relative
       to the location of the .gitignore file (relative to the toplevel of
       the work tree if not from a .gitignore file).

  ·   Otherwise, git treats the pattern as a shell glob suitable for
       consumption by fnmatch(3) with the FNM_PATHNAME flag: wildcards in
       the pattern will not match a / in the pathname. For example,
       "Documentation/*.html" matches "Documentation/git.html" but not
       "Documentation/ppc/ppc.html" or
       "tools/perf/Documentation/perf.html".

Итак, либо укажите полный путь к соответствующей *.pycзаписи, либо поместите ее в .gitignoreфайл в любой из каталогов, ведущих от корня репозитория (включительно).

Игнасио Васкес-Абрамс
источник
6
Во избежание путаницы, интерпретация страницы руководства Игнасио неверна. Вам не нужно помещать * .pyc в тот же каталог, достаточно поместить его в родительский каталог (или дедушку и т. Д.).
Godsmith
@Godsmith: Исправлено.
Игнасио Васкес-Абрамс,
241

Вы должны добавить строку:

*.pyc 

в .gitignoreфайл в корневой папке вашего дерева репозитория git сразу после инициализации репозитория.

Как сказал ralphtheninja , если вы забыли сделать это заранее, если вы просто добавите строку в .gitignoreфайл, все ранее зафиксированные .pycфайлы все равно будут отслеживаться, поэтому вам нужно будет удалить их из репозитория.

Если вы работаете в системе Linux (или в системе «родители и сыновья», например в MacOSX), вы можете быстро сделать это с помощью этой однострочной команды, которую необходимо выполнить из корня репозитория:

find . -name "*.pyc" -exec git rm -f "{}" \;

Это просто означает:

начиная с каталога, в котором я сейчас нахожусь, найдите все файлы, имена которых оканчиваются на расширение .pyc, и передайте имя файла командеgit rm -f

После *.pycудаления файлов из git как отслеживаемых файлов зафиксируйте это изменение в репозитории, а затем вы, наконец, можете добавить *.pycстроку в .gitignoreфайл.

(адаптировано из http://yuji.wordpress.com/2010/10/29/git-remove-all-pyc/ )

Энрико М.
источник
3
В качестве альтернативы, просто чтобы удалить файлы из git и с вашего локального компьютера, вы можете просто сделать это git rm --cached *.pycиз каталога верхнего уровня. Получил отсюда
Анупам
У меня он существует, но как только вы зафиксируете файлы .pyc, они все равно будут отслеживаться git, вы должны сначала удалить их и зафиксировать, если они у вас есть в репозитории
Махмуд Хбубати
84

Вы, наверное , добавили их в хранилище , прежде чем положить *.pycв .gitignore.
Сначала удалите их из репозитория.

ralphtheninja
источник
3

Я пытаюсь использовать предложение из предыдущего сообщения и не работаю рекурсивно, затем прочтите справку и получите эту строку:

find . -name "*.pyc" -exec git rm -f "{}" \;

pd необходимо добавить * .pyc в файл .gitignore, чтобы поддерживать git clean

echo "*.pyc" >> .gitignore

Наслаждаться.

Дарио Роман Гарсиа Гонсалес
источник
2

Если вы хотите игнорировать файлы .pyc глобально (т.е. если вы не хотите добавлять строку в файл .gitignore в каждый каталог git), попробуйте следующее:

$ cat ~/.gitconfig 
[core]
    excludesFile = ~/.gitignore
$ cat ~/.gitignore
**/*.pyc

[Ссылка]
https://git-scm.com/docs/gitignore

  • Шаблоны, которые пользователь хочет, чтобы Git игнорировал во всех ситуациях (например, резервные или временные файлы, созданные выбранным пользователем редактором), обычно помещаются в файл, указанный в core.excludesFile в ~ / .gitconfig пользователя.

  • Ведущий "**", за которым следует косая черта, означает совпадение во всех каталогах. Например, «** / foo» соответствует файлу или каталогу «foo» где угодно, так же, как шаблон «foo». «** / foo / bar» соответствует файлу или каталогу «bar» в любом месте, которое находится непосредственно в каталоге «foo».

Тэ Ким
источник
0

Спасибо @Enrico за ответ.

Обратите внимание: если вы используете virtualenv, у вас будет еще несколько .pycфайлов в каталоге, в котором вы сейчас находитесь, которые будут захвачены его командой find.

Например:

./app.pyc
./lib/python2.7/_weakrefset.pyc
./lib/python2.7/abc.pyc
./lib/python2.7/codecs.pyc
./lib/python2.7/copy_reg.pyc
./lib/python2.7/site-packages/alembic/__init__.pyc
./lib/python2.7/site-packages/alembic/autogenerate/__init__.pyc
./lib/python2.7/site-packages/alembic/autogenerate/api.pyc

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

find "*.pyc" -exec git rm -f "{}" \;

Это удалит только app.pycфайл из репозитория git.

Энди Джи
источник