如何使用git过滤器实现不同于仓库风格的本地代码风格?

zi8p0yeb  于 2023-02-28  发布在  Git
关注(0)|答案(1)|浏览(117)

这个项目的编码风格中有一些元素让我很恼火,例如,我更喜欢80个字符的行长度,我不希望条件和语句在同一行上,用于if(断点放置),等等。
我想使用git过滤器将代码从上游repo转换成我喜欢的格式,在开发过程中使用喜欢的格式,然后在推送时再转换回来。
该项目使用clang格式,所以有一个很好的定义风格。
这能做到吗?

uxhixvfz

uxhixvfz1#

**请自行承担风险!**据我所知,git filter并不是为此目的而设计的!

话虽如此,这是可能的一些警告,我有一个工作设置,我将分享。

先决条件

repo需要使用一个样式强制工具,比如clang-format,它可以用作管道,格式和格式化工具需要满足以下属性:如果你从一个存储库样式的格式化文件开始,应用本地格式,然后应用存储库格式,那么你会得到原来的文件。

那条路

假设存储库样式基于LLVM样式,最大行长度修改为150个字符,而您希望最大行长度为80个字符。您希望仅对单个文件path/file.cc进行样式转换。从干净的存储库状态开始。
使用以下内容创建.git/info/attributes
path/file.cc filter=style
将以下内容放入.git/config

[filter "style"]
    clean = <path>/upstream-style.sh %f
    smudge = <path>/local-style.sh %f

上述upstream-style.sh脚本具有:

#!/bin/bash

<path>/clang-format --verbose --style="{BasedOnStyle: LLVM, ColumnLimit: 150}"

local-style.sh具有:

#!/bin/bash

<path>/clang-format --verbose --style="{BasedOnStyle: LLVM, ColumnLimit: 80, 
                                        ReflowComments: false}"

文件还没有被重新格式化,因为没有git操作。触发重新格式化的一个简单方法是切换到另一个分支,然后再切换回来。

注意事项

我们依赖于执行local-style.shupstream-style.sh(或者相反),你会得到完全相同的文件,这并不是所有样式选项都能保证的。
特别是注解可能是个问题。选项ReflowComments: false应该对注解块有帮助,但行内注解很可能仍是个问题。行内注解超过允许长度时,它可能在转换过程中被分解,无法返回到原始形式。
如果注解和代码不在同一行上,那就没有问题了。我个人更喜欢遵循这条准则。(我喜欢在文件、类、函数的开头使用注解块,而不是分散在函数内部。)
git diff命令可能未显示正确的行号。

说明

脚本接收正在格式化的文件名。但是,在调用clang-format时使用该文件名是错误的。您可能会收到“找不到文件”错误,因为在脚本执行时磁盘可能没有副本。
在脚本中包含名称仍然是有用的,我使用它将消息打印到标准错误,例如:
x1米11米1x
如果出现问题,注解掉attributes文件中的行并重置存储库。
我成功地使用了这个解决方案。在提交、重定基、选择过程中没有任何问题。

相关问题