Git Auto-Vervollständigung für * Zweige * in der Befehlszeile?

350

Auf meinem Linux-Rechner habe ich Autocomplete für Verzweigungen mit Git.

[Beachten Sie, dass es sich um die Vervollständigung von Git-Zweigen handelt, nicht um die Vervollständigung von Bashs (z. B. Befehle, Dateien usw.). Also KEINE Antwort von Lane ]

Zum Beispiel kann ich git checkout+ eingeben TABund eine Liste der Zweige erhalten.

Oder ich kann git checkout feb*+ TABeingeben, um alle Zweige abzurufen, die mit "feb" beginnen.

Wie kann ich diese Funktionalität auf einem Mac erhalten?

Ich habe versucht , das Herunterladen und Ausführen bash-completion/bash_completionund bash-completion/bash_completion.sh.inaber keine Freude. Der erste gab Fehlermeldungen über declare: -A invalid_option. Der zweite gab keine Fehler. Als ich git checkout+ TABobwohl ich noch eine Liste der Dateien im Verzeichnis bekommen, nicht Zweige. Ich bin in der Projektwurzel.

Die automatische Vervollständigung für Verzeichnisse und Bash-Befehle funktioniert einwandfrei, ist also Git-spezifisch.

Michael Durrant
quelle

Antworten:

483

ok, also brauchte ich das git autocompletion script.

Ich habe das von dieser URL erhalten:

curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash

Sie müssen sich keine Gedanken darüber machen, in welchem ​​Verzeichnis Sie sich befinden, wenn Sie dies ausführen, da Ihr Ausgangsverzeichnis ( ~) mit dem Ziel verwendet wird.

Dann fügte ich meiner ~/.bash_profileDatei den folgenden Code "Ausführen, falls vorhanden" hinzu:

if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi

Update: Ich mache diese Code-Teile übersichtlicher, um meine .bashrcDatei zu verkleinern . In diesem Fall verwende ich jetzt:

test -f ~/.git-completion.bash && . $_

Hinweis: $_bedeutet das letzte Argument zum vorherigen Befehl. Also . $_heißt es ausführen - "es" .git-completion.bashin diesem Fall zu sein

Dies funktioniert immer noch auf Ubuntu und OSX sowie auf Computern ohne das Skript- .git-completion.bashSkript.

Jetzt git Tab(eigentlich ist es git TabTab) wirkt wie ein Zauber!

ps: Wenn dies nicht von der Stange geht, müssen Sie möglicherweise rennen chmod u+x ~/.git-completion.bash, um sich die erforderliche Erlaubnis zu erteilen:

  • chmod ist der Befehl, der die Dateiberechtigungen ändert
  • u bezeichnet den Benutzer, dem die Datei gehört, standardmäßig ihren Ersteller, dh Sie
  • + bedeutet eine Berechtigung setzen / aktivieren / hinzufügen
  • x bedeutet Ausführungsberechtigung, dh die Fähigkeit, das Skript auszuführen
Michael Durrant
quelle
1
Ja, das Terminal nach dem Hinzufügen des Bash-Skripts neu zu starten hat funktioniert. Ich saß hier und fragte mich, warum immer wieder versucht wurde, meinen ModelsOrdner automatisch zu vervollständigen, als ich auf traf m Tab, um ihn automatisch zu vervollständigen master.
Alex
1
Siehe auch unix.stackexchange.com/q/48862/10043 für einen anderen Tipp
Michael Durrant
3
Wenn die akzeptierte Antwort für niemanden funktioniert, versuchen Sie Folgendes: source ~/.bash_profileNachdem Sie den Code eingefügt haben. Ein Neustart des Terminals führt ebenfalls zum gleichen Ergebnis.
Ben
Danke! Ich habe ein paar andere Sachen ausprobiert, aber nichts hat funktioniert (einschließlich dieses github.com/bobthecow/git-flow-completion/wiki/… ). Ihre Lösung hat wie ein Zauber funktioniert;)
rgoliveira
1
(Sie haben nicht brauen, gitaber Apple Standard git) brew install gitund starten Sie das Terminal für diejenigen, die seltsame Fehler wie konfrontiert sindgit checunknown option: --list-cmds=list-mainporcelain,others,nohelpers,alias,list-complete,config usage: git [--version] [--help] [-C <path>] [-c <name>=<value>] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] [-p | --paginate | --no-pager] [--no-replace-objects] [--bare] [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] <command> [<args>]
Sachin
89

