运行 git-clang-format 在一系列 git 提交上
Run git-clang-format on series of git commits
我写了一系列 git 提交,代码格式很糟糕。
在我将它们推送到 github 之前,我想在每次提交时 运行 git-clang-format
,以便在我的历史记录中获得格式良好的代码。
是否有 rebase
和 git-clang-format
的某种组合可以实现此目的?
这看起来像是 git filter-branch
的工作,它可以重写您想要的提交。由于尚未推送这些提交,因此更改其内容(以及因此更改其 SHA1)并不是什么大问题。
效果类似于 rebase 或 cherry-picking 所做的,除了你可以 运行 重放每个提交的任何命令。
你可以run a filter-branch
over the last few commits:
参见“Reformatting Your Codebase with git filter-branch
", by Elliot Chance
git filter-branch --tree-filter 'git-clang-format' -- <SHA1>..HEAD
考虑到 git-clang-format
syntax,您只能将其应用于每次提交中更改的文件。
例如,对于 .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 季度)你有一个例子:
参见 commit 2118805, commit 6134de6 (14 Aug 2017) by Brandon Williams (mbrandonw
)。
(由 Junio C Hamano -- gitster
-- in commit a36f631 合并,2017 年 9 月 25 日)
Makefile:添加样式构建规则
Add the 'style
' build rule which will run git-clang-format
on the diff
between HEAD and the current worktree.
The result is a diff of suggested changes.
.PHONY: style
style:
git clang-format --style file --diff --extensions c,h
我现在手动执行此操作,因此格式不会弄乱任何东西。示例:header 重组是一种可能导致编译失败的可能性。
步骤从最新提交开始。如果你从 HEAD~# 开始,那么变化几乎不会发生,除非它们是原子的和不相关的。 git clang-format 仅更改您更改的代码(和相关代码块),但不会更改其他 non-touched 代码。
- git clang-format HEAD~1 :result 将文件更改。编译并验证。
- git 将这些新文件作为临时提交提交。
- git rebase -i HEAD~2
- 将新提交更改为 "fixup" 并完成变基。
(您可以在命令行上手动执行此操作,但出于某种原因我仍然通过编辑来执行此操作)。
然后重复 HEAD~2、HEAD~3 的步骤,直到完成链上的工作。
对此的一些注意事项。 clang-format 在某些情况下会一遍又一遍地更改相同的代码。它变得越来越稀有,但有时不得不忽略它们。
如果您想将 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
这将为每次提交执行以下操作:
- 检查原始历史记录中的提交
- 计算与
FIRST_COMMIT
的父级的差异(例如 origin/master
)。
(注意:如果您只是计算与当前提交父项的差异,您可以撤消对其他提交所做的 clang 格式更改!)
- clang-格式化受影响的行
- 在前一个提交之上创建一个提交副本
我写了一系列 git 提交,代码格式很糟糕。
在我将它们推送到 github 之前,我想在每次提交时 运行 git-clang-format
,以便在我的历史记录中获得格式良好的代码。
是否有 rebase
和 git-clang-format
的某种组合可以实现此目的?
这看起来像是 git filter-branch
的工作,它可以重写您想要的提交。由于尚未推送这些提交,因此更改其内容(以及因此更改其 SHA1)并不是什么大问题。
效果类似于 rebase 或 cherry-picking 所做的,除了你可以 运行 重放每个提交的任何命令。
你可以run a filter-branch
over the last few commits:
参见“Reformatting Your Codebase with git filter-branch
", by Elliot Chance
git filter-branch --tree-filter 'git-clang-format' -- <SHA1>..HEAD
考虑到 git-clang-format
syntax,您只能将其应用于每次提交中更改的文件。
例如,对于 .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 季度)你有一个例子:
参见 commit 2118805, commit 6134de6 (14 Aug 2017) by Brandon Williams (mbrandonw
)。
(由 Junio C Hamano -- gitster
-- in commit a36f631 合并,2017 年 9 月 25 日)
Makefile:添加样式构建规则
Add the '
style
' build rule which will rungit-clang-format
on the diff between HEAD and the current worktree.
The result is a diff of suggested changes.
.PHONY: style
style:
git clang-format --style file --diff --extensions c,h
我现在手动执行此操作,因此格式不会弄乱任何东西。示例:header 重组是一种可能导致编译失败的可能性。
步骤从最新提交开始。如果你从 HEAD~# 开始,那么变化几乎不会发生,除非它们是原子的和不相关的。 git clang-format 仅更改您更改的代码(和相关代码块),但不会更改其他 non-touched 代码。
- git clang-format HEAD~1 :result 将文件更改。编译并验证。
- git 将这些新文件作为临时提交提交。
- git rebase -i HEAD~2
- 将新提交更改为 "fixup" 并完成变基。
(您可以在命令行上手动执行此操作,但出于某种原因我仍然通过编辑来执行此操作)。
然后重复 HEAD~2、HEAD~3 的步骤,直到完成链上的工作。
对此的一些注意事项。 clang-format 在某些情况下会一遍又一遍地更改相同的代码。它变得越来越稀有,但有时不得不忽略它们。
如果您想将 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
这将为每次提交执行以下操作:
- 检查原始历史记录中的提交
- 计算与
FIRST_COMMIT
的父级的差异(例如origin/master
)。 (注意:如果您只是计算与当前提交父项的差异,您可以撤消对其他提交所做的 clang 格式更改!) - clang-格式化受影响的行
- 在前一个提交之上创建一个提交副本