mia ~/.gitconfig è:E 'possibile sovrascrivere il comando git con git alias?
[alias]
commit = "!sh commit.sh"
Tuttavia, quando si digita git commit, lo script non viene chiamato.
È possibile o devo utilizzare un altro nome alias?
mia ~/.gitconfig è:E 'possibile sovrascrivere il comando git con git alias?
[alias]
commit = "!sh commit.sh"
Tuttavia, quando si digita git commit, lo script non viene chiamato.
È possibile o devo utilizzare un altro nome alias?
non è possibile
Questo è dal mio clone di 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;
}
Quindi non la sua possibile. (chiama exit
se trova il comando).
È possibile risolvere questo problema nelle origini modificando l'ordine delle linee e rendendo exit
la chiamata exit
se trova l'alias.
git config dovrebbe probabilmente emettere qualche tipo di avvertimento se provi a creare un alias identico a un comando interno/esterno ... Ironicamente, non riesco a trovare dove segnalare problemi per git-scm. I risultati di Google e Stack Overflow sembrano essere annebbiati dagli strumenti per la gestione dei problemi CON Git. –
@Daniel il mailing git list – alternative
Ciò richiede la modifica del codice sorgente git. Posso invece sostituire 'libexec/git-core/git-commit' con la mia versione personalizzata – linquize
Come già accennato, non è possibile utilizzare un alias git per sovrascrivere un comando git. Tuttavia, è possibile sovrascrivere un comando git usando un alias di shell. Per qualsiasi shell POSIXy (ad esempio, non MS cmd
), scrivi un semplice script eseguibile che esegue il comportamento modificato desiderato e imposta un alias di shell. Nel mio .bashrc
(Linux) e .bash_profile
(Mac) ho
export PATH="~/bin:$PATH"
...
alias git='my-git'
Nella mia cartella ~/bin
Ho uno script Perl eseguibile chiamato my-git
che controlla se il primo argomento (vale a dire il comando git) è clone
. Sembra in sostanza, in questo modo:
#!/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...
Il mio è un po 'più configurabile, ma si ottiene l'idea.
Questa dovrebbe essere la risposta accettata. Sostituire' git' con una versione compromessa non è un soluzione valida per molti utenti – tripleee
In alternativa all'alias, puoi simulare 'git' con lo script del wrapper in una directory all'inizio del tuo' PATH'. Assicurati che lo script non eseguire se stesso invece del vero 'git', ovviamente. – tripleee
Non solo non è possibile, ma anche WONTFIX nel 2009 http://git.661346.n2.nabble.com/allowing-aliases-to-override-builtins-to-support-default-options-td2438491.html
Attualmente git non consente alias per ignorare i comandi incorporati. I capisco il ragionamento che sta dietro a questo, ma mi chiedo se è eccessivamente prudente .
Non lo è.
maggior parte delle shell supportano ignorando i comandi con gli alias, e non sono sicuro perché git ha bisogno di essere più prudenti della shell.
Perché conchiglie sane non si espandono alias quando viene utilizzato in uno script, e dà un modo pratico per sconfiggere l'alias anche dalla riga di comando.
$ alias ls='ls -aF' $ echo ls >script $ chmod +x script
e confrontare:
$ ./script $ ls $ /bin/ls
ho optato per risolvere questo con una funzione di bash. Se chiamo git clone
, reindirizzeremo la chiamata a git cl
, che è il mio alias con alcune opzioni aggiunte.
function git {
if [[ "$1" == "clone" && "[email protected]" != *"--help"* ]]; then
shift 1
command git cl "[email protected]"
else
command git "[email protected]"
fi
}
Edit: ho aggiornato il codice con command
come suggerito Aron.
Invece di usare '/ usr/local/bin/git' è possibile usare' command git' per evitare la ricerca della funzione. Vedi 'help git' –
La risposta di mathepic è completamente corretta. Certo, penso che sia una specie di punto controverso. Finché stai facendo l'aliasing, perché non accorciare il comando? Alias 'co' to'! Sh checkout.sh', quindi non devi digitare tutto (o anche tab-completarlo). – Cascabel
Questo è sfortunato. Anche a me sarebbe piaciuta questa funzione per sovrascrivere il comportamento predefinito di "git log" con un formato oneline. So che puoi usare altri alias ma finché esiste quello predefinito, l'abitudine ti fa usare e non impara mai il tuo comando sostitutivo :( –