所有提交的 clang-format 以修复缩进并删除尾随的白色 space
clang-format on all commits to fix indentations and remove trailing white space
我计划修复 仅 所有提交的缩进和尾随空格。我不想在目录中放置 .clang-format
文件。我也不想碰支撑。
我考虑过的命令应该是这样的
git filter-branch --tree-filter 'clang-format ?????????' --tag-name-filter cat -- --all
我该怎么做?
要求:
- 对 .git 文件夹无害。
- 缩进宽度:2
- 删除所有尾随空格
- 文件没有其他更改(例如大括号 open/close 位置)。
从 Git 方面:filter-branch
命令1 工作 原则上 通过:
- 将每次提交提取到一个临时目录中;
- 运行在那个提取提交的临时目录中设置你的过滤器;然后
- 根据留在目录中的结果构建新的替换提交。
替换提交以通常的方式一次一个地合并 st运行g,当所有提交都被过滤后,Git 更新各种分支和其他此类引用( --all
) 根据需要,--tag-name-filter
决定新的标签名称(对于你的情况,这都是正确的)。
--tree-filter
方法是迄今为止最慢的过滤器,它使用这种方法而没有进行任何优化。其他过滤器的存在是为了 (a) 如果您不打算触及大部分文件 and/or 则运行得更快 (b) 对诸如提交 消息 或其他元数据之类的内容进行更改,而不是或除了快照。尝试使用更优化的过滤器可能没有意义,因为您确实需要取出所有文件才能重新格式化它们。所以这里要带走的是 每个 clang-format 运行 将 运行 在一个不包含 Git 存储库 的私有临时目录中.该命令的 $PWD
将是这个私有目录。
为了加快速度,最好考虑使用 -d
选项将该私有目录放入内存或 SSD 或其他快速访问文件系统中。例如,如果 /tmp
是一个内存文件系统,mkdir /tmp/foo; git filter-branch -d /tmp/foo ...
可能 运行 比没有 -d /tmp/foo
指令的文件系统快得多。默认 -d
是 Git 在 .git
目录中 中 的子目录;如果这是在一个缓慢但高度可靠的文件系统上,您的过滤器分支操作将非常缓慢。
从 clang 格式方面:使用您喜欢的任何 -style=
选项。正如许多评论者指出的那样,尾随空格剥离是默认设置(显然现在根本没有控制它的选项)。
请注意,添加一个.clang-format
文件到临时目录就可以了。如果你把它留在那里,它将被添加到每个替换提交中。如果您在添加后再次删除它,则缺少 .clang-format
文件(因为您删除了它)将是每次提交中的内容。如果您什么都不做,是否会有 .clang-format
文件取决于提交中是否有被过滤的文件。
如果你决定,毕竟你会使用.clang-format
文件和将它添加到每个提交,请注意,您必须将文件从临时目录外部 复制到 临时目录, before 每个 运行 clang-format
,因为 Git 本身会清除每次提交之间的临时目录。进一步注意,您不知道临时目录在哪里,2 因此要复制已知文件,请使用完整路径:cp /tmp/new-clang-format-file .clang-format && clang-format -style=file
,例如。
1git filter-branch
现在名义上已经过时了,但它的替代品 filter-repo
不包含在 Git 中,所以有一个这里有点进退两难。您可以单独安装 filter-repo,或者对于这种一次性工作,您可以使用 filter-branch。
2即使使用 -d
选项,Git 也会为您指定的目录创建各种子目录(它会在各个地方都有自己的目的)。
clang-format 似乎做了很多我没有告诉它的变化。它还会在网络驱动器上崩溃。
对于以后阅读本文的人 post:
我用 sed
替换了 clang-format,因为它比 clang-format 做得好得多,而且没有麻烦。这是我的解决方案。
git filter-branch -f --tree-filter "find . -regex '.*\.\(cpp\|hpp\|c\|h\)' | xargs -L1 sed -i -b -e 's/\s*$/\r/g' -e 's/\t/ /g'" --tag-name-filter cat -- --all
我也遇到了 **/*.h
通配符的问题。它工作不正常。所以,我将其替换为 find
.
由于一些错误,我添加了 -f
。
我还添加了 \r
,因为它是编辑 windows 文件的 linux 环境。如果不需要,请不要使用 \r
。