gpt4 book ai didi

git - Autofixup 连续提交相同的消息和作者(完整的 repo)

转载 作者:太空狗 更新时间:2023-10-29 14:46:07 24 4
gpt4 key购买 nike

我已经将一个大型 SVN 存储库迁移到 GIT,并且有大量连续提交具有同一作者的相同消息。

现在我想自动将提交修复为一个提交。

想法?

最佳答案

我终于能够确定问题所在,与往常一样,这是人为错误。

我在这里提供的脚本是为 bash 编写的,但正如我从您的实验中看到的那样,这应该不是问题。

这是脚本,下面我会详细解释:

#!/bin/bash

author="$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>"
msg="$(cat)"
tree="$1"
parents=()
shift
while getopts ":p:" opt; do
case $opt in
p)
parents=(${parents[*]} $OPTARG)
;;
?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done


create_parents_option() {
parentsstring=""
for parent in $@; do
parentsstring+="-p $parent "
done
echo "$parentsstring"
}

get_msg() {
git log -1 --format="%B" $1
}

get_author() {
git log -1 --format="%aN <%aE>" $1
}

squash_commit() {
if [ "x$author" == "x$(get_author $1)" ] && [ "x$msg" == "x$(get_msg $1)" ]; then
git read-tree -m --aggressive ${1}^{tree} $tree >/dev/null
tree=$(git write-tree)
parents=($(git log --format=%P -1 $1))
fi
}

if [[ ${#parents[@]} == 1 ]]; then
squash_commit ${parents[0]}
fi

git commit-tree $tree $(create_parents_option ${parents[@]}) -m "$msg"

您可以通过以下方式执行脚本:

git filter-branch --commit-filter "$(cat /path/to/the/script)"

该脚本将检查当前提交是否由同一作者提交并使用与之前相同的消息。

如果是这种情况,它将在使用 git read-tree -m merge 给定树并将结果写入索引之前,将当前提交的树与提交的更改 merge 。
之后 git write-tree 用于根据索引上的 merge 结果生成一棵新树。

然后脚本继续将当前提交的父级设置为 merge 提交的父级的父级,从而有效地从历史记录中“删除”该提交。

如果您有任何其他问题,我很乐意为您提供帮助。做这个很有趣!

编辑:我已经在 Windows 7 上用 msysgit 版本 1.9.2 测试了这个脚本。

关于git - Autofixup 连续提交相同的消息和作者(完整的 repo),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26271635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com