2016-04-09 10 views
4

Ich fand git examples with fzf(fuzzy finder) und sie funktioniert gut. wie:Wie bekomme ich einen Git-Zweig mit Fuzzy-Finder?

# fbr - checkout git branch 
fbr() { 
    local branches branch 
    branches=$(git branch -vv) && 
    branch=$(echo "$branches" | fzf +m) && 
    git checkout $(echo "$branch" | awk '{print $1}' | sed "s/.* //") 
} 

# fbr - checkout git branch (including remote branches) 
fbr() { 
    local branches branch 
    branches=$(git branch --all | grep -v HEAD) && 
    branch=$(echo "$branches" | 
      fzf-tmux -d $((2 + $(wc -l <<< "$branches"))) +m) && 
    git checkout $(echo "$branch" | sed "s/.* //" | sed "s#remotes/[^/]*/##") 
} 

Ich habe dies in meinem Bashrc

bind '"\C-b": "fbr \n"' 

Nachdem ich drücken Ctrl-b ich ein Git-Filiale wählen und schaltet sie gleich nachdem ich die Eingabetaste drücken, aber gibt es eine Möglichkeit, zuerst etwas wie git push staging einzugeben (und dann die Liste der Zweige zu holen und die ausgewählte Verzweigung an der Stelle des Cursors zu setzen, bevor die Verzweigungsliste aufgerufen wurde, und dann Enter drücke, um die ausgewählte Verzweigung an staging zu übergeben)

Ex: git push staging (Ctrl-b - eine Filiale wählen), und ich möchte diese Ausgabe erhalten - git push staging selected_branch

+1

Betrachtet git Fertigstellung? https://github.com/git/git/blob/master/contrib/completion/git-completion.bash – webb

+0

@webb vielen Dank. – whitesiroi

Antwort

4

Dies sind die Tastenbelegungen ich in bash verwenden

  • CTRL- GCTRL-F - Dateien aufgelistet in git status
  • CTRL-GCTRL-B - Zweige
  • CTRL-GCTRL-T - Tags
  • CTRL-GCTRL-H - Commit Hashes
  • CTRL-GCTRL- R - Fernbedienungen

Beachten Sie, dass redraw-current-line ist nicht notwendig, wenn Sie auf tmux sind.

is_in_git_repo() { 
    git rev-parse HEAD > /dev/null 2>&1 
} 

gf() { 
    is_in_git_repo && 
    git -c color.status=always status --short | 
    fzf --height 40% -m --ansi --nth 2..,.. | awk '{print $2}' 
} 

gb() { 
    is_in_git_repo && 
    git branch -a -vv --color=always | grep -v '/HEAD\s' | 
    fzf --height 40% --ansi --multi --tac | sed 's/^..//' | awk '{print $1}' | 
    sed 's#^remotes/[^/]*/##' 
} 

gt() { 
    is_in_git_repo && 
    git tag --sort -version:refname | 
    fzf --height 40% --multi 
} 

gh() { 
    is_in_git_repo && 
    git log --date=short --format="%C(green)%C(bold)%cd %C(auto)%h%d %s (%an)" --graph | 
    fzf --height 40% --ansi --no-sort --reverse --multi | grep -o '[a-f0-9]\{7,\}' 
} 

gr() { 
    is_in_git_repo && 
    git remote -v | awk '{print $1 " " $2}' | uniq | 
    fzf --height 40% --tac | awk '{print $1}' 
} 

bind '"\er": redraw-current-line' 
bind '"\C-g\C-f": "$(gf)\e\C-e\er"' 
bind '"\C-g\C-b": "$(gb)\e\C-e\er"' 
bind '"\C-g\C-t": "$(gt)\e\C-e\er"' 
bind '"\C-g\C-h": "$(gh)\e\C-e\er"' 
bind '"\C-g\C-r": "$(gr)\e\C-e\er"' 
+0

+ ein Aaawesome, es funktioniert perfekt ^^ Danke Kumpel ^^ – whitesiroi

+1

Kein Problem. Gb() wurde aktualisiert, um Remote-Zweige zu integrieren. –

+0

Vielen Dank :) – whitesiroi