From: Avery Pennarun Date: Sat, 25 Apr 2009 03:41:19 +0000 (-0400) Subject: Add 'git subtree merge' and 'git subtree pull'. X-Git-Tag: v1.7.11-rc0~176^2~78 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=13648af5eecd0880a64b6ea4b14f485f53daa2f1;p=git.git Add 'git subtree merge' and 'git subtree pull'. These are simple shortcuts for 'git merge -s subtree' and 'git pull -s subtree', but it makes sense to have it all in one command. --- diff --git a/git-subtree.sh b/git-subtree.sh index 2dc99e82c..f2a1c6aae 100755 --- a/git-subtree.sh +++ b/git-subtree.sh @@ -8,13 +8,15 @@ if [ $# -eq 0 ]; then set -- -h fi OPTS_SPEC="\ -git subtree add <--prefix=prefix -git subtree split [options...] <--prefix=prefix> -git subtree merge +git subtree add --prefix= +git subtree split [options...] --prefix= +git subtree merge --prefix= +git subtree pull --prefix= -- h,help show the help q quiet prefix= the name of the subdir to split out + options for 'split' onto= try connecting new tree to an existing one rejoin merge the new branch back into HEAD ignore-joins ignore prior --rejoin commits @@ -68,27 +70,29 @@ done command="$1" shift case "$command" in - add|merge) default= ;; + add|merge|pull) default= ;; split) default="--default HEAD" ;; *) die "Unknown command '$command'" ;; esac -revs=$(git rev-parse $default --revs-only "$@") || exit $? - if [ -z "$prefix" ]; then die "You must provide the --prefix option." fi dir="$prefix" -dirs="$(git rev-parse --no-revs --no-flags "$@")" || exit $? -if [ -n "$dirs" ]; then - die "Error: Use --prefix instead of bare filenames." +if [ "$command" != "pull" ]; then + revs=$(git rev-parse $default --revs-only "$@") || exit $? + dirs="$(git rev-parse --no-revs --no-flags "$@")" || exit $? + if [ -n "$dirs" ]; then + die "Error: Use --prefix instead of bare filenames." + fi fi debug "command: {$command}" debug "quiet: {$quiet}" debug "revs: {$revs}" debug "dir: {$dir}" +debug "opts: {$*}" debug cache_setup() @@ -258,17 +262,23 @@ copy_or_skip() fi } -cmd_add() +ensure_clean() { - if [ -e "$dir" ]; then - die "'$dir' already exists. Cannot add." - fi if ! git diff-index HEAD --exit-code --quiet; then die "Working tree has modifications. Cannot add." fi if ! git diff-index --cached HEAD --exit-code --quiet; then die "Index has modifications. Cannot add." fi +} + +cmd_add() +{ + if [ -e "$dir" ]; then + die "'$dir' already exists. Cannot add." + fi + ensure_clean + set -- $revs if [ $# -ne 1 ]; then die "You must provide exactly one revision. Got: '$revs'" @@ -357,7 +367,22 @@ cmd_split() cmd_merge() { - die "merge command not implemented yet" + ensure_clean + + set -- $revs + if [ $# -ne 1 ]; then + die "You must provide exactly one revision. Got: '$revs'" + fi + rev="$1" + + git merge -s subtree $rev +} + +cmd_pull() +{ + ensure_clean + set -x + git pull -s subtree "$@" } -"cmd_$command" +"cmd_$command" "$@"