使用Bash将.gitmodules转换为可解析的格式以进行迭代

时间:2018-12-22 15:25:30

标签: bash git git-submodules

背景

我想做一个外壳函数,它使用.gitmodules并根据每个子模块的属性(例如<PATH><URL>或{{1} }。

➡️<BRANCH>的默认格式:

.gitmodules

➡️伪代码:

[submodule "PATH"]
    path = <PATH>
    url = <URL>
[submodule "PATH"]
    path = <PATH>
    url = <URL>
    branch = <BRANCH>

⚠️当前def install_modules() { modules = new list fill each index of the modules list with each submodule & its properties iteratate over modules if module @ 'path' contains a specified 'branch': git submodule add -b 'branch' 'url' 'path' else: git submodule add 'url' 'path' }

install_modules()

2 个答案:

答案 0 :(得分:3)

.gitmodules是类似.gitconfig的文件,因此您可以使用git config来读取它。例如,从.gitmodules中读取所有值,将值除以=(key = value),然后将键除以.

git config -f .gitmodules -l | awk '{split($0, a, /=/); split(a[1], b, /\./); print b[1], b[2], b[3], a[2]}'

git config -f .gitmodules -l打印类似

submodule.native/inotify_simple.path=native/inotify_simple
submodule.native/inotify_simple.url=https://github.com/chrisjbillington/inotify_simple

awk的输出将是

submodule native/inotify_simple path native/inotify_simple
submodule native/inotify_simple url https://github.com/chrisjbillington/inotify_simple

答案 1 :(得分:2)

@phdRestore git submodules from .gitmodules@phd指向我)的帮助下,我得以构造所需的功能。

install_submodules()

⚠️注意假设$REPO_PATH已声明并初始化。

⚠️我的答案是对https://stackoverflow.com/a/53269641/5290011.

的改编
install_submodules() {
    git -C "${REPO_PATH}" config -f .gitmodules --get-regexp '^submodule\..*\.path$' |
        while read -r KEY MODULE_PATH
        do
            # If the module's path exists, remove it.
            # This is done b/c the module's path is currently 
            # not a valid git repo and adding the submodule will cause an error.
            [ -d "${MODULE_PATH}" ] && sudo rm -rf "${MODULE_PATH}"

            NAME="$(echo "${KEY}" | sed 's/\submodule\.\(.*\)\.path$/\1/')"

            url_key="$(echo "${KEY}" | sed 's/\.path$/.url/')"
            branch_key="$(echo "${KEY}" | sed 's/\.path$/.branch/')"

            URL="$(git config -f .gitmodules --get "${url_key}")"
            BRANCH="$(git config -f .gitmodules --get "${branch_key}" || echo "master")"

            git -C "${REPO_PATH}" submodule add --force -b "${BRANCH}" --name "${NAME}" "${URL}" "${MODULE_PATH}" || continue
        done

    git -C "${REPO_PATH}" submodule update --init --recursive
}