git auto-complete pour * branches * sur la ligne de commande?

352

Sur ma machine Linux, je réalise la saisie semi-automatique pour les branches avec Git.

[Notez que nous parlons de l’achèvement de la branche git, pas de l’ achèvement de la bash (par exemple, des commandes, des fichiers, etc.). Donc pas la réponse de Lane du tout]

Par exemple, je peux taper git checkout+ TABet obtenir une liste de branches.

Ou je peux taper git checkout feb*+ TABpour obtenir toutes les branches qui commencent par "feb".

Comment puis-je obtenir cette fonctionnalité sur un Mac?

J'ai essayé de télécharger et de courir bash-completion/bash_completionet bash-completion/bash_completion.sh.inpas de joie. Le premier donnait des messages d'erreur à propos de declare: -A invalid_option. La seconde n'a donné aucune erreur. Quand je git checkout+ TABje reçois toujours une liste de fichiers dans le répertoire, pas de branches. Je suis dans la racine du projet.

La saisie automatique pour les répertoires et les commandes bash fonctionne correctement, elle est donc spécifique à Git.

Michael Durrant
la source

Réponses:

484

ok, donc j'avais besoin du script d' auto- complétion git .

J'ai eu ça de cette url:

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

Inutile de vous soucier du répertoire dans lequel vous vous trouvez lorsque vous l'exécutez, car votre répertoire personnel ( ~) est utilisé avec la cible.

Ensuite, j'ai ajouté à mon ~/.bash_profilefichier le code suivant: "exécuter s'il existe":

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

Mise à jour: je suis en train de rendre ces bouts de code plus concis pour réduire mon .bashrcfichier, dans ce cas j'utilise maintenant:

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

Remarque: $_signifie le dernier argument de la commande précédente. . $_signifie donc l' exécuter - "il" étant .git-completion.bashdans ce cas

Cela fonctionne toujours à la fois sur Ubuntu et OSX et sur les machines sans le script .git-completion.bashscript.

Maintenant git Tab(en fait c'est git TabTab) fonctionne comme un charme!

ps: Si cela ne fonctionne pas du tout au tout début, vous devrez peut-être vous lancer chmod u+x ~/.git-completion.bashpour vous accorder l'autorisation nécessaire:

  • chmod est la commande qui modifie les autorisations de fichiers
  • u signifie l'utilisateur qui possède le fichier, par défaut son créateur, c'est-à-dire que vous
  • + signifie définir / activer / ajouter une autorisation
  • x signifie l'autorisation d'exécution, c'est-à-dire la possibilité d'exécuter le script
Michael Durrant
la source
1
Oui, le redémarrage du terminal après l'ajout du script bash l'a fait fonctionner. J'étais assis ici à me demander pourquoi il essayait sans cesse de compléter automatiquement mon Modelsdossier lorsque je le remplaçais m Tabpour le rendre complet master.
Alex
1
Voir aussi unix.stackexchange.com/q/48862/10043 pour un conseil différent
Michael Durrant
3
Si la réponse acceptée ne fonctionne pour personne, essayez ceci: source ~/.bash_profileaprès avoir collé le code. Le redémarrage du terminal fera également la même chose.
Ben
Je vous remercie! J'ai essayé d'autres choses, mais rien n'a fonctionné (y compris ceci github.com/bobthecow/git-flow-completion/wiki/… ). Votre solution a fonctionné à merveille;)
rgoliveira le
1
(vous n'avez pas d'infusion gitmais Apple par défaut git) brew install gitet redémarrez le terminal pour ceux qui font face à une erreur bizarre commegit 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
90

Certaines personnes préfèrent utiliser un gestionnaire de packages pour automatiser l'installation, la mise à jour et la configuration des packages Mac OS. Je suis un fan des gestionnaires de paquets, et je pense que Homebrew est le meilleur gestionnaire de paquets pour Mac OS (certains diraient que c'est le gestionnaire de paquets de facto pour Mac OS).

Une fois que vous avez installé Homebrew, vous pouvez simplement installer git avec bash-completion avec brew install git bash-completion.

Vous devrez ensuite mettre les éléments suivants dans votre ~/.bash_profile:

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

(Remarque: si cette installation échoue avec une erreur 404 et que git est déjà installé, supprimez simplement la partie git de cette installation).

Plus d'informations sur l'installation de git et bash-finish avec infusion ici.

