如何分割每个提交文件?

我知道如何使用git rebase -i手动分割一个提交,但是我怎样才能通过文件自动拆分分支中的每个提交?

例如,提交A修饰的3个文件中,f1,f2和f3。 分割后,有3个提交A-f1,A-f2和A-f3。

我想这样做是为了让重写更容易,因为我只需要压缩一些小的提交。


剧本

以下脚本按文件分割HEAD

#!/bin/bash

set -e

LF=$'n'
SHA=$(git rev-parse --short HEAD)
MSG=$(git show -s --format=%B HEAD)
set -f; IFS=$'n'
FILES=($(git diff-tree --no-commit-id --name-only -r HEAD))
set +f; unset IFS

git reset HEAD^

for f in "${FILES[@]}"; do
  git add "$f"
  git commit -m "$SHA $f$LF$LF$MSG"
done

生成的提交消息的格式如下:

<original SHA> <file name>

<original commit message>

用法

以下假设你可以在脚本上面运行git-split

如果你想通过文件拆分一个范围内的所有提交,请像这样使用它:

git rebase --interactive --exec git-split <branch>

如果您想在交互式重新分版期间拆分单个提交,请使用如下所示:

p Commit to split
x git-split

欢迎对脚本进行任何改进。


对于每一次提交,你都需要

  • 首先列出该提交中的所有文件

    git diff-tree --no-commit-id --name-only -r <SHA1>
    
  • 然后为每个文件提取该文件

    git show <SHA1>:/path/within/repo/to/file
    
  • 在专用分支的工作树中执行此操作,并为每个提取的文件添加和提交。

    然后你可以通过commit-file建立一个新的commit-file来重置你当前的分支。

    链接地址: http://www.djcxy.com/p/26659.html

    上一篇: How to split every commit by file?

    下一篇: Bash script to extract filenames from git whatchanged