Как игнорировать файлы / каталоги в «git archive» и создавать только архив подкаталога? - PullRequest
0 голосов
/ 14 октября 2018

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 файлов в подкаталогах, чтобы исключить определенные вещи в этих каталогахэто все еще не работает, как ожидалось.

...