Einige Benutzer bevorzugen die Verwendung eines Paket-Managers, um die Installation, Aktualisierung und Konfiguration von Mac OS-Paketen zu automatisieren. Ich bin ein Fan von Paketmanagern und ich denke, Homebrew ist der beste Paketmanager für Mac OS (einige würden sagen, es ist der De-facto-Paketmanager für Mac OS).

Sobald Sie Homebrew installiert haben, können Sie einfach git zusammen mit bash-completion mit installieren brew install git bash-completion.

In diesem Fall müssen Sie Folgendes eingeben ~/.bash_profile:

if [ -f `brew --prefix`/etc/bash_completion.d/git-completion.bash ]; then
  . `brew --prefix`/etc/bash_completion.d/git-completion.bash
fi

(Hinweis: Wenn diese Installation mit einem 404-Fehler fehlschlägt und Sie git bereits installiert haben, entfernen Sie einfach den git-Teil dieser Brauinstallation.)

Weitere Informationen zum Installieren von Git und zur Bash-Vervollständigung mit Brew finden Sie hier.

Fahrbahn
quelle
27
Das Hinzufügen gitund Hinzufügen bash-completionist keineswegs dasselbe wie das Hinzufügen. .git-completion.bash Sie sind verschiedene Programme und sie machen ganz verschiedene Dinge - einer führt die automatische Vervollständigung von Bash-Befehlen aus und der andere führt die automatische Vervollständigung von Git-Befehlen aus und 'nair the twain will meet;)
Michael Durrant,
Ich arbeite wie ein Zauber, vielen Dank. Könnten Sie bitte erläutern, wozu das Skript dient, in das Sie mich aufgenommen haben ~/.bash_profile?
Vikas Bansal
Ungeachtet dessen, was andere über diese Antwort gesagt haben, hat sie dazu geführt, dass Git Autocomplete im Terminal funktioniert.
Iain
32

Führen Sie dies auf dem Terminal aus:

curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash

Dann mach das:

vi ~/.bash_profile

Fügen Sie diese Zeilen hinzu:

if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi

Das ist alles. Das hat bei mir funktioniert.

Caique Pereira
quelle
1
(2. Schritt) Wenn jemand das bash_profile lieber mit einem Texteditor öffnen möchte, öffnen Sie einfach -e .bash_profile
Nicolas Bodin-Ripert
2
Auf einem neuen Mac OS High Sierra existiert die ~/.bash_profileDatei nicht. Das ist in Ordnung, erstelle einfach die Datei und platziere das ifSkript dort und speichere es. Laden Sie Ihre Shell nach und es wird funktionieren.
Agm1984
11

gitund git-completion.bashbereits mit MacOS Kommandozeilen-Tools ( xcode-select --install). Um die automatische Vervollständigung von Bash zu aktivieren, fügen Sie diese zu Ihrer hinzu ~/.bash_profile.

[ -f /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash ] && . /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash

Dadurch wird auch die automatische Vervollständigung für Git-Zweige aktiviert.

Harte Vakharia
quelle
Ich bin mir ziemlich sicher, dass Befehlszeilentools installiert sind, aber diese Datei existiert in meinem Fall nicht. Gerne zum Brauen (und da mein Idiot auch zum Brauen ist, vielleicht auch weiser).
Drevicko
Vielen Dank! IMO, dies sollte die Antwort mit dem grünen Häkchen sein.
Geekisthenewcool
8

Hier ist, was einige von Ihnen verwirrt: Sie haben Brew oder Ports installiert, aber Sie verwenden ein System-Git in /usr/bin/. Um dies zu überprüfen:

which git

Wenn Sie sehen, /usr/bin/gitist entweder brew nicht richtig konfiguriert oder Sie haben git nicht über brew installiert.

