虽然VonCs answer关于git的回答是正确的,但我不确定git子模块支持是否与composer(1)
vendor
目录对于来自VCS仓库的包的支持相符。至少我没有进行过太多实验,当我使用一个带有VCS git仓库的composer配置时,我通常不需要那个1。
虽然composer(1)
支持git作为供应商包,但它是在仓库级别上,也就是说,你可以有自己的包仓库(就像你在问题中所配置的那样),然后composer负责更新(或警告本地更改)。
composer(1)
通过其自己的远程支持这一点,用于包(非裸克隆)的克隆(在source
安装中,继续阅读)。
所以,是的,你描述的("但这很痛苦。")只要你不利用它来获益。当你开发你的(克隆的)包时,你不需要一直运行composer update
。
.git
composer.json
vendor/foo/bar/.git
一个具有两个Git仓库的Composer项目。
这就是为什么我认为"git in git"不应该感到奇怪。与git子模块类似,git非常支持它。默认情况下,它甚至在父项目中跟踪当前修订版(更改)的子项目,但没有远程信息-因为它是本地的(gitlink)。
你看不到这个想法,因为在树中,gitlink将位于vendor/foo/bar,通常(并且假设)vendor被忽略了,因此主项目中没有对vendor/foo/bar/.git进行版本跟踪-但在子项目中有。
这不是问题,因为Composer会代替你管理那个git子项目(初始克隆和进一步的检出),以满足你的主项目需求。
而且git也意识到这是一个不同的项目。
你应该能够进入vendor文件夹内的软件包目录(vendor/foo/bar)并在那里配置你的远程。然后你可以在该项目内工作,git(1)将在那里工作,而不是在父存储库中。
为了让
composer(1)
能够正常工作,重要的是你要配置composer以优先选择该存储库的
源代码安装变体。这是
preferred-install
选项,你可以专门为你的存储库进行配置。
{
"config": {
"preferred-install": {
"foo/bar": "source"
}
}
}
从您提问的措辞来看,我认为您尚未进行配置。
这是有点重要的,因为只有使用“源”安装时,在
vendor/foo/bar
中将有一个(非裸)git克隆,因此在包文件夹中的整体git配置位于
vendor
目录中(由于您已将Github配置为存储库源,并且composer默认优化为采用
dist
版本,如果我没记错的话)。
在您将配置更改为“源”安装并更新后,
cd
进入
vendor/foo/bar
,然后运行
git remote -v
。现在应该显示该软件包的“composer”远程。
由于您使用的是
develop
分支,因此可以在本地添加更改,但请注意,在再次使用composer更新之前,您还需要将它们推送到远程存储库(Github),因为虽然您现在使用
git
开发
foo/bar
软件包,在主项目中您使用
composer
来管理依赖项。
这是使用Github而不是更接近工作地点的配置在薪资单上的价格,但至少在本地,您可以使用“git in git”处理包。
通常情况下很简单。由于管理两个而不是一个存储库,因此会产生一项总费用,但是对于这种composer项目[仅composer版本化供应商文件夹]无法防止。
注意:如果开发时间超过几个小时,将新的Git子项目包含在父项目的备份例程中也可能是有意义的,这样当您删除文件夹vendor/foo/bar时,其中有一个(本地)Git存储库和工作树的备份。但是,这取决于项目配置,并且是您自己的责任。
在从版本控制系统仓库加载软件包中,Composer文档中也概述了一些提示的工作流程。
1 有一种针对composer项目的设置,其中vendor
本身处于git版本控制下,这样git子模块可以很好地工作,但这很可能不是你的项目采用的设置,所以在本答案中我将跳过它。
git remote add myfork <url>
命令,例如,如果原始仓库已经是origin
,则添加你的 fork 仓库,然后当你推送或拉取时,只需指定你想要交互的远程仓库,即origin
或myfork
(以我的示例为例)。这不是一个子 git,而是两个平行的远程仓库,你可以根据需要分别与它们进行通信。 - joanis