如何从现有目录结构生成git superproject

时间:2013-12-18 18:04:10

标签: git git-submodules

我目前在一个巨大的目录树中设置了很多git项目。结构看起来像这样

projects
projects/stuff -> this is a git repo
projects/frontend/frontendone -> this is also a git repo
projects/frontend/frontendtwo -> this is also a git repo
projects/something -> this is a git repo
...

这整棵树包含很多git repos(比如50-100),它们可以在树内的任何地方,它们可以来自不同的服务器,具有不同的配置。

我想在projects目录中创建一个新的超级项目,其中包含所有存储库作为子模块。

我在git子模块上找到的大多数示例都是从那里没有git存储库开始的,然后用git submodule add逐个重新添加它们,但我已经很好地设置了我的目录结构,并且一个接一个地重新做所有这些似乎都是太费劲了。

所以基本上我只希望projects目录成为一个超级项目并保持其他所有内容完好无损,因为它们已经很好地为我设置了。

创建超级项目的最简单方法是什么?

1 个答案:

答案 0 :(得分:1)

我需要相同的答案,所以我为Bash编写了一个脚本。如果您在不同的平台上,希望这可以说明您需要做什么。干杯!

#!/bin/bash
# add all the git folders below current folder as git submodules.
# NOTE: does not recursively nest submodules, but falls back to
# git submodule add's behavior of failing those.
# Workaround is to run this script in each affected directory
# from the bottom up.
# For example:
# a/.git
# b/.git
# b/b1/.git
# b/b2/.git
# c/.git
#
# run this script twice - first in b (adds b1 & b2 as submodules to b),
# then in root (adds a, b, c to root)
#

# if any options specified, treat as a test run and display only
if [ -z $1 ]; then
    GITSMADD="git submodule add -f"
    if [ ! -d ./.git ]; then
        git init
    fi
else
    GITSMADD="echo git submodule add -f"
    echo running in DISPLAY mode
fi

find . -name '.git' -type d -exec dirname {} \; | sort | while read LINE
do
    if [ "$LINE" != "." ]; then
        pushd $LINE > /dev/null
        ORIGIN=$(git remote -v | grep fetch | head -1 | awk '{print $1}')
        URL=$(git remote -v | grep fetch  | head -1 | awk '{print $2}')
        popd > /dev/null
        if [ -z $ORIGIN ]; then
            echo "Adding local folder $LINE as submodule."
            $GITSMADD "$LINE"
        else
            echo "Adding remote $URL as submodule in folder $LINE"
            $GITSMADD "$URL" "$LINE"
        fi

    fi
done