Можно ли переопределить команду git с помощью псевдонима git?

my ~/.gitconfig:

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

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

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

Ответы

Ответ 1

НЕ ВОЗМОЖНО

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

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

    while (1) {
        /* See if it 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 вызов exit, если он найдет псевдоним.

Ответ 2

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

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

В моей папке ~/bin у меня есть исполняемый Perl script, называемый 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...

Mine немного настраивается, но вы получаете идею.

Ответ 3

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

function git {
  if [[ "$1" == "clone" && "[email protected]" != *"--help"* ]]; then
    shift 1
    command git cl "[email protected]"
  else
    command git "[email protected]"
  fi
}

Ответ 4

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

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

Хамано отвечает:

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

Это не.

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

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

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

и сравните:

$ ./script
$ ls
$ /bin/ls