mirror of
https://github.com/git/git.git
synced 2024-10-22 13:39:05 +02:00
Make --squash work with the 'add' command too.
This commit is contained in:
parent
1a8c36dc5f
commit
d713e2d87a
@ -23,7 +23,7 @@ b,branch= create a new branch from the split subtree
|
|||||||
ignore-joins ignore prior --rejoin commits
|
ignore-joins ignore prior --rejoin commits
|
||||||
onto= try connecting new tree to an existing one
|
onto= try connecting new tree to an existing one
|
||||||
rejoin merge the new branch back into HEAD
|
rejoin merge the new branch back into HEAD
|
||||||
options for 'merge' and 'pull'
|
options for 'add', 'merge', and 'pull'
|
||||||
squash merge subtree changes as a single commit
|
squash merge subtree changes as a single commit
|
||||||
"
|
"
|
||||||
eval $(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)
|
eval $(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)
|
||||||
@ -169,11 +169,16 @@ try_remove_previous()
|
|||||||
|
|
||||||
find_latest_squash()
|
find_latest_squash()
|
||||||
{
|
{
|
||||||
debug "Looking for latest squash..."
|
debug "Looking for latest squash ($dir)..."
|
||||||
dir="$1"
|
dir="$1"
|
||||||
|
sq=
|
||||||
|
main=
|
||||||
|
sub=
|
||||||
git log --grep="^git-subtree-dir: $dir\$" \
|
git log --grep="^git-subtree-dir: $dir\$" \
|
||||||
--pretty=format:'START %H%n%s%n%n%b%nEND%n' HEAD |
|
--pretty=format:'START %H%n%s%n%n%b%nEND%n' HEAD |
|
||||||
while read a b junk; do
|
while read a b junk; do
|
||||||
|
debug "$a $b $junk"
|
||||||
|
debug "{{$sq/$main/$sub}}"
|
||||||
case "$a" in
|
case "$a" in
|
||||||
START) sq="$b" ;;
|
START) sq="$b" ;;
|
||||||
git-subtree-mainline:) main="$b" ;;
|
git-subtree-mainline:) main="$b" ;;
|
||||||
@ -202,6 +207,8 @@ find_existing_splits()
|
|||||||
debug "Looking for prior splits..."
|
debug "Looking for prior splits..."
|
||||||
dir="$1"
|
dir="$1"
|
||||||
revs="$2"
|
revs="$2"
|
||||||
|
main=
|
||||||
|
sub=
|
||||||
git log --grep="^git-subtree-dir: $dir\$" \
|
git log --grep="^git-subtree-dir: $dir\$" \
|
||||||
--pretty=format:'START %H%n%s%n%n%b%nEND%n' $revs |
|
--pretty=format:'START %H%n%s%n%n%b%nEND%n' $revs |
|
||||||
while read a b junk; do
|
while read a b junk; do
|
||||||
@ -284,21 +291,21 @@ squash_msg()
|
|||||||
dir="$1"
|
dir="$1"
|
||||||
oldsub="$2"
|
oldsub="$2"
|
||||||
newsub="$3"
|
newsub="$3"
|
||||||
oldsub_short=$(git rev-parse --short "$oldsub")
|
|
||||||
newsub_short=$(git rev-parse --short "$newsub")
|
newsub_short=$(git rev-parse --short "$newsub")
|
||||||
cat <<-EOF
|
|
||||||
Squashed '$dir/' changes from $oldsub_short..$newsub_short
|
|
||||||
|
|
||||||
EOF
|
if [ -n "$oldsub" ]; then
|
||||||
|
oldsub_short=$(git rev-parse --short "$oldsub")
|
||||||
|
echo "Squashed '$dir/' changes from $oldsub_short..$newsub_short"
|
||||||
|
echo
|
||||||
|
git log --pretty=tformat:'%h %s' "$oldsub..$newsub"
|
||||||
|
git log --pretty=tformat:'REVERT: %h %s' "$newsub..$oldsub"
|
||||||
|
else
|
||||||
|
echo "Squashed '$dir/' content from commit $newsub_short"
|
||||||
|
fi
|
||||||
|
|
||||||
git log --pretty=tformat:'%h %s' "$oldsub..$newsub"
|
echo
|
||||||
git log --pretty=tformat:'REVERT: %h %s' "$newsub..$oldsub"
|
echo "git-subtree-dir: $dir"
|
||||||
|
echo "git-subtree-split: $newsub"
|
||||||
cat <<-EOF
|
|
||||||
|
|
||||||
git-subtree-dir: $dir
|
|
||||||
git-subtree-split: $newsub
|
|
||||||
EOF
|
|
||||||
}
|
}
|
||||||
|
|
||||||
toptree_for_commit()
|
toptree_for_commit()
|
||||||
@ -341,8 +348,13 @@ new_squash_commit()
|
|||||||
oldsub="$2"
|
oldsub="$2"
|
||||||
newsub="$3"
|
newsub="$3"
|
||||||
tree=$(toptree_for_commit $newsub) || exit $?
|
tree=$(toptree_for_commit $newsub) || exit $?
|
||||||
squash_msg "$dir" "$oldsub" "$newsub" |
|
if [ -n "$old" ]; then
|
||||||
git commit-tree "$tree" -p "$old" || exit $?
|
squash_msg "$dir" "$oldsub" "$newsub" |
|
||||||
|
git commit-tree "$tree" -p "$old" || exit $?
|
||||||
|
else
|
||||||
|
squash_msg "$dir" "" "$newsub" |
|
||||||
|
git commit-tree "$tree" || exit $?
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
copy_or_skip()
|
copy_or_skip()
|
||||||
@ -422,9 +434,18 @@ cmd_add()
|
|||||||
else
|
else
|
||||||
headp=
|
headp=
|
||||||
fi
|
fi
|
||||||
commit=$(add_msg "$dir" "$headrev" "$rev" |
|
|
||||||
git commit-tree $tree $headp -p "$rev") || exit $?
|
if [ -n "$squash" ]; then
|
||||||
|
rev=$(new_squash_commit "" "" "$rev") || exit $?
|
||||||
|
commit=$(echo "Merge commit '$rev' as '$dir'" |
|
||||||
|
git commit-tree $tree $headp -p "$rev") || exit $?
|
||||||
|
else
|
||||||
|
commit=$(add_msg "$dir" "$headrev" "$rev" |
|
||||||
|
git commit-tree $tree $headp -p "$rev") || exit $?
|
||||||
|
fi
|
||||||
git reset "$commit" || exit $?
|
git reset "$commit" || exit $?
|
||||||
|
|
||||||
|
say "Added dir '$dir'"
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd_split()
|
cmd_split()
|
||||||
|
7
todo
7
todo
@ -10,11 +10,14 @@
|
|||||||
"-s subtree" should be given an explicit subtree option?
|
"-s subtree" should be given an explicit subtree option?
|
||||||
There doesn't seem to be a way to do this. We'd have to
|
There doesn't seem to be a way to do this. We'd have to
|
||||||
patch git-merge-subtree. Ugh.
|
patch git-merge-subtree. Ugh.
|
||||||
|
(but we could avoid this problem by generating squashes with
|
||||||
|
exactly the right subtree structure, rather than using
|
||||||
|
subtree merge...)
|
||||||
|
|
||||||
add a 'push' subcommand to parallel 'pull'
|
add a 'push' subcommand to parallel 'pull'
|
||||||
|
|
||||||
add a 'log' subcommand to see what's new in a subtree?
|
add a 'log' subcommand to see what's new in a subtree?
|
||||||
|
|
||||||
add a --squash option so we don't merge histories but can still split
|
|
||||||
|
|
||||||
add to-submodule and from-submodule commands
|
add to-submodule and from-submodule commands
|
||||||
|
|
||||||
|
automated tests for --squash stuff
|
||||||
|
Loading…
Reference in New Issue
Block a user