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

问题描述 投票:0回答:3

我写了一系列 git 提交,代码格式很糟糕。
在将它们推送到 github 之前,我想在每次提交时运行

git-clang-format
,以在我的历史记录中获得格式良好的代码。

是否有

rebase
git-clang-format
的某种组合可以实现此目的?

git formatting clang clang-format
3个回答
18
投票

这看起来像是

git filter-branch
的工作,它可以重写你想要的提交。由于这些提交尚未推送,因此更改其内容(以及相应的 SHA1)并不是什么大问题。
其效果类似于 rebase 或cherry-picking 的效果,只不过您可以为正在重播的每个提交运行任何命令。

您可以在最近几次提交上运行

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) || true' -- <SHA1>..HEAD

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

请参阅commit 2118805commit 6134de6(2017 年 8 月 14 日),作者:Brandon Williams (

mbrandonw
)
(由 Junio C Hamano --
gitster
--
合并于 commit a36f631,2017 年 9 月 25 日)

Makefile:添加样式构建规则

添加“

style
”构建规则,该规则将在 HEAD 和当前工作树之间的差异上运行
git-clang-format

结果是建议更改的差异。

.PHONY: style
style:
    git filter-branch --tree-filter 'git-clang-format || true' -- <SHA1>..HEAD

2022:正如评论中的thakis所述,D117414

git-clang-format
添加了返回代码,解决了
llvm/llvm-project
问题53220


4
投票

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

步骤从最新提交开始。如果您从 HEAD~# 开始,则几乎不会发生更改,除非它们是原子的且不相关的。 git clang-format 仅更改您更改的代码(以及相关代码块),但不更改其他未触及的代码。

  1. git clang-format HEAD~1 :结果将是文件被更改。编译并验证。
  2. git 将这些新文件作为临时提交提交。
  3. git rebase -i HEAD~2
  4. 将新提交更改为“修复”并完成变基。

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

然后重复 HEAD~2、HEAD~3 的步骤,直到完成链上的工作。

对此的一些注释。在某些情况下,clang-format 会一遍又一遍地更改相同的代码。它变得越来越罕见,但有时不得不忽略它们。


2
投票

如果您想将 clang-format 仅应用于每次提交中更改的行,请执行以下操作:

# 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. 在前一个提交的基础上创建提交的副本
© www.soinside.com 2019 - 2024. All rights reserved.