Last active
August 29, 2015 14:26
-
-
Save tomgrv/1b564f9a0d877d537eac to your computer and use it in GitHub Desktop.
Convert project folders to git submodules
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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