如何在GIT中自动修复我的大师分支中的狐步舞合并? [英] How to automatically fix foxtrot-merges in my the 'master' branch in git?
本文介绍了如何在GIT中自动修复我的大师分支中的狐步舞合并?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
狐步舞合并问题在this question中有详细说明。简而言之:当在相同的分支(远程和本地)上工作时,简单的git merge
命令会隐藏第二个父级下的远程合并提交,并替换远程的第一个父级的历史记录(在常规情况下-&;起源&)。我们认为这很糟糕。
上面链接的问题询问检测此情况并拒绝推送的方法。我的问题是如何自动修复。
我不太真的关心完整树历史的整齐,但我希望第一代父母树将是完美的。而且重要的是不要打扰其他用户,所以问题应该会自动解决。
目标:当Git源钩子检测到Foxtrot Commit推送时,它将在旧Head和New-Head之上添加另一个Merge-Commit,将旧Head作为第一父。
实现这一目标的最安全方法是什么?
推荐答案
根据the mentioned above question和this question(在裸回购中合并)的答案,我得出了以下解决方案。
此脚本应放入post-receive
挂钩文件中。根据请求,该脚本创建了不隐藏旧标题的new-merge-Commit。
脚本还:
- 收集新Head的第一个父行的所有Commit-msg,并将其设置为new-Merge-Commit消息。
- 将新合并提交的作者和提交者伪装为新标题的作者(同时处理&或‘in the name)的大小写。
命令说明:
git read-tree
命令转移新头提交的确切内容。New-merge-Commit应该具有完全相同的内容。git log
命令收集所需的提交消息。git ... commit-tree
命令使用作者姓名/电子邮件、暂存数据、两个父项和组合提交消息创建新的-merge-Commit。git update-ref
命令将相关引用(在本例中为-master
)更新为指向new-merge-Commit。
如果这个脚本有问题,如果您能发现它们,我们将不胜感激。:)
脚本:
#!/bin/sh
while read oldrev newrev refname
do
if [ "$refname" = "refs/heads/master" ]; then
echo "Fix Foxtrot-Merges Hook..."
MATCH=`git log --first-parent --pretty='%H %P' $oldrev..$newrev | grep $oldrev | awk '{ print $2 }'`
if [ "$oldrev" = "$MATCH" ]; then
echo "...All is OK"
else
echo "...Fixing"
authorName=`git log --first-parent --pretty='%an' $newrev^..$newrev`
authorEmail=`git log --first-parent --pretty='%ae' $newrev^..$newrev`
authorName=${authorName//"/\"}
authorEmail=${authorEmail//"/\"}
git read-tree -i --reset $newrev
git log --first-parent --pretty='%B' $oldrev..$newrev > COMMIT_EDITMSG
newCommitHash=$(git -c user.name="$authorName" -c user.email="$authorEmail" commit-tree $(git write-tree) -p $oldrev -p $newrev < COMMIT_EDITMSG)
git update-ref $refname $newCommitHash
fi
fi
done
这篇关于如何在GIT中自动修复我的大师分支中的狐步舞合并?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文