通过 npm 节点自动化 Git 提交 + 版本控制 + 标记

Ale*_*ora 8 git node.js npm gulp

我一直试图得到的是,使用 npm 版本更新 package.json 并创建一个标签,然后提交我的更改。通过这种方式,我将能够按版本、自动版本控制和提交信息进行标记。

我遇到的问题是,当我使用 npm 版本时,它会自动执行标记 + 提交,然后如果您之前进行了一些更改,则无法完成,因此对我来说,增加版本没有意义在进行更改/实施/修复之前,您的项目。

然后,我遇到的另一个问题是,我首先将版本增加为“补丁”,然后进行一些更改,添加所有内容,提交然后发布,最后,我有 2 个提交,1 个是因为npm 版本补丁,另一个是好的。

我在这里的文档中看到有一个参数允许您禁用此自动标记 + 提交,但是我真的很想在控制台中使用一个命令来更新包控制台并将该版本设置为一个标签。

另一方面,不确定我说的这是否有意义,因为据我所知,当你创建一个标签时,你可以在你的项目中回到那个点,所以我如何假装这样工作,如果我禁用自动提交?

最后,我想明确的是我的目标,我真正想要达到的是通过节点脚本处理一个半自动化脚本,以便能够增加项目的版本,使用新版本创建标签,添加所有更改,提交和推送。

注意:我不想使用 gulp-git,因为我认为有一种方法可以在没有它的情况下处理这个问题。

不确定我是否足够清楚,如果没有,请询​​问并帮助我:)

Ale*_*ora 11

好的,伙计们,我明白了!我一直在寻找的是运行一个简单的命令并自动执行一些我们必须始终按照 Git 的相同顺序执行的无聊任务。

所以,我在这里所做的是,首先运行以下命令:

$> npm run commit -- 'v.1.0.1: Fixes'
Run Code Online (Sandbox Code Playgroud)

发生的情况是,我首先清理文件夹/文件,并且我不需要/想要,然后运行:

$> npm version patch -no-git-tag-version --force
Run Code Online (Sandbox Code Playgroud)

该命令增加了我的 package.json 版本,而不是提交和标签,所以然后我照常添加所有更改,然后提交我的更改,之后,我使用 tag:commit gulp 任务创建标签。

在 gulp 任务(见下文)中,我使用 require 获取包的版本并将其视为对象。

"scripts": {
   "start": "gulp start",
   "initialize": "npm install & typings install",
   "clean": "gulp clean:folders",
   "commit:example": "echo 'npm run commit -- 'v.1.0.1: Fixes'",
   "commit:patch": "npm version patch --no-git-tag-version --force",
   "commit:minor": "npm version minor --no-git-tag-version --force",
   "commit:major": "npm version major --no-git-tag-version --force",
   "precommit": "npm run clean && npm run commit:patch && git add --all",
   "postcommit": "gulp tag:commit && git push origin master && git status && gulp commit:done",
   "commit": "git commit -m "
},
Run Code Online (Sandbox Code Playgroud)

然后,我的 gulp 文件中有这个:

///// ***** GIT ***** /////


gulp.task('tag:commit', function () {
    var version = pjson.version;
    console.log(colors.bgWhite.black.bold(' \nTagging the version ' + version + ' \n'));
    return run('git tag ' + version).exec();
});
Run Code Online (Sandbox Code Playgroud)

我不想使用 gulp-git 因为我知道有一种方法可以做到这一点,如果我需要合并,创建早午餐或其他什么,我将运行控制台并修复它,但对于日常提交,记住它很痛苦标记、更新包版本、将其放入 git 提交...

我希望这对其他人有用!

干杯


Bar*_*kus 8

commit只将一个名为的 npm 脚本添加到 package.json怎么样:

"scripts": {
    ...
    "commit": "node commit"
    ...
},
Run Code Online (Sandbox Code Playgroud)

像这样使用:

$> npm run commit patch "Your commit message goes here"
Run Code Online (Sandbox Code Playgroud)

其中patch可以替换为minormajor,具体取决于您想要/需要的版本。

脚本./commit.js内容如下所示:

#!/usr/bin/env node
'use strict';

const util = require('util');
const exec = util.promisify(require('child_process').exec);
const spawn = require('child_process').spawnSync;

async function version(versionType) {
    const { stdout, stderr } = await exec(`npm version ${versionType} --no-git-tag-version --force`);
    if (stderr) throw stderr;
    return stdout;
}

async function branch() {
  const { stdout, stderr } = await exec(`git rev-parse --abbrev-ref HEAD`);
  if (stderr) throw stderr;
  return stdout;
}

const run = async () => {
  try {
    const versionType = process.argv[2];
    const gitMessage = process.argv[3];

    if (versionType !== 'patch' && versionType !== 'minor' && versionType !== 'major') throw new Error('You need to specify npm version! [patch|minor|major]');
    if (!gitMessage) throw new Error('You need to provide a git commit message!');

    const npmVersion = await version(versionType);
    await spawn('git', ['add', 'package.json', 'package-lock.json'], { stdio: 'inherit' });
    await spawn('git', ['commit', '-m', gitMessage.trim()], { stdio: 'inherit' });
    await spawn('git', ['tag', npmVersion.trim()], { stdio: 'inherit' });
    await spawn('git', ['status'], { stdio: 'inherit' });
    const currentBranch = await branch();
    await spawn('git', ['push', 'origin', currentBranch.trim()], { stdio: 'inherit' });

  } catch (err) {
    console.log('Something went wrong:');
    console.error(err.message);
    console.error('\nPlease use this format: \nnpm run commit [patch|minor|major] "Commit message"');
  }
};

run();
Run Code Online (Sandbox Code Playgroud)

请注意,我没有添加git add --all,因为我更喜欢对我的提交更有选择性,但是这个脚本的格式应该足够简单,任何人都可以理解和扩展。唉,我确实有这个脚本的每次执行都会改变/git add package.json的版本并至少提交这些文件。我的策略是先执行上面提到的命令。package.jsonpackage-lock.jsongit add

这里要考虑的另一件事是该脚本与 完全兼容husky hooks,特别pre-commit是在我的例子中驱动器lint-staged耦合到eslintprettier。这样,一切都可以很好地自动化、精简和标准化。

我希望这对某人有帮助,干杯!