从 git 版本 1.9.3 开始,删除 git 子模块的方法是什么?

What is the way to remove a git submodule as of git version 1.9.3?

从 git 版本 1.9.3 (Apple Git-50) 开始 mac 如何删除 git 子模块?我正在阅读很多过时的信息,许多开发人员告诉我他们不会工作。目前的方式是什么? git deinit pathToSubModule 会成功吗?

我认为可行的步骤是 here,但评论说它们行不通。

让我解释一下我目前的情况和我需要完成的事情。我已经安装了 the Quick repository 并将其作为子模块添加到我的项目中。此代码已签入,其他人正在使用它。我现在需要做的是 fork 相同的 Quick 存储库并将其托管在我公司拥有的更安全的 github 上(因此完全是另一个私人 git中心)。分叉后,我想将该分叉添加为 git 子模块,并让它替换我之前安装的当前 Quick 子模块。

更新:我读到以下是最新git版本的正确方法,请确认?

To remove a submodule added using:

git submodule add blah@blah.com:repos/blah.git lib/blah
Run:

git rm lib/blah
That's it.

For old versions of git (circa ~1.8.5) use:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah

你有 git submodule deinit

git submodule deinit <asubmodule>    
git rm <asubmodule>
# Note: asubmodule (no trailing slash)
# or, if you want to leave it in your working tree
git rm --cached <asubmodule>
rm -rf .git/modules/<asubmodule>

deinit

Un-register the given submodules, i.e. remove the whole submodule.$name
section from .git/config together with their work tree.

Further calls to git submodule update, git submodule foreach and git submodule sync will skip any unregistered submodules until they are initialized again, so use this command if you don’t want to have a local checkout of the submodule in your work tree anymore.

If you really want to remove a submodule from the repository and commit that use git rm instead.

If --force is specified, the submodule’s work tree will be removed even if it contains local modifications.

如何安全地删除子模块。

(添加到 )

  1. 列出并找到 .gitmodules 文件中的子模块部分。通过终端 vi .gitmodules 说。示例:

    [submodule "submodules/afnetworking"]
        path = submodules/afnetworking
        url = https://github.com/CompanyName/afnetworking.git
    
  2. 子模块可以与本地分支一起使用。对于较长的 运行 项目,代码可能与原始 repo 不同,并且可能有一些修复。验证子模块代码是否在项目过程中经历了更改是个好主意。示例:查看日志,它是否指向 master 分支或某个本地分支。探索 git 日志以查找通过终端完成的修改。通常这些存储在一个目录下,我的示例在 submodules 目录下。

    User$ cd submodules/afnetworking
    User$ git log
    
  3. 从 .gitmodules 中删除子模块部分,保存文件。示例:git status 应仅显示修改后的

    modified:   .gitmodules
    
  4. 使用 git add .gitmodules 进行更改。

  5. 列出并找到 .git/config 文件中的子模块部分。通过终端 vi .git/config 说。示例:

    [submodule "submodules/afnetworking"]
        url = https://github.com/CompanyName/afnetworking.git
    
  6. 删除 git 缓存 sobmodule 文件。 运行 git rm --cached submodules/afnetworking(没有尾部斜杠)将成功删除它。示例:

    User$ git rm --cached submodules/afnetworking
    rm 'submodules/afnetworking'    <-- terminal output
    
  7. rm -rf .git/modules/...删除.git目录下的子模块文件。之后用git status确认。

    User$ rm -rf .git/modules/submodules/afnetworking/
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
        modified:   .gitmodules
        deleted:    submodules/afnetworking
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    
  8. 提交更改。之后用 git status 确认。

    User$ git commit -m "Remove submodule afnetworking"
    [feature/replace-afnetworking-submodule-with-pod 70e239222] Remove submodule afnetworking
    2 files changed, 4 deletions(-)
      delete mode 160000 submodules/afnetworking
    User$ git status
    On branch feature/replace-afnetworking-submodule-with-pod
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        submodules/afnetworking/
    nothing added to commit but untracked files present (use "git add" to track)
    
  9. 删除未跟踪的子模块文件。

    User$ rm -rf submodules/afnetworking
    
  10. 从 Xcode 项目中删除引用。构建、修复编译和运行时问题。

我正在使用 Git 版本 2.16.2,git rm 大部分情况下都能很好地完成工作:

git rm path-to-submodule

您可以使用 git statusgit diff --cached 验证这会取消初始化子模块并自动修改 .gitmodules。与往常一样,您需要提交更改。

然而,即使子模块已从源代码管理中删除,.git/modules/path-to-submodule 仍包含子模块存储库,.git/config 包含其 URL,因此您仍然需要手动删除它们:

git config --remove-section submodule.path-to-submodule
rm -rf .git/modules/path-to-submodule

保留子模块存储库和配置是有意的,以便您可以撤消删除操作,例如git reset --hard.