git - 我如何在本地使用 git 命名空间?

标签 git version-control namespaces gitlab collaboration

我有一个有趣的用例,我想通过 GitLab 共享存储库— 但我们公司每个用户的 repo 有限,所以我必须根据隐私对这些进行配给(即,我有项目 1 和 2 → 团队 1 的 repo 1 和项目 3,而不是项目 1 的 repo 1 & 4 → 团队 2 的 repo 2)。

最初我打算在分支名称中创建伪命名空间,例如project1-branch1, project2-branch1, project2-branch2 — 然而我随后了解到 git 包括 namespace应该在共享一个对象存储的同时分离不同的引用 namespace 的功能。我试图通过将不同的分支提交到不同的 namespace 来在本地进行测试,但是我仍然看到任何(或没有!) namespace 中的所有分支:

$ git init .
Initialized empty Git repository in ~/tmp/test/.git/

$ git --namespace test1 checkout --orphan test1
Switched to a new branch 'test1'

$ touch test1

$ git --namespace test1 add -- test1

$ git --namespace test1 commit -m test1
[test1 (root-commit) 27f9d70] test1
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test1

$ git --namespace test2 checkout --orphan test2
Switched to a new branch 'test2'

$ touch test2

$ git --namespace test2 add -- test2

$ git --namespace test2 commit -m test2
[test2 (root-commit) 4f0f7c5] test2
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test1
 create mode 100644 test2

$ git log --graph
* commit 4f0f7c555d3c607d97829263a30170cc431c1d01
  Author: RubyTuesdayDONO
  Date:   Thu Jul 3 16:06:39 2014 -0500
      test2

$ git log --all --graph
* commit 4f0f7c555d3c607d97829263a30170cc431c1d01
  Author: RubyTuesdayDONO
  Date:   Thu Jul 3 16:06:39 2014 -0500
      test2

* commit 27f9d703758ae401eb77e7e15d75ac863f296291
  Author: RubyTuesdayDONO
  Date:   Thu Jul 3 16:06:17 2014 -0500
      test1

$ git --namespace test1 log --all --graph
* commit 4f0f7c555d3c607d97829263a30170cc431c1d01
  Author: RubyTuesdayDONO
  Date:   Thu Jul 3 16:06:39 2014 -0500
      test2

* commit 27f9d703758ae401eb77e7e15d75ac863f296291
  Author: RubyTuesdayDONO
  Date:   Thu Jul 3 16:06:17 2014 -0500
      test1

$ git --namespace test2 log --all --graph
* commit 4f0f7c555d3c607d97829263a30170cc431c1d01
  Author: RubyTuesdayDONO
  Date:   Thu Jul 3 16:06:39 2014 -0500

      test2

* commit 27f9d703758ae401eb77e7e15d75ac863f296291
  Author: RubyTuesdayDONO
  Date:   Thu Jul 3 16:06:17 2014 -0500
      test1

# separate namespace should prevent conflict (but doesn't)
$ git --namespace test3 checkout --orphan test1 
fatal: A branch named 'test1' already exists.

# should include refs/namespaces (but doesn't)
$ tree -a
.
├── .git
│   ├── COMMIT_EDITMSG
│   ├── config
│   ├── description
│   ├── HEAD
│   ├── hooks
│   ├── index
│   ├── info
│   │   └── exclude
│   ├── logs
│   │   ├── HEAD
│   │   └── refs
│   │       └── heads
│   │           ├── test1
│   │           └── test2
│   ├── objects
│   │   ├── 18
│   │   │   └── c152442134ca652c83b111b6063c9b75f9157c
│   │   ├── 27
│   │   │   └── f9d703758ae401eb77e7e15d75ac863f296291
│   │   ├── 4f
│   │   │   └── 0f7c555d3c607d97829263a30170cc431c1d01
│   │   ├── e0
│   │   │   └── f402da78bd414bdd926713d2b54c246432adc5
│   │   ├── e6
│   │   │   └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│   │   ├── info
│   │   └── pack
│   └── refs
│       ├── heads
│       │   ├── test1
│       │   └── test2
│       └── tags
├── test1
└── test2

17 directories, 27 files

在推送到远程仓库之前是否无法在本地查看命名空间?或者如果它在本地与 git-remote-ext 一起工作像 git clone ext::'git --namespace=foo %s/tmp/prefixed.git' 这样的魔法,那么为什么不简单地使用 git --namespace ordinary-git-command?

如果我误解了 git 命名空间的目的,请提前道歉——我只是想在与我的同事分享之前确信这会起作用,否则我将只使用分支名称作为一种伪命名空间(不太优雅,但它会起作用)。我在没有真正理解 git 命名空间的功能的情况下查看了以下帖子:

最佳答案

Git 命名空间仅适用于远程仓库,不适用于本地 (https://github.com/git/git/commit/6b01ecfe22f0b6ccb9665cd8d85d78a381fecffc)。大多数使用 git 命名空间的操作似乎都适用于通过 git-upload-pack 和 git-receive-pack 函数的操作。 这就是为什么文档建议如果你想在本地测试它以假装它认为你是从远程机器 pull 出来的,例如:git clone ext::'git --namespace=foo %s/tmp/prefixed.git '

这样的命令

git --namespace foo add
git --namespace foo commit
git --namespace foo branch

基本上什么都不做。似乎有任何影响的唯一操作是克隆/获取/pull 和推送。

为了按照您希望的方式利用命名空间,您必须设置自己的 git 后端,该后端能够将 URL 参数转换为 GIT_NAMESPACE 变量并将其传递给 git-http-backend 或类似的东西. The documentation recommends the following in your apache configuration:

To serve multiple repositories from different gitnamespaces in a single repository:

SetEnvIf Request_URI "^/git/([^/]*)" GIT_NAMESPACE=$1
ScriptAliasMatch ^/git/[^/]*(.*) /usr/libexec/git-core/git-http-backend/storage.git$1

另请注意,该文档没有说明的是,这里发生的事情是从 URL 中提取 GIT_NAMESPACE 变量并设置 git-http-backend 期望的环境变量。即 http://myserver.com/git/namespace/repository.git。 “storage.git”部分是一个错字,不应该存在。我应该提交文档补丁。

这是创建此功能的大部分提交。 https://github.com/git/git/commits/398dd4bd039680ba98497fbedffa415a43583c16?author=joshtriplett

关于git - 我如何在本地使用 git 命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24564351/

相关文章:

git - 如何在一个 Git 仓库中实现/管理多个项目?

linux - 跟踪单个文件的版本控制系统

c++ - 命名空间范围内的外部 - gcc vs clang vs msvc

python - 带有嵌套命名空间的 argparse 子命令

xcode - 与 Xcode 分开安装 Git

git pull 到一个分离的头

python - git-diff 如何生成大块描述?

version-control - 获取在 TFS 中 checkin 最新版本的用户的所有文件列表

vue.js - 如何在 Chrome Dev Tools 中区分同名的 VueJS + WebPack 模块?

git - 从 git 预提交 Hook 运行时 `git diff` 不起作用