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

时间:2014-07-03 22:44:57

标签: git version-control namespaces gitlab collaboration

我有一个有趣的用例,我希望通过GitLab分享存储库 - 但我们公司的每个用户的回购数量有限,所以我必须通过隐私来配置那些(即代替项目1的回购1,我已经为团队1提供了项目1和2→回购1,为团队2提供了3& 4→回购2)。

最初我打算在分支名称中创建伪命名空间,例如project1-branch1project2-branch1project2-branch2 - 但后来我了解到git包含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 clone ext::'git --namespace=foo %s /tmp/prefixed.git' git --namespace ordinary-git-command等{{}}}本地工作,那么为什么不简单地使用{{1}}?

如果我误解了git命名空间的用途,请提前抱歉 - 我只是想确保在与同事分享之前这会有用,否则我只会使用分支名称作为一种相反,伪名称空间(不太优雅,但它可以工作)。我已经查看了以下帖子,但没有真正理解git名称空间如何运作:

2 个答案:

答案 0 :(得分:3)

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

所以像

这样的命令
git --namespace foo add
git --namespace foo commit
git --namespace foo branch

所有基本上什么都不做。唯一似乎有效的操作是clone / fetch / pull和push。

为了按照您希望的方式利用命名空间,您必须设置自己的git后端,该后端能够将URL参数转换为GIT_NAMESPACE变量并将其传递给git-http-backend或类似的东西。文档(此处:)

https://github.com/git/git/blob/master/Documentation%2Fgit-http-backend.txt#L154-L160

在apache配置中推荐以下内容:

+
To serve multiple repositories from different linkgit:gitnamespaces[7] 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

答案 1 :(得分:0)

因为Gitlab本质上是0美元投资的免费软件,所以有理由认为根据许可证限制每个用户的存储库数量是有道理的。 Gitlab的员工确实出售了企业许可证,但即便如此,与社区版本相比也没有“无限回购”,所以这不是卖点。我假设两个版本都允许您拥有尽可能多的存储库。

您是否曾要求Gitlab管理员增加帐户的存储库数量?或者您甚至要求将团队使用的存储库移出您的个人帐户?如果最简单的解决方案就是要求更多的存储库不需要花费1美分,那么尝试创建基于命名空间或分支机构的解决方案是完全疯狂的。