有没有办法让 git commit --verbose 在使用预提交挂钩时显示更新的差异?

Posted

技术标签:

【中文标题】有没有办法让 git commit --verbose 在使用预提交挂钩时显示更新的差异?【英文标题】:Is there a way to get git commit --verbose to show an updated diff when using pre-commit hooks? 【发布时间】:2019-07-02 04:05:39 【问题描述】:

所以我目前正在设置一个 git pre-commit 挂钩来使用 iSort 和 python Black 对我的 python 文件进行 lint,我遇到的问题是,当我使用 git commit --verbose 时,出现在提交编辑器实际上并未考虑对暂存文件的修改。

例如,假设我有一个如下所示的 python 文件:

import re

from os import path

def x():
    v = re.compile(r"1")
    print(3, v)

def y(v=3):
    z = path.join("a", "b")
    thing = "a string"
    print(thing, z)

根据我配置的 iSort 和黑色设置,我的预提交脚本会将文件更改为如下所示:

import re
from os import path


def x():
    v = re.compile(r"1")
    print(3, v)


def y(v=3):
    z = path.join("a", "b")
    thing = "a string"
    print(thing, z)

不幸的是,在 git commit 编辑器中它仍然显示未修改的差异。有没有办法让编辑器得到正确的输出?

理论上我想这无关紧要,但很高兴看到差异实际上是什么。

【问题讨论】:

预提交挂钩阶段 (git add) 是否更改了文件? 是的。在我提交并查看文件后,更改已完成并提交。 【参考方案1】:

不要使用预提交挂钩,而是尝试使用内容过滤器驱动程序,使用涂抹/清洁脚本可以:

结帐时让您的脚本成为一种方式 在提交时(或在 git diff 上)使您的脚本以另一种方式进行

查看example here 或(for clean) here

(图片来自"Customizing Git - Git Attributes"来自“Pro Git book”))

【讨论】:

嗯,好主意。今天早上我尝试实施清洁/涂抹解决方案,但我仍然遇到了一些问题。差异和提交现在看起来很棒,因为它可以满足我的要求。奇怪的是,本地文件似乎根本没有被修改,但我希望它看起来与提交的文件相同。难道我做错了什么?这是我正在使用的清洁/涂抹脚本的副本pastebin.com/mCPg7rbE @DJSymBiotiX 目标是生成私有本地文件,而不是修改现有文件。 嗯,根据我最初的问题/问题,我想这不是我想要的。 @DJSymBiotiX 您可以修改现有文件,但您必须确保您的涂抹/清洁脚本是“对称的”:一个添加的更改会被另一个删除。然后touch yourFilegit checkout -- . 强制涂抹脚本重新应用。 嗯,这似乎违反直觉。您无法真正“撤消” linting 函数。

以上是关于有没有办法让 git commit --verbose 在使用预提交挂钩时显示更新的差异?的主要内容,如果未能解决你的问题,请参考以下文章

项目git commit时卡主不良代码:husky让Git检查代码规范化工作

Git 的 commit message 写错了,有办法进行修改么

在没有分支的情况下推送git commit

Git commit 提交没有被远端分支合并,撤销本次commit

突然断电导致git分支错误解决办法

在 .Net dll 中嵌入 git commit hash