Thêm nhánh git vào dấu nhắc lệnh Bash


161

Tôi đã thử thêm nhánh git mà tôi hiện đang làm việc (đã kiểm tra) trên dấu nhắc bash nhưng không thành công .. ( trong khi giữ đường dẫn hiện tại của tôi hiển thị thư mục / tệp đang hoạt động ) Tôi có tệp .bashrc ở nhà, nhưng tôi cũng thấy nhiều người nhắc đến tệp .profile ..


3
Tôi nghĩ rằng điều này sẽ được yêu cầu tốt hơn trong trao đổi unix / linux.
Cole Busby

Tôi đã thử như 10 cách khác nhau, một số trong số chúng hoạt động nhưng tôi đã nhận được nhánh git và mất thư mục / đường dẫn làm việc tôi có trước đây ..
George Katsanos

Git 1.9.3+ mang đến một cách thú vị để hiển thị chi nhánh: xem câu trả lời của tôi bên dưới
VonC

1
@cole busby rõ ràng là không.
George Katsanos

1
@GeorgeKatsanos bốn năm chắc chắn đã cho tôi thấy: p
Cole Busby

Câu trả lời:


161

git 1.9.3 trở lên: sử dụng __git_ps1

Git cung cấp một kịch bản shell gọi git-prompt.sh, trong đó bao gồm một chức năng __git_ps1

in văn bản để thêm vào dấu nhắc bash PS1 (bao gồm tên chi nhánh)

Cách sử dụng cơ bản nhất của nó là:

$ __git_ps1
(master)

Nó cũng có một chuỗi định dạng tùy chọn:

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

Làm thế nào để có được nó

Đầu tiên, sao chép tệp vào một nơi nào đó (ví dụ ~/.git-prompt.sh).

Tùy chọn 1: sử dụng bản sao hiện có trên hệ thống tệp của bạn. Ví dụ (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

Tùy chọn 2: Kéo tập lệnh từ GitHub .

Tiếp theo, thêm dòng sau vào .bashrc/.zshrc:

source ~/.git-prompt.sh

Cuối cùng, thay đổi của bạn PS1để gọi __git_ps1là thay thế lệnh:

Bash:

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

Zsh:

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

git <1.9.3

Nhưng lưu ý rằng chỉ git 1.9.3 (tháng 5 năm 2014) trở lên mới cho phép bạn hiển thị một cách an toàn tên chi nhánh đó (!)

Xem cam kết 8976500 của Richard Hansen ( richardhansen) :

Cả bash và zsh đều có giá trị của PS1 để mở rộng tham số , thay thế lệnh và mở rộng số học.

Thay vì bao gồm tên nhánh thô, không thoát, PS1khi chạy ở chế độ hai hoặc ba đối số, hãy xây dựng PS1để tham chiếu một biến chứa tên nhánh.

Vì các shell không mở rộng đệ quy, điều này tránh việc thực thi mã tùy ý bằng các tên nhánh được chế tạo đặc biệt như

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

Tâm trí quỷ quyệt nào sẽ đặt tên cho một nhánh như vậy? ;) ( Bên cạnh một người mẹ như trong xkcd )

Thêm ví dụ

still_dreaming_1 báo cáo trong các bình luận :

Điều này có vẻ hoạt động tốt nếu bạn muốn một dấu nhắc màu với xterm(trong của tôi .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)\$ ' 

Tất cả mọi thứ là một màu sắc khác nhau, bao gồm cả chi nhánh.

Trong 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
làm thế nào bạn có thể đặt lời nhắc đến nhánh git hiện tại khi bạn thực sự ở trong một repo git. Vì vậy, nếu bạn đang ở trong một thư mục bình thường, nó hiển thị dấu nhắc bình thường.
Zubair Alam

1
@ still_dreaming_1 bạn có thể nâng cấp hoặc biên dịch git rất dễ dàng: stackoverflow.com/a/24847953/6309
VonC

