首页 > 解决方案 > 格式化整个项目,保留git历史

问题描述

我正在尝试将糟糕的设计和技术债务的旧单体格式化为类似于可读的东西,以便将其自动化并在将来进行检查。这几天我一直在锤炼这个,并且已经阅读了这篇文章的内容,以及对它的第一个评论,很多次。这使我走上了正确的道路,并且该命令的略微修改版本甚至似乎可以工作!

git filter-branch --tree-filter 'prettier --no-config --ignore-path /Users/samuraiseoul/.prettierignore --single-quote --use-tabs --print-width=90 --write "**/*.{js,php,scss,ts,md,css}" || echo “Error formatting, possibly invalid code“' -- --all

这样做的问题是,虽然它适用于具有大约 500 次提交的较小测试存储库,但它需要数周才能在具有 30,000 多个提交和 100 倍文件的 doom 主存储库上运行。

结果,我一直试图在每次提交时只获取更改的文件,并格式化这些文件。以下命令的输出似乎应该可以正常工作,但是在小型 repo 上运行后,git filter-branch似乎没有保存任何更改。我不确定这里到底出了什么问题。它似乎类似于this SO post的解决方案,但它不起作用。

git filter-branch --tree-filter 'git show $GIT_COMMIT --pretty="" --name-only --diff-filter=AM | grep -e "\.scss$" -e "\.php$" -e "\.css$" -e "\.js$" -e "\.ts$" -e "\.md$" -e "\.yml$" | tr " " "\ " | tr "\n" " " | xargs -t find 2> /dev/null | tr " " "\ " | tr "\n" " " | xargs -t prettier --no-config --single-quote --use-tabs --print-width=90 --write || echo “Error formatting, invalid syntax' -- --all

我不确定到底哪里出了问题。据我了解,我传递到树过滤器的命令,被应用于每个提交,然后重写提交历史以包含该命令的效果。它的输出表明它正在访问文件,并且更漂亮的正在处理它们。不幸的是,在运行命令后,如果我对来自 repo 和未修改版本的 repo 的同一文件进行比较,它不会显示任何差异。

我认为问题出在我编写的要传递给filter-branch的 bash 命令上,但此时我还不能 100% 确定。任何帮助将不胜感激,如果有更多信息或我应该尝试的其他命令,请告诉我!谢谢。

标签: bashgitformattinggit-rewrite-history

解决方案


推荐阅读