我们曾经在 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
这个过程有两个缺陷:
- 普通
rm
将旧文件留在 Git 索引中。 - 直接克隆给你一个“子存储库”,但不是官方子模块。
假设您在 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/