mirror of
https://github.com/git/git
synced 2024-08-25 02:35:46 +00:00
![Linus Torvalds](/assets/img/avatar_default.png)
When we resolve a merge between two branches, and it removes a file in the current branch, we notify the person doing the resolve with a big nice notice like Removing xyzzy which is all well and good. HOWEVER, we also do this when the file was actually removed in the current branch, and we're merging with another branch that didn't have it removed (or, indeed, if the other branch _did_ have it removed, but the common parent was far enough back that the file still existed in there). And that just doesn't make sense. In that case we're not removing anything: the file didn't exist in the branch we're merging into in the first place. So the message just makes people nervous, and makes no sense. This has been around forever, but I never bothered to do anything about it. Until now. The trivial fix is to only talk about removing files if the file existed in the branch we're merging into, but will not exist in the result. Signed-off-by: Linus Torvalds <torvalds@osdl.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
89 lines
1.9 KiB
Bash
Executable file
89 lines
1.9 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# Copyright (c) Linus Torvalds, 2005
|
|
#
|
|
# This is the git per-file merge script, called with
|
|
#
|
|
# $1 - original file SHA1 (or empty)
|
|
# $2 - file in branch1 SHA1 (or empty)
|
|
# $3 - file in branch2 SHA1 (or empty)
|
|
# $4 - pathname in repository
|
|
# $5 - orignal file mode (or empty)
|
|
# $6 - file in branch1 mode (or empty)
|
|
# $7 - file in branch2 mode (or empty)
|
|
#
|
|
# Handle some trivial cases.. The _really_ trivial cases have
|
|
# been handled already by git-read-tree, but that one doesn't
|
|
# do any merges that might change the tree layout.
|
|
|
|
case "${1:-.}${2:-.}${3:-.}" in
|
|
#
|
|
# Deleted in both or deleted in one and unchanged in the other
|
|
#
|
|
"$1.." | "$1.$1" | "$1$1.")
|
|
if [ "$2" ]; then
|
|
echo "Removing $4"
|
|
fi
|
|
if test -f "$4"; then
|
|
rm -f -- "$4"
|
|
fi &&
|
|
exec git-update-cache --remove -- "$4"
|
|
;;
|
|
|
|
#
|
|
# Added in one.
|
|
#
|
|
".$2." | "..$3" )
|
|
echo "Adding $4"
|
|
git-update-cache --add --cacheinfo "$6$7" "$2$3" "$4" &&
|
|
exec git-checkout-cache -u -f -- "$4"
|
|
;;
|
|
|
|
#
|
|
# Added in both (check for same permissions).
|
|
#
|
|
".$3$2")
|
|
if [ "$6" != "$7" ]; then
|
|
echo "ERROR: File $4 added identically in both branches,"
|
|
echo "ERROR: but permissions conflict $6->$7."
|
|
exit 1
|
|
fi
|
|
echo "Adding $4"
|
|
git-update-cache --add --cacheinfo "$6" "$2" "$4" &&
|
|
exec git-checkout-cache -u -f -- "$4"
|
|
;;
|
|
|
|
#
|
|
# Modified in both, but differently.
|
|
#
|
|
"$1$2$3")
|
|
echo "Auto-merging $4."
|
|
orig=`git-unpack-file $1`
|
|
src2=`git-unpack-file $3`
|
|
|
|
# We reset the index to the first branch, making
|
|
# git-diff-file useful
|
|
git-update-cache --add --cacheinfo "$6" "$2" "$4"
|
|
git-checkout-cache -u -f -- "$4" &&
|
|
merge "$4" "$orig" "$src2"
|
|
ret=$?
|
|
rm -f -- "$orig" "$src2"
|
|
|
|
if [ "$6" != "$7" ]; then
|
|
echo "ERROR: Permissions conflict: $5->$6,$7."
|
|
ret=1
|
|
fi
|
|
|
|
if [ $ret -ne 0 ]; then
|
|
echo "ERROR: Merge conflict in $4."
|
|
exit 1
|
|
fi
|
|
exec git-update-cache -- "$4"
|
|
;;
|
|
|
|
*)
|
|
echo "ERROR: $4: Not handling case $1 -> $2 -> $3"
|
|
;;
|
|
esac
|
|
exit 1
|