다음 스크립트는 두 가지 분기의 가장 일반적인 커밋을 찾으려고 시도합니다. 커밋의 제목은 , , 작성자 및 과 동일해야합니다. 작성일은입니다. 그러나 커밋 일 및 해시은 다릅니다. 이 때문에 git rebase
은이 분기를 자동으로 찾을 수 없습니다.두 개의 완전히 다른 자식 트리에서 공통 커밋 찾기
#!/bin/bash
lastbr=
lastrest=
revU= # Update
revB= # Base
rm -f rev.*.tmp
(
git log --format='format:b %H %at %an %ae %f' master
echo
git log --format='format:u %H %at %an %ae %f' master_tmpnew
) | sort -r -t' ' -k3 | while read br rev rest; do
echo "? $br $rev $rest"
[ "$br" != "u" ] || revU="$rev"
[ "$br" != "b" ] || revB="$rev"
if [ "$lastrest" = "$rest" -a "$lastbr" != "$br" ]; then
echo "found match: base $revB updae $revU"
echo "$revB" >rev.base.tmp
echo "$revU" >rev.update.tmp
break
fi
lastrest="$rest"
lastbr="$br"
done
if [ ! -f rev.base.tmp ]; then
echo "No matching revision found"
exit 1
fi
revB="`cat rev.base.tmp`"
revU="`cat rev.update.tmp`"
git rebase --onto $revB $revU master_tmpnew
질문 :이 솔루션은 나에게 아주 좋은 보이지 않는다. 누구든지이 문제를 어떻게 구현할 것인지 더 좋은 아이디어가 있습니까? 아니면 이미 솔루션을 사용할 수 있습니까?
배경 :cvs2git 도구를 사용하여 증분 CVS-GIT 가져 오기를 구현하려고합니다. 공식적으로 점진적 수입을 지원하지 않지만 this workaround과 비슷한 해결책을 찾았습니다. 유일한 문제 : 나는 간단한 문제를 겪고 있었다. git rebase
. 분기가 서로 일치하지 않기 때문에 (다른 해시 & git2svn의 성격으로 인해 커밋 된 날짜), 자세한 참조 (공통 커밋)없이 사용하면 필요 이상의 커밋을 다시 작성합니다. 위의 스크립트에 대해 바로 실행할 수있는 테스트 시나리오는 this을 확인하십시오.
, 나는 아마 REBASE 명령에 대한'master'를 사용한다 :'자식은 --onto 마스터 $의 revU의 master_tmpnew'을 리베이스. 그러나 이것은 나의 질문의 대상이 아닙니다. –