my ~/.gitconfig:
[alias]
commit = "!sh commit.sh"
Однако, когда я набираю git commit, script не вызывается.
Возможно ли это, или мне нужно использовать другое имя псевдонима?
my ~/.gitconfig:
[alias]
commit = "!sh commit.sh"
Однако, когда я набираю git commit, script не вызывается.
Возможно ли это, или мне нужно использовать другое имя псевдонима?
НЕ ВОЗМОЖНО
Это из моего клона 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
, если он найдет псевдоним.
Как уже упоминалось, нельзя использовать псевдоним 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 немного настраивается, но вы получаете идею.
Я решил решить эту проблему с помощью функции 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
}
Не только не возможно, но и WONTFIX
В настоящее время git не позволяет псевдонимам переопределять встроенные функции. Я понимаю причину этого, но мне интересно, чрезмерно ли она консервативна.
Это не.
Большинство оболочек поддерживают переопределение команд с псевдонимами, и я не уверен, почему git должен быть более консервативным, чем оболочка.
Потому что нормальные оболочки не раскрывают псевдонимы при использовании в сценарии и дают удобный способ победить псевдоним даже из командной строки.
$ alias ls='ls -aF' $ echo ls >script $ chmod +x script
и сравните:
$ ./script $ ls $ /bin/ls