git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Re-done kernel archive - real one?

From
Linus Torvalds <torvalds@osdl.org>
Date
Apr 18, 2005, 15:23 UTC
Message-ID
<Pine.LNX.4.58.0504180802060.7211@ppc970.osdl.org>
In-Reply-To
<20050418102332.A21081@flint.arm.linux.org.uk>
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
Previous: Petr BaudisNext: Linus Torvalds
Message 36 of 60 in “Re-done kernel archive - real one?”
  1. Linus TorvaldsApr 16, 2005
  2. Russell KingApr 17, 2005
  3. Petr BaudisApr 17, 2005
  4. Linus TorvaldsApr 17, 2005
  5. Russell KingApr 17, 2005
  6. Linus TorvaldsApr 17, 2005
  7. Linus TorvaldsApr 17, 2005
  8. Russell KingApr 17, 2005
  9. Linus TorvaldsApr 17, 2005
  10. Russell KingApr 17, 2005
  11. Linus TorvaldsApr 17, 2005
  12. Russell KingApr 17, 2005
  13. Russell KingApr 18, 2005
  14. Petr BaudisApr 18, 2005
  15. Linus TorvaldsApr 18, 2005
  16. Petr BaudisApr 18, 2005
  17. Russell KingApr 17, 2005
  18. Linus TorvaldsApr 17, 2005
  19. David A. WheelerApr 17, 2005
  20. Petr BaudisApr 17, 2005
  21. Russell KingApr 17, 2005
  22. David A. WheelerApr 17, 2005
  23. Martin SchlemmerApr 18, 2005
  24. H. Peter AnvinApr 17, 2005
  25. Jochen RoemlingApr 17, 2005
  26. Randy.DunlapApr 17, 2005
  27. Petr BaudisApr 17, 2005
  28. David WoodhouseApr 17, 2005
  29. Linus TorvaldsApr 17, 2005
  30. Russell KingApr 17, 2005
  31. Russell KingApr 17, 2005
  32. Linus TorvaldsApr 17, 2005
  33. Russell KingApr 18, 2005
  34. Martin SchlemmerApr 18, 2005
  35. Petr BaudisApr 18, 2005
  36. Linus TorvaldsApr 18, 2005
  37. Linus TorvaldsApr 18, 2005
  38. Petr BaudisApr 18, 2005
  39. Russell KingApr 18, 2005
  40. Linus TorvaldsApr 18, 2005
  41. Petr BaudisApr 18, 2005
  42. Russell KingApr 18, 2005
  43. Petr BaudisApr 18, 2005
  44. Russell KingApr 19, 2005
  45. Linus TorvaldsApr 18, 2005
  46. Russell KingApr 18, 2005
  47. Linus TorvaldsApr 18, 2005
  48. Petr BaudisApr 18, 2005
  49. Greg KHApr 18, 2005
  50. Randy.DunlapApr 18, 2005
  51. Linus TorvaldsApr 18, 2005
  52. Greg KHApr 18, 2005
  53. Greg KHApr 18, 2005
  54. Linus TorvaldsApr 18, 2005
  55. Greg KHApr 18, 2005
  56. Linus TorvaldsApr 18, 2005
  57. H. Peter AnvinApr 17, 2005
  58. randy_dunlapApr 17, 2005
  59. David WoodhouseApr 17, 2005
  60. randy_dunlapApr 18, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.