【问题标题】:Git automatically declaring subprojects as submodules?Git自动将子项目声明为子模块?
【发布时间】:2014-01-31 16:15:24
【问题描述】:

我的项目位于“www”文件夹中。

在“www/vendor”中,我从 GitHub 克隆了其他项目。我只是克隆了它们,没有做任何事情来使它们成为子模块或子树。

我经常参与这些子项目,贡献上游等。我只需要cd 到像“www/vendor/projectX”这样的目录并在那里使用 Git 提交,就好像它们是独立的项目.然后我可以回到“www”并在那里进行提交,以确认子项目中的更改到我的主项目中。一切都很棒而且很简单。

然后我将“www/vendor”移动到“www/php/vendor”。我做了git add php 并提交了更改,现在我所有的“www/php/vendor/*”文件夹在远程服务器上都是空的。在我的机器上,文件还在,但git status 说没有什么可以提交的。

我不知道,但是当我移动它们时,似乎所有子项目都已自动声明为子模块。但是我看不到它的踪迹:没有 .gitmodule,模块文件夹中没有任何内容。这就是我git rm时得到的:

$ git rm php/vendor/projectX
error: the following submodule (or one of its nested submodules) uses a .git directory:
php/vendor/projectX

是我遗漏了什么还是这是一个 Git 错误?我想回到我以前的工作方式,不删除子项目的.git文件夹或使用子模块。

我一直在 Windows 中使用 Git 1.8.4 和 1.8.5.2。

【问题讨论】:

    标签: git git-submodules git-subtree


    【解决方案1】:

    这是 Git 的默认行为。除了将它们声明为子模块之外,它不知道如何处理这些 repos。

    您可以忽略保存其他 Git 存储库的路径。特别是如果您使用包/依赖管理器更新它们并将锁定文件保存在根存储库中。

    【讨论】:

    • 谢谢,但我很困惑为什么当我刚移动一个文件夹时它突然改变了,这很奇怪。我猜 Git 在某些时候被修改为强制使用子模块或子树。我喜欢将子项目文件自包含在我的父项目中,所以我想我现在只需要使用子模块。我不需要学习新的命令,但如果我必须...
    • 这是因为您没有忽略根目录.gitignore 中的这些路径。因此,当它们未被忽略时,Git 应该以某种方式跟踪这些路径。因为它看到.git 文件夹,所以它们的历史记录是分开的。这是Git子模块的定义。
    • 啊啊,你成功了!子项目文件夹一定是在.git子文件夹不存在的时候已经在超级项目中被跟踪了,然后在克隆后.git文件夹出现后仍继续被跟踪。它导致了类似于子树的行为,而无需调用类似$ git merge --squash -s subtree projectX 的麻烦。谢谢,现在一切都清楚了。
    猜你喜欢
    • 2015-07-31
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多