grf-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +503 -0
- package/README.zh-CN.md +503 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +74 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.d.ts +7 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +92 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/clean.d.ts +7 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +171 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/config.d.ts +7 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +170 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/list.d.ts +7 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +149 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/load.d.ts +8 -0
- package/dist/commands/load.d.ts.map +1 -0
- package/dist/commands/load.js +239 -0
- package/dist/commands/load.js.map +1 -0
- package/dist/commands/unload.d.ts +7 -0
- package/dist/commands/unload.d.ts.map +1 -0
- package/dist/commands/unload.js +738 -0
- package/dist/commands/unload.js.map +1 -0
- package/dist/commands/update.d.ts +7 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +471 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/use.d.ts +8 -0
- package/dist/commands/use.d.ts.map +1 -0
- package/dist/commands/use.js +224 -0
- package/dist/commands/use.js.map +1 -0
- package/dist/core/config.d.ts +55 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +179 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/filesystem.d.ts +74 -0
- package/dist/core/filesystem.d.ts.map +1 -0
- package/dist/core/filesystem.js +300 -0
- package/dist/core/filesystem.js.map +1 -0
- package/dist/core/git.d.ts +75 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +169 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/loading.d.ts +85 -0
- package/dist/core/loading.d.ts.map +1 -0
- package/dist/core/loading.js +224 -0
- package/dist/core/loading.js.map +1 -0
- package/dist/core/repository.d.ts +120 -0
- package/dist/core/repository.d.ts.map +1 -0
- package/dist/core/repository.js +374 -0
- package/dist/core/repository.js.map +1 -0
- package/dist/core/sync.d.ts +72 -0
- package/dist/core/sync.d.ts.map +1 -0
- package/dist/core/sync.js +226 -0
- package/dist/core/sync.js.map +1 -0
- package/dist/types/index.d.ts +135 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +63 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +59 -0
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
[English](https://github.com/haiyewei/gitreference/blob/main/README.md) | 简体中文
|
|
2
|
+
|
|
3
|
+
# Git Reference (grf)
|
|
4
|
+
|
|
5
|
+
一个轻量级的 CLI 工具,用于管理来自 Git 仓库的参考代码。轻松添加、加载和同步参考代码到你的项目中,而不会使主代码库变得混乱。
|
|
6
|
+
|
|
7
|
+
## 功能特点
|
|
8
|
+
|
|
9
|
+
- **添加和管理 Git 参考仓库** - 使用自定义别名跟踪多个参考仓库
|
|
10
|
+
- **将参考代码加载到工作目录** - 有选择地从参考仓库加载文件和目录
|
|
11
|
+
- **浅克隆支持** - 默认使用浅克隆节省磁盘空间
|
|
12
|
+
- **自动 .gitignore 管理** - 自动将加载的参考代码添加到 .gitignore
|
|
13
|
+
- **仓库更新和同步** - 使用简单的命令保持参考代码最新
|
|
14
|
+
|
|
15
|
+
## 安装
|
|
16
|
+
|
|
17
|
+
### 前置要求
|
|
18
|
+
|
|
19
|
+
- **Node.js** >= 18.0.0
|
|
20
|
+
- **Git** >= 2.0.0
|
|
21
|
+
|
|
22
|
+
### 通过 npm 安装
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# 全局安装(推荐)
|
|
26
|
+
npm install -g gitreference
|
|
27
|
+
|
|
28
|
+
# 或者使用 npx 无需安装
|
|
29
|
+
npx gitreference <command>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 快速开始
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# 在项目中初始化 grf
|
|
36
|
+
grf config init
|
|
37
|
+
|
|
38
|
+
# 添加参考仓库
|
|
39
|
+
grf add https://github.com/example/awesome-utils.git --alias utils
|
|
40
|
+
|
|
41
|
+
# 列出所有参考仓库
|
|
42
|
+
grf list
|
|
43
|
+
|
|
44
|
+
# 将参考代码加载到项目中
|
|
45
|
+
grf load utils --path src/helpers
|
|
46
|
+
|
|
47
|
+
# 更新所有参考到最新版本
|
|
48
|
+
grf update
|
|
49
|
+
|
|
50
|
+
# 不再需要时卸载参考代码
|
|
51
|
+
grf unload utils
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 命令
|
|
55
|
+
|
|
56
|
+
### add
|
|
57
|
+
|
|
58
|
+
添加参考仓库。
|
|
59
|
+
|
|
60
|
+
**语法:**
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
grf add <url> [options]
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**参数:**
|
|
67
|
+
|
|
68
|
+
| 参数 | 类型 | 必需 | 默认值 | 描述 |
|
|
69
|
+
| ---- | ------ | ----- | ------ | ------------ |
|
|
70
|
+
| url | string | ✅ 是 | - | Git 仓库 URL |
|
|
71
|
+
|
|
72
|
+
**选项:**
|
|
73
|
+
|
|
74
|
+
| 选项 | 简写 | 类型 | 默认值 | 描述 |
|
|
75
|
+
| ------------ | ---- | ------- | ------ | -------------------- |
|
|
76
|
+
| --name | -n | string | - | 自定义仓库名称 |
|
|
77
|
+
| --branch | -b | string | - | 指定分支 |
|
|
78
|
+
| --shallow | - | boolean | true | 浅克隆(默认:启用) |
|
|
79
|
+
| --no-shallow | - | boolean | - | 完整克隆 |
|
|
80
|
+
| --depth | - | string | "1" | 浅克隆深度 |
|
|
81
|
+
|
|
82
|
+
**示例:**
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
# 使用默认设置添加仓库
|
|
86
|
+
grf add https://github.com/example/repo.git
|
|
87
|
+
|
|
88
|
+
# 使用自定义名称添加
|
|
89
|
+
grf add https://github.com/example/repo.git --name my-ref
|
|
90
|
+
|
|
91
|
+
# 添加特定分支
|
|
92
|
+
grf add https://github.com/example/repo.git --branch develop
|
|
93
|
+
|
|
94
|
+
# 完整克隆(非浅克隆)
|
|
95
|
+
grf add https://github.com/example/repo.git --no-shallow
|
|
96
|
+
|
|
97
|
+
# 使用自定义浅克隆深度
|
|
98
|
+
grf add https://github.com/example/repo.git --depth 10
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
### clean
|
|
104
|
+
|
|
105
|
+
清理缓存的仓库。
|
|
106
|
+
|
|
107
|
+
**语法:**
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
grf clean [name] [options]
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**参数:**
|
|
114
|
+
|
|
115
|
+
| 参数 | 类型 | 必需 | 默认值 | 描述 |
|
|
116
|
+
| ---- | ------ | ----- | ------ | ---------------- |
|
|
117
|
+
| name | string | ❌ 否 | - | 要移除的仓库名称 |
|
|
118
|
+
|
|
119
|
+
**选项:**
|
|
120
|
+
|
|
121
|
+
| 选项 | 简写 | 类型 | 默认值 | 描述 |
|
|
122
|
+
| ------- | ---- | ------- | ------ | ------------------ |
|
|
123
|
+
| --all | - | boolean | false | 移除所有缓存的仓库 |
|
|
124
|
+
| --force | -f | boolean | false | 跳过确认 |
|
|
125
|
+
|
|
126
|
+
**示例:**
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# 移除特定的缓存仓库
|
|
130
|
+
grf clean my-ref
|
|
131
|
+
|
|
132
|
+
# 移除所有缓存的仓库(需要确认)
|
|
133
|
+
grf clean --all
|
|
134
|
+
|
|
135
|
+
# 无需确认移除所有缓存的仓库
|
|
136
|
+
grf clean --all --force
|
|
137
|
+
|
|
138
|
+
# 无需确认移除特定仓库
|
|
139
|
+
grf clean my-ref -f
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### config
|
|
145
|
+
|
|
146
|
+
管理全局配置。
|
|
147
|
+
|
|
148
|
+
**语法:**
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
grf config [key] [value] [options]
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**参数:**
|
|
155
|
+
|
|
156
|
+
| 参数 | 类型 | 必需 | 默认值 | 描述 |
|
|
157
|
+
| ----- | ------ | ----- | ------ | ------ |
|
|
158
|
+
| key | string | ❌ 否 | - | 配置键 |
|
|
159
|
+
| value | string | ❌ 否 | - | 配置值 |
|
|
160
|
+
|
|
161
|
+
**选项:**
|
|
162
|
+
|
|
163
|
+
| 选项 | 简写 | 类型 | 默认值 | 描述 |
|
|
164
|
+
| ------ | ---- | ------- | ------ | ---------------- |
|
|
165
|
+
| --list | - | boolean | false | 显示所有配置 |
|
|
166
|
+
| --path | - | boolean | false | 显示配置文件路径 |
|
|
167
|
+
|
|
168
|
+
**有效的配置键:**
|
|
169
|
+
|
|
170
|
+
| 键 | 类型 | 描述 |
|
|
171
|
+
| ------------- | ------- | ------------------------ |
|
|
172
|
+
| defaultBranch | string | 默认分支名称 |
|
|
173
|
+
| shallowClone | boolean | 启用浅克隆(true/false) |
|
|
174
|
+
| shallowDepth | number | 浅克隆深度(正整数) |
|
|
175
|
+
|
|
176
|
+
**示例:**
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
# 显示所有配置
|
|
180
|
+
grf config --list
|
|
181
|
+
|
|
182
|
+
# 显示配置文件路径
|
|
183
|
+
grf config --path
|
|
184
|
+
|
|
185
|
+
# 获取配置值
|
|
186
|
+
grf config defaultBranch
|
|
187
|
+
|
|
188
|
+
# 设置配置值
|
|
189
|
+
grf config defaultBranch main
|
|
190
|
+
|
|
191
|
+
# 启用浅克隆
|
|
192
|
+
grf config shallowClone true
|
|
193
|
+
|
|
194
|
+
# 设置浅克隆深度
|
|
195
|
+
grf config shallowDepth 5
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
### list
|
|
201
|
+
|
|
202
|
+
列出所有缓存的仓库。
|
|
203
|
+
|
|
204
|
+
**语法:**
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
grf list [options]
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**选项:**
|
|
211
|
+
|
|
212
|
+
| 选项 | 简写 | 类型 | 默认值 | 描述 |
|
|
213
|
+
| ------ | ---- | ------- | ------ | ---------------- |
|
|
214
|
+
| --json | - | boolean | false | 以 JSON 格式输出 |
|
|
215
|
+
|
|
216
|
+
**示例:**
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
# 列出所有缓存的仓库
|
|
220
|
+
grf list
|
|
221
|
+
|
|
222
|
+
# 以 JSON 格式列出
|
|
223
|
+
grf list --json
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
### load
|
|
229
|
+
|
|
230
|
+
将参考仓库复制到当前目录(支持 Git URL)。
|
|
231
|
+
|
|
232
|
+
**语法:**
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
grf load <name> [path] [options]
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**参数:**
|
|
239
|
+
|
|
240
|
+
| 参数 | 类型 | 必需 | 默认值 | 描述 |
|
|
241
|
+
| ---- | ------ | ----- | --------------------------- | ------------------------ |
|
|
242
|
+
| name | string | ✅ 是 | - | 仓库名称、简称或 Git URL |
|
|
243
|
+
| path | string | ❌ 否 | .gitreference/\<repo-path\> | 目标路径 |
|
|
244
|
+
|
|
245
|
+
**选项:**
|
|
246
|
+
|
|
247
|
+
| 选项 | 简写 | 类型 | 默认值 | 描述 |
|
|
248
|
+
| ----------- | ---- | ------- | ------ | -------------------------- |
|
|
249
|
+
| --subdir | -s | string | - | 仅复制特定子目录 |
|
|
250
|
+
| --no-ignore | - | boolean | - | 不更新 .gitignore |
|
|
251
|
+
| --branch | -b | string | - | 指定分支(仅用于 Git URL) |
|
|
252
|
+
|
|
253
|
+
**示例:**
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
# 按名称加载仓库
|
|
257
|
+
grf load my-ref
|
|
258
|
+
|
|
259
|
+
# 加载到特定路径
|
|
260
|
+
grf load my-ref src/helpers
|
|
261
|
+
|
|
262
|
+
# 仅加载特定子目录
|
|
263
|
+
grf load my-ref --subdir src/utils
|
|
264
|
+
|
|
265
|
+
# 加载但不更新 .gitignore
|
|
266
|
+
grf load my-ref --no-ignore
|
|
267
|
+
|
|
268
|
+
# 直接从 Git URL 加载
|
|
269
|
+
grf load https://github.com/example/repo.git
|
|
270
|
+
|
|
271
|
+
# 从 Git URL 加载特定分支
|
|
272
|
+
grf load https://github.com/example/repo.git --branch develop
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
### unload
|
|
278
|
+
|
|
279
|
+
从当前项目移除参考代码。
|
|
280
|
+
|
|
281
|
+
**语法:**
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
grf unload [name] [options]
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
**参数:**
|
|
288
|
+
|
|
289
|
+
| 参数 | 类型 | 必需 | 默认值 | 描述 |
|
|
290
|
+
| ---- | ------ | ----- | ------ | ---------------- |
|
|
291
|
+
| name | string | ❌ 否 | - | 要移除的仓库名称 |
|
|
292
|
+
|
|
293
|
+
**选项:**
|
|
294
|
+
|
|
295
|
+
| 选项 | 简写 | 类型 | 默认值 | 描述 |
|
|
296
|
+
| ------------- | ---- | ------- | ------ | ---------------------------------- |
|
|
297
|
+
| --all | -a | boolean | false | 移除所有参考代码 |
|
|
298
|
+
| --force | -f | boolean | false | 跳过确认提示 |
|
|
299
|
+
| --dry-run | - | boolean | false | 显示将要删除的内容但不实际删除 |
|
|
300
|
+
| --list | -l | boolean | false | 列出所有已加载的参考代码 |
|
|
301
|
+
| --keep-empty | - | boolean | false | 移除后保留空的 .gitreference/ 目录 |
|
|
302
|
+
| --clean-empty | - | boolean | false | 清理 .gitreference/ 中的空目录结构 |
|
|
303
|
+
| --verbose | -v | boolean | false | 显示详细的删除进度 |
|
|
304
|
+
|
|
305
|
+
**示例:**
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
# 移除特定参考
|
|
309
|
+
grf unload my-ref
|
|
310
|
+
|
|
311
|
+
# 移除所有参考代码
|
|
312
|
+
grf unload --all
|
|
313
|
+
|
|
314
|
+
# 无需确认移除
|
|
315
|
+
grf unload my-ref --force
|
|
316
|
+
|
|
317
|
+
# 预览将要删除的内容
|
|
318
|
+
grf unload my-ref --dry-run
|
|
319
|
+
|
|
320
|
+
# 列出所有已加载的参考
|
|
321
|
+
grf unload --list
|
|
322
|
+
|
|
323
|
+
# 移除但保留空的 .gitreference/ 目录
|
|
324
|
+
grf unload my-ref --keep-empty
|
|
325
|
+
|
|
326
|
+
# 移除后清理空目录
|
|
327
|
+
grf unload my-ref --clean-empty
|
|
328
|
+
|
|
329
|
+
# 显示详细进度
|
|
330
|
+
grf unload my-ref --verbose
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
### update
|
|
336
|
+
|
|
337
|
+
更新缓存的仓库并可选择同步到工作区。
|
|
338
|
+
|
|
339
|
+
**语法:**
|
|
340
|
+
|
|
341
|
+
```bash
|
|
342
|
+
grf update [name] [options]
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
**参数:**
|
|
346
|
+
|
|
347
|
+
| 参数 | 类型 | 必需 | 默认值 | 描述 |
|
|
348
|
+
| ---- | ------ | ----- | ------ | ---------------------------- |
|
|
349
|
+
| name | string | ❌ 否 | - | 仓库名称(不指定则更新全部) |
|
|
350
|
+
|
|
351
|
+
**选项:**
|
|
352
|
+
|
|
353
|
+
| 选项 | 简写 | 类型 | 默认值 | 描述 |
|
|
354
|
+
| ----------- | ---- | ------- | ------ | ------------------------------ |
|
|
355
|
+
| --check | - | boolean | false | 仅检查更新,不拉取 |
|
|
356
|
+
| --status | - | boolean | false | 显示工作区和缓存之间的同步状态 |
|
|
357
|
+
| --sync | -s | boolean | false | 更新缓存后同步到工作区 |
|
|
358
|
+
| --sync-only | - | boolean | false | 仅同步到工作区(跳过缓存更新) |
|
|
359
|
+
| --force | -f | boolean | false | 即使版本匹配也强制同步 |
|
|
360
|
+
| --dry-run | - | boolean | false | 显示将要执行的操作但不实际执行 |
|
|
361
|
+
|
|
362
|
+
**示例:**
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
# 更新所有缓存的仓库
|
|
366
|
+
grf update
|
|
367
|
+
|
|
368
|
+
# 更新特定仓库
|
|
369
|
+
grf update my-ref
|
|
370
|
+
|
|
371
|
+
# 检查更新但不拉取
|
|
372
|
+
grf update --check
|
|
373
|
+
|
|
374
|
+
# 显示同步状态
|
|
375
|
+
grf update --status
|
|
376
|
+
|
|
377
|
+
# 更新并同步到工作区
|
|
378
|
+
grf update --sync
|
|
379
|
+
|
|
380
|
+
# 仅同步到工作区(跳过缓存更新)
|
|
381
|
+
grf update --sync-only
|
|
382
|
+
|
|
383
|
+
# 即使版本匹配也强制同步
|
|
384
|
+
grf update --sync --force
|
|
385
|
+
|
|
386
|
+
# 预览将要执行的操作
|
|
387
|
+
grf update --dry-run
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## 配置
|
|
393
|
+
|
|
394
|
+
### 配置文件
|
|
395
|
+
|
|
396
|
+
grf 使用全局配置目录来存储设置和缓存的仓库:
|
|
397
|
+
|
|
398
|
+
| 位置 | 描述 |
|
|
399
|
+
| ----------------------------- | -------------------------- |
|
|
400
|
+
| `~/.gitreference/config.json` | 全局配置文件 |
|
|
401
|
+
| `~/.gitreference/repos/` | 缓存仓库存储位置 |
|
|
402
|
+
| `.gitreference/` | 工作目录(在项目根目录中) |
|
|
403
|
+
|
|
404
|
+
### 配置文件结构
|
|
405
|
+
|
|
406
|
+
全局配置文件(`~/.gitreference/config.json`)包含:
|
|
407
|
+
|
|
408
|
+
```json
|
|
409
|
+
{
|
|
410
|
+
"defaultBranch": "main",
|
|
411
|
+
"shallowClone": true,
|
|
412
|
+
"shallowDepth": 1,
|
|
413
|
+
"repositories": [
|
|
414
|
+
{
|
|
415
|
+
"name": "example-repo",
|
|
416
|
+
"url": "https://github.com/example/repo.git",
|
|
417
|
+
"branch": "main",
|
|
418
|
+
"shallow": true,
|
|
419
|
+
"depth": 1
|
|
420
|
+
}
|
|
421
|
+
]
|
|
422
|
+
}
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
---
|
|
426
|
+
|
|
427
|
+
## 工作原理
|
|
428
|
+
|
|
429
|
+
grf 采用两阶段工作流来管理参考代码:
|
|
430
|
+
|
|
431
|
+
```
|
|
432
|
+
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
433
|
+
│ 远程仓库 │────▶│ 全局缓存 │────▶│ 项目工作区 │
|
|
434
|
+
│ (GitHub 等) │ │ (~/.gitreference/repos) │ │ (.gitreference) │
|
|
435
|
+
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
436
|
+
│ │ │
|
|
437
|
+
│ grf add │ grf load │
|
|
438
|
+
│ grf update │ grf update --sync│
|
|
439
|
+
└───────────────────────┴───────────────────────┘
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
### 工作流程步骤
|
|
443
|
+
|
|
444
|
+
1. **`grf add`** - 将仓库克隆到全局缓存目录(`~/.gitreference/repos/`)
|
|
445
|
+
2. **`grf load`** - 将缓存的仓库复制到当前项目的 `.gitreference/` 目录
|
|
446
|
+
3. **自动 .gitignore** - `.gitreference/` 目录会自动添加到 `.gitignore`
|
|
447
|
+
4. **`grf update`** - 从远程更新缓存,并可选择同步到工作目录
|
|
448
|
+
5. **`grf unload`** - 从项目中移除已加载的参考代码
|
|
449
|
+
|
|
450
|
+
### 优势
|
|
451
|
+
|
|
452
|
+
- **集中缓存** - 仓库只需克隆一次,可在多个项目间共享
|
|
453
|
+
- **干净的项目历史** - 参考代码被排除在版本控制之外
|
|
454
|
+
- **轻松更新** - 保持参考代码与上游更改同步
|
|
455
|
+
- **选择性加载** - 只加载你需要的文件或目录
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
459
|
+
## 许可证
|
|
460
|
+
|
|
461
|
+
本项目采用 MIT 许可证 - 详见 [LICENSE](https://github.com/haiyewei/gitreference/blob/main/LICENSE) 文件。
|
|
462
|
+
|
|
463
|
+
---
|
|
464
|
+
|
|
465
|
+
## 贡献指南
|
|
466
|
+
|
|
467
|
+
欢迎贡献!以下是你可以提供帮助的方式:
|
|
468
|
+
|
|
469
|
+
### 开始
|
|
470
|
+
|
|
471
|
+
1. Fork 本仓库
|
|
472
|
+
2. 克隆你的 fork:`git clone https://github.com/your-username/gitreference.git`
|
|
473
|
+
3. 安装依赖:`npm install`
|
|
474
|
+
4. 创建功能分支:`git checkout -b feature/your-feature`
|
|
475
|
+
|
|
476
|
+
### 开发
|
|
477
|
+
|
|
478
|
+
```bash
|
|
479
|
+
# 构建项目
|
|
480
|
+
npm run build
|
|
481
|
+
|
|
482
|
+
# 以开发模式运行
|
|
483
|
+
npm run dev
|
|
484
|
+
|
|
485
|
+
# 运行测试
|
|
486
|
+
npm test
|
|
487
|
+
|
|
488
|
+
# 代码检查
|
|
489
|
+
npm run lint
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
### 提交更改
|
|
493
|
+
|
|
494
|
+
1. 进行更改并使用清晰、描述性的消息提交
|
|
495
|
+
2. 推送到你的 fork:`git push origin feature/your-feature`
|
|
496
|
+
3. 打开一个 Pull Request,并清楚描述你的更改
|
|
497
|
+
|
|
498
|
+
### 指南
|
|
499
|
+
|
|
500
|
+
- 遵循现有的代码风格
|
|
501
|
+
- 为新功能添加测试
|
|
502
|
+
- 根据需要更新文档
|
|
503
|
+
- 保持提交专注且原子化
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
const commander_1 = require("commander");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const add_js_1 = require("./commands/add.js");
|
|
41
|
+
const load_js_1 = require("./commands/load.js");
|
|
42
|
+
const unload_js_1 = require("./commands/unload.js");
|
|
43
|
+
const update_js_1 = require("./commands/update.js");
|
|
44
|
+
const list_js_1 = require("./commands/list.js");
|
|
45
|
+
const clean_js_1 = require("./commands/clean.js");
|
|
46
|
+
const config_js_1 = require("./commands/config.js");
|
|
47
|
+
// 读取 package.json 获取版本号
|
|
48
|
+
const packageJsonPath = path.join(__dirname, "..", "package.json");
|
|
49
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
|
|
50
|
+
const program = new commander_1.Command();
|
|
51
|
+
program
|
|
52
|
+
.name("grf")
|
|
53
|
+
.description("Git Reference - A lightweight tool for managing reference code")
|
|
54
|
+
.version(packageJson.version);
|
|
55
|
+
// 注册所有命令
|
|
56
|
+
program.addCommand(add_js_1.addCommand);
|
|
57
|
+
program.addCommand(load_js_1.loadCommand);
|
|
58
|
+
program.addCommand(unload_js_1.unloadCommand);
|
|
59
|
+
program.addCommand(update_js_1.updateCommand);
|
|
60
|
+
program.addCommand(list_js_1.listCommand);
|
|
61
|
+
program.addCommand(clean_js_1.cleanCommand);
|
|
62
|
+
program.addCommand(config_js_1.configCommand);
|
|
63
|
+
// 全局错误处理
|
|
64
|
+
process.on("uncaughtException", (error) => {
|
|
65
|
+
console.error("Error:", error.message);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
});
|
|
68
|
+
process.on("unhandledRejection", (reason) => {
|
|
69
|
+
console.error("Error:", reason instanceof Error ? reason.message : String(reason));
|
|
70
|
+
process.exit(1);
|
|
71
|
+
});
|
|
72
|
+
// 解析命令行参数
|
|
73
|
+
program.parse();
|
|
74
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAoC;AACpC,uCAAyB;AACzB,2CAA6B;AAC7B,8CAA+C;AAC/C,gDAAiD;AACjD,oDAAqD;AACrD,oDAAqD;AACrD,gDAAiD;AACjD,kDAAmD;AACnD,oDAAqD;AAErD,wBAAwB;AACxB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AACnE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1E,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,gEAAgE,CAAC;KAC7E,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AAEhC,SAAS;AACT,OAAO,CAAC,UAAU,CAAC,mBAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,qBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,yBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,yBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,qBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,uBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,yBAAa,CAAC,CAAC;AAElC,SAAS;AACT,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAY,EAAE,EAAE;IAC/C,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAe,EAAE,EAAE;IACnD,OAAO,CAAC,KAAK,CACX,QAAQ,EACR,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAC1D,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,UAAU;AACV,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,UAAU,SA2DpB,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* add 命令
|
|
4
|
+
* 克隆远程仓库到本地缓存
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.addCommand = void 0;
|
|
44
|
+
const commander_1 = require("commander");
|
|
45
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
+
const ora_1 = __importDefault(require("ora"));
|
|
47
|
+
const repository = __importStar(require("../core/repository.js"));
|
|
48
|
+
const index_js_1 = require("../types/index.js");
|
|
49
|
+
exports.addCommand = new commander_1.Command("add")
|
|
50
|
+
.description("Add a reference repository")
|
|
51
|
+
.argument("<url>", "Git repository URL")
|
|
52
|
+
.option("-n, --name <name>", "Custom repository name")
|
|
53
|
+
.option("-b, --branch <branch>", "Specify branch")
|
|
54
|
+
.option("--shallow", "Shallow clone (default)", true)
|
|
55
|
+
.option("--no-shallow", "Full clone")
|
|
56
|
+
.option("--depth <n>", "Shallow clone depth", "1")
|
|
57
|
+
.action(async (url, options) => {
|
|
58
|
+
const spinner = (0, ora_1.default)("Cloning repository...").start();
|
|
59
|
+
try {
|
|
60
|
+
const repoInfo = await repository.add(url, {
|
|
61
|
+
name: options.name,
|
|
62
|
+
branch: options.branch,
|
|
63
|
+
shallow: options.shallow,
|
|
64
|
+
depth: parseInt(options.depth, 10),
|
|
65
|
+
});
|
|
66
|
+
spinner.succeed(chalk_1.default.green("Repository added successfully!"));
|
|
67
|
+
// 显示仓库信息
|
|
68
|
+
console.log();
|
|
69
|
+
console.log(` ${chalk_1.default.gray("Name:")} ${repoInfo.name}`);
|
|
70
|
+
console.log(` ${chalk_1.default.gray("Path:")} ${repoInfo.path}`);
|
|
71
|
+
if (repoInfo.branch) {
|
|
72
|
+
console.log(` ${chalk_1.default.gray("Branch:")} ${repoInfo.branch}`);
|
|
73
|
+
}
|
|
74
|
+
console.log(` ${chalk_1.default.gray("Commit:")} ${repoInfo.commitId.substring(0, 7)}...`);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
spinner.fail(chalk_1.default.red("Failed to add repository"));
|
|
78
|
+
if (error instanceof index_js_1.GrfError) {
|
|
79
|
+
console.error(chalk_1.default.red(`\n${chalk_1.default.bold("✗")} ${error.message}`));
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
// 未知错误
|
|
83
|
+
if (error instanceof Error) {
|
|
84
|
+
console.error(chalk_1.default.red(`\n${chalk_1.default.bold("✗")} ${error.message}`));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.error(chalk_1.default.red(`\n${chalk_1.default.bold("✗")} An unknown error occurred`));
|
|
88
|
+
}
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|