git автозаповнення для * гілок * у командному рядку?


350

На своїй машині Linux у мене є автозаповнення для філій з Git.

[Зауважте, ми говоримо про завершення гілки git, а не завершення bash (наприклад, команди, файли тощо). Таким чином, НЕ відповідь Лейн ]

Наприклад, я можу набрати git checkout+ TABі отримати список гілок.

Або я можу набрати git checkout feb*+, TABщоб отримати всі гілки, які починаються з "feb".

Як я можу отримати цю функціональність на Mac?

Я намагався завантажити і не працює , bash-completion/bash_completionі , bash-completion/bash_completion.sh.inале ніякої радості. Перший подав повідомлення про помилки о declare: -A invalid_option. Другий не помилявся. Коли я git checkout+, TABхоча я все ще отримую список файлів у каталозі, а не гілок. Я в корені проекту.

Автозаповнення для каталогів та команд bash працює нормально, тому це характерно для Git.

Відповіді:


482

ОК, тому мені потрібен був сценарій автозавершення git .

Я отримав це з цієї URL-адреси:

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

Не потрібно турбуватися про те, в якому каталозі ви знаходитесь, коли ви запускаєте це, оскільки ваш домашній каталог ( ~) використовується для цілі.

Потім я додав у свій ~/.bash_profileфайл наступний код "виконувати, якщо він існує":

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

Оновлення: я роблю ці біти коду більш короткими, щоб зменшити свій .bashrcфайл, і в цьому випадку я зараз використовую:

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

Примітка: $_означає останній аргумент попередньої команди. так . $_значить запустити його - «це» бути .git-completion.bashв цьому випадку

Це все ще працює як на Ubuntu, так і на OSX, а також на машинах без скрипту .git-completion.bashсценарію.

Зараз git Tab(насправді це git TabTab) працює як шарм!

ps: Якщо це не виходить з миші, можливо, вам доведеться бігти, chmod u+x ~/.git-completion.bashщоб надати собі необхідний дозвіл:

  • chmod це команда, яка змінює дозволи файлів
  • u означає користувача, якому належить файл, за замовчуванням його творця, тобто ви
  • + означає встановити / активувати / додати дозвіл
  • x означає дозвіл на виконання, тобто можливість запуску сценарію

1
Так, перезапуск терміналу після додавання скрипту bash змусив його працювати. Я сидів тут, цікавившись, чому він намагався автоматично заповнити свою Modelsпапку, коли я натиснув, m Tabщоб зробити її автозаповненням master.
Олексій

1
Дивіться також unix.stackexchange.com/q/48862/10043 за іншою порадою
Michael Durrant

3
Якщо прийнята відповідь не працює ні для кого, спробуйте це: source ~/.bash_profileпісля вставки коду. Перезапуск терміналу також зробить те саме.
Бен

Дякую! Я спробував деякі інші речі, але нічого не вийшло (включаючи цей github.com/bobthecow/git-flow-completion/wiki/… ). Ваше рішення спрацювало як принадність;)
rgoliveira

1
(у вас немає заварки, gitале Apple за замовчуванням git) brew install gitта перезавантажте термінал для тих, хто стикається з дивною помилкою, наприкладgit 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

Деякі люди вважають за краще використовувати менеджер пакунків для автоматизації встановлення, оновлення та налаштування пакетів Mac OS. Я прихильник менеджерів пакунків, і я вважаю, що Homebrew - найкращий менеджер пакунків для Mac OS (дехто би сказав, що це фактично менеджер пакунків Mac OS).

Після того, як ви встановили Homebrew, ви можете просто встановити ублюдок разом з Баш-завершенням з brew install git bash-completion.

Тоді вам потрібно буде помістити у своє ~/.bash_profile:

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

(Примітка. Якщо ця установка завершилася невдачею з помилкою 404, і ви вже встановили git, просто видаліть git частину цієї інсталяції варіння)

Більше інформації про встановлення тут git та bash-завершення з brew.


27
Додавання gitта додавання bash-completionзовсім не те саме, що додавання. .git-completion.bash Вони різні програми, і вони роблять зовсім інші речі - один виконує команду bash autocompletion, а інший git команд автозаповнення і 'nir twain зустрінеться;)
Michael Durrant

