Как игнорировать файлы / каталоги в "git archive" и создавать только архив подкаталога?
TL;DR: git archive
Кажется, что команда архивирует только один подкаталог или придерживается .gitattributes
и исключить файлы / каталоги из полученного ZIP, но не может сделать оба.
Скажем, у меня есть такая структура каталогов в моем git-архиве (упрощено для возможности повторного использования):
.
├── assets
├── build
├── CONTRIBUTING.md
├── CONTRIBUTORS
├── LICENSE.md
├── README.md
├── scripts
├── src
│ ├── background
│ ├── common
│ ├── icons
│ ├── _locales
│ ├── manifest.json
│ ├── options
│ ├── popup
│ └── tests
└── tests -> src/tests
Теперь я хочу получить ZIP (или tar) архив со следующим содержимым:
- содержание
src
только каталог, так как это исходный код, который я хочу архивировать. Безsrc
непосредственно, однако. - внутри этих каталогов я могу игнорировать больше папок и файлов. Например
tests
должно быть проигнорировано, очевидно.
Итак, в конце концов архив должен выглядеть так:
.
├── background
├── common
├── icons
├── _locales
├── manifest.json
├── options
└── popup
Теперь я подумал git archive
отличный инструмент для этого. Вы можете архивировать только подкаталог и использовать .gitattributes
файлы с export-ignore
чтобы исключить каталоги и файлы, где я хочу.
Цель также заключается в использовании .gitattributes
рекурсивно внутри нескольких подпапок, поэтому я также всегда могу исключить отдельные файлы из архива, не зная структуру верхней папки. (Это полезно для включенных библиотек, например)
Я также заметил, что вам может понадобиться добавить параметр--worktree-attributes
так мерзавец поднимает .gitattributes
файлы везде, где он его находит. И у меня есть использование **
исключить подкаталоги. Все в порядке.
Итак (для тестирования здесь) я попробовал это:
$ git archive --worktree-attributes --format=tar HEAD:src | tar t
Таким образом, только архивирование подкаталога работает без каких-либо проблем, но исключая файлы, не работает.
Например, я положил это .gitattributes
в src
каталог:
tests export-ignore
tests/** export-ignore
Теперь, выполнив команду, упомянутую выше, она все еще включает tests
DIR содержание. Тем не менее, если я бегу git archive --worktree-attributes --format=tar HEAD | tar t
, т.е. не архивировать подкаталог, список заканчивается:
src/popup/[…]
tests
Это означает, что исключает содержание tests
реж. По некоторым причинам, это не исключает самого dir, но это может быть другой проблемой на моей стороне.
Напротив, если я положу следующий файл в корневой каталог, весь src/tests
dir исключен (хотя я сказал, что они семантически означают одно и то же):
src/tests export-ignore
src/tests/** export-ignore
Моя версия git: 2.17.2
Fedora 28
Редактировать: я заметил, теперь это как-то работает, когда я ставлю .gitattributes
файл в корневой каталог, но укажите пути к файлам относительно src
реж. Т.е. делать это (также проверено с исключением файлов):
tests export-ignore
tests/** export-ignore
manifest.json export-ignore
... как-то заставляет его работать с src
архивная команда. Теперь он больше не работает с архивированием всего каталога (но это нормально). Тем не менее, если я положу этот файл в другом месте (как в src
реж) опять не работает…
И так как моя цель состоит в том, чтобы .gitattributes
файлы в подкаталогах, чтобы исключить определенные вещи в этих каталогах, это все еще не работает должным образом.