Tampilkan Git Branch & Status di Bash Prompt

Pempersonalisasi prompt Bash untuk konteks Git instan

Konten Halaman

Sebuah bash prompt yang dikonfigurasi dengan baik menampilkan informasi repositori git dapat secara dramatis meningkatkan alur kerja pengembangan Anda.

Alih-alih terus-menerus menjalankan perintah git status dan git branch, Anda dapat memiliki informasi kritis ini selalu terlihat di terminal Anda.

oh-my-posh

Contoh prompt oh-my-push.

Mengapa Menambahkan Informasi Git ke Bash Prompt Anda?

Ketika Anda bekerja dengan beberapa repositori git dan cabang sepanjang hari, beralih konteks menjadi pemborosan produktivitas yang signifikan. Prompt yang sadar git menyelesaikan beberapa masalah umum:

  • Mencegah kebingungan cabang: Anda selalu tahu cabang mana yang sedang Anda gunakan sebelum melakukan commit
  • Mengurangi beban perintah: Tidak perlu terus-menerus menjalankan git status dan git branch
  • Umpan balik visual langsung: Lihat perubahan yang belum dikomit, file yang belum dilacak, dan status upstream dengan sekilas
  • Mengurangi kesalahan: Hindari secara tidak sengaja meng-commit ke cabang yang salah atau mendorong kode yang kotor

Memahami Variabel Bash PS1

Prompt bash dikontrol oleh variabel lingkungan PS1. Variabel ini dapat berisi:

  • Teks literal: Karakter apa pun yang ingin Anda tampilkan
  • Sekuens escape: Kode khusus yang dimulai dengan \ yang menampilkan informasi dinamis
  • Substitusi perintah: Perintah dalam $(...) yang dieksekusi dan menampilkan outputnya
  • Kode warna ANSI: Sekuens escape yang mengubah warna teks

Sekuens escape PS1 yang umum meliputi:

  • \u - nama pengguna saat ini
  • \h - nama host
  • \w - direktori kerja saat ini
  • \$ - # untuk akar, $ untuk pengguna normal
  • \t - waktu saat ini dalam format 24 jam

Prompt dasar mungkin terlihat seperti: PS1='\u@\h:\w\$ ' yang menghasilkan output seperti user@hostname:/path/to/dir$ . Untuk lebih banyak dasar bash dan sekuens escape, lihat Bash Cheat Sheet kami yang komprehensif.

Metode 1: Menggunakan Skrip Bawaan git-prompt.sh Git

Distribusi git menyertakan skrip bantuan yang disebut git-prompt.sh yang menyediakan fungsi __git_ps1. Ini adalah pendekatan paling andal dan fitur kaya.

Menemukan lokasi git-prompt.sh

Pertama, temukan di mana skrip ini berada di sistem Anda:

# Lokasi umum di Linux
/usr/share/git-core/contrib/completion/git-prompt.sh
/etc/bash_completion.d/git-prompt
/usr/lib/git-core/git-sh-prompt

# Lokasi umum di macOS (dengan Homebrew)
/usr/local/etc/bash_completion.d/git-prompt.sh
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh

# Cari jika diperlukan
find /usr -name git-prompt.sh 2>/dev/null

Konfigurasi Dasar

Tambahkan berikut ke ~/.bashrc atau ~/.bash_profile Anda:

# Sumberkan skrip git-prompt
source /usr/lib/git-core/git-sh-prompt

