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
mà
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_ps1
là 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, PS1
khi 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\]:\[\033[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) \$ '