mirror of
https://github.com/git/git
synced 2024-08-27 11:39:22 +00:00
[PATCH] Allow "+remote:local" refspec to cause --force when fetching.
With this we could say: Pull: master:ko-master +pu:ko-pu to mean "fast forward ko-master with master, overwrite ko-pu with pu", and the latter one does not require the remote "pu" to be descendant of local "ko-pu". Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
521003ff52
commit
efe9bf0f3b
|
@ -104,8 +104,8 @@ fast_forward_local () {
|
|||
;;
|
||||
esac || {
|
||||
echo >&2 "* $1: does not fast forward to $4"
|
||||
case "$force" in
|
||||
t)
|
||||
case "$force,$single_force" in
|
||||
t,* | *,t)
|
||||
echo >&2 " from $3; forcing update."
|
||||
;;
|
||||
*)
|
||||
|
@ -130,6 +130,13 @@ do
|
|||
|
||||
# These are relative path from $GIT_DIR, typically starting at refs/
|
||||
# but may be HEAD
|
||||
if expr "$ref" : '\+' >/dev/null
|
||||
then
|
||||
single_force=t
|
||||
ref=$(expr "$ref" : '\+\(.*\)')
|
||||
else
|
||||
single_force=
|
||||
fi
|
||||
remote_name=$(expr "$ref" : '\([^:]*\):')
|
||||
local_name=$(expr "$ref" : '[^:]*:\(.*\)')
|
||||
|
||||
|
@ -175,9 +182,14 @@ http://* | https://* | rsync://* )
|
|||
while read sha1 remote_name
|
||||
do
|
||||
found=
|
||||
single_force=
|
||||
for ref in $refs
|
||||
do
|
||||
case "$ref" in
|
||||
+$remote_name:*)
|
||||
single_force=t
|
||||
found="$ref"
|
||||
break ;;
|
||||
$remote_name:*)
|
||||
found="$ref"
|
||||
break ;;
|
||||
|
@ -185,7 +197,7 @@ http://* | https://* | rsync://* )
|
|||
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"
|
||||
done
|
||||
;;
|
||||
esac
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
get_data_source () {
|
||||
case "$1" in
|
||||
*/*)
|
||||
# Not so fast. This could be the partial URL shorthand...
|
||||
# Not so fast. This could be the partial URL shorthand...
|
||||
token=$(expr "$1" : '\([^/]*\)/')
|
||||
remainder=$(expr "$1" : '[^/]*/\(.*\)')
|
||||
if test -f "$GIT_DIR/branches/$token"
|
||||
|
@ -69,6 +69,13 @@ get_remote_default_refs_for_push () {
|
|||
canon_refs_list_for_fetch () {
|
||||
for ref
|
||||
do
|
||||
force=
|
||||
case "$ref" in
|
||||
+*)
|
||||
ref=$(expr "$ref" : '\+\(.*\)')
|
||||
force=+
|
||||
;;
|
||||
esac
|
||||
expr "$ref" : '.*:' >/dev/null || ref="${ref}:"
|
||||
remote=$(expr "$ref" : '\([^:]*\):')
|
||||
local=$(expr "$ref" : '[^:]*:\(.*\)')
|
||||
|
@ -80,7 +87,7 @@ canon_refs_list_for_fetch () {
|
|||
'') local= ;;
|
||||
*) local="refs/heads/$local" ;;
|
||||
esac
|
||||
echo "${remote}:${local}"
|
||||
echo "${force}${remote}:${local}"
|
||||
done
|
||||
}
|
||||
|
||||
|
@ -132,12 +139,12 @@ get_remote_refs_for_fetch () {
|
|||
else
|
||||
case "$ref" in
|
||||
tag)
|
||||
tag_just_seen=yes
|
||||
tag_just_seen=yes
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
canon_refs_list_for_fetch "$ref"
|
||||
canon_refs_list_for_fetch "$ref"
|
||||
done
|
||||
;;
|
||||
esac
|
||||
|
|
Loading…
Reference in a new issue