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
.
上一篇: 无法在Ubuntu上更新Git
下一篇: 目前删除git子模块的方式是什么?