Skip to content
/ git Public
forked from git/git

Commit

Permalink
merge: loosen overcautious "working file will be lost" check.
Browse files Browse the repository at this point in the history
The three-way merge complained unconditionally when a path that
does not exist in the index is involved in a merge when it
existed in the working tree.  If we are merging an old version
that had that path tracked, but the path is not tracked anymore,
and if we are merging that old version in, the result will be
that the path is not tracked.  In that case we should not
complain.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed Oct 28, 2006
1 parent 887a612 commit ed93b44
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 4 deletions.
16 changes: 15 additions & 1 deletion git-merge-one-file.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ case "${1:-.}${2:-.}${3:-.}" in
"$1.." | "$1.$1" | "$1$1.")
if [ "$2" ]; then
echo "Removing $4"
else
# read-tree checked that index matches HEAD already,
# so we know we do not have this path tracked.
# there may be an unrelated working tree file here,
# which we should just leave unmolested.
exit 0
fi
if test -f "$4"; then
rm -f -- "$4" &&
Expand All @@ -34,8 +40,16 @@ case "${1:-.}${2:-.}${3:-.}" in
#
# Added in one.
#
".$2." | "..$3" )
".$2.")
# the other side did not add and we added so there is nothing
# to be done.
;;
"..$3")
echo "Adding $4"
test -f "$4" || {
echo "ERROR: untracked $4 is overwritten by the merge."
exit 1
}
git-update-index --add --cacheinfo "$6$7" "$2$3" "$4" &&
exec git-checkout-index -u -f -- "$4"
;;
Expand Down
53 changes: 53 additions & 0 deletions t/t1004-read-tree-m-u-wf.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/bin/sh

test_description='read-tree -m -u checks working tree files'

. ./test-lib.sh

# two-tree test

test_expect_success 'two-way setup' '
echo >file1 file one &&
echo >file2 file two &&
git update-index --add file1 file2 &&
git commit -m initial &&
git branch side &&
git tag -f branch-point &&
echo file2 is not tracked on the master anymore &&
rm -f file2 &&
git update-index --remove file2 &&
git commit -a -m "master removes file2"
'

test_expect_success 'two-way not clobbering' '
echo >file2 master creates untracked file2 &&
if err=`git read-tree -m -u master side 2>&1`
then
echo should have complained
false
else
echo "happy to see $err"
fi
'

# three-tree test

test_expect_success 'three-way not complaining' '
rm -f file2 &&
git checkout side &&
echo >file3 file three &&
git update-index --add file3 &&
git commit -a -m "side adds file3" &&
git checkout master &&
echo >file2 file two is untracked on the master side &&
git-read-tree -m -u branch-point master side
'

test_done
4 changes: 1 addition & 3 deletions unpack-trees.c
Original file line number Diff line number Diff line change
Expand Up @@ -642,7 +642,7 @@ int threeway_merge(struct cache_entry **stages,
(remote_deleted && head && head_match)) {
if (index)
return deleted_entry(index, index, o);
else if (path)
else if (path && !head_deleted)
verify_absent(path, "removed", o);
return 0;
}
Expand All @@ -661,8 +661,6 @@ int threeway_merge(struct cache_entry **stages,
if (index) {
verify_uptodate(index, o);
}
else if (path)
verify_absent(path, "overwritten", o);

o->nontrivial_merge = 1;

Expand Down

0 comments on commit ed93b44

Please sign in to comment.