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
files с export-ignore
, чтобы исключать каталоги и файлы, где я хочу.
Цель также использовать .gitattributes
рекурсивно внутри нескольких подпапок, поэтому я всегда могу исключить отдельные файлы из архива, не зная структуру верхней папки.(Это полезно для включенных библиотек, например)
Я также заметил, что может потребоваться добавить параметр --worktree-attributes
, чтобы git собирал файлы .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.По какой-то причине это не исключает самого dir, но это может быть еще одной проблемой с моей стороны.
В отличие от этого, если я помещаю следующий файл в корневой каталог, весь каталог src/tests
исключается.(хотя я сказал, что они семантически означают одно и то же):
src/tests export-ignore
src/tests/** export-ignore
Моя версия git: 2.17.2
Fedora 28
Редактировать: Я заметил сейчаскажется, что это работает, когда я помещаю файл .gitattributes
в корневой каталог 1076 *, но упоминаю пути к файлам относительно каталога src
.Т.е. делая это (также протестировано с исключением файлов):
tests export-ignore
tests/** export-ignore
manifest.json export-ignore
... каким-то образом заставляет его работать с командой src
archive.Теперь он больше не работает с архивированием всего каталога (но это нормально).Однако, если я помещу этот файл куда-нибудь еще (как в src
dir), он снова не будет работать ...
И моя цель - иметь .gitattributes
файлов в подкаталогах, чтобы исключить определенные вещи в этих каталогахэто все еще не работает, как ожидалось.