如何更改 git 子模块的远程存储库?
我创建了一个 git 存储库,其中包含一个子模块。 我可以告诉子模块本身更改其远程存储库路径,但我不确定如何告诉父存储库如何更改子模块的远程存储库路径。
如果我有点运气不好并且必须手动执行操作,我不会感到惊讶,因为即使删除子模块也不容易。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
您应该能够编辑 .gitmodules 文件来更新 URL,然后运行 git submodulesync --recursive 来反映对超级项目和工作副本的更改。
然后您需要转到 .git/modules/path_to_submodule 目录并更改其配置文件以更新 git 路径。
如果存储库历史记录不同,那么您需要手动签出新分支:
You should just be able to edit the
.gitmodules
file to update the URL and then rungit submodule sync --recursive
to reflect that change to the superproject and your working copy.Then you need to go to the
.git/modules/path_to_submodule
dir and change its config file to update git path.If repo history is different then you need to checkout new branch manually:
使用 Git 2.25(2020 年第 1 季度),您可以修改它。
请参阅“Git 子模块 url 已更改”和新命令
(在
--
分隔符上,请参阅“双连字符作为停止选项解释并按字面意思处理所有后续参数的信号”)警告 :Hi-Angel 提到在评论中(甚至使用 Git 2.31.1 进行了测试):
原始答案(2009年5月,十四年前)
实际上,补丁有于 2009 年 4 月提交,以阐明
gitmodule
角色。所以现在 gitmodule 文档 尚不包括:
这几乎证实了吉姆的回答。
如果您遵循此 git 子模块教程,您会发现您需要一个“
git submodule init
" 将子模块存储库 URL 添加到 .git/config。“
git submodulesync
”已 2008 年 8 月添加正是为了在 URL 更改时使该任务变得更容易(特别是在子模块的数量很重要的情况下)。与该命令关联的脚本非常简单:
目标仍然是:
git config remote."$remote".url "$url"
注意:
Git 2.40 (Q1 2023)澄清
git config remote..url
:请参阅 commit d390e08< /a>(2023 年 2 月 7 日)作者:Calvin Wan (
CalvinWan0101
)。(由 Junio C Hamano --
gitster
-- 合并于 提交 59397e9,2023 年 2 月 15 日)urls-remotes
现在包含在其 手册页:Git 2.44(2024 年第 1 季度),第 10 批,加强了 fsck 在记录的 URL 中进行的 URL 检查对于子模块。
因此,当您更改 URL 时,URL 有效性检查现在更加可靠。
请参阅 提交 8430b43、提交 7e2fc39, 提交 6af2c4a,提交 13320ff(2024 年 1 月 18 日),作者:维多利亚染料 (
vdye
)。(由 Junio C Hamano --
gitster
-- 合并于 提交 76bd129,2024 年 1 月 26 日)With Git 2.25 (Q1 2020), you can modify it.
See "Git submodule url changed" and the new command
(On the
--
separator, see "double hyphen as a signal to stop option interpretation and treat all following arguments literally")WARNING: Hi-Angel mentions in the comments (tested even with Git 2.31.1):
Original answer (May 2009, fourteen years ago)
Actually, a patch has been submitted in April 2009 to clarify
gitmodule
role.So now the gitmodule documentation does not yet include:
That pretty much confirm Jim's answer.
If you follow this git submodule tutorial, you see you need a "
git submodule init
" to add the submodule repository URLs to .git/config."
git submodule sync
" has been added in August 2008 precisely to make that task easier when URL changes (especially if the number of submodules is important).The associate script with that command is straightforward enough:
The goal remains:
git config remote."$remote".url "$url"
Note:
Git 2.40 (Q1 2023) clarifies
git config remote.<remote>.url
:See commit d390e08 (07 Feb 2023) by Calvin Wan (
CalvinWan0101
).(Merged by Junio C Hamano --
gitster
-- in commit 59397e9, 15 Feb 2023)urls-remotes
now includes in its man page:Git 2.44 (Q1 2024), batch 10, tightens URL checks fsck makes in a URL recorded for submodules.
So when you change the URL, the URL validity check is now more robust.
See commit 8430b43, commit 7e2fc39, commit 6af2c4a, commit 13320ff (18 Jan 2024) by Victoria Dye (
vdye
).(Merged by Junio C Hamano --
gitster
-- in commit 76bd129, 26 Jan 2024)这些命令将在命令提示符下完成工作,而不更改本地存储库上的任何文件
请查看博客的屏幕截图:将 GIT 子模块 URL/分支更改为同一存储库的其他 URL/分支
These commands will do the work on command prompt without altering any files on local repository
Please look at the blog for screenshots: Changing GIT submodules URL/Branch to other URL/branch of same repository
简单来说,您只需要编辑 .gitmodules 文件,然后重新同步和更新:
通过 git 命令或直接编辑文件:
或者只是:
然后重新同步并更新:
In simple terms, you just need to edit the .gitmodules file, then resync and update:
Edit the file, either via a git command or directly:
or just:
then resync and update:
对我有用的方法(在 Windows 上,使用 git 版本 1.8.3.msysgit.0):
完成所有这些操作后,一切都处于我期望的状态。 我想存储库的其他用户在更新时也会遇到类似的痛苦 - 在提交消息中解释这些步骤是明智的!
What worked for me (on Windows, using git version 1.8.3.msysgit.0):
git submodule init
andgit submodule update
After doing all that, everything is in the state I would expect. I imagine other users of the repository will have similar pain when they come to update though - it would be wise to explain these steps in your commit message!
只需编辑您的 .git/config 文件即可。 例如; 如果您有一个“common”子模块,您可以在超级模块中执行此操作:
Just edit your .git/config file. For example; if you have a "common" submodule you can do this in the super-module:
git config --file=.gitmodules -e
打开默认编辑器,您可以在其中更新路径git config --file=.gitmodules -e
opens the default editor in which you can update the path强力方法:
.gitmodules
文件以指向新的子模块 url,supermodule/.gitmodules
,.gitmodules
文件的最新更改反映在克隆中),在子模块上执行 git submodule update --init --remote path-to-submodule
,瞧! 超级模块的新克隆中的子模块已正确配置!
A brute force approach:
.gitmodules
file in the supermodule to point to the new submodule url,supermodule/.gitmodules
,.gitmodules
file are reflected in the clone),git submodule update --init --remote path-to-submodule
on the submodule,et voilà! The submodule in the new clone of the supermodule is properly configured!