当前删除git子模块的方法是什么?


91

从Mac上的git版本1.9.3(Apple Git-50)开始,我如何删除git子模块?我正在阅读许多过时的信息,许多开发人员告诉我他们不会工作。目前的方式是什么?会成功git deinit pathToSubModule 吗?

我认为可行的步骤在这里,但评论说它们不会。

让我解释一下我目前的情况以及我需要完成的工作。我已经安装了快速存储库,并将其添加为项目的子模块。此代码已签入,其他人正在使用它。我现在需要做的是派生相同的Quick存储库,并将其托管在我公司拥有的更安全的github(因此完全是另一个私有github)上。分叉后,我想将该叉子添加为gitSubmodule,并使其替换我之前安装的当前Quick子模块。

更新:我已阅读以下内容,这是最新git版本的正确方法,请确认?

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

我已经将子模块问题解决了两天。当我发现此问题时,便取得了突破:forums.developer.apple.com/thread/13102。基本上,Xcode,也许还有其他应用,都在努力扩展包含“〜”的网址。一旦我将ssh://username@server.remoteHost.com/~/git/MyRepo.git更改为ssh://username@server.remoteHost.com/home/username/git/MyRepo.git(查找实际路径)在您的服务器上),所有怪异现象在十分钟后消失了。
Elise van Looij,

Answers:


193

你有 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

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

进一步调用git submodule updategit submodule foreach并且git submodule sync跳过所有未注册的子模块,直到再次对其进行初始化,因此,如果您不想再在工作树中进行子模块的本地签出,请使用此命令。

如果您确实要从存储库中删除一个子模块,然后提交该子模块,请使用git rm

如果--force指定,则子模块的工作树将被删除,即使它包含本地修改。


8
我想为我和其他用户彻底清除子模块。所以我所需要的只是git submodule deinit asubmodule; 和git rm asubmodule ?? 另外,其他用户缓存的子模块又如何,他们在下拉后是否必须删除子模块?
j2emanue 2015年

1
我想删除该子模块的本地副本,并且此方法运行完美,子目录中的所有文件都消失了。
malhal's

1
rm -rf <asubmodule>如果您已经签出了未注册子模块的基本存储库版本,则可能还需要。
莎拉·梅瑟

6

我使用的是Git 2.16.2版本,并且git rm可以很好地完成工作:

git rm path-to-submodule

您可以使用进行验证,git statusgit diff --cached确认这会初始化子模块并.gitmodules自动进行修改。与往常一样,您需要提交更改。

但是,即使从源代码管理中删除了子模块,它.git/modules/path-to-submodule仍然包含子模块存储库并.git/config包含其URL,因此您仍然必须手动删除它们:

git config --remove-section submodule.path-to-submodule
rm -rf .git/modules/path-to-submodule

保留子模块存储库和配置是有意的,因此您可以使用例如撤消删除git reset --hard


1
最新的答案和最短的解决方案
TurboGuma

3

如何安全删除子模块。

(添加到https://stackoverflow.com/a/1260982/342794

  1. 列出并找到.gitmodules文件中的子模块部分。通过终端说vi .gitmodules。例:

    [submodule "submodules/afnetworking"]
        path = submodules/afnetworking
        url = https://github.com/CompanyName/afnetworking.git
    
  2. 子模块可以与本地派生一起使用。对于长期运行的项目,代码可能与原始回购有所不同,并且可能有一些修复。验证子模块代码是否在项目过程中进行更改是一个好主意。示例:查看日志,如果它指向master分支或某个本地分支。浏览git日志以查找通过终端进行的修改。通常,这些文件存储在目录下(例如,在submodules目录下)。

    User$ cd submodules/afnetworking
    User$ git log
    
  3. 从.gitmodules中删除子模块部分,保存文件。示例:git status应仅显示以下内容:已修改

    modified:   .gitmodules
    
  4. 使用进行更改git add .gitmodules

  5. 列出并找到子模块部分 .git/config文件中。通过终端说vi .git/config。例:

    [submodule "submodules/afnetworking"]
        url = https://github.com/CompanyName/afnetworking.git
    
  6. 删除git cache sobmodule文件。跑步git rm --cached submodules/afnetworking(不带斜杠)将其成功删除。例:

    User$ git rm --cached submodules/afnetworking
    rm 'submodules/afnetworking'    <-- terminal output
    
  7. 卸下下的子模块的文件.git与目录rm -rf .git/modules/...git status之后再确认。

    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/
    
  8. 提交更改。确认git status之后。

    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)
    
  9. 删除未跟踪的子模块文件。

    User$ rm -rf submodules/afnetworking
    
  10. 从Xcode项目中删除引用。生成,修复编译和运行时问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.