On Mon, 18 Apr 2005, Russell King wrote:
> 
> Ok, I just tried pulling your tree into the tree you pulled from, and
> got this:

No, that can't work. The pesky tools are helpful, but they really don't do 
merges worth cr*p right now, excuse my french. 

The _real_ way to pull is to do the (horribly complex) thing I described
by the merge, but noticing that one of the commits you are merging is a
proper subset of the other one, and just updating the head instead of
actually doing a real merge (ie skipping the "read-tree -m" and
"write-tree" phases).

> This was with some random version of git-pasky-0.04.  Unfortunately,
> this version doesn't have the sha1 ID appended, so I couldn't say
> definitively that it's the latest and greatest.  It might be a day
> old.

I'm afraid that until Pasky's tools script this properly, a "pull" really 
ends up being something like this (which _can_ be scripted, never fear):

NOTE NOTE NOTE! This is untested! I'm writing this within the email 
editor, so do _not_ do this on a tree that you care about.

        #!/bin/sh
        #
        # use "$1" or something in a real script, this 
        # just hard-codes it.
        #
        
merge_repo=master.kernel.org:/pub/linux/kernel/people/torvalds/linux-2.6.git

        echo "Getting object database"
        rsync -avz --ignore-existing $merge_repo/ .git/

        echo "Getting remote head"
        rsync -avz $merge_repo/HEAD .git/MERGE_HEAD

        head=$(cat .git/HEAD)
        merge_head=$(cat .git/MERGE-HEAD)
        common=$(merge-base $head $merge_head)
        if [ -z "$common" ]; then
                echo "Unable to find common commit between" $merge_head $head
                exit 1
        fi

        # Get the trees associated with those commits
        common_tree=tree=$(cat-file commit $common | sed 's/tree //;q')
        head_tree=tree=$(cat-file commit $head | sed 's/tree //;q')
        merge_tree=tree=$(cat-file commit $merge | sed 's/tree //;q')

        if [ "$common" == "$merge_head" ]; then
                echo "Already up-to-date. Yeeah!"
                exit 0
        fi
        if [ "$common" == "$head" ]; then
                echo "Updating from $head to $merge_head."
                echo "Destroying all noncommitted data!"
                echo "Kill me within 3 seconds.."
                sleep 3
                read-tree $merge_tree && checkout-cache -f -a
                echo $merge_head > .git/HEAD
                exit 0
        fi
        echo "Trying to merge $merge_head into $head"
        read-tree -m $common_tree $head_tree $merge_tree
        result_tree=$(write-tree) || exit 1
        result_commit=$(echo "Merge $merge_repo" | commit-tree $result_tree -p 
$head -p $merge_head)
        echo "Committed merge $result_commit"
        echo $result_commit > .git/HEAD
        read-tree $result_tree && checkout-cache -f -a

The above looks like it might work, but I also warn you: it's not only
untested, but it's pretty fragile in that if something breaks, you are
probably left with a mess. I _tried_ to do the right thing, but... So it
obviously will need testing, tweaking and just general tender loving care.

And if the merge isn't clean, it will exit early thanks to the

        write-tree || exit 1

and now you have to resolve the merge yourself. There are tools to help
you do so automatically, but that's really a separate script.

You shouldn't hit the "merge" case at all right now, you should hit the 
"Updating from $head to $merge_head" thing.

If Pesky wants to take the above script, test it, and see if it works,
that would be good. It's definitely a much better "pull" than trying to
apply the patches forward..

                Linus
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to