Git - 如何更改子模块的URL/路径

23

这是我的.gitmodules文件:

Translated:

This is my .gitmodules file:

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

我需要将URL更改为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子模块更改远程仓库? - Potherca
5个回答

30

.gitmodules 文件包含默认的建议修改,只有在设置后续克隆时才会生效。

一旦有人完成了克隆操作,生成的存储库就是一个存储库。您可以进入现有子模块的目录,并按照通常的方式更改其来自远程的 url,但 git submodule 命令具有便捷的快捷方式

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。 - Black
3
不行,你必须先更新.gitmodules,然后再运行子模块同步命令。正如引用的文档所说,同步会从.gitmodules文件中更新远程设置。 - jthill
哎?那有什么关系呢?Git会在可用的历史记录中查找路径记录的提交。将URL切换到新的存储库,获取历史记录,完成。现在你的子模块存储库具有来自旧上游和新上游的历史记录,这一点都没有任何问题。 - jthill
1
举个例子:那不是一个目录,你只是删除了主项目 .git 中未受影响的子模块仓库的指针,而 git submodule update 恢复了指针。 - jthill
那么我该如何正确解决这个问题呢?到目前为止,只有我的方法有效。 - Black
显示剩余4条评论

21

自从git v2.25.0版本(更新日志)以来,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中处于何处,路径都应相对于顶级目录。


8

请查看这个答案了解更多信息。

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

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

这看起来比它应该的要复杂得多。这是官方的方式吗? - Black

4

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

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

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

因此,仅更改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

↑ 如果在克隆(如staging)上拉取项目后出现这样的错误,则必须在 git pull 后进行 syncupdate --init 操作:

git submodule sync
git submodule update --init

1

不起作用。逐步尝试了一下...我收到了“错误:服务器拒绝请求未提供的对象86bbb310a268106bae244bc50bb6232fa8f0727f”的消息。 - Black
"fetch" executed in submodule path 'app / code / Fooman / GoogleAnalyticsPlus', but 86bbb310a268106bae244bc50bb6232fa8f0727f not contain. Requesting this commit directly failed. - Black
我认为错误是因为我的第一个存储库是我自己的,只有一个初始提交,而新的存储库则具有来自Github的全新git历史记录。 - Black
如果你要切换到一个完全不同的 Git 历史记录的仓库,那么我猜你的方法是行得通的。 - Black

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接