2013-02-22 56 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

相关问题