删除git子模块的当前方法是什么?

时间:2015-04-24 14:24:32

标签: git github git-submodules

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

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

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

3 个答案:

答案 0 :(得分:166)

您拥有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

  

取消注册给定的子模块,即删除整个submodule.$name
    来自.git/config的部分及其工作树。

     

git submodule updategit submodule foreachgit submodule sync的进一步调用将跳过任何未注册的子模块,直到它们再次初始化为止,因此如果不这样做,请使用此命令想要在工作树中本地检查子模块。

     

如果您确实要从存储库中删除子模块并提交使用git rm的子模块。

     

如果指定了--force,则子模块的工作树即使包含本地修改也将被删除。

答案 1 :(得分:3)

如何安全删除子模块。

(添加到https://stackoverflow.com/a/1260982/342794

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

    [submodule "submodules/afnetworking"]
        path = submodules/afnetworking
        url = https://github.com/CompanyName/afnetworking.git
    
  2. 子模块可以与本地分叉一起使用。对于长期运行的项目,代码可能与原始仓库不同,可能会有一些修复。验证子模块代码是否在项目过程中经历了更改是一个好主意。示例:查看日志,如果它指向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 cache sobmodule文件。运行git rm --cached submodules/afnetworking(没有尾部斜杠)会成功删除它。例如:

    User$ git rm --cached submodules/afnetworking
    rm 'submodules/afnetworking'    <-- terminal output
    
  7. 使用.git删除rm -rf .git/modules/...目录下的子模块文件。之后用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项目中删除引用。构建,修复编译和运行时问题。

答案 2 :(得分:1)

我正在使用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