Думаю, для большинства разработчиков это достаточно стандартная ситуация, когда в папочке dev/work
лежит очень много репозиториев, и следить за каждым неудобно.
Есть различные менеджеры, которые утверждают, что помогут с этим разобраться, но тот же Sublime Merge достаточно куц по функционалу для того, чтобы сразу сделать какую-нибудь операцию в куче репок, например, посмотреть все ветки во всех репках чтобы вспомнить, над какими задачами еще идет работа, или же подтянуть все свежие ветки из апстрима. Но мы-то знаем, что наш лучший менеджер — это zsh
, и что программа любой сложности заменяется ворохом shell скриптов! На сцену выходит очень простой, но достаточно действенный способ: команда, которую я лаского обозвал git-batch
:
function git-batch() {
OLD_PWD=$PWD
# For simplicity let's assume my git repos have .git in them and no
# other directory does.
GIT_REPOS=$(find . -name ".git" | xargs -n1 dirname)
while read -r REPO_DIR; do
echo "$REPO_DIR:"
cd $REPO_DIR
# All the output is redirected to stdout and indented.
# We can redirect stderr because the command output is tainted
# by indent anyway.
$@ 2>$1 | sed 's/^/ /'
cd "$OLD_PWD"
done <<< "$GIT_REPOS"
}
Оговорюсь сразу: я знаю, что она имеет пару спорных вопросов вроде бросания вас посреди нигде в случае, если вы нажмете Ctrl-C, и того, что особо хитрые могут делать папки .git
в неожиданных местах. Но данный пример достаточен чтобы показать идею.
Примеры:
- Посмотрим, какие у нас есть ветки, чтобы вспомнить, какие у нас есть таски: $ git-batch git –branch
./website_parser:
* JIRA-123456008
JIRA-123456231
JIRA-123456303
master
./core_lib:
JIRA-123456008
* JIRA-123456356
develop
master
JIRA-123456403
./website_templates:
* master
./website_cms:
* JIRA-123456008
master
./website:
* JIRA-123456008
JIRA-123456231
JIRA-123456356
master
- Обновим все ветки репозиториев, дабы потом не страдать от мержей:
$ git-batch git pull —all
./website_parser:
Fetching origin
Already up to date.
./core_lib:
Fetching origin
Updating c97e802..54n00b7
Fast-forward
.gitignore | 12 +
lib/java/Server.py | 2329 +++++++++++++++---------------
2 files changed, 1756 insertions(+), 1635 deletions(-)
./website_templates:
Fetching origin
Already up to date.
./website_cms:
Fetching origin
Already up to date.
./website:
Fetching origin
Already up to date.
- Обновив все ветки, удалим те, которые уже влились в мастер:
(пусть gitconfig содержит алиас
cleanup = "!git branch --merged | grep -v '\\*\\|master\\|develop' | xargs -n 1 git branch -d"
)
$ git-batch git cleanup
./website_parser:
./core_lib:
Deleted branch JIRA-123456403 (was 32bbb98).
./website_templates:
./website_editor:
./website_partners:
Экономит массу сил на поддержку большого числа репозиториев и позволяет одной командой проводить много однотипных действий, одним словом удобно. А ваши IDE-шки так умеют? :)