Проблемы с использованием git diff для создания списка файлов для развертывания
-
03-07-2019 - |
Вопрос
Я хочу использовать что-то вроде следующей команды для создания архива для развертывания:
tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`
Внутренняя команда git diff создает список файлов с относительным значением, включая относительный путь, когда я запускаю его отдельно.
Однако я столкнулся с двумя проблемами: мне нужно иметь возможность автоматически экранировать пробелы в выводе, чтобы tar не жаловался на файлы, содержащие пробелы. И когда TAR действительно создается, все файлы имеют дублированный «скрытый файл», которому предшествует «». это не появляется с ls -al.Как отметил kch, это метафайлы, специфичные для OSX.
В любом случае, знает ли кто-нибудь решение этих проблем, или есть более простой способ написать это?
Решение
Я остановился на следующем решении с sed.
tar cjf ~/deploy.tar.bz2 \
`git diff --name-only 0abc 1def|sed -e "s/ /\\\ /g"`
Другие советы
Скрытые файлы с точками — это файлы с точками-подчеркиваниями?
Если для файла foo
у тебя есть другой ._foo
, и вы используете Mac, файл с точкой и подчеркиванием — это место, где хранится ответвление/метаданные файлового ресурса.
Что касается вывода git, можно попробовать передать его по конвейеру. sed
или perl
для цитирования.Я считаю xargs
может помочь и здесь.
Почему бы не использовать --files-from=FILE
или -T FILE
вариант tar, где ФАЙЛ может быть «-» для обозначения стандартного ввода?
git diff --name-only 0abc 1def | tar -T - cjf ~/deploy.tar.bz2
У вас не должно возникнуть проблем с пробелами или табуляциями в именах файлов, а также с одинарными кавычками, обратными кавычками или обратной косой чертой (я думаю, что в вашем решении будут проблемы с одинарной кавычкой "'" в имени файла).У вас могут возникнуть проблемы с переводами строк в именах файлов, как и в решении IFS.
Если размер не имеет значения, вы можете использовать git-архив.
Я не уверен, возможно ли создать архив, содержащий только различия между двумя коммитами.
Можешь попробовать
eval tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def | while read x; do echo "'""$x""'"; done`
или попробуйте то же самое, используя sed, или
IFS='
' tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`
Обратите внимание, что в IFS есть только одна новая строка.
Однако, если имена ваших файлов содержат символы новой строки, вы обречены.
Вот еще одно, более элегантное решение, позволяющее избежать пробелов в именах файлов.
git diff --name-only 0abc 1def | \
tr '\n' '\0' | \
xargs -0 tar -rjvf ~/deploy.tar.bz2
Как отметил jpalecek, не хочется запускать «tar -c...» несколько раз, лучше использовать -r.