1
Điều này có vẻ hoạt động tốt nếu bạn muốn một dấu nhắc màu với xterm (in .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)\$'Mọi thứ đều là một màu khác nhau, bao gồm cả nhánh.
still_dreaming_1

5
Bản PS1 mà tôi đã đăng không còn hiển thị chính xác cho tôi trong Linux Mint 17.3 Cinnamon 64-bit, nhưng điều này có:PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[00m\]$(__git_ps1) \$ '
still_dreaming_1

1
Bậc thầy hiện tại có tại github.com/git/git/blob/master/contrib/completion/git-prompt.sh - Tôi nghĩ chúng ta nên liên kết với điều đó trong câu trả lời, trong trường hợp khai thác được tìm thấy trong tương lai? Ngoài ra: Tôi đã phải thoát $ và "trong dòng PS1 của mình, nhưng điều đó có lẽ là do sự phức tạp của nó.
ArchimedesMP

57

Thực hiện theo các bước như dưới đây: (Linux)

Chỉnh sửa tệp ~/.bashrc, để nhập các dòng sau vào cuối (Trong trường hợp, của Mac, tệp sẽ là ~/.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\] $ "

Bây giờ, bắt đầu cửa sổ terminal mới và thử nhập bất kỳ git-repo nào. Chi nhánh hiện tại sẽ được hiển thị, với lời nhắc.

4 Thông tin khác - MAC / Linux


Tôi không nghĩ cần phải thay đổi ~ / .bash_profile thay vì ~ / .bashrc trên OSX.
bergercookie


1
Đối với màu sắc, hãy xem xét việc thay đổi "nhánh git" thành "git -c color.ui = always nhánh" trong parse_git_branch ở trên. Nó có cùng màu mà nhánh git sử dụng để làm nổi bật nhánh hiện tại.
đánh thức

Lấy cảm hứng từ bạn, nhưng tôi thích thư mục làm việc của tôi là đường dẫn đầy đủ (\ w) với màu xanh lam nổi bật. Ví dụ: gist.github.com/rmharrison/1885ef6bbb0226eb7b42e2135d5eeca2
rmharrison

Đối với MAC, tôi đã phải loại bỏ lối thoát trước $ (parse_git_branch) để làm cho nó hoạt động như vậy : PS1="\u@\h \W\[\033[32m\]$(parse_git_branch)\[\033[00m\] $ ". Mặc dù tôi cũng không sử dụng 'xuất khẩu' trước PS1.
Chris

37

1- Nếu bạn chưa hoàn thành bash ...:sudo apt-get install bash-completion

2- Chỉnh sửa tệp .bashrc của bạn và kiểm tra (hoặc thêm):

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

3- ... trước dòng nhắc của bạn: export PS1='$(__git_ps1) \w\$ '
( __git_ps1 sẽ hiển thị nhánh git của bạn)

4 - làm source .bashrc

BIÊN TẬP :

Bài đọc thêm: Đừng tái tạo bánh xe


đây dường như là cách duy nhất nó hoạt động đối với tôi bằng cách sử dụng máy homestead / vagrant
Iannazzi

Hoạt động tốt trong Ubuntu 16.04
Frug

Liên kết "Đừng tái tạo bánh xe" bị hỏng một cách đáng buồn.
Taylor R

@TaylorR Tôi đã khôi phục liên kết.
VonC

23

Đây là cách tôi định cấu hình lời nhắc để hiển thị trạng thái Git:

Nhận tập lệnh git-prompt:

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

Và tùy chỉnh lời nhắc của bạn thêm mã sau vào tệp .bashrc của bạn:

# 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"

Nếu bạn muốn tìm hiểu thêm, bạn có thể lấy tất cả các dotfiles tại đây: https://github.com/jamming/dotfiles


Câu trả lời tốt nhất cho đến nay.
Basil Musa

