Отключить автозаполнение удаленных веток в Git Bash? - PullRequest
36 голосов
/ 08 июля 2011

Я работаю над довольно большим git-репо с несколькими тысячами (удаленных) веток.Я привык использовать автозаполнение (используя [TAB]) в консоли (в этом случае Git Bash), поэтому я неосознанно делаю это и для команд git.

например, я бы набрал

git checkout task[TAB]

с тем эффектом, что консоль часто глохнет.Можно ли ограничить автозаполнение только локальными филиалами?

Ответы [ 8 ]

25 голосов
/ 05 сентября 2013

Я предполагаю, что вы используете скрипт git-completion.bash, и что вы только заботитесь о git checkout.

Чтобы выполнить это, я просто изменил одну строку вопределение функции _git_checkout () в git-completion.bash:

<       __gitcomp_nl "$(__git_refs '' $track)"
---
>       __gitcomp_nl "$(__git_heads '' $track)"

Насколько я понимаю, это влияет только на действие по завершению табуляции (из-за его расположения в случае * оператора switch-case).

19 голосов
/ 03 мая 2017

С Git 2.13 (Q2 2017) вы можете отключить (частично) завершение ветвления.

git checkout --no-guess ...
# or:
export GIT_COMPLETION_CHECKOUT_NO_GUESS=1

См. коммит 60e71bb (21 апреля 2017) от Джефф Кинг (peff) .
(Объединено Junio ​​C Hamano - gitster - в коммит b439747 , 01 мая 2017 г.)

Как указано в contrib/completion/git-completion.bash сейчас:

Вы можете установить следующие переменные среды, чтобы влиять на поведение подпрограмм завершения:

GIT_COMPLETION_CHECKOUT_NO_GUESS

Если установлено значение "1", не включать предложения "DWIM" в git-checkout завершение (например, завершение «foo», когда существует «origin / foo»).

Примечание: DWIM - это сокращение от D o W hat I M ean , где система пытается предугадать, что пользователи намерены делать, исправляя тривиальные ошибки автоматически, а не слепо выполняя явные, но потенциально неверные вводы пользователей.

completion: опционально отключить оформление заказа DWIM

Когда мы заполняем имена веток для "git checkout", мы также заполняем имена удаленных ветвей, которые могут вызвать поведение DWIM. В зависимости от вашего рабочего процесса и проекта это может быть удобным или раздражающим.

Например, мой клон gitster.git содержит 74 локальных "jk/*" ветви, но origin содержит еще 147.
Когда я хочу оформить заказ в местном отделении, но не могу вспомнить название, на вкладке отображается 251 запись. И что еще хуже, для темы, которая была выбрана для pu, название ветки вверх по течению, вероятно, будет похоже на мое, что приведет к высокой вероятности, что я выберу неправильную и случайно создаю новую ветку.


Примечание: "Подобрано за пу": см. Что готовится в git.git: начинается с:

Коммиты с префиксом '-' находятся только в 'pu' (предлагаемые обновления) , а коммиты с префиксом '+' находятся в 'next'.

Это часть процесса окончания рабочего процесса Git .

pu (предлагаемые обновления) - это ветка интеграции для вещей, которые еще не готовы для включения


Этот патч добавляет пользователю способ сообщить о завершении код, не включающий предложения DWIM для оформления заказа.
Это уже можно сделать, набрав:

git checkout --no-guess jk/<TAB>

но это довольно громоздко.

Недостатком, конечно, является то, что вы больше не получаете поддержку завершения, когда вы do хотите вызвать поведение DWIM.
Но, в зависимости от вашего рабочего процесса, это не может быть большой потерей (например, в git.git я с большей вероятностью захочу отключиться, поэтому я все равно наберу "git checkout origin/jk/<TAB>").

10 голосов
/ 08 июля 2011

Вы можете взломать /etc/bash_completion.d/git

Вам нужно будет отредактировать __git_refs ()

Обратите внимание, что изменение в поведении будет применяться везде (так что даже с gitтолкать / тянуть там, где вы этого не хотите).Конечно, вы можете сделать копию функции или передать дополнительный параметр, но я оставлю это вам

8 голосов
/ 21 апреля 2016

