2013-02-22 16 views
2

以下腳本嘗試查找兩個分支的最新常見提交。提交應該有相同的主題,相同作者和相同作者日期。但提交日期散列是不同的。因此,git rebase無法自動找到此分支。在兩個完全不同的git樹中查找常見提交

#!/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

而不是'$ revB',我應該使用'master'的爲底墊命令:'git的重訂--onto主$ revU master_tmpnew'。但這不是我的問題的主題。 – 2013-02-25 10:16:43

回答

0

也許git櫻桃可以使用。它將比較更改集而不是提交散列來確定兩個提交是否包含相同的內容。

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 master_tmpnew | grep'^ +'| cut -d''-f2)' – 2013-02-26 15:19:00

+0

很酷。很高興我能幫上忙。 – jsageryd 2013-02-27 08:36:41