我如何围绕 mercurial 的 "push creates new remote head" 编写一个钩子?
How do I write a hook around mercurial's "push creates new remote head"?
我想做一个钩子,当有人推送到远程时,如果他们收到 abort: push creates new remote head
错误消息,钩子将尝试合并远程和本地头(如果容易合并,即没有冲突文件)并再次推送。
我该怎么做?我尝试在 pre-push
上添加一个钩子,但我不知道如何只获取当前分支的远程头哈希。
这是我一直在尝试的方法,虽然还没有完善。
currbranch=$(hg branch)
hg pull
numheads=$(hg heads --template "." $currbranch)
if test ${#numheads} -gt 1; then
echo "Merge needed."
head1=$(hg heads --template "{node}\n" $currbranch | head -n 1)
head2=$(hg heads --template "{node}\n" $currbranch | tail -n 1)
overlap=$((hg status --change $head1 --no-status ; hg status --change $head2 --no-status) | sort | uniq --repeated)
if [ -z "$overlap" ]; then
echo "Attempting automatic merge..."
hg merge "$head1" # Fails when merging the wrong head
hg merge "$head2" # But how do we know which one is wrong?
hg commit -m "Merge"
echo "Completed."
else
echo "Cannot automatically merge"
exit 1
fi
fi
需要明确的是,合并两个头是行不通的。我怎么知道哪个头是本地的,哪个头是远程的?
还有,这个钩子用对了吗?
- 您可以尝试添加和使用remotenames extension(它相当陈旧,自 2018 年以来就没有积极维护,但可能会工作)以使所有远程对等点 在你的仓库中命名(在这种情况下,你会在拉取后知道远程头的名字)
- 您可以(在拉取之前)检查传入的变更集中是否存在 head,smth。喜欢
hg in -r "head()" -T "{node|short}\n"
(待定!)
我想做一个钩子,当有人推送到远程时,如果他们收到 abort: push creates new remote head
错误消息,钩子将尝试合并远程和本地头(如果容易合并,即没有冲突文件)并再次推送。
我该怎么做?我尝试在 pre-push
上添加一个钩子,但我不知道如何只获取当前分支的远程头哈希。
这是我一直在尝试的方法,虽然还没有完善。
currbranch=$(hg branch)
hg pull
numheads=$(hg heads --template "." $currbranch)
if test ${#numheads} -gt 1; then
echo "Merge needed."
head1=$(hg heads --template "{node}\n" $currbranch | head -n 1)
head2=$(hg heads --template "{node}\n" $currbranch | tail -n 1)
overlap=$((hg status --change $head1 --no-status ; hg status --change $head2 --no-status) | sort | uniq --repeated)
if [ -z "$overlap" ]; then
echo "Attempting automatic merge..."
hg merge "$head1" # Fails when merging the wrong head
hg merge "$head2" # But how do we know which one is wrong?
hg commit -m "Merge"
echo "Completed."
else
echo "Cannot automatically merge"
exit 1
fi
fi
需要明确的是,合并两个头是行不通的。我怎么知道哪个头是本地的,哪个头是远程的?
还有,这个钩子用对了吗?
- 您可以尝试添加和使用remotenames extension(它相当陈旧,自 2018 年以来就没有积极维护,但可能会工作)以使所有远程对等点 在你的仓库中命名(在这种情况下,你会在拉取后知道远程头的名字)
- 您可以(在拉取之前)检查传入的变更集中是否存在 head,smth。喜欢
hg in -r "head()" -T "{node|short}\n"
(待定!)