What is the way to remove a git submodule as of git version 1.9.3?
GitGithubGit SubmodulesGit Problem Overview
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 [email protected]: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 Solutions
Solution 1 - Git
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.
Solution 2 - Git
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
.
Solution 3 - Git
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 terminalvi .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, undersubmodules
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 modifiedmodified: .gitmodules
-
Stage the changes with
git add .gitmodules
. -
List and locate the submodule section in
.git/config
files. Say via terminalvi .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 withrm -rf .git/modules/...
. Confirm it withgit 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.