我有一个带有多个子模块的git存储库,它创建了一个.gitmodules
文件,它是父存储库中的跟踪文件。但是,还有其他开发人员想要在此存储库上工作,并检查子模块。但是目前远程子模块存储库的URL包含我的用户名;在.gitmodules
文件中,它类似于:
[submodule foo]
path = sub/foo
url = https://myuser@example.com/git/foo.git
显然,其他开发人员无法从example.com
获取myuser
(他们没有我的密码);我怎样才能拥有一个多个开发人员可以拉/推的主存储库,并允许他们单独访问子模块(设置他们在子模块主机服务器上共享的单个用户名可以工作,但不是很好的用户管理) ?
答案 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)