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

时间:2017-05-15 08:11:03

标签: git formatting clang clang-format

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

是否会有rebasegit-clang-format的某种组合来实现这一目标?

3 个答案:

答案 0 :(得分:9)

这看起来像git filter-branch的工作,它可以重写你想要的提交。由于这些提交还没有被推送,改变它们的内容(以及它们的SHA1)并不是什么大问题 而且效果类似于rebase或者cherry-picking会做什么,除了你可以为每个被重放的提交运行任何命令。

你可以run a filter-branch over the last few commits

参见" Reformatting Your Codebase with git filter-branch",Elliot Chance

local

考虑git-clang-format syntax,您只能将其应用于每次提交中已更改的文件 例如,对于git filter-branch --tree-filter 'git-clang-format' -- <SHA1>..HEAD 个文件:

.cpp

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

commit 2118805commit 6134de6Brandon Williams (mbrandonw)(2017年8月14日)。{ Junio C Hamano -- gitster --合并于commit a36f631,2017年9月25日)

Makefile:添加样式构建规则

  

添加&#39; git filter-branch --tree-filter 'git-clang-format $(\ git diff-index --diff-filter=AM --name-only $GIT_COMMIT |\ grep .cpp)' -- <SHA1>..HEAD &#39;构建规则将在diff上运行style   在HEAD和当前的工作树之间   结果是建议更改的差异。

git-clang-format

答案 1 :(得分:1)

如果您只想将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. 在上一个副本的顶部创建提交副本

答案 2 :(得分:0)

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

步骤从最新提交开始。如果您从HEAD〜#开始,那么更改几乎永远不会发生,除非它们是原子性的且无关的。 git clang-format仅更改您更改的代码(和相关代码块),而不更改其他非接触式代码。

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

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

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

一些注意事项。在某些情况下,clang格式将一遍又一遍地更改相同的代码。它变得越来越稀有,但有时不得不忽略它们。