16.04インストールでは、これを~/.bashrc
ファイルに入れました。
#Show git branch in commandline
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u:\[\033[01;34m\]\w\[\033[00m\]\$(parse_git_branch)\[\033[00m\] $ "
次のようなプロンプトが表示されました。
user:~/myrepo (master) $
しかし、18.04で同じことをすると、プロンプトは代わりに次のようになります。
user:~/myrepo $
18.04で機能させるにはどうすればよいですか?
$ printf "%q\n" "$PS1" "$Prompt_COMMAND" "$0" "$Shell"
\\\[\\033\[01\;32m\\\]\\u:\\\[\\033\[01\;34m\\\]\\w\\\[\\033\[00m\\\]\$\(parse_git_branch\)\\\[\\033\[00m\\\]\ \$\
''
bash
/bin/bash
sed (GNU sed) 4.4
とGNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
を使用しています。これは「フレッシュ」インストールであるため、.bashrc
には何も追加されません。
解決策は非常に簡単でした。
アップストリームを設定し、コミットをステージングしてプッシュしました。その後、動作しました。
スクリプトは.git
で生成されたgit init
フォルダーを何らかの形で使用していると思いました。アップストリームがないブランチで動作するため。
あなたはすでに問題を解決しましたが、すでにgitに同梱されているソリューションを紹介したいと思います。
Gitと一緒に/usr/lib/git-core/git-sh-Prompt
ファイルがインストールされます。何年も前にcontribディレクトリにありましたが、その間公式のパスになりました。このファイルは、実行されることを意図したものではなく(実際、x
フラグはありません)、sourced from .bashrc
である必要があります。それはかなりのプロンプトを処理するためのいくつかの関数を定義し、最も顕著なものは__git_ps1
です。
次の行を.bashrc
に追加できます。
source /usr/lib/git-core/git-sh-Prompt
export PS1="${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u:\[\033[01;34m\]\w\[\033[00m\]\$(__git_ps1)\[\033[00m\] $ "
ファイルの先頭/usr/lib/git-core/git-sh-Prompt
は、他に何ができるかについての説明を提供します。私のバージョンでは1) Copy this file to somewhere (e.g. ~/.git-Prompt.sh).
と書かれていますが、これは必要ありません(命令は廃止されています)。
また、いくつかの環境変数を設定して、関数の動作を変更することもできます。たとえば、私は
export GIT_PS1_SHOWDIRTYSTATE=yes
結果は次のようになります。
# clean
pduck:~/oss/rsyslog (master) $
または
# dirty
pduck:~/oss/rsyslog (master *) $
または
# something added to index
pduck:~/oss/rsyslog (master +) $
または
# in a completely fresh repo
pduck:~/oss/xxx (master #) $
Btw:現在のブランチを取得する「適切な」方法は、git branch
の出力を解析しないことです。これは、新しいgitバージョンで変更される可能性があるためです。 git branch
は、いわゆるporcelainコマンドです。これは、出力がニースできれいですが、異なるバージョンで同じであることが保証されないことを意味します。したがって、gitの連中はplumbingスクリプト用のツールをお勧めします。 配管を使用すると、現在のブランチを次のように決定できます。
if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
current_branch=$(git symbolic-ref --quiet --short HEAD || git rev-parse --short HEAD)
else
current_branch=""
fi
HEADがシンボリック参照である場合(つまり、ブランチまたはタグがチェックアウトされている場合)、最初の割り当てが機能します。ラベルのないもの(git checkout HEAD^^
など)をチェックアウトした場合、失敗し、代わりにgit rev-parse --short HEAD
を使用してSHA1を表示します。 if
は、git作業ディレクトリにいるかどうかを確認します(それ以外の場合は、コマンドが意味をなさないため)。