【发布时间】:2011-07-16 20:16:12
【问题描述】:
我使用的构建系统通常要求在执行完整构建之前将项目数据提交到本地存储库。这——连同我经常提交并在推送到公共仓库之前重新设置基准的习惯——意味着我通常在远程头顶上有一堆提交。他们中的大多数都有像“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, squash all "DD" 一起提交,所有 "s" 提交到 "brought pkg up-to-date with master branch", 重新排序,更新master,然后推送到原点,最后得到:
* ------- (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”提交的烦恼,但这不是主要问题。我仍然不知道如何将更改拆分到特定文件,这必须发生在 我压缩它们之前。
- smudge/clean 过滤器很漂亮,但我不做关键字替换,而且我不认为我想在我的个人分支上维护的更改足够可预测以编写脚本。我认为我总是必须比公共 master 至少提交一次。
【问题讨论】:
-
过滤器分支?我宁愿有一个过滤器驱动程序(stackoverflow.com/questions/2673232/…)并使用一些
--autosquash(stackoverflow.com/questions/2302736/…)
标签: git git-rebase git-filter-branch