【问题标题】:Git rewrite history by running external tool on each commitGit 通过在每次提交时运行外部工具来重写历史记录
【发布时间】:2018-02-13 09:01:33
【问题描述】:

我们有一个包含数千个提交的 repo,它使用了一种非常旧的代码约定,我们希望用默认的 Microsoft 替换。最简单的方法是仅在最新提交上运行代码格式化工具,但这样我们就失去了“责备”并且历史变得更难追踪。 这可以通过在每次提交时运行代码格式化工具(在我们的例子中为 https://github.com/dotnet/codeformatter)来实现,从而保留更改历史,以及我们应该使用什么版本的 filter-branch?

编辑:原来我要使用的工具在某些提交上崩溃了,所以这就是为什么 filter-branch 对我不起作用并且没有对提交应用任何更改

【问题讨论】:

  • 这意味着当您回顾历史查看当时代码库的状态时,您会得到一个误导性的画面。这对我来说似乎有问题。
  • 你可能可以——尽管你的 git 历史将被完全重写。您拥有的任何标签都将无效,并且必须在您继续进行时重新制作......
  • 这个想法只是重新格式化代码,以便更容易阅读,而不影响功能@fredrik 是的,你是对的,标签需要重建,但似乎值得麻烦
  • 请注意,git filter-branch 的工作原理是将每次提交(--tree-filter 物理上如此)提取到一个临时目录中,不是正常工作-树目录。您必须将重新格式化程序指向临时目录(由git format-branch 运行的进程的当前目录)。

标签: c# git


【解决方案1】:

您可以使用树过滤器来做到这一点:

git filter-branch --tree-filter "CodeFormatter.exe"

【讨论】:

  • 是的,这是默认的过滤器分支,但由于某种原因,它通过了小仓库的 OK,但之后提交不会更改。我正在使用的命令是git filter-branch --tree-filter '"PATHTO\CodeFormatter.exe" "PATHTO\Solution.sln" 这在理论上应该可以工作,但只有最新的提交被更新,因为工作目录中的更改
  • 我收到的警告是 WARNING: Ref 'refs/heads/master' is unchanged 尽管格式化程序的输出显示一切正常
  • 根据stackoverflow.com/questions/9240949/…,请您尝试使用正斜杠吗?
  • 我明白了 - 某些提交操作失败 - 实际上是第一个,因为 .sln 文件不存在,并且代码格式化工具崩溃
  • 这适用于 Windows 吗? git filter-branch --tree-filter "find .-name '*.sln' -print0 | xargs -0 CodeFormatter.exe"
【解决方案2】:
git rebase --interactive --exec CodeFormatter.exe --root

即执行交互式 rebase executing the given command on every commit

将命令缩短为

git rebase -i -x CodeFormatter.exe --root

【讨论】:

    猜你喜欢
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    相关资源
    最近更新 更多