в кожного свої звички роботи з git, — чув, є люди, котрі використовують графічні інструменти на кшталт втулків для vscode чи навіть окремі застосунки? — я використовую виключно командний рядок і декілька зручненьких аліясів (скорочень) для довгих команд. ось дещо з того, що накопичилося в глобальному конфігу (~/.gitconfig
).
git alias
дозволяє мені швидко пригадати, які скорочення я собі налаштував:
~> git config --global alias.alias '!git config --global --get-regex alias. | sed "s/alias.\([^ ]*\)\s\(.*\)/\1\t\2/"'
використання:
~> git alias
stat !git status; echo; git show --oneline --stat=,,10; git log --oneline -n5 HEAD^
tree !tree --gitignore
du !du -h -c -d1
alias !git config --global --get-regex alias. | sed "s/alias.\([^ ]*\)\s\(.*\)/\1\t\2/"
...
git stat
мені замало інформації стандантного git status
, тому я зібрав собі трохи зручнішу версію, котра додатково показує журнал комітів з короткою статистикою змінених файлів останнього коміту:
~> git config --global alias.stat '!git status; echo; git show --oneline --stat=,,10 2>/dev/null; git log --oneline -n5 HEAD^ 2>/dev/null'
використання:
~/projects/python/tutorials/yart> git stat
На гілці part6/refactoring
Ваша гілка не відрізняється від "origin/part6/refactoring".
нічого комітити, робоче дерево чисте
c142943 (HEAD -> part6/refactoring, origin/part6/refactoring) fix: помилка в readme /ti
readme.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
e9d6328 mod: поновлення readme /ti
8c5847b mod: рефакторинг engine.py, виправлення помилок /ti
1e48ed7 mod: рефакторинг procgen.py /ti
07687de mod: рефакторинг entities.py /ti
33c6d51 mod: refactor main.py /ti
git logs
трохи зручніший для читання журнал комітів, без необхідності друкувати --oneline
щоразу:
~> git config --global alias.logs '!git log --pretty=format:"%C(yellow)%h%Creset %s %Cgreen(%cr)%Creset <%an> %C(yellow)%d%Creset" --abbrev-commit "$@" '
використання (можна додавати інші опції git log
, як от -n 5
, --graph
тощо):
~/ownCloud/Щоденник/drafts> git logs -n 5
fa05314 add: ілюстрації до нових дописів /ti (5 тижнів тому) <tivasyk> (HEAD -> master, origin/master)
9aa5603 add: допис про аліяси git /ti (5 тижнів тому) <tivasyk>
260d4d1 add: чимало давно не закомічених змін /ti (5 тижнів тому) <tivasyk>
385e0cf mod: публікація поновленого vim cookbook /ti (2 місяці тому) <tivasyk>
a1a54e6 add: ілюстрація #3: палітра everforest /ti (2 місяці тому) <tivasyk>
git tree
дозволяє швидко охопити оком дерево тек проєкту; зручніший за просто tree
, бо аліяси git завжди запускаються в кореневій теці репозиторію, а --gitignore
враховує виключення (фінальний пробіл потрібен):
~> git config --global alias.tree '!tree --dirsfirst --gitignore '
використання (зрозуміло, що можна додавати інші опції tree):
~/ownCloud/Щоденник/drafts> git tree -L 1
.
├── components
│ ├── actions.py
...
│ └── tiles.py
├── main.py
├── readme.md
├── requirements.txt
├── resources
│ ├── buddy-graphical.png
│ └── dejavu10x10_gs_tc.png
└── screenshots
├── Screenshot_20240121_090900.png
...
└── Screenshot_20240210_175818.png
git du
дозволяє швидко оцінити розмір репозиторію (рідко, але буває потрібно); знову ж таки — зручно, бо запускається в корені незалежно від поточної теки в дереві проєкту:
git config --global alias.du '!du -h -d1'
використання:
~/ownCloud/Щоденник/drafts> git du
24K ./resources
2,4M ./screenshots
5,4M ./.git
88K ./components
123M ./venv
130M .
видалення аліясу
інколи потрібно видалити скорочення; на прикладі du
:
~> git config --global --unset alias.du
repo
один з найзручніших для мене «прискорювачів» роботи з git — інтерактивний перемикач між різними локальними репозиторіями, — неможливо зробити як аліяс git, тому довелося винести його як окрему функцію до ~/library.sh
(але можна просто додати до .bashrc
чи .bash_profile
):
repo() {
# рекурсивний пошук локальних репозиторіїв git, інтерактивний вибір одного за допомогою fzf і перехід до теки
cd $(find ~ -not -path '*/\.*/*' -name .git -exec dirname {} + -prune 2>/dev/null | fzf --tac --height=~10 --header="Choose local Git repo" --query="$1")
}
пояснення:
cd $(…)
— переходить до теки, назву котрої повертає ланцюжок команд в дужках;find ~ …
— шукає рекурсивно в домашній теці…-not -path '*/\.*/*'
— …в підтеках, назви котрих не починаються з.
…-name .git
— …теки.git
(наприклад,~/projects/bashtan/.git
),…-exec dirname {} +
— повертає назву теки (~/project/bashtan
, без/.git
)…-prune
— і не опускається в дочірні підтеки;2>/dev/null
— ігноруючи помилки доступу;
| fzf
— список репозиторіїв передається до fzf…--tac
— …котра показує їх в зворотньому порядку…--height=~10
— …як список висотою не більше 10 рядків…--header=...
— …із заголовком…--query="$@"
— …і використовує аргумент як початковий фільтр для пошуку.
використання:
~> repo projects
/home/tivasyk/projects/vim/vim-accent
/home/tivasyk/projects/cheatsheet
/home/tivasyk/projects/bashtan
/home/tivasyk/projects/navijkl
/home/tivasyk/projects/arduino
> /home/tivasyk/projects
Choose local Git repo
10/16 ———————————————————————————————
> projects
далі буде?..