我使用的构建系统通常要求在执行完整构建之前将项目数据提交到本地存储库。这——连同我通常在推送到公共(public) repo 之前经常提交和 rebase 的习惯——意味着我通常在远程头上有一堆提交。他们中的大多数人都有像“s”这样的提交消息,因为我知道他们会被压扁。
我这里的情况是自动执行 rebase 提交列表的步骤之一。我知道我对某个文件所做的所有更改都不应该推送到公共(public)存储库,并且我正在寻找一种方法来编辑每个提交以将对该文件的更改拆分为单独的提交,稍后我将压缩这些提交 rebase 。
例如,如果源的 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”提交到“使 pkg 与 master 分支保持同步”, 重新排序它们,更新 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”提交的烦恼,但这不是主要问题。我仍然不知道如何拆分对特定文件的更改,这必须发生在我压缩它们之前。
- 涂抹/清洁过滤器很漂亮,但我没有进行关键字替换,而且我不认为我想在我的个人分支上维护的更改足够可预测以编写脚本。我认为我总是必须至少在公共(public) master 之前提交一次。
最佳答案
这应该会告诉您如何自动压缩。不要用 s 标记提交,而是用 !squash 标记它。
看起来您应该为所有 DD 提交维护自己的分支。然后只需管理与主分支的 merge 。
如果您要排除的文件更改是由于环境设置引起的,请改为查看涂抹/清理脚本。这将使您能够提交对该文件的相关更改,并忽略任何仅适用于您的环境的更改。这通常是不同开发人员之间不同的数据库连接字符串。
关于git - 在一系列 git 提交中提取对单个文件的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5329993/