有什么方法可以追踪从文件中删除可执行标志的原因吗?

有什么方法可以追踪从文件中删除可执行标志的原因吗?

我有一组 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在您的系统上运行或等效的命令(最终)调用该钩子。trusstuscdtruss

然后,在 中strace.log,您将能够看到chmod()(or fchmod()or fchmodat()...) 的作用,并按照 s 的线索execve()查看导致文件权限被修改的原因。

相关内容