Menambahkan cabang git pada prompt perintah Bash


161

Saya mencoba menambahkan cabang git yang saat ini saya kerjakan (check-out) pada bash prompt tanpa hasil .. ( sambil menjaga jalur saya saat ini yang memperlihatkan direktori aktif / file utuh) Saya memiliki file .bashrc di rumah saya, tapi saya juga melihat banyak orang menyebutkan file .profile ..


3
Saya pikir ini akan lebih baik ditanyakan di pertukaran unix / linux.
Cole Busby

Saya sudah mencoba 10 cara berbeda, beberapa di antaranya bekerja tetapi saya mendapatkan cabang git dan kehilangan direktori / jalur kerja yang saya miliki sebelumnya ..
George Katsanos

Git 1.9.3+ menghadirkan cara menarik untuk menampilkan cabang: lihat jawaban saya di bawah ini
VonC

1
@cole busby rupanya tidak.
George Katsanos

1
@GeorgeKatsanos empat tahun menunjukkan kepada saya: p
Cole Busby

Jawaban:


161

git 1.9.3 atau lebih baru: gunakan __git_ps1

Git menyediakan skrip shell bernama git-prompt.sh, yang mencakup fungsi __git_ps1itu

mencetak teks untuk ditambahkan ke bash PS1 prompt (termasuk nama cabang)

Penggunaannya yang paling dasar adalah:

$ __git_ps1
(master)

Itu juga membutuhkan string format opsional:

$ __git_ps1 'git:[%s]'
git:[master]

Bagaimana cara mendapatkannya

Pertama, salin file ke suatu tempat (misalnya ~/.git-prompt.sh).

Opsi 1: gunakan salinan yang ada di sistem file Anda. Contoh (Mac OS X 10.15):

$ find / -name 'git-prompt.sh' -type f -print -quit 2>/dev/null
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh

Opsi 2: Tarik skrip dari GitHub .

Selanjutnya, tambahkan baris berikut ke Anda .bashrc/.zshrc:

source ~/.git-prompt.sh

Akhirnya, ubah PS1panggilan Anda __git_ps1sebagai pengganti-perintah:

Pesta:

PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '

Zsh:

setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '

git <1.9.3

Tetapi perhatikan bahwa hanya git 1.9.3 (Mei 2014) atau lebih baru yang memungkinkan Anda menampilkan nama cabang dengan aman (!)

Lihat komit 8976500 oleh Richard Hansen ( richardhansen) :

Baik bash dan zsh memberikan nilai PS1 ke ekspansi parameter , substitusi perintah , dan ekspansi aritmatika.

Daripada menyertakan nama cabang mentah dan tidak terhapus PS1ketika menjalankan dalam mode dua atau tiga argumen, buatlah PS1untuk referensi variabel yang memegang nama cabang.

Karena shell tidak berkembang secara rekursif, ini menghindari eksekusi kode arbitrer dengan nama cabang yang dibuat khusus seperti

'$(IFS=_;cmd=sudo_rm_-rf_/;$cmd)'.

Pikiran licik apa yang akan menamai cabang seperti itu? ;) ( Di sebelah Mom seperti pada xkcd )

Lebih banyak contoh

still_dreaming_1 laporan dalam komentar :

Ini tampaknya bekerja dengan baik jika Anda ingin prompt warna dengan xterm(di saya .bashrc):

PS1='\[\e]0;\u@\h: \w\a\]\n${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\03‌​3[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ ' 

Semuanya berwarna berbeda, termasuk rantingnya.

Di dalam Linux Mint 17.3 Cinnamon 64-bit:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[00m\]$(__git_ps1) \$ ' 

3
bagaimana Anda dapat mengatur prompt ke cabang git saat ini ketika Anda benar-benar dalam repo git. Jadi jika Anda berada di direktori normal itu menunjukkan prompt normal.
Zubair Alam

1
@ still_dreaming_1 Anda dapat memutakhirkan atau mengkompilasi git dengan sangat mudah: stackoverflow.com/a/24847953/6309
VonC

1
Ini tampaknya bekerja dengan baik jika Anda ingin warna prompt warna dengan xterm (in by .bashrc): PS1='\[\e]0;\u@\h: \w\a\]\n${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$'Semuanya adalah warna yang berbeda, termasuk cabang.
still_dreaming_1

5
PS1 yang saya poskan tidak lagi menampilkan dengan benar untuk saya di Linux Mint 17.3 Cinnamon 64-bit, tetapi ini tidak:PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[00m\]$(__git_ps1) \$ '
still_dreaming_1

1
Master saat ini ada di github.com/git/git/blob/master/contrib/completion/git-prompt.sh - saya pikir kita harus menautkan itu dalam jawaban, jika eksploitasi ditemukan di masa depan? Juga: Saya harus melarikan diri dari $ dan "di jalur PS1 saya, tapi itu mungkin karena kerumitannya.
ArchimedesMP

