[PATCH] cherry-pick/revert: transparently refresh index
From: Jonathan Nieder <hidden>
Date: 2016-06-15 22:49:57
Subsystem:
the rest · Maintainer:
Linus Torvalds
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 [off-list ref] Signed-off-by: Jonathan Nieder <redacted> --- Pete Wyckoff wrote:
P.S. The user-observable problem that occurs if I do not
rebuild the index is, e.g.:
$ 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.Maybe this would help? builtin/revert.c | 18 ++++++++++++++++-- t/t3501-revert-cherry-pick.sh | 13 +++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/builtin/revert.c b/builtin/revert.c
index 57b51e4..bb6e9e8 100644
--- a/builtin/revert.c
+++ b/builtin/revert.c@@ -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);
diff --git a/t/t3501-revert-cherry-pick.sh b/t/t3501-revert-cherry-pick.sh
index bc7aedd..b210188 100755
--- a/t/t3501-revert-cherry-pick.sh
+++ b/t/t3501-revert-cherry-pick.sh@@ -81,6 +81,19 @@ test_expect_success 'revert after renaming branch' ' ' +test_expect_success 'revert on stat-dirty working tree' ' + git clone . repo && + ( + cd repo && + git checkout initial + ) && + cp -R repo copy && + ( + cd copy && + git cherry-pick added + ) +' + test_expect_success 'revert forbidden on dirty working tree' ' echo content >extra_file &&
--
1.7.2.3.557.gab647.dirty