在 git 版本1.9.3中删除 git 子模块的方法是什么?

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

我认为会工作的步骤是 给你,但评论说,他们不会。

让我解释一下我的现状和我需要完成的事情。我已经安装了 快速存储库,并将它作为子模块添加到我的项目中。此代码已经签入,其他人正在使用它。我现在需要做的是使用相同的 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
80940 次浏览

You have the 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.

How to safely remove a submodule.

(adds to https://stackoverflow.com/a/1260982/342794)

  1. List and locate the submodule section in .gitmodules file. Say via terminal vi .gitmodules. Example:

    [submodule "submodules/afnetworking"]
    path = submodules/afnetworking
    url = https://github.com/CompanyName/afnetworking.git
    
  2. Submodules can be used with local forks. For a long running projects, code may differ from original repo and might have some fixes. It's a good idea to verify if submodule code went through changes over the course of project. Example: Look at the logs, if it's pointing to master branch or some local branch. exploring git logs to find modifications that were done via terminal. typically these are stored under a directory, my example, under submodules directory.

    User$ cd submodules/afnetworking
    User$ git log
    
  3. Remove the submodule section from .gitmodules, save the file. Example: git status should show only following as modified

    modified:   .gitmodules
    
  4. Stage the changes with git add .gitmodules.

  5. List and locate the submodule section in .git/config files. Say via terminal vi .git/config. Example:

    [submodule "submodules/afnetworking"]
    url = https://github.com/CompanyName/afnetworking.git
    
  6. Remove the git cache sobmodule files. running git rm --cached submodules/afnetworking (no trailing slash) would remove it successfully. Example:

    User$ git rm --cached submodules/afnetworking
    rm 'submodules/afnetworking'    <-- terminal output
    
  7. Remove the submodule files under .git directory with rm -rf .git/modules/.... Confirm it with git status afterwards.

    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. Commit the changes. Confirm with git status afterwards.

    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. Delete the untracked submodule files.

    User$ rm -rf submodules/afnetworking
    
  10. Delete the references from Xcode project. Build, fix compile and runtime issues.

I'm using Git version 2.16.2 and git rm does the job mostly well:

git rm path-to-submodule

You can verify with git status and git diff --cached that this deinitializes the submodule and modifies .gitmodules automatically. As always, you need to commit the change.

However, even though the submodule is removed from source control, .git/modules/path-to-submodule still contains the submodule repository and .git/config contains its URL, so you still have to remove those manually:

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

Keeping the submodule repository and configuration is intentional so that you can undo the removal with e.g. git reset --hard.