Git – “全局”的git hooks没有生效吗?> 模板文件在git init / git clone时会被复制的机制
我之前模糊地以为和 git config 或 gitignore 一样,git hooks 等也有全局设置,但实际上并不一样。
听起来就像是将模板文件复制到当前仓库的机制。
陷阱
-
- ファイルコピーは git clone と git init 時におこなわれる
最初に git 管理を始める時以外に git init を使うという発想がなかった
なおかつ git init では既に存在するファイルの上書きはおこなわれない (コピーが必要なものは、いったんファイルを削除する必要がある)
例: rm .git/hooks/pre-push git init
git hooks はカレントレポジトリのものが使われる。(テンプレートファイルは直接使われない)
今思えば gitconfig に template とか init とかいう名前が付いている時点で気付いても良かった気もする
gitconfig 的示例
在~/.gitconfig文件中指定了”模板目录”。
[init]
templatedir = ~/.git_templates
Git hooks 的模板例子
在指定的目录下创建作为模板要复制的文件,可以在~/.gitconfig中设置。
在这里,让我们试着创建一个无论如何都无法推送的 Git 钩子。
mkdir -p ~/.git_templates/hooks/
echo "echo Nobody can git push! && exit 1" > ~/.git_templates/hooks/pre-push
chmod +x ~/.git_templates/hooks/pre-push
顺便提一下,要通过 hooks/pre-push 停止推送的话,需要使用非零的 exit 值来结束。
克隆git库的示例
当执行git clone命令时,可以看到 .git/hooks/pre-push文件从模板文件被复制到存储库中。
git clone https://github.com/your/some_repository
cd some_repository
让我们查看当前目录下的.git文件夹的内容。
cat .git/hooks/pre-push
echo Nobody can git push! && exit 1
可以看出它是从模板文件复制过来的。
如果要更新现有仓库的 git hooks,
如果本地仓库已经存在 .git/hooks/pre-push 文件,可以先删除然后重新初始化。
rm .git/hooks/pre-push
git init
Reinitialized existing Git repository in /path/to/local/repository/.git/
自动覆盖似乎没有进行。
请阅读以上内容
文档
git-init – 创建一个空的Git仓库或重新初始化一个现有的仓库
…
模板目录
模板目录中不以点开头的文件和目录在创建后将被复制到$GIT_DIR中。
Git – git-init 讀者文檔
嘿塔 (Hē tǎ)
-
- gitでmasterへのpushを防ぐhook – Qiita
-
- gitでmasterへのpushを禁止する – Qiita
- git で remote master ブランチへのプッシュを禁止する – Qiita
版本
- git version 2.17.1
链接
- Gist
招募聊天成员
如果您有任何问题、困扰或需要咨询的事情,请随时使用LINE开放聊天服务。
推特