Архив git: экспорт-игнорирование, игнорирование каталогов

У меня есть git-репозиторий с этим .gitattributes:

my_script.py export-subst
Makefile export-ignore
README.md export-ignore
.gitattributes export-ignore
.gitignore export-ignore
hooks/ export-ignore
tests/ export-ignore
*.pyc export-ignore

но когда я делаю:

git archive HEAD | tar -x -C ../archive_dir

в archive_dir каталог, я получаю каталоги hooks а также tests:

 ls ../archive_dir/
 hooks/  my_script.py tests/

Зачем?

Моя версия git 1.7.9.

2 ответа

Решение

Я удалил / в каталогах это исправило проблему

my_script.py export-subst
Makefile export-ignore
README.md export-ignore
.gitattributes export-ignore
.gitignore export-ignore
hooks export-ignore
tests export-ignore
*.pyc export-ignore

Я нахожу решение в ответе на похожий вопрос: git игнорируя шаблон.gitattributes

Другой подход, возможный начиная с Git 2.2+ (ноябрь 2014 г.), заключается в фильтрации пути, который вы хотите включить в архив.

См коммит ed22b41 Нгуен Тхай Нгук Дуй ( pclouds ):

archive: поддержка фильтрации путей с помощью glob

Этот патч исправляет две проблемы с использованием: (glob) (или даже " *.c "без" :(glob) ").

Во-первых, мы забыли включить флаг "рекурсивный" в struct pathspec, Без этого tree_entry_interesting() не будет помечать потенциальные каталоги как "интересные", чтобы можно было проверить, есть ли в этих каталогах что-либо, соответствующее пути.

У маркировки интересных каталогов есть побочный эффект: нам нужно пройтись по каталогу, чтобы понять, что в этом нет ничего интересного. К тому времени, ' archive 'код уже записал (пустой) каталог.
Это означает множество пустых каталогов в архиве результатов.

Эта проблема решается ленивой записью каталогов, когда мы знаем, что они действительно нужны. В этой реализации есть теоретическая ошибка: мы не можем писать пустые деревья / каталоги, которые соответствуют этому пути.

path_exists() также стал более строгим, чтобы обнаруживать несоответствующие спецификации пути, потому что когда этот флаг 'recursive' включен, мы, скорее всего, сопоставим некоторые каталоги. Самый простой способ - не считать какие-либо каталоги "совпавшими".

Примеры:

git archive -v HEAD -- ":(glob)**/sh"

git archive -o docs.zip v2.2.0 'Documentation/*.html'
Другие вопросы по тегам