Управление многими хранилищами git - программирование
Подтвердить что ты не робот

Управление многими хранилищами git

Настройка проекта легко в git, поэтому я могу иметь отдельный репозиторий даже для небольшого script. Теперь проблема заключается в том, как управлять ими.

Я работаю в нескольких местах с этими репозиториями. Когда я внес изменения в какой-либо репозиторий, я хочу иметь возможность обновлять репозитории в других местах.

Итак, у меня есть каталог со многими репозиториями в нем.

  • Как я могу получить все из них?
  • Как проверить, не имеют ли какие-либо из них незафиксированные изменения?
  • Как проверить, есть ли у кого-либо из них изменения для слияния?

И было бы неплохо сделать это с помощью одной команды.

Выход должен быть достаточно тихим, чтобы действительно заметить, что делать.

4b9b3361

Ответ 1

Похоже, писать script для этого довольно просто. По существу, он должен перебирать репозитории, а затем использовать команды типа git ls-files, git diff и git log.

Ответ 2

Я очень рекомендую инструмент множественных репозиториев mr. Раньше я использовал пользовательскую оболочку script, как рекомендовано другими в течение некоторого времени, но использование mr имеет следующие преимущества для меня:

  • Он общий: может использоваться соединение различных систем управления версиями, а не только git (например, Mercurial, SVN и т.д.).
  • Это быстро: mr может выполнять несколько заданий параллельно. Я использую несколько репозиториев git/mercurial и синхронизирую их несколько раз в день. Г-н значительно ускоряет этот процесс.
  • Легко и быстро управлять списком проверок репозитория. Просто используйте "mr register" вместо изменения списка проектов в пользовательском script.

Относительно вашего вопроса о тихом выходе: Уровень детализации может быть изменен с помощью командной строки -q. Я предпочитаю вывод по умолчанию, который, как представляется, красиво объединяет вывод в краткой и четкой сводке.

Я использую следующий псевдоним для команды mr, чтобы гарантировать, что mr всегда выбирает мой список проектов по умолчанию, хранящийся в $HOME, и использует 5 параллельных потоков:

alias mr='mr -d ~/ -j 5 '

Ответ 3

Должен сказать, что я начал с принятого в настоящее время ответа (просто набор сценариев помощников, которые перебирают репозитории), но в целом мне не хватало опыта.

Итак, попробовав mr, repo и git-submodules, я обнаружил, что каждый из них отсутствует по-своему, и в итоге я сделал свой собственный вариант: http://fabioz.github.io/mu-repo, который является зрелым инструментом на данный момент - он имеет рабочие процессы, которые позволяют вам в:

  • клонировать несколько репо
  • Различать (и редактировать) текущие изменения в нескольких репозиториях
  • предварительный просмотр входящих изменений
  • запускать команды в нескольких репозиториях параллельно
  • создавать группы репо
  • запускать команды, не связанные с git, через несколько репозиториев
  • и т.д. (см. домашнюю страницу для получения дополнительной информации).

Обратите внимание, что он поддерживает любую ОС, где работает Python;)

Ответ 4

gr (git -run) extends mr (только для git). Мне проще организовать несколько репозиций git, используя свою систему тегов. Однако код для gr не поддерживается. Если вы используете bash, убедитесь, что вы используете его с формой -t tag вместо #tag.

Ответ 5

Вы можете попытаться использовать repo с пользовательским manifest.xml файлом, чтобы указать, где находятся ваши репозитории. некоторая документация о том, как это сделать.

В качестве альтернативы вы можете использовать git-submodule(1).

Ответ 6

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

Ответ 7

Я написал инструмент под названием " RepoZ ", который автоматически обнаруживает репозитории git, как только вы клонируете их или изменяете в них что-либо, например, переключение ветки.

Найденные репозитории "отслеживаются". Это просто покажет их в списке локальных репозиториев, включая обширную информацию о статусе, вдохновленную posh-git. Он содержит текущую ветку и другие вещи, такие как изменения файла и количество входящих или исходящих коммитов.

RepoZ UI

Это помогает отслеживать ваши локальные репозитории и незаконченную работу для фиксации или отправки. Кроме того, вы можете использовать список хранилищ в качестве навигации для переключения с одного хранилища на другое.

RepoZ Navigation

"Как я могу получить их всех?"

Версия для Windows предлагает контекстное меню для извлечения или извлечения хранилища. С помощью multi-select вы можете запускать действия в нескольких хранилищах одновременно.

Тем не менее, вы можете найти другую функцию очень полезной:

RepoZ Auto-Fetch

С помощью функции автоматической выборки вы можете указать RepoZ, что нужно периодически извлекать пульты всех ваших репозиториев git в фоновом режиме. Конечно, эти извлечения не будут конфликтовать с вашими локальными коммитами. Нет локальных попыток слияния, как с git pull.

Ответ 8

Я использую этот 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.

Ответ 9

Вы можете использовать камень 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

git status all

Ответ 10

