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
> 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
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.
# use "$1" or something in a real script, this
# just hard-codes it.
echo "Getting object database"
rsync -avz --ignore-existing $merge_repo/ .git/
echo "Getting remote head"
rsync -avz $merge_repo/HEAD .git/MERGE_HEAD
common=$(merge-base $head $merge_head)
if [ -z "$common" ]; then
echo "Unable to find common commit between" $merge_head $head
# 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!"
if [ "$common" == "$head" ]; then
echo "Updating from $head to $merge_head."
echo "Destroying all noncommitted data!"
echo "Kill me within 3 seconds.."
read-tree $merge_tree && checkout-cache -f -a
echo $merge_head > .git/HEAD
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..
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