Git Autocomplete in Bash-Aliasen?

81

Ich verwende goals einfachen Bash-Alias ​​für git checkout branchname. Was ich vermisse, ist die Autocomplete-Funktion, die mit dem vollständigen git checkout branchna...Befehl funktioniert , aber nicht im Alias.

Gibt es eine Möglichkeit, Bash anzuweisen, den Autovervollständigungstreiber für einen anderen Befehl zu "erben"?

Claudio
quelle
1
Duplizieren mit: unix.stackexchange.com/questions/4219/…
Arnaud F.
Verwandte: Wenn der Alias ​​einen benutzerdefinierten Wert festlegt, git-dirverwenden Sie diesen .
user202729

Antworten:

46

Wenn Sie die vom ursprünglichen Befehl verwendete Abschlussfunktion herausfinden können, können Sie sie mit dem Alias ​​zuweisen complete -F.

Auf meiner Ubuntu-Box git checkoutlautet die von beispielsweise verwendete Vervollständigungsfunktion _git_checkout(gefunden in /etc/bash_complete.d/git).

Beispiel

Vor dem Laufen 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/ 

Nach:

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

[me@home]$$ go <TAB><TAB>
HEAD            master          origin/HEAD     origin/master 
Shawn Chin
quelle
1
auf Ubuntu 12.04 scheinen die Vervollständigungen zu leben in: /etc/bash_completion.d/git und nicht /etc/bash_complete.d/git
Maks
8
Wenn complete -Fes bei Ihnen nicht funktioniert, lesen Sie die Antwort __git_completeunter stackoverflow.com/a/24665529/3779
Steve Clay
96

Nach der Verwendung complete -F:

complete -F _git_checkout go

Das Tabulieren nach gokann dazu führen, dass:

bash: [: 1: unary operator expected

completeVerwenden Sie stattdessen__git_complete

Dies ist die integrierte Funktion von Git Bash Completion für diesen Zweck.

Binden Sie nach dem Deklarieren Ihres Alias ​​die richtige Funktion zur automatischen Vervollständigung daran:

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
theprogrammerin
quelle
3
@ LưuVĩnhPhúc Ich hatte das gleiche Problem. Dies lag daran, dass ich die __git_completeFunktion in meinem Bash-Completion-Paket (installiert über Homebrew mit brew install bash-completion) hatte, das derzeit nicht in meinem Bash-Profil enthalten ist. Musste diese Zeile zu ~ / .bash_profile hinzufügen:[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
jangosteve
Das Hinzufügen von __git_complete unter dem git checkoutAlias ​​hat wie ein Zauber funktioniert !!!
Rajaraman
Es sollte __git_mainnicht sein _git. Der Grund _gitdafür ist nur die Abwärtskompatibilität, sie ist im Grunde genommen __git_mainverpackt.
FelipeC
18

In Ubuntu 16.04.3 LTS war die Datei, die ich beschaffen musste /usr/share/bash-completion/completions/git. Also in .bash_custom(oder .bashrc, was auch immer):

[ -f /usr/share/bash-completion/completions/git ] && . /usr/share/bash-completion/completions/git
__git_complete g __git_main
SeamusJ
quelle
1
Der Grund für das manuelle Laden ist, dass Bash diese Dateien derzeit dynamisch lädt. Bisher werden sie nach ihrem Namen geladen. Die Datei wird erst geladen, wenn Sie eine Git-Fertigstellung erreicht haben, die zum Zeitpunkt des .bashrcLesens zu spät ist .
Franklin Yu
17

Unter Ubuntu 18.04 (Bionic) funktioniert Folgendes. Fügen Sie so etwas wie dieser Schnipsel (mit Aliasnamen) , um Ihr bevorzugten bash - Konfigurationsdatei zum Beispiel .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

Im Allgemeinen __git_completelautet das Format der Richtlinie wie folgt:

__git_complete <YOUR ALIAS> _git_<GIT COMMAND NAME>

Dies kombiniert die Weisheit der vorhandenen Antworten in einer einzigen aktuellen Antwort. Vielen Dank an alle.

Adamnfish
quelle
Ich möchte nur hinzufügen, dass für eine reine SSH / Terminal-Sitzung alles in .bashrc abgelegt wird. Ich hatte das Git-komplette Zeug in .bash_profile und die Aliase in .bashrc und konnte es nicht zum Laufen bringen. Erst als ich ein echo "profile"/ hinzufügte echo "rc", fand ich das heraus.
Mtonc
2

Um weitere hervorragende Antworten hinzuzufügen: Normalerweise haben Sie viele Git-Aliase, und es kann mühsam sein, Abschlüsse für alle manuell weiterzuleiten. Hier ist ein kleiner Trick, um dies automatisch zu tun:

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
yugr
quelle
1

Unter Linux Mint hat das bei mir nicht funktioniert. Ich wurde bash: [: 1: unary operator expected .

Ich fand, dass die folgende Antwort ziemlich gut funktioniert hat - mit dem Abschnitt zur Fehlerbehebung, den der Benutzer bereitgestellt hat, um sehr hilfreich zu sein. /superuser/436314/how-can-i-get-bash-to-perform-tab-completion-for-my-aliases

Mario Olivio Flores
quelle
1

Für macOSdie folgenden Elemente installieren bash Abschluss, laufen

 brew install bash-completion

Fügen Sie dann Folgendes hinzu

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

zu Ihrem .bashrc oder .bash_profile

Anthony Kong
quelle
1

Unter Ubuntu 20.04 füge ich dies hinzu ~/.bashrc

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

Wie jemand anderes geantwortet hat, sollten Sie verwenden __git_complete, sonst schlägt das Skript fehl.

alias g="git"
__git_complete g __git_main

alias g="gl"
__git_complete gl _git_log

Aber Sie sollten nicht _gitfür den Hauptbefehl verwenden, es ist __git_main.

Leider sind viele Informationen über die Fertigstellung verborgen, aber mehr finden Sie in der README-Datei meiner Gabel: Git-Vervollständigung .

FelipeC
quelle
0

Mir ist klar, dass Sie speziell nach Bash-Aliasen fragen, aber für diejenigen, die hierher kommen und nach Autocomplete in Bash für komplexe Git-Aliase suchen , siehe hier .

Speziell:

# 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 ; ... '".
DylanYoung
quelle