※2022年から技術系の記事は個人ブログに投稿しております。ぜひこちらもご覧ください→yamaday0u Blog
はじめに
やまだゆう(@yamaday0u)です。
今回は、ターミナル(zsh)でgitを操作するときにとても便利な以下の機能を実装します。
- ブランチ名の表示
- Tab補完
目標
自身のターミナルで以下のようにブランチ名の表示とTabキーによる補完機能を実装することを目標とします。
チャレンジ
原典・一次情報から学ぶ習慣を身につけるべく、なるべく公式ドキュメントを参考にしていきます。
手っ取り早く実装したい場合は以下の記事を読んでください。大変わかりやすい記事です。
【zsh】絶対やるべき!ターミナルでgitのブランチ名を表示&補完【git-prompt / git-completion】(Qiita)
gitのドキュメント
ブランチ名の表示とTab補完は、それぞれgitの公式ドキュメントの中のgit-prompt
とgit-completion
に実装方法が記載されているので、この指示に従って実装します。
git/contrib/completion/git-prompt.sh、
git/contrib/completion/git-completion.zshのコメントアウト部分の説明をぜひ1度ご覧ください!
ブランチ名の表示機能を実装(git-prompt)
git/contrib/completion/git-prompt.shの指示を1つずつ確認していきます。
手順1:git-prompt.shファイルをコピー
# 1) Copy this file to somewhere (e.g. ~/.git-prompt.sh).
※訳:このファイル(git-prompt.sh)をどこかにコピーしてください。
今回はzshフォルダを作成して、このフォルダ下にファイルをコピーします。
% mkdir ~/.zsh
% cd ~/.zsh
% curl -o git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
コピーするURLhttps://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
は以下の「Raw」をクリックすることで開かれるページです。
curl -o ファイル名 URL
コマンドで、URLから取得したソースコードを指定した名前のファイルに出力して保存してくれます。
参考:curl公式サイト、curl コマンド(hydroculのメモ)
ちなみにcurlという名前はclient for urlから来ているらしいです。(IT用語辞典 e-Words)
手順2:.zshrcファイルに設定を追記
# 2) Add the following line to your .bashrc/.zshrc:
# source ~/.git-prompt.sh
※訳:次のコードを.bashrcか.zshrcファイルに追記してください。
今回はzshを使用していることを前提としているので、.zshrcファイルに設定を追記します。
ちなみに.zshrcファイルのrcはRun Commandの略だそうです。(【.zshrc解説】コピペで簡単zshカスタマイズ【設定方法】(Suwaru blog))
source ~/.zsh/git-prompt.sh
このコードの追記により、git-promptを読み込みます。
手順3:表示形式の設定
# 3a) Change your PS1 to call __git_ps1 as
# command-substitution:
# Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
# ZSH: setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
# the optional argument will be used as format string.
.zshrcファイルに以下のように追記します。
# プロンプトのオプション表示設定
GIT_PS1_SHOWDIRTYSTATE=true
GIT_PS1_SHOWSTASHSTATE=true
GIT_PS1_SHOWUNTRACKEDFILES=true
GIT_PS1_SHOWUPSTREAM=auto
# プロンプトの表示設定(好きなようにカスタマイズ可)
setopt PROMPT_SUBST ; PS1='%F{green}%n@%m%f: %F{cyan}%~%f %F{red}$(__git_ps1 "(%s)")%f
\$ '
プロンプトのオプション表示設定はの説明は以下の通りです。
- GIT_PS1_SHOWDIRTYSTATE(ファイル変更の有無)
ステージング(git add)されている変更があればブランチ名の横に"+"が表示され、ステージングされていない変更があると"*"が表示されます。
以下の例では、ステージングされていない変更(Top.jsx)があるため、ブランチ名の横に"*"が表示されています。
- GIT_PS1_SHOWSTASHSTAT(スタッシュの有無)
スタッシュに入っているものがあるとブランチ名の横に"$"が表示されます。スタッシュが何かについてはこちらの記事が最近公開されたものでわかりやすいので参照してください。以下の例では、スタッシュを削除したことで、"$"の表示が消えています。
- GIT_PS1_SHOWUNTRACKEDFILES(新規ファイルの有無)
ステージング(git add)されていない新規ファイルがあると"%"が表示されます。以下の画像ではgit add .
される前は"%"が表示され、された後は"+"が表示されています。
- GIT_PS1_SHOWUPSTREAM(HEADとそのアップストリームの違い)
現在のブランチのアップストリームより進んでいれば">"、遅れていれば"<"、同じであれば"="が表示されます。アップストリームは比較対象のブランチで、設定を変えていなければorigin/masterのブランチがアップストリームになっているようです。
git commit
をするとHEADの方がorigin/masterより進んだため">"と表示され、
git push
すると">"から"="に表示が変わりました。
Tab補完機能を実装(git-completion)
git/contrib/completion/git-completion.zshの指示を1つずつ確認していきます。
###手順1:git-completion.zshファイルとgit-completion.bashファイルをコピー
# The recommended way to install this script is to make a copy of it as a
# file named '_git' inside any directory in your fpath.
#
# For example, create a directory '~/.zsh/', copy this file to '~/.zsh/_git',
*訳:このファイル(git-completion.zsh)を_gitというファイル名で好きなフォルダにコピーしてください。
先ほど作成した.zshフォルダ下でコピーします。
% cd ~/.zsh
% curl -o _git https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.zsh
###手順2:.zshrcファイルに設定を追記(その1)
# and then add the following to your ~/.zshrc file:
#
# fpath=(~/.zsh $fpath)
*訳:.zshrcファイルに次の一文(fpath=(~/.zsh $fpath))を追記してください。
.zshrcファイルに以下のように追記します。
fpath=(~/.zsh $fpath)
###手順3:.zshrcファイルに設定を追記(その2)
# You need git's bash completion script installed. By default bash-completion's
# location will be used (e.g. pkg-config --variable=completionsdir bash-completion).
# If your bash completion script is somewhere else, you can specify the
# location in your ~/.zshrc:
#
# zstyle ':completion:*:*:git:*' script ~/.git-completion.bash
*訳:git-completion.bashもインストールしておく必要があります。git-completion.zshでは
デフォルトでgit-completionの位置が使われます。
すでにgit-completion.bashのスクリプトがある場合は、.zshrcファイル内でgit-completion.bash
の場所を指定できます。(要は次の一文「zstyle〜」も追記せよということ)
.zshフォルダ下でgit-completion.bashをコピーします。
% cd ~/.zsh
% curl -o git-completion.bash https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
次に、.zshrcファイルに以下のように追記します。
zstyle ':completion:*:*:git:*' script ~/.zsh/git-completion.bash
最終形の確認
最終的に、.zshrcファイルには以下の記述がされています。
# git-promptの読み込み
source ~/.zsh/git-prompt.sh
# git-completionの読み込み
fpath=(~/.zsh $fpath)
zstyle ':completion:*:*:git:*' script ~/.zsh/git-completion.bash
autoload -Uz compinit && compinit
# プロンプトのオプション表示設定
GIT_PS1_SHOWDIRTYSTATE=true
GIT_PS1_SHOWSTASHSTATE=true
GIT_PS1_SHOWUNTRACKEDFILES=true
GIT_PS1_SHOWUPSTREAM=auto
# プロンプトの表示設定(好きなようにカスタマイズ可)
setopt PROMPT_SUBST ; PS1='%F{green}%n@%m%f: %F{cyan}%~%f %F{red}$(__git_ps1 "(%s)")%f
\$ '
これでブランチ名の表示機能とTab補完機能が実装されたはずです。
快適なgitライフを!
参考資料
Git
- git/contrib/completion/git-completion.zsh
- git/contrib/completion/git-prompt.sh
- 【git stash】コミットはせずに変更を退避したいとき(Qiita)
zsh