зеркало из https://github.com/microsoft/git.git
Merge branch 'jk/checkout-from-tree' into maint
"git checkout $treeish $path", when $path in the index and the working tree already matched what is in $treeish at the $path, still overwrote the $path unnecessarily. * jk/checkout-from-tree: checkout $tree: do not throw away unchanged index entries
This commit is contained in:
Коммит
447c39a9b2
|
@ -67,6 +67,7 @@ static int update_some(const unsigned char *sha1, const char *base, int baselen,
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
struct cache_entry *ce;
|
struct cache_entry *ce;
|
||||||
|
int pos;
|
||||||
|
|
||||||
if (S_ISDIR(mode))
|
if (S_ISDIR(mode))
|
||||||
return READ_TREE_RECURSIVE;
|
return READ_TREE_RECURSIVE;
|
||||||
|
@ -79,6 +80,23 @@ static int update_some(const unsigned char *sha1, const char *base, int baselen,
|
||||||
ce->ce_flags = create_ce_flags(0) | CE_UPDATE;
|
ce->ce_flags = create_ce_flags(0) | CE_UPDATE;
|
||||||
ce->ce_namelen = len;
|
ce->ce_namelen = len;
|
||||||
ce->ce_mode = create_ce_mode(mode);
|
ce->ce_mode = create_ce_mode(mode);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the entry is the same as the current index, we can leave the old
|
||||||
|
* entry in place. Whether it is UPTODATE or not, checkout_entry will
|
||||||
|
* do the right thing.
|
||||||
|
*/
|
||||||
|
pos = cache_name_pos(ce->name, ce->ce_namelen);
|
||||||
|
if (pos >= 0) {
|
||||||
|
struct cache_entry *old = active_cache[pos];
|
||||||
|
if (ce->ce_mode == old->ce_mode &&
|
||||||
|
!hashcmp(ce->sha1, old->sha1)) {
|
||||||
|
old->ce_flags |= CE_UPDATE;
|
||||||
|
free(ce);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
add_cache_entry(ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE);
|
add_cache_entry(ce, ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,4 +61,21 @@ test_expect_success 'do not touch unmerged entries matching $path but not in $tr
|
||||||
test_cmp expect.next0 actual.next0
|
test_cmp expect.next0 actual.next0
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'do not touch files that are already up-to-date' '
|
||||||
|
git reset --hard &&
|
||||||
|
echo one >file1 &&
|
||||||
|
echo two >file2 &&
|
||||||
|
git add file1 file2 &&
|
||||||
|
git commit -m base &&
|
||||||
|
echo modified >file1 &&
|
||||||
|
test-chmtime =1000000000 file2 &&
|
||||||
|
git update-index -q --refresh &&
|
||||||
|
git checkout HEAD -- file1 file2 &&
|
||||||
|
echo one >expect &&
|
||||||
|
test_cmp expect file1 &&
|
||||||
|
echo "1000000000 file2" >expect &&
|
||||||
|
test-chmtime -v +0 file2 >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
Загрузка…
Ссылка в новой задаче