如何删除子模块?

时间:2009-08-11 14:31:24

标签: git git-submodules

如何删除Git子模块?

顺便说一下,有什么理由不能简单地做到 git submodule rm whatever

32 个答案:

答案 0 :(得分:3281)

通过页面 Git Submodule Tutorial

要删除子模块,您需要:

  1. .gitmodules文件中删除相关部分。
  2. 暂停.gitmodules更改git add .gitmodules
  3. .git/config删除相关部分。
  4. 运行git rm --cached path_to_submodule(无尾随斜杠)。
  5. 运行rm -rf .git/modules/path_to_submodule
  6. 提交git commit -m "Removed submodule <name>"
  7. 删除现在未跟踪的子模块文件
    rm -rf path_to_submodule
  8. 另见alternative steps below

答案 1 :(得分:1962)

git1.8.3 (April 22d, 2013)

  

一旦你表达了对“submodule init”子模块的兴趣,就没有瓷器方式说“我不再对这个子模块感兴趣了”。
  “ submodule deinit ”就是这样做的方法。

删除过程也使用git rm(自2013年10月git1.8.5起)。

摘要

三步删除过程将是:

0. mv a/submodule a/submodule_tmp

1. git submodule deinit -f -- a/submodule    
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)

# or, if you want to leave it in your working tree and have done step 0
3.   git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule

说明

rm -rf:我在Daniel Schroederanswer中提到了这一点,并在Eonil中由the comments进行了总结:

  

这使.git/modules/<path-to-submodule>/保持不变   因此,如果您曾使用此方法删除子模块并再次重新添加它们,则无法实现,因为存储库已损坏。


git rm:见commit 95c16418

  

目前在子模块上使用“git rm”会从超级项目和索引的gitlink中删除子模块的工作树。
  但.gitmodules中的子模块部分保持不变,这是现在删除的子模块的剩余部分,可能会激怒用户(与.git/config中的设置相反,这必须保留用户显示的提醒)对此子模块感兴趣,以便稍后在签出旧提交时重新填充。)

     

让“git rm”帮助用户不仅可以从工作树中删除子模块,还可以从submodule.<submodule name>文件中删除“.gitmodules”部分并暂存两者。 / p>


git submodule deinit:它来自this patch

  

使用“git submodule init”,用户可以告诉git他们关心一个或多个子模块,并希望在下次调用“git submodule update”时填充它。
  但是目前没有简单的方法可以告诉git他们不再关心子模块并且想要摆脱本地工作树(除非用户对子模块内部有很多了解并删除了“submodule.$name.url”设置从.git/config和工作树本身。)

     

通过提供“ deinit ”命令来帮助这些用户   对于给定的内容,此会从submodule.<name>中移除整个.git/config部分   子模块(或者,如果给出“.”,那么已经初始化的所有那些)。
  如果当前工作树包含修改除非被强制,则失败   抱怨在命令行上给出的子模块时,在.git/config中找不到url设置,但仍然不会失败。

