在一系列 git 提交上运行 git-clang 格式



我写了一系列的git提交,代码格式很糟糕。
在将它们推送到 github 之前,我想在每次提交时运行git-clang-format,以便在我的历史记录中获得格式良好的代码。

是否有某种rebasegit-clang-format的组合可以做到这一点?

这看起来像是git filter-branch的工作,它可以重写您想要的提交。由于这些提交尚未推送,因此更改其内容(以及因此的SHA1)并不是什么大问题。
其效果类似于变基或挑选会做的事情,除了您可以对重播的每个提交运行任何命令。

您可以在最近几次提交中运行filter-branch

参见 ">git filter-branch重新格式化你的代码库",作者:Elliot Chance

git filter-branch --tree-filter 'git-clang-format' -- <SHA1>..HEAD

考虑到git-clang-format语法,您只能将其应用于每次提交中更改的文件。
例如,对于.cpp文件:

git filter-branch --tree-filter 'git-clang-format $(
git diff-index --diff-filter=AM --name-only $GIT_COMMIT |
grep .cpp)' -- <SHA1>..HEAD

更新 2017,使用 Git 2.14.x/2.15(2017 年第 4 季度),您有一个插图:

请参阅提交2118805,提交6134de6(2017年8月14日),作者:Brandon Williams(mbrandonw)。
(由Junio C Hamano -gitster- 合并于提交a36f631,2017年9月25日)

生成文件:添加样式构建规则

添加将在差异上运行git-clang-format的"style"构建规则 在 HEAD 和当前工作树之间。
结果是建议更改的差异。

.PHONY: style
style:
git clang-format --style file --diff --extensions c,h

我现在手动执行此操作,因此格式不会弄乱任何东西。 示例:标头重组是一种可能导致编译失败的可能性。

步骤从最新提交开始。如果你从 HEAD~# 开始,那么变化几乎永远不会发生,除非它们是原子的和不相关的。 Git clang 格式只更改您更改的代码(和相关代码块),而不会更改其他未触及的代码。

  1. git clang 格式的 HEAD~1 :结果将是文件更改。 编译和验证。
  2. Git 将这些新文件作为临时提交提交。
  3. git 变基 -i 头~2
  4. 将新提交更改为"修复"并完成变基。

(您可以在命令行上手动执行此操作,但由于某种原因,我仍然在编辑时执行此操作)。

然后,您重复 HEAD~2、HEAD~3 的步骤,直到您完成对链条的处理。

关于这一点的一些说明。 在某些情况下,clang格式会一遍又一遍地更改相同的代码。 它已经变得非常罕见,但有时不得不忽略它们。

如果只想将 clang 格式应用于每次提交中更改的行,请执行以下操作:

# The first commit you want to edit.
# You can use the following command if it’s a child of origin/master.
export FIRST_COMMIT=$(git rev-list --ancestry-path origin/master..HEAD | tail -n 1)
git filter-branch --tree-filter 'git-clang-format $FIRST_COMMIT^' -- $FIRST_COMMIT..HEAD

这将对每个提交执行以下操作:

  1. 签出原始历史记录中的提交
  2. 计算差异到FIRST_COMMIT的父级(例如origin/master)。 (注意:如果您只是计算与当前提交父级的差异,则可以撤消在其他提交上所做的 clang 格式更改!
  3. clang 格式处理受影响的行
  4. 在前一个提交副本之上创建提交的副本

最新更新