Эхо в псевдонимах 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' -

Примечание: вам не нужно трогать файл для >> работать, и в своем исходном псевдониме вы, вероятно, хотели использовать ; вместо того, чтобы передать вывод прикосновения в эхо.

Другие вопросы по тегам