add core.usereplacerefs config option
authorJeff King <peff@peff.net>
Wed, 18 Jul 2018 20:45:25 +0000 (16:45 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 18 Jul 2018 22:45:27 +0000 (15:45 -0700)
We can already disable replace refs using a command line
option or environment variable, but those are awkward to
apply universally. Let's add a config option to do the same
thing.

That raises the question of why one might want to do so
universally. The answer is that replace refs violate the
immutability of objects. For instance, if you wanted to
cache the diff between commit XYZ and its parent, then in
theory that never changes; the hash XYZ represents the total
state. But replace refs violate that; pushing up a new ref
may create a completely new diff.

The obvious "if it hurts, don't do it" answer is not to
create replace refs if you're doing this kind of caching.
But for a site hosting arbitrary repositories, they may want
to allow users to share replace refs with each other, but
not actually respect them on the site (because the caching
is more important than the replace feature).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config.txt
config.c
t/t6050-replace.sh
index a32172a43c7369d0fff2a0a0ad32f6fde07149bf..bcf3d21ecb2aa7a2d78d5e9eca82fe1e4e88b5a9 100644 (file)
@@ -911,6 +911,11 @@ core.commitGraph::
        Enable git commit graph feature. Allows reading from the
        commit-graph file.
 
+core.useReplaceRefs::
+       If set to `false`, behave as if the `--no-replace-objects`
+       option was given on the command line. See linkgit:git[1] and
+       linkgit:git-replace[1] for more information.
+
 core.sparseCheckout::
        Enable "sparse checkout" feature. See section "Sparse checkout" in
        linkgit:git-read-tree[1] for more information.
index 7968ef7566a1fc28c5d8e2ba99ae87c52fe23ece..5c6d8d17dd6d5321b28d6f4951c241d38b73af15 100644 (file)
--- a/config.c
+++ b/config.c
@@ -1347,6 +1347,11 @@ static int git_default_core_config(const char *var, const char *value)
                                         var, value);
        }
 
+       if (!strcmp(var, "core.usereplacerefs")) {
+               read_replace_refs = git_config_bool(var, value);
+               return 0;
+       }
+
        /* Add other config variables here and to Documentation/config.txt. */
        return 0;
 }
index aa3e24963967ba4be2394ceeab26f8317fb31b4b..86374a9c52c0bd26a8ba7223526c9e1f128f468a 100755 (executable)
@@ -113,6 +113,12 @@ test_expect_success 'test GIT_NO_REPLACE_OBJECTS env variable' '
      GIT_NO_REPLACE_OBJECTS=1 git show $HASH2 | grep "A U Thor"
 '
 
+test_expect_success 'test core.usereplacerefs config option' '
+       test_config core.usereplacerefs false &&
+       git cat-file commit $HASH2 | grep "author A U Thor" &&
+       git show $HASH2 | grep "A U Thor"
+'
+
 cat >tag.sig <<EOF
 object $HASH2
 type commit