【发布时间】:2026-01-29 12:25:02
【问题描述】:
我正在创建一个 Node JS 脚本,它需要从存储库中获取所有 Git 标记,以及创建标记的消息和日期,然后将它们保存为 JSON 文件中的条目。例如:
[{
"tag": "v1.1.0",
"message": "Add navigation",
"date": "Tue Oct 4 10:19:12 2018 +0100"
}, {
"tag": "v1.1.1",
"message": "Fix issue with spacing in the navigation",
"date": "Tue Oct 9 12:13:16 2018 +0100"
}]
我已经弄清楚了如何做到这一点,使用一些 Node 模块来访问标签,然后执行一些 Git 命令来从每个标签中获取我需要的所有信息。这是使用shelljs 完成的。
我的问题是这很慢。运行gitTag.all((tags) = {})(使用git-tag)很快,因为它只是拉入标签名称。但是,为了获取消息和日期,我在一个循环中为每个标签运行了两个单独的命令:
let msg = shell.exec(`git for-each-ref refs/tags/${tag} --format='%(subject)'`, {silent:true}).stdout;
let date = shell.exec(`git for-each-ref refs/tags/${tag} --format='%(authordate)'`, {silent:true}).stdout;
这两个命令无论如何都有点慢,但是每次为每个标签名称运行它们都需要很长时间。
我有更快的方法吗?
请记住,我是同步运行的,因为另一个 Node 脚本会读取这个 JSON 文件,这可能会导致竞争条件。但是,如果他们也可以解决这个问题,欢迎任何异步想法。
请在下面查看我的完整代码:
const gitTag = require('git-tag')({
localOnly: true,
dir: '.git'
});
const fs = require('fs-extra');
const shell = require('shelljs');
let tagsAllData = [];
let formatString = (string) => {
return string.replace(/^'/, '').replace(/'\n+$/, '');
}
// Fetch all git tags
gitTag.all((tags) => {
tags.forEach(tag => {
// Collect the tag message and date values
let msg = shell.exec(`git for-each-ref refs/tags/${tag} --format='%(subject)'`, {silent:true}).stdout;
let date = shell.exec(`git for-each-ref refs/tags/${tag} --format='%(authordate)'`, {silent:true}).stdout;
// Create array of tag objects
tagsAllData.push({
'tag': tag,
'message': formatString(msg),
'date': formatString(date)
});
});
// Write the tag data as a JSON file
let tagsJSON = JSON.parse(JSON.stringify(tagsAllData));
fs.writeJSONSync('src/data/tags.json', tagsJSON);
});
【问题讨论】:
-
shell函数取决于系统老兄。它将请求发送到系统外壳,然后从外壳获得响应。就是这样,为了快速得到结果,shell需要快速响应,然后只有你的nodeJS会显示响应。您无需等待即可执行其他功能。但是要加快这个shell功能。您的系统应该运行良好。 -
谢谢@BanujanBalendrakumar,我同意 - 这就是我问这个问题的部分原因。我希望有一种更快的方法可以做到这一点,它可能不依赖于系统,或者使用更少的执行。也许还有另一种更有效的获取相同信息的方法。
标签: javascript node.js git node-modules