зеркало из https://github.com/microsoft/git.git
Merge branch 'jc/checkout-from-tree-keep-local-changes'
* jc/checkout-from-tree-keep-local-changes: checkout $tree $path: do not clobber local changes in $path not in $tree
This commit is contained in:
Коммит
66d2c22f41
|
@ -72,7 +72,7 @@ static int update_some(const unsigned char *sha1, const char *base, int baselen,
|
||||||
hashcpy(ce->sha1, sha1);
|
hashcpy(ce->sha1, sha1);
|
||||||
memcpy(ce->name, base, baselen);
|
memcpy(ce->name, base, baselen);
|
||||||
memcpy(ce->name + baselen, pathname, len - baselen);
|
memcpy(ce->name + baselen, pathname, len - baselen);
|
||||||
ce->ce_flags = create_ce_flags(len, 0);
|
ce->ce_flags = create_ce_flags(len, 0) | CE_UPDATE;
|
||||||
ce->ce_mode = create_ce_mode(mode);
|
ce->ce_mode = create_ce_mode(mode);
|
||||||
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;
|
||||||
|
@ -229,6 +229,8 @@ static int checkout_paths(struct tree *source_tree, const char **pathspec,
|
||||||
|
|
||||||
for (pos = 0; pos < active_nr; pos++) {
|
for (pos = 0; pos < active_nr; pos++) {
|
||||||
struct cache_entry *ce = active_cache[pos];
|
struct cache_entry *ce = active_cache[pos];
|
||||||
|
if (source_tree && !(ce->ce_flags & CE_UPDATE))
|
||||||
|
continue;
|
||||||
match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, ps_matched);
|
match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, ps_matched);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,6 +269,8 @@ static int checkout_paths(struct tree *source_tree, const char **pathspec,
|
||||||
state.refresh_cache = 1;
|
state.refresh_cache = 1;
|
||||||
for (pos = 0; pos < active_nr; pos++) {
|
for (pos = 0; pos < active_nr; pos++) {
|
||||||
struct cache_entry *ce = active_cache[pos];
|
struct cache_entry *ce = active_cache[pos];
|
||||||
|
if (source_tree && !(ce->ce_flags & CE_UPDATE))
|
||||||
|
continue;
|
||||||
if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
|
if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) {
|
||||||
if (!ce_stage(ce)) {
|
if (!ce_stage(ce)) {
|
||||||
errs |= checkout_entry(ce, &state, NULL);
|
errs |= checkout_entry(ce, &state, NULL);
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='checkout $tree -- $paths'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
test_expect_success setup '
|
||||||
|
mkdir dir &&
|
||||||
|
>dir/master &&
|
||||||
|
echo common >dir/common &&
|
||||||
|
git add dir/master dir/common &&
|
||||||
|
test_tick && git commit -m "master has dir/master" &&
|
||||||
|
git checkout -b next &&
|
||||||
|
git mv dir/master dir/next0 &&
|
||||||
|
echo next >dir/next1 &&
|
||||||
|
git add dir &&
|
||||||
|
test_tick && git commit -m "next has dir/next but not dir/master"
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'checking out paths out of a tree does not clobber unrelated paths' '
|
||||||
|
git checkout next &&
|
||||||
|
git reset --hard &&
|
||||||
|
rm dir/next0 &&
|
||||||
|
cat dir/common >expect.common &&
|
||||||
|
echo modified >expect.next1 &&
|
||||||
|
cat expect.next1 >dir/next1 &&
|
||||||
|
echo untracked >expect.next2 &&
|
||||||
|
cat expect.next2 >dir/next2 &&
|
||||||
|
|
||||||
|
git checkout master dir &&
|
||||||
|
|
||||||
|
test_cmp expect.common dir/common &&
|
||||||
|
test_path_is_file dir/master &&
|
||||||
|
git diff --exit-code master dir/master &&
|
||||||
|
|
||||||
|
test_path_is_missing dir/next0 &&
|
||||||
|
test_cmp expect.next1 dir/next1 &&
|
||||||
|
test_path_is_file dir/next2 &&
|
||||||
|
test_must_fail git ls-files --error-unmatch dir/next2 &&
|
||||||
|
test_cmp expect.next2 dir/next2
|
||||||
|
'
|
||||||
|
|
||||||
|
test_done
|
Загрузка…
Ссылка в новой задаче