В моих 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
), а скорее для источника из .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 #) $
Кстати: «правильный» способ получить текущую ветвь - не анализировать вывод git branch
, так как это может измениться в новых версиях git. git branch
- это так называемая команда porcelain , которая означает, что ее вывод хорош и хорош, но не гарантируется, что он останется неизменным в разных версиях. Таким образом, парни из git рекомендуют сантехнические инструменты для написания сценариев. С слесарным делом текущую ветвь можно определить с помощью
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 (потому что иначе команды не имеют никакого смысла).