【问题标题】:How to use git in vendor folder of fork?如何在 fork 的 vendor 文件夹中使用 git?
【发布时间】:2022-06-13 20:53:37
【问题描述】:

我总是在 Laravel 中使用作曲家包,但我从未更改一个。这是我第一次,我不想做错。

我需要使用并更改一个包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. 现在我在vendor 文件夹中的foo 中拥有了thisisme/bar fork。

到目前为止一切顺利。现在我可以使用自己的叉子了。

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

我需要在vendor/foo 的项目中有一个子 git 吗? git remote add origin https://github.com/thisisme/bar.git。因为“git in git”感觉不对,最后并没有真正起作用,因为 git 命令似乎与“父 git”交互。

【问题讨论】:

  • 您可以在一个沙盒中拥有两个遥控器。使用git remote add myfork <url>,例如,如果原件已经是origin,则添加您的fork,然后当您推或拉时,只需说明您要与之交互的遥控器,originmyfork 与我的示例。这不是一个子 git,它是两个并行的遥控器,您可以根据需要分别与之交谈。
  • 但随后我将整个 laravel 项目推送到包中。我想将包与 laravel 项目分开

标签: laravel git github composer-php fork


【解决方案1】:

虽然VonCs answer 关于 git 是正确的,但我不确定 git 子模块支持是否与来自 VCS 存储库的包的composer(1) vendor dir 保持一致。至少我没有对它进行太多实验,当我使用带有 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 被 git 忽略,主目录中没有版本跟踪vendor/foo/bar/.git 的项目 - 但在子项目中。

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

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

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

要使用 composer(1) 进行这项工作,重要的是您将 composer 配置为首选该存储库的 source install 变体。这是preferred-install 选项,您可以专门为您的存储库配置它。

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

从你问题的措辞来看,我假设你还没有配置它。

这有点重要,因为只有 source 安装,vendor/foo/bar 中会有一个(非裸)git 克隆,因此在 @987654342 中的包文件夹中带有整体 git 配置的 git checkout @ 目录(因为您已将 Github 配置为存储库源,并且 composer 优化为默认 IIRC 采用 dist 版本)。

将配置更改为source 安装并更新后,将cd 更改为vendor/foo/bar,然后运行git remote -v。它现在应该向您显示该软件包的“composer”遥控器。

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

这是你在工资单上使用 Github 的价格,而不是更接近工作地点的配置,但至少在本地,你可以使用“git in git”处理包。

这通常是直截了当的。由于管理两个而不是一个存储库,因此仍然认为一个总体价格,但是您无法使用这种作曲家项目[仅作曲家版本的供应商文件夹]来阻止。

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


Loading a package from a VCS repository 的作曲家文档中还概述了一些带有一些提示的工作流程。


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

【讨论】:

  • 这似乎更适合实际问题(基于作曲家)。赞成。
  • 同意:自定义存储库上的 VCS 存储库是可行的方法。正如您所提到的,它在拉/推/组合时需要严格的方法。另一件事是 VCS 存储库可能是私有的。所以对于像 AWS EBS 这样的 CI/CD,你需要额外的 SSH 密钥存储和部署时的操作,所以 composer 可以拉它。在没有 composer.lock 的情况下推送时也要小心,在你的 Laravel 应用程序中使用 foo/bar 中的新文件,并且你的 CI 管道只是在执行 composer install。如果没有锁定,旧的 foo/bar 会在 composer install 中被检出,当你的应用尝试使用它时,自动加载器生成会抛出
【解决方案2】:

我是否需要在 vendor/foo 的项目中使用 git remote add origin https://github.com/thisisme/bar.git 有一个子 git。

这可以通过 submodule 实现,它允许您的父 Git 存储库仅存储对另一个存储库的引用
你可以使用git submodule add

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

【讨论】:

  • 这意味着即使我的 fork 所在的vendor 文件夹被.gitignore 忽略,它也不会与“父”git 交互?
  • @PeterPan 是的,.gitignore 不会影响其他存储库(嵌套或父)
  • 我试过这个,但这是将子模块添加到根目录。这对我不起作用,因为我需要在供应商的文件夹中使用它才能与 composer 一起使用
  • @PeterPan 它正在将子模块添加到您在git submodule add 上指定的路径中。它不必是根文件夹。
【解决方案3】:

如果您正在使用sail 或docker-compose,并且在供应商目录中链接foo/bar 项目只是暂时的,直到“它有效”解决方案您可以将其添加为卷链接。这是我通常做的。

例如:我正在~/projects/my-project 中处理我的项目,我将foo/bar 存储库克隆到~/projects/bar

然后我可以在 docker-compose.yml 中添加音量:

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

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

【讨论】:

    猜你喜欢
    • 2014-10-24
    • 2017-07-27
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多