From: Junio C Hamano <gitster@xxxxxxxxx> This marks the recent improvement to the merge machinery that helps people who changed their mind between CRLF/LF an opt in feature, so that we can more easily release it early to everybody, without fear of breaking the majority of users (read: on POSIX) that don't need it. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> Signed-off-by: Eyvind Bernhardsen <eyvind.bernhardsen@xxxxxxxxx> --- Documentation/config.txt | 10 ++++++++++ Documentation/gitattributes.txt | 5 +++-- cache.h | 1 + config.c | 5 +++++ environment.c | 1 + ll-merge.c | 8 +++++--- t/t6038-merge-text-auto.sh | 1 + 7 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index 72949e7..454cbc7 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -538,6 +538,16 @@ core.sparseCheckout:: Enable "sparse checkout" feature. See section "Sparse checkout" in linkgit:git-read-tree[1] for more information. +core.mergePrefilter:: + Tell git that canonical representation of files in the repository + has changed over time (e.g. earlier commits record text files + with CRLF line endings, but recent ones use LF line endings). In + such a repository, git can convert the data recorded in commits to + a canonical form before performing a merge to reduce unnecessary + conflicts. For more information, see section + "Merging branches with differing checkin/checkout attributes" in + linkgit:gitattributes[5]. + add.ignore-errors:: Tells 'git add' to continue adding files when some files cannot be added due to indexing errors. Equivalent to the '--ignore-errors' diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt index 22400c1..316fac0 100644 --- a/Documentation/gitattributes.txt +++ b/Documentation/gitattributes.txt @@ -351,9 +351,10 @@ clean/smudge filter or text/eol/ident attributes, merging anything where the attribute is not in place would normally cause merge conflicts. -To prevent these unnecessary merge conflicts, git runs a virtual +To prevent these unnecessary merge conflicts, git can be told to run a virtual check-out and check-in of all three stages of a file when resolving a -three-way merge. This prevents changes caused by check-in conversion +three-way merge by setting the `core.mergePrefilter` configuration variable. +This prevents changes caused by check-in conversion from causing spurious merge conflicts when a converted file is merged with an unconverted file. diff --git a/cache.h b/cache.h index aa725b0..255da02 100644 --- a/cache.h +++ b/cache.h @@ -551,6 +551,7 @@ extern int read_replace_refs; extern int fsync_object_files; extern int core_preload_index; extern int core_apply_sparse_checkout; +extern int core_merge_prefilter; enum safe_crlf { SAFE_CRLF_FALSE = 0, diff --git a/config.c b/config.c index cdcf583..36a0d1a 100644 --- a/config.c +++ b/config.c @@ -595,6 +595,11 @@ static int git_default_core_config(const char *var, const char *value) return 0; } + if (!strcmp(var, "core.mergeprefilter")) { + core_merge_prefilter = git_config_bool(var, value); + return 0; + } + /* Add other config variables here and to Documentation/config.txt. */ return 0; } diff --git a/environment.c b/environment.c index 83d38d3..59c4515 100644 --- a/environment.c +++ b/environment.c @@ -53,6 +53,7 @@ enum object_creation_mode object_creation_mode = OBJECT_CREATION_MODE; char *notes_ref_name; int grafts_replace_parents = 1; int core_apply_sparse_checkout; +int core_merge_prefilter; /* Parallel index stat data preload? */ int core_preload_index = 0; diff --git a/ll-merge.c b/ll-merge.c index 28c6f54..8e59ea7 100644 --- a/ll-merge.c +++ b/ll-merge.c @@ -344,9 +344,11 @@ int ll_merge(mmbuffer_t *result_buf, const struct ll_merge_driver *driver; int virtual_ancestor = flag & 01; - normalize_file(ancestor, path); - normalize_file(ours, path); - normalize_file(theirs, path); + if (core_merge_prefilter) { + normalize_file(ancestor, path); + normalize_file(ours, path); + normalize_file(theirs, path); + } if (!git_path_check_merge(path, check)) { ll_driver_name = check[0].value; if (check[1].value) { diff --git a/t/t6038-merge-text-auto.sh b/t/t6038-merge-text-auto.sh index 44e6003..1f2b3a8 100755 --- a/t/t6038-merge-text-auto.sh +++ b/t/t6038-merge-text-auto.sh @@ -5,6 +5,7 @@ test_description='CRLF merge conflict across text=auto change' . ./test-lib.sh test_expect_success setup ' + git config core.mergeprefilter true && git config core.autocrlf false && echo first line | append_cr >file && git add file && -- 1.7.2.rc1.4.g09d06 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html