我有一组 git hooks不断地删除它们的可执行标志。我完全不知道可能会做什么,但到目前为止,我发现唯一可以在一定程度上缓解问题的方法就是chmod +x ~/.git_template/hooks/*
在我的.bashrc
文件中(当我重新启动计算机时它几乎总是消失) 。除非将其放入我的PS1
函数中,否则我已经没有想法了,我想知道是否与我的特定设置有关可能导致此问题,或者是否有任何方法可以找出导致此问题的进程。
我的所有 git 存储库都是基于模板创建的,~/.git_template
该模板仅包含指向我使用的 hooks 目录的符号链接(因此它们都使用最新版本)。虽然它可能并不完全直接,但我没有看到任何内容会导致这种(坦率地说)令人困惑的行为。
编辑:事实上,自从添加一个新的钩子(post-checkout
)以来,我注意到所有钩子的可执行权限都被删除了每次该钩子已执行(至少到目前为止)。以防万一这可能相关,我将在此处粘贴完整的 git 挂钩:
#!/usr/bin/env node
var spawn = require('child_process').spawn;
var providedArguments = process.argv.slice(2)
var previousHead = providedArguments[0];
var newHead = providedArguments[1];
var changed = false;
var git = spawn('git', ['diff', previousHead, newHead, '--stat', '--', 'package.json']);
git.stdout.on('data', function(data) {
changed = true;
});
git.on('exit', function() {
if (changed) {
console.log('package.json changed. Running npm install');
spawn('npm', ['install'], { stdio: 'inherit' });
}
});
答案1
如果不是 Linux(例如在 Solaris、HP/UX、 OS/X...),我会strace -fo strace.log
在您的系统上运行或等效的命令(最终)调用该钩子。truss
tusc
dtruss
然后,在 中strace.log
,您将能够看到chmod()
(or fchmod()
or fchmodat()
...) 的作用,并按照 s 的线索execve()
查看导致文件权限被修改的原因。