2013-02-22 3 views
2

다음 스크립트는 두 가지 분기의 가장 일반적인 커밋을 찾으려고 시도합니다. 커밋의 제목은 , , 작성자과 동일해야합니다. 작성일은입니다. 그러나 커밋 일해시은 다릅니다. 이 때문에 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을 확인하십시오.

+0

, 나는 아마 REBASE 명령에 대한'master'를 사용한다 :'자식은 --onto 마스터 $의 revU의 master_tmpnew'을 리베이스. 그러나 이것은 나의 질문의 대상이 아닙니다. –

답변

0

아마도 git-cherry을 사용할 수 있습니다. 해시를 커밋하는 대신 변경 집합을 비교하여 두 커밋에 동일한 커밋이 포함되는지 여부를 결정합니다. 대신 $ revB``의

http://www.kernel.org/pub//software/scm/git/docs/git-cherry.html

+0

올바른 추적으로 나를 밀어 주셔서 감사합니다. 설명서에서 git-cherry, git-patch-id 및 git-cherry-pick을 모두 찾았습니다. 모두 매우 흥미 롭습니다. 마지막으로 위의 코드를 다음 명령 줄로 바꿀 수있었습니다. 'git cherry-pick $ (git cherry 마스터 master_tmpnew | grep '^ +'| cut -d '-f2)' –

+0

차가운. 내가 도울 수있어서 행복 했어. – jsageryd

관련 문제