@@ -86,7 +86,7 @@ USAGE="[--setup <command>] [--env-filter <command>]
86
86
[--parent-filter <command>] [--msg-filter <command>]
87
87
[--commit-filter <command>] [--tag-name-filter <command>]
88
88
[--subdirectory-filter <directory>] [--original <namespace>]
89
- [-d <directory>] [-f | --force]
89
+ [-d <directory>] [-f | --force] [--state-branch <branch>]
90
90
[--] [<rev-list options>...]"
91
91
92
92
OPTIONS_SPEC=
@@ -106,6 +106,7 @@ filter_msg=cat
106
106
filter_commit=
107
107
filter_tag_name=
108
108
filter_subdir=
109
+ state_branch=
109
110
orig_namespace=refs/original/
110
111
force=
111
112
prune_empty=
181
182
--original)
182
183
orig_namespace=$( expr " $OPTARG /" : ' \(.*[^/]\)/*$' ) /
183
184
;;
185
+ --state-branch)
186
+ state_branch=" $OPTARG "
187
+ ;;
184
188
* )
185
189
usage
186
190
;;
@@ -259,6 +263,26 @@ export GIT_INDEX_FILE
259
263
# map old->new commit ids for rewriting parents
260
264
mkdir ../map || die " Could not create map/ directory"
261
265
266
+ if test -n " $state_branch "
267
+ then
268
+ state_commit=$( git rev-parse --no-flags --revs-only " $state_branch " )
269
+ if test -n " $state_commit "
270
+ then
271
+ echo " Populating map from $state_branch ($state_commit )" 1>&2
272
+ perl -e' open(MAP, "-|", "git show $ARGV[0]:filter.map") or die;
273
+ while (<MAP>) {
274
+ m/(.*):(.*)/ or die;
275
+ open F, ">../map/$1" or die;
276
+ print F "$2" or die;
277
+ close(F) or die;
278
+ }
279
+ close(MAP) or die;' " $state_commit " \
280
+ || die " Unable to load state from $state_branch :filter.map"
281
+ else
282
+ echo " Branch $state_branch does not exist. Will create" 1>&2
283
+ fi
284
+ fi
285
+
262
286
# we need "--" only if there are no path arguments in $@
263
287
nonrevs=$( git rev-parse --no-revs " $@ " ) || exit
264
288
if test -z " $nonrevs "
@@ -590,6 +614,29 @@ test -z "$ORIG_GIT_COMMITTER_DATE" || {
590
614
export GIT_COMMITTER_DATE
591
615
}
592
616
617
+ if test -n " $state_branch "
618
+ then
619
+ echo " Saving rewrite state to $state_branch " 1>&2
620
+ state_blob=$(
621
+ perl -e' opendir D, "../map" or die;
622
+ open H, "|-", "git hash-object -w --stdin" or die;
623
+ foreach (sort readdir(D)) {
624
+ next if m/^\.\.?$/;
625
+ open F, "<../map/$_" or die;
626
+ chomp($f = <F>);
627
+ print H "$_:$f\n" or die;
628
+ }
629
+ close(H) or die;' || die " Unable to save state" )
630
+ state_tree=$( /bin/echo -e " 100644 blob $state_blob \tfilter.map" | git mktree)
631
+ if test -n " $state_commit "
632
+ then
633
+ state_commit=$( /bin/echo " Sync" | git commit-tree " $state_tree " -p " $state_commit " )
634
+ else
635
+ state_commit=$( /bin/echo " Sync" | git commit-tree " $state_tree " )
636
+ fi
637
+ git update-ref " $state_branch " " $state_commit "
638
+ fi
639
+
593
640
cd " $orig_dir "
594
641
rm -rf " $tempdir "
595
642
0 commit comments