mirror of
https://github.com/git/git.git
synced 2024-11-24 02:17:02 +08:00
Enable "git rerere" by the config variable rerere.enabled
Earlier, "git rerere" was enabled by creating the directory .git/rr-cache. That is definitely not in line with most other features, which are enabled by a config variable. So, check the config variable "rerere.enabled". If it is set to "false" explicitely, do not activate rerere, even if .git/rr-cache exists. This should help when you want to disable rerere temporarily. If "rerere.enabled" is not set at all, fall back to detection of the directory .git/rr-cache. [jc: with minimum tweaks] Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
b2493649fe
commit
b4372ef136
@ -448,6 +448,11 @@ gc.rerereunresolved::
|
||||
kept for this many days when `git rerere gc` is run.
|
||||
The default is 15 days. See gitlink:git-rerere[1].
|
||||
|
||||
rerere.enabled::
|
||||
Activate recording of resolved conflicts, so that identical
|
||||
conflict hunks can be resolved automatically, should they
|
||||
be encountered again. See gitlink:git-rerere[1].
|
||||
|
||||
gitcvs.enabled::
|
||||
Whether the cvs server interface is enabled for this repository.
|
||||
See gitlink:git-cvsserver[1].
|
||||
|
@ -23,7 +23,7 @@ initial manual merge, and later by noticing the same automerge
|
||||
results and applying the previously recorded hand resolution.
|
||||
|
||||
[NOTE]
|
||||
You need to create `$GIT_DIR/rr-cache` directory to enable this
|
||||
You need to set the config variable rerere.enabled to enable this
|
||||
command.
|
||||
|
||||
|
||||
@ -171,7 +171,7 @@ records it if it is a new conflict, or reuses the earlier hand
|
||||
resolve when it is not. `git-commit` also invokes `git-rerere`
|
||||
when recording a merge result. What this means is that you do
|
||||
not have to do anything special yourself (Note: you still have
|
||||
to create `$GIT_DIR/rr-cache` directory to enable this command).
|
||||
to set the config variable rerere.enabled to enable this command).
|
||||
|
||||
In our example, when you did the test merge, the manual
|
||||
resolution is recorded, and it will be reused when you do the
|
||||
|
@ -12,6 +12,9 @@ static const char git_rerere_usage[] =
|
||||
static int cutoff_noresolve = 15;
|
||||
static int cutoff_resolve = 60;
|
||||
|
||||
/* if rerere_enabled == -1, fall back to detection of .git/rr-cache */
|
||||
static int rerere_enabled = -1;
|
||||
|
||||
static char *merge_rr_path;
|
||||
|
||||
static const char *rr_path(const char *name, const char *file)
|
||||
@ -387,21 +390,41 @@ static int git_rerere_config(const char *var, const char *value)
|
||||
cutoff_resolve = git_config_int(var, value);
|
||||
else if (!strcmp(var, "gc.rerereunresolved"))
|
||||
cutoff_noresolve = git_config_int(var, value);
|
||||
else if (!strcmp(var, "rerere.enabled"))
|
||||
rerere_enabled = git_config_bool(var, value);
|
||||
else
|
||||
return git_default_config(var, value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int is_rerere_enabled(void)
|
||||
{
|
||||
struct stat st;
|
||||
const char *rr_cache;
|
||||
int rr_cache_exists;
|
||||
|
||||
if (!rerere_enabled)
|
||||
return 0;
|
||||
|
||||
rr_cache = git_path("rr-cache");
|
||||
rr_cache_exists = !stat(rr_cache, &st) && S_ISDIR(st.st_mode);
|
||||
if (rerere_enabled < 0)
|
||||
return rr_cache_exists;
|
||||
|
||||
if (!rr_cache_exists &&
|
||||
(mkdir(rr_cache, 0777) || adjust_shared_perm(rr_cache)))
|
||||
die("Could not create directory %s", rr_cache);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int cmd_rerere(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
struct path_list merge_rr = { NULL, 0, 0, 1 };
|
||||
int i, fd = -1;
|
||||
struct stat st;
|
||||
|
||||
if (stat(git_path("rr-cache"), &st) || !S_ISDIR(st.st_mode))
|
||||
return 0;
|
||||
|
||||
git_config(git_rerere_config);
|
||||
if (!is_rerere_enabled())
|
||||
return 0;
|
||||
|
||||
merge_rr_path = xstrdup(git_path("rr-cache/MERGE_RR"));
|
||||
fd = hold_lock_file_for_update(&write_lock, merge_rr_path, 1);
|
||||
@ -411,6 +434,7 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)
|
||||
return do_plain_rerere(&merge_rr, fd);
|
||||
else if (!strcmp(argv[1], "clear")) {
|
||||
for (i = 0; i < merge_rr.nr; i++) {
|
||||
struct stat st;
|
||||
const char *name = (const char *)merge_rr.items[i].util;
|
||||
if (!stat(git_path("rr-cache/%s", name), &st) &&
|
||||
S_ISDIR(st.st_mode) &&
|
||||
|
@ -681,8 +681,7 @@ and returns the process output as a string."
|
||||
(condition-case nil (delete-file ".git/MERGE_MSG") (error nil))
|
||||
(with-current-buffer buffer (erase-buffer))
|
||||
(git-set-files-state files 'uptodate)
|
||||
(when (file-directory-p ".git/rr-cache")
|
||||
(git-run-command nil nil "rerere"))
|
||||
(git-run-command nil nil "rerere")
|
||||
(git-refresh-files)
|
||||
(git-refresh-ewoc-hf git-status)
|
||||
(message "Committed %s." commit)
|
||||
|
15
git-am.sh
15
git-am.sh
@ -95,10 +95,7 @@ It does not apply to blobs recorded in its index."
|
||||
eval GITHEAD_$his_tree='"$SUBJECT"'
|
||||
export GITHEAD_$his_tree
|
||||
git-merge-recursive $orig_tree -- HEAD $his_tree || {
|
||||
if test -d "$GIT_DIR/rr-cache"
|
||||
then
|
||||
git rerere
|
||||
fi
|
||||
git rerere
|
||||
echo Failed to merge in the changes.
|
||||
exit 1
|
||||
}
|
||||
@ -252,10 +249,7 @@ last=`cat "$dotest/last"`
|
||||
this=`cat "$dotest/next"`
|
||||
if test "$skip" = t
|
||||
then
|
||||
if test -d "$GIT_DIR/rr-cache"
|
||||
then
|
||||
git rerere clear
|
||||
fi
|
||||
git rerere clear
|
||||
this=`expr "$this" + 1`
|
||||
resume=
|
||||
fi
|
||||
@ -420,10 +414,7 @@ do
|
||||
stop_here_user_resolve $this
|
||||
fi
|
||||
apply_status=0
|
||||
if test -d "$GIT_DIR/rr-cache"
|
||||
then
|
||||
git rerere
|
||||
fi
|
||||
git rerere
|
||||
;;
|
||||
esac
|
||||
|
||||
|
@ -610,10 +610,7 @@ rm -f "$GIT_DIR/COMMIT_MSG" "$GIT_DIR/COMMIT_EDITMSG" "$GIT_DIR/SQUASH_MSG"
|
||||
|
||||
cd_to_toplevel
|
||||
|
||||
if test -d "$GIT_DIR/rr-cache"
|
||||
then
|
||||
git rerere
|
||||
fi
|
||||
git rerere
|
||||
|
||||
if test "$ret" = 0
|
||||
then
|
||||
|
@ -496,9 +496,6 @@ Conflicts:
|
||||
sed -e 's/^[^ ]* / /' |
|
||||
uniq
|
||||
} >>"$GIT_DIR/MERGE_MSG"
|
||||
if test -d "$GIT_DIR/rr-cache"
|
||||
then
|
||||
git rerere
|
||||
fi
|
||||
git rerere
|
||||
die "Automatic merge failed; fix conflicts and then commit the result."
|
||||
fi
|
||||
|
@ -101,7 +101,7 @@ call_merge () {
|
||||
return
|
||||
;;
|
||||
1)
|
||||
test -d "$GIT_DIR/rr-cache" && git rerere
|
||||
git rerere
|
||||
die "$RESOLVEMSG"
|
||||
;;
|
||||
2)
|
||||
@ -160,10 +160,7 @@ do
|
||||
--skip)
|
||||
if test -d "$dotest"
|
||||
then
|
||||
if test -d "$GIT_DIR/rr-cache"
|
||||
then
|
||||
git rerere clear
|
||||
fi
|
||||
git rerere clear
|
||||
prev_head="`cat $dotest/prev_head`"
|
||||
end="`cat $dotest/end`"
|
||||
msgnum="`cat $dotest/msgnum`"
|
||||
@ -181,10 +178,7 @@ do
|
||||
exit
|
||||
;;
|
||||
--abort)
|
||||
if test -d "$GIT_DIR/rr-cache"
|
||||
then
|
||||
git rerere clear
|
||||
fi
|
||||
git rerere clear
|
||||
if test -d "$dotest"
|
||||
then
|
||||
rm -r "$dotest"
|
||||
|
@ -39,15 +39,32 @@ sed -e 's/To die, t/To die! T/' > a1
|
||||
echo "* END *" >>a1
|
||||
git commit -q -a -m second
|
||||
|
||||
# activate rerere
|
||||
mkdir .git/rr-cache
|
||||
test_expect_success 'nothing recorded without rerere' '
|
||||
(rm -rf .git/rr-cache; git config rerere.enabled false) &&
|
||||
! git merge first &&
|
||||
! test -d .git/rr-cache
|
||||
'
|
||||
|
||||
test_expect_failure 'conflicting merge' 'git pull . first'
|
||||
# activate rerere, old style
|
||||
test_expect_success 'conflicting merge' '
|
||||
git reset --hard &&
|
||||
mkdir .git/rr-cache &&
|
||||
git config --unset rerere.enabled &&
|
||||
! git merge first
|
||||
'
|
||||
|
||||
sha1=$(sed -e 's/ .*//' .git/rr-cache/MERGE_RR)
|
||||
rr=.git/rr-cache/$sha1
|
||||
test_expect_success 'recorded preimage' "grep ======= $rr/preimage"
|
||||
|
||||
test_expect_success 'rerere.enabled works, too' '
|
||||
rm -rf .git/rr-cache &&
|
||||
git config rerere.enabled true &&
|
||||
git reset --hard &&
|
||||
! git merge first &&
|
||||
grep ======= $rr/preimage
|
||||
'
|
||||
|
||||
test_expect_success 'no postimage or thisimage yet' \
|
||||
"test ! -f $rr/postimage -a ! -f $rr/thisimage"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user