git-архив подкаталога -

Я использую git-архив для архивирования подкаталога в git-репозитории, вот так:

git archive -o ../subarchive.zip HEAD subdir/*

Однако полученный архив поддерживает структуру subdir/ directory, то есть содержимое:

subdir/
   whatever.js
   morestuff.js

Когда я на самом деле хочу что угодно.js и morestuff.js в корне архива.

Как? Благодарю.

2 ответа

Решение

Вы можете сделать это так:

git archive -o ../subarchive.zip HEAD:subdir

Кстати, простой способ поиграть с командой и посмотреть, что она сгенерирует, если использовать ее в этой форме:

git archive --format=tar HEAD:subdir | tar t
git archive --format=tar HEAD subdir | tar t
# ... and so on ...

Как только вы увидите, что вы ищете, вы можете изменить формат и использовать -o флаг для фактического создания архива.

Если вы используетеgit archive -o ../subarchive.zip HEAD:subdir, обязательно сделайте это с помощью Git 2.41 (второй квартал 2023 г.):

"" ( ) запускается из подкаталога с неправильно обработанными атрибутами и путями за пределами текущего каталога.

См. (24 марта 2023 г.) Рене Шарфа ( rscharfe) .
(Объединено Джунио К. Хамано -- gitster-- в коммите de73a20, 21 апреля 2023 г.)

коммит 92b1dd1archive: улучшить поддержку запуска в подкаталоге

Докладчик: Кристиан Ле
Докладчик: Маттиас Гёргенс
Подпись: Рене Шарфе

Когда(manman ) запускается в подкаталоге, он архивирует только соответствующее дерево и дочерние объекты.
Это предназначено.
Он делает это путем эффективного перехода к этому дереву и установки «префикса» для пустой строки.

Однако это имеет печальные последствия: атрибуты привязываются к корню репозитория иgit archiveпо-прежнему применяет их к поддеревьям, вызывая несоответствия.
И при проверке спецификаций пути он не может отличить путь, который не соответствует ничему, или тот, который соответствует какому-то реальному BLOB-объекту за пределами подкаталога, что приводит к запутанному сообщению об ошибке («current working directory is untracked").

Исправьте это, сохранив значение «префикса» и передав его в функции pathspec и атрибута, а также сократив его с помощьюrelative_path()для путей, записанных в архив и (если--verboseдано) в стандартный вывод.

По-прежнему отклонять попытки архивировать файлы за пределами текущего каталога, но в этом случае выводить более конкретную ошибку ("outside the current directory").
Однако для его распознавания требуется полный обход поддерева для каждой спецификации пути.
Разрешить их было бы проще, но пути к записи в архиве начинаются с "../" может быть проблематично извлечь - напримерbsdtarпропускает их по умолчанию.

Другие вопросы по тегам