From aecda37c66ecf215fc67b0b48998a8c69c10d5a5 Mon Sep 17 00:00:00 2001 From: Clemens Buchacher Date: Sat, 1 May 2010 11:25:12 +0200 Subject: [PATCH 1/2] do not overwrite files marked "assume unchanged" A merge will fail gracefully if it needs to update files marked "assume unchanged", but other similar commands will not. In particular, checkout and rebase will silently overwrite changes to such files. This is a regression introduced in commit 1dcafcc0 (verify_uptodate(): add ce_uptodate(ce) test), which avoids lstat's during a merge, if the index entry is up-to-date. If the CE_VALID flag is set, however, we cannot trust CE_UPTODATE. Signed-off-by: Clemens Buchacher Signed-off-by: Junio C Hamano --- t/t2106-update-index-assume-unchanged.sh | 24 ++++++++++++++++++++++++ unpack-trees.c | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100755 t/t2106-update-index-assume-unchanged.sh diff --git a/t/t2106-update-index-assume-unchanged.sh b/t/t2106-update-index-assume-unchanged.sh new file mode 100755 index 0000000000..99d858c6b7 --- /dev/null +++ b/t/t2106-update-index-assume-unchanged.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +test_description='git update-index --assume-unchanged test. +' + +. ./test-lib.sh + +test_expect_success 'setup' \ + ': >file && + git add file && + git commit -m initial && + git branch other && + echo upstream >file && + git add file && + git commit -m upstream' + +test_expect_success 'do not switch branches with dirty file' \ + 'git reset --hard && + git checkout other && + echo dirt >file && + git update-index --assume-unchanged file && + test_must_fail git checkout master' + +test_done diff --git a/unpack-trees.c b/unpack-trees.c index 75f54cac97..1a8030ced0 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -862,7 +862,7 @@ static int verify_uptodate_1(struct cache_entry *ce, { struct stat st; - if (o->index_only || (!ce_skip_worktree(ce) && (o->reset || ce_uptodate(ce)))) + if (o->index_only || (!((ce->ce_flags & CE_VALID) || ce_skip_worktree(ce)) && (o->reset || ce_uptodate(ce)))) return 0; if (!lstat(ce->name, &st)) { From ac472ba65f75fbdbc52328f2bdc8645e5289e683 Mon Sep 17 00:00:00 2001 From: Clemens Buchacher Date: Sat, 1 May 2010 11:27:20 +0200 Subject: [PATCH 2/2] Documentation: git-add does not update files marked "assume unchanged" Signed-off-by: Clemens Buchacher Signed-off-by: Junio C Hamano --- Documentation/git-update-index.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/Documentation/git-update-index.txt b/Documentation/git-update-index.txt index 68dc1879fe..765d4b312e 100644 --- a/Documentation/git-update-index.txt +++ b/Documentation/git-update-index.txt @@ -93,8 +93,6 @@ OPTIONS This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked files (akin to what `.gitignore` does for untracked files). -You should remember that an explicit 'git add' operation will -still cause the file to be refreshed from the working tree. Git will fail (gracefully) in case it needs to modify this file in the index e.g. when merging in a commit; thus, in case the assumed-untracked file is changed upstream,