Skip to content

repo info: add category/path keys and --path-format#2208

Open
eslam-reda-div wants to merge 6 commits intogit:masterfrom
eslam-reda-div:gsoc-contribute
Open

repo info: add category/path keys and --path-format#2208
eslam-reda-div wants to merge 6 commits intogit:masterfrom
eslam-reda-div:gsoc-contribute

Conversation

@eslam-reda-div
Copy link

@eslam-reda-div eslam-reda-div commented Feb 21, 2026

This series now focuses only on git repo info improvements.

It introduces category-aware key requests, adds path-oriented keys (path.*), and adds --path-format=(absolute|relative) so scripts can request stable path rendering behavior.

What this PR does

For git repo info, this series:

  • introduces explicit repo_info context plumbing,
  • adds category-key expansion (for example, layout expands to layout.*),
  • adds path-oriented keys (path.*) for common repository locations,
  • adds --path-format=(absolute|relative) to control path output style.

Tests and documentation are updated accordingly.

What this PR does NOT do

  • No git repo structure feature changes.
  • No t1901 structure test changes.
  • No structure metrics/docs additions.

Key naming/scope adjustments from review

  • renamed path.git-prefix to path.prefix,
  • added path.working-tree (alias for path.toplevel),
  • removed file-layout-oriented keys:
    • path.logs-directory
    • path.packed-refs-file
    • path.refs-directory
    • path.shallow-file
  • for bare repositories, work-tree style keys return empty values.

Commit structure

  • repo: introduce repo_info context plumbing
  • repo: support category requests in repo info
  • repo: add path keys to repo info
  • repo: add --path-format for info path output
  • t1900: cover repo info path keys and path-format
  • docs: describe repo info path keys

All commits are signed off with the same real-name identity.

Changes since previous revision

  • dropped all repo structure code/tests/docs from this branch,
  • split context plumbing and category expansion into separate commits,
  • rebased and cleaned history to avoid fix-on-fix commits,
  • aligned key naming/scope with review feedback.

Validation

Focused (Linux Docker):

  • make -C t test T=t1900-repo.sh → passed (53/53)

cc: Phillip Wood phillip.wood123@gmail.com
cc: Lucas Seiki Oshiro lucasseikioshiro@gmail.com

@gitgitgadget-git
Copy link

Welcome to GitGitGadget

Hi @eslam-reda-div, and welcome to GitGitGadget, the GitHub App to send patch series to the Git mailing list from GitHub Pull Requests.

Please make sure that either:

  • Your Pull Request has a good description, if it consists of multiple commits, as it will be used as cover letter.
  • Your Pull Request description is empty, if it consists of a single commit, as the commit message should be descriptive enough by itself.

You can CC potential reviewers by adding a footer to the PR description with the following syntax:

CC: Revi Ewer <revi.ewer@example.com>, Ill Takalook <ill.takalook@example.net>

NOTE: DO NOT copy/paste your CC list from a previous GGG PR's description,
because it will result in a malformed CC list on the mailing list. See
example.

Also, it is a good idea to review the commit messages one last time, as the Git project expects them in a quite specific form:

  • the lines should not exceed 76 columns,
  • the first line should be like a header and typically start with a prefix like "tests:" or "revisions:" to state which subsystem the change is about, and
  • the commit messages' body should be describing the "why?" of the change.
  • Finally, the commit messages should end in a Signed-off-by: line matching the commits' author.

It is in general a good idea to await the automated test ("Checks") in this Pull Request before contributing the patches, e.g. to avoid trivial issues such as unportable code.

Contributing the patches

Before you can contribute the patches, your GitHub username needs to be added to the list of permitted users. Any already-permitted user can do that, by adding a comment to your PR of the form /allow. A good way to find other contributors is to locate recent pull requests where someone has been /allowed:

Both the person who commented /allow and the PR author are able to /allow you.

An alternative is the channel #git-devel on the Libera Chat IRC network:

<newcontributor> I've just created my first PR, could someone please /allow me? https://github.com/gitgitgadget/git/pull/12345
<veteran> newcontributor: it is done
<newcontributor> thanks!

Once on the list of permitted usernames, you can contribute the patches to the Git mailing list by adding a PR comment /submit.

If you want to see what email(s) would be sent for a /submit request, add a PR comment /preview to have the email(s) sent to you. You must have a public GitHub email address for this. Note that any reviewers CC'd via the list in the PR description will not actually be sent emails.

After you submit, GitGitGadget will respond with another comment that contains the link to the cover letter mail in the Git mailing list archive. Please make sure to monitor the discussion in that thread and to address comments and suggestions (while the comments and suggestions will be mirrored into the PR by GitGitGadget, you will still want to reply via mail).

If you do not want to subscribe to the Git mailing list just to be able to respond to a mail, you can download the mbox from the Git mailing list archive (click the (raw) link), then import it into your mail program. If you use GMail, you can do this via:

curl -g --user "<EMailAddress>:<Password>" \
    --url "imaps://imap.gmail.com/INBOX" -T /path/to/raw.txt

To iterate on your change, i.e. send a revised patch or patch series, you will first want to (force-)push to the same branch. You probably also want to modify your Pull Request description (or title). It is a good idea to summarize the revision by adding something like this to the cover letter (read: by editing the first comment on the PR, i.e. the PR description):

Changes since v1:
- Fixed a typo in the commit message (found by ...)
- Added a code comment to ... as suggested by ...
...

To send a new iteration, just add another PR comment with the contents: /submit.

Need help?

New contributors who want advice are encouraged to join git-mentoring@googlegroups.com, where volunteers who regularly contribute to Git are willing to answer newbie questions, give advice, or otherwise provide mentoring to interested contributors. You must join in order to post or view messages, but anyone can join.

You may also be able to find help in real time in the developer IRC channel, #git-devel on Libera Chat. Remember that IRC does not support offline messaging, so if you send someone a private message and log out, they cannot respond to you. The scrollback of #git-devel is archived, though.

@gitgitgadget-git
Copy link

There are issues in commit 0d44f60:
refactor: enhance repo info command with path-related keys and statistics

  • Commit not signed off
  • Lines in the body of the commit messages should be wrapped between 60 and 76 characters.
    Indented lines, and lines without whitespace, are exempt

