【问题标题】:Git - How to change url/path of a submoduleGit - 如何更改子模块的 url/路径
【发布时间】:2020-01-31 12:00:10
【问题描述】:

这是我的.gitmodules

[submodule "app/code/EthanYehuda/CronjobManager"]
        path = app/code/EthanYehuda/CronjobManager
        url = https://company@bitbucket.org/some_user/ethanyehuda_cronjobmanager.git

我需要把网址改成https://github.com/Ethan3600/magento2-CronjobManager.git

所以我只是改变了它:

[submodule "app/code/EthanYehuda/CronjobManager"]
        path = app/code/EthanYehuda/CronjobManager
        url = https://github.com/Ethan3600/magento2-CronjobManager.git

然后我将文件添加到暂存区并提交:

git add .gitmodules
git commit -m "change url of submodule xy"

然后我执行了git submodule update --init。但是如果我去app/code/EthanYehuda/CronjobManager并显示遥控器,那么我仍然会得到https://company@bitbucket.org/some_user/ethanyehuda_cronjobmanager.git

【问题讨论】:

标签: git git-submodules


【解决方案1】:

.gitmodules 保留建议的默认值,您的更改将在设置后续克隆时生效。

一旦有人完成了克隆,生成的存储库就只是一个存储库。您可以进入现有子模块的目录并以通常的方式更改其原始远程 url,但git submodule 命令具有a handy shortcut

git submodule sync

为你填写所有的空白。

sync [--recursive] [--] [<path>…​]

将子模块的远程 URL 配置设置同步到 .gitmodules 中指定的值。它只会影响那些在.git/config 中已经有 URL 条目的子模块(即它们被初始化或新添加的情况)。当子模块 URL 更改上游并且您需要相应地更新本地存储库时,这很有用。

git submodule sync 同步所有子模块,而git submodule sync -- A 仅同步子模块“A”。

如果指定--recursive,此命令将递归到注册的子模块,并同步其中的任何嵌套子模块。

【讨论】:

  • 不起作用。我用git remote set-url origin https://github.com/yireo/Yireo_Webp2.git 更改了另一个存储库(app\code\Yireo\Webp2)的URL。然后我执行了git submodule sync。但是文件.gitmodules 没有更新为新的URL。
  • 不,你必须已经更新.gitmodules,然后子模块同步。正如引用的文档所说,同步会根据.gitmodules 中的内容更新远程设置。
  • 我想这个解决方案会起作用,如果 git 历史不是完全不同的话。
  • 嗯?那有什么关系? Git 在可用的历史记录中查找为路径记录的提交。将 url 切换到一个新的 repo,在那里获取历史记录,完成。现在您的子模块存储库具有旧上游和新上游的历史记录,这没有任何问题。
  • 举个例子:那不是一个目录,你只是删除了一个指向主项目.git中未触及的子模块repo的指针,git submodule update恢复了指针。
【解决方案2】:

有关更多信息,请参阅this 答案。

这些命令将在命令提示符下完成工作,而不会更改本地存储库中的任何文件

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Development
git submodule sync
git submodule update --init --recursive --remote

【讨论】:

  • 这看起来比它应该的要复杂得多。这是官方的方式吗?
【解决方案3】:

从 git v2.25.0 (changelog) 开始,git submodule 学习新的 set-url 命令。

要使用它,只需 git submodule set-url -- <path> <url>

对你来说是: git submodule set-url -- app/code/EthanYehuda/CronjobManager https://github.com/Ethan3600/magento2-CronjobManager.git

注意:无论您在 git 中的哪个位置,路径都应该是相对于顶级目录的。

【讨论】:

    【解决方案4】:

    对我来说,我找到的解决方案不起作用,因为我的存储库的 git 历史记录与新存储库的历史记录完全不同。

    让我解释一下。我收到了一个 Zip 文件的项目。我初始化了一个新的 repo 并提交了文件并将其推送到我的 bitbucket。

    然后我发现,这是一个公共的 github 项目。所以我想将 URL 更改为 github 存储库。但是它们的 git 历史完全不同(我的仓库只有一个初始提交,而 github 仓库包含所有提交。)

    所以仅仅改变 URL 是行不通的。

    所以我不得不删除子模块并重新创建它。

    提示<name_of_submodule> = app/code/EthanYehuda/CronjobManager(在我的 案例)

    删除:

    git submodule deinit <name_of_submodule>
    git rm -f <name_of_submodule>
    rm -rf .git/modules/<name_of_submodule>
    git commit -m "Deleted submodule xy"
    

    重新添加:

    git submodule add --force https://github.com/example/foo-bar.git <name_of_submodule>
    git commit -m "Add submodul xy"
    

    获取子模块 app/code/EthanYehuda/CronjobManager 错误: 服务器拒绝对未指定对象的请求 9b677ef0e750acb9292030306bd97a3ee2734c61

    ↑ 如果在克隆项目后出现这样的错误,例如暂存,那么你必须在git pull之后syncupdate --init

    git submodule sync
    git submodule update --init
    

    【讨论】:

      【解决方案5】:

      您需要在更新 url 后删除并重新同步您的子模块。

      请参考这个答案。 https://stackoverflow.com/a/14405542/1895270

      【讨论】:

      • 不起作用。一步一步尝试...我得到error: The server rejects a request for an object not offered 86bbb310a268106bae244bc50bb6232fa8f0727f.
      • "fetch" executed in submodule path 'app / code / Fooman / GoogleAnalyticsPlus', but 86bbb310a268106bae244bc50bb6232fa8f0727f not contain. Requesting this commit directly failed.
      • 我认为错误显示了,因为我的第一个存储库是我自己的,它只有一个初始提交,而新的存储库是来自 github 的全新 git 历史记录
      • 如果您没有更改到具有完全其他 git 历史记录的存储库,那么我猜您的方法有效。
      猜你喜欢
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 2014-02-17
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      相关资源
      最近更新 更多