Переключить ветку в git по частичному имени

Если у меня есть следующие ветки в Git

1194-qa-server
master
remotes/origin/1178-authentication
remotes/origin/1194-qa-server
remotes/origin/HEAD -> origin/master
remotes/origin/master

Я хочу переключиться на ветку, используя --just-- номер, даже если это требует вызова скрипта. Например:

switch_branch 1178

и сценарий / решение должно сделать следующее

  1. git branch -a (найти все ветки локальные и удаленные в моем репозитории)
  2. фильтровать по заданному параметру ('1178' выше)
  3. извлечь название ветви, которую может использовать git
  4. переключиться на эту ветку

Каков рекомендуемый способ сделать это без необходимости выполнять все эти шаги вручную?

Я использую Mac OSX, если это имеет значение здесь.

обновление - bash-it (github.com/revans/bash-it) служит моей цели

Welcome to Bash It!

Here is a list of commands you can use to get help screens for specific pieces of Bash it:

  rails-help                  list out all aliases you can use with rails.
  git-help                    list out all aliases you can use with git.
  todo-help                   list out all aliases you can use with todo.txt-cli
  brew-help                   list out all aliases you can use with Homebrew
  aliases-help                generic list of aliases.
  plugins-help                list out all functions you have installed with bash-it
  bash-it-plugins             summarize bash-it plugins, and their installation status
  reference <function name>   detailed help for a specific function

3 ответа

Решение

Я перешел на рабочий процесс git-flow и с тех пор рад этому.

Есть очень мало случаев, когда вы хотели бы оформить заказ remotes/origin/*, Они существуют, но для целей этого ярлыка давайте не будем о них беспокоиться. Это даст вам то, что вы хотите на OSX:

git config --global alias.sco '!sh -c "git branch -a | grep -v remotes | grep $1 | xargs git checkout"'

Вы можете затем выпустить git sco <number> оформить заказ на ветку, которая включает <number> но исключает "пульты". Ты можешь измениться sco быть чем угодно. Я просто выбрал его для "супер проверки".

Конечно, это не будет работать очень хорошо, если у вас есть более одной ветви, которая соответствует <number>, Это должно быть, однако, достойной отправной точкой.

Вот мое решение с нечеткой проверкой: добавьте псевдоним в свой ~/.gitconfig бегом

git config --global alias.fc '!f() { git branch -a | grep -m1 -e ${1}.*${2} | sed "s/remotes\/origin\///" | xargs git checkout; }; f'

Приведенная выше команда добавит псевдоним к вашему ~/.gitconfig:

[alias]
    # fuzzy checkout branch, e.g: git cb feature 739, will checkout branch feature/PGIA-739-deploy-maximum
    fc = "!f() { git branch -a | grep -m1 -e ${1}.*${2} | sed \"s/remotes\\/origin\\///\" | xargs git checkout; }; f" 

Псевдоним может иметь 2 параметра для нечеткого соответствия, вы можете использовать его как:

git fc <keyword1> <keyword2>

Он найдет кассу, первое совпадение ветки

Например, если вы хотите проверить свою ветку 1178, вы можете запустить:

git fc 1178

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

git fc 1178 auth

Вы можете также найти другие мои любимые отрывки здесь

Вот решение, которое я придумал для себя.

[ ${#} -ne 1 ] && { echo -e "Please provide one search string" ; exit 1 ; }
MATCHES=( $(git branch -a --color=never | sed -r 's|^[* ] (remotes/origin/)?||' | sort -u | grep -E "^((feature|bugfix|release|hotfix)/)?([A-Z]+-[1-9][0-9]*-)?${1}") )
case ${#MATCHES[@]} in
  ( 0 ) echo "No branches matched '${1}'" ; exit 1  ;;
  ( 1 ) git checkout "${MATCHES[0]}"      ; exit $? ;;
esac
echo "Ambiguous search '${1}'; returned ${#MATCHES[@]} matches:"

for ITEM in "${MATCHES[@]}" ; do
  echo -e "  ${ITEM}"
done
exit 1

Я назвал это git-rcheckout ("r" для регулярных выражений, из-за отсутствия лучшего имени) и поместил его на моем пути (это слишком долго, чтобы втиснуть в мой рожок) .gitconfig.)

Он будет пытаться сопоставить локальные и удаленные ветви (хотя только проверяет локальные) и будет допускать (игнорирование IE в целях поиска) некоторые стили JIRA, такие как ветви, начинающиеся с общих префиксов, и вещи, стилизованные под идентификаторы билетов JIRA.

например, набрав это:

git rcheckout this

Должны соответствовать такие вещи, как

this-branch
feature/this-branch
bugfix/JIRA-123-this-branch
JIRA-123-this-branch
remotes/origin/this-branch
remotes/origin/feature/this-branch
remotes/origin/bugfix/JIRA-123-this-branch
remotes/origin/JIRA-123-this-branch

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

git rcheckout JIRA-123

Для доступа:

bugfix/JIRA-123-this-branch
JIRA-123-this-branch
remotes/origin/bugfix/JIRA-123-this-branch
remotes/origin/JIRA-123-this-branch

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

git rcheckout '.*bran'
git rcheckout '.*is-br.*h'
Другие вопросы по тегам