repo: add path.git-prefix path key

Scripts and command-line prompt integrations frequently need to know their relative depth inside a repository working tree layout. Currently, this is retrieved using `git rev-parse --show-prefix`. Introduce the `path.git-prefix` key to `git repo info`. This mirrors the prefix location tracking framework as a standalone key, returning the exact relative path offset complete with a trailing slash, or an empty string if run directly at the repository working tree root. Mentored-by: Justin Tobler <jltobler@gmail.com> Mentored-by: Lucas Seiki Oshiro <lucasseikioshiro@gmail.com> Signed-off-by: K Jayatheerth <jayatheerthkulkarni2005@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

K Jayatheerth committed Jul 26, 2026 at 16:13 UTC 2cd8dac1317fcfea82ca8c65c54fa31cf0fd4928
3 files changed +35
Documentation/git-repo.adoc
+5
@@ -113,6 +113,11 @@ values that they return:
113 The path to the Git repository's common directory relative to
114 the current working directory.
115
116 +`path.git-prefix`::
117 + The relative path from the top-level directory of the working tree to
118 + the current working directory (including a trailing slash). Outputs an
119 + empty string if executed at the root of the working tree.
120 +
121 `path.gitdir.absolute`::
122 The canonical absolute path to the Git repository directory (the `.git` directory).
123
builtin/repo.c
+11
@@ -100,6 +100,16 @@ static int get_path_commondir_relative(struct repository *repo, struct strbuf *b
100 return 0;
101 }
102
103 +static int get_path_git_prefix(struct repository *repo UNUSED, struct strbuf *buf)
104 +{
105 + /*
106 + * startup_info->prefix is NULL if we are at the working tree root.
107 + * We add an empty string to ensure the buffer is cleanly initialized.
108 + */
109 + strbuf_addstr(buf, startup_info->prefix ? startup_info->prefix : "");
110 + return 0;
111 +}
112 +
113 static int get_path_gitdir_absolute(struct repository *repo, struct strbuf *buf)
114 {
115 const char *git_dir = repo_get_git_dir(repo);
@@ -278,6 +288,7 @@ static const struct repo_info_field repo_info_field[] = {
288 { "object.format", get_object_format },
289 { "path.commondir.absolute", get_path_commondir_absolute },
290 { "path.commondir.relative", get_path_commondir_relative },
291 + { "path.git-prefix", get_path_git_prefix },
292 { "path.gitdir.absolute", get_path_gitdir_absolute },
293 { "path.gitdir.relative", get_path_gitdir_relative },
294 { "path.grafts.absolute", get_path_grafts_absolute },
t/t1900-repo-info.sh
+19
@@ -207,6 +207,25 @@ test_repo_info_path 'commondir with only GIT_DIR' 'commondir' \
207 '.git' \
208 'GIT_DIR="../.git" && export GIT_DIR'
209
210 +test_expect_success 'path.git-prefix at root and in a subdirectory' '
211 + test_when_finished "rm -rf repo" &&
212 + git init repo &&
213 + (
214 + cd repo &&
215 +
216 + echo "path.git-prefix=" >expect.root &&
217 + git repo info path.git-prefix >actual.root &&
218 + test_cmp expect.root actual.root &&
219 +
220 + mkdir -p sub/dir &&
221 + cd sub/dir &&
222 +
223 + echo "path.git-prefix=sub/dir/" >expect.sub &&
224 + git repo info path.git-prefix >actual.sub &&
225 + test_cmp expect.sub actual.sub
226 + )
227 +'
228 +
229 test_repo_info_path 'gitdir standard' 'gitdir' '.git'
230
231 test_repo_info_path 'gitdir with explicit GIT_DIR' 'gitdir' \