# Atur prompt Anda untuk mencakup informasi git
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[01;31m\]$(__git_ps1 " (%s)")\[\033[00m\]\$ '

Bagian $(__git_ps1 " (%s)") memanggil fungsi tersebut, dan %s diganti dengan nama cabang saat ini. Spasi dan tanda kurung di sekitarnya mengformatnya secara rapi.

Setelah mengedit, muat ulang konfigurasi Anda:

source ~/.bashrc

Opsi Lanjutan git-prompt.sh

git-prompt.sh menjadi kuat ketika Anda mengaktifkan fitur opsionalnya melalui variabel lingkungan:

# Tampilkan perubahan yang belum di-commit (*) dan yang sudah di-commit (+)
export GIT_PS1_SHOWDIRTYSTATE=1

# Tampilkan jika ada perubahan yang disimpan ($)
export GIT_PS1_SHOWSTASHSTATE=1

# Tampilkan jika ada file yang belum dilacak (%)
export GIT_PS1_SHOWUNTRACKEDFILES=1

# Tampilkan perbedaan antara HEAD dan upstream
# Pilihan: auto, verbose, name, legacy, git, svn
export GIT_PS1_SHOWUPSTREAM="auto"

# Aktifkan petunjuk warna (membutuhkan bash 4.0+)
export GIT_PS1_SHOWCOLORHINTS=1

# Tampilkan status repositori selama operasi
# (MERGING, REBASING, BISECTING, dll.)
export GIT_PS1_DESCRIBE_STYLE="default"

Berikut penjelasan indikatornya:

  • * - Perubahan yang belum di-commit (file yang dimodifikasi tetapi belum ditambahkan)
  • + - Perubahan yang sudah di-commit (file yang ditambahkan tetapi belum dikomit)
  • $ - Ada perubahan yang disimpan
  • % - Ada file yang belum dilacak
  • < - Ketinggalan cabang upstream
  • > - Mendahului cabang upstream
  • <> - Berbeda dari upstream
  • = - Sama dengan upstream

Konfigurasi Lengkap

Berikut adalah konfigurasi ~/.bashrc yang komprehensif:

# Sumberkan git-prompt
if [ -f /usr/share/git-core/contrib/completion/git-prompt.sh ]; then
    source /usr/share/git-core/contrib/completion/git-prompt.sh
fi

# Konfigurasi opsi git-prompt
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWSTASHSTATE=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
export GIT_PS1_SHOWUPSTREAM="auto"
export GIT_PS1_SHOWCOLORHINTS=1

# Definisi warna
COLOR_RESET='\[\033[00m\]'
COLOR_USER='\[\033[01;32m\]'      # Hijau
COLOR_PATH='\[\033[01;34m\]'      # Biru
COLOR_GIT='\[\033[01;33m\]'       # Kuning

# Setel prompt
PS1="${COLOR_USER}\u@\h${COLOR_RESET}:${COLOR_PATH}\w${COLOR_GIT}"'$(__git_ps1 " (%s)")'"${COLOR_RESET}\$ "

Metode 2: Substitusi Perintah Git Manual

Jika Anda tidak memiliki akses ke git-prompt.sh atau ingin solusi minimal, Anda dapat langsung menjalankan perintah git di prompt Anda:

# Hanya nama cabang
PS1='\u@\h:\w$(git branch 2>/dev/null | grep "^*" | colrm 1 2 | sed "s/^/ (/;s/$/)/")\$ '

# Nama cabang dengan indikator status
parse_git_dirty() {
    [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit, working tree clean" ]] && echo "*"
}

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

PS1='\u@\h:\w\[\033[01;33m\]$(parse_git_branch)\[\033[00m\]\$ '

Pendekatan ini lebih portabel tetapi kurang canggih dari git-prompt.sh dan bisa lebih lambat di repositori besar.

Metode 3: Alat Prompt Modern

Untuk pengalaman yang lebih kaya dengan konfigurasi minimal, pertimbangkan alternatif modern berikut:

Starship Prompt

Starship adalah prompt cepat dan dapat dikonfigurasi yang ditulis dalam Rust dan bekerja di beberapa shell (bash, zsh, fish, PowerShell).

# Instalasi Starship
curl -sS https://starship.rs/install.sh | sh

# Tambahkan ke ~/.bashrc
eval "$(starship init bash)"

Starship secara otomatis mendeteksi repositori git dan menampilkan:

  • Nama cabang
  • Hash commit ketika terlepas
  • Status repositori (merge, rebase, dll.)
  • Jumlah file yang dimodifikasi
  • Status di depan/di belakang upstream
  • Dan banyak lagi dengan ikon yang dapat dikonfigurasi

Konfigurasikan melalui ~/.config/starship.toml:

[git_branch]
symbol = "🌱 "
format = "on [$symbol$branch]($style) "

[git_status]
conflicted = "🏳"
ahead = "⇡${count}"
behind = "⇣${count}"
diverged = "⇕⇡${ahead_count}⇣${behind_count}"
untracked = "🤷"
stashed = "📦"
modified = "📝"
staged = '[++\($count\)](green)'
renamed = "👅"
deleted = "🗑"

Oh My Bash

Oh My Bash adalah kerangka kerja untuk mengelola konfigurasi bash dengan tema dan plugin:

# Instalasi Oh My Bash
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)"

# Edit ~/.bashrc untuk menyetel tema
OSH_THEME="powerline"

Banyak tema Oh My Bash sudah mencakup integrasi git secara default.

Oh My Posh

Oh My Posh adalah mesin prompt modern, lintas platform yang bekerja dengan bash, zsh, PowerShell, dan shell lainnya. Ia menyediakan prompt yang indah dan dapat dikonfigurasi dengan integrasi git yang sangat baik dan menggunakan Nerd Fonts untuk dukungan ikon.

Instalasi di Linux

Instal Oh My Posh dengan satu perintah:

# Instal ke ~/bin atau ~/.local/bin (default)
curl -s https://ohmyposh.dev/install.sh | bash -s

# Atau tentukan direktori instalasi khusus
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/bin

Pengaturan Dasar

Tambahkan Oh My Posh ke ~/.bashrc Anda:

# Inisialisasi Oh My Posh dengan tema
eval "$(oh-my-posh init bash --config ~/.poshthemes/jandedobbeleer.omp.json)"

Menginstal dan Menggunakan Tema

Oh My Posh menyertakan banyak tema pra-dibuat. Unduh terlebih dahulu:

# Buat direktori tema
mkdir ~/.poshthemes

# Unduh semua tema
curl -s https://ohmyposh.dev/themes.json | \
  jq -r '.[] | .url' | \
  xargs -I {} sh -c 'curl -s {} -o ~/.poshthemes/$(basename {})'

Tema populer termasuk:

  • jandedobbeleer.omp.json - Tema pribadi penulis dengan integrasi git penuh
  • powerline.omp.json - Gaya powerline klasik
  • atomic.omp.json - Minimalis dengan informasi esensial
  • night-owl.omp.json - Tema berwarna kaya dengan detail git yang luas

Ganti tema dengan mengubah jalur konfigurasi:

eval "$(oh-my-posh init bash --config ~/.poshthemes/atomic.omp.json)"

Fitur Git

Oh My Posh secara otomatis menampilkan informasi git yang komprehensif:

  • Nama cabang saat ini
  • Jumlah commit di depan/di belakang remote
  • Status kerja (bersih/kotor)
  • Jumlah stash
  • Status merge/rebase
  • Informasi tag
  • Hash commit dalam keadaan HEAD terlepas

Konfigurasi Kustom

Buat tema kustom dengan menyalin tema yang ada:

# Salin tema sebagai titik awal
cp ~/.poshthemes/jandedobbeleer.omp.json ~/.mytheme.omp.json

# Edit tema Anda
nano ~/.mytheme.omp.json

# Gunakan tema kustom Anda
eval "$(oh-my-posh init bash --config ~/.mytheme.omp.json)"

Contoh konfigurasi segmen git dalam JSON:

{
  "type": "git",
  "style": "powerline",
  "powerline_symbol": "",
  "foreground": "#193549",
  "background": "#fffb38",
  "background_templates": [
    "{{ if or (.Working.Changed) (.Staging.Changed) }}#FF9248{{ end }}",
    "{{ if and (gt .Ahead 0) (gt .Behind 0) }}#ff4500{{ end }}",
    "{{ if gt .Ahead 0 }}#B388FF{{ end }}",
    "{{ if gt .Behind 0 }}#B388FF{{ end }}"
  ],
  "properties": {
    "fetch_status": true,
    "fetch_upstream_icon": true,
    "branch_icon": " ",
    "branch_max_length": 25,
    "truncate_symbol": "…"
  }
}

Persyaratan Font

Oh My Posh bekerja terbaik dengan Nerd Fonts untuk dukungan ikon:

# Unduh dan instal font Nerd (contoh: FiraCode)
mkdir -p ~/.local/share/fonts
cd ~/.local/share/fonts
curl -fLo "FiraCode Nerd Font.ttf" \
  https://github.com/ryanoasis/nerd-fonts/raw/HEAD/patched-fonts/FiraCode/Regular/FiraCodeNerdFont-Regular.ttf
fc-cache -fv

Kemudian konfigurasikan terminal Anda untuk menggunakan font Nerd.

Keunggulan Oh My Posh

  • Lintas platform: Konfigurasi yang sama bekerja di Linux, macOS, dan Windows
  • Cepat: Ditulis dalam Go untuk kinerja
  • Dapat diperluas: Segmen modular untuk git, waktu, jalur, bahasa, penyedia cloud, dll.
  • Tema kaya: Koleksi besar tema pra-dibuat
  • Pengembangan aktif: Pembaruan dan peningkatan teratur
  • Terminal independen: Bekerja di terminal ANSI apa pun

Bash-git-prompt

Alat prompt bash khusus yang fokus pada informasi git:

# Clone repository
git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1

# Tambahkan ke ~/.bashrc
if [ -f "$HOME/.bash-git-prompt/gitprompt.sh" ]; then
    GIT_PROMPT_ONLY_IN_REPO=1
    source $HOME/.bash-git-prompt/gitprompt.sh
fi

Pertimbangan Kinerja dalam Repositori Besar

Operasi git status dapat lambat di repositori besar. Berikut strategi optimisasi:

Nonaktifkan Fitur Mahal Secara Pemilih

# Di .bashrc, nonaktifkan fitur secara pemilih untuk repositori besar
if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
    repo_size=$(du -sh .git 2>/dev/null | cut -f1)
    # Nonaktifkan pemeriksaan status kotor untuk repositori di atas 100MB
    if [[ "$repo_size" =~ ^[0-9]+M$ ]] && [ "${repo_size%M}" -gt 100 ]; then
        export GIT_PS1_SHOWDIRTYSTATE=0
    fi
fi

Gunakan Opsi Konfigurasi Git

Konfigurasikan git untuk mengoptimalkan pemeriksaan status:

# Aktifkan monitor filesystem untuk pemeriksaan status yang lebih cepat
git config core.fsmonitor true
git config core.untrackedCache true

# Untuk repositori besar, pertimbangkan clones parsial
git config core.commitGraph true
git config gc.writeCommitGraph true

Alternatif: Prompt Asinkron

Alat seperti Starship menggunakan operasi asinkron untuk mencegah kemacetan prompt. Prompt diperbarui setelah informasi git diperoleh, bukan menghambat.

Penyelesaian Masalah Umum

Prompt Tidak Menampilkan Informasi Git

  1. Verifikasi git-prompt.sh disumberkan: Jalankan type __git_ps1 di terminal Anda. Jika itu mengatakan “tidak ditemukan”, skrip tidak dimuat.
  2. Periksa izin file: Pastikan git-prompt.sh dapat dibaca: ls -l /path/to/git-prompt.sh
  3. Verifikasi Anda berada di repositori git: Jalankan git status untuk memverifikasi
  4. Periksa sintaks PS1: Pastikan $(__git_ps1) disertakan dan dikutip dengan benar

Warna Tidak Ditampilkan

  1. Masalah sekuens escape: Warna dalam PS1 harus dibungkus dalam \[ \] untuk mencegah masalah penggulungan baris
  2. Dukungan terminal: Verifikasi terminal Anda mendukung warna ANSI: echo -e "\033[31mRed Text\033[0m"
  3. Kode reset: Selalu akhiri urutan warna dengan kode reset \033[00m

Prompt Memecah Penggulungan Baris

Ketika menggunakan warna, sekuens escape non-printing harus dibungkus dalam \[ dan \]:

# Salah - menyebabkan masalah penggulungan baris
PS1="\033[32m\u\033[00m\$ "

# Benar
PS1="\[\033[32m\]\u\[\033[00m\]\$ "

Prompt Lambat di WSL atau Drive Jaringan

Operasi git di bagian jaringan Windows atau WSL bisa lambat:

# Nonaktifkan fitur git-prompt yang mahal di filesystem lambat
export GIT_PS1_SHOWDIRTYSTATE=0
export GIT_PS1_SHOWUNTRACKEDFILES=0

Pertimbangkan menggunakan Git bash bawaan Windows alih-alih WSL untuk repositori di drive Windows.

Integrasi dengan Alur Kerja Pengembangan

Prompt sadar git menjadi lebih kuat ketika dikombinasikan dengan peningkatan shell lainnya:

Alias Git untuk Navigasi Cepat

Gabungkan prompt yang ditingkatkan Anda dengan alias git yang berguna untuk memaksimalkan efisiensi. Untuk daftar lengkap perintah dan singkatan git, lihat GIT commands cheatsheet kami.

# Tambahkan ke ~/.gitconfig atau ~/.bashrc
alias gs='git status'
alias gb='git branch'
alias gc='git checkout'
alias gp='git pull'
alias gpu='git push'

Perilaku Prompt Berdasarkan Kondisi

# Warna prompt berbeda untuk berbagai kondisi
__git_ps1_colorize() {
    local git_status="$(git status 2>/dev/null)"
    if [[ $git_status =~ "nothing to commit" ]]; then
        echo -e "\[\033[32m\]"  # Hijau untuk bersih
    else
        echo -e "\[\03身[31m\]"  # Merah untuk kotor
    fi
}

PS1='\u@\h:\w$(__git_ps1_colorize)$(__git_ps1 " (%s)")\[\033[00m\]\$ '

Integrasi dengan Baris Judul Terminal

Perbarui judul terminal dengan informasi repositori:

PROMPT_COMMAND='echo -ne "\033]0;${PWD##*/}$(__git_ps1 " [%s]")\007"'

Praktik Terbaik dan Rekomendasi

  1. Jaga agar terbaca: Jangan penuhi prompt Anda dengan terlalu banyak informasi
  2. Gunakan warna secara strategis: Warna berbeda untuk berbagai kondisi (bersih vs kotor)
  3. Uji dalam berbagai skenario: Verifikasi prompt bekerja di direktori biasa, repositori git, dan selama operasi git
  4. Dokumentasikan konfigurasi Anda: Komentar file .bashrc agar Anda ingat apa yang dilakukan setiap bagian
  5. Backup konfigurasi Anda: Kontrol versi dotfiles Anda dalam repositori git. Jika Anda menjalankan server git sendiri, Anda mungkin ingin mengeksplorasi instalasi Gitea sebagai opsi self-hosted yang ringan
  6. Pertimbangkan alur kerja Anda: Aktifkan hanya fitur yang benar-benar Anda butuhkan
  7. Gunakan alat modern jika mungkin: Starship dan alat serupa telah diuji dan berkinerja baik

Untuk solusi self-hosted git, pelajari tentang backup dan restore Gitea untuk memastikan repositori Anda dilindungi. Jika Anda tertarik mengotomatisasi alur kerja git Anda, eksplorasi cheatsheet GitHub Actions kami untuk otomasi CI/CD yang komprehensif.

Tautan Berguna

Artikel Berguna Lainnya