Steffen Prohaska, Sun, Jun 24, 2007 11:05:29 +0200: > >Steffen Prohaska, Sat, Jun 23, 2007 21:27:57 +0200: > >>+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 > > > >Why not just read-tree for every commit? It is not like you're > >modifying the repository in any way, just changing parenthood. That'd > >solve the problem with deletions. > >So it should be enough to read-tree the repo state for each and every > >source commit into the index (and you can just use a temporary index > >file for that, see GIT_INDEX_FILE). Than just commit the index. > > I am changing the repository. > No, you don't. > I only modify the index for files that have changes in $commit. Their > content gets replaced by the content from the commit. I'm leaving > all other files untouched. No, you don't modify anything. Ever tried to run git-status after your script finished? Tried to understand what the output means? > This creates a new series of commits that starts from the repository > state of <onto> and has mixed in files only if they are changed in > the series of commits from..to. These files are just replaced. I'm not > trying to merge changes but just replace the whole file. > > Opposed to that, read-tree would modify the content of _all_ files. No, it wouldn't (unless you run git-read-tree -u, and I fail to see why would you want that). You probably confuse git-read-tree with git-checkout-index. > This is exactly what I want to achieve. The content of the files on > branch 3 is correct for all files that were committed after 2. But > because 2 is the wrong branching point all the content originating > from commits between 1 and 2 is wrong. Files committed between > 2 and 3 have the right content but the branch needs to be attached > at 1. This misses merges (see git-rev-list --parents), but does the job for linear history: export GIT_INDEX_FILE="$(git rev-parse --git-dir)/tr.idx" parent=$(git rev-parse "$onto") git rev-list --reverse "$from..$to" | while read c do rm -f "$GIT_INDEX_FILE" git read-tree $c || break; # Authorship information here parent=$(git cat-file commit $c | \ sed -e '1,/^$/d' | \ git commit-tree $(git write-tree) -p "$parent") echo "Commit $parent" done - 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