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

问题描述 投票:44回答:9

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

[submodule foo]
  path = sub/foo
  url = https://[email protected]/git/foo.git

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

git git-submodules
9个回答
33
投票

如果我理解正确,您将通过HTTPS使用HTTP基本身份验证,以仅允许特定开发人员访问存储库。在这种情况下,您可以提交一个类似于的.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中的URL。但是,init步骤不会将子模块克隆到位,直到你执行git submodule update,所以你可以这样做:

git config submodule.sub/foo.url https://myuser:[email protected]/git/foo.git

... 然后:

git submodule update

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


30
投票

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

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

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


10
投票

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

git submodule sync

8
投票

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

但是它确实让我在.gitmodules中试验了url。

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

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


5
投票

您可以使用ssh身份验证。

只需要替换它

[submodule foo]
  path = sub/foo
  url = https://[email protected]/git/foo.git

有了这个

[submodule foo]
  path = sub/foo
  url = [email protected]:git/foo.git

2
投票

我和Gerrit(通过ssh)一起遇到了这个问题。 删除用户名, 所以我的.gitmodules现在看起来像这样:

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

1
投票

你可以试试.insteadOf,例如

git config --global url."ssh://[email protected]:29418/".insteadOf "ssh://gerrit.foobar.com:29418/"

每个开发人员必须在他们使用的每台计算机上执行此操作一次。


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

-1
投票

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.