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' \