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

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

Этот проект изначально загружается с помощью инструмента «репо». Существует файл manifest.xml, описывающий расположение каждого отдельного репозитория .git, загруженный с помощью репозитория init, а затем синхронизация репо клонирует все репозитории git.

В этом примере я буду использовать bitbucket.com, но не заостряйте внимание на битбакете, это всего лишь пример.

Вот шаги, которые я делаю прямо сейчас:

  1. Создайте пустой репозиторий manifest.git в битбакете. Потом:

    cd existing-manifest.git
    git remote set-url origin ssh://[email protected]/project/manifest.git
    git push -u origin --all
    git push origin --tags
    
  2. Создайте набор репозиториев git вручную внутри bitbucket. Потом:

    #! /bin/sh
    for LINE in $(repo forall -c 'echo ${REPO_PROJECT}":"${REPO_PATH}')
    do
        REPO_PROJECT=$(echo $LINE | cut -f 1 -d ":")
        REPO_PATH=$(echo $LINE | cut -f 2 -d ":")
        pushd $REPO_PATH
        git remote add origin ssh://[email protected]/project/${REPO_PROJECT}.git
        git push -u origin --all
        git push origin --tags
        popd
    done
    

После этого отредактируйте файл manifest.xml вручную, чтобы изменить удаленный объект по умолчанию для каждого проекта, и зафиксируйте новый файл manifest.xml в моем пользовательском репозитории.

Это очень ручной процесс, не очень дружелюбный. Итак, мои вопросы:

  1. Можно ли как-то улучшить этот процесс?
  2. Возможно ли просто использовать инструмент «репо»?

770
1

Ответ:

Решено

2-й шаг можно улучшить. repo forall достаточно и не нужно оборачивать for.

repo forall -p -c 'git remote add origin ssh://[email protected]/project/${REPO_PROJECT}.git \
                   && git push -u origin --all --tags'

В файле manifest.xml могут быть следующие теги и атрибуты:

<remote fetch = "ssh://[email protected]/project" name = "origin" />
<default remote = "origin" revision = "foo" />
<project name=bar path=bar />

которые определяют пульт по умолчанию origin, поэтому вам не нужно указывать пульт для каждого проекта, если только один или несколько из них не размещены в других местах. Для проекта bar его удаленным по умолчанию будет origin ssh://[email protected]/project/bar как для извлечения, так и для отправки.