【问题标题】:How to automatically split git commits to separate changes to a single file如何自动拆分 git 提交以分离对单个文件的更改
【发布时间】:2010-03-25 17:51:37
【问题描述】:

我对 Git 非常满意,而且我已经使用它一年多了。更好的是,我终于说服了一个客户改用它!但是,对于如何完成我将要描述的内容,或者是否有可能,我只是一头雾水。即使它可以做到,我想知道它是否会为我们设置一个混乱、无法管理的存储库。

我已经建立了代码库的两个分支。一个是“master”,另一个是“prod”。 prod 的 HEAD 始终是部署到生产的最新代码,而 master 是主要的开发分支。

但问题是:客户端正在从 CVS 转换,大多数开发人员仍在习惯 git。他们的 CVS 工作流程涉及为生产标记单个文件的版本,然后使用标记更新服务器。不幸的是,这导致了一些草率的做法,比如一起提交不相关的更改,然后在事后标记文件,以及在他们的主工作树中保留大量垃圾文件等......并且开发人员想知道他们可以怎么做以下:

在他们的本地存储库中,他们破解并提交了他们心中的喜悦,然后在一天结束时,能够运行一个命令,该命令获取一个文件列表,这些文件在当天的提交与他们的本地产品合并 -并且只有那些文件——即使这些提交合并了对其他文件的更改。

我知道如何使用 git rebase --interactive 拆分提交,但我完全不知道如何自动拆分提交,更不用说我想要的方式了。

我确实意识到最简单的事情就是告诉他们切换他们的 prod 分支,将文件从他们的 master 分支签出到工作树中,然后提交给 prod。我的问题是丢失了他们一天中的提交历史。

有没有其他人用脚本或其他东西解决了这个问题,还是我必须促使开发人员做出更好的行为 - 并冒着他们完全拒绝 Git 的风险?


这是我最终提出的解决方案。这是一个简单的 shell 脚本,似乎完全符合我的要求,即使它不是最优雅的解决方案。我只测试了几个场景,但是文件的更改历史被保留了,如果来自 dev 分支的提交稍后合并到整个 git 中似乎可以干净利落!

#!/bin/sh
set -e
dest_branch=$1
file=$2
current_branch=$(git branch | sed 's/^\* //;/^\s/d')
( 
    set -e 
    git format-patch --stdout --full-index -M -C -B --ignore-if-in-upstream $dest_branch -- $file
    git checkout $dest_branch 
) | git am
git checkout $current_branch

【问题讨论】:

  • 您的解决方案正是我想避免的。它会挑选并报告文件修改到另一个分支,两者之间没有任何链接。您需要做的就是对要合并到额外分支中的所有文件进行最后一次额外修改,将该额外分支提交并合并到dest_branch(一次合并)。

标签: git file merge split commit


【解决方案1】:

那些开发人员仍然有一个非常“以文件为中心”的愿景,而不是“以存储库为中心”的方法(基于 SVN 的修订或 Git 的提交)!
他们需要阅读“What are the basic VCS concepts every developer should know?”;)
(它最初是关于 ClearCase,但仍然适用于面临 DVCS 的 CVS 用户)

也就是说,在特定情况下弥合差距的一种方法是:

  • 在一天的黑客攻击结束时,从当前 HEAD 创建一个特殊分支
  • 仅对正确的文件(用于产品的文件)进行最终修改
    例如,修改可能是一些kind of special keyword extension,只是为了将它们标记为“要合并到产品中”。
  • 将该特殊分支合并到其本地产品:在一次提交中,仅合并正确的文件。

这样,这些文件的历史记录就会被保留。

【讨论】:

  • 我试过了,但没有找到任何特别好的方法让它自动工作。但是,我刚刚编辑了我最初的问题,以添加我 did 提出的 似乎 正在工作的内容。不过,我很乐意提前了解我的“解决方案”可能会彻底失败的任何方法:)
猜你喜欢
  • 2022-06-23
  • 1970-01-01
  • 2016-11-29
  • 2011-03-14
  • 2013-10-23
  • 2017-04-03
  • 2023-04-08
  • 2018-07-17
  • 1970-01-01
相关资源
最近更新 更多