remote_name_="$3"
remote_nick_="$4"
local_name_="$5"
+ case "$6" in
+ t) not_for_merge_='not-for-merge' ;;
+ '') not_for_merge_= ;;
+ esac
# remote-nick is the URL given on the command line (or a shorthand)
# remote-name is the $GIT_DIR relative refs/ path we computed
if git-cat-file commit "$head_" >/dev/null 2>&1
then
headc_=$(git-rev-parse --verify "$head_^0") || exit
- echo "$headc_ $note_" >>$GIT_DIR/FETCH_HEAD
+ echo "$headc_ $not_for_merge_ $note_" >>$GIT_DIR/FETCH_HEAD
echo >&2 "* committish: $head_"
echo >&2 " $note_"
else
+ echo "$head_ not-for-merge $note_" >>$GIT_DIR/FETCH_HEAD
echo >&2 "* non-commit: $head_"
echo >&2 " $note_"
fi
# These are relative path from $GIT_DIR, typically starting at refs/
# but may be HEAD
+ if expr "$ref" : '\.' >/dev/null
+ then
+ not_for_merge=t
+ ref=$(expr "$ref" : '\.\(.*\)')
+ else
+ not_for_merge=
+ fi
if expr "$ref" : '\+' >/dev/null
then
single_force=t
continue ;;
esac
- append_fetch_head "$head" "$remote" "$remote_name" "$remote_nick" "$local_name"
+ append_fetch_head "$head" "$remote" \
+ "$remote_name" "$remote_nick" "$local_name" "$not_for_merge"
done
case "$ref" in
+$remote_name:*)
single_force=t
+ not_for_merge=
+ found="$ref"
+ break ;;
+ .+$remote_name:*)
+ single_force=t
+ not_for_merge=t
+ found="$ref"
+ break ;;
+ .$remote_name:*)
+ not_for_merge=t
found="$ref"
break ;;
$remote_name:*)
+ not_for_merge=
found="$ref"
break ;;
esac
done
-
local_name=$(expr "$found" : '[^:]*:\(.*\)')
- append_fetch_head "$sha1" "$remote" "$remote_name" "$remote_nick" "$local_name"
+ append_fetch_head "$sha1" "$remote" \
+ "$remote_name" "$remote_nick" "$local_name" "$not_for_merge"
done || exit
;;
esac
my ($bname, $tname, $gname, $src);
chomp;
s/^[0-9a-f]* //;
+ next if (/^not-for-merge/);
+ s/^ //;
if (s/ of (.*)$//) {
$src = $1;
} else {
$src{$src}{GENERIC});
my $this = join(', ', @this);
if ($src ne '.') {
- $this .= " from $src";
+ $this .= " of $src";
}
push @msg, $this;
}
esac
}
-# Subroutine to canonicalize remote:local notation
+# Subroutine to canonicalize remote:local notation.
canon_refs_list_for_fetch () {
+ # Leave only the first one alone; add prefix . to the rest
+ # to prevent the secondary branches to be merged by default.
+ dot_prefix=
for ref
do
force=
heads/* | tags/* ) local="refs/$local" ;;
*) local="refs/heads/$local" ;;
esac
- echo "${force}${remote}:${local}"
+ echo "${dot_prefix}${force}${remote}:${local}"
+ dot_prefix=.
done
}
echo "refs/heads/${remote_branch}:refs/heads/$1"
;;
remotes)
+ # This prefixes the second and later default refspecs
+ # with a '.', to signal git-fetch to mark them
+ # not-for-merge.
canon_refs_list_for_fetch $(sed -ne '/^Pull: */{
s///p
}' "$GIT_DIR/remotes/$1")
die "You need to first update your working tree."
fi
-merge_head=$(sed -e 's/ .*//' "$GIT_DIR"/FETCH_HEAD | tr '\012' ' ')
+merge_head=$(sed -e '/ not-for-merge /d' \
+ -e 's/ .*//' "$GIT_DIR"/FETCH_HEAD | \
+ tr '\012' ' ')
case "$merge_head" in
'')