voie
la source
27
Ajout gitet l' ajout bash-completionn'est pas du tout le même que l' ajout .git-completion.bash Ils sont différents programmes et ils font des choses tout à fait différentes - on fait la commande bash saisie semi - automatique et l'autre ne commande git autocomplétion et « Nair le twain rencontrera;)
Michael Durrant
travailler comme un charme, merci beaucoup. Pourriez-vous s'il vous plaît expliquer à quoi sert le script dans lequel vous m'avez ajouté ~/.bash_profile?
Vikas Bansal
Malgré ce que d’autres ont dit à propos de cette réponse, c’est celle qui a fait que git autocomplete fonctionne dans un terminal.
Iain
32

Exécutez ceci sur le terminal:

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

Ensuite, faites ceci:

vi ~/.bash_profile

Ajoutez ces lignes:

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

C'est tout. Cela a fonctionné pour moi.

Caique Pereira
la source
1
(2ème étape) Si quelqu'un préfère ouvrir le profil bash avec un éditeur de texte, procédez comme suit: ouvrez le fichier .bash_profile
Nicolas Bodin-Ripert
2
Sur un Mac OS High High Sierra vierge, le ~/.bash_profilefichier n'existe pas. C'est bien, il suffit de créer le fichier et d'y placer le ifscript et de le sauvegarder. Rechargez votre shell après et cela fonctionnera.
agm1984
12

gitet git-completion.bashdéjà venir avec des outils de ligne de commande macos ( xcode-select --install). Pour activer bash autocomplete, ajoutez ceci à votre ~/.bash_profile.

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

Cela activera également la complétion automatique pour les branches git.

Harsh Vakharia
la source
Je suis sûr que des outils de ligne de commande sont installés, mais ce fichier n'existe pas dans mon cas. Heureux d'y aller avec une infusion cependant (et puisque mon idiot est avec une infusion aussi, peut-être plus sage aussi).
Drevicko
1
Merci! OMI, cela devrait être la réponse avec la coche verte.
geekisthenewcool
C’est la solution la plus simple et elle fonctionne pour moi.
Chris Il y a
8

Voici ce qui déroute certains d'entre vous: vous avez installé une brasserie ou des ports, mais vous utilisez un git système /usr/bin/. Pour vérifier ceci:

which git

Si vous voyez, /usr/bin/gitalors soit le brassage n'est pas configuré correctement, soit vous n'avez pas installé git via le brassage.

Si vous installez git via brew, l'activation des finitions bash pour les breuvages activera également les complétions bash pour git. Ceci est dû au /usr/local/etc/bash_completionfait que tout se trouve dans les sources /usr/local/bash_completion.det que le paquet brassage pour git y installe un script de complétion.

Brandon
la source
Cela a du sens, mais comment "activeriez-vous les finitions bash pour la préparation"? Vous ne savez pas comment faire cela, cela devrait faire partie de votre réponse
skplunkerin le
Je viens de faire cela (ça marche, merci) via simplifié.guide
macos
4

Vous pouvez installer bash et git à partir de MacPorts avec l’option "bash_completion" activée. C’est probablement le moyen le plus simple de maintenir à la fois le git et les finitions.

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

Pour installer MacPorts: http://www.macports.org/install.php/

information additionnelle

Pour localiser les paramètres d'achèvement sur votre système Linux, consultez le fichier /etc/bash_completion.d/git (c'est un fichier long). Copier cela seul ne fonctionnera probablement pas, cependant, car il est conçu pour être généré par le cadre d'achèvement via / etc / bash_completion (qui provient de /etc/profile.d/bash_completion.sh; fichiers dans / etc / profile .d proviennent de / etc / profile).

Kimmo Suominen
la source
2

Si votre complétion de git est partiellement rompue, même après l’approvisionnement https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash, il vous suffira peut-être de mettre à jour votre version de git.

Par exemple, lorsque j'ai tapé git check+ TAB, la saisie semi-automatique s’effectue correctement git checkout. Mais quand j'ai tapé git checkout+ TAB, il n'affichait pas la liste des branches, seulement HEAD.

La solution pour moi était de mettre à jour ma gitversion. J'étais sur la version 2.7.0, ce qui apparemment n'était pas compatible avec la dernière git-completion.bash. J'ai exécuté brew upgrade git, qui l'a mis à jour à 2.13.0, et maintenant, il complète correctement les noms de mes branches.

sage
la source
J'avais le même problème, mais je devais courir brew upgrade gitet brew link git (avec neutralisation activée)
Tope
1
Merci pour la capture @Tope. J'ai changé updatepour upgrade.
Wisbucky
2

De loin, la meilleure référence que j'ai trouvée pour résoudre ce problème est sur SpinDance , par Connor Livingston :

