代码之家  ›  专栏  ›  技术社区  ›  Derek Kurth

如何自动拆分git提交以将更改分离到单个文件

  •  2
  • Derek Kurth  · 技术社区  · 7 年前

    我对Git很满意,而且我已经用了一年多了。更好的是,我终于说服了一个客户转用它!然而,我只是被困在如何完成我要描述的,或者如果这是可能的。即使它可以做到,我想知道它是否会让我们陷入一个混乱的、无法管理的存储库。

    单个文件 用于生产,然后使用标记更新服务器。不幸的是,这导致了草率的做法,比如一起提交不相关的更改,然后在事后标记文件,并在主工作树中保留大量垃圾文件,等等。。。开发人员想知道如何做到以下几点:

    在他们的本地repos中,他们进行黑客攻击并提交给他们的心,然后在一天结束时,能够运行一个命令,获取一个文件列表,这些文件在一天中的提交与他们的本地prod合并-并且只有这些文件-即使这些提交合并了对其他文件的更改。

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

    我意识到最简单的事情就是告诉他们切换prod分支,将主分支中的文件签出到工作树中,然后提交到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
    
    1 回复  |  直到 16 年前
        1
  •  2
  •   VonC    9 年前

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

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

    • 在黑客攻击日结束时,从当前头部创建一个特殊分支

    • 例如,修改可能是 kind of special keyword extension ,只是为了将它们标记为“要合并到prod”。
    • 将这个特殊分支合并到它们的本地prod:在一次提交中,只合并正确的文件。