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

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

tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`

Команда inner git diff создает список файлов с относительным, включая относительный путь, когда я запускаю ее отдельно.

Однако у меня две проблемы: мне нужно иметь возможность автоматически экранировать пробелы в выводе, поэтому tar не жалуется на файлы, содержащие пробелы, и когда tar создается, все файлы имеют дублированный `` скрытый файл '' перед ним стоит '.' которые не отображаются с ls -al . Это метафайлы, специфичные для OSX, как отмечает kch.

В любом случае, кто-нибудь знает решение этих проблем, или есть простой более простой способ написать это?

Ответов (6)

Решение

Я остановился на следующем решении с помощью sed.

tar cjf ~/deploy.tar.bz2 \
`git diff --name-only 0abc 1def|sed -e "s/ /\\\ /g"`

Если размер не имеет значения, вы можете использовать архив git .

Я не уверен, можно ли создать архив, содержащий только различия между двумя коммитами.

Вот еще одно, более элегантное решение, позволяющее избежать пробелов в именах файлов.

git diff --name-only 0abc 1def | \
    tr '\n' '\0' | \
    xargs -0 tar -rjvf ~/deploy.tar.bz2

Как указал jpalecek, никто не хочет запускать "tar -c ..." несколько раз, лучше использовать -r.

Ты можешь попробовать

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 есть только одна новая строка.

Однако, если имена ваших файлов содержат символы новой строки, вы обречены.

Скрытые файлы с точками - это файлы с подчеркиванием точек?

Если у 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.