git-transplant.sh <onto> <from> <to> transplant starts with the contents of <onto> and puts on top of it the contents of files if they are touched by the series of commits <from>..<to>. If a commit touches a file the content of this file is taken as it is in the commit. No merging is performed. Original authors, commiters, and commit messages are preserved. Warning: this is just a quick hack to solve _my_ problem. - No error checking is performed. - Removal of files is not handled. - Whitespace in filename is not handled. - The index is left in dirty state. - No branch is created for the result. - The script is not integrated with git's shell utilities. Signed-off-by: Steffen Prohaska <prohaska@xxxxxx> --- git-transplant.sh | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 60 insertions(+), 0 deletions(-) create mode 100755 git-transplant.sh This script seems to solved the problem for me. I can place the topic branch imported from cvs to the right place. What do you think? Is this a sane way to handle the situation? Steffen diff --git a/git-transplant.sh b/git-transplant.sh new file mode 100755 index 0000000..3320071 --- /dev/null +++ b/git-transplant.sh @@ -0,0 +1,60 @@ +#!/bin/sh + +[[ $# == 3 ]] || { echo "$0 <onto> <from> <to>"; exit 1; } +onto=$(git-rev-parse $1) +from=$(git-rev-parse $2) +to=$(git-rev-parse $3) + +# copied from git-filter-branch.sh +set_ident () { + lid="$(echo "$1" | tr "A-Z" "a-z")" + uid="$(echo "$1" | tr "a-z" "A-Z")" + pick_id_script=' + /^'$lid' /{ + s/'\''/'\''\\'\'\''/g + h + s/^'$lid' \([^<]*\) <[^>]*> .*$/\1/ + s/'\''/'\''\'\'\''/g + s/.*/export GIT_'$uid'_NAME='\''&'\''/p + + g + s/^'$lid' [^<]* <\([^>]*\)> .*$/\1/ + s/'\''/'\''\'\'\''/g + s/.*/export GIT_'$uid'_EMAIL='\''&'\''/p + + g + s/^'$lid' [^<]* <[^>]*> \(.*\)$/\1/ + s/'\''/'\''\'\'\''/g + s/.*/export GIT_'$uid'_DATE='\''&'\''/p + + q + } + ' + + LANG=C LC_ALL=C sed -ne "$pick_id_script" + # Ensure non-empty id name. + echo "[ -n \"\$GIT_${uid}_NAME\" ] || export GIT_${uid}_NAME=\"\${GIT_${uid}_EMAIL%%@*}\"" +} + +parent=$onto +git-read-tree --reset $parent + +for commit in $(git-rev-list --reverse $from..$to) +do + echo "rewriting commit $commit..." + git-diff-tree -r $commit | grep ^: | cut -b 9-15,57-97,100- | + while read mode sha path + do + echo " $mode $sha $path" + git-update-index --add --cacheinfo $mode $sha $path + done + + eval "$(git-cat-file commit $commit |set_ident AUTHOR)" + eval "$(git-cat-file commit $commit |set_ident COMMITTER)" + + parent=$(git-cat-file commit $commit | sed -e '1,/^$/d' | git-commit-tree $(git-write-tree) -p $parent) + echo "... new commit $parent" +done + +echo "" +echo "new head is $parent" -- 1.5.2.2.315.gc649a - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html