git автозаполнение для * ветки * в командной строке?


352

На моей машине с 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.

Ответы:


484

Итак, мне нужен был скрипт автозаполнения 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.
Алекс


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

90

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

После того, как вы установили Homebrew, вы можете просто установить git вместе с bash-complete с 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 этой установки brew)

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


27
Добавление gitи добавление bash-completion- это совсем не то же самое, что добавление. .git-completion.bash Это разные программы, и они делают совершенно разные вещи: одна выполняет автозаполнение команды bash, а другая - автозаполнение команды git, и 'nair the twain встретится;)
Майкл Даррант,

работает как шарм, большое спасибо. Не могли бы вы объяснить, для чего используется сценарий, в который вы меня добавили ~/.bash_profile?
Викас

Несмотря на то, что другие говорили об этом ответе, именно он заставил git autocomplete работать в терминале.
Иэн

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 с помощью текстового редактора, просто сделайте это: open -e .bash_profile
Николас Бодин-Риперт

2
На девственной Mac OS High Sierra ~/.bash_profileфайл не существует. Это нормально, просто создайте файл и поместите ifтуда этот скрипт и сохраните. Перезагрузите свою оболочку после и она заработает.
agm1984

12

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.


Я уверен, что у меня установлены инструменты командной строки, но этот файл не существует в моем случае. Хотя я счастлив с brew (и так как мой git тоже с brew, возможно, и мудрее).
Древичко

1
Спасибо! ИМО, это должен быть ответ с зеленой галочкой.
geekisthenewcool

Это самое простое решение, и оно работает для меня
Крис

8

Вот что сбивает с толку некоторых из вас: у вас установлены brew или порты, но вы используете системный мерзавец /usr/bin/. Чтобы проверить это:

which git

Если вы видите, /usr/bin/gitлибо brew настроен неправильно, либо вы не установили git через brew.

Если вы устанавливаете git через brew, то включение дополнений bash для brew также включает завершение bash для git. Это потому, что на /usr/local/etc/bash_completionсамом деле все находится в /usr/local/bash_completion.dисходном коде, и пакет brew для git устанавливает там скрипт завершения git.


Это имеет смысл, но как бы вы "включили bash завершений для brew"? Вы упускаете, как это сделать, это должно быть частью вашего ответа
skplunkerin

Я только что сделал это (это работает, спасибо) через simpified.guide/macos/bash-completion , но автоматическое завершение задерживается на пару секунд ... странно
skplunkerin

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 (с включенным переопределением)
Tope

1
Спасибо за улов @Tope. Я изменился updateна upgrade.
Висбуки

2

Безусловно, лучшая рекомендация, которую я нашел для решения этой самой проблемы, - это SpinDance от Connor Livingston :

Если на вашем компьютере не существует сценария git-creation.bash , пожалуйста, найдите его по приведенной выше ссылке (и это так ) и сохраните его на локальном компьютере в новом файле с именем git-creation.bash в / каталог usr / local / etc / bash_completion.d / . Если сценарий git-creation.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-creation.bash должен существовать на вашем локальном компьютере в каталоге /usr/local/etc/bash_completion.d/ . Теперь мы подключим скрипт завершения git к bash, указав на него из ~ / .bash_profile .

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


1

Пробовал, и он работает хорошо для веток, но когда вы делаете git st+, tabто это показывает ошибку, как это

Неизвестная опция: --list-cmds = list-mainporcelain, другие, nohelpers, псевдоним, полный список, использование конфигурации: git [--version] [--help] [-C] [-c =] [--exec -path [=]] [--html-путь] [--man-путь] [--info-путь] [-p | --paginate | --no-pager] [--no-replace-objects] [--bare] [--git-dir =] [--work-tree =] [--namespace =] []

Поискал в интернете и обнаружил, что --list-cmdsв .git-completion.bashпоследней версии git и на моем mac версия git была2.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 в качестве оболочки по умолчанию, и спасибо мне позже :)


Я сделал это, точно в надежде, что вам не придется иметь дело с этим - все еще нет предложений по
веткам

Вы на самом деле не нуждаетесь в oh-my-zsh или даже в отдельной системе плагинов! Git complete выходит из коробки, вам просто нужно его включить.
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.