cherry-pick/revert: transparently refresh index
A stat-dirty index is not a detail that ought to concern the operator of porcelain such as "git cherry-pick". Without this change, a cherry-pick after copying a worktree with rsync errors out with a misleading message. $ git cherry-pick build/top error: Your local changes to 'file.h' would be overwritten by merge. Aborting. Please, commit your changes or stash them before you can merge. Noticed-by: Pete Wyckoff <pw@padd.com> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
af77aee9ca
commit
f6ce1f2588
@ -547,6 +547,21 @@ static void prepare_revs(struct rev_info *revs)
|
||||
die("empty commit set passed");
|
||||
}
|
||||
|
||||
static void read_and_refresh_cache(const char *me)
|
||||
{
|
||||
static struct lock_file index_lock;
|
||||
int index_fd = hold_locked_index(&index_lock, 0);
|
||||
if (read_index_preload(&the_index, NULL) < 0)
|
||||
die("git %s: failed to read the index", me);
|
||||
refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, NULL, NULL, NULL);
|
||||
if (the_index.cache_changed) {
|
||||
if (write_index(&the_index, index_fd) ||
|
||||
commit_locked_index(&index_lock))
|
||||
die("git %s: failed to refresh the index", me);
|
||||
}
|
||||
rollback_lock_file(&index_lock);
|
||||
}
|
||||
|
||||
static int revert_or_cherry_pick(int argc, const char **argv)
|
||||
{
|
||||
struct rev_info revs;
|
||||
@ -567,8 +582,7 @@ static int revert_or_cherry_pick(int argc, const char **argv)
|
||||
die("cherry-pick --ff cannot be used with --edit");
|
||||
}
|
||||
|
||||
if (read_cache() < 0)
|
||||
die("git %s: failed to read the index", me);
|
||||
read_and_refresh_cache(me);
|
||||
|
||||
prepare_revs(&revs);
|
||||
|
||||
|
Reference in New Issue
Block a user