The previous iteration of the storage layout for projects organised peer's subtrees by the `refs/remotes` category. This layout leads to problems when linking a working copy to the storage project. The fetch refspec would look something like: fetch = +refs/remotes/abc/heads/*:refs/remotes/rad/* This works perfectly fine when running: git fetch rad but will fail when one tries to specify: git fetch rad main Instead, the command would need to be: git fetch remotes/abc/heads/main This patch proposes to move the use of `refs/namespaces` for each peer. The layout looks similar in that each peer has a subtree, but instead it is under `refs/namespaces/<peer>/refs/...`. The previous refspec would look more familiar in its new form: fetch = +refs/heads/*:refs/remotes/rad/* With this in place running: git --namespace=abc rad main Will work as expected and place the reference under `refs/remotes/rad/main`. Similary, `git --namespace=abc push` will work as expected. Another benefit of this approach is that the use of namespacing means that a tag is pushed it will be placed under the respective namespace rather than in the global `refs/tags` category. The actual implementation needed to work around the fact that `git2`/`libgit2` does not have any options for fetching or pushing using namespaces. The working copy code uses processes to shell out to `git` for namespacing needs. Signed-off-by: Fintan Halpenny <fintan.halpenny@gmail.com> |
||
|---|---|---|
| .. | ||
| src | ||
| Cargo.toml | ||