| gitnamespaces(7) | |
| ================ | |
| NAME | |
| ---- | |
| gitnamespaces - Git namespaces | |
| SYNOPSIS | |
| -------- | |
| [verse] | |
| GIT_NAMESPACE=<namespace> 'git upload-pack' | |
| GIT_NAMESPACE=<namespace> 'git receive-pack' | |
| DESCRIPTION | |
| ----------- | |
| Git supports dividing the refs of a single repository into multiple | |
| namespaces, each of which has its own branches, tags, and HEAD. Git can | |
| expose each namespace as an independent repository to pull from and push | |
| to, while sharing the object store, and exposing all the refs to | |
| operations such as linkgit:git-gc[1]. | |
| Storing multiple repositories as namespaces of a single repository | |
| avoids storing duplicate copies of the same objects, such as when | |
| storing multiple branches of the same source. The alternates mechanism | |
| provides similar support for avoiding duplicates, but alternates do not | |
| prevent duplication between new objects added to the repositories | |
| without ongoing maintenance, while namespaces do. | |
| To specify a namespace, set the `GIT_NAMESPACE` environment variable to | |
| the namespace. For each ref namespace, Git stores the corresponding | |
| refs in a directory under `refs/namespaces/`. For example, | |
| `GIT_NAMESPACE=foo` will store refs under `refs/namespaces/foo/`. You | |
| can also specify namespaces via the `--namespace` option to | |
| linkgit:git[1]. | |
| Note that namespaces which include a `/` will expand to a hierarchy of | |
| namespaces; for example, `GIT_NAMESPACE=foo/bar` will store refs under | |
| `refs/namespaces/foo/refs/namespaces/bar/`. This makes paths in | |
| `GIT_NAMESPACE` behave hierarchically, so that cloning with | |
| `GIT_NAMESPACE=foo/bar` produces the same result as cloning with | |
| `GIT_NAMESPACE=foo` and cloning from that repo with `GIT_NAMESPACE=bar`. It | |
| also avoids ambiguity with strange namespace paths such as `foo/refs/heads/`, | |
| which could otherwise generate directory/file conflicts within the `refs` | |
| directory. | |
| linkgit:git-upload-pack[1] and linkgit:git-receive-pack[1] rewrite the | |
| names of refs as specified by `GIT_NAMESPACE`. git-upload-pack and | |
| git-receive-pack will ignore all references outside the specified | |
| namespace. | |
| The smart HTTP server, linkgit:git-http-backend[1], will pass | |
| GIT_NAMESPACE through to the backend programs; see | |
| linkgit:git-http-backend[1] for sample configuration to expose | |
| repository namespaces as repositories. | |
| For a simple local test, you can use linkgit:git-remote-ext[1]: | |
| ---------- | |
| git clone ext::'git --namespace=foo %s /tmp/prefixed.git' | |
| ---------- | |
| include::transfer-data-leaks.txt[] |