TL; DR
Как мне указать .gitconfig
значение конфигурации в другом значении конфигурации?
.gitconfig
[filter "myFilter"]
foo = Hello world
bar = echo $(git config filter.myFilter.foo)
Баш
$(git config filter.myFilter.bar)
# should print "Hello world"
Моя проблема
Я пытаюсь написать несколько smudge
/ clean
фильтров (а-ля Может ли git автоматически переключаться между пробелами и табуляциями? ), чтобы при оформлении заказа размер табуляции был равен 4 пробелам, и совершить, они возвращаются к тому, что уже находится в репо.
Ответы SO предлагают это:
git config --global filter.tabspace.smudge 'unexpand --tabs=4'
git config --global filter.tabspace.clean 'expand --tabs=4'
Или эквивалентный .gitconfig
файл:
[filter "tabspace"]
smudge = 'unexpand --tabs=4'
clean = 'expand --tabs=4'
Это прекрасно работает, если вы знаете, что все ваши удаленные репозитории используют вкладки. Я хочу обобщить это (и в процессе, узнать больше о git config
), чтобы я мог установить значение, а значения в ~/.gitconfig
сделают все остальное.
Желаемое поведение
Мой ~/.gitconfig
выглядит как
#...
[filter "tabspace"]
repoTabs = false
repoTabSize = 4
smudge = # TODO
clean = # TODO
#...
Когда я клонирую репо, использующий табуляции или не 4 пробела, я запускаю
# for repos that use tabs
git config filter.tabspace.repoTabs true
# for repos that use 2 spaces
git config filter.tabspace.repoTabSize 2
, а затем создайте файл на .git/info/attributes
, который выглядит как
*.js filter=tabspace
*.jsx filter=tabspace
*.ts filter=tabspace
*.tsx filter=tabspace
*.json filter=tabspace
Частичное решение
Сценарии, которые я хочу использовать для smudge
и clean
, должны быть относительно простыми (я написал их по одной в каждой строке, в моем файле ~/.gitconfig
вместо двух # TODO
с):
# smudge
if [ `#filter.tabspace.repoTabs` == true ]; then
expand --tabs=4
else
unexpand --tabs=`#filter.tabspace.repoTabSize` | expand --tabs=4
fi
# clean
if [ `#filter.tabspace.repoTabs` == true ]; then
unexpand --tabs=4
else
unexpand --tabs=4 | expand --tabs=`#filter.tabspace.repoTabSize`
fi
Что я не могу понять для себя, так это как заставить значения filter.tabspace.repoTabs
и filter.tabspace.repoTabSize
работать в скрипте.
Мой метод тестирования - установить smudge = #my-script-here
, а затем запустить
$(git config filter.tabspace.smudge)
, где #my-script-here
- это что-то вроде echo $(git config filter.tabspace.repoTabSize)
с десятками попыток заключить различные части значения в одинарные, двойные, двойные кавычки и обратные кавычки вместо $()
. Все, что я пробовал, либо оценивает $(git config filter.tabspace.repoTabSize)
буквально, либо не дает результата.
Я также пытался просто использовать repoTabSize
, надеясь, что он просто вставит переменную scoped, но не повезло.
В качестве проверки работоспособности:
git config filter.tabspace.repoTabSize 2
echo $(git config filter.tabspace.repoTabSize)
# prints
2
Я также проверил, что передача значения в оператор if
делает то, что мне нужно, предполагая, что git checkout
и git commit
передают файлы через значения filter.tabspace.smudge
и filter.tabspace.clean
соответственно.
echo -e '\t'foo | if [ true ]; then expand --tabs=4; fi
# prints (with 4 spaces):
foo