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

时间:2011-03-16 18:28:36

标签: git git-rebase git-filter-branch

我使用的构建系统通常要求在执行完整构建之前将项目数据提交到本地存储库。这一点 - 以及我通常习惯于在推送到公共回购之前经常进行重新定位的习惯 - 意味着我通常在远程头顶上有一堆提交。他们中的大多数都有像“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”提交到“与主分支最新的pkg”, 重新排序它们,更新master,然后推送到origin,最后得到:

* ------- (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”提交的烦恼,但这不是主要问题。我仍然不知道如何将更改拆分为特定文件,这必须在之前发生我压扁它们。
  • 涂抹/清洁过滤器很漂亮,但我没有做关键字替换,我不认为我想要在我的个人分支上维护的更改将足以预测脚本。我想我必须至少在公共主人面前做一次承诺。

1 个答案:

答案 0 :(得分:0)

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

这应该告诉你如何自动熄火。不是用s标记提交,而是用!squash。

标记它

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

如果要排除的文件更改是由于环境设置造成的,请查看涂抹/清除脚本。这将使您能够对该文件提交相关更改,并省略仅适用于您的环境的任何更改。这通常是db连接字符串,它们从一个dev到另一个不同。

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