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 г.)
коммит 92b1dd1
archive
: улучшить поддержку запуска в подкаталогеДокладчик: Кристиан Ле
Докладчик: Маттиас Гёргенс
Подпись: Рене Шарфе
Когда(manman ) запускается в подкаталоге, он архивирует только соответствующее дерево и дочерние объекты.
Это предназначено.
Он делает это путем эффективного перехода к этому дереву и установки «префикса» для пустой строки.Однако это имеет печальные последствия: атрибуты привязываются к корню репозитория и
git archive
по-прежнему применяет их к поддеревьям, вызывая несоответствия.
И при проверке спецификаций пути он не может отличить путь, который не соответствует ничему, или тот, который соответствует какому-то реальному BLOB-объекту за пределами подкаталога, что приводит к запутанному сообщению об ошибке («current working directory is untracked
").Исправьте это, сохранив значение «префикса» и передав его в функции pathspec и атрибута, а также сократив его с помощью
relative_path()
для путей, записанных в архив и (если--verbose
дано) в стандартный вывод.По-прежнему отклонять попытки архивировать файлы за пределами текущего каталога, но в этом случае выводить более конкретную ошибку ("
outside the current directory
").
Однако для его распознавания требуется полный обход поддерева для каждой спецификации пути.
Разрешить их было бы проще, но пути к записи в архиве начинаются с "../
" может быть проблематично извлечь - напримерbsdtar
пропускает их по умолчанию.