Skip to content

Commit 93310f0

Browse files
committed
setup: opt-out of check with safe.directory=*
With the addition of the safe.directory in 8959555 (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 <[email protected]>
1 parent 5d60f3c commit 93310f0

File tree

3 files changed

+21
-2
lines changed

3 files changed

+21
-2
lines changed

Documentation/config/safe.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,10 @@ Unix' simpler permission model, it can be a bit tricky to figure out why
2525
a directory is considered unsafe. To help with this, Git will provide
2626
more detailed information when the environment variable
2727
`GIT_TEST_DEBUG_UNSAFE_DIRECTORIES` is set to `true`.
28+
+
29+
To completely opt-out of this security check, set `safe.directory` to the
30+
string `*`. This will allow all repositories to be treated as if their
31+
directory was listed in the `safe.directory` list. If `safe.directory=*`
32+
is set in system config and you want to re-enable this protection, then
33+
initialize your list with an empty value before listing the repositories
34+
that you deem safe.

setup.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,9 +1103,11 @@ static int safe_directory_cb(const char *key, const char *value, void *d)
11031103
if (strcmp(key, "safe.directory"))
11041104
return 0;
11051105

1106-
if (!value || !*value)
1106+
if (!value || !*value) {
11071107
data->is_safe = 0;
1108-
else {
1108+
} else if (!strcmp(value, "*")) {
1109+
data->is_safe = 1;
1110+
} else {
11091111
const char *interpolated = NULL;
11101112

11111113
if (!git_config_pathname(&interpolated, key, value) &&

t/t0033-safe-directory.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,14 @@ test_expect_success 'safe.directory matches, but is reset' '
3636
expect_rejected_dir
3737
'
3838

39+
test_expect_success 'safe.directory=*' '
40+
git config --global --add safe.directory "*" &&
41+
git status
42+
'
43+
44+
test_expect_success 'safe.directory=*, but is reset' '
45+
git config --global --add safe.directory "" &&
46+
expect_rejected_dir
47+
'
48+
3949
test_done

0 commit comments

Comments
 (0)