clone: accept DEPTH env var as fallback for --depth
PATCH 1/1 clone: accept DEPTH env var as fallback for --depth
From: h8d13 <[email protected]>
When git clone is run by a tool the user does not control directly (CI runners, package build scripts such as makepkg, or any wrapper that spawns nested clones), there is no way to request a shallow
clone: --depth only exists as a command-line option on the process that invokes git clone, and unlike url.*.insteadOf there is no configuration key that could be injected via GIT_CONFIG_* to achieve the same effect.
Teach git clone to read a DEPTH environment variable when --depth is not given on the command line. Since environment variables propagate to child processes, exporting DEPTH=1 once makes every nested clone underneath shallow, which is useful in CI pipelines and recursive build tools. An explicit --depth on the command line still takes precedence, and the value goes through the existing validation, so a non-positive DEPTH dies with the same error as a non-positive --depth.
---
clone: accept DEPTH env var as fallback for --depth
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2333%2Fh8d13%2Fdepth-env-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2333/h8d13/depth-env-v1
Pull-Request: https://github.com/git/git/pull/2333
builtin/clone.c | 6 ++++++ 1 file changed, 6 insertions(+)
builtin/clone.c +6 -0
@@ -1022,6 +1022,12 @@ int cmd_clone(int argc,usage_msg_opt (_ ("You must specify a repository to clone." ), builtin_clone_usage, builtin_clone_options); +if (!option_depth) { +const char *env_depth =getenv ("DEPTH" ); +if (env_depth && *env_depth) + option_depth =xstrdup (env_depth); + } +if (option_depth || option_since || option_not.nr) deepen =1 ;if (option_single_branch ==-1 )
base-commit: 3e65291872de10c3f0bf05ea8c24187e7a71ebf0
Signature · 1 line
gitgitgadget
builtin/clone.c int cmd_clone(int argc, · line 1026
Quoted 6 lines · On Fri Jun 12, 2026 at 9:39 PM EDT, h8d13 via GitGitGadget wrote:
builtin/clone.c +2
-0@@ -1022,6 +1022,12 @@ int cmd_clone(int argc,usage_msg_opt (_ ("You must specify a repository to clone." ), builtin_clone_usage, builtin_clone_options); +if (!option_depth) { +const char *env_depth =getenv ("DEPTH" );
Nearly all of the non-standard environment variables used by git start with "GIT_". "GIT_CLONE_DEPTH" may be a better choice.
builtin/clone.c int cmd_clone(int argc, · line 1028
Quoted 2 lines
builtin/clone.c +2
-0+if (env_depth && *env_depth) + option_depth =xstrdup (env_depth);
Following normal command-line option parsing, if --depth is given, then option_depth points to the parsed string from cmd_clone's argv array directly and is not freed. Therefore, the string copy returned via xstrdup also goes unfreed before it is lost.
One might argue this isn't very impactful, since we would expect the process to exit after git-clone completes, but there are already several explicit calls to free and related functions at the end of cmd_clone.
Quoted 7 lines
builtin/clone.c +2
-0+ } +if (option_depth || option_since || option_not.nr) deepen =1 ;if (option_single_branch ==-1 )base-commit:
3e65291872de10c3f0bf05ea8c24187e7a71ebf0
Quoted 10 lines · Matt Hunter
builtin/clone.c int cmd_clone(int argc, · line 1026
Quoted 6 lines · On Fri Jun 12, 2026 at 9:39 PM EDT, h8d13 via GitGitGadget wrote:
builtin/clone.c +2
-0@@ -1022,6 +1022,12 @@ int cmd_clone(int argc,usage_msg_opt (_ ("You must specify a repository to clone." ), builtin_clone_usage, builtin_clone_options); +if (!option_depth) { +const char *env_depth =getenv ("DEPTH" );Nearly all of the non-standard environment variables used by git start with "
GIT_". "GIT_CLONE_DEPTH" may be a better choice.
Isn't it sufficient to add a new configuration variable in the clone.* namespace? Unless there is a reason why it does not work, I won't accept a patch that adds a random environment support like this. We do not want to end up having to add other random environment variables like GIT_CLONE_DEFAULTREMOTENAME, CLONE_REJECTSHALLOW, CLONE_FILTERSUBMODULES for consistency.