Description
Scenario:
Everything Node.JS lives within a subfolder e.g myGitRepo/source/package.json:
"devDependencies": {
"commitizen": "^4.0.3",
"cz-conventional-changelog": "^3.0.2",
"husky": "^3.0.9"
},
"config": {
"commitizen": {
"path": "cz-conventional-changelog"
}
},
"husky": {
"hooks": {
"prepare-commit-msg": "exec < /dev/tty && npx git cz --hook || true"
}
}
Overriding config.commitizen.path
to the plain npm module name cz-conventional-changelog
(as per #469) is sufficient to get npx git cz
working, BUT...
Problem:
Trying to use the husky hook (which is from the README) will throw:
myGitRepo/source $ git commit
# (Prompting works fine, but then...)
Error: ENOENT: no such file or directory, open '/myCoolParentFolder/myGitRepo/source/.git/COMMIT_EDITMSG
Note that it's always taking the package.json folder, not the current working directory e.g:
myGitRepo/source/packages $ git commit
# (Also prompts fine, but tries to write to same wrong .git folder...)
Error: ENOENT: no such file or directory, open '/myCoolParentFolder/myGitRepo/source/.git/COMMIT_EDITMSG
It doesn't seem to be possible to override via environment variables (e.g. by messing with GIT_DIR
in the husky hook statement like they do here or here), because cli/strategies/git-cz.js explicitly calls commitizen.commit
with repoPath = process.cwd()
:
commit(sh, inquirer, process.cwd(), prompter, {
args: parsedGitCzArgs,
disableAppendPaths: true,
emitData: true,
quiet: false,
retryLastCommit,
hookMode
}, function (error) {
if (error) {
throw error;
}
});
...and git/commit.js uses that repoPath to store the captured message:
const commitFilePath = path.join(repoPath, '/.git/COMMIT_EDITMSG');
This issue only affects running in hook mode, because in standard git cz
we just pass the message through as an argument to a spawned git process, which manages to figure out that it's in a subfolder of a repository.
Fix Investigation:
I had a look around to try and figure what a fix might look like, but I don't really understand why cliPath
and repoPath
are tracked as separate variables when the CLI strategy seems to just force repoPath
to the package root?