Как использовать завершение Zsh Tab на Git без происхождения? - PullRequest
8 голосов
/ 17 апреля 2019

Я использую zsh с oh-my-zsh в Ubuntu 18.04.2. В настоящее время Git установлен в версии 2.20.1.

Всякий раз, когда я хочу checkout локальную ветку с удаленного компьютера (origin), я пытаюсь использовать завершение табуляции в оболочке следующим образом:

git checkout fea<TAB>

Результат заполнения вкладки:

git checkout origin/feature

Что я действительно ожидаю от завершения вкладки:

git checkout feature

Как настроить завершение вкладки для правильного (?) Завершения удаленной ветви - или я что-то упустил? Мои точечные файлы являются общедоступными.


Ответ на комментарий от Таруна Лалвани : Вывод git branch -a:

разработка
* домашнее хозяйство
пульты / происхождение / HEAD -> происхождение / развитие
пульты дистанционного управления / происхождение / разработка
пульты дистанционного управления / происхождение / мастер
пульты дистанционного управления / происхождение / выпуск
пульты дистанционного управления / происхождение / особенность

1 Ответ

3 голосов
/ 03 июля 2019

После тщательного исследования выясняется, что завершение git checkout в ZSH выполняется не oh-my-zsh , а функцией _git, предоставляемой средствами оболочки.

Как указано в комментариях, я не смог воспроизвести проблему, с которой вы столкнулись. Кажется, все работает как ожидалось. Тем не менее ...

Проверьте следующий файл:

/usr/share/zsh/<5.x>/functions/_git

Моя локальная zsh версия 5.2 . Вокруг строки 450 вы можете увидеть:

  case $state in
    (branch-or-tree-ish-or-file)
      # TODO: Something about *:: brings us here when we complete at "-".  I
      # guess that this makes sense in a way, as we might want to treat it as
      # an argument, but I can't find anything in the documentation about this
      # behavior.
      [[ $line[CURRENT] = -* ]] && return
      if (( CURRENT == 1 )) && [[ -z $opt_args[(I)--] ]]; then
        # TODO: Allow A...B
        local branch_arg='' \
              remote_branch_noprefix_arg='remote branches::__git_remote_branch_names_noprefix' \
              tree_ish_arg='tree-ishs::__git_tree_ishs' \
              file_arg='modified-files::__git_modified_files'

        if [[ -n ${opt_args[(I)-b|-B|--orphan|--detach]} ]]; then
          remote_branch_noprefix_arg=
          file_arg=
        elif [[ -n $opt_args[(I)--track] ]]; then
          branch_arg='remote-branches::__git_remote_branch_names'
          remote_branch_noprefix_arg=
          tree_ish_arg=
          file_arg=
        elif [[ -n ${opt_args[(I)--ours|--theirs|-m|--conflict|--patch]} ]]; then
          remote_branch_noprefix_arg=
        fi

        _alternative \
          $branch_arg \
          $remote_branch_noprefix_arg \
          $tree_ish_arg \
          $file_arg && ret=0

Удаление одного из массивов, переданных в _alternative, меняет то, что вам предлагается при заполнении имени ветви после git checkout. В частности, удаление $remote_branch_noprefix_arg возвращает имена удаленных веток с префиксом origin или их соответствующие имена удаленных репозиториев.

Поэтому хорошей идеей может быть обновление вашей оболочки или переход на более раннюю версию.

Некоторые детали еще:

  • Я видел, что вы редактировали исходное сообщение, и у git push есть веские причины работать немного иначе, чем git checkout;
  • Локальная ветвь гомолога удаленной может не существовать принудительно: feature отличается от origin/feature, даже если первая, если она существует, обычно настроена на отслеживание последней;
  • По умолчанию, если локальная ветвь еще не существует и когда не переданы никакие явные опции, проверка feature создаст локальную ветку eponym, сконфигурированную для отслеживания удаленной, затем переключитесь на нее, одновременно проверяя origin/feature переведет вас в автономный режим, позволяя просматривать эту удаленную ветку, но непосредственно фиксировать поверх нее.
...