在一系列的git提交中提取单个文件的更改

4
我所使用的构建系统通常要求在进行完整的构建之前将项目数据提交到本地仓库。这意味着,我通常会在远程主干之上堆叠一堆提交记录,因为我习惯于经常提交并在推送到公共仓库之前进行变基操作。其中大多数提交记录的提交消息都像“s”一样,因为我知道它们将被压缩。
我现在面临的情况是自动化变基步骤中的一个。我知道对某个文件所做的所有更改都不应该推送到公共仓库,并且我正在寻找一种方法来编辑每个提交以将该文件的更改拆分为单独的提交,然后在稍后的变基中将它们压缩。
例如,以下是我在原始主干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 多一次提交。

filter-branch?我宁愿使用过滤器驱动程序(https://dev59.com/3nE85IYBdhLWcg3wqVT4#2673285),并使用一些`--autosquash`(https://dev59.com/OHE95IYBdhLWcg3wdtqj#2302947) - VonC
1个回答

0

http://technosorcery.net/2010/02/07/fun_with_the_upcoming_1.7_release_of_git_rebase_--interactive_--autosquash.html

这应该告诉你如何自动压缩。不要用“s”标记提交,而是用!squash标记。

看起来你应该为所有的DD提交维护自己的分支。然后只需要管理与主分支的合并。

如果你想要排除的文件的更改是由于环境设置造成的,请查看smudge / clean脚本。这将使您能够提交与该文件相关的更改,并省略仅适用于您的环境的任何更改。这通常是数据库连接字符串,其在一个开发人员与另一个开发人员之间有所不同。

看看这里:http://progit.org/book/ch7-2.html


我之前不知道有--autosquash这个选项,从现在开始我会使用它。但是这并没有解决我的最初问题,即如何自动从一系列提交中拆分出对特定文件的更改。 - David Dombrowsky

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