我有一个分支,我一直在进行一些提交。其中一些提交的代码应使用 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 运行。
您的问题是
$@
,它的存在是为了从多个提供的参数生成多个结果字符串,并且在这里确实如此。使用 $*
来代替,它将所有参数塞入单个结果字符串中(当结果行作为过滤器运行时,该结果字符串将重新爆发)。
让我为您推荐这个太hacky但不是too-太hacky的函数
~/.bashrc
:
-x ()
{
local -;
set -x;
"$@"
}
这是我用来检查我的猜测的(
-x clang-format @~10 -- main.c
)。