gpt4 book ai didi

git-submodules - Git 子模块 : Cannot update submodule to an earlier revision

转载 作者:行者123 更新时间:2023-12-04 12:18:29 24 4
gpt4 key购买 nike

我花了很多时间阅读和尝试 git 子模块。但我真的放弃了。

我的问题:

我正在克隆一个 git 存储库作为子模块。所以,我做

git submodule add -b master url localpath

存储库开始下载并在 .gitmodules 文件中创建相应的条目。 git submodule status 显示最新的提交。

到现在为止还挺好。

在开发过程中,发现子模块中的HEAD commit有一个bug。因此,提交应该从 master 更改为某个提交 id。

因此,我从 branch = master 更改了 .gitmodule 文件中的提交 ID( 7 aplhanumeric )
branch = <commitid> -> .gitmodule file

并且做了
git submodule update --remote

错误是

致命:需要一个修订版

无法在子模块路径中找到当前来源/修订版

我也试过
 git submodule foreach git pull

以便它会提取提交 ID,但它只是返回

输入 name_of_the_submodule

已经是最新的了。

谁能帮帮我吗?

P.S:我已经看过很多教程和问答了。因此,如果您想为了好玩而拒绝投票,那么请先指出一个答案,我将删除这篇文章。

最佳答案

经过一些研究,我正在回答我自己的问题,这可能对其他人有帮助:

理解 git 子模块是一件很痛苦的事情,但是一旦你明白了,一切就变得有意义了!

以下帖子显示:

  • 添加子模块并让其他人与您的子模块同步。
  • 更新子模块并让其他人与您的子模块同步。
  • 删除子模块并让其他与您的子模块同步。
  • 更新删除的子模块。

  • 添加子模块

    git子模块添加-b

    .gitmodules ( name, path, url, branch ) 中的条目通过以下方式下载相应的子模块
    git submodule update --init

    这做了三件重要的事情,其中​​前两项是对用户隐藏的:
  • 使用额外的条目(子模块)更新 .git/config
  • 在 .git/modules 下以裸形式下载存储库。这意味着,.git 中有 .git。
  • 将 .git/modules 中的 git 子模块 check out 到父目录中。

  • 现在,在第 2 天,提交子模块的提交者意识到他应该将子模块更改为其他提交而不是 HEAD。因此,他会转到他的本地存储库,然后转到子模块路径,然后通过简单地调用来 checkout 他想要的提交
    git checkout <hash>
    cd <parent dir>
    git submodule status

    此时,git子模块状态仍然没有显示新的哈希值。新的散列仅在更改被暂存时才可见。现在,提交者只需要暂存(添加)、提交和推送更改,以便所有其他开发人员都可以看到它。

    更新添加的子模块

    在第 3 天,其他开发人员将通过调用命令来更新他们的存储库
    git pull # this is to get the latest commit of the parent git repository.
    git submodule update --force # update the submodule with latest hash

    基本上,这里的要点很简单:子模块在被告知之前不会使用react,除非它被告知这样做。只是做 git pull,不会更新 git 子模块。开发人员可以继续处理他们的本地子模块,而不是“永远”将它们同步到服务器上的子模块。子模块更新将在显式调用 git submodule update 命令时发生。

    移除子模块

    现在,在第 4 天,提交者决定完全删除 git 子模块。这里的步骤也不简单,因为没有什么叫做 git submodule rm 应该等同于 git submodule add。这只能并且仅当遵循以下顺序时才能完成:
    git submodule deinit submodulename
  • 这将删除 .git/config 条目。
  • 这会清除子模块目录!!执行此命令后,您将在 submdoule 目录中看不到任何内容。
  • 但是子模块的内容在 .git/modules
  • 下仍然可用

    因此这里的 git status -u 仍然会显示 Everyting 是最新的!

    所以显示删除,
    git rm submodulepath

    此时 git status 将返回 .gitmodules 已更改(子模块已删除)和子模块路径已删除。提交并推送更改。

    使用移除的子模块更新

    在第 5 天,开发人员希望像 git submodule update 那样“自动”删除子模块。所以他们首先做一个 git pull,它成功地删除了 git 子模块的所有索引
     git submodule status # shows nothing

    但是, .git/config 仍然包含有效的子模块条目,并且子模块文件夹包含其所有内容和 .git/submodules 下的裸存储库!没有删除它们的命令。所有这些都必须通过手动明确删除..(如果我错了,请纠正我)

    关于git-submodules - Git 子模块 : Cannot update submodule to an earlier revision,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43208065/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com