Re: efficient way to filter several branches with common history?
On Jul 4, 2007, at 10:37 AM, Johannes Sixt wrote:
Show 25 quoted lines
> Steffen Prohaska wrote:
>>
>> Is there an efficient way to filter several branches at once
>> through git-filter-branch? Often several branches have a lot
>> of common history. Therefore, I suspect it would be much more
>> efficient to filter them with one call to git-filter-branch.
>> For example how can I efficiently filter all origin/* branches
>> to filtered/* branches?
>
> That feature is not yet implemented.
>
> In the meantime do it this way:
>
> Make an octopus merge of the branches onto a new branch. (If you have
> more than a dozen or so, you better make a hierarchy of
> octopusses.) You
> don't need to resolve conflicts (you are not interested in the merge
> result), or use -s ours to avoid them in the first place.
> Then filter that new branch.
> Then create new refs at the rewritten commits:
>
> $ git update-ref refs/filtered/b1 $id-of-rewritten-origin/b1
> $ ...
>
> Use gitk to find the $ids-of-rewritten-origin/*
Thanks for your explanation. The following is the template I used to build my fully automated version of what you proposed:
--- SNIP --- echo "merging branches to be filtered ..." git-checkout -b tmp/all origin/master
for b in origin/branchX origin/branchY [ ... more branches here ...]
do
git merge -s ours -m "merge-for-preparing-filter-branch $b" $b
doneecho "... filtering ..."
git-filter-branch \
[... your git-filter-branch filters here ...] \
filtered/all >filter-branch.log
echo "... setting heads of filtered branches."
lastp1=
git-log --pretty="format:%s %P" filtered/all |
while read t b p1 p2
do
[[ "$t" == "merge-for-preparing-filter-branch" ]] || { git
update-ref refs/heads/filtered/master $lastp1 ; break ; }
b=filtered/$(basename $b)
git update-ref refs/heads/$b $p2
lastp1=$p1
doneecho "delete tmp/all and filtered/all after checking the result" --- SNIP ---
Steffen