Wenn Sie git via brew installieren, werden durch das Aktivieren der Bash-Vervollständigungen für brew auch die Bash-Vervollständigungen für git aktiviert. Dies liegt daran, dass /usr/local/etc/bash_completiontatsächlich alles in /usr/local/bash_completion.dquellt und das Brew-Paket für git dort ein git-Vervollständigungsskript installiert.

Brandon
quelle
Dies ist sinnvoll, aber wie würden Sie "Bash-Vervollständigungen für das Brauen aktivieren"? Sie vermissen, wie das geht, dies sollte Teil Ihrer Antwort sein
skplunkerin
Ich habe dies gerade getan (es funktioniert, danke) über simplified.guide/macos/bash-completion , aber die automatische Vervollständigung ist ein paar Sekunden verzögert ... ungerade
skplunkerin
4

Sie können bash und git von MacPorts mit aktivierter Option "bash_completion" installieren. Dies ist wahrscheinlich der einfachste Weg, um sowohl Git als auch die Vervollständigungen auf dem neuesten Stand zu halten.

http://denis.tumblr.com/post/71390665/adding-bash-completion-for-git-on-mac-os-x-snow-leopard

So installieren Sie MacPorts: http://www.macports.org/install.php/

zusätzliche Information

Informationen zum Auffinden der Vervollständigungseinstellungen auf Ihrem Linux-System finden Sie in /etc/bash_completion.d/git (es ist eine lange Datei). Das Kopieren an sich wird jedoch wahrscheinlich nicht funktionieren, da es vom Completion Framework über / etc / bash_completion (das aus /etc/profile.d/bash_completion.sh; Dateien in / etc / profile stammt) bereitgestellt wird .d stammen aus / etc / profile).

Kimmo Suominen
quelle
2

Wenn Ihre Git-Vervollständigung auch nach der Beschaffung teilweise fehlerhaft ist https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash, müssen Sie möglicherweise nur Ihre Git-Version aktualisieren.

Wenn ich zum Beispiel git check+ eingebe TAB, wird es korrekt automatisch vervollständigt git checkout. Bei der Eingabe von git checkout+ TABwurde jedoch nicht nur die Liste der Zweige angezeigt HEAD.

Das Update für mich war, meine gitVersion zu aktualisieren . Ich war auf 2.7.0, was anscheinend nicht mit dem neuesten kompatibel war git-completion.bash. Ich habe ausgeführt brew upgrade git, wodurch es auf 2.13.0 aktualisiert wurde, und jetzt werden meine Zweignamen ordnungsgemäß automatisch vervollständigt.

weises Glück
quelle
Ich bekam das gleiche Problem, aber ich musste laufen brew upgrade gitund brew link git (mit aktivierter Überschreibung)
Tope
1
Danke für den catch @Tope. Ich habe mich geändert updatezu upgrade.
wisbucky
2

Die beste Referenz, die ich zur Lösung dieses Problems gefunden habe, ist SpinDance von Connor Livingston :

Wenn der git-completion.bash Skript nicht auf Ihrem Rechner vorhanden ist , bitte rufen Sie sie aus dem Link , den ich oben vorgesehen (das ist das ) und es auf Ihrem lokalen Rechner in einer neuen Datei mit dem Namen speichert git-completion.bash in dem / usr / local / etc / bash_completion.d / verzeichnis . Wenn das Skript " git-completion.bash" auf Ihrem Computer vorhanden ist, sich jedoch nicht im Verzeichnis " /usr/local/etc/bash_completion.d/" befindet , sollten wir eine Kopie davon in diesem Verzeichnis erstellen. Ein kurzes sudo cp /current/path/to/your/git-completion.bash /usr/local/etc/bash_completion.d/git-completion.bash sollte den Trick machen. Für diejenigen, die neugierig auf die /usr/local/etc/bash_completion.d/ sind Verzeichnis: Hier werden neue Beendigungsbefehle gespeichert, und Sie müssen es möglicherweise erstellen, wenn es auf Ihrem Computer noch nicht vorhanden ist.

Zu diesem Zeitpunkt sollte das Skript git-completion.bash auf Ihrem lokalen Computer im Verzeichnis /usr/local/etc/bash_completion.d/ vorhanden sein . Jetzt werden wir das Git-Vervollständigungsskript in bash einbinden, indem wir von ~ / .bash_profile darauf verweisen .

