3

私は古い SVN リポジトリを持っており、それを使っgit-svnて作業し、Heroku にプッシュしました。私はかなり標準的な、、、ダンスをやっていて、git push heroku master物事git svn rebasegit svn dcommit順調でした。

しかし、最近、私はかなりの量の git 作業を行ってgit svn rebaseおり、しばらく行っていませんでした。リベースを実行しようとすると、マージの競合が原因で失敗します。レポにコミットし、マスターでのみ作業しているのは私だけですが。

問題は作業コピーである可能性があると考えて、 newgit svn cloneを実行し、次にgit remote add herokuand を実行しましたgit pull heroku master。プルは問題なく早送りマージを実行しますが、git svn rebaseそれでも失敗します。

私は単純なことをしましたが、sgit logが欠落している古いコミットがいくつかあることがわかりました。git-svn-id

commit def8bab861314c67d4e8227e03775d19045d21d1
Author: peterr
Date:   Fri Sep 21 16:17:33 2012 +0000

    PHP Cedar support.

    git-svn-id: http://vcp.unfuddle.com/svn/vcp_bbsit@24 b6b24ac3-8b7a-4c11-a811-49c5d0334e85

commit f51bd78fb07dde6ec1dc4e0ba51a48f2b6bd1bd6
Author: pr1001
Date:   Mon Aug 20 19:39:42 2012 +0200

    Specify port correctly

commit 153bb2929080898dcab46142120def0f4964dfab

...

commit 5a416fa3af9f64aa353d5171bedfaa563115ff62
Author: pr1001
Date:   Mon Aug 20 17:22:58 2012 +0200

    PHP Cedar support.

commit e0b35588d03082a3a4ab49a7b590f206346046c0
Author: j
Date:   Fri Aug 3 08:13:33 2012 +0000

    change email

    git-svn-id: http://vcp.unfuddle.com/svn/vcp_bbsit@23 b6b24ac3-8b7a-4c11-a811-49c5d0334e85

SOの回答から、コミットメッセージを書き直して欠落している情報を追加できるかもしれないと収集しましたが、それがさらに悪くならないのではないかと思います。

メッセージを見ると、「PHP Cedar サポート」など、いくつかのコミットが重複しているようです。なぜこれらの重複があるのか​​本当に困惑してgit push heroku masterいますが、先日、リポジトリが同期していないと言われた失敗したものに中継される可能性があると思います。git pull heroku master変更はまったく行われず、問題は修正されたようですが、おそらく重複したコミットが発生しました。

ですから、これらすべてを考えると、私の質問は単純です。どうすればよいのでしょうか? Heroku で動作するアプリと、SVN リポジトリに古い動作するコード ベースがありますが、新しいコミットを SVN にクリーンに取得する簡単な方法がわかりません。それらをチェリーピックする必要がありますか?重複が戻ってこないようにするために、Herokuアプリを核にする必要がありますか?

4

1 に答える 1

4

どのようにしてこの状況に陥ったかを推測するのは簡単ではありませんが、これは、SVN にプッシュするときに git-svn が (rebase または reset を使用して) コミットを git-svn-id 署名に置き換え、各コミットの例が 2 つあるためだと思います。 「ローカル」-「git-svn-id」署名なし---署名付きのリモート。

回復する:

  1. 現在の状態を維持するために一時ブランチを作成します (ある種のバックアップ)。git co -b backup
  2. refs/remotes/git-svn が、Subversion リポジトリに対応する git-svn-id を持つ最新のコミットを指していること、および git-svn-id のないコミットが表示されないことを確認してくださいgit log refs/remotes/git-svn

これが当てはまらない場合は、次のトリックを使用して refs/remotes/git-svn を修復できます: refs/remotes/git-svn を更新して、すべてが正常な最新のコミットを指すようにします (この状況では、r23 に対応します)。

$ git update-ref refs/remotes/git-svn e0b35588d03082a3a4ab49a7b590f206346046c0

そのリビジョンを指すように .git/svn/metadata リビジョンを設定します。

[svn-remote "svn"]
        reposRoot = ...
        uuid = <UUID>
        branches-maxRev = 23
        tags-maxRev = 23

ファイル .git/svn/refs/remotes/git-svn/.rev_map.UUID を削除 (または離れた方がよい) 実行します

$ git svn fetch

refs/remotes/git-svn 参照が最新の有効な SVN リビジョンに復元されました。

3. マージせずに Git リポジトリからすべての変更を取得する

$ git fetch heroku master

これで、すべての変更が refs/remotes/heroku/master に保存されました。

4 . ローカルに変更がないことを確認してください (今マスターになっていることをお勧めします)。refs/heads/master を refs/remotes/git-svn にリセットします。それを行う方法の1つ:

$ git update-ref refs/heads/master refs/remotes/git-svn
$ git reset --hard HEAD

5. refs/remotes/heroku/master と refs/remotes/git-svn を見てください。refs/remotes/git-svn に存在しない Git リポジトリの変更はありますか? はいの場合は、それらを 1 つずつチェリー ピックします。また、バックアップ ブランチも確認してください (git-svn-id のないコミットのみ)。それらがまだ SVN にない場合は、それらもチェリー ピックしてください。

6 . これで、まだ SVN にない master の変更がいくつかあります。走る

$ git svn dcommit

それらをSVNにプッシュします。

7 。これで、SVN 関連のブランチが完全に修復され、すべての変更が反映されました。私の理解が正しければ、Git リポジトリに同じコンテンツが必要です。refs/remotes/heroku/master を現在のマスター コンテンツに置き換えることをお勧めします。

$ git push heroku master --force

これで、Git リポジトリの内容が SVN リポジトリと同じになりました。

将来これらの問題を回避するには、git-svn-id なしでコミットを Git にプッシュしないようにしてください(つまり、「git push」を実行すると、マスターは git-svn-id 署名のみを持つコミットで構成されます-そうでない場合- 「git svn dcommit」を実行して、最初にそれらを SVN にプッシュします)。

于 2012-09-24T21:15:06.217 に答える