如果(de)初始化步骤(.git/config.git/modules/xxx

,则需要注意

从git1.8.5开始,git rm需要 关注:

  • 'add'步骤,记录.gitmodules文件中子模块的网址:需要为您删除。
  • 子模块 special entry (如this question所示):git rm将其从索引中删除:
    git rm --cached path_to_submodule(没有尾随斜线)
    这将使用特殊模式“160000”删除存储在索引中的目录,将其标记为子模块根目录。

如果您忘记了最后一步,并尝试将子模块添加为常规目录,则会收到如下错误消息:

git add mysubmodule/file.txt 
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'

注意:自Git 2.17(2018年第二季度)以来,git submodule deinit不再是shell脚本。
这是对C函数的调用。

commit 2e61273commit 1342476Prathamesh Chavan (pratham-pc)(2018年1月14日) (由Junio C Hamano -- gitster --合并于commit ead8dbe,2018年2月13日)

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"

答案 2 :(得分:406)

请注意。从git 1.8.5.2开始,将执行两个命令:

git rm the_submodule
rm -rf .git/modules/the_submodule

正如@Mark Cheverton的回答正确指出的那样,如果第二行没有被使用,即使你现在删除了子模块,剩余的.git / modules / the_submodule文件夹也会阻止相同的子模块从被添加回来或将来更换。另外,正如@VonC所提到的,git rm将完成子模块的大部分工作。

- 更新(2017年5月7日) -

为了澄清,the_submodule是项目内子模块的相对路径。例如,如果子模块位于子目录subdir/my_submodule内,则为subdir

正如在评论和other answers中正确指出的那样,这两个命令(尽管在功能上足以删除子模块)确实在[submodule "the_submodule"]的{​​{1}}部分留下了痕迹(如2017年7月),可以使用第三个命令删除:

.git/config

答案 3 :(得分:363)

这个问题的大多数答案都是过时的,不完整的或不必要的复杂。

使用git 1.7.8或更新版本克隆的子模块将在您的本地仓库中留下最多四个自身痕迹。删除这四条轨迹的过程由以下三个命令给出:

# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule

# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule

# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule

答案 4 :(得分:192)

简单步骤

  1. 删除配置条目:
    git config -f .git/config --remove-section submodule.$submodulename
    git config -f .gitmodules --remove-section submodule.$submodulename
  2. 从索引中删除目录:
    git rm --cached $submodulepath
  3. 提交
  4. 删除未使用的文件:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename
  5. 请注意: $submodulepath不包含前导或尾部斜杠。

    <强>背景

    执行git submodule add时,它只会将其添加到.gitmodules,但是 完成git submodule init后,它会添加到.git/config

    因此,如果您希望删除模块,但能够快速恢复它, 然后这样做:

    git rm --cached $submodulepath
    git config -f .git/config --remove-section submodule.$submodulepath
    

    首先git rebase HEADgit commit是个好主意 最后,如果你把它放在一个脚本中。

    另请查看an answer to Can I unpopulate a Git submodule?

答案 5 :(得分:81)

除了建议之外,我还必须rm -Rf .git/modules/path/to/submodule能够添加一个具有相同名称的新子模块(在我的情况下,我用原始替换叉子)

答案 6 :(得分:52)

删除使用以下内容添加的子模块:

git submodule add blah@blah.com:repos/blah.git lib/blah

执行命令

git rm lib/blah

就是这样。

对于旧版本的git(大约1.8.5),请使用:

git submodule deinit lib/blah
git rm lib/blah
git config -f .gitmodules --remove-section submodule.lib/blah

答案 7 :(得分:48)

您必须删除.gitmodules.git/config中的条目,并从历史记录中删除该模块的目录:

git rm --cached path/to/submodule

如果你在git的邮件列表上写,可能有人会为你做一个shell脚本。

答案 8 :(得分:41)

您可以使用别名来自动化其他人提供的解决方案:

[alias]
  rms = "!f(){ git rm --cached \"$1\";rm -r \"$1\";git config -f .gitmodules --remove-section \"submodule.$1\";git config -f .git/config --remove-section \"submodule.$1\";git add .gitmodules; }; f"

将它放在您的git配置中,然后您可以执行:git rms path/to/submodule

答案 9 :(得分:40)

总结一下,这就是你应该做的:

  1. 设置path_to_submodule var(无尾部斜杠):

    path_to_submodule=path/to/submodule

  2. 从.gitmodules文件中删除相关行:

    git config -f .gitmodules --remove-section submodule.$path_to_submodule

  3. 从.git / config

    中删除相关部分

    git config -f .git/config --remove-section submodule.$path_to_submodule

  4. 仅从索引中取消并删除$ path_to_submodule(以防止丢失信息)

    git rm --cached $path_to_submodule

  5. 跟踪对.gitmodules进行的更改

    git add .gitmodules

  6. 提交超级项目

    git commit -m "Remove submodule submodule_name"

  7. 删除现在未跟踪的子模块文件

    rm -rf $path_to_submodule

    rm -rf .git/modules/$path_to_submodule

答案 10 :(得分:38)

如果由于您添加,提交并推送了一个已经是Git存储库(包含.git)的文件夹而意外添加了 ,则您将没有{{1}要编辑的文件,或.gitmodules中的任何内容。 In this case all you need是:

.git/config

FWIW,在执行git rm --cached subfolder git add subfolder git commit -m "Enter message here" git push 之前,我还删除了.git文件夹。

答案 11 :(得分:24)

我发现deinit对我有用:

git submodule deinit <submodule-name>    
git rm <submodule-name>

来自git docs

  

<强> DEINIT

     

取消注册给定的子模块,即删除整个submodule.$name   来自.git / config的部分及其工作树。

答案 12 :(得分:21)

在对此网站上的所有不同答案进行试验后,我最终得到了这个解决方案:

#!/bin/sh
path="$1"
if [ ! -f "$path/.git" ]; then
  echo "$path is no valid git submodule"
  exit 1
fi
git submodule deinit -f $path &&
git rm --cached $path &&
rm -rf .git/modules/$path &&
rm -rf $path &&
git reset HEAD .gitmodules &&
git config -f .gitmodules --remove-section submodule.$path

这将恢复与添加子模块之前完全相同的状态。您可以立即再次添加子模块,这在大多数答案中是不可能的。

git submodule add $giturl test
aboveScript test

这样可以让您在没有更改提交的情况下进行干净的结帐。

用以下方法测试:

$ git --version
git version 1.9.3 (Apple Git-50)

答案 13 :(得分:17)

我目前正在做的2012年12月(结合大部分答案):

oldPath="vendor/example"
git config -f .git/config --remove-section "submodule.${oldPath}"
git config -f .gitmodules --remove-section "submodule.${oldPath}"
git rm --cached "${oldPath}"
rm -rf "${oldPath}"              ## remove src (optional)
rm -rf ".git/modules/${oldPath}" ## cleanup gitdir (optional housekeeping)
git add .gitmodules
git commit -m "Removed ${oldPath}"

答案 14 :(得分:14)

这是我做的:

1。)从.gitmodules文件中删除相关部分。您可以使用以下命令:

git config -f .gitmodules --remove-section "submodule.submodule_name"

2。)暂停.gitmodules更改