Если вы установили git-extension через homebrew, он находится здесь: /usr/local/etc/bash_completion.d/git-completion.bash

После ответа erik.weathers выше, я внес следующее изменение, чтобы автозаполнение могло работать как для локального, так и для удаленного на основе текущего префикса. По умолчанию, он будет искать только локальный, но если я укажу origin/…, он будет знать, что я хочу искать и в удаленных ветвях.

В методе _git_checkout () измените

    __gitcomp_nl "$(__git_refs '' $track)"

до:

    # only search local branches instead of remote branches if origin isn't specified
    if [[ $cur == "origin/"* ]]; then
        __gitcomp_nl "$(__git_refs '' $track)"
    else
        __gitcomp_nl "$(__git_heads '' $track)"
    fi

Конечно, вы можете изменить origin на что-то другое или сделать так, чтобы он просматривал список удаленных префиксов, если у вас больше 1.

4 голосов
/ 21 ноября 2011

Можно подумать, что вы просто локальные ветви с псевдонимом co и все ветви с полной командой checkout.

Вы можете выполнить следующее.В вашем .bashrc вы переопределяете функцию _git_checkout().Вы оставляете эту функцию без изменений, кроме конца:

if [ $command -eq "co" ]; then
  __gitcomp "$(__git_refs_local '' $track)"
else
  __gitcomp "$(__git_refs '' $track)"
fi

Затем вам просто нужно определить новую функцию __git_refs_local, где вы удалите удаленный материал.

3 голосов
/ 29 января 2019

Кэри Меткалф написал пост в блоге , содержащий решение, которое также редактирует функцию автозаполнения, но с немного более новым кодом, чем другие ответы. Он также определяет псевдоним checkoutr, который сохраняет старое поведение автозаполнения в случае необходимости.

Короче говоря, сначала создайте псевдоним checkoutr с помощью этой команды:

git config --global alias.checkoutr checkout

Затем найдите git-completion.bash, скопируйте функцию _git_checkout в RC-файл вашей оболочки, чтобы он был переопределен, и внутри этой функции замените эту строку:

__git_complete_refs $track_opt

со следующими строками:

if [ "$command" = "checkoutr" ]; then
    __git_complete_refs $track_opt
else
    __gitcomp_direct "$(__git_heads "" "$cur" " ")"
fi

См. сообщение в блоге для получения более подробной информации и потенциальных обновлений кода.

2 голосов
/ 21 августа 2016

Модификация $(brew --prefix)/etc/bash_completion.d/git-completion.bash не очень хорошая идея, потому что она будет перезаписываться при каждом обновлении Git через Homebrew.

Объединяя все ответы, я перезаписываю только функцию _git_checkout из файла завершения в моем .bash_profile после получения файла завершения:

_git_checkout ()
{
  __git_has_doubledash && return

  case "$cur" in
    --conflict=*)
      __gitcomp "diff3 merge" "" "${cur##--conflict=}"
      ;;
    --*)
      __gitcomp "
      --quiet --ours --theirs --track --no-track --merge
      --conflict= --orphan --patch
      "
      ;;
    *)
      # check if --track, --no-track, or --no-guess was specified
      # if so, disable DWIM mode
      local flags="--track --no-track --no-guess" track=1
      if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
        track=''
      fi
      # only search local branches instead of remote branches if origin isn't
      # specified
      if [[ $cur == "origin/"* ]]; then
        __gitcomp_nl "$(__git_refs '' $track)"
      else
        __gitcomp_nl "$(__git_heads '' $track)"
      fi
      ;;
  esac
}
0 голосов
/ 08 июля 2011

Я не использую Git Bash сам, но если это то же самое, что упомянуто в http://tekrat.com/2008/04/30/bash-autocompletion-git-super-lazy-goodness/,, вы сможете заменить git branch -a на простой gitфилиал в

_complete_git() {
  if [ -d .git ]; then
    branches=`git branch -a | cut -c 3-`
    tags=`git tag`
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=( $(compgen -W "${branches} ${tags}" -- ${cur}) )
  fi
}
complete -F _complete_git git checkout

(в вашем .profile или подобном) и получите то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...