Added new 'push' command and 2-parameter form of 'add'.

Now you can do:

	git subtree add --prefix=whatever git://wherever branchname

to add a new branch, instead of rather weirdly having to do 'git fetch'
first.  You can also split and push in one step:

	git subtree push --prefix=whatever git://wherever newbranch

(Somewhat cleaned up by apenwarr.)
This commit is contained in:
Wayne Walter 2010-02-13 14:32:21 -05:00 коммит произвёл Avery Pennarun
Родитель ae3301876c
Коммит c00d1d1168
4 изменённых файлов: 77 добавлений и 18 удалений

11
INSTALL
Просмотреть файл

@ -2,7 +2,16 @@
HOW TO INSTALL git-subtree
==========================
Copy the file 'git-subtree.sh' to /usr/local/bin/git-subtree.
You simply need to copy the file 'git-subtree.sh' to where
the rest of the git scripts are stored.
From the Git bash window just run:
install.sh
Or if you have the full Cygwin installed, you can use make:
make install
That will make a 'git subtree' (note: space instead of dash) command
available. See the file git-subtree.txt for more.

Просмотреть файл

@ -11,6 +11,7 @@ OPTS_SPEC="\
git subtree add --prefix=<prefix> <commit>
git subtree merge --prefix=<prefix> <commit>
git subtree pull --prefix=<prefix> <repository> <refspec...>
git subtree push --prefix=<prefix> <repository> <refspec...>
git subtree split --prefix=<prefix> <commit...>
--
h,help show the help
@ -24,7 +25,7 @@ b,branch= create a new branch from the split subtree
ignore-joins ignore prior --rejoin commits
onto= try connecting new tree to an existing one
rejoin merge the new branch back into HEAD
options for 'add', 'merge', and 'pull'
options for 'add', 'merge', 'pull' and 'push'
squash merge subtree changes as a single commit
"
eval $(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)
@ -98,7 +99,7 @@ command="$1"
shift
case "$command" in
add|merge|pull) default= ;;
split) default="--default HEAD" ;;
split|push) default="--default HEAD" ;;
*) die "Unknown command '$command'" ;;
esac
@ -115,7 +116,7 @@ esac
dir="$(dirname "$prefix/.")"
if [ "$command" != "pull" ]; then
if [ "$command" != "pull" -a "$command" != "add" -a "$command" != "push" ]; then
revs=$(git rev-parse $default --revs-only "$@") || exit $?
dirs="$(git rev-parse --no-revs --no-flags "$@")" || exit $?
if [ -n "$dirs" ]; then
@ -450,10 +451,10 @@ copy_or_skip()
ensure_clean()
{
if ! git diff-index HEAD --exit-code --quiet; then
if ! git diff-index HEAD --exit-code --quiet 2>&1; then
die "Working tree has modifications. Cannot add."
fi
if ! git diff-index --cached HEAD --exit-code --quiet; then
if ! git diff-index --cached HEAD --exit-code --quiet 2>&1; then
die "Index has modifications. Cannot add."
fi
}
@ -463,12 +464,34 @@ 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'"
if [ $# -eq 1 ]; then
"cmd_add_commit" "$@"
elif [ $# -eq 2 ]; then
"cmd_add_repository" "$@"
else
say "error: parameters were '$@'"
die "Provide either a refspec or a repository and refspec."
fi
}
cmd_add_repository()
{
echo "git fetch" "$@"
repository=$1
refspec=$2
git fetch "$@" || exit $?
revs=FETCH_HEAD
set -- $revs
cmd_add_commit "$@"
}
cmd_add_commit()
{
revs=$(git rev-parse $default --revs-only "$@") || exit $?
set -- $revs
rev="$1"
debug "Adding $dir as '$rev'..."
@ -586,6 +609,7 @@ cmd_split()
cmd_merge()
{
revs=$(git rev-parse $default --revs-only "$@") || exit $?
ensure_clean
set -- $revs
@ -623,7 +647,23 @@ cmd_pull()
ensure_clean
git fetch "$@" || exit $?
revs=FETCH_HEAD
cmd_merge
set -- $revs
cmd_merge "$@"
}
cmd_push()
{
if [ $# -ne 2 ]; then
die "You must provide <repository> <refspec>"
fi
if [ -e "$dir" ]; then
repository=$1
refspec=$2
echo "git push using: " $repository $refspec
git push $repository $(git subtree split --prefix=$prefix):refs/heads/$refspec
else
die "'$dir' must already exist. Try 'git subtree add'."
fi
}
"cmd_$command" "$@"

Просмотреть файл

@ -9,10 +9,12 @@ git-subtree - add, merge, and split subprojects stored in subtrees
SYNOPSIS
--------
[verse]
'git subtree' add --prefix=<prefix> <commit>
'git subtree' merge --prefix=<prefix> <commit>
'git subtree' add --prefix=<prefix> <repository> <refspec...>
'git subtree' pull --prefix=<prefix> <repository> <refspec...>
'git subtree' split --prefix=<prefix> <commit...>
'git subtree' push --prefix=<prefix> <repository> <refspec...>
'git subtree' add --prefix=<prefix> <refspec>
'git subtree' merge --prefix=<prefix> <refspec>
'git subtree' split --prefix=<prefix> <refspec...>
DESCRIPTION
@ -60,11 +62,11 @@ COMMANDS
--------
add::
Create the <prefix> subtree by importing its contents
from the given commit. A new commit is created
automatically, joining the imported project's history
with your own. With '--squash', imports only a single
commit from the subproject, rather than its entire
history.
from the given <refspec> or <repository> and remote <refspec>.
A new commit is created automatically, joining the imported
project's history with your own. With '--squash', imports
only a single commit from the subproject, rather than its
entire history.
merge::
Merge recent changes up to <commit> into the <prefix>
@ -84,6 +86,12 @@ pull::
Exactly like 'merge', but parallels 'git pull' in that
it fetches the given commit from the specified remote
repository.
push::
Does a 'split' (see above) using the <prefix> supplied
and then does a 'git push' to push the result to the
repository and refspec. This can be used to push your
subtree to different branches of the remote repository.
split::
Extract a new, synthetic project history from the

2
install.sh Normal file
Просмотреть файл

@ -0,0 +1,2 @@
# copy Git to where the rest of the Git scripts are found.
cp git-subtree.sh "$(git --exec-path)"/git-subtree