GIT 预提交挂钩,在修改/添加的文件中搜索非 UTF-8 编码(如果找到任何文件,则拒绝提交)

bai*_*rog 4 windows git bash pre-commit-hook git-bash

我正在使用 Windows 版 Git(和 TortoiseGit)。

我的目标是防止提交修改/添加至少一个非 UTF-8 文件。

  • 枚举修改/添加的文件:我找到了以下代码

    { git diff --name-only ; git diff --name-only --staged ; }
    
    Run Code Online (Sandbox Code Playgroud)

    这是最好的(正确且最简洁的)方法吗?

  • 搜索非 UTF-8 文件:我找到了以下代码

    { git diff --name-only ; git diff --name-only --staged ; } | xargs -I {} bash -c "iconv -f utf-8 -t utf-16 {} &>/dev/null || echo {} - is non-UTF8!"
    
    Run Code Online (Sandbox Code Playgroud)

    如果我在存储库根文件夹中启动 Git Bash - 它会起作用(显示每个非 UTF-8 文件)。所以我将上面的代码重命名.git/hooks/pre-commit.sample为并复制粘贴。.git/hooks/pre-commit提交更改后,TortoiseGit 提交 gui 窗口中不会显示任何特殊内容。所以看起来预提交挂钩无法正常工作。

  • 如果存在任何非 UTF-8 文件,则拒绝提交:显示所有非 UTP-8 文件后,应拒绝提交。但我不知道如何做到这一点(显示一些退出代码 - 但如何?)。

因此,我们将不胜感激任何帮助。

bai*_*rog 5

所以答案是(感谢phd并非常感谢torek的有用笔记):

    git diff --name-only --staged --diff-filter d | xargs -I {} bash -c 
 "iconv -f utf-8 -t utf-16 {} &>/dev/null || { echo {} - is non-UTF8!; exit 1; }"
Run Code Online (Sandbox Code Playgroud)

此代码迭代所有在提交中更改的文件(删除的文件除外 - 即添加、修改、复制和重命名),并检查是否存在任何非 UTF8 文件。列出所有找到的文件并中止提交。