git add .gitmodules

3。)从.git/config删除相关部分。您可以使用以下命令:

git submodule deinit -f "submodule_name"

4.。)删除gitlink(没有尾部斜杠):

git rm --cached path_to_submodule

5.)清理.git/modules

rm -rf .git/modules/path_to_submodule

6。)提交:

git commit -m "Removed submodule <name>"

7.删除现在未跟踪的子模块文件

rm -rf path_to_submodule

答案 15 :(得分:13)

我最近发现了一个git项目,其中包含许多有用的git相关命令:https://github.com/visionmedia/git-extras

安装并输入:

git-delete-submodule submodule

然后事情就完成了。子模块目录将从您的仓库中删除,并且仍然存在于您的文件系统中。然后,您可以提交更改,如:git commit -am "Remove the submodule"

答案 16 :(得分:10)

我不得不将John Douthat的步骤更进一步,cd进入子模块的目录,然后删除Git存储库:

cd submodule
rm -fr .git

然后我可以将这些文件作为父Git存储库的一部分提交,而不需要对子模块的旧引用。

答案 17 :(得分:8)

以下是我认为必要或有用的4个步骤(首先是重要的步骤):

git rm -f the_submodule
rm -rf .git/modules/the_submodule
git config -f .git/config --remove-section submodule.the_submodule
git commit -m "..."

理论上第1步中的git rm应该处理它。希望OP问题的第二部分可以在某一天得到积极回答(这可以在一个命令中完成)。

但截至2017年7月,第2步对于删除.git/modules/中的数据是必要的,否则,您不能将来再添加子模块。

由于所有git submodule命令似乎都有效,因此您可以通过tinlyx's answer注意到git 1.8.5+的上述两个步骤,因为所有the_submodule命令似乎都有效。

第3步删除文件.git/configgit submodule deinit的部分。这应该是为了完整性。 (该条目可能会导致较旧的git版本出现问题,但我没有测试版本。)

为此,大多数答案建议使用git config -f .git/config --remove-section。我发现使用git deinit时更明确,更容易混淆。根据{{​​3}},git commit

  

取消注册给定的子模块...如果你真的想删除一个   来自存储库的子模块和使用git-rm [1]的提交   的不是

