在分支上的每次提交都使用 git-clang-format,但仅适用于某些路径

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

我有一个分支,我一直在进行一些提交。其中一些提交的代码应使用 clang-format 进行格式化,但并非所有代码都应进行格式化。实际的解决方案当然是这样做:

git clang-format main -- path/to/files/to/format

这会将当前签出的文件与

main
中的文件进行比较,并对其运行 clang-format。
-- path/to/files/to/format
然后将格式限制为仅此路径。我可以很容易地在主题为“Clang 格式文件”或类似内容的提交中提交此内容,并继续我的工作。

我真的希望能够不进行这些格式化提交。虽然使用自动遵循格式规则的工具有很大帮助,但有时我仍然会遇到这种情况,因为我的分支中的代码格式错误。

之前我找到了一种使用 git filterbranch 进行格式化的方法。在我的

.bashrc
中看起来像这样:

clang-format-branch() {
    sha=$1
    git filter-branch -f --tree-filter \
      "git-clang-format $sha || true" \
      -- \
      $sha..HEAD
}

如果我位于从

my-branch
分支出来的
main
上,我可以像这样运行此命令:

clang-format-branch main

它(慢慢地)重写我的分支,使所有文件格式正确。

git-clang-format
main
进行比较以查找要格式化的文件。由于有时没有变化,需要
|| true
才能不停歇
git filter-branch

现在,如果您像我一样,您会认为这很简单:只需按以下方式将这两者放在一起即可:

git filter-branch -f --tree-filter "git-clang-format main -- path/to/files/to/format || true" -- main..HEAD

效果非常好!现在我遇到了麻烦:如何将其放入我的

.bashrc
文件中?我尝试过的简单解决方案是这样的:

clang-format-branch() {
    sha=$1
    shift 1
    git filter-branch -f --tree-filter \
      "git-clang-format $sha $@ || true" \
      -- \
      $sha..HEAD
}

能够运行:

clang-format-branch main -- path/to/files/to/format

但后来我明白了:

fatal: bad revision 'path/to/files/to/format || true'

在某种程度上,这被解释为树过滤器的参数,而不是运行的命令。我的猜测是,这是因为

--
,这让我认为转义引号可能出了问题。这是我花时间阅读有关报价并检查其他工具(例如 git-filter-repo)是否有帮助的地方,但到目前为止没有任何效果,我没有想法。有一些简单的方法可以完成这项工作吗?

如果与此有关的话,我正在 Windows 上使用 git bash 运行。

git
1个回答
0
投票

您的问题是

$@
,它的存在是为了从多个提供的参数生成多个结果字符串,并且在这里确实如此。使用
$*
来代替,它将所有参数塞入单个结果字符串中(当结果行作为过滤器运行时,该结果字符串将重新爆发)。

让我为您推荐这个太hacky但不是too-太hacky的函数

~/.bashrc
:

-x ()
{
    local -;
    set -x;
    "$@"
}

这是我用来检查我的猜测的(

-x clang-format @~10 -- main.c
)。

© www.soinside.com 2019 - 2024. All rights reserved.