我知道如何使用git rebase -i
手动拆分提交,但是如何自动拆分文件中的每个提交?
例如,提交A
修改的3个文件,f1,f2和f3。分割后,有3个提交A-f1,A-f2和A-f3。
我想这样做是为了使重写更容易,因为我只需要压缩一些小提交。
答案 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)
对于每次提交,您都需要
首先到list all files in that commit
git diff-tree --no-commit-id --name-only -r <SHA1>
然后为每个文件extract that file
git show <SHA1>:/path/within/repo/to/file
在专用分支的工作树中执行此操作,并为每个提取的文件添加和提交。
然后,您可以通过commit-file,通过新建的commit文件重置当前分支。