Можно ли переопределить команду git псевдонимом git? - PullRequest
44 голосов
/ 22 августа 2010

мой ~ / .gitconfig:

[alias]
        commit = "!sh commit.sh"

Однако, когда я набираю git commit , скрипт не вызывается.

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

Ответы [ 4 ]

40 голосов
/ 22 августа 2010

НЕ ВОЗМОЖНО

Это из моего клона git.git:

static int run_argv(int *argcp, const char ***argv)
{
    int done_alias = 0;

    while (1) {
        /* See if it's an internal command */
        handle_internal_command(*argcp, *argv);

        /* .. then try the external ones */
        execv_dashed_external(*argv);

        /* It could be an alias -- this works around the insanity
         * of overriding "git log" with "git show" by having
         * alias.log = show
         */
        if (done_alias || !handle_alias(argcp, argv))
            break;
        done_alias = 1;
    }

    return done_alias;
}

Так что это невозможно. (handle_internal_command вызывает exit, если находит команду).

Вы можете исправить это в своих источниках, изменив порядок строк и сделав handle_alias call exit, если он найдет псевдоним.

21 голосов
/ 17 июня 2014

Как уже упоминалось, использовать псевдоним git для переопределения команды git невозможно. Однако можно переопределить команду git, используя псевдоним оболочки. Для любой оболочки POSIXy (т.е. не MS cmd) напишите простой исполняемый скрипт, который выполняет желаемое модифицированное поведение, и установите псевдоним оболочки. В моих .bashrc (Linux) и .bash_profile (Mac) у меня есть

export PATH="~/bin:$PATH"
...
alias git='my-git'

В моей папке ~/bin есть исполняемый скрипт Perl my-git, который проверяет, является ли первый аргумент (то есть команда git) clone. По сути это выглядит так:

#!/usr/bin/env perl
use strict;
use warnings;
my $path_to_git = '/usr/local/bin/git';
exit(system($path_to_git, @ARGV))
    if @ARGV < 2 or $ARGV[0] ne 'clone';
# Override git-clone here...

Мой немного более настраиваемый, но вы поняли.

17 голосов
/ 06 сентября 2016

Я решил решить эту проблему с помощью функции bash.Если я позвоню git clone, он перенаправит вызов на git cl, который является моим псевдонимом с некоторыми добавленными переключателями.

function git {
  if [[ "$1" == "clone" && "$@" != *"--help"* ]]; then
    shift 1
    command git cl "$@"
  else
    command git "$@"
  fi
}
14 голосов

Не только невозможно, но и WONTFIX

В 2009 http://git.661346.n2.nabble.com/allowing-aliases-to-override-builtins-to-support-default-options-td2438491.html

Hamano отвечает :

В настоящее время git не позволяет псевдонимам переопределять встроенные функции.Я понимаю причину этого, но мне интересно, слишком ли она консервативна.

Это не так.

Большинство оболочек поддерживают переопределение команд псевдонимами, и я неЯ уверен, что git должен быть более консервативным, чем оболочка.

Потому что нормальные оболочки не раскрывают псевдонимы при использовании в сценарии и дают удобный способ победить псевдоним даже из командной строки.1023 *

$ alias ls='ls -aF'
$ echo ls >script
$ chmod +x script

и сравните:

$ ./script
$ ls
$ /bin/ls
...