我所使用的构建系统通常要求在进行完整的构建之前将项目数据提交到本地仓库。这意味着,我通常会在远程主干之上堆叠一堆提交记录,因为我习惯于经常提交并在推送到公共仓库之前进行变基操作。其中大多数提交记录的提交消息都像“s”一样,因为我知道它们将被压缩。
我现在面临的情况是自动化变基步骤中的一个。我知道对某个文件所做的所有更改都不应该推送到公共仓库,并且我正在寻找一种方法来编辑每个提交以将该文件的更改拆分为单独的提交,然后在稍后的变基中将它们压缩。
例如,以下是我在原始主干HEAD之上拥有的提交:
我希望能够遍历从master..master-dave的所有提交,提取对./file.txt的更改,给我以下结果:
我相信答案在于使用 git filter-branch,但我不知道该如何操作。
我现在面临的情况是自动化变基步骤中的一个。我知道对某个文件所做的所有更改都不应该推送到公共仓库,并且我正在寻找一种方法来编辑每个提交以将该文件的更改拆分为单独的提交,然后在稍后的变基中将它们压缩。
例如,以下是我在原始主干HEAD之上拥有的提交:
* 6f42745 (HEAD, master-dave) s
* b33bc68 s
* 0b787e8 s
* 3d47e9e s
* ae45dec brought pkg up-to-date with master branch
* dd87ec1 s
* 96fd4ef DD: dave dev
* 422cf73 (origin/master, master) Add missing build scripts.
我希望能够遍历从master..master-dave的所有提交,提取对./file.txt的更改,给我以下结果:
* 6f42745 (HEAD, master-dave) s
* ------- DD (changes to file.txt)
* b33bc68 s
* ------- DD (changes to file.txt)
* 0b787e8 s
* ------- DD (changes to file.txt)
* 3d47e9e s
* ae45dec brought pkg up-to-date with master branch
* dd87ec1 s
* 96fd4ef DD: dave dev
* 422cf73 (origin/master, master) Add missing build scripts.
最后,我会运行git rebase -i origin/master指令,将所有“DD”提交压缩在一起,并将所有“s”提交合并为“brought pkg up-to-date with master branch”,重新排序它们,更新主分支,然后推送到源代码库,最终得到以下结果:
* ------- (HEAD, master-dave) DD: dave dev
* ------- (origin/master, master) brought pkg up-to-date with master branch
* 422cf73 Add missing build scripts.
我相信答案在于使用 git filter-branch,但我不知道该如何操作。
编辑:
- --autosquash 可以解决“s”提交的问题,但这不是主要问题。 我仍然不知道如何拆分特定文件的更改,这必须在我 squash 它们之前完成。
- smudge/clean 过滤器很棒,但我没有进行关键词替换,而且我认为我想要保留在我的个人分支上的更改不够可预测,无法进行脚本编写。 我想我总是至少比公共 master 多一次提交。