Проблемы с использованием git diff для создания списка файлов для развертывания

StackOverflow https://stackoverflow.com/questions/600491

Вопрос

Я хочу использовать что-то вроде следующей команды для создания архива для развертывания:

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top