git prompt for bash (yet another)

Aki natúr parancssorból dolgozott már gittel, bizonyára sokszor hivogatta a különbözõ státusz lekérdezõ parancsokat, git status, git branch, git log, stb. Magam is ebben a cipõben járván akartam felokostani a promptomat.

"Git prompt" kifejezésre keresve talál az ember elég sok megoldást a problémára; szépek, színesek, de valahogy egyik se felelt meg az igényemnek. Egyes - számomra alapvetõnek számító - információkat nem jelenít meg a repóról, más lényegtelen infót meg megmutat.

Itt egy kis ízelítõ a legújabb git prompt implementációból:
















Hozzászólások

A parancsoknak is maradd hely? :)

-----
„Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben.”
rand() a lelke mindennek! :)
Szerinted…

~/.git-prompt-colors.sh
Minden más ugyanaz, ahogy a README-ben le van írva.

Annyi megjegyzés, hogy a GIT_PROMPT_SYMBOLS_AHEAD és GIT_PROMPT_SYMBOLS_BEHIND felülírása hivatalosan nem támogatott, a screenshotokon az example kimenetbe egy picit bele is kellett nyúlnom, mert erre az nincs felkészítve.

/off

nincs a gitnek valami library modja amit tudsz hasznalni egy !bash scriptben? egy "szaros" prompt kiirashoz miert kell meghivni 12szer a git-et?
persze ertem en hogy van 43242G ram, meg 853 processzor, szal' kinemszarjale. de azert megis... :(

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

"nincs a gitnek valami library modja amit tudsz hasznalni egy !bash scriptben?"

A gitnek magának nincs, de vannak más projektek is. Van pl. pure python implementáció, bár nem tudom mennyire használható.

"egy "szaros" prompt kiirashoz miert kell meghivni 12szer a git-et?"

Ha az értékes képernyőterületet ennyi felesleges információ kijelzésére akarod vesztegetni, amire kb. szökőévente egyszer van szükség, akkor az ezzel jár :)

Mindenesetre kb. 5-6 git hívást viszonylag egyszerűen el lehetne kerülni.

Amúgy szerintem is igazad van. Jó ez a prompt, de ízlések és pofonok: nekem túl bőbeszédű. Olyan dolgokat is megmutat, amire ritkán van szükség, akkor pedig inkább célirányosan kiadok rá egy parancsot.

Nekem ennyi:


export GIT_PS1_SHOWDIRTYSTATE=true
export GIT_PS1_SHOWSTASHSTATE=true
export GIT_PS1_SHOWUNTRACKEDFILES=true
export PROMPT_DIRTRIM=2

# colored prompt
USER=`whoami`
if [ $LOGNAME = $USER ] ; then
    USERCOLOR=32 # green
else
    USERCOLOR=33 # yellow
fi
if [ $USER = 'root' ] ; then
    USERCOLOR=31 # red
fi
export PS1='\[\033[$USERCOLOR;1m\]\u\[\033[37;1m\]@\[\033[36;1m\]\h\[\033[35;1m\]-\A-\[\033[37;1m\]\w\[\033[37;0m\]\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '
export PS2='\033[31;1m-\033[33;1m>\033[37;0m '

Ebben nem csak a git van, viszont sosem éreztem szükségét annak, hogy ennél többet belezsúfoljak, pláne ha cserébe a beírt parancsoknak alig marad hely.

-----
„Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben.”
rand() a lelke mindennek! :)
Szerinted…

"ízlések és pofonok: nekem túl bőbeszédű."

És milyen rikítóan színes! :)

"USER=`whoami`"

Hm, a $USER-ben nem már eleve annak kellene lennie, amit a whoami kiír?

"a beírt parancsoknak alig marad hely"

Ez egy kétsoros prompt, vagyis a csilivili egy sorral afelett van, ahova a parancsokat írnád.

„Hm, a $USER-ben nem már eleve annak kellene lennie, amit a whoami kiír?”

Látod, ezt kipróbálom. Igazából ezt a promptot pár éve összeraktam és azóta hurcolom magammal változtatás nélkül. :)

-----
„Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben.”
rand() a lelke mindennek! :)
Szerinted…

jogos felvetés és én is nagyon fájlalom ha valaki erõforráspazarlóan bánik még ilyen viszonylag kis volumenũ programoknál.

a megirása elején reménykedtem abban, hogy van valami `git info --machine-parsable` szerũ modul, amivel mindent egyszerre le tudok kérni, de nem találtam.
egyébként igyekeztem, ahol lehet, sima fájlolvasással elintézni az infólekérést, de még így is van mit optimalizálni rajta.
a fetch-elés úgy ahogy van ki is hagytam belõle, legalább a network resource-öket nem pazarolja.

~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack

Szerintem ez a prompt nem működik megfelelően egy

git gc

után, lásd

git help pack-refs

, vagy ha több worktree-d is van.

"akkor greppelés helyett hívhatok erre is git parancsot.
nesze neked, optimalizálás :)
"

Egyrészt a ref-ek számától függ, ha sok van belőlük, akkor tényleg a packed-refs a gyorsabb.

Másrészt ott a

for-each-ref

, az egy parancsból megmondja az adott commitra mutató branch-eket és tag-eket, és megfelelő format stringgel meghívva csak minimálisan több shell kód kell körítésnek, további külső processzek nélkül.

"több worktree alatt mit értesz?"

Egy új, egyelőre kísérleti feature/parancs, amivel egy repository-ból több worktree-t is ki lehet check-elni, így elvileg pl. egyik worktree-ben fejleszthetsz, míg a másikban szorgosan dolgozhat a

git bisect run

, meg ilyesmi. A lényeg, ami miatt ide kapcsolódik, hogy a refs hierarchia több helyről áll össze (a repository ref-jei + a worktree helyi re-jei), ezért még egy ok, ami miatt nem elég csak a .../.git/refs/ könyvtár tartalmát nézni.

Hát végülis így is lehet, de nem vagyok lenyűgözve :)

git for-each-ref --points-at=$hash --format='%(objecttype) %(refname:strip=2)' refs/heads refs/tags | while read type name ; do ...

és nem kell grep-pel szűrni, nem kell a prefixet eltávolítani, és az objektum típusa alapján hozzá lehet adni a megfelelő $tags vagy $branches változóhoz.