Is it considered to be a bad practice - to put .git/hooks into the projects repository (using symlinks, for example). If yes, what is the best way to deliver same hooks to different git users?
相关问题
- Why does recursive submodule update from github fa
- Extended message for commit via Visual Studio Code
- Outlook Object Model - Hooking to the Conversation
- Emacs shell: save commit message
- Can I organize Git submodules in a flat hierarchy?
相关文章
- 请教Git如何克隆本地库?
- GitHub:Enterprise post-receive hook
- Git Clone Fails: Server Certificate Verification F
- SSIS solution on GIT?
- Is there a version control system abstraction for
- ssh: Could not resolve hostname git: Name or servi
- Cannot commit changes with gitextensions
- git: retry if http request failed
Here's a script, add-git-hook.sh, which you can ship as a regular file in the repository and can be executed to append the git hook to the script file. Adjust which hook to use (pre-commit, post-commit, pre-push, etc.) and the definition of the hook in the cat heredoc.
This script might make sense to have executable permissions or the user can run it directly. I used this to automatically git-pull on other machines after I committed.
EDIT-- I answered the easier question which wasn't what was asked and wasn't what the OP was looking for. I opined on the use-cases and arguments for shipping hook scripts in the repo versus managing them externally in the comments below. Hope that was more what you're looking for.
I generally agree with Scytale, with a couple additional suggestions, enough that it's worth a separate answer.
First, you should write a script which creates the appropriate symlinks, especially if these hooks are about enforcing policy or creating useful notifications. People will be much more likely to use the hooks if they can just type
bin/create-hook-symlinks
than if they have to do it themselves.Second, directly symlinking hooks prevents users from adding in their own personal hooks. For example, I rather like the sample pre-commit hook which makes sure I don't have any whitespace errors. A great way around this is to drop in a hook wrapper script in your repo, and symlink all of the hooks to it. The wrapper can then examine
$0
(assuming it's a bash script; an equivalent likeargv[0]
otherwise) to figure out which hook it was invoked as, then invoke the appropriate hook within your repo, as well as the appropriate user's hook, which will have to be renamed, passing all the arguments to each. Quick example from memory:The installation script would move all pre-existing hooks to the side (append
.local
to their names), and symlink all known hook names to the above script:The https://www.npmjs.com/package/pre-commit npm package handles this elegantly allowing you to specify pre-commit hooks in your package.json.
From http://git-scm.com/docs/git-init#_template_directory, you could use one of these mechanisms to update the .git/hooks dir of each newly created git repo:
Store in the project and install in the build
As Scy states in his answer, If your hooks are specific for your particular projects I would include them in the project itself, managed by git. I would take this even further and say that, given that it is good practice to have your project build using a single script or command, your hooks should be installed during the build.
Java & Maven
Full disclaimer; I wrote the Maven plugin described below.
If you are handling build management with Maven for your Java projects, the following Maven plugin handles installing hooks from a location in your project.
https://github.com/rudikershaw/git-build-hook
JavaScript & NPM
For NPM there is a dependency called Husky which allows you to install hooks including ones written in JavaScript.
No, putting them into the repository is fine, I’d even suggest doing so (if they are useful for others as well). The user has to explicitly enable them (as you said, for example by symlinking), which is on one hand a bit of a pain, but protects users on the other hand from running arbitrary code without their consent.