分支中的Git子模块不是主模块

分支中的Git子模块不是主模块,git,git-branch,git-merge,git-submodules,Git,Git Branch,Git Merge,Git Submodules,编辑:根据注释中的@VonC,我有一个嵌套的回购,而不是子模块。但是,我的问题仍然与以下相同: 我在本地回购协议的基础上创建了一个分支来开发一个新功能。新功能要求我通过composer安装Azure PHP SDK。事实证明,Azure SDK已经在/vendor文件夹中创建了自己的git回购。现在我在这个新分支中有一个子模块 我已经提交了这个分支中的所有内容,当我执行git status时,我会收到 nothing to commit, working directory clean 现在,

编辑:根据注释中的@VonC,我有一个嵌套的回购,而不是子模块。但是,我的问题仍然与以下相同:

我在本地回购协议的基础上创建了一个分支来开发一个新功能。新功能要求我通过composer安装Azure PHP SDK。事实证明,Azure SDK已经在
/vendor
文件夹中创建了自己的git回购。现在我在这个新分支中有一个子模块

我已经提交了这个分支中的所有内容,当我执行
git status
时,我会收到

nothing to commit, working directory clean
现在,当我切换回我的主分支合并这个新功能分支并执行
git status
时,我看到:

Untracked files : vendor/
我在谷歌上搜索到,如果我
向主分支添加
提交
供应商/
目录,由于某种冲突,我将无法合并新的功能分支。我想它也会弄乱功能分支上的子模块?!?我没有尝试合并新的功能分支,而不跟踪
供应商/
,因为我不确定它是否会工作,也不确定它会出什么问题

我应该如何进行?我坐在主分支上,新功能分支坐在那里,在
vendor/
中有一个子模块。在主分支上,
vendor/
文件夹位于未跟踪的文件中


如何将功能分支成功合并到master中?

我认为您不需要跟踪git repo中的
“vendor”
目录

因此,我只需删除它(untrack),提交相应的更改,并将供应商目录添加到项目的
.gitignore
目录中,以便将来仍保持未跟踪状态

这方面的步骤很简单:

git checkout feature_branch
git rm -r --cached vendor
echo "vendor" >> .gitignore && git add .gitignore
git commit -m "untrack vendor directory"
上面的
--cached
标志将在本地保留文件,即使
git rm
处于未跟踪状态

FWIW,供应商目录的内容是
Composer
安装的依赖项,它们可以动态生成。因此,它应该是部署脚本的一部分,这样您就可以使用composer设置您的环境,因此不应该签入您的repo

(注意:您可能希望探索在部署中维护通用
供应商
的共享软链接,以避免每次构建过程中出现新的下载时间)

引用

一般建议为否。供应商目录(或安装依赖项的位置)应添加到
.gitignore
/
svn:ignore
/etc

最佳做法是让所有开发人员使用
Composer
安装依赖项。类似地,构建服务器、CI、部署工具等也应进行调整,以便在项目引导过程中运行Composer


如果主repo中有.gitmodules文件,并且在索引()中将供应商声明为gitlink条目(),则它只是一个子模块。在您的情况下,供应商真的是一个子模块吗?或者只是一个嵌套的git回购?(在这种情况下,您可以将其转换为子模块:)我似乎没有.gitmodules文件。然而,我已经将我的功能分支推到了bitbucket,它说
vendor/
中的Azure SDK文件夹是一个子模块。。。我担心在功能分支中,我的工作目录是干净的,但当我移回主分支时,会产生错误
警告:无法rmdir irn/vendor/microsoft/windowsazure:directory not empty
,然后在
功能分支中的未跟踪文件中突然出现
vendor/
,您是否在
供应商/
目录下的
azure sdk
目录中看到
.git/
文件夹或
.git
文件?有一个
.git
文件夹。为完整起见,文件夹结构为
vendor/microsoft/windowsazure/.git
,因此它实际上是一个嵌套的repo,而不是子模块。不知道bitbucket为什么会看到那个文件夹。