如何修改git子模块的远程仓库?

bihw5rsg  于 2023-01-24  发布在  Git
关注(0)|答案(9)|浏览(355)

我创建了一个git仓库,里面有一个子模块,我可以告诉子模块自己去改变它的远程仓库路径,但是我不知道如何告诉父仓库如何改变子模块的远程仓库路径。
如果我运气不好,不得不手动操作,我不会感到惊讶,因为即使删除子模块也不容易。

llmtgqce

llmtgqce1#

您应该只能够编辑.gitmodules文件来更新URL,然后运行git submodule sync --recursive以将该更改反映到超级项目和工作副本中。
然后你需要转到.git/modules/path_to_submodule目录并修改它的配置文件来更新git路径。
如果回购历史记录不同,则需要手动 checkout 新分支:

git submodule sync --recursive
cd <submodule_dir> 

git fetch
git checkout origin/master
git branch master -f
git checkout master
h6my8fg2

h6my8fg22#

在Git 2.25(2020年第一季度)中,你可以修改它。
请参见“Git submodule url changed“和新命令

git submodule set-url [--] <path> <newurl>

(On --分隔符,参见“double hyphen as a signal to stop option interpretation and treat all following arguments literally“)
警告:Hi-Angel在注解中提到(甚至在Git 2.31.1中也测试过):
使用git submodule set-url时应该小心,因为它有一个bug:
如果在.gitmodules文件中,路径看起来像some-path,然后执行git submodule set-url some-path/ new-url(注意后面的斜杠/),那么,命令将 * 添加 * 另一个子模块,而不是修改现有的子模块。
原答案(2009年5月,十四年前)
实际上,是一个补丁has been submitted in April 2009来澄清gitmodule的角色。
因此,现在gitmodule documentation还不包括:
.gitmodules文件位于git工作树的顶层目录,是一个文本文件,其语法符合linkgit:git-config 4的要求。
[NEW]:
由于这个文件是由Git管理的,它跟踪项目子模块的+记录。
存储在此文件中的信息用作提示,以准备存储在项目配置文件中的记录的权威版本。
用户特定的记录更改(例如,考虑到由于网络情况而导致的子模块URL差异)应在配置文件中进行,而要传播的记录更改(例如,由于子模块源的重新定位而导致的+)应在此文件中进行。
这几乎证实了吉姆的回答。
如果按照git submodule tutorial的说明操作,您会发现需要一个“git submodule init“来将子模块存储库URL添加到.git/config。
git submodule sync“具有been added in August 2008,这正是为了在URL更改时使任务变得更容易(特别是在子模块的数量很重要的情况下)。
与该命令相关联脚本非常简单:

module_list "$@" |
while read mode sha1 stage path
do
    name=$(module_name "$path")
    url=$(git config -f .gitmodules --get submodule."$name".url)
    if test -e "$path"/.git
    then
    (
        unset GIT_DIR
        cd "$path"
        remote=$(get_default_remote)
        say "Synchronizing submodule url for '$name'"
        git config remote."$remote".url "$url"
    )
    fi
done

目标仍然是:一米十纳一x

mfuanj7w

mfuanj7w3#

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

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

截图请看博客:Changing GIT submodules URL/Branch to other URL/branch of same repository

ngynwnxp

ngynwnxp4#

简单来说,你只需要编辑.gitmodules文件,然后重新同步并更新:
编辑文件,通过git命令或直接编辑:

git config --file=.gitmodules -e

或者只是:

vim .gitmodules

然后重新同步并更新:

git submodule sync
git submodule update --init --recursive --remote
cxfofazt

cxfofazt5#

什么对我有用(在Windows上,使用git版本1.8.3.msysgit.0):

  • 使用新资源库的URL更新.gitmodules
  • 从“.git/config”文件中删除相应的行
  • 删除“.git/modules/external”目录中的相应目录(对于最新的git版本为“.git/modules”)
  • 删除检出的子模块目录本身(不确定是否有必要)
  • 运行git submodule initgit submodule update
  • 确保 checkout 的子模块处于正确的提交位置,并提交该提交,因为散列可能会有所不同

在完成所有这些之后,一切都处于我所期望的状态。我想仓库的其他用户在更新时也会有类似的痛苦--在提交消息中解释这些步骤是明智的!

3htmauhk

3htmauhk6#

只需编辑**.git/config**文件即可。如果您有一个 “common” 子模块,您可以在超级模块中执行此操作:

git config submodule.common.url /data/my_local_common
jljoyd4f

jljoyd4f7#

git config --file=.gitmodules -e将打开缺省编辑器,您可以在其中更新路径

tpgth1q7

tpgth1q78#

蛮力方法:

  • 更新超模块中的X1 M0 N1 X文件以指向新的子模块URL,
  • 添加并提交对supermodule/.gitmodules的改变,
  • 在你的计算机上的其他地方制作一个新的超模块克隆(确保对.gitmodules文件的最新修改反映在克隆中),
  • 将工作目录更改为超模块的新克隆,
  • 在子模块上运行git submodule update --init --remote path-to-submodule

瞧!超级模块的新克隆中的子模块配置正确!

l2osamch

l2osamch9#

很多人(包括这里和互联网上)建议需要手动编辑或删除多个文件的解决方案,但这真的没有必要!
即使在Git 2.25(以及git submodule set-url <path> <newurl>)不可用的环境中,最简单的解决方案也是简单地“注销”子模块,然后用新的URL重新添加它。
根据Git版本和子模块设置,您 * 可能 * 需要手动删除<path>,然后再添加它。

git submodule deinit <path>
rm -rf <path>
git submodule add <repository> [<path>]

之后.gitmodules文件将有一个不同的URL,并且应该被提交。所有其他位置(config,工作树)已经被git处理过了。
为了解释deinit的作用,我想引用Git手册中的一段话:

一个月五个月一个月

取消注册给定的子模块,也就是从.git/config中删除整个submodule.$name节及其工作树。进一步调用[..]将跳过任何未注册的子模块,直到它们被重新初始化

相关问题