2

次のスクリプトは、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 への増分インポートを実装しようとしています。正式には、増分インポートをサポートしていませんが、この回避策に似た解決策を見つけました。唯一の問題:単純なgit rebase. ブランチが一致しないため (git2svn の性質上、ハッシュとコミットの日付が異なります)、詳細な参照 (一般的なコミット) なしで使用すると、必要以上のコミットを書き換えることがよくあります。上記のスクリプトのすぐに実行できるテスト シナリオについては、これを確認してください。

4

1 に答える 1

0

おそらく git-cherry が役立つでしょう。コミット ハッシュではなく変更セットを比較して、2 つのコミットに同じものが含まれているかどうかを判断します。

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

于 2013-02-25T11:08:54.703 に答える