Цикл по N репозиториям git

Вопрос или проблема

Я ищу инструмент, чтобы пройтись по N git-репозиториям и выполнить git-команды (чаще всего git diff).

Желательные функции:

  • открытый исходный код
  • основанный на командной строке

bash может это сделать.

Напишите ваши команды Git в файле сценария bash, названном commands.sh:

git clone [...]
git add [...]
git commit [...]
git push
git tag [...]

Затем вызовите commands.sh в вашем цикле с & в конце, чтобы все команды выполнялись параллельно без ожидания завершения предыдущей.

Я реализовал это простое решение:

#!/bin/bash
cd ~/src
if [ -e "$@" ]; then
   echo 'Пожалуйста, укажите git команду (например, "status")'
   exit 1;
fi
parallel -j0 "cd {}; echo -- {} ------------- ; git $@; echo " ::: $(find * -maxdepth 2 -name .git -printf '%h\n') 

В моем случае все git-репозитории находятся в ~/src.

Есть: gr

Инструмент для управления несколькими git-репозиториями http://mixu.net/gr/

Функции

  • Тегируйте все! gr @work foo выполнит команду foo во всех путях, помеченных @work.
  • Автоматическое обнаружение git-репозиториев для простоты настройки и управления тегами.
  • gr не переизобретает операции git: вместо этого он передает и выполняет любые неизвестные команды. Все ваши git-fu по-прежнему будет работать! Например, gr @work git fetch то же самое, что и выполнение git fetch во всех путях, помеченных @work.
  • Встроенные команды для распространенных проблем:
    status для однострочных сводок репозиториев (измененные, отстают/опережают, теги)
  • Расширяемость через плагины и промежуточное ПО: обработчики запросов в стиле REST API/Connect (function(req, res, next) { … }

clustergit: https://github.com/mnagel/clustergit

clustergit позволяет вам выполнять git-команды на нескольких репозиториях одновременно. Это особенно полезно для рекурсивного выполнения git status в одной папке.

clustergit поддерживает git status, git pull, git push и многое другое.

Это переименованная и немного улучшенная версия show_status от Майка Пирса.

Существует git-repo от Google: https://code.google.com/archive/p/git-repo/

Repo — это инструмент, который мы создали поверх Git. Repo помогает нам управлять множеством Git-репозиториев, выполняет загрузки в нашу систему контроля версий и автоматизирует части рабочего процесса разработки Android. Repo не предназначен для замены Git, а лишь для упрощения работы с Git в контексте Android. Команда repo — это исполняемый Python-скрипт, который вы можете разместить в любом месте вашего пути.

git(1) теперь имеет git-for-each-repo(1). Вы храните репозитории в вашей конфигурации Git.

Например

[maintenance]
    repo = […]
    repo = […]
    repo = […]

Затем выполните что-то вроде

git for-each-repo --config=maintenance.repo gc
git for-each-repo --config=maintenance.repo status

Имейте в виду, что в руководстве сказано (git версия 2.46.2)

ЭТА КОМАНДА ЭКСПЕРИМЕНТАЛЬНАЯ. ПОВЕДЕНИЕ МОЖЕТ ИЗМЕНИТЬСЯ.

Ответ или решение

Для выполнения операций с несколькими Git-репозиториями одновременно вы можете использовать различные инструменты и подходы. Вот несколько известных решений и примеров, которые помогут вам реализовать вашу задачу:

1. Использование Bash-скрипта

Вы можете написать Bash-скрипт для выполнения команд Git в нескольких репозиториях. Вот простой пример:

#!/bin/bash
cd ~/src
if [ -z "$1" ]; then
   echo 'Пожалуйста, укажите команду git (например, "status")'
   exit 1;
fi
parallel -j0 "cd {}; echo -- {} ------------- ; git $1; echo " ::: $(find * -maxdepth 2 -name .git -printf '%h\n')

В этом скрипте:

  • Мы переходим в каталог с вашими репозиториями.
  • Мы проверяем, была ли передана команда.
  • Используем утилиту parallel для выполнения команды в каждом найденном репозитории.

2. Использование gr

gr — это инструмент для управления несколькими Git-репозиториями, который имеет следующие функции:

  • Тегирование всех вещей: gr @work foo выполнит команду foo во всех путях, помеченных тегом @work.
  • Автоматическое обнаружение Git-репозиториев для простой настройки и управления тегами.
  • Поддержка всех стандартных команд Git, а также наличие встроенных команд, таких как status, для получения краткой информации о состоянии репозиториев.

3. Использование clustergit

clustergit позволяет выполнять команды Git в нескольких репозиториях одновременно. Он особенно полезен для выполнения git status в одном каталоге и поддерживает другие команды, такие как git pull и git push.

4. Инструмент git-repo

git-repo — это инструмент, разработанный Google для упрощения работы с множеством репозиториев Git, особенно в контексте Android-разработки. Он предоставляет удобные команды для управления множеством репозиториев и автоматизации определенных действий.

5. Использование git for-each-repo

Команда git for-each-repo позволяет выполнять операции с несколькими репозиториями, записанными в вашем конфигурационном файле Git. Например:

[maintenance]
    repo = /path/to/repo1
    repo = /path/to/repo2
    repo = /path/to/repo3

Затем вы можете выполнить команды, такие как:

git for-each-repo --config=maintenance.repo gc
git for-each-repo --config=maintenance.repo status

Однако обратите внимание, что эта команда является экспериментальной и может изменить свое поведение в будущих версиях Git.

Заключение

Выбор инструмента будет зависеть от ваших конкретных потребностей. Если вам нужно больше контроля, возможно, Bash-скрипт будет лучшим решением. Если вы ищете готовое решение с дополнительными функциями, такие как gr или clustergit, могут быть более подходящими вариантами.

Оцените материал
Добавить комментарий

Капча загружается...