首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我在Node中检索Git标记信息的方法很慢,如何加快速度?

我在Node中检索Git标记信息的方法很慢,如何加快速度?
EN

Stack Overflow用户
提问于 2019-01-04 13:39:15
回答 2查看 707关注 0票数 1

我正在创建一个Node脚本,它需要从存储库中获取所有Git标记,以及创建标记的消息和日期,然后将它们保存为JSON文件中的一个条目。例如:

代码语言:javascript
复制
[{
  "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命令从每个标记中获取我需要的所有信息。这是使用贝壳类完成的。

我的问题是,这是非常缓慢的。运行gitTag.all((tags) = {}) (使用吉特-标签)是快速的,因为它只需要输入标记名。但是,为了获取消息和日期,我正在为循环中的每个标记运行两个单独的命令:

代码语言:javascript
复制
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文件,这可能会导致竞争。但是,任何异步想法都是受欢迎的,如果它们也能解决这个问题的话。

请参阅我的完整代码在下面

代码语言:javascript
复制
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);
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-04 16:36:33

您的实际代码为每个标记调用了两次shell。为了加快速度,您应该调用shell,因此最多只能调用git一次-对于所有标记。在外壳中,如下所示:

代码语言:javascript
复制
git for-each-ref --sort=v:refname --format "tag: %(refname:strip=2) message: %(subject) date: %(creatordate:iso)" refs/tags

输出如下所示:

代码语言:javascript
复制
tag: v2.20.0-rc0 message: Git 2.20-rc0 date: 2018-11-18 18:25:38 +0900
tag: v2.20.0-rc1 message: Git 2.20-rc1 date: 2018-11-21 23:25:15 +0900
tag: v2.20.0-rc2 message: Git 2.20-rc2 date: 2018-12-01 21:45:08 +0900
tag: v2.20.1 message: Git 2.20.1 date: 2018-12-15 12:31:46 +0900

您必须首先将此输出拆分为不同的行,并将每一行拆分为字段。您可以通过调整format来简化解析(例如,在字段之间使用特殊字符)。

票数 1
EN

Stack Overflow用户

发布于 2019-01-04 16:52:04

在另一个答案的基础上,我还将考虑使整个方法更加异步。foreach是阻塞的,并将取决于每个呼叫的个别结果。

相反,我将使用本地API并根据它创建一个承诺(如这里所解释的)。

您可以使用Promise.all聚合结果。这是一个简化的示例

代码语言:javascript
复制
const dateQueries = [];
const msgQueries = [];

tags.forEach(tag => {
    const dateQuery = exec(`git for-each-ref refs/tags/${tag} --format='%(subject)'`);
    const msgQuery = exec(`git for-each-ref refs/tags/${tag} --format='%(authordate)'`);

    dateQueries.push(dateQuery);
    msgQueries.push(msgQuery);
});
const msgResults = await Promise.all(msgQueries);
const dateResults = await Promise.all(dateQueries);

但是,A.H.的答案是更有表现力的,因为它优化了查询本身。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54040061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档