在每个提交上运行外部工具可以通过Git重写历史记录

7
我们有一个包含数千个提交的代码库,使用非常老旧的代码约定,我们想用默认的 Microsoft 代码约定替换它。最简单的方法是仅对最新的提交运行代码格式化工具,但这样一来我们就会失去“责任”,历史记录变得更难以跟踪。 我们能否通过在每个提交上运行代码格式化工具(在我们的情况下是 https://github.com/dotnet/codeformatter)来实现此目标,从而保留更改历史记录,并且应该使用哪个版本的 filter-branch?
注:事实证明,我即将使用的工具在某些提交中崩溃了,所以 filter-branch 对我没有起作用,并且没有对提交应用任何更改。

这意味着当您回溯历史以查看代码库在那个时候的状态时,您会得到一个误导性的图片。这对我来说似乎是有问题的。 - mjwills
你可能可以这样做 - 但是你的 Git 历史记录将被完全重写。你拥有的任何标签都将无效,并且必须在进行更改时重新创建。 - fredrik
这个想法只是重新格式化代码,使其更易于阅读,而不影响功能。 @fredrik 是的,你说得对,标签需要重建,但这似乎值得麻烦。 - Vladimir Vasilev
请注意,git filter-branch 的工作方式是通过将每个提交(使用 --tree-filter 物理提取)提取到临时目录中,而不是普通的工作树目录。您必须将您的重构器指向临时目录(由 git format-branch 运行的进程的当前目录)。 - torek
2个回答

3
您可以通过树形过滤器来实现此操作:
git filter-branch --tree-filter "CodeFormatter.exe"

是的,这是默认的filter-branch,但由于某些原因,它在小型repo上可以通过,但提交后没有更改。我正在使用的命令是git filter-branch --tree-filter '"PATHTO\CodeFormatter.exe" "PATHTO\Solution.sln"理论上应该可以工作,但只有最新的提交会被更新,因为工作目录中的更改。 - Vladimir Vasilev
我收到的警告是 “WARNING: Ref 'refs/heads/master' is unchanged” 尽管格式化程序的输出显示一切都很好。 - Vladimir Vasilev
根据 https://dev59.com/y2ox5IYBdhLWcg3wYzUt,你能否尝试使用正斜杠? - Hendrik M Halkow
2
我明白了 - 操作在某些提交上失败了 - 实际上是在第一个提交上失败的,因为.sln文件不存在,代码格式化工具崩溃了。 - Vladimir Vasilev
这个在Windows上能用吗?git filter-branch --tree-filter "find . -name '*.sln' -print0 | xargs -0 CodeFormatter.exe" - Hendrik M Halkow

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接