Autouzupełnianie Git w aliasach bash?


84

Używam gojako prostego aliasu basha dla git checkout branchname. To, czego mi brakuje, to funkcja autouzupełniania, która działa z pełnym git checkout branchna...poleceniem, ale nie w aliasie.

Czy istnieje sposób, aby poinstruować Bash, aby „odziedziczył” „sterownik” autouzupełniania dla innego polecenia?




Powiązane: jeśli alias ustawia niestandardowy, git-dirużyj tego .
user202729

Odpowiedzi:


47

Jeśli możesz znaleźć funkcję uzupełniania używaną przez oryginalne polecenie, możesz przypisać ją do aliasu za pomocą complete -F.

Na przykład w moim polu ubuntu funkcja uzupełniania używana przez git checkoutto _git_checkout(znajduje się w /etc/bash_complete.d/git).

Przykład

Przed bieganiem complete -F:

[me@home]$ git checkout <TAB><TAB>
HEAD            master          origin/HEAD     origin/master

[me@home]$ alias go="git checkout"

[me@home]$$ go <TAB><TAB>
.git/                precommit_config.py  README.md            SvnSentinel/         
.gitignore           precommit.py         startcommit.py       tests/ 

Po:

[me@home]$$ complete -F _git_checkout go

[me@home]$$ go <TAB><TAB>
HEAD            master          origin/HEAD     origin/master 

1
w Ubuntu 12.04 uzupełnienia wydają się żyć w: /etc/bash_completion.d/git a nie /etc/bash_complete.d/git
Maks

8
Jeśli complete -Fto nie zadziała, zobacz odpowiedź na temat __git_completeponiżej stackoverflow.com/a/24665529/3779
Steve Clay

100

Po użyciu complete -F:

complete -F _git_checkout go

Tabowanie po gomoże spowodować:

bash: [: 1: unary operator expected

Zamiast completeużywać__git_complete

Jest to wbudowana funkcja uzupełniania git bash służąca do tego celu.

Po zadeklarowaniu aliasu, przypisz do niego poprawną funkcję autouzupełniania:

alias g="git"
__git_complete g _git

alias go="git checkout"
__git_complete go _git_checkout

alias gp="git push"
__git_complete gp _git_push

4
@ LưuVĩnhPhúc Miałem ten sam problem. Było tak, ponieważ miałem __git_completefunkcję w moim pakiecie uzupełniającym bash (zainstalowanym przez homebrew z brew install bash-completion), która nie była obecnie pobierana w moim profilu bash. Musiałem dodać tę linię do ~ / .bash_profile:[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
jangosteve

1
Dodanie __git_complete pod git checkoutaliasem działało jak urok !!!
Rajaraman

2
Tak powinno być __git_main, nie _git. Powodem _gitjest tylko kompatybilność wsteczna, jest w zasadzie __git_mainopakowany.
FelipeC

19

Na Ubuntu 18.04 (Bionic) działa następująco. Dodaj coś takiego fragmentu (z aliasów) do preferowanej konfiguracji bash pliku np .bashrc, .bash_aliases .bash_profile.

# define aliases
alias gc='git checkout'
alias gp='git pull'

# setup autocompletion
if [ -f "/usr/share/bash-completion/completions/git" ]; then
  source /usr/share/bash-completion/completions/git
  __git_complete gc _git_checkout
  __git_complete gp _git_pull
else
  echo "Error loading git completions"
fi

Ogólnie format __git_completedyrektywy jest następujący:

__git_complete <YOUR ALIAS> _git_<GIT COMMAND NAME>

To łączy mądrość z istniejących odpowiedzi w jednej aktualnej odpowiedzi, dziękuję wszystkim.


Chciałbym tylko dodać, że dla sesji tylko ssh / terminal, umieść wszystko w .bashrc. Miałem kompletną zawartość gita w .bash_profile, a aliasy w .bashrc i nie mogłem go uruchomić. Dopiero dodałem echo "profile"/, echo "rc"że to wymyśliłem.
mtonc

18

W Ubuntu 16.04.3 LTS potrzebowałem pliku źródłowego /usr/share/bash-completion/completions/git. Więc w .bash_custom(lub .bashrc, cokolwiek):

[ -f /usr/share/bash-completion/completions/git ] && . /usr/share/bash-completion/completions/git
__git_complete g __git_main

1
Powodem wymagania ręcznego ładowania jest to, że obecnie Bash ładuje te pliki dynamicznie. Do tej pory ładuje je zgodnie z ich nazwą. Plik nie zostanie załadowany, dopóki nie osiągniesz zakończenia Git, co jest za późno w momencie .bashrcodczytu.
Franklin Yu

2

Aby dodać do innych doskonałych odpowiedzi: zwykle masz wiele aliasów Git i ręczne uzupełnianie ich wszystkich może być żmudne. Oto mała sztuczka, aby zrobić to automatycznie:

if [ -f "/usr/share/bash-completion/completions/git" ]; then
  # Enable Git completions for aliases
  . /usr/share/bash-completion/completions/git
  for a in $(alias | sed -n 's/^alias \(g[^=]*\)=.git .*/\1/p'); do
    c=$(alias $a | sed 's/^[^=]*=.git \([a-z0-9\-]\+\).*/\1/' | tr '-' '_')
    if set | grep -q "^_git_$c *()"; then
      eval "__git_complete $a _git_$c"
    fi
  done
fi


1

W przypadku macOSuruchom następujące polecenie, aby zainstalować uzupełnianie bash

 brew install bash-completion

Następnie dodaj następujące elementy

[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh" 

do twojego .bashrc lub .bash_profile


1

W Ubuntu 20.04 dodaję to do ~/.bashrc

source /usr/share/bash-completion/completions/git
alias g='git'
__git_complete g _git
alias go='git checkout'
__git_complete go _git_checkout

1

Jak ktoś inny odpowiedział, powinieneś użyć __git_complete, w przeciwnym razie skrypt zawiedzie.

alias g="git"
__git_complete g __git_main

alias g="gl"
__git_complete gl _git_log

Ale nie powinieneś używać _gitgłównego polecenia, to jest __git_main.

Niestety wiele informacji o zakończeniu jest ukrytych, ale więcej można znaleźć w pliku README mojego forka: git-complete .


0

Zdaję sobie sprawę, że pytasz konkretnie o aliasy bash, ale dla tych, którzy przyjeżdżają tutaj i szukają autouzupełniania w bashu dla złożonych aliasów git, zobacz tutaj .

W szczególności:

# If you use complex aliases of form '!f() { ... }; f', you can use the null
# command ':' as the first command in the function body to declare the desired
# completion style.  For example '!f() { : git commit ; ... }; f' will
# tell the completion to use commit completion.  This also works with aliases
# of form "!sh -c '...'".  For example, "!sh -c ': git commit ; ... '".
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.