57

Ikuti langkah-langkah sebagai berikut: (Linux)

Edit file ~/.bashrc, untuk memasukkan baris berikut pada akhirnya (Dalam kasus Mac, file akan ~/.bash_profile)

# Git branch in prompt.
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

Sekarang, mulai jendela terminal baru, dan coba masuk ke git-repo. Cabang saat ini akan ditampilkan, dengan prompt.

4 Info Lebih Lanjut - MAC / Linux


Saya rasa tidak perlu mengubah ~ / .bash_profile daripada ~ / .bashrc di OSX.
bergercookie


1
Untuk warna pertimbangkan mengubah "git branch" menjadi "git -c color.ui = always branch" di parse_git_branch di atas. Ini memiliki warna yang sama dengan yang digunakan cabang git untuk menyorot cabang saat ini.
awatts

Terinspirasi oleh Anda, tapi saya suka direktori kerja saya menjadi path lengkap (\ w) dengan highlight biru. Contoh: gist.github.com/rmharrison/1885ef6bbb0226eb7b42e2135d5eeca2
rmharrison

Untuk MAC saya harus menghilangkan melarikan diri sebelum $ (parse_git_branch) untuk mendapatkan ini untuk bekerja begitu: PS1="\u@\h \W\[\033[32m\]$(parse_git_branch)\[\033[00m\] $ ". Meskipun saya tidak menggunakan 'ekspor' di depan PS1 juga.
Chris

37

1- Jika Anda tidak memiliki penyelesaian-bash ...:sudo apt-get install bash-completion

2- Edit file .bashrc Anda dan centang (atau tambahkan):

if [ -f /etc/bash_completion ]; then
  . /etc/bash_completion
fi

3- ... sebelum baris prompt Anda: export PS1='$(__git_ps1) \w\$ '
( __git_ps1 akan menampilkan cabang git Anda)

4- lakukan source .bashrc

EDIT:

Bacaan lebih lanjut: Jangan Menemukan Kembali Roda


ini tampaknya menjadi satu-satunya cara kerjanya bagi saya menggunakan mesin wisma / gelandangan
Iannazzi

Berfungsi dengan baik di ubuntu 16.04
Frug

Tautan "Don't Reinvent the Wheel" sayangnya rusak.
Taylor R

@AylorR Saya telah memulihkan tautannya.
VonC

23

Inilah cara saya mengonfigurasi prompt untuk menampilkan status Git:

Dapatkan skrip git-prompt:

curl -o ~/.git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh

Dan sesuaikan permintaan Anda dengan menambahkan kode berikut di file .bashrc Anda:

# Load Git functions
source ~/.git-prompt.sh

# Syntactic sugar for ANSI escape sequences
txtblk='\e[0;30m' # Black - Regular
txtred='\e[0;31m' # Red
txtgrn='\e[0;32m' # Green
txtylw='\e[0;33m' # Yellow
txtblu='\e[0;34m' # Blue
txtpur='\e[0;35m' # Purple
txtcyn='\e[0;36m' # Cyan
txtwht='\e[0;37m' # White
bldblk='\e[1;30m' # Black - Bold
bldred='\e[1;31m' # Red
bldgrn='\e[1;32m' # Green
bldylw='\e[1;33m' # Yellow
bldblu='\e[1;34m' # Blue
bldpur='\e[1;35m' # Purple
bldcyn='\e[1;36m' # Cyan
bldwht='\e[1;37m' # White
unkblk='\e[4;30m' # Black - Underline
undred='\e[4;31m' # Red
undgrn='\e[4;32m' # Green
undylw='\e[4;33m' # Yellow
undblu='\e[4;34m' # Blue
undpur='\e[4;35m' # Purple
undcyn='\e[4;36m' # Cyan
undwht='\e[4;37m' # White
bakblk='\e[40m'   # Black - Background
bakred='\e[41m'   # Red
badgrn='\e[42m'   # Green
bakylw='\e[43m'   # Yellow
bakblu='\e[44m'   # Blue
bakpur='\e[45m'   # Purple
bakcyn='\e[46m'   # Cyan
bakwht='\e[47m'   # White
txtrst='\e[0m'    # Text Reset

# Prompt variables
PROMPT_BEFORE="$txtcyn\u@\h $txtwht\w$txtrst"
PROMPT_AFTER="\\n\\\$ "

# Prompt command
PROMPT_COMMAND='__git_ps1 "$PROMPT_BEFORE" "$PROMPT_AFTER"'

# Git prompt features (read ~/.git-prompt.sh for reference)
export GIT_PS1_SHOWDIRTYSTATE="true"
export GIT_PS1_SHOWSTASHSTATE="true"
export GIT_PS1_SHOWUNTRACKEDFILES="true"
export GIT_PS1_SHOWUPSTREAM="auto"
export GIT_PS1_SHOWCOLORHINTS="true"