@Hesam Bạn có thể thay đổi PROMPT_BEFOREbiến môi trường và loại bỏ $txtwht\wtrái tim mà tôi không biết, nhưng tôi đoán nó có mẹo
jaguililla

1
Nó hoạt động trên máy mac của tôi nhưng hiển thị tên chi nhánh như (master * $% =)
Ajak6

Những biểu tượng đó giống với trạng thái của chi nhánh, nghĩa là: $có nghĩa là có những thay đổi được lưu trữ và =có nghĩa là cam kết mới nhất đã được đẩy đến chi nhánh được theo dõi từ xa
jaguililla


3

Đầu tiên, mở Hồ sơ Bash của bạn trong thư mục nhà của bạn. Cách dễ nhất để mở và chỉnh sửa bash_profile bằng trình chỉnh sửa mặc định của bạn.

Ví dụ, tôi mở nó bằng Mã VS bằng lệnh này: code .bash_profile.

Sau đó chỉ cần dán các mã sau vào Bash của bạn.

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\] $ "

Chức năng

parse_git_branch ()

sẽ lấy tên chi nhánh và sau đó thông qua PS1, bạn có thể hiển thị nó trong thiết bị đầu cuối của mình.

Đây,

\ u = Tên người dùng

@ = Văn bản tĩnh

\ h = Tên máy tính

\ w = Thư mục hiện tại

$ = Văn bản tĩnh

Bạn có thể thay đổi hoặc loại bỏ các biến này để tùy chỉnh nhiều hơn.


Nếu bạn sử dụng Git lần đầu tiên trong thiết bị đầu cuối hoặc ngay lập tức sau khi định cấu hình, có thể đôi khi bạn không thể thấy tên chi nhánh.

Nếu bạn gặp vấn đề này, đừng lo lắng. Trong trường hợp đó, chỉ cần tạo một kho lưu trữ mẫu và cam kết nó sau một số thay đổi. Khi lệnh commit sẽ thực thi một lần, terminal sẽ tìm nhánh git từ đó.


Ảnh chụp màn hình: Chi nhánh Git trong 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\] $"

Để phản ánh những thay đổi mới nhất, hãy chạy theo lệnh

source ~/.bashrc

Đầu ra: -

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

0

Nếu bạn sử dụng vỏ cá của nó khá thẳng về phía trước. cá là một vỏ tương tác đi kèm với rất nhiều goodies. Bạn có thể cài đặt nó bằng cách sử dụng apt-get.

sudo apt-get install fish

sau đó bạn có thể thay đổi cài đặt lời nhắc bằng cách sử dụng

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

Bây giờ hãy http://localhost:8001/ mở tab nhắc và chọn tùy chọn classic + git

nhập mô tả hình ảnh ở đây

Bây giờ bấm vào nút nhắc sử dụng và bạn đã thiết lập.


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, thực sự không đặt thiết bị đầu cuối trần truồng trốn thoát trong đó; sử dụng tputnhư bất kỳ người lành mạnh.
Toby Speight

0

Thực hiện theo các bước dưới đây để hiển thị tên của chi nhánh repo GIT của bạn trong thiết bị đầu cuối Ubuntu:

step1: mở terminal và chỉnh sửa .bashrc bằng lệnh sau.

vi .bashrc

Bước2: thêm dòng sau vào cuối tệp .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\] $ "

bước 3: source .bashrc trong thư mục gốc (home) bằng cách thực hiện:

/ rootfolder: ~ $ source .bashrc

Bước 4: Khởi động lại và mở terminal và kiểm tra cmd. Điều hướng đến đường dẫn thư mục GIt repo của bạn và bạn đã hoàn tất. :)


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

thêm đoạn mã sau vào cuối ~ / .bashrc của bạn

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

Tôi đã thử một đoạn script nhỏ trong python có trong thư mục bin .... tập tin '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 "-"

Làm cho nó thực thi và công cụ

Sau đó điều chỉnh dấu nhắc bash cho phù hợp như:

\u:\w--[$(gitprompt)] \$ 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.