Архив 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'