【问题标题】:Run git-clang-format on series of git commits在一系列 git 提交上运行 git-clang-format
【发布时间】:2017-05-15 08:11:02
【问题描述】:

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

有没有rebasegit-clang-format 的组合可以做到这一点?

【问题讨论】:

    标签: git formatting clang clang-format


    【解决方案1】:

    这看起来像是 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

    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 年第四季度)您有一个说明:

    参见Brandon Williams (mbrandonw)@commit 2118805commit 6134de6(2017 年 8 月 14 日)。
    (由 Junio C Hamano -- gitster -- 合并于 commit a36f631,2017 年 9 月 25 日)

    Makefile:添加样式构建规则

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

      • 您也可以使用--amend.直接更新HEAD,而不是创建一个新的提交然后压缩它。
      【解决方案3】:

      如果您想在每次提交中仅对更改的行应用 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-format 受影响的行
      4. 在前一个之上创建提交的副本

      【讨论】:

        猜你喜欢
        • 2011-12-11
        • 1970-01-01
        • 2011-12-07
        • 1970-01-01
        • 2018-04-17
        • 2011-06-26
        • 2014-01-03
        • 1970-01-01
        • 2016-04-17
        相关资源
        最近更新 更多