我想创建一个由多个.git存储库组成的项目的分支,将它们全部推送到不同的(本地)存储库,但为每个单独的git存储库保持完全相同的分支和标签集。
最初使用“仓库”工具下载该项目。有一个manifest.xml文件描述每个单个.git存储库的位置,并通过repo init下载,然后repo sync克隆所有git repos。
在此示例中,我将使用bitbucket.com,但不要将注意力集中在bitbucket上,只是一个示例。
这是我现在正在执行的步骤:
在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
在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。
这是一个非常手工的过程,不是很友好。所以我的问题是:
答案 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
。