Настроить проект в git легко, поэтому у меня может быть отдельный репозиторий даже для небольшого скрипта. Теперь проблема в том, как ими управлять.
Я работаю с этими репозиториями в нескольких местах. Когда я внес изменения в какой-то репозиторий, я хочу иметь возможность обновлять репозитории в других местах.
Итак, у меня есть каталог с множеством репозиториев.
- Как я могу получить их все?
- Как я могу проверить, есть ли в каких-либо из них незафиксированные изменения?
- Как я могу проверить, есть ли какие-либо изменения для объединения?
И было бы неплохо иметь возможность делать это одной командой.
Вывод должен быть достаточно тихим, чтобы действительно замечать, что нужно сделать.
hg mercurial
.Ответы:
Я настоятельно рекомендую инструмент для работы с несколькими репозиториями mr . Некоторое время я использовал собственный сценарий оболочки, как рекомендовали другие, но использование mr имеет для меня следующие преимущества:
Что касается вашего вопроса о выводе без вывода сообщений: уровень детализации можно изменить с помощью переключателя командной строки -q. Я предпочитаю вывод по умолчанию, который, кажется, красиво объединяет вывод в кратком и ясном резюме.
Я использую следующий псевдоним для команды mr, чтобы mr всегда выбирал мой список проектов по умолчанию, хранящийся в $ HOME, и использовал 5 параллельных потоков:
источник
alias pa='find . -name .git -print -execdir git pull \;'
тогдаpa
достаточноЯ должен сказать, что начал с принятого в настоящее время ответа (просто набор сценариев помощников, которые перебирают репозитории), но в целом мне не хватало опыта.
Итак, попробовав mr, repo и git-submodules, я обнаружил, что каждому из них не хватает по-разному, поэтому в итоге я выбрал свой вариант: http://fabioz.github.io/mu-repo, который является зрелым инструментом на этот момент - у него есть рабочие процессы, которые позволяют:
Обратите внимание, что он поддерживает любую ОС, в которой работает Python;)
источник
mu sh <some command>
выполнить некоторую произвольную команду в нескольких репозиториях, вся ее окончательность связана с git, а не с другими системами контроля версий .. Если вам это нужно, то да, используйте другой инструмент.gr (git-run) расширяет функциональность mr (только для
git
). Мне проще организовать несколько репозиториев git, используя его систему тегов. Однако код дляgr
не поддерживается. Если вы используете bash, убедитесь, что вы используете его сформой-t tag
вместо#tag
формы.источник
Вы можете попробовать использовать репо с настраиваемым
manifest.xml
файлом, чтобы указать, где находятся ваши репозитории. Есть некоторая документация о том, как это сделать.В качестве альтернативы вы можете использовать
git-submodule(1
) .источник
Я написал инструмент под названием « RepoZ », который автоматически обнаруживает репозитории git, как только вы их клонируете или меняете что-либо в них, например, переключение ветки.
После обнаружения репозитории «отслеживаются». Это просто покажет их в списке локальных репозиториев, включая плотную информацию о статусе, вдохновленную posh-git . Он содержит текущую ветку и другие вещи, такие как редактирование файлов и количество входящих или исходящих коммитов.
Это помогает отслеживать ваши локальные репозитории и незавершенную работу для фиксации или отправки. Кроме того, вы можете использовать список репозиториев в качестве навигации для перехода от одного репозитория к другому.
"Как я могу получить их все?"
Версия для Windows предлагает контекстное меню для извлечения или извлечения репозитория. С помощью множественного выбора вы можете запускать действия в нескольких репозиториях одновременно.
Однако вы можете найти еще одну очень полезную функцию:
С помощью Auto fetch вы можете указать RepoZ периодически извлекать пульты всех ваших репозиториев git в фоновом режиме. Конечно, эти выборки не будут конфликтовать с вашими локальными коммитами. Попыток локального слияния вроде с
git pull
.источник
gitslave - это инструмент, который может запускать одну и ту же команду во многих репозиториях, создавая отношения суперпроект / подпроект между суперпроектом и подпроектом. Это (по умолчанию) обеспечивает суммирование вывода, поэтому вы можете сосредоточиться на репозиториях, которые предоставляют уникальный вывод (полезно для git status, не так полезно для git ls-файлов).
Обычно это используется для проектов, где вам нужно собрать несколько репозиториев вместе и держать их в одной ветке или теге одновременно или что-то еще. Для моего каталога (голых) репозиториев у меня есть небольшой make-файл, который позволяет мне запускать произвольные команды git, которые, как вы видите, я в основном использую для fsck и gc:
источник
Я создал псевдоним и функцию для запуска любой команды git во всех репозиториях, доступных в каталоге (рекурсивно). Вы можете найти его здесь: https://github.com/jaguililla/dotfiles/git
Это код:
Надеюсь, поможет :)
источник
.bash_aliases
:alias rgit='function _rgit(){ find . -type d -name .git -printf "\n%p\n" -execdir git "$@" \;; }; _rgit'
. Источник, затем, например, вызовrgit status
.Для этого можно использовать
git-status-all
гем: https://github.com/reednj/git-status-allСуществует также опция выборки, которая будет извлекать из источника для всех репозиториев перед отображением статуса:
источник
find . -name .git -print -execdir git status \;
в порядкеЯ использую этот скрипт, чтобы легко выполнять команды git во всех моих репозиториях.
По умолчанию сценарий будет искать репозитории git в ~ / cm / src, но вы можете переопределить это, установив переменную среды GITREPO по своему вкусу.
Этот сценарий основан на этом сценарии .
источник
find . -name .git -print -execdir git pull \;
делает то, что вы думаете.Я написал инструмент командной строки под названием gita для управления несколькими репозиториями. Он показывает статус зарегистрированных репозиториев рядом, например
Он также может делегировать команды / псевдонимы git из любого рабочего каталога.
Теперь, чтобы ответить на ваши вопросы с помощью этого инструмента:
Команда
gita ls
показывает 3 возможных символа рядом с названием ветки, что указывает на+
: поэтапные изменения*
: неустановленные изменения_
: неотслеживаемые файлы / папкиНазвания веток раскрашены 5 способами
Чтобы установить его, просто запустите
источник
Если кто-то все еще просматривает эту ветку, пожалуйста, проверьте мой сценарий оболочки под названием gitme
вам нужно будет вручную ввести свои локальные репозитории git, но я использую этот инструмент каждый день для совместной работы над несколькими проектами git на нескольких компьютерах.
Вы можете запустить
git clone https://github.com/robbenz/gitme.git
также сценарий размещен ниже
Я устанавливаю псевдоним в моем ~ / .bash_profile, поэтому
alias gitme='sh /path/to/gitme.sh'
источник
Вы должны проверить rgit на CPAN, который рекурсивно выполняет команды git во всех репозиториях в дереве каталогов.
Из документов:
источник
Я только что создал инструмент, который делает то, что вы хотите!
gmaster fetch
gmaster status
gmaster status
Он называется gitmaster: https://github.com/francoiscabrol/gitmaster
источник
Я написал эту простую функцию bash в свой .bash_profile, чтобы иметь возможность запускать git, maven, gradle или любую другую команду bash только во всех репозиториях git:
Это можно использовать таким образом
источник
Отказ от ответственности: я работаю над этим инструментом на www.repoflow.com
Я работаю над этим, но это также решает вопросы OP и помогает управлять несколькими репозиториями в целом. Вы можете использовать пользовательский интерфейс или базовый GraphQL API для создания собственных скриптов, рассмотрите это как еще один вариант.
источник
Есть удобный инструмент для получения всех нескольких репозиториев.
git-pull-all
- это инструмент командной строки для асинхронного выполнения в нескольких репозиториях git.Установка
Применение
Предположим, у вас есть эти файлы и каталоги:
Когда вы запускаете
git-pull-all
команду в~/Projects
каталоге, она должна найти дочерние репозитории git (в приведенном выше случае - cool-examples и super-express ), а затем выполнитьgit pull
для каждого из них.Ссылка на GitHub: https://github.com/tatsuyaoiw/git-pull-all
источник
Я использую код Visual Studio. У нас есть около 20 библиотек в нашей кодовой базе, которые являются отдельными репозиториями Git, а вкладка управления версиями в Visual Studio Code довольно хороша для того, чтобы увидеть «с первого взгляда», насколько далеко отстают или опережают локальные репозитории. Есть также настройки, которые нужно периодически получать, чтобы поддерживать эту информацию в актуальном состоянии, а также кнопка обновления.
Это не так удобно, как сценарий, но когда дело касается контроля версий, мне нравится вносить изменения. Требуется очень хорошо написанный сценарий, чтобы не перезаписывать изменения и т. Д. Используя подход VS Code, вы быстро получаете большой объем информации, которую вы можете предпринять самостоятельно.
Вот скриншот того, как это выглядит:
источник
Я нашел отличное решение для извлечения из текущей ветки из всех подкаталогов, в которых есть папка .git, даже если в каждом репо есть другая ветка. Эта команда однострочная, достаточно гибкая, чтобы изменять ее для различных команд git, и может иметь псевдоним.
Просто скопируйте и вставьте следующее:
Разбивая это:
Найдите все каталоги (-type d) в текущем каталоге (find.), Которые имеют имя ".git" (-name .git), просматривая максимум два каталога в глубину (2, а не 1, потому что мы ищем git в папке репозитория git).
Выполните следующую команду оболочки (exec sh -c)
Измените каталог на первый аргумент (cd $ 0), затем смените каталог на один уровень выше, чтобы оставить папку .git (cd ..), затем выполните git pull origin, указав ветку, запустив git rev-parse ... для текущей ветки HEAD фиксация.
"{}" - это относительный путь результата, который мы получаем от начальной команды поиска . The; используется для завершения команды.
Проверено на MacOS 10.14.6 на zsh. Как есть, работает только тогда, когда удаленная и локальная ветки названы одинаково, AFAIK.
Вы можете изменить это, чтобы получить статус. Я надеюсь, что вы сможете добавить аргументы, чтобы сделать это более гибким, но я еще не пробовал.
источник
Я использую функцию выбора нескольких курсоров / многострочного редактирования моего редактора кода (код VS), чтобы создать пакетный сценарий / сценарий оболочки и выполнить его за один раз. С помощью этого простого глупого решения я знаю, что делаю и чего могу ожидать от выполнения этих команд. Никаких догадок, никакого обучения, никакой настройки. Другая причина заключается в том, что каждый раз я хочу выполнять команды в разных наборах репозиториев, которые находятся в общем родительском каталоге.
источник
https://github.com/wwjamieson3/envisionTools имеет сценарий bash под названием gitstat, который делает это и многое другое. Он совместим с GNU и Mac. Он может выполнять выборку с пультов по запросу. Он показывает неотслеживаемые, измененные, добавленные, удаленные и поставленные файлы. Он отличается от пультов ДУ тем, что показывает несоединенные коммиты на пультах и локальные коммиты без отправки. Он также может отображать результаты с цветовой кодировкой в сводном или подробном режиме и даже в HTML. Он использует locate вместо find, потому что он бесконечно быстрее и даже предложит обновить вашу базу данных locate, если она станет слишком старой.
источник
Похоже, написать сценарий довольно просто. По сути, ему нужно перебирать репозитории, а затем использовать такие команды, как git ls-files, git diff и git log.
источник