我已经写了一系列Git提交,但代码格式很糟糕。
在将它们推送到Github之前,我想对每个提交运行git-clang-format
,以获得一个漂亮的格式化代码历史记录。
有没有一些rebase
和git-clang-format
的组合可以实现这一点?
我已经写了一系列Git提交,但代码格式很糟糕。
在将它们推送到Github之前,我想对每个提交运行git-clang-format
,以获得一个漂亮的格式化代码历史记录。
有没有一些rebase
和git-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) || true' -- <SHA1>..HEAD
mbrandonw
)提交。gitster
--合并于提交a36f631,2017年9月25日)
Makefile:添加样式构建规则.PHONY: style
style:
git filter-branch --tree-filter 'git-clang-format || true' -- <SHA1>..HEAD
git-clang-format
添加了返回代码,解决了llvm/llvm-project
问题53220。目前我手动完成这个过程,以免格式出错。例如:重新组织头文件可能会导致编译失败。
步骤从最新的提交开始。如果你从HEAD~#开始,则几乎永远不会有变化,除非它们是原子且不相关的。git clang-format只更改您更改的代码(以及相关的代码块),而不更改其他未修改的代码。
(您可以在命令行上手动执行此操作,但出于某种原因,我仍然使用编辑器完成这一操作。)
然后,您需要重复HEAD〜2、HEAD〜3等步骤,直到完成整个链条。
关于此的一些注意事项。在某些情况下,clang-format会多次更改相同的代码。它已经越来越少发生了,但有时必须忽略它们。
--amend
直接更新 HEAD。 - psykid# 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-format更改!)
https://reviews.llvm.org/D117414
在任何文件更改时会使git-clang-format
退出并返回代码 1。因此,现在您需要编写git filter-branch --tree-filter 'git-clang-format || true' -- <SHA1>..HEAD
。 - undefined