сценарий для показа ответвления мерзавца в ударе больше не работает над человечностью 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.4 и GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu). Это - "новая" установка, таким образом, нет ничего дополнительного в .bashrc.

3
задан 5 June 2018 в 18:41

2 ответа

Решение было довольно просто.

Я установил восходящий поток, подготовил фиксацию и продвинул его. После этого это работало.

Я думал что сценарий, так или иначе используемый .git папка, которая сгенерирована с git init. Так как это работает над ответвлениями, который не имеет восходящего потока.

2
ответ дан 1 December 2019 в 13:11

Хотя вы уже решили проблему, я хотел бы представить решение, уже поставляемое с 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 (потому что иначе команды не имеют никакого смысла).

13
ответ дан 1 December 2019 в 13:11

Другие вопросы по тегам:

Похожие вопросы: