3 # Copyright (c) 2005 Junio C Hamano
5 # Resolve two or more trees recorded in $GIT_DIR/FETCH_HEAD.
7 . git-sh-setup-script || die
"Not a git archive"
10 die
"usage: git octopus"
13 # Sanity check the heads early.
16 test $
(git-cat-file
-t $SHA1) = "commit" ||
17 die
"$REPO given to octopus is not a commit"
18 done <"$GIT_DIR/FETCH_HEAD"
20 head=$
(git-rev-parse
--verify HEAD
) ||
exit
22 git-update-cache
--refresh ||
23 die
"Your working tree is dirty."
24 test "$(git-diff-cache --cached "$head")" = "" ||
25 die
"Your working tree does not match HEAD."
27 # MRC is the current "merge reference commit"
28 # MRT is the current "merge result tree"
30 MRC
=$head MSG
= PARENT
="-p $head"
32 CNT
=1 ;# counting our head
36 common
=$
(git-merge-base
$MRC $SHA1) ||
37 die
"Unable to find common commit with $SHA1 from $REPO"
39 if test "$common" = $SHA1
41 echo "Already up-to-date: $REPO"
46 PARENT
="$PARENT -p $SHA1"
50 if test "$common,$NON_FF_MERGE" = "$MRC,0"
52 # The first head being merged was a fast-forward.
53 # Advance MRC to the head being merged, and use that
54 # tree as the intermediate result of the merge.
55 # We still need to count this as part of the parent set.
57 echo "Fast forwarding to: $REPO"
58 git-read-tree
-u -m $head $SHA1 ||
exit
59 MRC
=$SHA1 MRT
=$
(git-write-tree
)
65 echo "Trying simple merge with $REPO"
66 git-read-tree
-u -m $common $MRT $SHA1 ||
exit
67 next
=$
(git-write-tree
2>/dev
/null
)
70 echo "Simple merge did not work, trying automatic merge."
71 git-merge-cache
-o git-merge-one-file-script
-a ||
{
72 git-read-tree
--reset "$head"
73 git-checkout-cache
-f -q -u -a
74 die
"Automatic merge failed; should not be doing Octopus"
76 next
=$
(git-write-tree
2>/dev
/null
)
80 done <"$GIT_DIR/FETCH_HEAD"
82 # Just to be careful in case the user feeds nonsense to us.
88 echo "Not an Octopus; making an ordinary commit."
89 MSG
="Merge "`expr "$MSG" : '. \(.*\)'` ; # remove LF and TAB
92 # In an octopus, the original head is just one of the equals,
93 # so we should list it as such.
94 HEAD_LINK
=`readlink "$GIT_DIR/HEAD"`
95 MSG
="Octopus merge of the following:
97 $HEAD_LINK from .$MSG"
100 result_commit
=$
(echo "$MSG" | git-commit-tree
$MRT $PARENT)
101 echo "Committed merge $result_commit"
102 echo $result_commit >"$GIT_DIR"/HEAD
103 git-diff-tree
-p $head $result_commit | git-apply
--stat