@dscho
Copy link
Member

dscho commented Feb 21, 2026

/allow

@gitgitgadget-git
Copy link

User eslam-reda-div is now allowed to use GitGitGadget.

WARNING: eslam-reda-div has no public email address set on GitHub; GitGitGadget needs an email address to Cc: you on your contribution, so that you receive any feedback on the Git mailing list. Go to https://github.com/settings/profile to make your preferred email public to let GitGitGadget know which email address to use.

Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR enhances git repo info and git repo structure commands with improved path reporting and deeper repository statistics inspired by git-sizer.

Changes:

  • Removes reliance on global repository state in git repo info by introducing a repo_info structure that explicitly passes repository context
  • Adds category key support (e.g., layout, path) and new path-related keys with --path-format=(absolute|relative) option
  • Extends git repo structure with comprehensive metrics including max object sizes, max commit parent count, max tree entries, max blob path length/depth, and max annotated tag chain depth

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

File Description
builtin/repo.c Refactors info command to remove global state, adds path keys and formatting, implements new structure statistics computation
t/t1900-repo.sh Adds comprehensive tests for path keys, category keys, and path format options
t/t1901-repo-structure.sh Adds test helpers and expectations for new structure metrics
Documentation/git-repo.adoc Documents new path keys, category key syntax, and extended structure metrics

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

builtin/repo.c Outdated
Comment on lines +1005 to +1006
if ((uintmax_t)disk > max_disk)
max_disk = disk;
Copy link

Copilot AI Feb 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The cast to uintmax_t at line 1005 is inconsistent with the comparison at line 1003. The variable disk is of type off_t (which is typically signed) and max_disk is of type size_t (unsigned). The cast appears to be an attempt to handle potential sign issues, but it's inconsistent with how inflated (unsigned long) is handled at line 1003.

For consistency and correctness, either both comparisons should use casts, or neither should. Since disk sizes should never be negative, consider either: (1) casting disk to size_t directly for the comparison, or (2) removing the cast if off_t and size_t comparison is safe on all platforms.

Suggested change
if ((uintmax_t)disk > max_disk)
max_disk = disk;
if ((size_t)disk > max_disk)
max_disk = (size_t)disk;

Copilot uses AI. Check for mistakes.
@eslam-reda-div
Copy link
Author

@dscho

Could you please review this when you have time?
If there are any issues or changes needed, let me know so I can work on them right away.

@dscho
Copy link
Member

dscho commented Feb 22, 2026

Could you please review this when you have time?

Thank you for reaching out. I do not really have time to do a proper review and as explained in #2208 (comment), the process of the Git project is completely outside of GitHub. Reviews happen on the Git mailing list.

As such, I would encourage you to just /submit your work. If you're unsure whether it will arrive correctly, use the /preview command first.

There's just one thing that immediately jumped to my eye and that's in the sign-off by it line. You use not your real name but a handle before the email address. The Git project is very very particular about this and wants the real name to appear there. You might want to write it out. For the record, I always enjoy seeing names the require Unicode; The Git project has a massive over-representation of people whose names can be written in plain 7-bit ASCII (like mine).

@flakoe046-art
Copy link

This series improves git repo info and git repo structure.

For git repo info, it:

  • removes reliance on global repository state in this command path
  • supports category keys (e.g. layout, path)
  • adds rev-parse-like path keys and git-path-derived keys
  • adds --path-format=(absolute|relative) for path output control

For git repo structure, it adds deeper repository metrics inspired by git-sizer:

  • max inflated and max disk size per object type
  • max commit parent count
  • max tree entry count
  • max blob path length/depth
  • max annotated tag chain depth
  • aggregate keyvalue/nul totals and maxima

Tests and docs are updated accordingly.

Validation:

  • t/t1900-repo.sh
  • t/t1901-repo-structure.sh
  • full make -j4 test in Docker (failed 0)

CC: Karthik Nayak karthik.188@gmail.com, Justin Tobler jltobler@gmail.com, Ayush Chandekar ayu.chandekar@gmail.com, Siddharth Asthana siddharthasthana31@gmail.com, Lucas Seiki Oshiro lucasseikioshiro@gmail.com

Copy link
Member

@dscho dscho left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@eslam-reda-div okay, I just stumbled over the CI failures and cannot help it, I've gotta assist you. The Git project could be a lot friendlier to newcomers by providing excellent error message in the CI build failures. Essentially there are two classes of problems here.

One is the hard coding of the SHA-1, where SHA-256 is slated to become the default in Git v3.0:

@@ -1,3 +1,3 @@
  -object.format=sha1
  +object.format=sha256
   layout.bare=false
   layout.shallow=false
  error: last command exited with $?=1
  not ok 28 - mixed key/category requests preserve request order

The other one is a subtle issue on macOS where the wc tool deviates from the GNU variant of the same tool. The BSD variant, which is used on MacOS, adds some white space:

@@ -25,7 +25,7 @@
   objects.blobs.max_disk_size=20
   objects.tags.max_disk_size=127
   objects.commits.max_parent_count=1
  -objects.trees.max_entry_count=      42
  +objects.trees.max_entry_count=42
   objects.blobs.max_path_length=4
   objects.blobs.max_path_depth=1
   objects.tags.max_chain_depth=1
  error: last command exited with $?=1

t/t1900-repo.sh Outdated

test_expect_success 'mixed key/category requests preserve request order' '
cat >expect <<-\EOF &&
object.format=sha1
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You will want to replace this with $(test_oid algo) (need to remove the backslash from \EOF for that), just like e.g. https://github.com/git/git/blob/v2.53.0/t/t1050-large.sh#L179

test "$entries" -gt "$max" && max=$entries
done

echo "$max"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You will want to lose the quotes, to avoid running into the extra white-space produced by the BSD variant of wc (which is used on macOS).

@eslam-reda-div
Copy link
Author

Thank you for the feedback.
I’ll make these changes right away and open a new pull request, making sure everything works correctly and can be applied directly.

Thanks again for your time and guidance.

@dscho
Copy link
Member

