3 # Copyright (c) 2005 Junio C Hamano
5 # Resolve two or more trees recorded in $GIT_DIR/FETCH_HEAD.
7 . git-sh-setup || 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-index
--refresh ||
23 die
"Your working tree is dirty."
24 test "$(git-diff-index --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 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"
48 if test "$common,$NON_FF_MERGE" = "$MRC,0"
50 # The first head being merged was a fast-forward.
51 # Advance MRC to the head being merged, and use that
52 # tree as the intermediate result of the merge.
53 # We still need to count this as part of the parent set.
55 echo "Fast forwarding to: $REPO"
56 git-read-tree
-u -m $head $SHA1 ||
exit
57 MRC
=$SHA1 MRT
=$
(git-write-tree
)
63 echo "Trying simple merge with $REPO"
64 git-read-tree
-u -m $common $MRT $SHA1 ||
exit
65 next
=$
(git-write-tree
2>/dev
/null
)
68 echo "Simple merge did not work, trying automatic merge."
69 git-merge-index
-o git-merge-one-file
-a ||
{
70 git-read-tree
--reset "$head"
71 git-checkout-index
-f -q -u -a
72 die
"Automatic merge failed; should not be doing Octopus"
74 next
=$
(git-write-tree
2>/dev
/null
)
78 done <"$GIT_DIR/FETCH_HEAD"
80 # Just to be careful in case the user feeds nonsense to us.
86 result_commit
=$
(git-fmt-merge-msg
<"$GIT_DIR/FETCH_HEAD" |
87 git-commit-tree
$MRT $PARENT)
88 echo "Committed merge $result_commit"
89 git-update-ref HEAD
$result_commit $head
90 git-diff-tree
-p $head $result_commit | git-apply
--stat