如何使用repo工具来镜像由几个git存储库组成的项目

时间:2019-06-13 14:38:01

标签: git repository repo

我想创建一个由多个.git存储库组成的项目的分支,将它们全部推送到不同的(本地)存储库,但为每个单独的git存储库保持完全相同的分支和标签集。

最初使用“仓库”工具下载该项目。有一个manifest.xml文件描述每个单个.git存储库的位置,并通过repo init下载,然后repo sync克隆所有git repos。

在此示例中,我将使用bitbucket.com,但不要将注意力集中在bitbucket上,只是一个示例。

这是我现在正在执行的步骤:

  1. 在bitbucket中创建一个空的manifest.git存储库。然后:

    cd existing-manifest.git
    git remote set-url origin ssh://git@bitbucket.com/project/manifest.git
    git push -u origin --all
    git push origin --tags
    
  2. 在bitbucket中手动创建一组git repos。然后:

    #! /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://git@bitbucket.com/project/${REPO_PROJECT}.git
        git push -u origin --all
        git push origin --tags
        popd
    done
    

然后,手动编辑manifest.xml以更改每个项目的默认远程,然后在我的自定义存储库中提交新的manifest.xml。

这是一个非常手工的过程,不是很友好。所以我的问题是:

  1. 可以以某种方式改进此过程吗?
  2. 是否可以仅使用“回购”工具?

1 个答案:

答案 0 :(得分:1)

第二步可以改善。 repo forall就足够了,您不需要用for包裹它。

repo forall -p -c 'git remote add origin ssh://git@bitbucket.com/project/${REPO_PROJECT}.git \
                   && git push -u origin --all --tags'

manifest.xml可以具有这些标签和属性,

<remote fetch="ssh://git@bitbucket.com/project" name="origin" />
<default remote="origin" revision="foo" />
<project name=bar path=bar />

定义了默认的远程origin,因此您无需为每个项目都指定远程,除非其中一个或多个托管在其他位置。对于项目bar,对于抓取和推送,其默认远程都将是origin ssh://git@bitbucket.com/project/bar