Restore git submodules from .gitmodules

前端 未结 7 592
粉色の甜心
粉色の甜心 2020-12-02 04:47

I have a folder, which was a git repo. It contains some files and .gitmodules file. Now, when I do git init and then git submodule init, the latter

7条回答
  •  再見小時候
    2020-12-02 05:36

    Expanding on @Mark Longair's answer, I wrote a bash script to automate steps 2 & 3 of the following process:

    1. Clone a 'boilerplate' repo to begin a new project
    2. Remove the .git folder and re-initialize as a new repo
    3. Re-initialize the submodules, prompting for input before deleting folders

    #!/bin/bash
    
    set -e
    rm -rf .git
    git init
    
    git config -f .gitmodules --get-regexp '^submodule\..*\.path$' > tempfile
    
    while read -u 3 path_key path
    do
        url_key=$(echo $path_key | sed 's/\.path/.url/')
        url=$(git config -f .gitmodules --get "$url_key")
    
        read -p "Are you sure you want to delete $path and re-initialize as a new submodule? " yn
        case $yn in
            [Yy]* ) rm -rf $path; git submodule add $url $path; echo "$path has been initialized";;
            [Nn]* ) exit;;
            * ) echo "Please answer yes or no.";;
        esac
    
    done 3

    Note: the submodules will be checked out at the tip of their master branch instead of the same commit as the boilerplate repo, so you'll need to do that manually.

    Piping the output from git config into the read loop was causing problems with the prompt for input, so it outputs it to a temp file instead. Any improvements on my first bash script would be very welcome :)


    Big thanks to Mark, https://stackoverflow.com/a/226724/193494, bash: nested interactive read within a loop that's also using read, and tnettenba @ chat.freenode.net for helping me arrive at this solution!

提交回复
热议问题