працює як шарм, велике спасибі. Не могли б ви пояснити, в чому полягає використання сценарію, який ви додали до мене ~/.bash_profile?
Вікас Бансал

Незважаючи на те, що інші сказали про цю відповідь, саме робота Git автозаповнюється в терміналі.
Iain

32

Запустіть це на терміналі:

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

Потім зробіть це:

vi ~/.bash_profile

Додайте ці рядки:

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

Це все. Це працювало для мене.


1
(2-й крок) Якщо хтось вважає за краще відкрити файл bash_profile за допомогою текстового редактора, просто зробіть це: відкрийте -e .bash_profile
Ніколас Бодін-Ріперт

2
У незайманому Mac OS High Sierra ~/.bash_profileфайл не існує. Це добре просто створити файл і помістити цей ifскрипт туди і зберегти. Перезавантажте свою оболонку після, і вона спрацює.
agm1984

11

gitі git-completion.bashвже поставляються з інструментами командного рядка macOS ( xcode-select --install). Щоб увімкнути автоматичне заповнення bash, додайте це до свого ~/.bash_profile.

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

Це також дозволить автоматично заповнити гілки Git.


Напевно, у мене встановлені інструменти командного рядка, але у моєму випадку цей файл не існує. Рада йти з варінням, але (і оскільки мій git також з варінням, можливо, і мудрішим).
drevicko

Дякую! ІМО, це має бути відповідь із зеленою галочкою.
geekisthenewcool

8

Ось що бентежить деяких з вас: у вас встановлено пивоваріння або порти, але ви використовуєте системний git /usr/bin/. Щоб перевірити це:

which git

Якщо ви бачите, що /usr/bin/gitабо пиво не налаштовано неправильно, або ви не встановили git через brew.

Якщо ви встановите git через brew, увімкнення bash завершень для brew також дозволить bash доповненням для git. Це тому, що /usr/local/etc/bash_completionнасправді є джерелом усе /usr/local/bash_completion.d, і пакет варіння для git встановлює там скрипт завершення git.


Це має сенс, але як би ви "увімкнули баш завершення заварки"? Ви пропускаєте, як це зробити, це має бути частиною вашої відповіді
skplunkerin

Я щойно це зробив (це працює, дякую) через спрощений.guide/
macos/bash-completion

4

Ви можете встановити bash та git з MacPorts з увімкненою опцією "bash_completion". Це, мабуть, найпростіший спосіб підтримувати як git, так і комплектації сучасними.

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

Щоб встановити MacPorts: http://www.macports.org/install.php/

додаткова інформація

Щодо розміщення налаштувань завершення у вашій системі Linux, подивіться у /etc/bash_completion.d/git (це довгий файл). Скопіювання цього, ймовірно, не спрацює, оскільки воно створене для отримання рамки завершення через / etc / bash_completion (яке отримується з /etc/profile.d/bash_completion.sh; файлів у / etc / profile .d отримуються з / etc / profile).


2

Якщо ваше завершення роботи git частково порушено, навіть після отримання джерела https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash, вам може знадобитися лише оновити свою версію git.

Наприклад, коли я набрав git check+ TAB, він буде автоматично заповнено git checkout. Але коли я набрав git checkout+ TAB, він не відображав лише список гілок HEAD.

Виправленням для мене було оновлення моєї gitверсії. Я був на 2.7.0, що, очевидно, не було сумісним з останніми git-completion.bash. Я побіг brew upgrade git, який оновив його до 2.13.0, і тепер він належним чином доповнює мої назви гілок.