最后但并非最不重要的一点是,如果你没有git submodule summary,那么在执行fatal: Not a git repository: 'the_submodule/.git' * the_submodule 73f0d1d...0000000: 时(从git 2.7开始),你/可能会收到错误:

{{1}}

无论您是执行步骤2还是3,都可以。

答案 18 :(得分:8)

使用 git v2.7.4 简单的 3 个步骤就可以了。

git submodule deinit -f -- a/submodule    
git rm -f a/submodule
git commit

答案 19 :(得分:7)

我刚刚找到.submodule(忘记确切名称)隐藏文件,它有一个列表......你可以单独删除它们。我只有一个,所以我删除了它。很简单,但它可能会搞砸Git,因为我不知道是否有任何附加到子模块的内容。到目前为止似乎还不错,除了libetpan通常的升级问题,但是(希望)不相关。

注意到没有人发布手动删除,所以添加了

答案 20 :(得分:7)

project dir:     ~/foo_project/
submodule:       ~/foo_project/lib/asubmodule
- - - - - - - - - - - - - - - - - - - - - - - - -
run:
  1.   cd ~/foo_project
  2.   git rm lib/asubmodule && 
          rm .git/modules/lib/asubmodule && 
            git submodule lib/asubmodule deinit --recursive --force

答案 21 :(得分:6)

那很简单:

  1. $factory->defineAs删除该部分
  2. 致电:.gitmodules
  3. 致电:git add .gitmodules
  4. 致电:git submodule deinit <path to submodule>
  5. 提交并推送

您将必须手动删除项目中的模块文件。

答案 22 :(得分:4)

如果您刚刚添加了子模块,例如,您只是添加了错误的子模块,或者您将其添加到了错误的位置,只需执行git stash然后删除该文件夹即可。这假设添加子模块是您在最近的仓库中做的唯一事情。

答案 23 :(得分:4)

总而言之,这是您应该做的:

设置path_to_submodule var(无斜杠):

path_to_submodule=path/to/submodule

从.gitmodules文件中删除相关行:

git config -f .gitmodules --remove-section submodule.$path_to_submodule

从.git / config删除相关部分

git config -f .git/config --remove-section submodule.$path_to_submodule

仅转储并删除索引中的$ path_to_submodule(以防止丢失信息)

git rm --cached $path_to_submodule

跟踪对.gitmodules所做的更改

git add .gitmodules

提交超级项目

git commit -m "Remove submodule submodule_name"

删除现在未跟踪的子模块文件

rm -rf $path_to_submodule

rm -rf .git/modules/$path_to_submodule

另请参阅:Alternative guide lines

答案 24 :(得分:2)

为了读者的利益,本文试图对它进行总结,并给出逐步指导,说明如果事情无法按预期进行,该如何做。以下是git版本2.17及更高版本中经过测试且安全的方式摆脱了子模块

submodule="path/to/sub"              # no trailing slash!
git submodule deinit -- "$submodule"
git rm -- "$submodule"
  • 如果这不适用于您,请参见下文。
  • 没有选择。没什么危险。而且甚至不考虑做更多的事情!
  • 经过Debian Buster 2.20.1和Ubuntu 18.04 2.17.1的测试。
  • "$submodule"只是为了强调名称的位置,并且必须注意空格等
  • 如果在Windows上忽略第一行,并用Windows方式正确指定子模块的路径替换"$submodule"。 (我不是Windows)
  

警告!

     

切勿自己触摸.git目录的内部!.git内进行编辑会进入阴暗面。不惜一切代价远离!

     

是的,您可以为此归咎于git,因为过去git中缺少许多方便的东西。就像再次删除子模块的正确方法一样。

     

我认为git submodule的文档中有一个非常危险的部分。   建议您自己删除$GIT_DIR/modules/<name>/。   在我的理解中,这不仅是错误的,而且是非常危险的,并且将来会引起重大的头痛!参见下文。

请注意

git module deinit

是与之直接成反比

git module init

但是

git submodule deinit -- module
git rm -- module

也与之相反

git submodule add -- URL module
git submodule update --init --recursive -- module

