Переключить ветку в 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
и сценарий / решение должно сделать следующее
- git branch -a (найти все ветки локальные и удаленные в моем репозитории)
- фильтровать по заданному параметру ('1178' выше)
- извлечь название ветви, которую может использовать git
- переключиться на эту ветку
Каков рекомендуемый способ сделать это без необходимости выполнять все эти шаги вручную?
Я использую 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 ответа
Есть очень мало случаев, когда вы хотели бы оформить заказ 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'