Я отримував ту саму проблему, але мені довелося бігти brew upgrade gitі brew link git (з увімкненим
переопрацюванням

1
Дякуємо за уловку @Tope. Я змінився updateна upgrade.
wisbucky

2

На сьогоднішній день найкраща посилання, яку я знайшов для вирішення цієї проблеми, - це SpinDance , автор Connor Livingston :

Якщо скрипт git-fill.bash не існує на вашій машині, завантажте його за посиланням, яке я надав вище (яке це ), і збережіть його на своїй локальній машині в новому файлі під назвою git-fill.bash в / usr / local / тощо / bash_completion.d / каталог. Якщо скрипт git- fill.bash існує на вашій машині, але його немає в каталозі /usr/local/etc/bash_completion.d/ , нам слід створити його копію в цьому каталозі. Швидкий sudo cp /current/path/to/your/git-completion.bash /usr/local/etc/bash_completion.d/git-completion.bash повинен зробити свою справу. Для тих, хто цікавиться /usr/local/etc/bash_completion.d/ каталог: це для зберігання нових команд завершення, і вам, можливо, доведеться створити його, якщо він ще не існує на вашій машині.

У цей момент сценарій git- fill.bash повинен існувати на вашій локальній машині в каталозі /usr/local/etc/bash_completion.d/ . Тепер ми підключимо скрипт завершення git до bash, вказавши на нього з ~ / .bash_profile .

Примітка: тильда в попередньому реченні стосується домашнього каталогу вашого комп'ютера. Додайте наступний рядок до ~ / .bash_profile : source /usr/local/etc/bash_completion.d/git-completion.bash та збережіть. Останнім кроком є ​​перезавантаження вашого баш-профілю. Ви можете досягти цього, запустивши source ~ / .bash_profile у вашому поточному сеансі bash.


1

Спробував це, і він добре працює для гілок, але коли ви робите git st+, tabвін показує помилку, як це

невідомий варіант: --list-cmds = list-mainporcelain, інші, nohelpers, псевдонім, список-повний, використання конфігурації: git [--version] [--help] [-C] [-c =] [--exec -path [=]] [--html-path] [--man-path] [--info-path] [-p | --пагінат | --no-пейджер] [--no-zame-object] [--bare] [--git-dir =] [--work-tree =] [--pace names =] []

Шукав в Інтернеті і виявив, що --list-cmdsв .git-completion.bashостанній версії git, а на моєму комп'ютері - версія git2.17.2

Ось рішення

Рішення 1

  1. Перевірте версію git за допомогою git --versionкоманди
  2. Потім вставте в URL такий самий номер версії, що і я

    curl https://raw.githubusercontent.com/git/git/v2.17.2/contrib/completion/git-completion.bash -o ~/.git-completion.bash
  3. Потім виконайте ті ж дії, що і у верхній відповіді, введіть код нижче ~/.bash_profile

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

Рішення 2

Спробуйте оновити версію git до останньої, тоді вона повинна працювати.


0

Встановіть oh-my-zsh та встановіть zsh як свою оболонку за замовчуванням та подякуйте мені пізніше :)


Я зробив це, саме з надією не мати з цим справи - все одно жодних пропозицій гілок після потрапляння на вкладку
Jytug

Насправді вам взагалі не потрібен ой-мі-зш або навіть будь-яка окрема плагінова система! Git завершення виходить з коробки, ви просто повинні це ввімкнути.
SilverWolf

0

Більшість користувачів буде gitвстановлено як частина інструментів командного рядка xcode на, /usr/bin/gitа правила заповнення bash для git будуть доступні на /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash.

У цьому випадку не потрібно встановлювати git з Homebrew або вихідні правила завершення git з raw.githubusercontent.com. Просто створіть символьне посилання так:

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

Примітка. Переконайтеся, що ви встановили та налаштували bash-completionпакунок від Homebrew.


-2

Знайдіть свій .bashrcфайл.

Відкрийте його та додайте цей рядок внизу:

source /etc/bash_completion.d/git


1
У мене немає нічого /etc/bash_completion.d/папки у відносно новій системі (OSX 10.10.3).
livingtech

Спробуйте створити його.
crmpicco

Не bash_completion, git_completion, який робить різні речі.
Майкл Дюрант

@MichaelDurrant Це працює. Довірся мені. ;) prowrestlingtees.com/media/catalog/product/cache/1/image/…
crmpicco

@crmpicco Чи можете ви надати інструкції щодо створення /etc/bash_completion.d/git? Це зробило б вашу відповідь ціннішою.
Даннід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.