Самописная команда git-batch

Думаю, для большинства разработчиков это достаточно стандартная ситуация, когда в папочке 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 в неожиданных местах. Но данный пример достаточен чтобы показать идею.

Примеры:

  1. Посмотрим, какие у нас есть ветки, чтобы вспомнить, какие у нас есть таски: $ 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
  1. Обновим все ветки репозиториев, дабы потом не страдать от мержей:
$ 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.
  1. Обновив все ветки, удалим те, которые уже влились в мастер: (пусть 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-шки так умеют? :)