我使用这两篇文章的组合来折叠我的Git历史记录:Collapsing a git repository's history和Combine the first two commits of a Git repository?
这是结果
git rebase -i THE_SHA_1_OF_FIRST_COMMIT
# change "pick" into "squash" for all commits except first one
# :wq (if your editor is vi)
git rebase -i THE_SHA_1_OF_FIRST_COMMIT
# change "pick" into "edit"
# :wq (if your editor is vi)
git reset --soft HEAD^
git commit --amend
git rebase --continue
# garbage collect
git reflog expire --expire=1.minute refs/heads/master
git fsck --unreachable
git prune
git gc
这项工作很棒但是我经常使用它,我希望在脚本中自动化它。 问题是一些命令,如“git rebase -i”打开一个文件进行编辑,我必须手动完成(“git commit --amend”的问题相同)。有没有办法自动化这个过程?我不是要求准备使用的解决方案,只是想法。
答案 0 :(得分:2)
我使用命令git config --global core.editor
将提交列表发送到脚本而不是默认编辑器。感觉有点脏(可能没有优化),但它有效,现在我可以在一个命令中折叠我的存储库的历史记录!
您需要2个bash脚本。
第一个脚本replacepick.sh
,用于代替编辑器的脚本。解析所有行并从文件(参数3)中的行#(参数2)替换(参数1)'pick'。
#!/bin/bash
# ./replacepick.sh replacewith fromindex filename
REPLACEWITH=$1
FROMINDEX=$2
FILE=$3
echo $FILE
mathccount=0
if [ -f $FILE ]
then
OUTPUT=$FILE.tmp
echo "" > $OUTPUT
cat $FILE | while read line
do
if [[ "$line" == pick* ]]
then
matchcount=$(($matchcount + 1))
if [ $matchcount -gt $FROMINDEX ]
then
echo ${line/pick/$REPLACEWITH} >> $OUTPUT
else
echo $line >> $OUTPUT
fi
else
echo $line >> $OUTPUT
fi
done
newfilecontent=`cat $OUTPUT`
echo $newfilecontent > $FILE
fi
bash脚本collapsehistory.sh
调用git命令:
#!/bin/bash
# Collapse all commits on second commit
`git config --global core.editor "/Users/macbook/Documents/GitTests/replacepick.sh squash 1"`
`git rebase -i $1`
`git rebase --continue`
# Collapse 2 commits on one
`git config --global core.editor "/Users/macbook/Documents/GitTests/replacepick.sh edit 0"`
`git rebase -i $1`
`git reset --soft HEAD^`
`git config --global core.editor "cat"`
`git commit --amend`
`git rebase --continue`
# garbage collect
`git reflog expire --expire=1.minute refs/heads/master`
`git fsck --unreachable`
`git prune`
`git gc`
# restore your favorite editor
`git config --global core.editor "vi"`
然后你执行/path/to/historycollapse.sh SHA1_OF_FIRST_COMMIT
并完成了!希望它对你们中的一些人也有帮助。
答案 1 :(得分:1)
你应该看看git merge --squash
哪个会合并并将所有提交压缩到你当前的分支而不实际提交。然后,您可以检查并提交。