2012-07-05 89 views
6

如果我有混帳以下分支開關分支的部分名稱

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分支-a(找到所有分支機構的本地和遙控器在我的倉庫)
  2. 過濾器由給定參數(「1178」以上)
  3. 提取混帳可以使用
  4. 切換到該分支的分支的名稱

什麼是推薦的方式做到這一點,而不必手動執行所有這些步驟?

我使用的是Mac OSX,如果這個問題在這裏。

更新 - 慶典,它(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 
+0

使用bash,那麼你可以用'git的結帳1178 [TAB]';) – KingCrunch

+0

和使用一些[看上去](https://github.com/robbyrussell/oh-my-zsh/)[helper](https://github.com/revans/bash-it/)它只是'gco 1178 [TAB]' – Stefan

+0

不是真的爲我工作。我在網上找到了一些關於哈希自動完成的參考,但這不是我正在尋找的。 – ramonrails

回答

0

我切換到git-flow工作流程,並從此開始感到高興。

+0

'git flow'如何通過部分名稱解決結賬問題? – bvj

9

有極少數的情況下,您會希望籤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>以上,那麼這個功能不會很好。但是,它應該是一個體面的起點。

+1

它確實有用,但我發現它更好。 https://github.com/revans/bash-it/ – ramonrails

3

這是我爲自己提出的解決方案。

[ ${#} -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票證ID的事物。

例如打字:

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' 
+0

作品將通常由Jira創建的大分支名稱。還支持'git flow'範式。優秀。 – bvj