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”提交到“将 pkg 与 master 分支同步”,重新排序,更新 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 过滤器很漂亮,但我不做关键字替换,而且我不认为我想在我的个人分支上维护的更改将是可预测的,足以编写脚本。我认为我总是必须在公共大师之前至少提交一次。
4

1 回答 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

于 2011-03-16T19:23:05.723 回答