Hinweis: Die Tilde im vorherigen Satz bezieht sich auf das Basisverzeichnis auf Ihrem Computer. Fügen Sie die folgende Zeile zu ~ / .bash_profile hinzu : source /usr/local/etc/bash_completion.d/git-completion.bash und speichern Sie. Der letzte Schritt ist das Neuladen Ihres Bash-Profils. Sie können dies erreichen, indem Sie source ~ / .bash_profile in Ihrer aktuellen Bash-Sitzung ausführen .

Ricardovegasaenz
quelle
1

Versuchte es und es funktioniert gut für Zweige, aber wenn Sie git st+ tabdann tun , zeigt es den Fehler wie folgt

unbekannte Option: --list-cmds = Liste-Hauptporzellan, andere, Hilfsprogramme, Alias, Liste-Vollständig, Konfigurationsverwendung: git [--version] [--help] [-C] [-c =] [--exec -path [=]] [--html-path] [--man-path] [--info-path] [-p | --paginieren | --no-pager] [--no-replace-objects] [--bare] [--git-dir =] [--work-tree =] [--namespace =] []

Durchsuchte das Internet und stellte fest, dass --list-cmdsin der .git-completion.bashneuesten Version des Git und auf meinem Mac die Git-Version war2.17.2

Hier sind die Lösungen

Lösung 1

  1. Überprüfen Sie die Version des Git mit dem git --versionBefehl
  2. Tragen Sie dann die gleiche Versionsnummer in die URL ein wie ich

    curl https://raw.githubusercontent.com/git/git/v2.17.2/contrib/completion/git-completion.bash -o ~/.git-completion.bash
  3. Befolgen Sie dann die gleichen Schritte wie in der oberen Antwort und geben Sie den folgenden Code ein ~/.bash_profile

    if [ -f ~/.git-completion.bash ]; then
      . ~/.git-completion.bash
    fi
    

Lösung 2

Sie sollten versuchen, die Git-Version auf den neuesten Stand zu bringen, dann sollte es funktionieren.

Inder Kumar Rathore
quelle
0

Installiere oh-my-zsh und setze zsh als Standardshell und danke mir später :)

Saša Šijak
quelle
Ich habe das getan, gerade in der Hoffnung , nicht mit ihm beschäftigen - noch keinen Zweig Vorschläge nach Tab Schlagen
Jytug
Du brauchst eigentlich gar kein oh-my-zsh oder ein separates Pluginsystem! Die Git-Vervollständigung ist sofort einsatzbereit. Sie müssen sie nur aktivieren.
SilverWolf
0

Die meisten Benutzer werden gitals Teil der xcode-Befehlszeilentools unter installiert haben /usr/bin/gitund die Bash-Vervollständigungsregeln für Git werden unter verfügbar sein /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash.

In diesem Fall ist es nicht erforderlich, Git von Homebrew zu installieren oder Regeln für die Vervollständigung von Quell-Git von raw.githubusercontent.com aus zu verwenden. Erstellen Sie einfach einen Symlink wie folgt:

cd /usr/local/etc/bash_completion.d/
ln -s /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash git

Hinweis: Stellen Sie sicher, dass Sie das bash-completionPaket von Homebrew installiert und konfiguriert haben .

Dima L.
quelle
-2

Suchen Sie Ihre .bashrcDatei.

Öffne es und füge diese Zeile unten hinzu:

source /etc/bash_completion.d/git

crmpicco
quelle
1
Ich habe keinen /etc/bash_completion.d/Ordner auf einem relativ neuen System (OSX 10.10.3).
Livingtech
Versuchen Sie es zu erstellen.
Crmpicco
Nicht bash_completion, git_completion, das andere Sachen macht.
Michael Durrant
@ MichaelDurrant Es funktioniert. Vertrau mir. ;) prowrestlingtees.com/media/catalog/product/cache/1/image/…
crmpicco
@crmpicco Könnten Sie bitte Anweisungen zum Erstellen geben /etc/bash_completion.d/git? Dies würde Ihre Antwort wertvoller machen.
Dannid