【问题标题】:Git Submodule : Cannot update submodule to an earlier revisionGit子模块:无法将子模块更新到早期版本
【发布时间】:2017-06-02 03:56:56
【问题描述】:

我花了很多时间阅读和尝试 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,但它只是简单地返回

输入名称_of_the_submodule

已经是最新的了。

谁能帮帮我?

P.S:我已经阅读了许多教程和问答。因此,如果您想对此投反对票以取乐,请先指出答案,我将删除此帖子。

【问题讨论】:

    标签: git-submodules


    【解决方案1】:

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

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

    以下帖子显示:

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

    添加子模块

    git 子模块添加 -b

    .gitmodules 中的条目(名称、路径、url、分支)通过

    下载相应的子模块
    git submodule update --init
    

    这做了三个重要的事情,前两个对用户是隐藏的:

    1. 使用额外的条目(子模块)更新 .git/config

    2. 在 .git/modules 下以裸形式下载存储库。这意味着,.git 中有 .git。

    3. 将 .git/modules 中的 git 子模块检出到父目录中。

    现在,在第 2 天,提交子模块的提交者意识到,他应该将子模块更改为其他提交,而不是 HEAD。所以,他会去他的本地存储库,然后去子模块路径,然后通过简单地调用来签出他想要的提交

    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
    

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

    删除子模块

    现在,在第 4 天,提交者决定完全删除 git 子模块。这里的步骤也不简单,因为没有什么叫做 git submodule rm 应该等同于 git submodule add。只有遵循以下顺序才能做到这一点:

    git submodule deinit submodulename
    
    1. 这会删除 .git/config 条目。

    2. 这将清除子模块目录!执行此命令后,您将在 submdoule 目录中看不到任何内容。

    3. 但是.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 下的裸存储库都在那里!没有删除它们的命令。所有这些都必须通过手动明确删除..(如果我错了,请纠正我)

    【讨论】:

      【解决方案2】:

      按照问题中的描述克隆子模块后:

      git submodule add -b master url localpath
      

      那么你应该可以changedir到子模块:

      cd localpath
      

      一旦进入子模块,你可以使用任何 git 命令,它们只会影响子模块的 repo。例如,您可以签出那个神圣的分支或修订:

      git checkout <branch|tag|hash>
      

      或在 master 分支中检出倒数第二个修订:

      git checkout HEAD~1
      

      然后changedir回到主git repo:

      cd ..
      

      git status 应该产生类似:

      On branch master
      Changes to be committed:
        (use "git reset HEAD <file>..." to unstage)
      
          new file:   .gitmodules
          new file:   localpath
      
      Changes not staged for commit:
        (use "git add <file>..." to update what will be committed)
        (use "git checkout -- <file>..." to discard changes in working directory)
      
          modified:   localpath (new commits)
      

      然后只需将 更改 添加到您的子模块:

      git add localpath
      

      并提交

      git commit -m "Add submodule url to localpath with older working commit"
      

      【讨论】:

      • 知道了!有几个教程是指使用 更改您的 .gitmodule 文件。所有这些都失败了,因此造成了混乱。最简单的方法是克隆整个分支(不考虑提交 id),然后在您想要的提交 id 的子模块中执行 git checkout,然后在父分支中执行 git 提交,然后推送。
      • 还有一件事。其他已经下载了包括子模块在内的整个代码的开发者需要调用 git pull 然后调用 git submodule update 或 git submodule update --remote 来同步最新的子模块更改。
      • 是的,每次更改子模块引用时,在父 repo 上执行 git pull 时,子模块将显示为 modified。要将子模块更新为新引用,只需在主仓库上运行 git submodule update
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 2012-04-27
      • 2012-09-14
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多