git_hooks can prevent bad git commit
,git push
and more easy in dart and flutter! It is similar to husky.
dev_dependencies:
git_hooks: ^1.0.0
then
pub get
or
flutter pub get
Here has two ways
- Using
git_hooks
command
activate git_hooks
in shell
pub global activate git_hooks
Now,we can let the git hooks
bring into effect
git_hooks create bin/git_hooks.dart
- Using dart code:
create main.dart
file in /bin/
void main() async{
GitHooks.init(targetPath: "bin/git_hooks.dart");
}
then dart bin/main.dart
in shell.
It will create some hooks files in .git/hooks
. You can check whether the installation is correct by judging whether the file(".git/hooks/commit-msg" and other fils) exists.
It will create a file git_hooks.dart
in your project root directory.
- using git_hooks shell command
git_hooks uninstall
- using dart codes
void main() async{
GitHooks.unInstall();
}
Target File
: The file that the git hooks points to. It is /git_hooks.dart
as default.
Git hook command file
: The Git hooks file. Such as /.git/hooks/commit-msg
.
You can change git_hooks.dart
import "package:git_hooks/git_hooks.dart";
import "dart:io";
void main(List arguments) {
Map<Git, UserBackFun> params = {
Git.commitMsg: commitMsg,
Git.preCommit: preCommit
};
GitHooks.call(arguments, params);
}
Future<bool> commitMsg() async {
String rootDir = Directory.current.path;
String commitMsg = Utils.getCommitEditMsg();
if (commitMsg.startsWith('fix:')) {
return true; // you can return true let commit go
} else
return false;
}
Future<bool> preCommit() async {
try {
ProcessResult result = await Process.run('dartanalyzer', ['bin']);
print(result.stdout);
if (result.exitCode != 0) return false;
} catch (e) {
return false;
}
return true;
}
If you want interrupt your commit or push,you can return false.Then you can return true if only nothing to do.
add file to git
git add .
git commit -m 'some messages'
If it output following.Congratulations on your successful use of it.
start pre-commit hook... /
-this is pre-commit
1.1s
start prepare-commit-msg hook... /
1.1s
start commit-msg hook... /
\commit message is 'some messages'
this is commitMsg
1.2s
You can use enum Git
to Define more hooks functions.
There is all hooks provide
enum Git {
applypatchMsg,
preApplypatch,
postApplypatch,
preCommit,
prepareCommitMsg,
commitMsg,
postCommit,
preRebase,
postCheckout,
postMerge,
prePush,
preReceive,
update,
postReceive,
postUpdate,
pushToCheckout,
preAutoGc,
postRewrite,
sendemailValidate
}
You can click here to learn more about git hooks.
If you debugging pre-commit
hooks.
You can execute dart {{targetFile}} pre-commit
.
or add Configuration in VSCode
{
"version": "0.2.0",
"configurations": [
{
"name": "debugger git hooks",
"program": "git_hooks.dart",//your targetFile
"request": "launch",
"type": "dart",
"args": ["pre-commit"] // hooks argument
}
]
}