因为某些命令基本上需要做的不仅仅是一件事情:

  • git submodule deinit -- module
    • (1)更新.git/config
  • git rm
    • (2)删除模块文件
    • (3)从而以递归方式删除子模块的子模块
    • (4)更新.gitmodules
  • git submodule add
    • 将数据拉至.git/modules/NAME/
    • (1)做git submodule init,所以更新.git/config
    • (2)做git submodule update,因此,以非递归方式检出模块
    • (4)更新.gitmodules
  • git submodule update --init --recursive -- module
    • 根据需要添加其他数据
    • (3)递归检出子模块的子模块

这不能完全对称,因为使其严格对称没有太大意义。根本不需要两个以上的命令。另外,“拉入数据”是隐式的,因为您需要它,但是不会删除缓存的信息,因为根本不需要这样做,并且可能会擦除珍贵的数据。

这确实使新手感到困惑,但基本上是一件好事:git只是做了显而易见的事情并且做到了正确,甚至没有尝试做更多的事情。 git是一种工具,必须做得可靠,而不仅仅是另一个“ Eierlegende Wollmilchsau”(“ Eierlegende Wollmilchsau”对我来说是“瑞士军刀的某种邪恶版本”。)

所以我理解人们的抱怨,说:“为什么不git对我来说不明显”。这是因为这里的“明显”取决于观点。在每种情况下的可靠性都更为重要。因此,在所有可能的技术情况下,通常对您而言显而易见的事情并不是正确的选择。请记住:AFAICS git遵循技术路线,而不是社交路线。 (因此,聪明的名字是:git)

如果失败

以上命令可能由于以下原因而失败:

  • 您的git年纪太大了。然后使用较新的git。 (请参见下面的操作方法。)
  • 您尚未提交数据,并且可能会丢失数据。然后最好先提交他们。
  • git clean的角度来看,您的子模块不干净。然后,首先使用该命令清理您的子模块。 (请参见下文。)
  • 您过去所做的事情git不支持。然后,您处于阴暗面,事情变得丑陋而复杂。 (也许使用另一台机器可以修复它。)
  • 也许我不知道有更多的失败方法(我只是一些git超级用户。)

可能的修复方法如下。

使用较新的git

如果您的计算机过旧,则submodule deinit中没有git。如果您不想(或不能)更新git,则只需使用另一台机器上的git来更新! git是要完全分发的,因此您可以使用另一个git来完成工作:

  • workhorse:~/path/to/worktree$ git status --porcelain 不得输出任何内容!如果是这样,请先清理东西!
  • workhorse:~/path/to/worktree$ ssh account@othermachine
  • othermachine:~$ git clone --recursive me@workhorse path/to/worktree/.git TMPWORK && cd TMPWORK
  • 现在做子模块的事情
  • othermachine:~/TMPWORK$ git commit . -m . && exit
  • workhorse:~/path/to/worktree$ git fetch account@othermachine:TMPWORK/.git
  • workhorse:~/path/to/worktree$ git merge --ff-only FETCH_HEAD。如果这不起作用,请使用git reset --soft FETCH_HEAD
  • 现在要清理东西,直到git status再次干净为止。之所以能够这样做,是因为有了第一步,您之前已经将它清理干净了。

othermachine可以是某些VM,也可以是Windows下的某些Ubuntu WSL。甚至是chroot(但我假设您不是root用户,因为如果您是root,则应该更容易将其更新为较新的git。)

请注意,如果您不能ssh进入,则有许多方法可以传输git存储库。您可以将工作树复制到某些USB记忆棒(包括.git目录)中,然后从记忆棒中克隆。克隆副本,只是为了以一种干净的方式再次获取内容。如果您的子模块不能直接从其他计算机访问,则这可能是PITA。但这也有解决方案:

git config --add url.NEWURLPREFIX.insteadOf ORIGINALURLPREFIX

您可以使用此乘法,并将其保存到$HOME/.gitconfig中。像

git config --add 'url./mnt/usb/repo/.insteadof' https://github.com/

重写类似的URL

https://github.com/XXX/YYY.git

进入

/mnt/usb/repo/XXX/YYY.git

如果您开始习惯这种强大的git功能,这很容易。

先清理事物

