q quiet
prefix= the name of the subdir to split out
options for 'split'
+annotate= add a prefix to commit message of new commits
onto= try connecting new tree to an existing one
rejoin merge the new branch back into HEAD
ignore-joins ignore prior --rejoin commits
onto=
rejoin=
ignore_joins=
+annotate=
debug()
{
shift
case "$opt" in
-q) quiet=1 ;;
+ --annotate) annotate="$1"; shift ;;
+ --no-annotate) annotate= ;;
--prefix) prefix="$1"; shift ;;
--no-prefix) prefix= ;;
--onto) onto="$1"; shift ;;
GIT_COMMITTER_NAME \
GIT_COMMITTER_EMAIL \
GIT_COMMITTER_DATE
- (echo -n '*'; cat ) | # FIXME
+ (echo -n "$annotate"; cat ) |
git commit-tree "$2" $3 # reads the rest of stdin
) || die "Can't copy commit $1"
}
#!/bin/bash -x
+create()
+{
+ for d in 1 2 3 4 5 6 7 8 9 10; do
+ echo "$1"
+ done >"$1"
+}
+
. shellopts.sh
set -e
cd subproj
git init
-touch sub1
+create sub1
git add sub1
-git commit -m 'sub-1'
+git commit -m 'sub1'
git branch sub1
git branch -m master subproj
-touch sub2
+create sub2
git add sub2
-git commit -m 'sub-2'
+git commit -m 'sub2'
git branch sub2
-touch sub3
+create sub3
git add sub3
-git commit -m 'sub-3'
+git commit -m 'sub3'
git branch sub3
cd ../mainline
git init
-touch main1
-git add main1
-git commit -m 'main-1'
+create main4
+git add main4
+git commit -m 'main4'
git branch -m master mainline
git fetch ../subproj sub1
# this shouldn't actually do anything, since FETCH_HEAD is already a parent
git merge -m 'merge -s -ours' -s ours FETCH_HEAD
-touch subdir/main-sub3
-git add subdir/main-sub3
-git commit -m 'main-sub3'
+create subdir/main-sub5
+git add subdir/main-sub5
+git commit -m 'main-sub5'
-touch main-2
-git add main-2
-git commit -m 'main-2 boring'
+create main6
+git add main6
+git commit -m 'main6 boring'
-touch subdir/main-sub4
-git add subdir/main-sub4
-git commit -m 'main-sub4'
+create subdir/main-sub7
+git add subdir/main-sub7
+git commit -m 'main-sub7'
git fetch ../subproj sub2
git branch sub2 FETCH_HEAD
git subtree merge --prefix=subdir FETCH_HEAD
git branch pre-split
-split1=$(git subtree split --prefix subdir --onto FETCH_HEAD --rejoin)
+split1=$(git subtree split --annotate='*' --prefix subdir --onto FETCH_HEAD --rejoin)
echo "split1={$split1}"
git branch split1 "$split1"
-touch subdir/main-sub5
-git add subdir/main-sub5
-git commit -m 'main-sub5'
+create subdir/main-sub8
+git add subdir/main-sub8
+git commit -m 'main-sub8'
cd ../subproj
git fetch ../mainline split1
git branch split1 FETCH_HEAD
git merge FETCH_HEAD
-touch sub6
-git add sub6
-git commit -m 'sub6'
+create sub9
+git add sub9
+git commit -m 'sub9'
cd ../mainline
-split2=$(git subtree split --prefix subdir --rejoin)
+split2=$(git subtree split --annotate='*' --prefix subdir --rejoin)
git branch split2 "$split2"
-touch subdir/main-sub7
-git add subdir/main-sub7
-git commit -m 'main-sub7'
+create subdir/main-sub10
+git add subdir/main-sub10
+git commit -m 'main-sub10'
-split3=$(git subtree split --prefix subdir --rejoin)
+split3=$(git subtree split --annotate='*' --prefix subdir --rejoin)
git branch split3 "$split3"
cd ../subproj