У вас есть два варианта здесь.Вы можете либо оценить $subdir
, чтобы создать фиксированную команду sed
, которую вы затем установите в качестве фильтра;или вы можете оценить переменную во фрагменте оболочки, которую вызовет git filter-branch
.
Чтобы понять последнее, поймите, что ваша строка --index-filter
становится обычной переменной оболочки :
--index-filter)
filter_index="$OPTARG"
;;
, который затем передается eval
:
eval "$filter_index" < /dev/null ||
die "index filter failed: $filter_index"
eval
означает, что выражение в $filter_index
, заданное из аргумента --index-filter
, имеет доступ ко всем переменным и функциям оболочки в сценарии ветки фильтра .К сожалению, ни одна из ее приватных переменных не содержит нужного вам выражения, но вы можете получить доступ к переменным environment , что означает, что вы можете поместить значение в переменную окружения.Другими словами, вы можете указать subdir=<whatever>
в качестве окружения для вашего исходного выражения.
В любом случае, когда bk2204 ответил , вам необходимо удалить -i
вариант.Кроме того, некоторые версии sed
не принимают \t
в качестве символа табуляции (вероятно, ваша принимает, просто имейте это в виду).
Чтобы расширить переменную ранее, просто сделайте это.Например:
... --index-filter \
'git ls-files -s | sed "s-\t\"*-&'$folder'/-" | ...
(я удалил -i
здесь сам).Обратите внимание, как это выходит из одинарных кавычек, расширяет $folder
, а затем снова вводит одинарные кавычки.Если $folder
может содержать пробел, обязательно используйте двойные кавычки, расширяя его здесь:
... --index-filter \
'git ls-files -s | sed "s-\t\"*-&'"$folder"'/-" | ...
Вложенность кавычек здесь довольно сложная: вещи внутри одинарных кавычек представляют собой одну большую строку, при условиив качестве аргумента, который устанавливает переменную $filter_index
внутри скрипта filter-branch
.eval
запускает его через второй проход оценки, разбивается на конвейер (git ls-files
, передается по каналу sed
, передается по каналу git update-index
) и запускается несколько различных команд, каждая из которых перенаправляет свой stdin на/dev/null
.