web-dev-qa-db-ja.com

bashでgitブランチを表示するスクリプトがubuntu 18.04で動作しなくなりました

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.4GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)を使用しています。これは「フレッシュ」インストールであるため、.bashrcには何も追加されません。

3
Felix Rosén

解決策は非常に簡単でした。

アップストリームを設定し、コミットをステージングしてプッシュしました。その後、動作しました。

スクリプトは.gitで生成されたgit initフォルダーを何らかの形で使用していると思いました。アップストリームがないブランチで動作するため。

2
Felix Rosén

あなたはすでに問題を解決しましたが、すでに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作業ディレクトリにいるかどうかを確認します(それ以外の場合は、コマンドが意味をなさないため)。

7
PerlDuck