7

解决方案:--cachedgit rm -r --cached submodule/name. 脚本供参考。


我正在尝试根据这个 SO answer删除一个 git 子模块,但该子模块没有被删除。

我添加子模块,提交更改,然后使用git rm -r --cached $path/to/submodule(减去尾随 / )删除它,提交更改,但子模块仍然存在。

我可以rm -rf submodules/lift_sbt_24用来删除文件夹和内容,但为什么不git rm -r --cached这样做呢?

(从 .gitmodules 中删除相关部分可以正常工作,没问题,因此此处未提及)

这是 Ubuntu 11.10 上的 git 1.7.5.4,fwiw。完整示例:

$> 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
4

2 回答 2

12

你看到的是正确的;git rm --cached -r实际上,不会中删除文件,而working tree只是从index. 如果git要从index 中删除文件,则working tree不应使用--cached. 有关更多信息,请参见git-rm手册页


以下是对您所做操作的说明。我假设您输入了您采取的步骤,而不是从终端复制;据我所知,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

--cached
       Use this option to unstage and remove paths only from the index. Working tree
       files, whether modified or not, will be left alone.

然后,检查我们是否删除了子模块:

$> git status
... <snip> 
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    submodules/lift_24_sbt

如您所见,子模块已被删除,一切正常。但是请注意,这些文件仍然存在于工作树中- 您仍然可以使用ls. :)

于 2012-05-06T02:25:36.233 回答
1

您可以尝试使用新命令(git1.8.3,2013 年 4 月 22 日)来简化您的脚本,在“如何删除 Git 子模块? ”的新答案中有详细说明:

git submodule deinit

它应该删除子模块工作树以及从.git/config.

于 2013-04-23T06:09:29.830 回答