Можно ли переопределить команду 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