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

标签 git git-rebase git-filter-branch

我使用的构建系统通常要求在执行完整构建之前将项目数据提交到本地存储库。这——连同我通常在推送到公共(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 之前提交一次。

最佳答案

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

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

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

如果您要排除的文件更改是由于环境设置引起的,请改为查看涂抹/清理脚本。这将使您能够提交对该文件的相关更改,并忽略任何仅适用于您的环境的更改。这通常是不同开发人员之间不同的数据库连接字符串。

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

关于git - 在一系列 git 提交中提取对单个文件的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5329993/

相关文章:

git - 如何从 pull 请求中删除与用户一起提交的用户?

ruby - 在 Windows 10 上安装 RHC 客户端工具 (Openshift)

git - 从我在本地没有的远程 git 历史记录中删除一个提交

git - 混淆编写 git filter-branch 将所有文件移动到子目录

git 说我有未暂存的更改,但我看不到它们

linux - 克隆 git 存储库时权限被拒绝

git - 冲突解决后如何将文件移回冲突状态?

Git 在分支之前拆分提交

git 将本地提交的更改移动到新分支并推送

git - 反复使用 git-filter-branch 重写新提交