Jak mogę utworzyć alias dla komendy git [action] (która zawiera spacje)?

29

Większość moich aliasów ma tę postać: alias p='pwd'

Chcę alias git commit, aby to zrobiłgit commit -v

Ale próba utworzenia aliasu ze spacją powoduje błąd:

$ alias 'git commit'='git commit -v'
-bash: alias: `git commit': invalid alias name
Michael Durrant
źródło

Odpowiedzi:

31

Nie jest to bezpośrednia odpowiedź na twoje pytanie (aliasy mogą być tylko jednym słowem), ale git-configzamiast tego powinieneś użyć :

git config --global alias.civ commit -v

Tworzy to alias git, który git civdziała git commit -v. Niestety, AFAIK nie ma możliwości zastąpienia istniejących poleceń git za pomocą aliasów . Jednak zawsze możesz wybrać odpowiedni alias, z którym chcesz żyć, jako alternatywę.

jw013
źródło
Zobacz notatkę dodaną, aby odpowiedzieć na git configniegit-config
Michael Durrant,
Jak tej odpowiedzi do wątku, który powiązany jasno, że jest to możliwe, aby zastąpić istniejące gitkomendy z pseudonimami, tylko z odrobiną skrypcie. (Nie zamieszczam tego komentarza jako krytyki, BTW. Ta odpowiedź została opublikowana prawie rok po twojej! Po prostu zamieszczam ją w nadziei, że ludzie mogą uznać ją za pomocną.)
sampablokuper
17

Mówisz o poleceniu zawierającym spację, ale tutaj jest to polecenie giti nie ma tam spacji.

Aby wywołać polecenie git commit , musisz je napisać

git\ commit ...
'git commit' ...
"git commit" ...

Zasadniczo polecenia nie mają miejsca w nazwach z tego powodu, że kłopotliwe jest wywoływanie ich w powłoce, więc nie sądzę, abyś znalazł takie polecenie w swoim systemie.

csh, tcsh lub zsh pozwolą ci na alias dowolnego z powyższych, ale nie na bash ani ksh (chociaż pdksh pozwoli ci, ale nie pozwolisz na ich użycie). W Zsh:

alias "'git commit'=git commit -v"
'git commit' ...

Czyni git commandpolecenie (gdy jest wywoływane jako 'git command'(tylko z pojedynczymi cudzysłowami)) jako alias gitpolecenia z argumentami commiti -v. Chyba nie tego szukałeś.

Ponieważ aliasmożna aliasować tylko polecenia aliasu, jedyne , co możesz tutaj zrobić, to gitpolecenie, a ty musisz go aliasować do czegoś, co wstawia „-v” po „commit” na liście argumentów. Najlepiej byłoby skorzystać z rozwiązania @ jw013, ale jeśli z jakiegoś powodu nie możesz lub nie chciałbyś, zamiast używać aliasu, możesz użyć funkcji do wykonania zadania:

git() {
  if [ "$1" = commit ]; then
    shift
    set -- commit -v "$@"
  fi
  command git "$@"
}
Stéphane Chazelas
źródło
3
Zauważ, że zezwalanie na aliasy ze spacjami lub innymi znakami specjalnymi jest funkcją csh nieobecną w powłokach typu Bourne'a (która zsh emuluje w dziwny sposób). Powłoki w stylu Bourne'a wyłączają rozszerzenie aliasu, gdy pierwsze słowo jest cytowane w jakikolwiek sposób, patrz odpowiedź Renana .
Gilles „SO- przestań być zły”
Tak. Dlatego powiedziałem, że działa tylko w csh, tcsh i zsh, które nie mają tego błędu. Pamiętaj, że powłoka Bourne'a nie obsługuje aliasów. Aliasy zostały wprowadzone przez csh.
Stéphane Chazelas
9

W Bash nie można utworzyć aliasu dla polecenia zawierającego dowolne spacje.
Jednak używam następującej funkcji w moim .bashrc jako obejście.

sudo() { if [[ $@ == "pacman -Syu" ]]; then command pacup.sh; else command sudo "$@"; fi; }

Jak to działa: Zaczynasz od polecenia, które chcesz wywołać. W moim przypadku tak jest sudo.
Następnie wspominasz, jakie parametry by to zajęło. W tym wypadku pacman -Syu.
Jeśli uruchomione, jakie polecenie powinno zostać wykonane? W powyższym stwierdzeniu tak jest pacup.sh.
Innego, co komenda ma być wykonywana, sudo $@. $@to, jak zgadniesz, lista parametrów pobierana przez polecenie.

Tak więc, wykonując polecenie dla konkretnego przypadku, byłoby to:

git() { if [[ $1 == "commit" ]]; then command git commit -v; else command git "$@"; fi; }

Jednak to rozwiązanie dotyczy bardziej ogólnego przypadku aliasu poleceń z białymi spacjami.
W twoim konkretnym przypadku poleciłbym skorzystanie z rozwiązania jw013 do aliasu używanych poleceń gitgit-config

darnir
źródło
Nie masz na myśli if [[ $1 == 'commit' ]]...? Rozszerzenie $ @ może zawierać więcej argumentów do zatwierdzenia, które faktycznie chcesz zachować.
kojiro
Dobrze! Mój zły .. Po prostu zmieniłem instrukcję, której używałem dla mojego systemu.
darnir
To jest niesamowite - dzięki - idealnie nadaje się do tego, czego potrzebowałem;
sprzedawca
4

Ze strony podręcznika użytkownika aliasu bash

Pierwsze słowo każdego prostego polecenia, jeśli nie jest cytowane, jest sprawdzane pod kątem aliasu. Jeśli tak, to słowo jest zastępowane tekstem aliasu. Nazwa aliasu i tekst zastępczy mogą zawierać dowolne prawidłowe dane wejściowe powłoki, w tym metaznaki powłoki, z wyjątkiem tego, że nazwa aliasu nie może zawierać `= '.

