Skip to content

Instantly share code, notes, and snippets.

@tomgrv
Last active August 29, 2015 14:26
Show Gist options
  • Save tomgrv/1b564f9a0d877d537eac to your computer and use it in GitHub Desktop.
Save tomgrv/1b564f9a0d877d537eac to your computer and use it in GitHub Desktop.
Convert project folders to git submodules
#!/bin/sh
# Convert project folders to git submodules
# Usage:
#
# folder2submodule.sh <main project folder> <remote repository name> <access token> <subfolder1> <subfolder12> ...
#
typeset var prj=$1 # Project folder
typeset var rmt=$2 # Origin remote repository
typeset var tok=$3 # Github access token for remote repository creation
shift 3
if [ ! -d "$prj" ]
then
echo "Repository folder does not exist"
exit 1
fi
if [ ! -s "$prj/.git" ]
then
echo "Folder is not under git"
exit 1
fi
for fld in $*
do
if [ ! -d "$prj/$fld" ]
then
echo "Folder '$prj/$fld' not found..."
continue
fi
if [ -s "$prj/$fld/.git" ]
then
echo "Folder '$prj/$fld' is already a submodule"
continue
fi
typeset var new=$(basename $fld)
typeset var tmp="tmp_$new"
echo "Cleanup"
rm -rf $tmp
echo "Clone new repositories into $tmp"
git clone --no-hardlinks "$prj" "$tmp"
echo "Filter out the files in $new"
cd "$tmp"
echo "Filter out the files in $new"
git filter-branch --subdirectory-filter "$fld" HEAD -- --all
git reset --hard
git gc --aggressive
git prune
echo "Init variables"
typeset var org=$(git remote -v | grep $rmt | sort -k1,1 -u)
typeset var pos=$(echo $org | tr '/' '\n' | wc -l)
typeset var usr=$(echo $org | cut -d'/' -f1-$(expr $pos - 1) | tr '/:' '\n' | tail -1)
typeset var rep=$(echo $org | cut -d'/' -f1-$(expr $pos - 1))/$new.git
if [ -n "$tok" ]
then
if curl https://api.github.com/user/repos?access_token=$tok -d "{\"name\":\"$new\"}"
then
echo "Remote repository created"
else
echo "Cannot create remote repository"
exit 3
fi
fi
echo "Change remote repository"
git remote rm $rmt
git remote add $rep
git branch master
git push -u $rmt master
cd -
echo "Add the new repository as submodules to the original repository"
cd "$prj"
git rm -r "$fld"
git commit -m "[Rmv] folder '$fld' (now in repository '$rep')"
git submodule add $rep $fld
git submodule init
git submodule update
git add .gitmodules
git commit -m "[Add] submodule '$fld' (from repository '$rep')"
git push
cd -
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment