如何在fork的供应商文件夹中使用git



我总是在Laravel中使用composer包,但我从未更改包。这是我第一次,我不想做得不对。

我需要使用并更改foo/bar。接下来的一切都只是猜测:

  1. 我分叉了回购
  2. 我创建了一个develop分支
  3. 我在composer.json中添加了一个vcs
"require": {
//...
"foo/bar": "dev-develop",
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/thisisme/bar"
}
],
  1. composer update
  2. 现在我在foo中的vendor文件夹中有了thisisme/bar分支

到目前为止还不错。现在我可以用我自己的叉子了。

但目前,由于我不知道修改回购的好方法是什么,我将回购克隆到了一个完全不同的位置。然后我将我的更改推送到那里,并在我的项目中运行composer update来获得更改。但这是一种痛苦。

我需要在vendor/foo中的项目中有一个子数字吗CCD_ 10。因为";git-in-git";感觉不对,并且最终没有真正工作,因为git命令似乎与";父git";。

虽然VonCs对git的回答是正确的,但我不确定git子模块支持是否与VCS存储库中包的composer(1)vendordir一致。至少我没有做过太多的实验,当我使用带有VCS git存储库的composer配置时,我通常不需要1

虽然composer(1)支持git for vendor软件包,但它是在存储库级别上的,也就是说,您可以为您的软件包拥有自己的存储库(正如您在问题中所示的配置),然后composer负责更新(或警告本地更改)。

composer(1)通过其自己的包(非裸)克隆远程支持这一点(在source安装中,请继续阅读)。

所以,是的,你所描述的("但这是一种痛苦。),就是只要你不把它用于你的利益。在开发(克隆的)包时,不需要一直运行composer update


.git
composer.json
vendor/foo/bar/.git

一个包含两个Git存储库的Composer项目


这就是为什么IMHO";git-in-git";千万不要觉得不对。与git子模块类似,git非常支持这一点。默认情况下,它甚至会在父项目中跟踪子项目的当前修订(更改),但没有远程的信息,因为它是本地的(gitlink)。

您不会在树中看到这种想法,gitlink将位于vendor/foo/bar,并且通常(&假设)vendor被git忽略,在vendor/foo/bar/.git的主项目中没有版本跟踪,但在子项目中有。

这不是问题,因为Composer根据您的主项目为您管理git子项目(初始克隆和进一步签出)。

git意识到这是一个不同的项目。

您应该能够将cd放入供应商文件夹(vendor/foo/bar)中的软件包目录中,并在那里配置远程设备。然后,您可以在该项目中工作,git(1)将在那里工作,而不是在父存储库中工作。

要使用composer(1),重要的是要将composer配置为更喜欢该存储库的源安装变体。这是preferred-install选项,您可以专门为您的存储库配置它。

{
"config": {
"preferred-install": {
"foo/bar": "source"
}
}
}

从你问题中的措辞来看,我认为你还没有配置它

这一点有点重要,因为只有在安装source时,vendor/foo/bar中才会有一个(非裸)git克隆,因此在vendor目录的packages文件夹中会有一个带有整体git配置的git签出(因为Github被配置为存储库源,composer优化为默认使用dist版本的IIRC)。

将配置更改为source安装并更新后,将cd转换为vendor/foo/bar,然后运行git remote -v。它现在应该向您展示";作曲家;该程序包的远程。

当您使用develop分支时,您可以在本地添加更改,但要注意的是,在再次使用composer更新(至少)foo/bar包之前,您还需要将更改推送到远程存储库(Github),就像现在使用git开发foo/bar包一样,在您的主项目中,您可以使用composer来管理依赖关系。

这是你使用Github而不是更靠近工作地点的配置在工资单上的价格,但至少在本地,你可以用";git-in-git";。

这通常是直接的。由于管理两个而不是一个存储库,总体价格仍在考虑之中,但这种composer项目(composer仅版本供应商文件夹)无法阻止这一点。

注意:如果开发时间超过几个小时,那么将新的Git子项目包含在您的父项目的备份例程中也是有意义的,这样当您删除文件夹vendor/foo/bar时,您就可以在其中备份(本地)Git存储库和工作树。但是,这取决于项目配置,由您自己负责。


从VCS存储库加载包中的composer文档中也概述了一些带有提示的工作流。


1作曲家项目有一种设置类型,vendor本身受git版本控制,git子模块可以工作(非常好),但这很可能不是您项目的设置类型,所以我跳过它来回答这个问题。

如果您使用的是sail或docker compose,并且在供应商目录中链接foo/bar项目只是一个临时的解决方案,直到"它起作用",您可以将其添加为卷链接。这是我通常做的事。

例如:我正在~/projects/my-project中进行我的项目,我将foo/barrepo克隆到~/projects/bar

然后在docker-compose.yml中,我可以添加卷:

volumes:
- .:/var/www/html
- ../bar:/var/www/html/vendor/foo/bar

同样,这对docker的使用有很大的假设,但我喜欢认为现在每个人都在使用它。

我的项目中是否需要在vendor/foo中使用git远程添加原点的子githttps://github.com/thisisme/bar.git.

这可以通过一个子模块来实现,该子模块允许您的父Git存储库只存储对另一个存储库的引用
您可以使用git submodule add

因此,git clone --recurse-submodule会克隆您的项目,其中的子模块Git存储库也会被克隆,并签出到您之前提交的确切引用。

最新更新