Si le script git-completion.bash n’existe pas sur votre ordinateur, veuillez le récupérer à partir du lien que j’ai fourni ci-dessus (qui est celui-ci ) et enregistrez-le sur votre ordinateur local dans un nouveau fichier appelé git-completion.bash dans le répertoire / usr / local / etc / bash_completion.d / répertoire. Si le script git-completion.bash existe sur votre machine, mais ne se trouve pas dans le répertoire /usr/local/etc/bash_completion.d/ , vous devez en créer une copie dans ce répertoire. Un rapide sudo cp /current/path/to/your/git-completion.bash /usr/local/etc/bash_completion.d/git-completion.bash devrait faire l'affaire. Pour ceux qui sont curieux de connaître le /usr/local/etc/bash_completion.d/ directory: c'est pour stocker de nouvelles commandes de complétion, et vous devrez peut-être la créer si elles n'existent pas déjà sur votre machine.

À ce stade, le script git-completion.bash doit exister sur votre ordinateur local dans le répertoire /usr/local/etc/bash_completion.d/ . Nous allons maintenant brancher le script d'achèvement de git dans bash en le pointant depuis ~ / .bash_profile .

Remarque: le tilde dans la phrase précédente fait référence au répertoire de base de votre ordinateur. Ajoutez la ligne suivante à ~ / .bash_profile : source /usr/local/etc/bash_completion.d/git-completion.bash et enregistrez. La dernière étape consiste à recharger votre profil bash. Vous pouvez y parvenir en exécutant la source ~ / .bash_profile dans votre session bash actuelle.

ricardovegasaenz
la source
1

Essayé et cela fonctionne bien pour les branches, mais quand vous faites git st+ tabalors il montre l'erreur comme ceci

Option inconnue: --list-cmds = list-mainporcelain, autres, nohelpers, alias, list-complete, utilisation de la configuration: git [--version] [--help] [-C] [-c =] [--exec -path [=]] [--html-path] [--man-path] [--info-path] [-p | --paginer | --no-pager] [--no-replace-objects] [--bare] [--git-dir =] [--work-tree =] [--namespace =] []

Internet et recherché a constaté que --list-cmdsdans .git-completion.bashétait dans la dernière version du git et sur mon mac la version git était2.17.2

Voici les solutions

Solution 1

  1. Vérifiez la version du git en utilisant la git --versioncommande
  2. Puis mettez le même numéro de version dans l'URL que j'ai fait

    curl https://raw.githubusercontent.com/git/git/v2.17.2/contrib/completion/git-completion.bash -o ~/.git-completion.bash
  3. Suivez ensuite les mêmes étapes que dans la réponse en haut, mettez le code ci-dessous dans ~/.bash_profile

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

Solution 2

Vous devriez essayer de mettre à jour la version de Git au plus tard, alors cela devrait fonctionner.

Inder Kumar Rathore
la source
0

Installez oh-my-zsh et définissez zsh comme shell par défaut et remerciez-moi plus tard :)

Saša Šijak
la source
J'ai fait cela, précisément dans l'espoir de ne pas avoir à m'en occuper - toujours aucune suggestion de branche après avoir
cliqué
En fait, vous n'avez pas besoin de oh-my-zsh , ni même d'un système de plug-ins séparé! La complétion Git sort de la boîte, il vous suffit de l'activer.
SilverWolf
0

La plupart des utilisateurs auront gitinstallé dans le cadre des outils de ligne de commande xcode /usr/bin/gitet des règles de complétion pour git seront disponibles sur /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash.

Dans ce cas, il n'est pas nécessaire d'installer git à partir de Homebrew ou des règles d'achèvement de git source à partir de raw.githubusercontent.com. Créez simplement un lien symbolique comme suit:

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

Remarque: assurez-vous que vous avez installé et configuré le bash-completionpackage à partir de Homebrew.

Dima L.
la source
-2

Localisez votre .bashrcfichier.

Ouvrez-le et ajoutez cette ligne en bas:

source /etc/bash_completion.d/git

Crmpicco
la source
1
Je n'ai rien d'un /etc/bash_completion.d/dossier, sur un système relativement nouveau (OSX 10.10.3).
livingtech
Essayez de le créer.
Crmpicco
Pas bash_completion, git_completion qui fait des trucs différents.
Michael Durrant
@ MichaelDurrant Cela fonctionne. Croyez-moi. ;) prowrestlingtees.com/media/catalog/product/cache/1/image/…
crmpicco 22/02/2016
@crmpicco Pourriez-vous s'il vous plaît fournir des instructions pour créer /etc/bash_completion.d/git? Cela rendrait votre réponse plus utile.
Dannid