解决方案:从--cached中删除git rm -r --cached submodule/name。脚本化供参考。
我试图删除基于这就是答案的git子模块,但是子模块没有被删除。
我添加子模块,提交更改,然后使用git rm -r --cached $path/to/submodule (减去尾部/ )删除它,提交更改,但是子模块仍然存在。
我可以使用rm -rf submodules/lift_sbt_24删除文件夹和内容,但是为什么git rm -r --cached不这样做呢?
(从.gitmodules中删除相关部分很好,没有问题,因此这里没有提到)
这是Ubuntu11.10,fwiw上的git 1.7.5.4。完整的例子:
$> git submodule add git@github.com:lift-stack/lift_24_sbt.git submodules/lift_24_sbt
Adding submodule from repo git@github.com:lift-stack/lift_24_sbt.git as submodules/lift_24_sbt
Cloning into submodules/lift_24_sbt...
remote: Counting objects: 619, done.
remote: Compressing objects: 100% (375/375), done.
remote: Total 619 (delta 172), reused 593 (delta 147)
Receiving objects: 100% (619/619), 1.74 MiB | 112 KiB/s, done.
Resolving deltas: 100% (172/172), done.
$> git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commits.
#
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: .gitmodules
# new file: submodules/lift_24_sbt
#
$> git add -a
$> git commit 'added submodules/lift_24_sbt'
[master 9894113] update
2 files changed, 4 insertions(+), 0 deletions(-)
create mode 160000 submodules/lift_24_sbt
$> git rm -r --cached submodules/lift_24_sbt
rm 'submodules/lift_24_sbt'
$> git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commits.
#
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: submodules/lift_24_sbt
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# submodules/lift_24_sbt/
$> git add -a
$> git commit -m 'deleted submodules/lift_24_sbt'
# On branch master
# Your branch is ahead of 'origin/master' by 1 commits.
#
nothing to commit (working directory clean)
$> ls -al submodules/lift_24_sbt/
total 1060
drwxr-xr-x 5 kurtosis kurtosis 4096 2012-04-18 17:26 ./
drwxrwxr-x 6 kurtosis kurtosis 4096 2012-04-18 17:26 ../
drwxrwxr-x 8 kurtosis kurtosis 4096 2012-04-18 17:32 .git/
drwxrwxr-x 2 kurtosis kurtosis 4096 2012-04-18 17:26 project/
drwxrwxr-x 3 kurtosis kurtosis 4096 2012-04-18 17:26 src/
-rw-rw-r-- 1 kurtosis kurtosis 931 2012-04-18 17:26 build.sbt
-rw-rw-r-- 1 kurtosis kurtosis 463 2012-04-18 17:26 .gitignore
-rw-rw-r-- 1 kurtosis kurtosis 91 2012-04-18 17:26 README.md
-rwxrwxr-x 1 kurtosis kurtosis 110 2012-04-18 17:26 sbt*
-rw-rw-r-- 1 kurtosis kurtosis 131 2012-04-18 17:26 sbt.bat
-rw-rw-r-- 1 kurtosis kurtosis 1041753 2012-04-18 17:26 sbt-launch.jar
$> git --version
git version 1.7.5.4发布于 2012-05-06 02:25:36
您所看到的是正确的;实际上,git rm --cached -r并不从working tree中删除文件,只从index中删除这些文件。如果希望git同时从index和working tree中删除文件,则不应该使用--cached。有关更多信息,请参见手册页。
下面是你所做的事情的解释。我假设您键入了所执行的步骤,而不是从终端复制;据我所知,git add -a是不是已知的git-add标志;我还相当肯定您也是指git commit -m <message>。
你所采取的削减措施:
# First, add the submodule.
$> git submodule add git@github.com:lift-stack/lift_24_sbt.git submodules/lift_24_sbt
# Check that the submodule exists. (It does).
$> git status
# Add everything to the staging area from the working tree.
$> git add -a
# Commit all changes.
$> git commit 'added submodules/lift_24_sbt'此时,您已经成功地添加了模块,并且一切都如预期的那样工作。
接下来要做的是删除模块:
$> git rm -r --cached submodules/lift_24_sbt注意事项:在这里,我们做的不是,而是从working index中删除文件,只从index中删除文件,因为--cached
-缓存使用此选项只从索引中删除和删除路径。无论修改与否,工作树文件都将被单独保存。
然后,检查是否删除了子模块:
$> git status
... <snip>
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: submodules/lift_24_sbt如您所见,子模块已被删除,并且一切都很好。但是,请注意,这些文件仍然存在于工作树中--您仍然可以使用ls查看它们。:)
发布于 2013-04-23 06:09:29
通过使用一个新命令(git1.8.3,2013年4月22日d),您可以尝试简化脚本,并在“如何删除Git子模块?”的新答案中详细说明:
git submodule deinit它应该删除子模块工作树,并从.git/config中注销它。
https://stackoverflow.com/questions/10220140
复制相似问题