dscho commented Feb 22, 2026

Thank you for the feedback.

You're welcome!

I’ll make these changes right away and open a new pull request, making sure everything works correctly and can be applied directly.

Please take your time, there's no rush. And please just force-push the branch, do not open a new Pull Request (it's unnecessary).

@eslam-reda-div
Copy link
Author

/submit

@gitgitgadget-git
Copy link

Submitted as pull.2208.git.git.1771784936.gitgitgadget@gmail.com

To fetch this version into FETCH_HEAD:

git fetch https://github.com/gitgitgadget/git/ pr-git-2208/eslam-reda-div/gsoc-contribute-v1

To fetch this version to local tag pr-git-2208/eslam-reda-div/gsoc-contribute-v1:

git fetch --no-tags https://github.com/gitgitgadget/git/ tag pr-git-2208/eslam-reda-div/gsoc-contribute-v1

@@ -8,7 +8,7 @@ git-repo - Retrieve information about the repository
SYNOPSIS

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lucas Seiki Oshiro wrote on the Git mailing list (how to reply to this email):

> and additional git-path based locations.

This statement is too vague. Each one of the covered key-value pairs
needs to be mentioned and discussed about why they are being added.

> Extend git repo structure with deeper repository metrics inspired by
> git-sizer, including per-type maximum inflated and on-disk object sizes,
> maximum commit parent count, maximum tree entry count, longest/deepest
> blob path, and deepest annotated tag chain.

This patch is doing too much. It needs to be broken, at least, into 20
smaller patches, one per git-repo-info and git-repo-structure key.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the detailed feedback.

I will start right away on preparing a thorough and detailed explanation for each key that was added, clearly describing what it does and the specific reason for introducing it. I’ll make sure every addition is properly justified and documented.

Regarding the patch structure, would it be acceptable to keep it as a single series without splitting it into many smaller patches? I completely understand the concern, but since the changes are closely related, I’m hoping it might still be reasonable to keep them grouped.

That said, I’m fully prepared to follow the recommended approach if splitting is strictly required. I’m ready to put in the work and will begin refining the explanations immediately.

Thank you again for your guidance.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@eslam-reda-div please note that this reply should not be sent as a PR comment, but instead as an email.

git init category-layout &&
git -C category-layout repo info layout >actual &&
test_cmp expect actual
'

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lucas Seiki Oshiro wrote on the Git mailing list (how to reply to this email):

> From: Eslam reda ragheb <eslam.reda.div@gmail.com>
> 
> Signed-off-by: Eslam reda ragheb <eslam.reda.div@gmail.com>

Missing patch message.

> test_expect_success 'mixed key/category requests preserve request order' '
> - cat >expect <<-\EOF &&
> - object.format=sha1
> + cat >expect <<-EOF &&
> + object.format=$(test_oid algo)

Don't send patches fixing the code you have just added. Instead, rewrite
the history applying the fix to the original patch.

@gitgitgadget-git
Copy link

Junio C Hamano wrote on the Git mailing list (how to reply to this email):

"eslam reda via GitGitGadget" <gitgitgadget@gmail.com> writes:

> Eslam reda ragheb (2):
>   t1900,t1901: make repo tests hash-agnostic and wc-portable
>   t1900,t1901: fix test portability issues
>
> eslam-reda-div (1):
>   repo: extend info paths and structure statistics

I do not think you meant to send a patch seriees with these two same
but different looking folks claiming authorship.

I'll let the main change 1/3 reviewed and commented on those who are
more invested into "git repo", but both [2/3] and [3/3] need to sell
themselves with a more meaningful proposed log messages.

I think the test updates in [2/3] are all good things to do---they
make the test more robust against changes in the hash algorithm
used, what the history left by the previous test steps exactly have,
etc., by avoiding hardcoded constants in the expectation.  And in
light of that, I do not think [3/3] is a good change, especially
without explanation of why we may want to use hardcoded numbres.

Thanks.

@@ -8,7 +8,7 @@ git-repo - Retrieve information about the repository
SYNOPSIS

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Justin Tobler wrote on the Git mailing list (how to reply to this email):

On 26/02/22 06:28PM, eslam-reda-div via GitGitGadget wrote:
> From: eslam-reda-div <eslam.reda.div@gmail.com>
> 
> Improve git repo info by adding path-oriented keys that match values
> users currently obtain from git rev-parse, including common directory,
> git directory, top-level, superproject working tree, and additional
> git-path based locations.
> 
> Teach git repo info to accept category keys like layout and path,
> and add --path-format=(absolute|relative) so scripts can request the
> desired path style explicitly. The command now uses repository context
> passed to the command path instead of relying on global state.
> 
> Extend git repo structure with deeper repository metrics inspired by
> git-sizer, including per-type maximum inflated and on-disk object sizes,
> maximum commit parent count, maximum tree entry count, longest/deepest
> blob path, and deepest annotated tag chain.

Hello,

Just FYI, there is already a series on the list I'm currently working on
that is extending the "structure" output for git-repo [1] similar to
what is being done here. This series collects largest inflated object
info, max commit parents, and max tree entries. It does look like this
series is collecting a couple of other data points too, but maybe we
could do so it a separate followup series to the one I'm working on? :)

Thanks,
-Justin

[1]: https://lore.kernel.org/git/20260203221758.1164434-1-jltobler@gmail.com/

@gitgitgadget-git
Copy link

There is an issue in commit 2afb987:
repo: teach info context and category keys

  • Lines in the body of the commit messages should be wrapped between 60 and 76 characters.
    Indented lines, and lines without whitespace, are exempt

@gitgitgadget-git
Copy link

There is an issue in commit 0239b23:
repo: add path keys to repo info

  • Lines in the body of the commit messages should be wrapped between 60 and 76 characters.
    Indented lines, and lines without whitespace, are exempt

@gitgitgadget-git
Copy link

There is an issue in commit 0a43ed7:
repo: add --path-format for info path output

  • Lines in the body of the commit messages should be wrapped between 60 and 76 characters.
    Indented lines, and lines without whitespace, are exempt

@gitgitgadget-git
Copy link

