首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >pnpm 的正确打开方式,怎么在保留 git 历史信息的情况下,将前后端项目保存在一个 git 仓库里?

pnpm 的正确打开方式,怎么在保留 git 历史信息的情况下,将前后端项目保存在一个 git 仓库里?

作者头像
萌萌哒草头将军
发布于 2025-05-17 07:16:58
发布于 2025-05-17 07:16:58
10300
代码可运行
举报
文章被收录于专栏:前端框架前端框架
运行总次数:0
代码可运行

前言

最近组里要求我把几个老项目的包管理工具从 yarn 转为 pnpm,因为新项目都使用 pnpm,另外,还要求将前后端(NodeJS)项目使用 monorepo的方式组织在一个仓库里,并且保留历史 git信息

这里记录下替换和组织过程!

正文

开始之前,需要了解 yarnpnpm 的区别!

前端的包管理工具之所以层出不穷,从官方的 npm 到热门社区的 yarnpnpm方案,再到一些新兴的 bunvolta等, 其核心原因是由于依赖包版本更新快,管理越来越复杂,这是一个梗图!

负重前行
负重前行

负重前行

目前来说,社区没有完美的解决方案,都是侧重点不同,比如 yarn 可以做到锁文件版本,可以让不同环境的开发者,使用相同版本的依赖包!pnpm 通过硬链接节省磁盘空间,这种机制分别弥补了 npm 在这两种情况下的缺点!

另外,它们都有自己的特色功能,比如:pnpm 内置了 monorepo 管理能力,以及可插拔的 hook 生命周期和插件机制!

yarnv2 中推出了 PNP 机制,抛弃 node_modules 目录,直接从 .pnp.js 加载依赖,加速启动速度,并减少磁盘文件数量,你可以将 .yarn/cache.pnp.js 一起提交到 git,这样 clone 项目后无需再执行 install,即装即用!

说的有点多了,总结就是一句话:

pnpm 通过硬链接节省磁盘空间,并且内置了 monorepo 管理能力!

yarn 通过锁文件版本,有很强的一致性!

而我使用 pnpm 更多的原因是内置的 monorepo 能力!

替换

说干就干,首先删除 node_modulesyarn.lock 文件,然后再在 package.json 文件中新增下面的配置,锁定包管理工具和版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"engines": {
    "node": ">=18.0.0",
    "pnpm": ">=8.0.0"
},
"packageManager": "pnpm@8.0.0",

然后执行 pnpm install

npm run dev

不出意外,肯定会报错,缺少某个包,这是正常的,因为 yarn 允许使用父级项目的依赖,而 pnpm 是不允许的!

这时候有两种方案,一种是将缺失的包,直接在 pnpm add xxx 添加进来!

另一种方案是允许使用父级依赖:pnpm install --node-linker=hoisted

具体使用哪种方案,你可以先运行下这个命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npx --yes depcheck

它可以列举项目中未使用、缺失的包,

Unused、Missing 情况
Unused、Missing 情况

Unused、Missing 情况

如果缺失的很多,推荐第二种,不多的话就一个一个下载吧!

组织(重头戏)

新建文件夹,例如:demo,然后初始化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir demo
cd demo
pnpm init

新建 pnpm-workspace.yaml,新增如下配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
packages:
  - 'packages/*'

新建 packages 文件夹,存放前后端子项目!

接下来是重头戏了,怎么保留原始 git 历史信息的情况下,将前后端项目保存在一个 git 仓库里?

首先你得下载一个工具库 git-filter-repo

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brew install git-filter-repo

然后初始化git

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git init

拉取一个裸仓库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone --bare https://xxxx/fe.git

然后进入这个临时项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd fe.git

使用 git-filter-repo 工具合并历史记录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git filter-repo --to-subdirectory-filter packages/fe

添加临时仓库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd ..
git remote add fe ../demo/fe.git

拉去最新代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git fetch fe

将 fe 的代码 合入过来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git merge fe/master --allow-unrelated-histories -m "feat: 合并代码"