手动清洁是个好习惯,因为这样您可能会发现一些忘记的事情。

  • 如果git抱怨未保存的内容,请提交并推送到安全的地方。
  • 如果git抱怨一些剩菜,git statusgit clean -ixfd是你的朋友
  • 请尽量避免使用rmdeinit的选项。如果您是专业人士,则-f的选项(例如git)会很好。但是当您来到这里时,您可能在submodule领域并不那么有经验。因此,总比后悔要安全。

示例:

$ git status --porcelain
 M two
$ git submodule deinit two
error: the following file has local modifications:
    two
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'two' contains local modifications; use '-f' to discard them
$ cd two
$ git submodule deinit --all
error: the following file has local modifications:
    md5chk
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'md5chk' contains local modifications; use '-f' to discard them
$ cd md5chk
$ git submodule deinit --all
error: the following file has local modifications:
    tino
(use --cached to keep the file, or -f to force removal)
fatal: Submodule work tree 'tino' contains local modifications; use '-f' to discard them
$ cd tino
$ git status --porcelain
?? NEW
$ git clean -i -f -d
Would remove the following item:
  NEW
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers    4: ask each
    5: quit                 6: help
What now> 1
Removing NEW
$ cd ../../..
$ git status --porcelain
$ git submodule deinit two
Cleared directory 'two'
Submodule 'someunusedname' (https://github.com/hilbix/src.git) unregistered for path 'two'

您看到,-f上不需要submodule deinit。如果情况是干净的,则为git clean。另请注意,不需要git clean -x这意味着git submodule deinit无条件删除将被忽略的未跟踪文件。这通常是您想要的,但请不要忘记。有时,被忽略的文件可能很宝贵,例如缓存的数据可能需要数小时至数天才能重新计算。

为什么从不删除$GIT_DIR/modules/<name>/

人们可能想删除缓存的存储库,因为他们害怕以后会遇到问题。的确如此,但是遇到“问题”才是解决问题的正确方法!因为修复很容易,而且操作正确,您以后就可以过上幸福的生活。与您自己删除数据相比,这避免了更多麻烦的事情。

示例:

mkdir tmptest &&
cd tmptest &&
git init &&
git submodule add https://github.com/hilbix/empty.git two &&
git commit -m . &&
git submodule deinit two &&
git rm two &&
git commit -m . &&
git submodule add https://github.com/hilbix/src.git two

最后一行输出以下错误:

A git directory for 'two' is found locally with remote(s):
  origin    https://github.com/hilbix/empty.git
If you want to reuse this local git directory instead of cloning again from
  https://github.com/hilbix/src.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

为什么会出现此错误?因为.git/modules/two/以前是从https://github.com/hilbix/empty.git填充的,现在应该从其他地方,即https://github.com/hilbix/src.git重新填充。如果您从https://github.com/hilbix/empty.git

重新填充它,您将看不到它。

现在该怎么办?好吧,完全按照指示执行!使用--name someunusedname

git submodule add --name someunusedname https://github.com/hilbix/src.git two

.gitmodules然后看起来像

[submodule "someunusedname"]
    path = two
    url = https://github.com/hilbix/src.git

ls -1p .git/modules/给出

someunusedname/
two/

通过这种方式,由于two/具有两个不同的(并且可能不兼容的)上游存储库,以后您可以切换分支/向前和向后提交,并且永远不会再遇到麻烦。最好的是:您也将两者都保留在本地缓存。

  • 这不仅对您有用。使用存储库的所有其他用户也是如此。
  • 您不会失去历史。如果您忘记推送最新版本的旧子模块,则可以输入本地副本,稍后再输入。请注意,很普遍有人忘记推送某些子模块(因为这是新手的PITA,直到他们习惯了git为止。)

但是,如果您删除了缓存的目录,则两个不同的检出都将相互绊倒,因为您将不会使用--name选项,对吗?因此,每次执行结帐操作时,您可能不得不一次又一次地删除.git/modules/<module>/目录。这非常麻烦,并且很难使用git bisect之类的东西。

因此,将这个模块目录保留为占位符是非常技术性的原因。建议删除.git/modules/以下内容的人可能并不了解,或者忘记告诉您,如果git bisect之类的强大功能如果遇到子模块不兼容的情况,将几乎无法使用。

上面显示了另一个原因。查看ls。您在那看到什么?

好吧,模块two/的第二个变体不在.git/modules/two/下,而是在.git/modules/someunusedname/下!因此,git rm $module; rm -f .git/module/$module之类的事情是完全错误的!您必须咨询module/.git.gitmodules才能找到要删除的正确内容!

因此,不仅大多数其他答案都陷入了这一危险陷阱,even very popular git extensions had this bugit's now fixed there)!因此,如果您不完全了解自己在做什么,最好将其放在.git/目录下!

  

从哲学的角度来看,抹除历史总是错误的!   Except for quantum mechanics和往常一样,但这是完全不同的。

仅供参考,您可能会猜到:hilbix是我的GitHub帐户。

答案 25 :(得分:1)

我创建了一个bash脚本来简化删除过程。它还检查未保存的回购中是否有更改,并要求确认。 已经在os x上进行了测试,很想知道它是否也可以在常见的Linux发行版上工作:

https://gist.github.com/fabifrank/cdc7e67fd194333760b060835ac0172f

答案 26 :(得分:1)

在git 2.17及更高版本中,它只是:

    @FXML
    void textDayWeek(ActionEvent event) {
        String dateBarras = txtDate.getText();
        String[] split = dateBarras.split("/");
        try {
            data = new Data(Integer.parseInt(split[0]), Integer.parseInt(split[1]), Integer.parseInt(split[2]));
        } catch (MonthInvalidException me) {
            if (Integer.parseInt(split[1]) > 12 || Integer.parseInt(split[1]) < 1)
                throw Alert alert = new Alert(Alert.AlertType.ERROR);
                        alerta.setTitle("error");
            alert.setHeaderText("ERROR");
            alert.setContentText(me);
        }

    }

答案 27 :(得分:0)

  • 可以通过运行git rm <submodule path> && git commit来删除子模块。可以使用git revert撤消该操作。
    • 删除操作将删除超级项目的跟踪数据,这些数据既是gitlink条目,又是.gitmodules文件中的部分。
    • 该子模块的工作目录已从文件系统中删除,但是保留了Git目录,因为它可以签出过去的提交而无需从另一个存储库获取。
  • 要完全删除子模块,请另外手动删除$GIT_DIR/modules/<name>/

来源:git help submodules

答案 28 :(得分:0)

删除git子模块

要删除git子模块,需要执行以下4个步骤。

  1. 删除.gitmodules文件中的相应条目。条目可能如下所述
[submodule "path_to_submodule"]
    path = path_to_submodule
    url = url_path_to_submodule
  1. 阶段更改git add .gitmodules
  2. 删除子模块目录git rm --cached <path_to_submodule>
  3. 提交git commit -m "Removed submodule xxx"并推送。

下面还需要另外2个步骤才能完全清除本地克隆副本中的子模块。

  1. 删除.git/config文件中的相应条目。条目可能如下所述
[submodule "path_to_submodule"]
    url = url_path_to_submodule
  1. 执行rm -rf .git/modules/path_to_submodule

这些第5和第6步不会创建任何需要提交的更改。

答案 29 :(得分:0)

如果需要使用bash脚本在一行命令中执行以下操作:

$ cd /path/to/your/repo && /bin/bash $HOME/remove_submodule.sh /path/to/the/submodule

在名为$HOME的{​​{1}}目录中创建bash脚本文件:

remove_submodule.sh

答案 30 :(得分:0)

在最新的git中,只需执行4个操作即可删除git子模块。

  • 删除.gitmodules中的相应条目
  • 阶段更改git add .gitmodules
  • 删除子模块目录git rm --cached <path_to_submodule>
  • 提交git commit -m "Removed submodule xxx"

答案 31 :(得分:0)

这对我有用。上面的答案在终端中显示了这一点,没有其他事情发生

Unhashable error
  1. demolibapp 是我要删除的子模块名称
  2. git 子模块 deinit demolibapp
  3. git rm --cached demolibapp -r
  4. rm -rf .git/modules/demolibapp
  5. git add --all
  6. git commit -m "删除额外的子模块"
  7. git push
  8. rm -rf demolibapp