Pierwsze słowo zamiennego tekstu jest testowane pod kątem aliasów, ale słowo, które jest identyczne z rozwijanym aliasem, nie jest rozszerzane po raz drugi. Oznacza to, że można na przykład użyć aliasu ls do „ls -F”, a Bash nie próbuje rekurencyjnie rozszerzać tekstu zastępczego.

Ponieważ sprawdzane jest tylko pierwsze słowo, nie można mieć aliasu zawierającego wiele słów. W tym pytaniu dla superużytkownika przedstawiono obejście polegające na użyciu funkcji:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

Można go dostosować do git.

Renan
źródło
Ten link, który podajesz różni się od mojej dokumentacji bash, którą mam i wydaje się, że jest sprzeczny z zachowaniem bash. Powyżej napisano, że w nazwach aliasów dozwolone są spacje. Wygląda mi to bardziej na zachowanie zsh, nawet jeśli ta strona wyraźnie mówi bash.
Stéphane Chazelas
2
Powłoki @sch Bourne / POSIX omijają rozszerzenie aliasu, jeśli słowo jest cytowane w jakikolwiek sposób. Na przykład \lspomija alias dla ls.
Gilles „SO- przestań być zły”
1
@Gilles. Powłoka Bourne'a nie implementuje aliasów. POSIX mówi, że niecytowane słowo pasujące do poprawnej nazwy aliasu (będącego tylko ASCII alnum + [_!%,@]) powinno zostać rozwinięte. Nie zabrania rozszerzeń takich jak aliasing '\ ls' w zsh, lub aliasing w ksh / dash / bash / zsh, w a-bprzeciwnym razie nie istniałaby żadna powłoka POSIX. Mówi tylko, że przenośny skrypt (nie powłoka) nie powinien używać takiego aliasu.
Stéphane Chazelas,
2
@sch POSIX pozwala implementacjom na używanie innych znaków w aliasach, ale cytowanie dowolnej części słowa hamuje rozwój aliasu . Jeśli piszesz 'git commit'w pozycji polecenia w powłoce POSIX, musi ona wywołać wbudowane narzędzie, funkcję lub polecenie zewnętrzne.
Gilles „SO- przestań być zły”
0

Mimo że poprawnym rozwiązaniem jest użycie aliasów, takich jak sugerowany jw013, do utworzenia aliasu ze spacjami możesz używać NEST aliasów.

Na przykład mam alias do usuwania gałęzi zarówno lokalnie, jak i zdalnie, ale chciałbym, aby użytkownik zawsze określał gałąź:

remrem = "!sh -c 'if [ $# -ne 1 ]; then git specBranch; else git push origin :$1 && git branch -d $1; fi' -"

#echoing aliases
specBranch = "!sh -c 'echo Specify branch please!'" 
Empus
źródło
-1

Z tego przykładu powinno to działać:

Tak więc, jeśli nadal chcesz używać sudo z innymi poleceniami, ale nie z zamykaniem i jeśli możesz sobie pozwolić na alias zamykanie na coś innego, możesz mieć:

alias sudo='sudo '
alias shutdown="echo nope"

Ale za pomocą twoich poleceń:

alias git='git '
alias commit="commit -v"
Pureferret
źródło