Nano Hash - криптовалюты, майнинг, программирование

Автозаполнение ветки не работает с псевдонимом git для push

Я использую Git с git-Completion и все работает нормально за одним исключением: когда я

git p some_remote [TAB]

Я получаю как предложения автозаполнения файлы в текущем каталоге (неправильно). p - это псевдоним Git:

$ cat ~/.gitconfig
[alias]
    p = push

Тем не менее, когда я это сделаю:

git push some_remote [TAB]

Я получаю в качестве предложений ветки в текущем репозитории (правильно). В обоих случаях завершение для some_remote работает правильно.

Что является причиной этого?


  • Теперь это исправлено (апрель 2014 г., Git 2.0): см. мой измененный ответ ниже. 05.07.2014
  • В качестве варианта, если ваш псевдоним выглядит так: git config --global alias.p "push origin" (так что он также включает пульт по умолчанию), завершение вкладки прерывается и по-прежнему пытается предлагать пульты вместо перехода к ветвям. Чтобы исправить это, определите свою собственную функцию замены в ~/.profile после поиска git-completion.bash: _git_p() { _git_branch; } (где p соответствует имени вашего псевдонима git.) Это заставит bash обрабатывать ваш псевдоним так же, как команду branch. После этого git p[tab] предложит ветки вместо пультов. См. Также: stackoverflow.com/q/11453807/70876 23.10.2015

Ответы:


1

Это ошибка!

git-completion.bash делает пройдите через псевдонимы git, подключив каждый к нужной функции завершения.

Но затем четыре из них - функции для git push, fetch, pull и remote - делегируют __git_complete_remote_or_refspec(), который начинается так:

__git_complete_remote_or_refspec ()
{
    local cur_="$cur" cmd="${words[1]}"
    ...

$words - это просто список токенов из командной строки, и несколькими строками ниже он начинает проверку $cmd без раскрытия псевдонимов, например:

case "$cmd" in
fetch)
  # ...
pull|remote)
  # ...


Насколько я могу судить, Габор Седер впервые сообщил об этом два года назад в ветка о том, как завершить работу с псевдонимами оболочки.

Он снова упомянул об этом в 2012 году в ответ на патч от Фелипе Контрераса (@ фелипек). В прошлом месяце Фелипе объявил о своем форк git, в котором есть отдельный патч для этого: _ 11_.

Я не знаю, было ли это отправлено в апстрим, но пока ... если вы хотите проверить это, примените патч к своему git-completion.bash:

curl https://github.com/felipec/git/commit/b7b6be72d60d.diff |
  patch -d [directory containing git-completion.bash]
  # useful options for patch: --verbose --dry-run

Если вы не знаете, где сейчас живет git-completion.bash, попробуйте declare -F:

dirname "$(shopt -s extdebug; declare -F __git_complete | awk '{ print $3 }')"

(После исправления git-completion.bash вам будет предложено указать местоположение git-completion.zsh для применения второго фрагмента ... вы можете просто нажать ^C, чтобы пропустить его.)

03.12.2013
  • Интересно и точнее, чем мой ответ. +1 03.12.2013
  • Поскольку вам нужен источник git-completion.sh, вероятно, проще просто cat .bashrc или что-то подобное :) В любом случае, это работает, спасибо; надеюсь, что они подтолкнут его вверх по течению. 03.12.2013

  • 2

    Обновление от апреля 2014 г. для Git 2.0:

    совершает 880111c (Фелипе Контрерас (_ 1_)) теперь включает:

    Завершение: исправлено завершение аргументов с псевдонимом "push", "fetch" и т. д.

    Некоторым командам требуется первое слово для определения фактического выполняемого действия, однако команда неверна, когда мы используем псевдоним, например 'alias.p=push', если мы попытаемся завершить 'git p origin <TAB>', результат будет неправильным, потому что _ 4_ не знает, где это пришли из.

    Итак, давайте переопределим words[1], чтобы псевдоним «p» переопределил фактическую команду «push».


    git-completion не очень хорошо работает с git alias или обычным псевдонимом.

    Например, если вы определили псевдоним «gp» для «git push», как в «Как получить завершение bash для работы с псевдонимами ? ", вы можете ввести:

    __git_complete gp _git_push
    

    Возможно, что-то подобное существует для псевдонимов git, как в этом скрипте.

    26.11.2013
  • __git_complete gp _git_push, похоже, не подходит для меня; он правильно предлагает имя пульта, но затем продолжает предлагать те же удаленные имена вместо ветвей. Я уже реализовал вариант вашего второго предложения, и хотя он работает, он не идеален, потому что: 1. он не согласуется с моими существующими псевдонимами git и 2. он содержит ошибки, т.е. он начинает предлагать имена удаленных / веток только после ввода первая буква (я использую завершение в стиле vim в bash). 26.11.2013
  • @adrianp, который был бы для обычного псевдонима, а не для псевдонима git 26.11.2013
  • Да, я это понял :) 26.11.2013
  • @adrianp ок. Значит, нужно провести еще несколько тестов. 26.11.2013
  • Я могу подтвердить в Git 2.4.0, что это все еще проблема (подтверждено, что мой git-complete.bash имеет код, добавленный 880111c). Есть ли какие-либо актуальные проблемы GH, по которым обсуждается эта проблема? Я не могу найти ничего, кроме этого, по крайней мере, с обходным путем. 22.05.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..