5

我有一个大目录~/.vim,其中有一个子目录,其中包含许多其他 git 存储库。我想为我的~/.vim目录创建一个 git repo,但不想遍历我的其他每个 git 子目录。

有没有办法递归地添加所有子模块?

4

4 回答 4

13

假设.vim 已经是一个有效的 git 存储库,并且您想将所有 git 存储库添加到您的主 git 存储库,那么下面的 for 循环可能就是您需要的:

首先,cd您的git 存储库的根目录。

可粘贴预览命令 - 仅回显,不会进行任何更改:

for x in $(find . -type d) ; do if [ -d "${x}/.git" ] ; then cd "${x}" ; origin="$(git config --get remote.origin.url)" ; cd - 1>/dev/null; echo git submodule add "${origin}" "${x}" ; fi ; done

可粘贴命令以添加子模块:

for x in $(find . -type d) ; do if [ -d "${x}/.git" ] ; then cd "${x}" ; origin="$(git config --get remote.origin.url)" ; cd - 1>/dev/null; git submodule add "${origin}" "${x}" ; fi ; done

此循环首先仅查找目录,查找 .git 目录,识别原始 URL,然后添加子模块。

可读版本:

for x in $(find . -type d) ; do
    if [ -d "${x}/.git" ] ; then
        cd "${x}"
        origin="$(git config --get remote.origin.url)"
        cd - 1>/dev/null
        git submodule add "${origin}" "${x}"
    fi
done
于 2012-05-15T19:07:13.430 回答
1
cd /to/super/repo
root_path=$(pwd)
for submodule in $(find -mindepth 2 -type d -name .git); do
    submodule_dir=$root_path/$submodule/..
    remote_name=$(cd $submodule_dir && git rev-parse --abbrev-ref --symbolic-full-name @{u}|cut -d'/' -f1 )
    remote_uri=$(cd $submodule_dir && git remote get-url $remote_name)

    echo "Adding $submodule with remote $remote_name..."

    # If already added to index, but not to .gitmodules...
    git rm --cached $submodule_dir &> /dev/null

    git submodule add $remote_uri $submodule_dir
done
于 2017-12-14T23:56:49.443 回答
0

可悲的是,这个功能似乎不存在。git 应该有一个命令可以添加 .gitmodules 中引用的所有模块,例如:

### wishful thinking

git submodules init --all
git submodules add --all

:(

于 2021-10-05T23:50:09.257 回答
0

我将 git repos 嵌套在更深的子目录中,因此要从任何深度级别查找和添加它们,我必须使用: for i in $(find ~/Sources/* -type d -name .git) do cd $i && cd .. && git submodule add $(pwd) done

于 2016-03-25T23:55:15.213 回答