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

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

Я только что присоединился к этому сообществу, поэтому пока не могу ответить, но я нашел «oh-my-zsh» очень полезным, и мне очень нравится пользовательский интерфейс: github.com/ohmyzsh/ohmyzsh Это, конечно, для людей с помощью зш. Я предполагаю, что это не работает для bash...
Теперь, когда Mac использует zsh вместо bash, этот ответ может оказаться полезным.
для пользователей zsh: echo 'autoload -Uz compinit && compinit' >> ~/.zshrc && . ~/.zshrc ссылка

Ответы (15)

Итак, мне нужен скрипт автозаполнения 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означает разрешение на выполнение, т.е. возможность запуска скрипта
Да, перезапуск терминала после добавления сценария bash заставил его работать. Я сидел здесь, задаваясь вопросом, почему он продолжал пытаться автозаполнять мою Modelsпапку, когда я нажимал m Tab, чтобы он автозаполнялся до master.
См. Также unix.stackexchange.com/q/48862/10043 для получения другого совета.
Если принятый ответ ни у кого не работает, попробуйте следующее: source ~/.bash_profileпосле вставки кода. Перезапуск терминала также сделает то же самое.
Спасибо! Я пробовал некоторые другие вещи, но ничего не работало (включая этот github.com/bobthecow/git-flow-completion/wiki/… ). Ваше решение сработало как шарм;)
(у вас нет варева, 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>]
Я сделал это на старом компьютере, скопировал свой bash_profile на новый компьютер, но автозаполнение не сработало. Я забыл, что должен был curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bashеще раз спасибо :)
@Sachin Я разместил решение вашей проблемы здесь: apple.stackexchange.com/a/350790/18664
Одно интересное изменение, которое вы можете внести в сценарий оболочки, — проверить, нет ли там файла, а если нет, то сверните сценарий и загрузите его.
Решите в zsh, следуя ответу. stackoverflow.com/a/26479426/5293521
Кто-нибудь знает, как заставить его показывать только локальные ветки? Он также показывает все удаленные ветки.
Для MacOS Catalina это больше не работает. Решение в этом ответе: apple.stackexchange.com/a/381958/81900
git-completion.bashустарело: пользователям MacOS вместо этого следует использовать оболочку завершения zsh для git git-completion.zsh: github.com/git/git/blob/master/contrib/completion/…
@Nefeline, у меня такая же ошибка. Не могли бы вы указать мне правильный ответ о том, как использовать оболочку zsh?
это разрешило автозаполнение git. Благодарность

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

После того, как вы установили Homebrew, вы можете просто установить git вместе с дополнением bash с помощью 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-completion с brew здесь.

Добавление gitи добавление bash-completion- это совсем не то же самое, что добавление .git-completion.bash. Это разные программы, и они делают совершенно разные вещи - одна выполняет автозаполнение команды bash, а другая - автозаполнение команды git, и «наир» встретится;)
работает как шарм, большое спасибо. Не могли бы вы объяснить, для чего нужен сценарий, который вы добавили ~/.bash_profile?
Несмотря на то, что другие говорили об этом ответе, именно он заставил автозаполнение git работать в терминале.
Обратите внимание, что строки для добавления в ~/.bash_profileфайл были указаны для меня в выводе homebrew. Я использовал их вместо строк выше. Затем вам нужно перезагрузить профиль bash в каждом окне терминала, в котором вы хотите использовать автозаполнение, с помощью командыsource ~/.bash_profile

Запустите это на терминале:

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

Это все. Это сработало для меня.

(2-й шаг) Если кто-то предпочитает открывать bash_profile с помощью текстового редактора, просто сделайте следующее: open -e .bash_profile
В девственной Mac OS High Sierra ~/.bash_profileфайл не существует. Это нормально, просто создайте файл, поместите ifтуда этот скрипт и сохраните. После этого перезагрузите оболочку, и она заработает.
Это сработало для меня. Вместо vi (с которым я всегда борюсь) просто open -e ~/.bash_profile
Для 2-го шага вам понадобится эта ссылка
Полезная сопроводительная ссылка, если у вас настроены псевдонимы для git -- gist.github.com/JuggoPop/10706934

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 (и, поскольку мой мерзавец тоже с brew, возможно, тоже мудрее).
Спасибо! ИМО, это должен быть ответ с зеленой галочкой.
Это самое простое решение, и оно работает для меня
Это сработало для меня, хотя я использовал немного другой формат.if [ -f /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash ]; then . /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash > /dev/null fi
для меня ответ сработал, но после добавления данной строки ~/.bash_profileне забудьте также запустить source ~/.bash_profile(особенно если вы создаете ~/.bash_profileфайл в первый раз)
Прямо и правильно. Помните, что вы должны сначала установить инструменты командной строки Xcode, чтобы получить эту работу, использовать xcode-select --installиз Terminal.app и перезапустить, когда закончите.

