Ответ 1
Похоже, писать script для этого довольно просто. По существу, он должен перебирать репозитории, а затем использовать команды типа git ls-files, git diff и git log.
Настройка проекта легко в git, поэтому я могу иметь отдельный репозиторий даже для небольшого script. Теперь проблема заключается в том, как управлять ими.
Я работаю в нескольких местах с этими репозиториями. Когда я внес изменения в какой-либо репозиторий, я хочу иметь возможность обновлять репозитории в других местах.
Итак, у меня есть каталог со многими репозиториями в нем.
И было бы неплохо сделать это с помощью одной команды.
Выход должен быть достаточно тихим, чтобы действительно заметить, что делать.
Похоже, писать script для этого довольно просто. По существу, он должен перебирать репозитории, а затем использовать команды типа git ls-files, git diff и git log.
Я очень рекомендую инструмент множественных репозиториев mr. Раньше я использовал пользовательскую оболочку script, как рекомендовано другими в течение некоторого времени, но использование mr имеет следующие преимущества для меня:
Относительно вашего вопроса о тихом выходе: Уровень детализации может быть изменен с помощью командной строки -q. Я предпочитаю вывод по умолчанию, который, как представляется, красиво объединяет вывод в краткой и четкой сводке.
Я использую следующий псевдоним для команды mr, чтобы гарантировать, что mr всегда выбирает мой список проектов по умолчанию, хранящийся в $HOME, и использует 5 параллельных потоков:
alias mr='mr -d ~/ -j 5 '
Должен сказать, что я начал с принятого в настоящее время ответа (просто набор сценариев помощников, которые перебирают репозитории), но в целом мне не хватало опыта.
Итак, попробовав mr, repo и git-submodules, я обнаружил, что каждый из них отсутствует по-своему, и в итоге я сделал свой собственный вариант: http://fabioz.github.io/mu-repo, который является зрелым инструментом на данный момент - он имеет рабочие процессы, которые позволяют вам в:
Обратите внимание, что он поддерживает любую ОС, где работает Python;)
gr (git -run) extends mr (только для git
). Мне проще организовать несколько репозиций git, используя свою систему тегов. Однако код для gr
не поддерживается. Если вы используете bash, убедитесь, что вы используете его с формой -t tag
вместо #tag
.
Вы можете попытаться использовать repo с пользовательским manifest.xml
файлом, чтобы указать, где находятся ваши репозитории. некоторая документация о том, как это сделать.
В качестве альтернативы вы можете использовать git-submodule(1
).
gitslave - это инструмент, который может запускать одну и ту же команду во многих репозиториях, создавая взаимосвязь суперпроекта и подпроекта между суперпроектом и подпрограммами. Это (по умолчанию) обеспечивает суммирование выходных данных, так что вы можете сосредоточиться на репозиториях, которые обеспечивают уникальный вывод (полезно для состояния git, не очень полезно для git ls файлов).
Это обычно используется для проектов, где вам нужно собрать несколько репозиториев вместе и хранить их в одной ветке или теге в одно и то же время или в любом другом месте. Для моего каталога (пустых) репозиториев у меня просто есть небольшой make файл, который позволяет мне запускать произвольные команды git, которые, как вы видите, я в основном использую для fsck и gc:
full: fsck-full gc-aggressive
@:
fsck-full:
for f in */.; do (cd $$f; echo $$f; git fsck --full || echo $$f FAILED); done
gc-aggressive:
for f in */.; do (cd $$f; echo $$f; git gc --aggressive || echo $$f FAILED); done
%:
for f in */.; do (cd $$f; git [email protected] || echo $$f FAILED); done
Я написал инструмент под названием " RepoZ ", который автоматически обнаруживает репозитории git, как только вы клонируете их или изменяете в них что-либо, например, переключение ветки.
Найденные репозитории "отслеживаются". Это просто покажет их в списке локальных репозиториев, включая обширную информацию о статусе, вдохновленную posh-git. Он содержит текущую ветку и другие вещи, такие как изменения файла и количество входящих или исходящих коммитов.
Это помогает отслеживать ваши локальные репозитории и незаконченную работу для фиксации или отправки. Кроме того, вы можете использовать список хранилищ в качестве навигации для переключения с одного хранилища на другое.
Версия для Windows предлагает контекстное меню для извлечения или извлечения хранилища. С помощью multi-select вы можете запускать действия в нескольких хранилищах одновременно.
Тем не менее, вы можете найти другую функцию очень полезной:
С помощью функции автоматической выборки вы можете указать RepoZ, что нужно периодически извлекать пульты всех ваших репозиториев git в фоновом режиме. Конечно, эти извлечения не будут конфликтовать с вашими локальными коммитами. Нет локальных попыток слияния, как с git pull
.
Я использую этот script, чтобы легко выполнять команды git во всех моих репозиториях.
#!/bin/sh
if [ ! "$1" = "" ] ; then
if [ "$GITREPO" = "" -a -d "$HOME/cm/src" ] ; then
GITREPO="$HOME/cm/src"
fi
if [ "$GITREPO" != "" ] ; then
echo "Git repositories found in $GITREPO"
echo "-=-=-=-=-=-=-=-=-=-=-=-=-=-"
DIRS="`/bin/ls -1 $GITREPO`"
for dir in $DIRS ; do
if [ -d $GITREPO/$dir/.git ] ; then
echo "$dir -> git $1"
cd $GITREPO/$dir ; git [email protected]
echo
fi
done
else
echo "Git repositories not found."
fi
fi
По умолчанию script будет искать репозитории git в ~/cm/src, но вы можете переопределить это, установив переменную среды GITREPO по своему вкусу.
Этот script основан на этот script.
Вы можете использовать камень git-status-all
для этого: https://github.com/reednj/git-status-all
# install the gem
gem install git-status-all
# use the status-all subcommand to scan the directory
git status-all
Существует также опция выборки, которая будет извлекаться из источника для всех репозиториев перед отображением статуса:
git status-all --fetch
Если кто-то все еще смотрит на эту тему, пожалуйста, проверьте мою оболочку script под названием gitme
вам нужно вручную ввести локальные репозитории git, но я каждый день использую этот инструмент для совместной работы нескольких проектов git на нескольких компьютерах.
вы можете запустить git clone https://github.com/robbenz/gitme.git
также script размещен ниже
#!/bin/bash -e
REPOS=(
/Users/you/gitrepo1
/Users/you/gitrepo2
/Users/you/gitrepo3
/Users/you/gitrepo4
)
MOVE="Moving to next REPO... \n"
tput setaf 2;echo "What ya wanna do? You can say push, pull, commit, ftp push, or status"; tput sgr0
read input
if [ $input = "commit" ]
then
tput setaf 2;echo "Do you want a unique commit message? [y/n]";tput sgr0
read ans
if [ $ans = "y" ]
then
for i in "${REPOS[@]}"
do
cd "$i"
tput setaf 6;pwd;tput sgr0
git add . -A
read -p "Commit description: " desc
git commit -m "$desc"
tput setaf 2;echo $MOVE;tput sgr0
sleep 1
done
else
for i in "${REPOS[@]}"
do
cd "$i"
tput setaf 6;pwd;tput sgr0
git add . -A
git commit -m "autocommit backup point"
tput setaf 2;echo $MOVE;tput sgr0
sleep 1
done
fi
elif [ $input = "push" ] || [ $input = "pull" ] || [ $input = "ftp push" ] || [ $input = "status" ]
then
for i in "${REPOS[@]}"
do
cd "$i"
tput setaf 6;pwd;tput sgr0
git $input
tput setaf 2;echo $MOVE;tput sgr0
sleep 1
done
else tput setaf 1;echo "You have zero friends";tput sgr0
fi
Я устанавливаю псевдоним в свой файл ~/.bash_profile, поэтому alias gitme='sh /path/to/gitme.sh'
Я создал псевдоним и функцию для запуска любой команды git во всех репозиториях, доступных в каталоге (рекурсивно). Вы можете найти его здесь: https://github.com/jaguililla/dotfiles/git
Это код:
#!/bin/sh
# To use it: source git_aliases
# Example: rgita remote \;
alias rgita='find . -type d -name .git -execdir git'
# Example: rgit remote -vv
rgit() {
rgita "[email protected]" \;
}
Надеюсь, поможет :)
Вы должны проверить rgit на CPAN, который рекурсивно выполняет команды git во всех репозиториях в дереве каталогов.
Из документов:
Эта утилита рекурсивно ищет в корневого каталога (который может быть текущий рабочий каталог или - если он был установлен - каталог, предоставленный переменная среды GIT_DIR) для все репозитории git, сортировать этот список по пути хранилища, chdir в каждый из них, и выполняет указанная команда git.
Я только что создал инструмент, который делает то, что вы хотите!
gmaster fetch
gmaster status
gmaster status
Он называется gitmaster: https://github.com/francoiscabrol/gitmaster
Я написал эту простую функцию bash в свой .bash_profile, чтобы иметь возможность запускать git, maven, gradle или любую другую команду bash только во всех репозиториях git:
# usefull function to work with multiple git repositories
all() {
failed=0
printf '>>> START RUNNING: "%s" >>>' "$*"
for d in */; do
pushd "$d" > /dev/null
if [ -d ".git" ]
then
printf '\n--------------------------------------------\n\n'
pwd
eval [email protected]
if [ $? -ne 0 ]
then
failed=1
break;
fi
fi
popd > /dev/null
done
if [ $failed -eq 0 ]
then
printf '\n--------------------------------------------\n'
printf '<<< RAN "%s" WITH SUCCESS!!! <<<' "$*"
else
printf '\n<<< FAILED!!! <<<'
fi
}
Это можно использовать таким образом
all git st
all git pull
all ./gradlew clean test
etc.
Я написал инструмент командной строки под названием gita для управления несколькими репозиториями. Он показывает статус зарегистрированных репо рядом, например
Он также может делегировать команды/псевдонимы git из любого рабочего каталога.
Теперь, чтобы ответить на ваши вопросы с помощью этого инструмента:
Как я могу получить их все?
gita fetch
Как я могу проверить, есть ли у кого-нибудь незафиксированные изменения?
Команда gita ls
показывает 3 возможных символа рядом с именем ветки, что указывает
+
: постановочные изменения*
: не внесенные изменения_
: неотслеживаемые файлы/папкиКак я могу проверить, есть ли изменения в слиянии?
Названия веток раскрашены 5-ю способами
Чтобы установить его, просто запустите
pip3 install -U gita
Отказ от ответственности: я работаю над этим инструментом на www.repoflow.com
Как я могу получить их все?
Как я могу проверить, есть ли изменения в слиянии?
Как я могу проверить, есть ли у кого-нибудь незафиксированные изменения?
Я работаю над этим, но это также решает вопросы OP и помогает управлять несколькими репозиториями в целом, вы можете использовать пользовательский интерфейс или базовый API-интерфейс GraphQL для создания своих собственных сценариев, пожалуйста, рассмотрите это как другой вариант.
Есть удобный инструмент для извлечения всех нескольких репозиториев.
git-pull-all
- инструмент командной строки для асинхронного выполнения в нескольких репозиториях git.
npm install -g git-pull-all
UsageПредположим, у вас есть эти файлы и каталоги:
~/Projects/
cool-examples/
.git/
funny-movies/
my-todos.txt
super-express/
.git/
Когда вы запускаете команду git-pull-all
в каталоге ~/Projects
, он должен найти дочерние git-репозитории (в приведенном выше примере cool-examples и super-express), а затем выполнить git pull
для каждого из них.
$ cd ~/Projects
$ git-pull-all
funny-movies/
Not a git repository
cool-examples/
Already up-to-date.
super-express/
Already up-to-date.
Done!
git-pull-all ~/Projects
Ссылка на GitHub: https://github.com/tatsuyaoiw/git-pull-all
Я использую код Visual Studio. У нас есть около 20 библиотек в нашей кодовой базе, которые являются отдельными репозиториями Git, и вкладка управления исходным кодом в Visual Studio Code довольно хороша для того, чтобы увидеть "на первый взгляд", насколько далеко позади или впереди локальные репозитории. Есть также настройки для периодической загрузки, чтобы поддерживать эту информацию в актуальном состоянии, а также кнопка обновления.
Это не так удобно, как сценарий, но когда дело доходит до управления исходным кодом для меня, мне нравится быть тем, кто вносит изменения. Требуется очень хорошо написанный сценарий, чтобы не перезаписывать изменения и т.д. С подходом VS Code вы быстро получаете большой объем информации, которую можете использовать самостоятельно.
Вот скриншот того, как это выглядит:
https://github.com/wwjamieson3/envisionTools имеет bash script, называемый gitstat, который делает это и многое другое. Совместимость с GNU и Mac. Он может выполнять выборки из пультов, если их спрашивают. В нем отображаются не проверенные, измененные, добавленные, удаленные и поэтапные файлы. Он отличается от пультов, демонстрируя невмешаемые коммиты на пульты дистанционного управления и неровные локальные коммиты. Он также может отображать цветовые коды в сводном или подробном режиме и даже в формате HTML. Он использует locate вместо find, потому что он бесконечно быстрее и даже предложит обновить вашу локальную базу данных, если она становится слишком старой.