如何按文件分割每个提交?

时间:2016-11-19 22:33:14

标签: git git-rebase git-rewrite-history

我知道如何使用git rebase -i手动拆分提交,但是如何自动拆分文件中的每个提交?

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

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

2 个答案:

答案 0 :(得分:7)

剧本

以下脚本按文件分割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>

如果要在交互式rebase期间拆分单个提交,请按以下方式使用它:

p Commit to split
x git-split

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

答案 1 :(得分:2)

对于每次提交,您都需要

在专用分支的工作树中执行此操作,并为每个提取的文件添加和提交。

然后,您可以通过commit-file,通过新建的commit文件重置当前分支。