Автозаполнение Git на Catalina и новее (с использованием Homebrew)

macOs изменен с bash на zsh в качестве оболочки по умолчанию, начиная с Catalina.
Поэтому вам понадобятся специальные сценарии автозаполнения для zsh.

Вот как установить их с помощью Homebrew:

brew install zsh-completion

zsh-completion Brew на самом деле включает в себя git-completion.

Чтобы активировать автозаполнение, вам нужно добавить небольшой блок кода в файл ~/.zshrc. Возможно, вам придется создать этот файл в папке пользователя, если он еще не существует. Примечание . Вывод вышеприведенного сценария установки точно скажет вам, какой код добавить, поэтому внимательно прочитайте его и скопируйте оттуда на случай, если он был обновлен с момента моего написания здесь.

if type brew &>/dev/null; then
  FPATH=$(brew --prefix)/share/zsh-completions:$FPATH

  autoload -Uz compinit
  compinit
fi

Важно:
По завершении установки прочтите выходные данные сценария установки.
Он не только проинструктирует вас добавить код в .zshrc, но и посоветует дополнительные действия, которые могут потребоваться, например принудительное восстановление zcompdump. Но, скорее всего, дополнительные шаги вам не понадобятся.

Терминал показывает раздражающее сообщение каждый раз, когда он открывается: zsh compinit: insecure directories, run compaudit for list. Ignore insecure directories and continue [y] or abort compinit [n]?Но это работает!
Я только что присоединился к этому сообществу, поэтому пока не могу ответить, но я нашел «oh-my-zsh» очень полезным, и мне очень нравится пользовательский интерфейс: github.com/ohmyzsh/ohmyzsh Это, конечно, для людей с помощью зш. Я предполагаю, что это не работает для bash...
@AdolfoCorrea вы можете устранить предупреждающее сообщение, введя следующую команду: compaudit | xargs chmod gw
Я получаю раздражающее сообщение + это не работает...
Завершения Git являются частью gitпакета Homebrew, а не zsh-completions(у которого есть дополнения для расширений Git, таких как Git Flow и другие). Итак, brew install git, который говорит вам, что он устанавливает дополнения, а затем следуйте руководству Homebrew по завершению оболочки .

Вот что смущает некоторых из вас: у вас установлены brew или порты, но вы используете системный git в формате /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 для варева»? Вы не знаете, как это сделать, это должно быть частью вашего ответа
Я только что сделал это (работает, спасибо) через упрощенный.guide /macos/ bash-completion , но автодополнение задерживается на пару секунд... странно

Вы можете установить 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).

Для macOS Catalina+ в формате zsh:

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

Затем обновите свой ~/.zshrcс помощью:

if [ -f ~/.git-completion.zsh ]; then
    . ~/.git-completion.zsh
fi
Теперь я получаю c:8: command not found: __git_aliased_commandвсякий раз, когда пытаюсь выполнить автозаполнение...

Если ваше завершение 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. Я изменился updateна upgrade.

Безусловно, лучшая ссылка, которую я нашел для решения этой самой проблемы, — это SpinDance Коннора Ливингстона :

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

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

неизвестная опция: --list-cmds=list-mainporcelain,others,nohelpers,alias,list-complete,config использование: git [--version] [--help] [-C ] [-c =] [--exec -path[=]] [--html-path] [--man-path] [--info-path] [-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 до последней версии, тогда она должна работать.

Установите oh-my-zsh и установите zsh в качестве оболочки по умолчанию и поблагодарите меня позже :)

Я сделал это именно в надежде, что мне не придется с этим сталкиваться - до сих пор нет предложений ветвей после нажатия на вкладку
На самом деле вам не нужен oh-my-zsh или даже какая-либо отдельная система плагинов! Завершение Git поставляется из коробки, вам просто нужно включить его.

Большинство пользователей установят 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.

Если вы хотите переключиться на другую оболочку, fishэта функция встроена в оболочку. Она также имеет некоторые другие удобные функции, такие как автозаполнение при наборе текста.

Найдите свой .bashrcфайл.

Откройте его и добавьте эту строку внизу:

source /etc/bash_completion.d/git

У меня нет ничего в /etc/bash_completion.d/папке на относительно новой системе (OSX 10.10.3).
Попробуйте создать его.
Не bash_completion, а git_completion, который делает разные вещи.
@MichaelDurrant Это работает. Поверьте мне. ;) prowrestlingtees.com/media/catalog/product/cache/1/image/…
@crmpicco Не могли бы вы дать инструкции по созданию /etc/bash_completion.d/git? Это сделало бы ваш ответ более ценным.
brew install git bash-completionкак объяснено на apple.stackexchange.com/a/92637/136365 , вы получите эти файлы, хотя и в другом месте.