[PATCH] transplant: move a series of commits to a different parent
From: Steffen Prohaska <hidden>
Date: 2016-06-15 22:43:17
Subsystem:
the rest · Maintainer:
Linus Torvalds
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 <redacted>
---
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