发布于2026-07-04 阅读(0)
扫一扫,手机访问
先说一个结论:Composer 本身并不提供直接查看 Git 提交摘要的命令行工具。很多人会想,既然包是从 Git 仓库拉下来的,那通过 composer show 总能找到点什么吧?答案可能会让你失望。

不能。composer show 默认只显示包的版本号、描述、依赖和自动加载信息,完全不涉及 Git 元数据。即便你的包是以 VCS(版本控制系统)类型安装的,Composer 也不会主动抓取或展示任何提交信息,比如 commit hash 或提交消息。这不是设计缺陷,而是它本身就没打算干这个活。
vendor 目录下是否保留 .git 目录,这取决于 Composer 的安装方式和配置。说白了,这完全取决于你当初是怎么装进来的:
composer install 或 composer update 默认安装,Composer 通常会清理掉 .git 目录,除非你显式设置了 "preferred-install": "source"。.git 目录侥幸还在,composer show 也不会去读取它。它查的是 composer.lock 中记录的 dist.reference 或 source.reference 字段。dist.reference 是压缩包的校验标识(比如 SHA256),不是 Git commit;source.reference 才是真正的 commit hash,但它只存在于以 source 方式安装的包中。换句话说,如果你用的是 zip 包下载方式,那锁文件里压根不会记录 commit hash。这是最轻量、也最可靠的办法 —— 不去碰 vendor 目录,只读 composer.lock 文件。而且它适用于所有通过 Git 源安装的包,不管 vendor 目录是否被清理过。
执行下面这条命令(把 monolog/monolog 换成你要查的包名):
jq -r '.packages[] | select(.name == "monolog/monolog") | .source.reference' composer.lock
如果返回结果是空,说明这个包当初是以 dist 方式安装的(比如从 packagist.org 下载的 zip 包),这时就没办法查到 Git 提交摘要了。你也可以试试查 .dist.reference,但那东西跟 commit hash 不是一回事。
需要提醒一下:jq 是个命令行工具,得提前装上。如果不想折腾,用 PHP 也能快速搞定:
php -r "$lock = json_decode(file_get_contents('composer.lock'), true); foreach ($lock['packages'] as $p) { if ($p['name'] === 'monolog/monolog' && isset($p['source']['reference'])) { echo $p['source']['reference'] . "\n"; break; } }"
这条路只有在包以 source 方式安装的前提下才能走通,也就是说 vendor/{vendor}/{package}/.git 这个目录确实存在。具体步骤:
cd vendor/monolog/monologgit log -1 --format="%H %s" HEAD。输出会类似 a1b2c3d Fix: a void null ref in HandlerStack 这样,同时包含 hash 和提交消息。fatal: not a git repository 的错误,说明 .git 已经被删了,这条路走不通。git rev-parse HEAD 单独取 hash —— 那样你得到的信息不够完整,连提交消息都没有。这个方法有个致命的缺点:大多数生产环境都默认禁用 source 安装方式,因为那样会把 .git 目录完整拉下来,既浪费空间又增加部署负担。而且 vendor 目录很有可能会被清理工具处理过。所以,首选方案还是走 composer.lock 配合 source.reference 这条路径。
说到底,真正要拿到完整的提交摘要,关键不在于“怎么运行命令”,而在于你在安装时就要确保启用了 "preferred-install": {"*": "source"}。否则锁文件里根本没有存储 reference,后续再怎么折腾也是白费力气。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8