git-repo(1)
===========

NAME
----
git-repo - Retrieve information about the repository

SYNOPSIS
--------
[synopsis]
git repo info [--format=(lines|nul) | -z] [--all | <key>...]
git repo info --keys [--format=(lines|nul) | -z]
git repo structure [--format=(table|lines|nul) | -z]

DESCRIPTION
-----------
Retrieve information about the repository.

THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.

COMMANDS
--------
`info [--format=(lines|nul) | -z] [--all | <key>...]`::
	Retrieve metadata-related information about the current repository. Only
	the requested data will be returned based on their keys
	(see <<INFO_KEYS,"INFO KEYS">> section below).
+
The values are returned in the same order in which their respective keys were
requested. The `--all` flag requests the values for all the available keys.
+
The output format can be chosen through the flag `--format`. Two formats are
supported:
+

`lines`:::
	Output key-value pairs one per line using the `=` character as
	the delimiter between the key and the value. Values containing "unusual"
	characters are quoted as explained for the configuration variable
	`core.quotePath` (see linkgit:git-config[1]). This is the default.

`nul`:::
	Similar to `lines`, but using a newline character as the delimiter
	between the key and the value and using a _NUL_ character after each value.
	This format is better suited for being parsed by another applications than
	`lines`. Unlike in the `lines` format, the values are never quoted.
+
`-z` is an alias for `--format=nul`.

`info --keys [--format=(lines|nul) | -z]`::
	List all the available keys, one per line. The output format can be chosen
	through the flag `--format`. The following formats are supported:
+
`lines`:::
	Output the keys one per line. This is the default.

`nul`:::
	Similar to `lines`, but using a _NUL_ character after each value.

`structure [--format=(table|lines|nul) | -z]`::
	Retrieve statistics about the current repository structure. The
	following kinds of information are reported:
+
* Reference counts categorized by type
* Reachable object counts categorized by type
* Total inflated size of reachable objects by type
* Total disk size of reachable objects by type
* Largest reachable objects in the repository by type
+
The output format can be chosen through the flag `--format`. Three formats are
supported:
+
`table`:::
	Outputs repository stats in a human-friendly table. This format may
	change and is not intended for machine parsing. This is the default
	format.

`lines`:::
	Each line of output contains a key-value pair for a repository stat.
	The '=' character is used to delimit between the key and the value.
	Values containing "unusual" characters are quoted as explained for the
	configuration variable `core.quotePath` (see linkgit:git-config[1]).

`nul`:::
	Similar to `lines`, but uses a _NUL_ character to delimit between
	key-value pairs instead of a newline. Also uses a newline character as
	the delimiter between the key and value instead of '='. Unlike the
	`lines` format, values containing "unusual" characters are never
	quoted.
+
`-z` is an alias for `--format=nul`.

[[INFO_KEYS]]
INFO KEYS
---------
In order to obtain a set of values from `git repo info`, you should provide
the keys that identify them. Here's a list of the available keys and the
values that they return:

`layout.bare`::
	`true` if this is a bare repository, otherwise `false`.

`layout.shallow`::
	`true` if this is a shallow repository, otherwise `false`.

`object.format`::
	The object format (hash algorithm) used in the repository.

`path.commondir.absolute`::
	The canonical absolute path to the Git repository's common
	directory (the shared `.git` directory containing objects,
	refs, and global configuration).

`path.commondir.relative`::
	The path to the Git repository's common directory relative to
	the current working directory.

`path.gitdir.absolute`::
	The canonical absolute path to the Git repository directory (the `.git` directory).

`path.gitdir.relative`::
	The path to the Git repository directory relative to the current working directory.

`references.format`::
	The reference storage format. The valid values are:
+
include::ref-storage-format.adoc[]

EXAMPLES
--------

* Retrieves the reference format of the current repository:
+
------------
git repo info references.format
------------
+

* Retrieves whether the current repository is bare and whether it is shallow
using the `nul` format:
+
------------
git repo info --format=nul layout.bare layout.shallow
------------

SEE ALSO
--------
linkgit:git-rev-parse[1]

GIT
---
Part of the linkgit:git[1] suite