Если кто-то все еще смотрит на эту тему, пожалуйста, проверьте мою оболочку 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'

Ответ 11

Я создал псевдоним и функцию для запуска любой команды 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]" \;
}

Надеюсь, поможет :)

Ответ 12

Вы должны проверить rgit на CPAN, который рекурсивно выполняет команды git во всех репозиториях в дереве каталогов.

Из документов:

Эта утилита рекурсивно ищет в корневого каталога (который может быть текущий рабочий каталог или - если он был установлен - каталог, предоставленный переменная среды GIT_DIR) для все репозитории git, сортировать этот список по пути хранилища, chdir в каждый из них, и выполняет указанная команда git.

Ответ 13

Я только что создал инструмент, который делает то, что вы хотите!

  • Как я могу получить все из них? gmaster fetch
  • Как я могу проверить, не имеют ли какие-либо из них незафиксированные изменения? gmaster status
  • Как я могу проверить, есть ли у кого-либо из них изменения для слияния? gmaster status

Он называется gitmaster: https://github.com/francoiscabrol/gitmaster

Ответ 14

Я написал эту простую функцию 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.

Ответ 15

Я написал инструмент командной строки под названием gita для управления несколькими репозиториями. Он показывает статус зарегистрированных репо рядом, например

enter image description here

Он также может делегировать команды/псевдонимы git из любого рабочего каталога.

Теперь, чтобы ответить на ваши вопросы с помощью этого инструмента:

Как я могу получить их все?

gita fetch

Как я могу проверить, есть ли у кого-нибудь незафиксированные изменения?

Команда gita ls показывает 3 возможных символа рядом с именем ветки, что указывает

  • +: постановочные изменения
  • *: не внесенные изменения
  • _: неотслеживаемые файлы/папки

Как я могу проверить, есть ли изменения в слиянии?

Названия веток раскрашены 5-ю способами

  • белый: локальный филиал не имеет удаленного ветки
  • зеленый: локальная ветвь такая же, как и удаленная
  • красный: местное отделение отошло от удаленного
  • фиолетовый: локальная ветвь впереди удаленной (хороша для push)
  • желтый: локальная ветвь находится за удаленной ветвью (подходит для слияния)

Чтобы установить его, просто запустите

pip3 install -U gita

Ответ 16

Отказ от ответственности: я работаю над этим инструментом на www.repoflow.com

Как я могу получить их все?
Как я могу проверить, есть ли изменения в слиянии?

  • Вы можете извлечь все задействованные репозитории (или нажать/вытащить/зафиксировать их), после выборки пользовательский интерфейс будет обновлен в соответствии с новым состоянием репозитория, если репозиторий разошелся, вы можете увидеть конфликты и начать их слияние.

enter image description here

Как я могу проверить, есть ли у кого-нибудь незафиксированные изменения?

  • В пользовательском интерфейсе вы можете видеть состояние файлов для каждого репозитория (вы можете добавлять/удалять их по отдельности или навалом).

enter image description here

Я работаю над этим, но это также решает вопросы OP и помогает управлять несколькими репозиториями в целом, вы можете использовать пользовательский интерфейс или базовый API-интерфейс GraphQL для создания своих собственных сценариев, пожалуйста, рассмотрите это как другой вариант.

Ответ 17

Есть удобный инструмент для извлечения всех нескольких репозиториев. git-pull-all - инструмент командной строки для асинхронного выполнения в нескольких репозиториях git.

Установка

npm install -g git-pull-all

Usage

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

Ответ 18

Я использую код Visual Studio. У нас есть около 20 библиотек в нашей кодовой базе, которые являются отдельными репозиториями Git, и вкладка управления исходным кодом в Visual Studio Code довольно хороша для того, чтобы увидеть "на первый взгляд", насколько далеко позади или впереди локальные репозитории. Есть также настройки для периодической загрузки, чтобы поддерживать эту информацию в актуальном состоянии, а также кнопка обновления.

Это не так удобно, как сценарий, но когда дело доходит до управления исходным кодом для меня, мне нравится быть тем, кто вносит изменения. Требуется очень хорошо написанный сценарий, чтобы не перезаписывать изменения и т.д. С подходом VS Code вы быстро получаете большой объем информации, которую можете использовать самостоятельно.

Вот скриншот того, как это выглядит:

Source control window in VS Code

Ответ 19

https://github.com/wwjamieson3/envisionTools имеет bash script, называемый gitstat, который делает это и многое другое. Совместимость с GNU и Mac. Он может выполнять выборки из пультов, если их спрашивают. В нем отображаются не проверенные, измененные, добавленные, удаленные и поэтапные файлы. Он отличается от пультов, демонстрируя невмешаемые коммиты на пульты дистанционного управления и неровные локальные коммиты. Он также может отображать цветовые коды в сводном или подробном режиме и даже в формате HTML. Он использует locate вместо find, потому что он бесконечно быстрее и даже предложит обновить вашу локальную базу данных, если она становится слишком старой.