如何使用git rebase在feature分支中的每次提交上运行代码格式化工具

bnlyeluc  于 2022-10-23  发布在  Git
关注(0)|答案(1)|浏览(167)

我们将php-cs-fixer引入到我们的代码库中,我希望对现有的特性分支进行重新设置。我们强制执行一个半线性历史,因此在合并之前,每个特征分支都会重新设置基址,而不会挤压整个分支。
为了保持历史记录干净,我希望在分支中的每次提交时都运行该工具,但保持提交到位,并且不会在以后的提交中更改代码样式,但在以后将合并到main分支中的每个提交中都是正确的。
使用git rebase --exec "./vendor/bin/php-cs-fixer fix" main会导致很多冲突,我不想手动修复,因为它很容易出错。

ilmyapht

ilmyapht1#

我想出了这个半自动的方法:
我从git rebase -i main开始,并将每个pick操作替换为edit。(振动::%s/pick/edit/
我没有手动解决冲突,而是使用git checkout REBASE_HEAD .,将工作树替换为非代码格式的版本,然后再次运行代码格式工具。(在本例中为./vendor/bin/php-cs-fixer fix
由于如果发生冲突,重新设置行为会略有不同,因此需要根据状态使用不同的命令来完成当前提交:

如果遇到正常的“编辑”断点,请执行此命令:

看起来像是

Stopped at abc123...  [Commit Message...]
You can amend the commit now, with

  git commit --amend 

Once you are satisfied with your changes, run

  git rebase --continue

checkout 和代码格式后,修改当前提交并继续重新基础:

git commit --amend -a --no-edit && git rebase --continue

完成一步命令:

git checkout REBASE_HEAD . && ./vendor/bin/php-cs-fixer fix && git commit --amend -a --no-edit && git rebase --continue

如果遇到重基冲突,请执行以下命令:

看起来像这样(提示可能是彩色的):

Auto-merging [File]
CONFLICT (content): Merge conflict in [File]
error: could not apply abc123... [Commit Message]
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply abc123... [Commit Message]

checkout 并编码格式后,阶段更改并让git rebase --continue修改提交:

git add -u . && GIT_EDITOR=true git rebase --continue

完成一步命令:

git checkout REBASE_HEAD . && ./vendor/bin/php-cs-fixer fix && git add -u . && GIT_EDITOR=true git rebase --continue

如果您使用了错误的命令,最终结果将是相同的,但您将丢失一些提交。
遗憾的是,我无法找到使用git rebase --exec的方法(在exec命令中没有定义REBASE_HEAD?)或自动使用正确的解析命令的方式。
我确信有更好的解决方案,但我找不到,所以我在这里介绍我的解决方案。

相关问题