What is the current way to remove a git submodule?

as of git version 1.9.3 (Apple Git-50) on mac how do i remove a git submodule? I am reading alot of outdated information with many developers telling me they wont work. What is the current way ? will git deinit pathToSubModule do the trick ?

The steps i thought would work are here but comments say they wont.

Let me explain my current situation and what i need accomplished. I've installed the Quick repository and added it to as submodule to my project. This code is already checked in and others are using it. What i now need to do is fork the same Quick repository and host it on a more secure github that my company has (so a completely other private github). After forking it i want to add that fork as a gitSubmodule and let it replace the current Quick submodule i had installed previously.

update: i've read that the following is the correct way on latest git version please confirm?

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

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, ie 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)

  • 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
    
  • 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
    
  • Remove the submodule section from .gitmodules, save the file. Example: git status should show only following as modified

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

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

    User$ rm -rf submodules/afnetworking
    
  • 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 eg git reset --hard .

    链接地址: http://www.djcxy.com/p/16456.html

    上一篇: 无法在Ubuntu上更新Git

    下一篇: 目前删除git子模块的方式是什么?