Подтвердить что ты не робот

Git aliases - автозаполнение командной строки имен ветвей

Если я запускаю регулярную команду git, такую ​​как git checkout, я получаю полезную автозаполнение имен ветвей при нажатии клавиши табуляции.

У меня есть несколько псевдонимов git, которые принимают имена ветвей в качестве параметров, и мне интересно, есть ли способ получить автозаполнение имени ветки, чтобы работать с ними?

Edit:

Чтобы дать некоторые пояснения из обсуждения в комментариях, псевдонимы с прямым отображением работают нормально, то есть:

ci = commit
co = checkout

Это те, которые немного больше задействованы и используют $1 как параметр, который этого не делает, например:

tagarchive = !f() { git tag archive/$1 origin/$1 && git push origin :$1 && git push origin archive/$1 && git branch -d $1; }; f
4b9b3361

Ответ 1

Для псевдонимов git функция автозаполнения для команды git (__git()) использует вызов git config --get "alias.$1" для определения эквивалентной функции автозаполнения. Это работает для простых сопоставлений, но будет забивать более сложные псевдонимы.

Чтобы обойти это, определите функцию автозаполнения с именем, которое соответствует вашему псевдониму, т.е. _git_tagarchive(). Функция автозаполнения для git должна выбрать это и использовать для автозаполнения.

Например:

[[email protected]]$ git tagarchive <TAB><TAB>
AUTHORS             gentleSelect/       .gitignore          LICENSE             test_multiple.html  
cron/               .git/               index.html          README.md  
[[email protected]]$ _git_tagarchive() {
> _git_branch  # reuse that of git branch
> }
[[email protected]]$ git tagarchive  <TAB><TAB>
enable_multiple          master                   origin/gh-pages          v0.1                     v0.1.3 
FETCH_HEAD               ORIG_HEAD                origin/HEAD              v0.1.1                   v0.1.3.1 
HEAD                     origin/enable_multiple   origin/master            v0.1.2 

Для более постоянного решения просто добавьте определение функции в ваш файл bashrc. Например:

_git_tagarchive() 
{
    _git_branch
}

Обратите внимание, что я просто повторно использовал функцию автозаполнения для git branch; вы можете изменить это на что-то более подходящее или написать свой собственный.

Дополнительная информация

Это решение было идентифицировано на основе исследования /etc/bash_completion.d/git.

Как правило, команды с псевдонимом git обрабатываются функцией __git_aliased_commands(), которая анализирует вывод git config --get "alias.$1", чтобы решить, какую функцию автозаполнения использовать. Использование более сложной команды оболочки в качестве цели псевдонима, по понятным причинам, преодолело бы этот подход.

Далее, функция автозаполнения для цепей git (_git()) в функции автозаполнения для подкоманд путем простого добавления функции с помощью _git_ (с тире (-) в команде, замененной символами подчеркивания), Это делается до проверки __git_aliased_command(), поэтому мы можем использовать это.

_git ()
{ 
   # .....
   local completion_func="_git_${command//-/_}"
   declare -f $completion_func >/dev/null && $completion_func && return

   local expansion=$(__git_aliased_command "$command")
   if [ -n "$expansion" ]; then
       completion_func="_git_${expansion//-/_}"
       declare -f $completion_func >/dev/null && $completion_func
   fi

}

Таким образом, подход, который я получил, заключается в том, чтобы гарантировать, что существует функция, соответствующая вашему псевдониму, т.е. _git_tagarchive().

Ответ 2

Обновление июля 2015 года (Git 2.5): получение git псевдонимов проще в contrib/completion/git-completion.bash.

См. commit 12bdc88, совершить e8f9e42 (10 мая 2015) SZEDER Gábor (szeder).
(слияние Junio ​​C Hamano - gitster - в commit 935d937, 22 мая 2015 г.)

~~~~~~~~~~~~~~

Git завершение должно работать лучше со сложными псевдонимами в git 2.1 (август 2014 г.).
См. передать 56f24e8 Steffen Prohaska (sprohaska)

завершение: дескрипторы '!f() { ... }; f' и "!sh -c '...' -" псевдонимы

'!f() { ... }; f' и "!sh -c '....' -" рекомендуются шаблоны для объявления более сложных псевдонимов (см. Git wiki). < ш > Эта фиксация учит завершению для их обработки.

При определении того, какое завершение используется для псевдонима, открывающая скобка или одинарная кавычка теперь пропущена, а поиск команды git продолжается.
Например, псевдонимы "!f() { git commit ... }" или "!sh -c 'git commit ...'" теперь запускают завершение фиксации.
Раньше поиск останавливался на открывающей скобке или цитате, а завершение это определить, как завершить, что, очевидно, было бесполезным.

Команда null ':' теперь пропущена, поэтому ее можно использовать в качестве обходного пути для объявления желаемого стиля завершения.

Например, псевдонимы:

!f() { : git commit ; if ... } f
!sh -c ': git commit; if ...' -

теперь запускает завершение фиксации.

Объявление функции оболочки теперь работает с пространством или без него до того, как будут выполняться действия parens, т.е. "!f() ..." и "!f () ...".