【发布时间】: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