調子にノって、gitを使う・・・(ブランチ名を表示したい)

今更ながら、gitですよ!
大昔にちょっと使ったんですが、一人で作って一人で遊ぶ分には、バージョン管理いらないかなと思ってしまって・・・バカでした(笑)

結局、OLDみたいなサフィックスがついたファイルが大量に作られていく。。。
この管理のほうが面倒になってきてしまった。

んで、やっぱり、要りますなバージョン管理・・・
というわけで、お家サーバにgitのリモートリポジトリを設定することにしました!
GitHubじゃないところはご愛嬌☆

すっかり、コマンド等も忘れてしまい、この機会にうろ覚えだったgitの仕組みも勉強しようかと・・・

で、実際にシェルで作業していると、ブランチ名が表示されていると嬉しいなと・・・
まあ、世の中にはそんな人は居ることは百も承知ですが・・・
かる〜く調べてみると
Ubuntuとかでgitをインストールすればbash用の__git_ps1関数も一緒に付いてくるらしいです。

でもこの関数は、ちょとリッチすぎました!書式を指定できたり、云々・・・
そんなに機能はいらないし・・・

まあ、なんだかんだで、車輪の再発明をしようではないですか!!
勉強がてら・・・

gitのブランチ名を取得する

まずは、gitのブランチ名を取得したいと思います!
gitのbranchコマンドを叩けば、ブランチの一覧が表示され、カレントのブランチ名の前には'*'が付加されています。
ここを取り出したいので、ここは、sedコマンドに登場していただきます・・・
ブランチ名の取得
$ git branch --list dev * master $ git branch --list|sed -ne 's/^\*\s*\(\.*\)/\1/p' master
めでたく、取り出せました!
まあ、'\s'のあとの'*'は冗長かもしれませんが・・・

bashに設置する

bashに設置しようしとして、初めはsedの出力をそのまま使ってみたのですが・・・
そりゃそうでしょ、という結果に・・・
.bashrc(失敗)
branch=$(git branch --list | sed -ne 's/^\*\s*\(\.*\)/\1/p') PS1='\u@\h{$branch}:\w\$ '
そうです!変数に代入しちゃったので、ブランチを切り替えても、ブランチ名が切り替わりません!!

bashには便利な関数があるので、これを使いましょう!
関数を使えば、表示の度に評価されるようになります
また、文字列を表示したいときは"echo"を使って、関数の位置に文字列を表示できます。
.bashrc
git_branch() { branch=$(git branch --list 2>/dev/null | sed -ne 's/^\*\s*\(\.*\)/\1/p') echo {$branch} } PS1='\u@\h$(git_branch):\w\$ '
これで、うまくいきます!!
ついでに、gitディレクトリでないときにエラーになるので、標準エラーは捨てておきましょう!( 2>/dev/null )
ブランチ名の表示テスト
user-name@host-name:~/GitDir$ . ~/.bashrc user-name@host-name{master}:~/GitDir$ git checkout dev Switched to branch 'dev' user-name@host-name{dev}:~/GitDir$ git checkout master Switched to branch 'master' user-name@host-name{master}:~/GitDir$

完成!!

まあ、結局色付けして、こうなりましたとさ・・・
.bashrc
# git prompt git_branch() { branch=$(git branch 2>/dev/null | sed -ne 's/^\*\s*\(\.*\)/\1/p') #[[ $branch ]] && echo "{$branch}" echo ${branch:+\{$branch\}} } PS1='\[\033[01;32m\]\u@\h\[\033[00;33m\]$(git_branch)\[\033[00m\]:\[\033[01;34m\]\w\$ '
そうそう、"echo"で"-e"オプション付けてエスケープシーケンスの有効な色のついた文字列をPS1に取り込むと、コマンドラインの文字列の長さがおかしくなるよ!
とくに折り返してしまうような長いコマンドの後に、readlineで編集しづらくなる!

色指定のエスケープシーケンス部は "\[" 〜 "\]" で囲んで、文字列の長さがないように知らせる必要があるのだが、これはPS1の中だけで有効なので、色指定はPS1で行おう!


あと、${変数:+書式}みたいなのがあった!!

詳しくは、@t_nakayama0714さんが詳しく説明してくれています!
ありがとうございます☆


ふんどしの持ち主

コメント

このブログの人気の投稿

Pythonのソースファイルの行番号を取得したい

Kubuntu22.04 VirtualBox - 重大なエラー 〜 嘘でした"Document is enpty."なだけ

Raspberry Pi 3 シリアルコンソール&シリアル通信