Вопрос или проблема
Я ищу инструмент, чтобы пройтись по 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
, могут быть более подходящими вариантами.