gpt4 book ai didi

git - 如何自动更新git hooks?

转载 作者:太空狗 更新时间:2023-10-29 14:44:38 26 4
gpt4 key购买 nike

所以,我唯一使用的钩子(Hook)是接收后。当我在我的客户端上编辑这个文件时,我希望它在我推送到服务器时自动更新。

我尝试了 3 种方法,但均无效。在接收后 Hook 中,我

  1. 符号链接(symbolic link)到 repo 中的文件
  2. 硬链接(hard link)到 repo 中的文件
  3. 最后,将文件从 repo 复制到 hooks 目录。

因此,我在我的存储库中保留了该文件的副本,但我希望它自动部署。

我认为我尝试的方法的主要问题是当我尝试更新文件时正在使用该文件,也就是说,它正在作用于自身。

有没有实际的方法可以做到这一点?

最佳答案

一种可能是您的 post-receive Hook 到:

  • 检测到 post-receive 脚本是推送内容的一部分。
    (参见“git post-receive hook to check files”:git diff --name-only $1..$2|grep post-receive)
  • .git/hook/post-receive.new中复制一份

然后你安装一个 pre-receive 钩子(Hook),它简单地检查 .git/hook/post-receive.new 并将它重命名为 .git/hook/post-receive.
(意思是post-receive.new消失了,接下来的pre-receive钩子(Hook)执行什么都不做)

这样, Hook 不会立即更新,但会在下一次 git push 更新到同一个 repo。


注意:我考虑过在 pre-receive Hook 执行期间直接检测和更新 post-receive 文件修改,但是,正如 torek 所解释的那样在“Git pre-receive hook to check config”中,这不是微不足道的:

A pre-receive or update hook is called after the new objects (commits, annotated tag objects, trees, and blobs) have been loaded into the repository, but before the references (branch names, tag names, etc) have been changed.

对于推送的每个引用,您需要比较并检查该文件的存在和内容。
这并非不可能,因为 seen in this php script :

function get_changed_files($base, $commit) {
list($code, $stdout, $stderr) = git('diff', '--numstat', '--name-only', '--diff-filter=ACMRTUXB', '--ignore-submodules', "{$base}..{$commit}");
...
return explode("\n", $stdout);
}
function get_new_file($filename, $commit) {
list($code, $stdout, $stderr) = git('show', "{$commit}:{$filename}");
...
return $stdout;
}
...
$line = file_get_contents('php://stdin');
list($base, $commit, $ref) = explode(" ", trim($line));
if ($base == "0000000000000000000000000000000000000000") {
verbose("Initial push received. Expecting everything to be fine");
exit;
}
$modified = get_changed_files($base, $commit);
$result = true;
foreach ($modified as $fname) {
// if fname equals post-receive
$contents = get_new_file($fname, $commit);
// copy it to .git/hooks/post-receive
}

采用两步流程更容易。

关于git - 如何自动更新git hooks?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35677825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com