我一直在尝试线性化我的 git 历史记录以删除合并提交并用提交替换它们,就像在创建它们时使用
git merge --squash
一样。
我已经尝试过:
git checkout main
git log --reverse | grep "^commit " > /tmp/commits
git checkout <the oldest commit>
git checkout -b new_main
cat /tmp/commits | tail -n +2 | sed "s/commit //g" | while read commit; do git checkout --force $commit -- . > /dev/null && git commit -a --reuse-message=$commit > /dev/null ; done
但是,
git checkout --force $commit -- .
适用于所有文件,但不会在本地删除在$commit
中删除的文件,所以最后,我得到了一个结果new_main
,其中包含所有文件,甚至是一路上删除的文件,以及重命名文件的两个版本。
关于我可以使用什么来代替
git checkout --force $commit -- .
来检查另一个提交的整个状态,而不仅仅是添加/修改的所有文件,有什么建议吗?
根据 LeGEC 的评论,我设法解决了这个问题:
cat /tmp/commits | tail -n +2 | sed "s/commit //g" | while read commit; do echo $commit && git read-tree $commit > /dev/null && git commit --reuse-message=$commit > /dev/null && git checkout -- . > /dev/null && git clean -f -d > /dev/null && echo " $(git rev-parse HEAD)" > /dev/null ; done
所以,
git read-tree
就是我一直在寻找的,谢谢!