清理临时临时仓即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git remote remove fe

验证下是否有历史记录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git log -- packages/fe

并且可以看到在 packages 已经有了我们前端的代码了

接着重复上面的操作完成后端代码的迁移即可!

操作之后,你就可以看到完整的带有 git 历史记录的 monorepo 项目了!

我的历史记录
我的历史记录

我的历史记录

最后

今天的分享就这些了,希望可以帮助到你!如果文章中有任何问题,欢迎指正!、

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 萌萌哒草头将军 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【计算机网络】数据链路层
假设我们要将数据从主机A推送到主机B,根据我们之前的理解,是可以通过网络层进行路由的,这就是网络层在做决策,所以在网络层就要先决策该报文是要转发给和我处于同一网段的其它主机,还是交到下一跳,决策了之后再把报文向下交付,最后把报文交到路由器中。
YoungMLet
2024/03/30
2150
【计算机网络】数据链路层
ARP 简介
地址解析协议(ARP)是网络通信中不可或缺的一部分,它工作在OSI模型的第二层(数据链路层),负责将网络层的IP地址映射为数据链路层的MAC地址。这一过程对于网络数据包的正确传输至关重要。本文将详细介绍ARP的工作原理、应用场景、以及与之相关的技术细节。
Michel_Rolle
2024/10/11
3K0
【Linux】网络--数据链路层--以太网
以太网是一种技术标准,包含数据链路层以及物理层的内容,是当今世界上应用最广泛的局域网技术,其兼容性强,成本低,扩展性高
s-little-monster
2025/06/10
1010
【Linux】网络--数据链路层--以太网
【Linux网络】网络层IP协议,数据链路层:以太网、ARP协议
但是随着互联网的飞速发展,这种划分方案的局限性很快显现出来,A 类地址很容易浪费,于是提出了新的划分方案:CIDR(Classless Interdomain Routing)
_小羊_
2025/03/02
2111
【Linux网络】网络层IP协议,数据链路层:以太网、ARP协议
常用的数据链路层协议_数据链路层和网络层
虽然网络中各个局域网所采用的通信技术可能的不同的,但是IP屏蔽了底层网络的差异,对于网络通信双方的IP层及其往上的协议来说,它们并不需要关心底层具体使用的是哪种局域网技术。
全栈程序员站长
2022/11/01
9810
彻底搞懂系列之:ARP协议
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;
网络工程师笔记
2021/05/17
3.7K0
彻底搞懂系列之:ARP协议
Linux网络-MAC协议
注: ARP属于局域网通信的协议标准,因此一台主机不能跨网络向另一台主机发起ARP请求
用户9645905
2022/11/15
2.7K0
Linux网络-MAC协议
【Linux网络编程】数据链路层 | MAC帧 | ARP协议
数据链路实现某一区间(一条)内的通信,而IP实现直至最终目标地址的通信(点对点)。
南桥
2025/01/14
3590
【Linux网络编程】数据链路层 | MAC帧 | ARP协议
【Linux】:数据链路层(以太网 & 局域网通信 & ARP协议 & ARP 欺骗 & DDos 攻击)
数据链路层 位于物理层和网络层之间,其作用是将源自物理层来的数据可靠地传输到相邻节点的目标主机的网络层,主要通过物理介质(如以太网,Wi-Fi等)将数据分割成帧,并在相邻节点之间进行传输。
IsLand1314
2025/03/02
4210
【Linux】:数据链路层(以太网 & 局域网通信 & ARP协议 & ARP 欺骗 & DDos 攻击)
一次web请求用到的arp、ip、udp、tcp、rip、http协议详解
本文面向有一定计算机网络基础的读者,通过实验剖析请求环节中的报文附加一些类比,帮助读者更清晰的了解常用的网络协议工作细节。 本文数据链路层以以太网为例介绍。 概念链接: MAC地址 IP地址 子网掩码 默认网关 。
mooner
2022/12/04
1.6K0
一次web请求用到的arp、ip、udp、tcp、rip、http协议详解
【JavaEE初阶】TCP/IP协议(二)
如果一个IP数据报携带的数据载荷太长了,超过64kb,就会在网络层针对数据进行拆分。把一个数据拆分成多个IP数据报。再分别发送给接收方,再重新拼装。 接收方:数据链路层,针对两个数据帧进行分用,得到两个IP数据报,交给网络层,网络层针对这俩IP数据报进行解析,把里面的载荷拼成一个,交给传输层。
xxxflower
2023/10/16
2600
【JavaEE初阶】TCP/IP协议(二)
转发表(MAC表)、ARP表、路由表总结
计算机网络中一个关键步骤在于通信路径上不同节点对于流经本节点的数据包转发,常见的交换设备主要是交换机(第二层、三层)和路由器(第三层),在实际运行时,它们各自维护一些表结构帮助完成数据包的正确寻址与转发,本文详细介绍了三张至关重要的表:转发表、ARP表与路由表的在网络数据包转发功能中发挥的作用,以及它们协同工作的原理,顺便也会接着之前的文章继续谈谈交换机和路由器的一些事儿。
我是东东东
2018/08/01
29.3K4
转发表(MAC表)、ARP表、路由表总结
【计算机网络】网络基础
计算机数量更多了,通过交换机和路由器连接在一起。如下图,路由器的左右侧都是一个局域网,两个局域网用路由器连接起来,构成局域网LAN;在局域网内部,对应的主机用交换机可以互相转化消息;跨局域网经过路由器+交换机进行数据转化。数据经过交换机发现不是本网络的,直接交给路由器,路由器再在对应的子网当中,找到对应的主机。
YoungMLet
2024/03/01
2170
【计算机网络】网络基础
【计算机网络三】一篇文章详解TCP/IP四层协议簇
DNS ,即 Domain Name System ,域名系统。 DNS 是一整套从域名映射到 IP 的系统。
小皮侠
2024/10/29
6860
【计算机网络三】一篇文章详解TCP/IP四层协议簇
【计算机网络】详解TCP/IP分层模型&局域网和跨网络通信的原理
两个概念:交换机:实现位于同一个子网中的主机数据交换。路由器:实现数据包的跨网络转发。
用户10923276
2024/09/22
8400
【计算机网络】详解TCP/IP分层模型&局域网和跨网络通信的原理
计算机网络-数据链路层
透明传输:指数据链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样。
用户9615083
2022/12/30
9680
计算机网络-数据链路层
【计算机网络】详解数据链路层数据帧&Mac地址&ARP协议
"以太网" 不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容 。例如:规定了网络拓扑结构,访问控制方式,传输速率等;例如以太网中的网线必须使用双绞线,传输速率有 10M、100M、1000M等。以太网是当前应用最广泛的局域网技术;和以太网并列的还有令牌环网,无线LAN等。
用户10923276
2024/10/17
4990
【计算机网络】详解数据链路层数据帧&Mac地址&ARP协议
初识Linux · 数据链路层
前文我们通过OSI模型,一直到TCP/IP四层模型,经过了三篇文章左右的功夫,我们把网络层介绍完毕,主要还是介绍的IP协议的iphdr,以及内网公网的概念,最后是一个IP分片。那么经过一系列介绍,我们最终也到了TCP/IP四层模型的最后一层——数据链路层。
_lazy
2025/05/21
1060
初识Linux · 数据链路层
TCP/IP第二层--数据链路层
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。
黄规速
2022/04/14
2K0
TCP/IP第二层--数据链路层
ARP & RARP
对于以太网,数据链路层上是根据48bit的以太网地址来确定目的接口,设备驱动程序从不检查IP数据报中的目的IP地址。ARP协议为IP地址到对应的硬件地址之间提供动态映射。
Nujil
2023/04/12
1.8K0
相关推荐
【计算机网络】数据链路层
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档