Эхо в псевдонимах gitconfig, повторяющих весь список аргументов командной строки, когда ожидается только один
Долгое время в моем файле псевдонимов были следующие псевдонимы:
ignore=!([ ! -e .gitignore ] && touch .gitignore) | echo $1 >>.gitignore
Это не было оригинально для меня, и если вы будете искать его, вы увидите много мест. Однако недавно у меня возникла странная проблема с псевдонимом. Все, что я игнорирую, помещается дважды в файл.gitignore и в одну строку (только с пробелом).
Я сделал немного отладки и обнаружил, что на самом деле происходит то, что вызов echo $1
эхом $1
как и следовало ожидать, но также повторяет всю строку аргументов для псевдонима.
Чтобы проверить это, я сделал новый псевдоним:
eo = !echo $1
> git eo test
test test
> git eo test0 test1
test0 test0 test1
Эта последняя строка наиболее интересна, потому что она ясно показывает, что вызов echo получает весь набор аргументов, пока $1
оценивается правильно. На самом деле, если я возиться с вещами и изменить $1
в $9
(и не заполняйте $9
), Я получил:
> git eo test0 test1
test0 test1
Я подтвердил, что это происходит в версиях Git с 1.8.5 по 1.9.0, и я подтвердил, что этого не происходит в версии Git 1.7.1; к сожалению, я не могу проверить между 1.7.1 и 1.8.5.
У кого-нибудь есть понимание того, что здесь происходит? Это ломает несколько моих псевдонимов...
1 ответ
Я думаю, что расширение не то, что вы ожидаете. Давайте начнем с вашего псевдонима:
eo = !echo $1
я верю git eo test
расширяется до:
echo $1 test
Который затем расширяется до:
echo test test
Типичный способ, которым git смотрит на псевдоним: когда я говорю "eo", я хочу, чтобы вы запускали "echo $1" и передавали все аргументы этой команде. Это позволяет вам делать такие вещи, как
[alias]
k = !gitk
И все же быть в состоянии передать аргументы git k
, Если вы хотите, чтобы это велось по-другому, вы должны передать его через вызов оболочки, например:
[alias]
eo = !sh -c 'echo $1' -
Тогда вы получите ожидаемый результат.
Я думаю, что вы игнорируете псевдоним, вы хотите что-то вроде
[alias]
ignore = !sh -c 'echo "$1" >> .gitignore' -
Примечание: вам не нужно трогать файл для >>
работать, и в своем исходном псевдониме вы, вероятно, хотели использовать ;
вместо того, чтобы передать вывод прикосновения в эхо.