]> git.ipfire.org Git - thirdparty/git.git/commitdiff
setup: opt-out of check with safe.directory=*
authorDerrick Stolee <derrickstolee@github.com>
Wed, 13 Apr 2022 15:32:31 +0000 (15:32 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 13 Apr 2022 19:42:51 +0000 (12:42 -0700)
With the addition of the safe.directory in 8959555ce
(setup_git_directory(): add an owner check for the top-level directory,
2022-03-02) released in v2.35.2, we are receiving feedback from a
variety of users about the feature.

Some users have a very large list of shared repositories and find it
cumbersome to add this config for every one of them.

In a more difficult case, certain workflows involve running Git commands
within containers. The container boundary prevents any global or system
config from communicating `safe.directory` values from the host into the
container. Further, the container almost always runs as a different user
than the owner of the directory in the host.

To simplify the reactions necessary for these users, extend the
definition of the safe.directory config value to include a possible '*'
value. This value implies that all directories are safe, providing a
single setting to opt-out of this protection.

Note that an empty assignment of safe.directory clears all previous
values, and this is already the case with the "if (!value || !*value)"
condition.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/safe.txt
setup.c
t/t0033-safe-directory.sh

index 63597b2df8f80f543efad8ba6f6bb784bbc895dc..6d764fe0ccf3a87dbfeb34da03b7e1dcb380ac99 100644 (file)
@@ -19,3 +19,10 @@ line option `-c safe.directory=<path>`.
 The value of this setting is interpolated, i.e. `~/<path>` expands to a
 path relative to the home directory and `%(prefix)/<path>` expands to a
 path relative to Git's (runtime) prefix.
++
+To completely opt-out of this security check, set `safe.directory` to the
+string `*`. This will allow all repositories to be treated as if their
+directory was listed in the `safe.directory` list. If `safe.directory=*`
+is set in system config and you want to re-enable this protection, then
+initialize your list with an empty value before listing the repositories
+that you deem safe.
diff --git a/setup.c b/setup.c
index 4b9f073617c2c67db178ee3d8cc8d0755cd97c1f..aad9ace0af97efe342383616b2d800f226df0f4a 100644 (file)
--- a/setup.c
+++ b/setup.c
@@ -1037,9 +1037,11 @@ static int safe_directory_cb(const char *key, const char *value, void *d)
        if (strcmp(key, "safe.directory"))
                return 0;
 
-       if (!value || !*value)
+       if (!value || !*value) {
                data->is_safe = 0;
-       else {
+       } else if (!strcmp(value, "*")) {
+               data->is_safe = 1;
+       } else {
                const char *interpolated = NULL;
 
                if (!git_config_pathname(&interpolated, key, value) &&
index 6f33c0dfefaaf30264c903274dd60c7243d92418..239d93f4d21141f5991f9fb409a4675ece0f98bd 100755 (executable)
@@ -36,4 +36,14 @@ test_expect_success 'safe.directory matches, but is reset' '
        expect_rejected_dir
 '
 
+test_expect_success 'safe.directory=*' '
+       git config --global --add safe.directory "*" &&
+       git status
+'
+
+test_expect_success 'safe.directory=*, but is reset' '
+       git config --global --add safe.directory "" &&
+       expect_rejected_dir
+'
+
 test_done