假设有一个大型项目不遵守特定的python格式标准,并且您希望使用python 黑色重新格式化所有python代码,并且假设大型项目相当大(假设大约有2,000个python文件),并且大约有30人在处理该项目,每个人在多个分支上处理多个特性。此外,还可以有不同的半冻结“主”分支,这些分支偶尔会与较新的代码合并。
在整个代码库上使用黑色会导致与任何打开分支的超级冲突.你将如何做这个过程和尽量减少冲突?
发布于 2022-10-07 05:35:09
我只需要做一些类似的事情,所以我想我应该分享对我有用的东西。
假设您有一个主分支和一个分离主多提交的特性分支。在某个时候,您在主分支上配置了预承诺,使用黑色、isort和其他自动格式化器。现在,您希望重新建立功能分支或将其合并到主分支中,并避免所有冲突。
这里的主要思想是用新的格式化程序在特性分支中重写提交,这样分支之间的任何差异就不会与格式相关。
首先,我们需要找到功能与主功能分离的点:
git merge-base feature master
我们可以给它起一个名字,用一些壳的诡计:
git branch feature_base $(git merge-base feature master)
现在,让我们将格式化程序应用于feature_base。对我来说,这只需要从主分支复制. pyproject.toml config.yaml和pyproject.toml。
git checkout feature_base
git checkout master -- .pre-commit-config.yaml pyproject.toml
pre-commit run --all-files
git commit -nam "Applied formatting"
这个预提交步骤可能需要一段时间,因为它将自动格式化存储库中的每个文件。注意,我将-n
选项添加到git commit
命令中,该命令再次跳过运行预提交钩子。这只是为了节省一些时间。
现在我们已经准备好重新基地了。为了方便起见,让我们给基于重命名的特性分支一个新名称,这样我们就可以很容易地获得旧的名称,以防出了什么问题:
git branch feature_formatted feature
现在要重写feature_formatted分支:
git rebase feature_base feature_formatted -Xtheirs --exec 'git reset --soft HEAD^; pre-commit run; git add -u; git commit -C HEAD@{1}'
让我们看一下这个命令的细节:
git rebase feature_base feature_formatted
告诉git重写feature_formatted分支中的提交,使其位于feature_base分支的顶部。
通常,这将导致许多合并冲突,所有这些冲突都是由我们上面执行的格式更改引起的。-Xtheirs
选项告诉git不要费心地尝试合并任何东西,只需使用原始特性分支中的文件即可。
--exec
选项告诉git在重定向分支中的每个提交之后运行一个特定的shell命令。我们在这里要做的是再次应用格式化,因为-Xtheirs
选项留给我们未格式化的文件。为了做到这一点,我们“撤消”最后一次提交,应用预配置,然后再次提交。
git reset --soft HEAD^
--您可能在撤销提交之前使用过git reset
。--soft
选项意味着代码更改保留在暂存区域,可以再次提交。
pre-commit run
-由于一切都是为了提交而进行的,运行预提交钩子只会将格式应用于所有更改的文件。
git add -u
-这个命令添加了对临时区域进行的预提交运行所做的任何更改。
git commit -C HEAD@{1} --no-edit
-- -C
参数告诉git从另一个提交复制提交详细信息。另一个提交是HEAD@[1}
,意思是“最后一个地方”。在我们的例子中,这是我们在git reset
命令之前进行的提交。
就这样!我们说完了。现在,可以将feature_formatted分支合并到主服务器中,而无需任何格式化的相关冲突。如果您想要重基到主服务器上,您应该避免使用功能库中的“应用格式”提交,因此您应该使用以下命令:
git rebase feature_base feature_formatted --onto master
https://stackoverflow.com/questions/65304887
复制相似问题