عرض فرع Git وحالة الالتزام في إشارة Bash
تخصيص نافذة Bash للحصول على سياق Git الفوري
لوحة أوامر bash مُكوّنة جيدًا تعرض معلومات مستودر git يمكن أن تحسّن بشكل كبير تجربة العمل التطويري.
بدلاً من تشغيل أوامر git status و git branch باستمرار، يمكنك أن يكون هذا المعلومات الحيوية مرئية دائمًا في شاشة مُرَتِّبَتك.

مثال على لوحة oh-my-posh.
لماذا إضافة معلومات git إلى لوحة أوامر bash؟
عندما تعمل مع عدة مستودرات git وفروع خلال اليوم، يصبح التبديل بين السياقات عبئًا كبيرًا على الإنتاجية. تحلّي لوحة أوامر مُدرَّبة على git مشاكل شائعة عديدة:
- تمنع الارتباك بين الفروع: ستعرف دائمًا الفرع الذي تعمل عليه قبل التزام
- تقلل من عبء الأوامر: لا حاجة لتشغيل
git statusوgit branchباستمرار - تُقدّم ملاحظة مرئية فورية: رؤية التغييرات غير الملتزمة، الملفات غير المراقبة، والوضع المرجعي بسرعة
- تقلل من الأخطاء: تجنّب التزام بفرع خاطئ أو دفع كود ملوث
فهم متغير bash PS1
تُتحكم لوحة أوامر bash من خلال المتغير البيئي PS1. يمكن أن يحتوي هذا المتغير على:
- نصوص ثابتة: أي أحرف ترغب بعرضها
- تسلسلات الهروب: تسلسلات خاصة تبدأ بـ
\تُعرض معلومات ديناميكية - استبدال الأوامر: أوامر داخل
$(...)تُنفذ وتعرض مخرجاتها - كودات الألوان ANSI: تسلسلات تغيّر ألوان النصوص
تسلسلات الهروب الشائعة في PS1 تشمل:
\u- اسم المستخدم الحالي\h- اسم المضيف\w- الدليل الحالي\$-#للمستخدم الجذر،$للمستخدم العادي\t- الوقت الحالي بتنسيق 24 ساعة
قد تبدو لوحة بسيطة على النحو التالي: PS1='\u@\h:\w\$ ' تنتج إخراجًا مثل user@hostname:/path/to/dir$ . لمزيد من أساسيات bash وتسلسلات الهروب، راجع قائمة اختصارات bash.
الطريقة 1: استخدام نسخة git-prompt.sh المدمجة في git
تتضمن توزيعات git نسخة مساعدة تسمى git-prompt.sh توفر دالة __git_ps1. هذه هي الطريقة الأكثر موثوقية وميزة.
تحديد موقع git-prompt.sh
أولًا، ابحث عن موقع النسخة على نظامك:
# مواقع شائعة على Linux
/usr/share/git-core/contrib/completion/git-prompt.sh
/etc/bashcompletion.d/git-prompt
/usr/lib/git-core/git-sh-prompt
# مواقع شائعة على macOS (مع Homebrew)
/usr/local/etc/bashcompletion.d/git-prompt.sh
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh
# ابحث عنها إذا لزم الأمر
find /usr -name git-prompt.sh 2>/dev/null
التكوين الأساسي
أضف ما يلي إلى ملف ~/.bashrc أو ~/.bash_profile:
# تحميل نسخة git-prompt
source /usr/lib/git-core/git-sh-prompt
# ضع لوحتك لتضمين معلومات git
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[01;31m\]$(__git_ps1 " (%s)")\[\033[00m\]\$ '
الجزء $(__git_ps1 " (%s)") يُنفّذ الدالة، ويتم استبدال %s باسم الفرع الحالي. الفراغات والقوسين تُرتّبها بشكل لطيف.
بعد التعديل، إعادة تحميل تكوينك:
source ~/.bashrc
خيارات git-prompt.sh المتقدمة
تُصبح git-prompt.sh قوية عندما تفعّل ميزاتها الاختيارية عبر متغيرات بيئة:
# عرض التغييرات غير الملتزمة (*) والملتزمة (+)
export GIT_PS1_SHOWDIRTYSTATE=1
# عرض وجود تغييرات مخزنة ($)
export GIT_PS1_SHOWSTASHSTATE=1
# عرض وجود ملفات غير مراقبة (%)
export GIT_PS1_SHOWUNTRACKEDFILES=1
# عرض الفرق بين الرأس والمرجع
# خيارات: auto, verbose, name, legacy, git, svn
export GIT_PS1_SHOWUPSTREAM="auto"
# تفعيل إشارات الألوان (تتطلب bash 4.0+)
export GIT_PS1_SHOWCOLORHINTS=1
# عرض حالة المستودر أثناء العمليات
# (MERGING, REBASING, BISECTING، إلخ)
export GIT_PS1_DESCRIBE_STYLE="default"
هذا ما تعنيه المؤشرات:
*- تغييرات غير ملتزمة (ملفات مُعدّلة ولكن لم تُضاف)+- تغييرات ملتزمة (ملفات مُضافّة ولكن لم تُلتزم)$- وجود تغييرات مخزنة%- وجود ملفات غير مراقبة<- خلف الفرع المرجعي>- أمام الفرع المرجعي<>- تفرّع عن الفرع المرجعي=- مساوٍ للفرع المرجعي
مثال كامل على التكوين
إليك تكوينًا شاملاً لـ ~/.bashrc:
# تحميل 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
# تكوين خيارات 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
# تعريف الألوان
COLOR_RESET='\[\033[00m\]'
COLOR_USER='\[\033[01;32m\]' # أخضر
COLOR_PATH='\[\033[01;34m\]' # أزرق
COLOR_GIT='\[\033[01;33m\]' # أصفر
# ضع لوحتك
PS1="${COLOR_USER}\u@\h${COLOR_RESET}:${COLOR_PATH}\w${COLOR_GIT}"'$(__git_ps1 " (%s)")'"${COLOR_RESET}\$ "
الطريقة 2: استبدال الأوامر git يدويًا
إذا لم تكن لديك وصول إلى git-prompt.sh أو ترغب في حل بسيط، يمكنك تنفيذ أوامر git مباشرة في لوحتك:
# اسم الفرع فقط
PS1='\u@\h:\w$(git branch 2>/dev/null | grep "^*" | colrm 1 2 | sed "s/^/ (/;s/$/)/")\$ '
# اسم الفرع مع مؤشر الحالة
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\]\$ '
هذا النهج أكثر قابلية للنقل، لكنه يفتقر إلى تعقيد git-prompt.sh ويمكن أن يكون أبطأ في المستودرات الكبيرة.
الطريقة 3: أدوات لوحة حديثة
للحصول على تجربة أثريّة مع تكوين محدود، اعتبر هذه الأدوات الحديثة:
لوحة Starship
Starship هي لوحة سريعة وقابلة للتخصيص مكتوبة بلغة Rust تعمل عبر عدة أطر (bash, zsh, fish, PowerShell).
# تثبيت Starship
curl -sS https://starship.rs/install.sh | sh
# أضف إلى ~/.bashrc
eval "$(starship init bash)"
Starship تكتشف تلقائيًا مستودرات git وتعرض:
- اسم الفرع
- الهاش عند الفصل
- حالة المستودر (دمج، إعادة تشكيل، إلخ)
- عدد الملفات المُعدّلة
- حالة مقدّمة/خلفية الفرع المرجعي
- وغيرها الكثير مع رموز قابلة للتخصيص
تُكوّنها عبر ~/.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 هي إطار لإدارة تكوين bash مع المواضيع والأدوات:
# تثبيت Oh My Bash
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)"
# قم بتحرير ~/.bashrc لتعيين المواضيع
OSH_THEME="powerline"
تتضمن العديد من المواضيع في Oh My Bash دمج git تلقائيًا.
Oh My Posh
Oh My Posh هي محرك لوحة حديثة تعمل عبر bash, zsh, PowerShell، وغيرها من الأطر. تقدم لوحة جميلة وقابلة للتخصيص مع دمج git ممتاز، وتستخدم Nerd Fonts لدعم الرموز.
التثبيت على Linux
تثبيت Oh My Posh عبر أوامر واحدة:
# تثبيت إلى ~/bin أو ~/.local/bin (الافتراضي)
curl -s https://ohmyposh.dev/install.sh | bash -s
# أو حدد مسار تثبيت مخصص
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/bin
التكوين الأساسي
أضف Oh My Posh إلى ~/.bashrc:
# تهيئة Oh My Posh مع موضوع
eval "$(oh-my-posh init bash --config ~/.poshthemes/jandedobbeleer.omp.json)"
تثبيت واستخدام المواضيع
تتضمن Oh My Posh العديد من المواضيع الجاهزة. قم بتنزيلها أولًا:
# إنشاء دليل المواضيع
mkdir ~/.poshthemes
# تنزيل جميع المواضيع
curl -s https://ohmyposh.dev/themes.json | \
jq -r '.[] | .url' | \
xargs -I {} sh -c 'curl -s {} -o ~/.poshthemes/$(basename {})'
المواضيع الشائعة تشمل:
jandedobbeleer.omp.json- موضوع المبدع مع دمج git كاملpowerline.omp.json- النمط الكلاسيكي لـ powerlineatomic.omp.json- أبسط مع المعلومات الأساسيةnight-owl.omp.json- موضوع ملون مع تفاصيل git موسعة
غير المواضيع من خلال تغيير مسار التكوين:
eval "$(oh-my-posh init bash --config ~/.poshthemes/atomic.omp.json)"
ميزات git
تعرض Oh My Posh تلقائيًا معلومات git شاملة:
- اسم الفرع الحالي
- عدد التزامات مقدّمة/خلفية المرجع
- حالة الدليل (نظيف/ملوث)
- عدد التخزين المؤقت
- حالة الدمج/إعادة التشكيل
- معلومات التسمية
- الهاش في حالة الفصل
التكوين المخصص
أنشئ موضوعًا مخصصًا من خلال نسخ موضوع موجود:
# نسخ موضوع كنقطة بداية
cp ~/.poshthemes/jandedobbeleer.omp.json ~/.mytheme.omp.json
# تحرير موضوعك
nano ~/.mytheme.omp.json
# استخدم موضوعك المخصص
eval "$(oh-my-posh init bash --config ~/.mytheme.omp.json)"
مثال على تكوين قسم git في 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": "…"
}
}
متطلبات الخط
تعمل Oh My Posh بشكل أفضل مع Nerd Fonts لدعم الرموز:
# تنزيل وتثبيت خط Nerd Font (مثال: 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
ثم قم بتكوين مُرَتِّبك لاستخدام خط Nerd Font.
مزايا Oh My Posh
- متعددة الأنظمة: نفس التكوين يعمل على Linux, macOS, وWindows
- سريعة: مكتوبة بلغة Go للأداء
- قابلة للتوسيع: أقسام مودولية لـ git، الوقت، المسار، اللغات، مزودي السحابة، إلخ
- مواضيع واسعة: مجموعة كبيرة من المواضيع الجاهزة
- تطوير نشط: تحديثات وتحسينات منتظمة
- مستقلة عن المُرَتِّب: تعمل في أي مُرَتِّب متوافق مع ANSI
Bash-git-prompt
أداة مخصصة لـ bash تركز على معلومات git:
# تحميل المستودر
git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1
# أضف إلى ~/.bashrc
if [ -f "$HOME/.bash-git-prompt/gitprompt.sh" ]; then
GIT_PROMPT_ONLY_IN_REPO=1
source $HOME/.bash-git-prompt/gitprompt.sh
fi
أداء في المستودرات الكبيرة
يمكن أن تكون عمليات git status بطيئة في المستودرات الكبيرة. إليك استراتيجيات تحسين الأداء:
تعطيل الميزات المكلفة بشكل انتقائي
# في .bashrc، تعطيل الميزات بشكل انتقائي للمستودرات الكبيرة
if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
repo_size=$(du -sh .git 2>/dev/null | cut -f1)
# تعطيل فحص حالة الملفات لمستودرات تزيد عن 100MB
if [[ "$repo_size" =~ ^[0-9]+M$ ]] && [ "${repo_size%M}" -gt 100 ]; then
export GIT_PS1_SHOWDIRTYSTATE=0
fi
fi
استخدام خيارات تكوين git
قم بتكوين git لتحسين فحص الحالة:
# تفعيل مراقبة نظام الملفات لتحسين فحص الحالة
git config core.fsmonitor true
git config core.untrackedCache true
# للمستودرات الكبيرة، فكّر في النسخ الجزئية
git config core.commitGraph true
git config gc.writeCommitGraph true
خيار بديل: لوحة غير متزامنة
تستخدم أدوات مثل Starship عمليات غير متزامنة لمنع تأخير لوحة. تُحدث لوحة بعد استرداد معلومات git، بدلًا من تعطيلها.
حل مشكلات شائعة
لوحة لا تظهر معلومات git
- تحقق من تحميل git-prompt.sh: اecute
type __git_ps1في مُرَتِّبك. إذا قال “لم تُعثر”، فإن النسخة غير مُحمّلة. - تحقق من أذونات الملف: تأكد من أن git-prompt.sh قابلة للقراءة:
ls -l /path/to/git-prompt.sh - تحقق من أنك داخل مستودر git: اecute
git statusللتأكيد - تحقق من تكوين PS1: تأكد من أن
$(__git_ps1)مُضمنة ومرتبطة بشكل صحيح
الألوان لا تظهر
- مشاكل تسلسلات الهروب: يجب أن تُحاط الألوان في PS1 بـ
\[ \]لمنع مشاكل ترتيب الأسطر - دعم المُرَتِّب: تحقق من أن مُرَتِّبك يدعم الألوان ANSI:
echo -e "\033[31mRed Text\033[0m" - كودات إعادة التعيين: دائمًا اختم تسلسلات الألوان بـ
\033[00m
تكسير ترتيب الأسطر في لوحة
عند استخدام الألوان، يجب أن تُحاط تسلسلات غير قابلة للطباعة بـ \[ و \]:
# خاطئ - تسبب مشاكل في ترتيب الأسطر
PS1="\033[32m\u\033[00m\$ "
# صحيح
PS1="\[\033[32m\]\u\[\033[00m\]\$ "
تأخير في لوحة WSL أو أقراص الشبكة
يمكن أن تكون عمليات git بطيئة على أقراص الشبكة أو WSL:
# تعطيل ميزات git-prompt باهظة التكلفة على أجهزة تخزين بطيئة
export GIT_PS1_SHOWDIRTYSTATE=0
export GIT_PS1_SHOWUNTRACKEDFILES=0
فكر في استخدام bash git الأصلي بدلاً من WSL للمستودرات على أقراص Windows.
دمج مع تدفق العمل التطويري
تُصبح لوحة git أكثر قوة عندما تُدمج مع تحسينات أخرى لـ shell:
اختصارات git للتنقل السريع
دمج لوحتك المُحسّنة مع اختصارات git مفيدة لزيادة الكفاءة. لقائمة شاملة من الأوامر والاختصارات، راجع قائمة اختصارات git.
# أضف إلى ~/.gitconfig أو ~/.bashrc
alias gs='git status'
alias gb='git branch'
alias gc='git checkout'
alias gp='git pull'
alias gpu='git push'
سلوك لوحة معطى
# ألوان مختلفة لحالات مختلفة
__git_ps1_colorize() {
local git_status="$(git status 2>/dev/null)"
if [[ $git_status =~ "nothing to commit" ]]; then
echo -e "\[\033[32m\]" # أخضر للنظام النظيف
else
echo -e "\[\033[31m\]" # أحمر للنظام الملوث
fi
}
PS1='\u@\h:\w$(__git_ps1_colorize)$(__git_ps1 " (%s)")\[\033[00m\]\$ '
تحديث شريط عنوان المُرَتِّب
تحديث شريط عنوان المُرَتِّب مع معلومات المستودر:
PROMPT_COMMAND='echo -ne "\033]0;${PWD##*/}$(__git_ps1 " [%s]")\007"'
أفضل الممارسات والمقترحات
- احتفظ بالقراءة: لا تزدحم لوحتك بكمية كبيرة من المعلومات
- استخدم الألوان بذكاء: ألوان مختلفة للحالات المختلفة (نظيف مقابل ملوث)
- اختبار في حالات متعددة: تأكد من أن لوحتك تعمل في الدلائل العادية، والمستودرات git، والعمليات git
- وثّق تكوينك: اكتب تعليقات في ملف .bashrc لفهم ما يفعله كل جزء
- احفظ تكوينك: تأمين تكوينك في مستودر git. إذا كنت تشغل خادم git الخاص بك، فقد ترغب في استكشاف تثبيت Gitea كخيار خفيف مُستضاف.
- اعتبر تدفق العمل الخاص بك: تفعيل الميزات فقط التي تحتاجها
- استخدم الأدوات الحديثة عندما يكون من الممكن: Starship والأدوات المماثلة مُختبرة جيدًا وفعّالة
لحلول مُستضافّة git، تعلّم عن نسخ احتياطية واستعادة Gitea لضمان حماية مستودراتك. إذا كنت مهتمًا بتوسيع تدفق عمل git، استكشف قائمة اختصارات GitHub Actions.
روابط مفيدة
- وثائق git الرسمية حول git-prompt.sh
- موقـع Starship Prompt الرسمي
- وثائق Oh My Posh الرسمية
- معرض المواضيع في Oh My Posh
- wiki bash Hackers - تكوين PS1
- مستودر Oh My Bash
- مستودر bash-git-prompt
- موقـع Nerd Fonts الرسمي
- مراجع كود ANSI الهروب
- نصائح git لتحسين الأداء في المستودرات الكبيرة