В основном я пытаюсь псевдоним:
git files 9fa3
... выполнить команду:
git diff --name-status 9fa3^ 9fa3
но git не передает позиционные параметры команде alias. Я пытался:
[alias]
files = "!git diff --name-status $1^ $1"
files = "!git diff --name-status {1}^ {1}"
... и несколько других, но те не работали.
Вырожденный случай будет:
$ git echo_reverse_these_params a b c d e
e d c b a
... как я могу заставить эту работу?
$1
должен работать).Ответы:
Наиболее очевидный способ - использовать функцию оболочки:
Псевдоним без
!
рассматривается как команда Git; напримерcommit-all = commit -a
.С помощью
!
он запускается как отдельная команда в оболочке, позволяя вам использовать более сильную магию, подобную этой.UPD
Поскольку команды выполняются в корне хранилища, вы можете использовать
${GIT_PREFIX}
переменную при обращении к именам файлов в командахисточник
!
рассматривается как команда Git; напримерcommit-all = commit -a
. С помощью!
он запускается как отдельная команда в оболочке, позволяя вам использовать более сильную магию, подобную этой.!
будет запускаться в корне хранилища, поэтому использование относительных путей при вызове псевдонима не даст ожидаемых результатов.Вы также можете ссылаться
sh
напрямую (вместо создания функции):(Обратите внимание на черту в конце строки - она вам понадобится.)
источник
sh
, поскольку она сама по себе является оболочкой и доступна в подавляющем большинстве систем. Использование оболочки по умолчанию работает, только если команда работает так, как написано для всех оболочек.--
чтобы ,-
как это более знакомо и менее вероятно, случайно средний стандартный ввод в каком - то момент. («Аргумент - эквивалентен -» в bash (1) недоступен для просмотра)sh -c
) также не требуется . Смотрите мой ответ для альтернативы.Псевдоним, который вы ищете:
С проверкой аргумента:
Окончательное
#
важно - это предотвращает все предоставленные пользователем аргументы из обработки с помощью оболочки (это комментарии их).Примечание:
git
помещает все предоставленные пользователем аргументы в конец командной строки. Чтобы увидеть это в действии, попробуйте:GIT_TRACE=2 git files a b c d
Экранированные (из-за вложенности) кавычки важны для имен файлов, содержащих пробелы или
"; rm -rf --no-preserve-root /;
)источник
!
уже подразумеваетсяsh -c
(показывается при добавленииGIT_TRACE=2
), поэтому нет необходимости запускать другую вложенную оболочку. Какие проблемы вы видите в более сложных случаях?fp = "! 1=${1:-$(git headBranch)}; 2=${2:-up}; git fetch -fu $2 pull/$1/head:$1; git checkout $1; git branch -u $2 #"
. Это прекрасно работает без первых двух утверждений, но падает, если вы их используете. (У меняheadBranch = symbolic-ref --short HEAD
так же).fp = "! a=${1:-$(git headBranch)}; b=${2:-up}; git fetch -fu $b pull/$a/head:$a; git checkout $a; git branch -u $b #"
."
цитаты обязательны?Используйте GIT_TRACE = 1, описанный на странице руководства git, чтобы сделать обработку псевдонимов прозрачной:
Ваши оригинальные команды работают с git версии 1.8.3.4 (Eimantas отметил, что это изменилось в 1.8.2.1).
В
sh -c '..' --
иf() {..}; f
варианты как чисто обрабатывать «$ @» параметры по - разному (см с GIT_TRACE). Добавление «#» к псевдониму также позволило бы позиционные параметры, не оставляя завершающих.источник
files = "!git diff --name-status $1^ $1 #"
files = "!git diff --name-status $1^"
Как сказано выше Drealmer :
GIT_PREFIX
Установив git в подкаталог, в котором вы находитесь, вы можете обойти это, сначала изменив каталог:источник
cd ${GIT_PREFIX:-.} &&.
» (источник: stackoverflow.com/a/21929373/266309 )!cd "${GIT_PREFIX:-.}" && ls -al
Я хотел сделать это с псевдонимом, который делает это:
В конце я создал сценарий оболочки с именем git-m, который имеет следующее содержимое:
Это имеет то преимущество, что это гораздо более разборчивыми , потому что это на несколько строк. Кроме того, я , как возможность позвонить Баш с
-x
иset -e
. Вероятно, вы можете сделать все это как псевдоним, но это было бы ужасно и трудно поддерживать.Поскольку файл назван,
git-m
вы можете запустить его так:git m foo bar
источник
'!f() { : git branch ; ... }; f'
и он автоматически завершит псевдоним как ветвь, что очень удобно..bashrc
файле, который я получаю. Но я не думаю, что я изменяю то, как я автоматически заполняю аргументы для скрипта так же, как сам скрипт, и это происходит только во время разработки.Просто наткнулся на что-то подобное; надеюсь, что все в порядке, чтобы опубликовать мои заметки. Одна вещь, которая путает меня в
git
псевдонимах с аргументами, вероятно, происходит изgit help config
(у меня git версия 1.7.9.5):На мой взгляд, если псевдоним «будет обрабатываться как команда оболочки» с префиксом восклицательного знака, - зачем мне использовать функцию, или
sh -c
аргументы; почему бы просто не написать мою команду как есть?Я до сих пор не знаю ответа - но я думаю, что на самом деле есть небольшая разница в результатах. Вот небольшой тест - добавьте это в свой
.git/config
или свой~/.gitconfig
:Вот что я запускаю эти псевдонимы:
... или: когда вы используете "обычную" команду после
!
"как есть" вgit
псевдониме - тогдаgit
автоматически добавляет список аргументов к этой команде! Способ избежать этого - вызвать скрипт как функцию или как аргументsh -c
.Еще одна интересная вещь (для меня) заключается в том, что в сценарии оболочки обычно ожидается, что автоматической переменной
$0
будет имя файла сценария. Но дляgit
функции псевдонима,$0
аргумент, в основном, является содержимым всего строки, определяющей эту команду (как указано в файле конфигурации).Вот почему, я думаю, если вы ошибетесь в кавычках - в приведенном ниже случае это будет экранировать внешние двойные кавычки:
... - тогда
git
потерпел бы неудачу с (для меня, по крайней мере) несколько загадочным сообщением:Я думаю, так как
git
«видел» целую строку как только один аргумент!
- он пытался запустить ее как исполняемый файл; и, соответственно, не удалось найти"echo 'A' 'B'"
файл.В любом случае, в контексте
git help config
приведенной выше цитаты, я бы предположил, что более правильно заявить что-то вроде: " ... вызов" git new "эквивалентен выполнению команды оболочки" gitk --all --not ORIG_HEAD " $ @ ", где $ @ - аргументы, передаваемые псевдониму команды git из командной строки во время выполнения. ... ". Я думаю, что это также объясняет, почему «прямой» подход в OP не работает с позиционными параметрами.источник
fail
пытается выполнить команду с именем "echo 'A' 'B" (т. е. длиной 10 символов). Та же ошибкаsh -c "'echo a b'"
и та же причина, слишком много слоев цитат