There is an issue in commit 983659f:
repo: add structure max object size metrics

  • Lines in the body of the commit messages should be wrapped between 60 and 76 characters.
    Indented lines, and lines without whitespace, are exempt

@gitgitgadget-git
Copy link

There is an issue in commit e327700:
repo: add structure topology and path-depth metrics

  • Lines in the body of the commit messages should be wrapped between 60 and 76 characters.
    Indented lines, and lines without whitespace, are exempt

@eslam-reda-div
Copy link
Author

/submit

@gitgitgadget-git
Copy link

Error: a2a6768 was already submitted

@eslam-reda-div
Copy link
Author

Hi @dscho,

First of all, I’d like to warmly welcome you and apologize for any inconvenience I might have caused—I hope I haven’t been a bother. I’ve made all the requested changes and improvements, and I’ve resubmitted everything. All the adjustments should now be included.

I just wanted to kindly ask what the expected timeframe might be for receiving feedback or a decision, as I truly hope my contribution will be accepted. I’m fully ready to make any further updates if needed.

Thank you very much for your time and guidance.

@dscho
Copy link
Member

dscho commented Feb 25, 2026

It's common for contributors to reply on the list with a gentle "ping" after 2-4 weeks...

@eslam-reda-div
Copy link
Author

/submit

@gitgitgadget-git
Copy link

Submitted as pull.2208.v4.git.git.1772140487.gitgitgadget@gmail.com

To fetch this version into FETCH_HEAD:

git fetch https://github.com/gitgitgadget/git/ pr-git-2208/eslam-reda-div/gsoc-contribute-v4

To fetch this version to local tag pr-git-2208/eslam-reda-div/gsoc-contribute-v4:

git fetch --no-tags https://github.com/gitgitgadget/git/ tag pr-git-2208/eslam-reda-div/gsoc-contribute-v4