Jika Anda ingin mengetahui lebih lanjut, Anda bisa mendapatkan semua file dot di sini: https://github.com/jamming/dotfiles


Jawaban terbaik sejauh ini.
Basil Musa

@Hesam Anda dapat mengubah PROMPT_BEFOREvariabel lingkungan dan menghapus $txtwht\wsaya tidak tahu itu dengan hati, tapi saya kira itu berhasil
jaguililla

1
Ini berfungsi di mac saya tetapi menunjukkan nama cabang seperti (master * $% =)
Ajak6

Simbol-simbol itu menyerupai keadaan cabang, yaitu: $berarti ada perubahan simpanan, dan =berarti komit terbaru didorong ke cabang yang dilacak jarak jauh
jaguililla


3

Pada awalnya, buka Profil Bash Anda di direktori home Anda. Cara termudah untuk membuka & mengedit bash_profile Anda menggunakan editor default Anda.

Sebagai contoh, saya membukanya menggunakan Kode VS menggunakan perintah ini: code .bash_profile.

Kemudian tempel kode berikut ke Bash Anda.

parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

Fungsinya

parse_git_branch ()

akan mengambil nama cabang & kemudian melalui PS1 Anda dapat menunjukkannya di terminal Anda.

Sini,

\ u = Nama pengguna

@ = Teks Statis

\ h = Nama Komputer

\ w = Direktori Saat Ini

$ = Teks Statis

Anda dapat mengubah atau menghapus variabel-variabel ini untuk penyesuaian lebih lanjut.


Jika Anda menggunakan Git untuk pertama kalinya di terminal atau langsung setelah konfigurasi, mungkin kadang-kadang Anda tidak dapat melihat nama cabang.

Jika Anda mendapatkan masalah ini, jangan khawatir. Dalam hal itu, buat saja repositori sampel dan komit setelah beberapa perubahan. Ketika perintah commit akan dieksekusi sekali, terminal akan menemukan cabang git sejak saat itu.


Tangkapan layar: Cabang Git di Terminal


2
vim ~/.bash

parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $"

Untuk mencerminkan perubahan terbaru, jalankan perintah berikut

source ~/.bashrc

Keluaran:-

chandrakant@NDL41104 ~/Chandrakant/CodeBase/LaravelApp (development) $

0

Jika Anda menggunakan kulit ikan, itu cukup lurus ke depan. ikan adalah cangkang interaktif yang dilengkapi dengan banyak barang. Anda dapat menginstalnya menggunakan apt-get.

sudo apt-get install fish

Anda kemudian dapat mengubah pengaturan prompt menggunakan

> fish_config 
Web config started at 'http://localhost:8001/'. Hit enter to stop.
Created new window in existing browser session.

sekarang buka untuk http://localhost:8001/ membuka tab prompt dan pilih opsi klasik + git

masukkan deskripsi gambar di sini

Sekarang klik tombol gunakan prompt dan Anda sudah siap.


0
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]$(parse_git_branch)\n\$ '

Eww, benar-benar jangan letakkan terminal telanjang keluar di sana; gunakan tputseperti orang waras.
Toby Speight

0

Ikuti langkah-langkah di bawah ini untuk menunjukkan nama cabang repo GIT Anda di terminal ubuntu:

langkah1: buka terminal dan edit .bashrc menggunakan perintah berikut.

vi .bashrc

langkah2: tambahkan baris berikut di akhir file .bashrc:

parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' }

export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "

step3: sumber .bashrc di direktori root (home) dengan melakukan:

/ rootfolder: ~ $ source .bashrc

Langkah4: Nyalakan kembali dan buka terminal dan periksa cmd. Arahkan ke jalur direktori repo GIt Anda dan Anda selesai. :)


0
root:~/project#  -> root:~/project(dev)# 

tambahkan kode berikut ke akhir ~ / .bashrc Anda

force_color_prompt=yes
color_prompt=yes
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt


-1

Saya telah mencoba skrip kecil dengan python yang masuk dalam folder bin .... file 'gitprompt'

#!/usr/bin/env python
import subprocess, os
s = os.path.join(os.getcwd(), '.git')
def cut(cmd):
    ret=''
    half=0
    record = False
    for c in cmd:
        if c == "\n":
            if not (record):
                pass
            else:
                break
        if (record) and c!="\n":
            ret = ret + c
        if c=='*':
            half=0.5
        if c==' ':
            if half == 0.5:
                half = 1
        if half == 1:
            record = True
    return ret
if (os.path.isdir(s)):
    out = subprocess.check_output("git branch",shell=True)
    print cut(out)
else:
    print "-"

Buat itu bisa dieksekusi dan semacamnya

Kemudian sesuaikan bash prompt seperti:

\u:\w--[$(gitprompt)] \$ 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.