【问题标题】:Git submodule URL not including username?Git子模块URL不包括用户名?
【发布时间】:2011-10-10 14:33:29
【问题描述】:

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

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

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

【问题讨论】:

  • 你拥有那台服务器吗?你看过gitolite吗?你可以只使用公共托管吗?
  • @Jefromi Bitbucket 目前托管,虽然 gitolite 看起来可以用于自托管。

标签: git git-submodules


【解决方案1】:

如果我理解正确,您使用的是基于 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:mypass@example.com/git/foo.git

...然后:

git submodule update

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

【讨论】:

  • 这对系统范围的配置很有好处;在边缘情况下,您的 git repo 访问用户名与其他访问用户名不同,这不是主意。我发现从 repo URL 中删除用户名会提示输入用户名和密码,这样即使不理想也可以。如果只有 git 允许 remote.origin.user 配置选项之类的东西...
  • 你真的用.netrc做其他认证吗?
  • 我不会,但我不知道其他人会不会;对我来说,理想的解决方案是完全在 git 及其配置中,无需修改操作系统的其他部分,以防用户将该文件用于其他冲突的目的。
  • @MidnightLightning:我添加了一个替代答案。如果可以的话,使用 SSH 通常比使用 HTTPS 更灵活。
  • @BobbyA - 当你使用git config 设置一些配置时,这就是修改.git/config。这是一个单独的配置文件,具有来自.gitmodules 的不同部分和含义。对于此示例,在 .git/config 中会有一个部分:[submodule "sub/foo"],其中包含 url = https://myuser:mypass@example.com/git/foo.git。我希望这会有所帮助。
【解决方案2】:

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

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

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

【讨论】:

  • 它没有采用相同的主机它采用相同的 URL 例如:ssh://user@example.com:29412/mainmodule/submodule
【解决方案3】:

这个线程帮助了我,但我要补充一点,在你修改文件 .gitmodules 的内容后,你需要执行以下命令,以便 git 将其拾取:

git submodule sync

【讨论】:

    【解决方案4】:

    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://myuser@example.com/git/foo.git
    

    有了这个

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

    【讨论】:

    • 您仍在指定用户;现在不是假设其他维护者拥有myuser 帐户的密码,而是假设他们拥有git 用户帐户的密码,不是吗?
    • 不。有些 Git 服务器只是查找您的公钥以匹配您的用户。在这些服务器中,有 Github、Atlassian Bitbucket Server(以前的 Stash)和 Atlassian Bitbucket(SaaS 版本)。这很简洁,因为您在 url 中的用户名没有这样的问题
    【解决方案6】:

    你可以试试.insteadOf,例如

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

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

    【讨论】:

    • 这样做的好处是您只需执行一次,然后一切正常,包括“git clone --recurse-submodules”。不过,它确实需要“YOUR_USERNAME”字符串保持一致。
    【解决方案7】:

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

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

    【讨论】:

    • 这假设是这样工作的吗?它适用于 Windows,但不适用于 linux
    • 实际上我不确定它是否应该,但它适用于 Windows 和 Linux。这可能取决于 ssh 的东西在后台做什么——因为你不给用户,它必须使用默认用户。
    • 我发现了更多相关信息:实际上,您的会话用户名必须与您的 ssh 用户名相同才能正常工作。或者要解决这个问题,您必须配置 .ssh/config 为每个 ssh 服务器使用特定的用户名
    【解决方案8】:

    修改您的.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
    

    【讨论】:

      【解决方案9】:

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

      【讨论】:

        猜你喜欢
        • 2011-04-17
        • 1970-01-01
        • 2018-08-02
        • 1970-01-01
        • 2015-05-14
        • 2019-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多