@@ -22,7 +22,12 @@ static const char *const repo_usage[] = {
NULL

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Junio C Hamano wrote on the Git mailing list (how to reply to this email):

"Eslam reda ragheb via GitGitGadget" <gitgitgadget@gmail.com>
writes:

> From: Eslam reda ragheb <eslam.reda.div@gmail.com>
>
> Introduce an explicit repo_info context for the repo info codepath
> and thread it through value lookups and field printing.
>
> This removes direct coupling from these helpers to ad-hoc
> repository globals and makes key retrieval logic easier to extend
> safely.

The above makes it sound as if you are improving existing code where
existing helper functions are already making ad-hoc and unsafe
access to global variables, but I somehow doubt that is what is
happening here.

What does "these helpers" exactly refer to in this sentence?  The
ones you will introduce in patch 02/10?

    Currently helper functions of get_value_fn type receives the
    output buffer and repository instance as parameters, but we are
    about to teach "repo info" to retrieve information that requires
    to know more than just the repository (e.g., the prefix given
    when the command was invoked).  Introduce a new "repo_info"
    structure and update get_value_fn to take it as a parameter.

or something?

> Also teach git repo info to accept category names (for example,
> layout) and expand them to matching key.* entries in request
> order.

That smells like an unrelated change.  Wouldn't it better to do so
in a subsequent patch, so that each step will concentrate on doing
one thing and one thing well?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the detailed feedback.

You are right: that wording is imprecise. In the next reroll I will rewrite the commit message to describe the change mechanically and explicitly (introducing a repo_info context so get_value_fn can access more than the repository, such as invocation prefix), without implying existing unsafe global usage.

You are also right that category expansion should be separated. I will split it into its own patch so each commit does one focused thing.

@@ -1,10 +1,12 @@
#define USE_THE_REPOSITORY_VARIABLE

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Junio C Hamano wrote on the Git mailing list (how to reply to this email):

"Eslam reda ragheb via GitGitGadget" <gitgitgadget@gmail.com>
writes:

> From: Eslam reda ragheb <eslam.reda.div@gmail.com>
>
> Add a path category to git repo info with key-value pairs that
> mirror repository paths users commonly retrieve via rev-parse and
> git-path lookups.
> ...
> +static int get_path_git_prefix(struct repo_info *info, struct strbuf *buf)
> +{
> +	if (info->prefix)
> +		strbuf_addstr(buf, info->prefix);
> +	return 0;
> +}

Can (info->prefix && info->prefix[0] == '\0') be possible?  If so,
"repo info path.git-prefix" would not be able to help users who want
to know between (info->prefix == NULL) and info->prefix being an
empty string.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you, good catch.

I updated this so prefix handling is normalized in the context setup, and path.prefix now has stable behavior instead of depending on nullable handling in the getter. This avoids ambiguity in behavior around absent prefix vs empty prefix and makes the output contract clearer.

@@ -1,10 +1,12 @@
#define USE_THE_REPOSITORY_VARIABLE

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Phillip Wood wrote on the Git mailing list (how to reply to this email):

Hi Eslam

On 26/02/2026 21:14, Eslam reda ragheb via GitGitGadget wrote:
> From: Eslam reda ragheb <eslam.reda.div@gmail.com>
> > Add a path category to git repo info with key-value pairs that
> mirror repository paths users commonly retrieve via rev-parse and
> git-path lookups.

I think that makes sense, I'm not sure about some of the paths though, see below.

> This makes scripting against repo metadata more direct and avoids
> shelling out to multiple commands for related paths.

You can get more than one path at a time from "git rev-parse" so I'm not sure what this is saying.

It would be helpful to include the tests and Documentation for the new keys in this patch.

> The new keys are introduced as explicit path.* entries in
> repo_info_fields and are resolved through dedicated helpers.
> > This keeps lookup behavior predictable and makes future path
> additions straightforward.
> > Signed-off-by: Eslam reda ragheb <eslam.reda.div@gmail.com>
> ---

> @@ -74,6 +197,20 @@ static const struct field repo_info_fields[] = {
>   	{ "layout.bare", get_layout_bare },
>   	{ "layout.shallow", get_layout_shallow },
>   	{ "object.format", get_object_format },
> +	{ "path.common-dir", get_path_common_dir },
> +	{ "path.config-file", get_path_config_file },
> +	{ "path.git-dir", get_path_git_dir },
> +	{ "path.git-prefix", get_path_git_prefix },

I'm not sure about calling this 'git-prefix', 'prefix' might be more appropriate as it is about prefixing paths in the worktree rather than the git_dir.

> +	{ "path.grafts-file", get_path_grafts_file },
> +	{ "path.hooks-directory", get_path_hooks_directory },
> +	{ "path.index-file", get_path_index_file },
> +	{ "path.logs-directory", get_path_logs_directory },

We're moving away from file based refs and reflogs so I'm not sure adding this, pick-refs-file or refs-directory is a good idea as we should not be encouraging people to access these files directly.

> +	{ "path.objects-directory", get_path_objects_directory },
> +	{ "path.packed-refs-file", get_path_packed_refs_file },
> +	{ "path.refs-directory", get_path_refs_directory },
> +	{ "path.shallow-file", get_path_shallow_file },
> +	{ "path.superproject-working-tree", get_path_superproject_working_tree },
> +	{ "path.toplevel", get_path_toplevel },

'path.toplevel' matches the git-rev-parse option but 'path.work-tree' might be more descriptive?

What happens if 'path.toplevel' is requested in a bare repository?

Thanks

Phillip

>   	{ "references.format", get_references_format },
>   };
>   

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the careful review — this is very helpful.

I addressed your points in the next reroll:

renamed path.git-prefix to path.prefix,
added path.work-tree (alias of path.toplevel) for clearer naming,
dropped path.logs-directory, path.packed-refs-file, and path.refs-directory to avoid encouraging direct access to refs/reflog file layout.
I also kept tests and documentation in sync in the same update.

Regarding bare repositories: path.toplevel returns an empty value there (and I added/kept test coverage for that behavior). path.work-tree follows the same behavior since it is an alias.

Thanks again for the suggestions.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@eslam-reda-div please note: communication with the Git mailing list is not bidirectional: gitgitgadget/gitgitgadget#154. Meaning: your replies will need to be sent as per the guidance in the "reply to this" links.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Junio C Hamano wrote on the Git mailing list (how to reply to this email):

Phillip Wood <phillip.wood123@gmail.com> writes:

>> +	{ "path.common-dir", get_path_common_dir },
>> +	{ "path.config-file", get_path_config_file },
>> +	{ "path.git-dir", get_path_git_dir },
>> +	{ "path.git-prefix", get_path_git_prefix },
>
> I'm not sure about calling this 'git-prefix', 'prefix' might be more 
> appropriate as it is about prefixing paths in the worktree rather than 
> the git_dir.

True.

>> +	{ "path.grafts-file", get_path_grafts_file },
>> +	{ "path.hooks-directory", get_path_hooks_directory },
>> +	{ "path.index-file", get_path_index_file },
>> +	{ "path.logs-directory", get_path_logs_directory },
>
> We're moving away from file based refs and reflogs so I'm not sure 
> adding this, pick-refs-file or refs-directory is a good idea as we 
> should not be encouraging people to access these files directly.
>
>> +	{ "path.objects-directory", get_path_objects_directory },
>> +	{ "path.packed-refs-file", get_path_packed_refs_file },
>> +	{ "path.refs-directory", get_path_refs_directory },

The same comment applies to these entries as well, as the pluggable
object database support is just beyond the horizon if I understand
correctly.

>> +	{ "path.shallow-file", get_path_shallow_file },
>> +	{ "path.superproject-working-tree", get_path_superproject_working_tree },
>> +	{ "path.toplevel", get_path_toplevel },
>
> 'path.toplevel' matches the git-rev-parse option but 'path.work-tree' 
> might be more descriptive?

I think the "git repo" thrust comes primarily from being unfamiliar
with "rev-parse" (and I wouldn't particularly encourage new people
to become familiar with it---it grew pretty much organically driven
by scripting needs without taking UI cleanliness into consideration
very much), so not many folks would find it disturbing that
"--toplevel" corresponds to "topOfTheWorkingTree".  Given that we
have a token to ask for superproject's working tree, giving a name
made after the same phrasing philosophy for the current project's
working tree would be a good thing, i.e., "path.working-tree".

> What happens if 'path.toplevel' is requested in a bare repository?

FWIW "git rev-parse --show-toplevel" dies with "must be run in a
work tree".  Better or worse, 

	rm -fr new
	git init new
	cd new/.git && git rev-parse --show-toplevel

also dies the same way, which I am not sure we want to inherit when
we are making a new interrogator command.

Thanks.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Phillip Wood wrote on the Git mailing list (how to reply to this email):

On 27/02/2026 19:51, Junio C Hamano wrote:
> Phillip Wood <phillip.wood123@gmail.com> writes:
> >>> +	{ "path.objects-directory", get_path_objects_directory },
>>> +	{ "path.packed-refs-file", get_path_packed_refs_file },
>>> +	{ "path.refs-directory", get_path_refs_directory },
> > The same comment applies to these entries as well, as the pluggable
> object database support is just beyond the horizon if I understand
> correctly.

Good point. Also what is the "shallow file" below and should scripts be poking it directly?

>>> +	{ "path.shallow-file", get_path_shallow_file },
>>> +	{ "path.superproject-working-tree", get_path_superproject_working_tree },
>>> +	{ "path.toplevel", get_path_toplevel },
>>
>> 'path.toplevel' matches the git-rev-parse option but 'path.work-tree'
>> might be more descriptive?
> > I think the "git repo" thrust comes primarily from being unfamiliar
> with "rev-parse" (and I wouldn't particularly encourage new people
> to become familiar with it---it grew pretty much organically driven
> by scripting needs without taking UI cleanliness into consideration
> very much), so not many folks would find it disturbing that
> "--toplevel" corresponds to "topOfTheWorkingTree".  Given that we
> have a token to ask for superproject's working tree, giving a name
> made after the same phrasing philosophy for the current project's
> working tree would be a good thing, i.e., "path.working-tree".

That's a good idea

>> What happens if 'path.toplevel' is requested in a bare repository?
> > FWIW "git rev-parse --show-toplevel" dies with "must be run in a
> work tree".  Better or worse,
> > 	rm -fr new
> 	git init new
> 	cd new/.git && git rev-parse --show-toplevel
> > also dies the same way, which I am not sure we want to inherit when
> we are making a new interrogator command.

Yes, I think printing an empty value after the key would be better - I don't think there are any paths where we care about the distinction between NULL and ""

Thanks

Phillip

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Junio C Hamano wrote on the Git mailing list (how to reply to this email):

Phillip Wood <phillip.wood123@gmail.com> writes:

>> FWIW "git rev-parse --show-toplevel" dies with "must be run in a
>> work tree".  Better or worse,
>> 
>> 	rm -fr new
>> 	git init new
>> 	cd new/.git && git rev-parse --show-toplevel
>> 
>> also dies the same way, which I am not sure we want to inherit when
>> we are making a new interrogator command.
>
> Yes, I think printing an empty value after the key would be better - I 
> don't think there are any paths where we care about the distinction 
> between NULL and ""

If the new and safer variant of the command should signal "error" by
giving an empty string, it would work with its "--show-toplevel"
equivalent run in a bare repository.  In a working tree, it would
give a full/absolute path, and never be an empty string.  I am still
unsure what that new and safer one should do from inside the .git
directory.  "rev-parse --show-toplevel" dies.  $(cd .. && pwd) may
be another plausible and arguably more useful answer.

Your idea of equiating NULL and "", I do not think it would work
well with "git rev-parse --show-cdup" equivalent.  The command will
give us an empty string from the top-level of the working tree.

Curiously, in this sequence

	rm -fr new
	git init new
	cd new/.git && git rev-parse --show-cdup
	cd objects && git rev-parse --show-cdup

two "rev-parse" do not die with "must be run in a work tree", and
worse yet, they do not give you ".." or "../../", either.

It seems that one rule of "rev-parse --show-<some-path>" is that
"when you are inside .git directory of a non-bare repository, we'd
behave as if you are in a bare repository as if its working tree
does not exist", and the above is consistent with that rule.
"--show-cdup" does not fail but gives an empty string when run
anywhere in a bare repository.

But among "rev-parse --show-<anything>" that are about working tree
paths, there seems no unifying rule on what to do when in a bare
repsitory.  As we already saw, "--show-toplevel" dies without a
working tree.  This reflects the history of rev-parse that grew
organizally without a grand design.

If we are adding new and safer interface to these pieces of
information to "repo info", we may want to straighten these rules.

@gitgitgadget-git
Copy link

User Phillip Wood <phillip.wood123@gmail.com> has been added to the cc: list.

@eslam-reda-div
Copy link
Author

/submit

@gitgitgadget-git
Copy link

Submitted as pull.2208.v5.git.git.1772220640.gitgitgadget@gmail.com

To fetch this version into FETCH_HEAD:

git fetch https://github.com/gitgitgadget/git/ pr-git-2208/eslam-reda-div/gsoc-contribute-v5

To fetch this version to local tag pr-git-2208/eslam-reda-div/gsoc-contribute-v5:

git fetch --no-tags https://github.com/gitgitgadget/git/ tag pr-git-2208/eslam-reda-div/gsoc-contribute-v5

@@ -22,7 +22,12 @@ static const char *const repo_usage[] = {
NULL

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lucas Seiki Oshiro wrote on the Git mailing list (how to reply to this email):

> Also teach git repo info to accept category names (for example,
> layout) and expand them to matching key.* entries in request
> order.

If you have a patch where its description says "Do A. Also do B"
when A and B are unrelated, there are good chances that it should
be splitted into two commits. This patch is an example of that.

@gitgitgadget-git
Copy link

User Lucas Seiki Oshiro <lucasseikioshiro@gmail.com> has been added to the cc: list.

@gitgitgadget-git
Copy link

Lucas Seiki Oshiro wrote on the Git mailing list (how to reply to this email):

> * No git repo structure feature changes.

Patch 4/11 changes git repo structure

> * No t1901 structure test changes.

Patch 8/11 changes t1901

> * No structure metrics/docs additions.

Patch 9/11 changes git-repo.adoc

> Commit structure
> ================
> 
> * repo: teach info context and category keys
> * repo: add path keys to repo info
> * repo: add --path-format for info path output
> * t1900: cover repo info path keys and path-format
> * docs: describe repo info path keys

Only 5 commits are described here, while you sent 11 patches in this series.

`path.config-file`::
The path to the `config` file in the git directory.

`path.git-dir`::

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Phillip Wood wrote on the Git mailing list (how to reply to this email):

Hi Eslam

On 27/02/2026 19:30, Eslam reda ragheb via GitGitGadget wrote:
> From: Eslam reda ragheb <eslam.reda.div@gmail.com>
> > Rename path.git-prefix to path.prefix, add path.work-tree as an alias
> for path.toplevel, and drop reflog/ref-file-oriented path keys.
> > This narrows the path surface to keys that are less tied to direct
> file access while keeping tests and documentation in sync.
> > Also normalize prefix handling in repo_info context so path.prefix has
> a stable empty-string behavior.

When you change a patch series based on a reviewer's feedback, you should use "git rebase -i" to edit or fixup the existing commits rather than adding new changes on top. That keeps the history cleaner as we don't need to know "I implemented it like this and than changed it to that". It also makes the patch series easier to review as reviewers don't waste their time commenting on changes in one patch that are then deleted in a later patch.

Thanks

Phillip

> Signed-off-by: Eslam reda ragheb <eslam.reda.div@gmail.com>
> ---
>   Documentation/git-repo.adoc | 14 ++++-------
>   builtin/repo.c              | 45 ++++++++--------------------------
>   t/t1900-repo.sh             | 48 +++++++++++++++++--------------------
>   3 files changed, 36 insertions(+), 71 deletions(-)
> > diff --git a/Documentation/git-repo.adoc b/Documentation/git-repo.adoc
> index b575977a4b..3d34c6edca 100644
> --- a/Documentation/git-repo.adoc
> +++ b/Documentation/git-repo.adoc
> @@ -114,7 +114,7 @@ Here's a list of the available keys and the values that they return:
>   `path.git-dir`::
>   	The path to the git directory.
>   > -`path.git-prefix`::
> +`path.prefix`::
>   	The path of the current working directory relative to the top-level
>   	directory.
>   > @@ -127,18 +127,9 @@ Here's a list of the available keys and the values that they return:
>   `path.index-file`::
>   	The path to the index file.
>   > -`path.logs-directory`::
> -	The path to the `logs` directory.
> -
>   `path.objects-directory`::
>   	The path to the objects directory.
>   > -`path.packed-refs-file`::
> -	The path to the `packed-refs` file.
> -
> -`path.refs-directory`::
> -	The path to the `refs` directory.
> -
>   `path.shallow-file`::
>   	The path to the `shallow` file.
>   > @@ -150,6 +141,9 @@ Here's a list of the available keys and the values that they return:
>   	The path to the top-level working tree directory, or an empty string
>   	for bare repositories.
>   > +`path.work-tree`::
> +	Alias for `path.toplevel`.
> +
>   `references.format`::
>   	The reference storage format. The valid values are:
>   +
> diff --git a/builtin/repo.c b/builtin/repo.c
> index ecd9d3aee5..9fbd13a358 100644
> --- a/builtin/repo.c
> +++ b/builtin/repo.c
> @@ -109,10 +109,9 @@ static int get_path_git_dir(struct repo_info *info, struct strbuf *buf)
>   	return 0;
>   }
>   > -static int get_path_git_prefix(struct repo_info *info, struct strbuf *buf)
> +static int get_path_prefix(struct repo_info *info, struct strbuf *buf)
>   {
> -	if (info->prefix)
> -		strbuf_addstr(buf, info->prefix);
> +	strbuf_addstr(buf, info->prefix);
>   	return 0;
>   }
>   > @@ -137,39 +136,12 @@ static int get_path_index_file(struct repo_info *info, struct strbuf *buf)
>   	return 0;
>   }
>   > -static int get_path_logs_directory(struct repo_info *info, struct strbuf *buf)
> -{
> -	struct strbuf path = STRBUF_INIT;
> -
> -	repo_info_add_path(info, buf, repo_git_path_replace(info->repo, &path, "logs"));
> -	strbuf_release(&path);
> -	return 0;
> -}
> -
>   static int get_path_objects_directory(struct repo_info *info, struct strbuf *buf)
>   {
>   	repo_info_add_path(info, buf, repo_get_object_directory(info->repo));
>   	return 0;
>   }
>   > -static int get_path_packed_refs_file(struct repo_info *info, struct strbuf *buf)
> -{
> -	struct strbuf path = STRBUF_INIT;
> -
> -	repo_info_add_path(info, buf, repo_git_path_replace(info->repo, &path, "packed-refs"));
> -	strbuf_release(&path);
> -	return 0;
> -}
> -
> -static int get_path_refs_directory(struct repo_info *info, struct strbuf *buf)
> -{
> -	struct strbuf path = STRBUF_INIT;
> -
> -	repo_info_add_path(info, buf, repo_git_path_replace(info->repo, &path, "refs"));
> -	strbuf_release(&path);
> -	return 0;
> -}
> -
>   static int get_path_shallow_file(struct repo_info *info, struct strbuf *buf)
>   {
>   	struct strbuf path = STRBUF_INIT;
> @@ -201,6 +173,11 @@ static int get_path_toplevel(struct repo_info *info, struct strbuf *buf)
>   	return 0;
>   }
>   > +static int get_path_work_tree(struct repo_info *info, struct strbuf *buf)
> +{
> +	return get_path_toplevel(info, buf);
> +}
> +
>   static int get_references_format(struct repo_info *info, struct strbuf *buf)
>   {
>   	struct repository *repo = info->repo;
> @@ -217,17 +194,15 @@ static const struct field repo_info_fields[] = {
>   	{ "path.common-dir", get_path_common_dir },
>   	{ "path.config-file", get_path_config_file },
>   	{ "path.git-dir", get_path_git_dir },
> -	{ "path.git-prefix", get_path_git_prefix },
>   	{ "path.grafts-file", get_path_grafts_file },
>   	{ "path.hooks-directory", get_path_hooks_directory },
>   	{ "path.index-file", get_path_index_file },
> -	{ "path.logs-directory", get_path_logs_directory },
>   	{ "path.objects-directory", get_path_objects_directory },
> -	{ "path.packed-refs-file", get_path_packed_refs_file },
> -	{ "path.refs-directory", get_path_refs_directory },
> +	{ "path.prefix", get_path_prefix },
>   	{ "path.shallow-file", get_path_shallow_file },
>   	{ "path.superproject-working-tree", get_path_superproject_working_tree },
>   	{ "path.toplevel", get_path_toplevel },
> +	{ "path.work-tree", get_path_work_tree },
>   	{ "references.format", get_references_format },
>   };
>   > @@ -378,7 +353,7 @@ static int cmd_repo_info(int argc, const char **argv, const char *prefix,
>   	enum output_format format = FORMAT_KEYVALUE;
>   	struct repo_info info = {
>   		.repo = repo,
> -		.prefix = prefix,
> +		.prefix = prefix ? prefix : "",
>   		.path_format = PATH_FORMAT_ABSOLUTE,
>   	};
>   	int all_keys = 0;
> diff --git a/t/t1900-repo.sh b/t/t1900-repo.sh
> index dcacf84cc3..2351b772b2 100755
> --- a/t/t1900-repo.sh
> +++ b/t/t1900-repo.sh
> @@ -13,17 +13,15 @@ REPO_INFO_KEYS='
>   	path.common-dir
>   	path.config-file
>   	path.git-dir
> -	path.git-prefix
>   	path.grafts-file
>   	path.hooks-directory
>   	path.index-file
> -	path.logs-directory
>   	path.objects-directory
> -	path.packed-refs-file
> -	path.refs-directory
> +	path.prefix
>   	path.shallow-file
>   	path.superproject-working-tree
>   	path.toplevel
> +	path.work-tree
>   	references.format
>   '
>   > @@ -31,17 +29,15 @@ REPO_INFO_PATH_KEYS='
>   	path.common-dir
>   	path.config-file
>   	path.git-dir
> -	path.git-prefix
>   	path.grafts-file
>   	path.hooks-directory
>   	path.index-file
> -	path.logs-directory
>   	path.objects-directory
> -	path.packed-refs-file
> -	path.refs-directory
> +	path.prefix
>   	path.shallow-file
>   	path.superproject-working-tree
>   	path.toplevel
> +	path.work-tree
>   '
>   >   # Test whether a key-value pair is correctly returned
> @@ -172,12 +168,12 @@ test_expect_success 'path.toplevel is empty in bare repository' '
>   	test_cmp expect actual
>   '
>   > -test_expect_success 'path.git-prefix matches rev-parse --show-prefix' '
> +test_expect_success 'path.prefix matches rev-parse --show-prefix' '
>   	git init path-prefix &&
>   	mkdir -p path-prefix/a/b &&
>   	expected_value=$(git -C path-prefix/a/b rev-parse --show-prefix) &&
> -	echo "path.git-prefix=$expected_value" >expect &&
> -	git -C path-prefix/a/b repo info path.git-prefix >actual &&
> +	echo "path.prefix=$expected_value" >expect &&
> +	git -C path-prefix/a/b repo info path.prefix >actual &&
>   	test_cmp expect actual
>   '
>   > @@ -209,27 +205,27 @@ test_expect_success 'git-path style keys match rev-parse --git-path' '
>   	git -C path-git-path repo info path.config-file >actual &&
>   	test_cmp expect actual &&
>   > -	expected_value=$(git -C path-git-path rev-parse --path-format=absolute --git-path logs) &&
> -	echo "path.logs-directory=$expected_value" >expect &&
> -	git -C path-git-path repo info path.logs-directory >actual &&
> -	test_cmp expect actual &&
> -
> -	expected_value=$(git -C path-git-path rev-parse --path-format=absolute --git-path packed-refs) &&
> -	echo "path.packed-refs-file=$expected_value" >expect &&
> -	git -C path-git-path repo info path.packed-refs-file >actual &&
> -	test_cmp expect actual &&
> -
> -	expected_value=$(git -C path-git-path rev-parse --path-format=absolute --git-path refs) &&
> -	echo "path.refs-directory=$expected_value" >expect &&
> -	git -C path-git-path repo info path.refs-directory >actual &&
> -	test_cmp expect actual &&
> -
>   	expected_value=$(git -C path-git-path rev-parse --path-format=absolute --git-path shallow) &&
>   	echo "path.shallow-file=$expected_value" >expect &&
>   	git -C path-git-path repo info path.shallow-file >actual &&
>   	test_cmp expect actual
>   '
>   > +test_expect_success 'path.work-tree matches path.toplevel' '
> +	git init path-work-tree &&
> +	expected_value=$(git -C path-work-tree rev-parse --show-toplevel) &&
> +	echo "path.work-tree=$expected_value" >expect &&
> +	git -C path-work-tree repo info path.work-tree >actual &&
> +	test_cmp expect actual
> +'
> +
> +test_expect_success 'path.work-tree is empty in bare repository' '
> +	git init --bare bare-path-work-tree &&
> +	echo "path.work-tree=" >expect &&
> +	git -C bare-path-work-tree repo info path.work-tree >actual &&
> +	test_cmp expect actual
> +'
> +
>   test_expect_success 'path.superproject-working-tree is empty when not a submodule' '
>   	git init path-superproject &&
>   	echo "path.superproject-working-tree=" >expect &&

@eslam-reda-div eslam-reda-div force-pushed the gsoc-contribute branch 3 times, most recently from ae908e7 to 5205c82 Compare March 2, 2026 04:09
Introduce a repo_info context and thread it through get_value_fn,
field lookup, and value-printing helpers.

This prepares repo info for fields that need invocation-specific
context in addition to the repository handle.

Signed-off-by: Eslam reda ragheb <eslam.reda.div@gmail.com>
Teach repo info to accept category names (for example, layout)
and expand them to matching key.* entries in request order.

Explicit keys keep their existing behavior; unknown keys or
categories still report clear errors.

Signed-off-by: Eslam reda ragheb <eslam.reda.div@gmail.com>
Add a path category to git repo info with key-value pairs that
mirror repository paths users commonly retrieve via rev-parse and
git-path lookups.

This makes scripting against repo metadata more direct and avoids
shelling out to multiple commands for related paths.

The new keys are introduced as explicit path.* entries in
repo_info_fields and are resolved through dedicated helpers.

This keeps lookup behavior predictable and makes future path
additions straightforward.

Signed-off-by: Eslam reda ragheb <eslam.reda.div@gmail.com>
Teach git repo info to accept --path-format=(absolute|relative)
so scripts can request stable path style explicitly.

This aligns path.* output behavior with existing rev-parse usage
patterns and reduces ad-hoc path conversion in callers.

The option is wired through repo_info context and used by
repo_info_add_path(), so path formatting remains centralized and
consistent across all path.* keys.

Signed-off-by: Eslam reda ragheb <eslam.reda.div@gmail.com>
Extend t1900 to validate category-key expansion, path.* key
behavior, and --path-format handling for git repo info.

The tests compare repo info output to equivalent rev-parse values.

This ensures behavior remains aligned with existing plumbing
semantics.

Also keep mixed key/category ordering coverage so callers can rely
on deterministic output order when combining explicit keys with
category requests.

Signed-off-by: Eslam reda ragheb <eslam.reda.div@gmail.com>
Document repo info category requests, path.* keys, and
--path-format behavior.

Signed-off-by: Eslam reda ragheb <eslam.reda.div@gmail.com>
@eslam-reda-div
Copy link
Author

/submit

@gitgitgadget-git
Copy link

Submitted as pull.2208.v6.git.git.1772428548.gitgitgadget@gmail.com

To fetch this version into FETCH_HEAD:

git fetch https://github.com/gitgitgadget/git/ pr-git-2208/eslam-reda-div/gsoc-contribute-v6

To fetch this version to local tag pr-git-2208/eslam-reda-div/gsoc-contribute-v6:

git fetch --no-tags https://github.com/gitgitgadget/git/ tag pr-git-2208/eslam-reda-div/gsoc-contribute-v6

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants