It was rumored that in an unspecified workflow it is common to
create what Kernel folks call "crazy" and "insane" merges of two
unrelated histories, and having to give --allow-unrelated-histories
option every time is cumbersome.

Just in case the rumor will substanticated with a proper rationale
in the future, prepare a change to allow disabling the safety by
default.

Signed-off-by: Junio C Hamano <gits...@pobox.com>
---
 Documentation/git.txt          |  4 ++++
 Documentation/merge-config.txt |  7 +++++++
 builtin/merge.c                |  3 +++
 t/t3033-merge-toplevel.sh      | 29 +++++++++++++++++++++++++++++
 t/t5521-pull-options.sh        |  9 ++++++++-
 5 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/Documentation/git.txt b/Documentation/git.txt
index 5c9380d..f2edac1 100644
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -1140,6 +1140,10 @@ of clones and fetches.
 
 'GIT_MERGE_ALLOW_UNRELATED_HISTORIES'::
        Allow "git merge" to merge unrelated histories by default.
+       It is recommended that a script that regularly wants to
+       create such a merge to set and export this environment
+       variable upfront, instead of forcing its users to set
+       merge.allowunrelatedhistories configuration variable.
 
 
 Discussion[[Discussion]]
diff --git a/Documentation/merge-config.txt b/Documentation/merge-config.txt
index 002ca58..8b3d14b 100644
--- a/Documentation/merge-config.txt
+++ b/Documentation/merge-config.txt
@@ -47,6 +47,13 @@ merge.stat::
        Whether to print the diffstat between ORIG_HEAD and the merge result
        at the end of the merge.  True by default.
 
+merge.allowUnrelatedhistories::
+       Setting this option to true (false) makes `git merge` and `git
+       pull` to pretend as if the `--allow-unrelated-histories`
+       (`--no-allow-unrelated-histories`) option was given from the
+       command line.  The configuration is ignored when one of these
+       options is explicitly given from the command line.
+
 merge.tool::
        Controls which merge tool is used by linkgit:git-mergetool[1].
        The list below shows the valid built-in values.
diff --git a/builtin/merge.c b/builtin/merge.c
index 4e8b1a1..e979c68 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -583,6 +583,9 @@ static int git_merge_config(const char *k, const char *v, 
void *cb)
        } else if (!strcmp(k, "commit.gpgsign")) {
                sign_commit = git_config_bool(k, v) ? "" : NULL;
                return 0;
+       } else if (!strcmp(k, "merge.allowunrelatedhistories")) {
+               allow_unrelated_histories = git_config_bool(k, v);
+               return 0;
        }
 
        status = fmt_merge_msg_config(k, v, cb);
diff --git a/t/t3033-merge-toplevel.sh b/t/t3033-merge-toplevel.sh
index d314599..583b837 100755
--- a/t/t3033-merge-toplevel.sh
+++ b/t/t3033-merge-toplevel.sh
@@ -149,4 +149,33 @@ test_expect_success 'two-project merge with 
--allow-unrelated-histories' '
        git diff --exit-code five
 '
 
+test_expect_success 'two-project merge with merge.allowunrelatedhistories' '
+       t3033_reset &&
+
+       # make sure configuration parser works
+       git reset --hard four &&
+       test_config merge.allowunrelatedhistories notabool &&
+       test_must_fail git merge . HEAD &&
+
+       # disabled explicitly and redundantly by configuration
+       git reset --hard four &&
+       test_config merge.allowunrelatedhistories false &&
+       test_must_fail git merge five &&
+
+       # disabled explicitly by configuration, overridden by command line
+       git reset --hard four &&
+       test_config merge.allowunrelatedhistories false &&
+       git merge --allow-unrelated-histories five &&
+
+       # enabled by configuration but explicitly disabled
+       git reset --hard four &&
+       test_config merge.allowunrelatedhistories true &&
+       test_must_fail git merge --no-allow-unrelated-histories five &&
+
+       # enabled by configuration
+       git reset --hard four &&
+       test_config merge.allowunrelatedhistories true &&
+       git merge five
+'
+
 test_done
diff --git a/t/t5521-pull-options.sh b/t/t5521-pull-options.sh
index ded8f98..50f0887 100755
--- a/t/t5521-pull-options.sh
+++ b/t/t5521-pull-options.sh
@@ -161,7 +161,14 @@ test_expect_success 'git pull --allow-unrelated-histories' 
'
        (
                cd dst &&
                test_must_fail git pull ../src side &&
-               git pull --allow-unrelated-histories ../src side
+               git pull --allow-unrelated-histories ../src side &&
+
+               git reset --hard one &&
+               git config merge.allowunrelatedhistories no &&
+               test_must_fail git pull ../src side &&
+               git config merge.allowunrelatedhistories yes &&
+               test_must_fail git pull --no-allow-unrelated-histories ../src 
side &&
+               git pull ../src side
        )
 '
 
-- 
2.8.1-422-g6d9b748

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to