Git子模块URL不包括用户名?

时间:2011-10-10 14:33:29

标签: git git-submodules

我有一个带有多个子模块的git存储库,它创建了一个.gitmodules文件,它是父存储库中的跟踪文件。但是,还有其他开发人员想要在此存储库上工作,并检查子模块。但是目前远程子模块存储库的URL包含我的用户名;在.gitmodules文件中,它类似于:

[submodule foo]
  path = sub/foo
  url = https://myuser@example.com/git/foo.git

显然,其他开发人员无法从example.com获取myuser(他们没有我的密码);我怎样才能拥有一个多个开发人员可以拉/推的主存储库,并允许他们单独访问子模块(设置他们在子模块主机服务器上共享的单个用户名可以工作,但不是很好的用户管理) ?

9 个答案:

答案 0 :(得分:33)

如果我理解正确,您通过HTTPS使用HTTP基本身份验证,只允许特定开发人员访问存储库。在这种情况下,您可以提交类似于{/ p>的.gitmodules

[submodule foo]
  path = sub/foo
  url = https://example.com/git/foo.git

...即没有用户名,然后告诉每个开发人员将他们的用户名和密码放在他们的~/.netrc文件中。 (如果您使用的是Windows,则有some good advice on that here。)简单的.netrc文件可能如下所示:

machine example.com
  login myusername
  password areamandyingtotellsomeonehiscoolpassword

更新:不涉及使用.netrc的替代方案如下:

再次,从.gitmodules中的URL中删除用户名,然后提交并推送该更改。当某人克隆存储库时,他们将首先运行:

git submodule init

...这会将配置选项submodule.sub/foo.url设置为.gitmodules中的网址。但是,在您执行init之前,git submodule update步骤不会将子模块克隆到位,因此您可以这样做:

git config submodule.sub/foo.url https://myuser:mypass@example.com/git/foo.git

......然后:

git submodule update

使用正确的用户名克隆子模块。请注意,然后您的HTTP身份验证的用户名和密码将存储在您的git配置中。

答案 1 :(得分:30)

实际上你可以在.gitconfig中指定子模块的“相对”路径:

[submodule foo]  
path = sub/foo  
url = ./git/foo.git

此网址将引用与存储库本身相同的主机(https://example.com)。

答案 2 :(得分:10)

这个线程对我有所帮助,但我想补充一点,修改文件 .gitmodules 的内容后,你需要执行以下命令,这样git会把它拿起来:

git submodule sync

答案 3 :(得分:8)

Antonk的回答不适用于团队,因为个人的.gitconfig或.git / config不受版本控制。

然而它确实让我在.gitmodules中尝试了url。

[submodule foo]
path = sub/foo
url = ../foo.git

为我工作,假设子模块repo与父元素在同一个url中。

答案 4 :(得分:5)

您可以使用ssh身份验证。

只需替换此

[submodule foo]
  path = sub/foo
  url = https://myuser@example.com/git/foo.git

用这个

[submodule foo]
  path = sub/foo
  url = git@example.com:git/foo.git

答案 5 :(得分:2)

我将此问题与 Gerrit (通过ssh)结合使用 删除用户名,因此我的 .gitmodules 现在看起来像这样:

[submodule "sub/module1"]
    path = sub/module1
    url = ssh://servername:29418/module1

答案 6 :(得分:0)

您可以尝试.insteadOf,例如

git config --global url."ssh://YOUR_USERNAME@gerrit.foobar.com:29418/".insteadOf "ssh://gerrit.foobar.com:29418/"

每个开发人员都必须在工作的每台计算机上执行一次此操作。

答案 7 :(得分:0)

修改您的.gitmodules并从url中删除用户名:

[submodule foo]
  path = sub/foo
  url = https://example.com/git/foo.git

最后:

cd foo/
git submodule init
git submodule update

# Will be prompted to provide username and password

答案 8 :(得分:-1)

或者,您可以使用 HTTPS 代替 SSH ,它会提示您输入用户名和密码:

enter image description here

相关问题