Как убежать {в git alias - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь написать псевдоним журнала

git config --global --replace-all alias.lol6 "! f() { echo "\$1"; git --no-pager log --oneline  --graph -15 \${@}; }; f"

и использовать его так:

git lol5 '@{-1}'
git log '@{-1}'  #works

, но переданный в git коммит: @ -1

fatal: ambiguous argument '@-1': unknown revision or path not in the working tree

Я прочитал этот пост , но не понял, как его использовать

Спасибо Боаз

Еще немного информации, попробовал @vonc посоветовать

git config --global --replace-all alias.lol6 '! f() { echo "$1"; git --no-pager log --oneline  --graph -15 ${@}; }; f'

Получены те же результаты, включите GIT_TRACE

git lol6 @{-1}
20:20:37.454153 git.c:576               trace: exec: git-lol6 '@{-1}'
20:20:37.454153 run-command.c:640       trace: run_command: git-lol6 '@{-1}'
20:20:37.463150 run-command.c:640       trace: run_command: ' f() { echo "$1"; git --no-pager log --oneline  --graph -15 ${@}; }; f' '@{-1}'
@-1
22:20:37.607150 git.c:344               trace: built-in: git log --oneline --graph -15 @-1
fatal: ambiguous argument '@-1': unknown revision or path not in the working tree.

Git добавляет '' вокруг первого аргумента

Но !!!, если я попытался

git lol6 HEAD
20:30:35.621257 run-command.c:640       trace: run_command: ' f() { echo "$1"; git --no-pager log --oneline  --graph -15 ${@}; }; f' HEAD

Git не добавляет '' вокруг HEAD

1 Ответ

0 голосов
/ 01 июня 2018

Я предпочитаю использовать строковые кавычки ' вместо двойных кавычек: меньше экранирования в вашем случае.

См. Этот пример, сделанный в сеансе git bash.

vonc@voncavn7:/mnt/d/git/git$ 
git config --global --replace-all alias.lol6 \
  '! f() { echo "$1"; git --no-pager log --oneline  --graph -15 ${@}; }; f'

Сначала я проверяю, что могу вывести фиктивный аргумент:

vonc@voncavn7:/mnt/d/git/git$ git config --global --replace-all alias.lol6 '! f() { echo "$1"; git --no-pager log --oneline  --graph -15 ${@}; }; f'
vonc@voncavn7:/mnt/d/git/git$ git lol6 e
e
fatal: ambiguous argument 'e': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Затем я пытаюсь без кавычек при вызове псевдонима: git lol6 @{-1}

vonc@voncavn7:/mnt/d/git/git$ git lol6 @{-1}
@{-1}
* 29533fb168 (tmp2) RelNotes: the eleventh batch
*   dc8fb4dd7e Merge branch 'rb/quick-install-doc'
|\
| * 65289e9dcd install-doc-quick: allow specifying what ref to install

Если приведенный выше псевдоним / команда не работает, всегда перепроверяйте с помощью упрощенный PATH :

set G=c:\path\to\latest\git
set PATH=%G%\bin;%G%\usr\bin;%G%\mingw64\bin
set PATH=%PATH%;C:\windows\system32;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\

OPБоаз Наум подтверждает в комментариях :

с использованием 'упрощенного PATH' - это работает.
Теперь, что это значит?Почему это работает?

Это работает, потому что невозможно сказать, что находится в вашем исходном PATH, в C:\Windows\System32 и других папках, помещенных перед Git, и затеняет некоторые исполняемые файлы Git.

Как сделать так, чтобы стандартная установка Git тоже работала?

Просто замените c:\path\to\latest\git выше на свой собственный текущий путь установки Git.

Затем установите PATH:

set PATH=%G%\bin;%G%\usr\bin;%G%\mingw64\bin

Далее добавьте все своидругие папки образуют ваш исходный %PATH%, и всегда заканчиваются C:\windows\system32;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\.
Таким образом, вы:

  • начинаете с самого конкретного (Git: git/bin, git/usr/bin, git/ming64/bin), убедившись, что Git работает должным образом
  • продолжайте использовать более общие пути к приложениям (те, что были в исходном PATH)
  • заканчиваютсясамый общий ПУТЬ из всех: ОС Windows (C:\windows\system32\...)

Переходя от наиболее специфического к наиболее общему, вы снижаете уровень «неожиданного поведения» установленного программного обеспечения..

...