Расширение псевдонима не удалось; не команда git - PullRequest
2 голосов
/ 10 марта 2020

Я, должно быть, упускаю что-то очевидное ... но Git псевдонимы вообще не работают. Помогите мне, пожалуйста!

$ git config --global alias.v version
$ git config --global --list
alias.v=version
$ git config --global alias.v
version
$ git v
Expansion of alias 'v' failed; 'version' is not a git command
$ git version
git version 2.9.0
$ cat ~/.gitconfig
[alias]
        v = version

Обновление 1

По предложению @ torek я протестировал ту же самую вещь с log, и она также не работает:

$ git config --global alias.l log
$ git config --global --list
alias.v=version
alias.l=log
$ git config --global alias.l
log
$ git l
Expansion of alias 'l' failed; 'log' is not a git command
$ cat ~/.gitconfig
[alias]
        v = version
        l = log

Обновление 2: решено

Проблема заключалась в том, что git --exec-path был каким-то образом указан неверный каталог. В конце концов, я собрал и установил из исходного кода, и теперь все работает как положено. Спасибо всем, кто помог.

Ответы [ 3 ]

2 голосов
/ 10 марта 2020

Используйте команду, отличную от version. Например, попробуйте использовать псевдонимы от l до log. (Или, как отмечает Von C, обновление - на самом деле работает в современной Git. Обработка псевдонимов, кажется, была переписана между 2.17.3 и 2.18.0.)

Почему l = log работает, и все же v = version нет?

Это немного сложно!

Большинство Git команд - и в один момент все Git команды были - отдельные программы, которые устанавливаются отдельно в каталог (или папку, если вы предпочитаете термин), полный «Git команд, которые вы можете запустить». Например, git log на самом деле реализуется командой, записанной git-log, которая устанавливается в специальный каталог / папку.

Этот каталог / папка , а не , которую вы обычно запускаете команды из , однако.

В далеком прошлом эти Git команды - git-log, git-commit, git-add, git-diff и т. Д. - были все установил непосредственно, и вы запустили их напрямую, набрав git-<em>something</em>. Это хорошо работает с автозаполнением bash, так как вы можете набрать git-com<kbd>TAB</kbd>, чтобы получить команду фиксации, или git-ch<kbd>TAB</kbd>, чтобы получить команду извлечения. Но со временем число команд Git росло (git-cherry и git-cherry-pick), росло и росло; и в конце концов даже набора полной команды git-add оказалось недостаточно , потому что, к примеру, git-add--interactive, поэтому завершение TAB практически полностью перестало работать.

Принято решение: Git не собирается прекращать поступать с 57 различными командами - на самом деле, сейчас их более 150 - но вместо этого все эти различные команды реализация будут сгруппированы в такое место, где они не будут все время в твоем лице. Команда single front end , записанная git, позволит вам ввести команду как аргумент для команды front-end git: git com, затем TAB : bash теперь имеет список из разрешенных завершений и выберет только commit, поскольку это единственное com, которое вас будет использовать, а не git-commit-tree или git-commit-graph фоновые программы, которые регулярно используются только сценариями.

Итак: команда front end git знает, как найти и запустить все различные реализации back end . По соглашению, большинство из них находятся в каталоге git-core: запустите

git --exec-path

, и внешний интерфейс напечатает название места, где фактически живут все фоновые программы. (Вы можете заглянуть туда и даже запустить их оттуда напрямую, если хотите, хотя в наши дни команда git внешнего интерфейса теперь устанавливает информацию, которая может потребоваться командам внутреннего интерфейса.)

Но что о git version? Итак, теперь, когда вы знаете, что команды Git фактически находятся в папке git-core, где бы это ни находилось в вашей системе, я предлагаю вам посмотреть там. Где находится программа git-version? Там вы найдете git-checkout, git-log, git-commit, git-diff и многие другие, но вы не найдете git-version. Его нет.

Команда version встроена непосредственно в интерфейс . псевдонимы работают только при вызове команды back end . Так что, в любом случае, нет или не было псевдонима version. (В какой-то момент, очевидно, после 2.9 и до 2.24, код обработки псевдонимов был улучшен для проверки встроенных функций интерфейса).

Есть еще одна важная вещь, которую нужно знать

Внешний интерфейс git команда знает о некоторых общих внутренних командах, но он не не имеет полного списка внутренних команд. Вместо этого, когда вы вводите git asdf или git rumplestiltskin или git helloworld - ни одна из которых не является действительными Git командами - он просто настраивает все как обычно, а затем пытается запустить git-asdf или git-rumplestiltskin или git-helloworld, при этом указав системе искать в каталоге git-core. Система не не указывает искать в других каталогах.

Это означает, что вы можете написать свои Git команды. Если вам нужна git asdf, вы можете написать собственную программу git-asdf и поместить ее в любое место, чтобы запуск git-asdf завершился успешно. Теперь вы можете запустить его, используя git asdf.

Почему, вы можете спросить, захотите ли вы сделать это? Если вы устанавливаете git-asdf в свою собственную папку bin или scripts, вы можете просто запустить git-asdf. И действительно, вы можете сделать это. Но когда у вас есть front end , вы запускаете со специальной предоставленной Git информацией о настройке. Это дает вам возможность написать свою программу в виде sh (или bash) сценариев и и получить прямой доступ к различным Git помощникам. Основной помощник называется git-sh-setup, и вы вызываете его, используя "источник", с помощью . (POSIX) или source (bash):

#! /bin/sh
. git-sh-setup

Это добавляет функции оболочки die и say и git_pager и require_clean_work_tree и более. Если вы установите переменную оболочки OPTIONS_SPEC перед источником git-sh-setup, она проанализирует аргументы за вас. Посмотрите на сценарий - он находится прямо в каталоге git-core - чтобы увидеть, как его использовать.

(Обратите внимание, что, как и все вещи Git, он со временем вырос. У него теперь больше функций чем, например, во времена Git 1.7. Если вы хотите что-то, что перенесено в более ранние версии Git, клонируйте репозиторий Git для Git, выберите уровень совместимости и git checkout старый, чтобы увидеть, на что можно положиться.)

0 голосов
/ 10 марта 2020

Вы также можете использовать,

$ git config --global alias.v "!git version"
$ git v
git version 2.20.1
0 голосов
/ 10 марта 2020

Я только что проверил его с Git 2.24 и 2.25.1: он работает просто отлично.

C:\>git config --global alias.v version

C:\>git v
git version 2.25.1.windows.1

Итак, сначала попробуйте обновить старый 2.9.0 до текущего 2.25.1. и посмотрите, не исчезнет ли проблема.
( ppa upgrade , если вы используете Linux)

Я подозреваю commit 50ad856 в Git v2. 14.0-rc0 (Q3 2017) помогло.


Но эта точно такая же версия, установленная из того же архива, отлично работает на другой машине. Так что маловероятно, что версия git является причиной?

Затем необходимо сравнить .bashrc/.profile, а также вывод env между этими двумя учетными записями компьютеров.
Разница в среде выполнения может объяснить разницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...