git - 将 git 管理的子目录切换到子模块

标签 git ruby-on-rails-plugins git-submodules

我们曾经在 Rails 应用程序中对 delayed_job 进行本地 hack,位于 vendor/plugins/delayed_job 中。它是作为一次性事件安装的,并在主应用程序仓库中 checkin 了 git。

现在我们决定在 github 上 fork delayed_job 并用 git 子模块替换子目录,如所述这里:

http://doblock.com/articles/using-git-submodules-to-manage-plugins-in-rails

在这样做之前,我只是删除了 vendor/plugins/delayed_job,而没有将其 checkin 。现在,尽管添加了子模块,但主仓库中的 git status 仍然显示 vendor/plugins/delayed_job 中的新文件。

我们应该如何处理作为 repo 一部分的子目录被删除并保存 git 子模块的情况?在将子模块克隆到它的位置之前,我们应该先用 git rm 删除它,还是更彻底地消除它?

最佳答案

假设您不关心工作树中 vendor/plugins/delayed_job 的当前内容(即,将作为子模块 checkout 的内容已经是内容的合适替代品在你的工作树中),将目录转换为子模块的正常过程如下所示:

git rm -r vendor/plugins/delayed_job
git submodule add github.com:account/delayed_job.git vendor/plugins/delayed_job

当然,GitHub 存储库 URL 可能会有所不同;例如,您可能希望使用 HTTP URL 而不是上面的 SSH URL。

但是,您似乎做了一些不同的事情。据我所知,你做了这样的事情:

rm -rf vendor/plugins/delayed_job
git clone github.com:account/delayed_job.git vendor/plugins/delayed_job

这个过程有两个缺陷:

  1. 普通 rm 将旧文件留在 Git 索引中。
  2. 直接克隆给你一个“子存储库”,但不是官方子模块。

假设您在 vendor/plugins/delayed_job 中没有任何有意的阶段性更改(您可能没有,因为您正在用子模块替换它),您可以使用这些来清理情况命令:

git rm --cached -r vendor/plugins/delayed_job
git submodule add github.com:account/delayed_job.git vendor/plugins/delayed_job

从索引中清除所有 vendor/plugins/delayed_job 条目应该可以解决“仍然显示新文件”的问题。使用 git submodule add 将创建 .gitmodules 文件,将“子存储库”变成真正的子模块。

关于git - 将 git 管理的子目录切换到子模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6528936/

相关文章:

git - 在 git 中,如何 check out 远程仓库的远程分支?

Git for windows 使用 gitk-all 启动 gitk 上下文菜单

git - 使用 Windows 身份验证进行私有(private) BitBucket git 存储库?

git - 如何删除子模块?

git - 多个模块(主题)的推荐工作流程

git - 为什么源代码树不是 Git Diff 一个 Powershell 脚本 (ps1)

ruby-on-rails - 适用于 Rails 3.2 的 L10N 解决方案

ruby-on-rails-3 - mongoid 的最佳状态机 gem 是什么?

ruby-on-rails - gem-idea : Automatic spam protection with captcha in before_filter when HTTP-method is post, 放置或删除

git - 在 github.com 下载子模块