我目前在一个巨大的目录树中设置了很多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
目录成为一个超级项目并保持其他所有内容完好无损,因为它们已经很好地为我设置了。
创建超级项目的最简单方法是什么?
答案 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