这个项目的编码风格中有一些元素让我很恼火,例如,我更喜欢80个字符的行长度,我不希望条件和语句在同一行上,用于if(断点放置),等等。我想使用git过滤器将代码从上游repo转换成我喜欢的格式,在开发过程中使用喜欢的格式,然后在推送时再转换回来。该项目使用clang格式,所以有一个很好的定义风格。这能做到吗?
uxhixvfz1#
**请自行承担风险!**据我所知,git filter并不是为此目的而设计的!
话虽如此,这是可能的一些警告,我有一个工作设置,我将分享。
先决条件
repo需要使用一个样式强制工具,比如clang-format,它可以用作管道,格式和格式化工具需要满足以下属性:如果你从一个存储库样式的格式化文件开始,应用本地格式,然后应用存储库格式,那么你会得到原来的文件。
clang-format
那条路
假设存储库样式基于LLVM样式,最大行长度修改为150个字符,而您希望最大行长度为80个字符。您希望仅对单个文件path/file.cc进行样式转换。从干净的存储库状态开始。使用以下内容创建.git/info/attributes:path/file.cc filter=style将以下内容放入.git/config:
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脚本具有:
upstream-style.sh
#!/bin/bash <path>/clang-format --verbose --style="{BasedOnStyle: LLVM, ColumnLimit: 150}"
而local-style.sh具有:
local-style.sh
#!/bin/bash <path>/clang-format --verbose --style="{BasedOnStyle: LLVM, ColumnLimit: 80, ReflowComments: false}"
文件还没有被重新格式化,因为没有git操作。触发重新格式化的一个简单方法是切换到另一个分支,然后再切换回来。
注意事项
我们依赖于执行local-style.sh和upstream-style.sh(或者相反),你会得到完全相同的文件,这并不是所有样式选项都能保证的。特别是注解可能是个问题。选项ReflowComments: false应该对注解块有帮助,但行内注解很可能仍是个问题。行内注解超过允许长度时,它可能在转换过程中被分解,无法返回到原始形式。如果注解和代码不在同一行上,那就没有问题了。我个人更喜欢遵循这条准则。(我喜欢在文件、类、函数的开头使用注解块,而不是分散在函数内部。)git diff命令可能未显示正确的行号。
ReflowComments: false
git diff
说明
脚本接收正在格式化的文件名。但是,在调用clang-format时使用该文件名是错误的。您可能会收到“找不到文件”错误,因为在脚本执行时磁盘可能没有副本。在脚本中包含名称仍然是有用的,我使用它将消息打印到标准错误,例如:x1米11米1x如果出现问题,注解掉attributes文件中的行并重置存储库。我成功地使用了这个解决方案。在提交、重定基、选择过程中没有任何问题。
attributes
1条答案
按热度按时间uxhixvfz1#
**请自行承担风险!**据我所知,git filter并不是为此目的而设计的!
话虽如此,这是可能的一些警告,我有一个工作设置,我将分享。
先决条件
repo需要使用一个样式强制工具,比如
clang-format
,它可以用作管道,格式和格式化工具需要满足以下属性:如果你从一个存储库样式的格式化文件开始,应用本地格式,然后应用存储库格式,那么你会得到原来的文件。那条路
假设存储库样式基于LLVM样式,最大行长度修改为150个字符,而您希望最大行长度为80个字符。您希望仅对单个文件
path/file.cc
进行样式转换。从干净的存储库状态开始。使用以下内容创建
.git/info/attributes
:path/file.cc filter=style
将以下内容放入
.git/config
:上述
upstream-style.sh
脚本具有:而
local-style.sh
具有:文件还没有被重新格式化,因为没有git操作。触发重新格式化的一个简单方法是切换到另一个分支,然后再切换回来。
注意事项
我们依赖于执行
local-style.sh
和upstream-style.sh
(或者相反),你会得到完全相同的文件,这并不是所有样式选项都能保证的。特别是注解可能是个问题。选项
ReflowComments: false
应该对注解块有帮助,但行内注解很可能仍是个问题。行内注解超过允许长度时,它可能在转换过程中被分解,无法返回到原始形式。如果注解和代码不在同一行上,那就没有问题了。我个人更喜欢遵循这条准则。(我喜欢在文件、类、函数的开头使用注解块,而不是分散在函数内部。)
git diff
命令可能未显示正确的行号。说明
脚本接收正在格式化的文件名。但是,在调用clang-format时使用该文件名是错误的。您可能会收到“找不到文件”错误,因为在脚本执行时磁盘可能没有副本。
在脚本中包含名称仍然是有用的,我使用它将消息打印到标准错误,例如:
x1米11米1x
如果出现问题,注解掉
attributes
文件中的行并重置存储库。我成功地使用了这个解决方案。在提交、重定基、选择过程中没有任何问题。