Почему выполняемая команда как псевдоним git дает разные результаты?

У меня есть следующий 1-лайнер, который я использую, чтобы увидеть, кто может быть хорошим кандидатом для помощи с куском кода:

git log --pretty=short . | grep ^Auth | sort | uniq -c | sort -nr

который перечисляет авторов в порядке коммитов, он груб, но работает нормально.

Если я добавлю его в конфигурацию git, вот так:

[alias]
    guru=!git log --pretty=short . | grep ^Auth | sort | uniq -c | sort -nr

работает

git guru

Дает разные результаты для запуска из командной строки.

[email protected](rp):~/git/apps$ git log --pretty=short . | grep ^Auth | sort | uniq -c | sort -nr
710 Author: dave <[email protected]>
415 Author: pete <[email protected]>
402 Author: craig <[email protected]>

По сравнению с:

[email protected](rp):~/git/apps$ git guru
859 Author: craig <[email protected]>
813 Author: paul <[email protected]>
798 Author: dave <[email protected]>

Как отмечает Stefan Näwe ниже, псевдонимы запускаются в корне вашего репозитория, есть ли способ запустить команду в каталоге, в котором я есть, или указать?

Ответ 1

Глядя на то, что вы делаете, вы, вероятно, захотите использовать git shortlog -sn, так как это уже делает задание.

git псевдонимы не все работают на верхнем уровне. Как описано в git config manual "Обратите внимание, что команды оболочки будут выполняться из каталога верхнего уровня репозитория, что может не обязательно быть текущим каталогом". Таким образом, только команды оболочки запускаются на верхнем уровне. Если вы просто используете подкоманду git, она будет работать в текущем местоположении. Следующий журнал сеансов демонстрирует это:

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf)
$ git rev-parse  --show-cdup
../../

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf)
$ git config alias.cdup 'rev-parse --show-cdup'

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf)
$ git cdup
../../

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf)
$ git config alias.cdup2 '!git rev-parse --show-cdup'

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf)
$ git cdup2

[email protected] /c/src/WiRE.git/wdf/src (pt/wdf)
$

В вашем примере используется команда alias, которая начинается с 'git'. Если я попробую установить 'git rev-parse --show-cdup' в качестве псевдонима, он возвращает ошибку с сообщением 'git не является git командой ", поэтому я подозреваю, что у вас на самом деле был восклицательный знак, как команда оболочки, тем самым бегая от верхнего уровня.

Ответ 2

есть ли способ запустить команду в каталоге, в котором я находится, или указать?

Да, есть. Когда вы запускаете команду git, ваша среда получает переменную GIT_PREFIX со значением относительного пути (от toplevel до пути до выполнения git), так что вам нужно префикс ваших псевдонимов git (которые запускаются командам оболочки и нужен правильный pwd) с помощью cd ${GIT_PREFIX:-.} &&.

Простой тест, добавьте его в свой ~/.gitconfig

[alias] p = !pwd && cd ${GIT_PREFIX:-.} && pwd

Ответ 3

git псевдонимы с использованием команды оболочки (т.е. с префиксом !) выполняются в верхнем уровне рабочего каталога (где живет .git). Простые псевдонимы (без !) выполняются в текущем каталоге.