10

私は Git-Svn を使用して職場で Svn リポジトリとやり取りしていますが、私の人生で競合を効果的に解決する方法を見つけることができないようです。このトピックに関する他の質問を読みましたが、明らかに、私は常にある種の無限ループに陥っているように見えるため、さらに改善する必要があります。リベースし、mergetool (meld) を使用して競合を解決し、すべてが終了したら、dcommit を実行しようとすると、コミット エラー中にマージ競合が発生します。

これが重複しているように感じるのは承知していますが、フラストレーションから、私がこれについてどのように行っているかについて非常に具体的な詳細を示して、もう一度質問させていただきます。

私のセットアップ:

リモート ブランチ (svn/trunk)、ローカル ブランチ (trunk)、および通常作業する別のローカル ブランチ (working-trunk) があります。トランクは svn/trunk からチェックアウトされ、working-trunk はトランクからチェックアウトされました。

これが私がやってきたことです:

  1. 私のトランクで、git svn rebase(競合を返します)
  2. git mergetool
  3. [そのファイルの競合を解決する]
  4. マージされたファイルを meld から保存し、meld を閉じます。
  5. git add .
  6. git rebase --continue
  7. 【すすぐ、繰り返す】
  8. を使用したかどうかを尋ねるメッセージが表示されgit addたら、git rebase --skip

報告されたすべての変更の最後に到達すると、すべてが停止し、この時点で何をすべきかわからなくなる可能性があります。Git はコミットするものが何も表示されず、トランクに戻ったように見えます。Git では dcommit が許可されますが、その後すぐにリベースを試みると、解決したばかりの競合を再解決することになります。

ここには明らかに欠けている重要な部分がありますが、それが見えないだけで、多くの問題とフラストレーションを引き起こしています. Git ではマージは簡単かもしれませんが、そうではないことは確かです。

ありがとう。

更新:それが問題の一部 (またはすべて) である場合に備えて、私のワークフローを説明するために簡単な更新を捨てたかっただけです。

まず、svn/プレフィックスを使用してリポジトリを複製すると、svn/trunkリモート ブランチが作成されます。とすれば:

  1. リモートをgit co -b trunk svn/trunkローカルブランチにチェックアウトします。
  2. ローカルトランクが常にリモート トランクをミラーリングできるように、もう 1 段階の分離をgit co -b working-trunk作成するために使用する作業ブランチを作成します。
  3. デフォルトのマスター ブランチを削除します (svn を使用する場合、「マスター」よりも「トランク」の観点から考える方が簡単だと思います)。

すべてのブランチを取得したら、通常のワークフローは次のようになります。

  1. working -trunkで、変更を加えてコミットします。
  2. git co trunkgit svn rebase.
  3. 新しいコードがリベースされたと仮定すると、I git rebase working-trunk.
  4. git co working-trunk
  5. git merge trunk
  6. git rebase trunk
  7. git co trunk
  8. git merge working-trunk
  9. git svn dcommit

たくさんの手順があることはわかっていますが、それがここや他の場所で誰もが推奨していることです。私の致命的な欠陥はそのプロセスのどこかにあるのでしょうか?

再度、感謝します。

4

7 に答える 7

5

git merge の代わりに git rebase を使用することをお勧めします。Svn は線形の履歴を保持しているため、git ブランチのマージと混同されることがあります。git rebase を使用すると、線形履歴 svn が確実に理解できます。

詳細とガイドラインについては、 http : //learn.github.com/p/git-svn.htmlを参照してください。

于 2009-04-23T06:54:46.373 に答える
1

SubGitのアプローチは少し簡単だと思うかもしれません。

  1. サーバー側のSubversionリポジトリにSubGitをインストールします
  2. SVNリポジトリに変更を送信しgitないために使用します*git-svn

SubGitをインストールすると、SVNリポジトリの対応するGitが作成されます。このリポジトリをローカルリポジトリに複製します。ブランチを作成してリモートGitリポジトリにプッシュすると、SubGitはこれらのブランチを自動的にSVNに変換します。

詳細については、SubGitのドキュメントgit-svnの比較を参照してください。

*任意のGitクライアントで動作します。

于 2012-07-18T17:38:04.703 に答える
0

私が強制した(確かに小さな)競合でこれを試しましたが、その後、git svn dcommitそれ以上の競合はありませんでした。違いの 1 つは、 に関するメッセージを受け取っていないことですgit add。あなたのチームは、たまたまあなたの仕事と競合する多くのコミットを送信している可能性はありますか? ありそうにありませんが、これが最も単純な説明のようです。

別の場所でリポジトリを再度取得し、競合しない変更をプッシュして、dcommit何らかの形で隠されているステージ中に通信の問題がないことを確認するかどうかをテストする価値があるかもしれません.

更新:私が持っていたもう1つの考え:git add foo.bar競合の解決が完了したときに実行しました。予想外のことをしている可能性git add .はありますか?私はgit svnそれほど多くの機能を拡張するわけではないので、これらはほとんど WAG です。

于 2009-04-17T13:23:38.813 に答える
0

推奨されるワークフローを使用しているときにこの問題に遭遇したので、ここでは答えがないと思います.

これが私がこの状況に陥った方法です。

Apache インフラストラクチャを使用して、git svn 経由で git リポジトリを作成しています。

私は地元の支店を持っています。

私はこの手順に従おうとします:

1) トランクをリベースします。2) トランクをプライベート ブランチにマージします。3) 仕事をする。4) トランクをリベースします。5) プライベートをトランクにマージします。6) コミットしない。

しかし、私は失敗し、プライベートからトランクへの変更をプッシュするのを忘れていました。その後、プライベート ブランチに一連の変更を加えたところ、完全に偽りの競合が発生して、すすぎと繰り返しのループに陥りました。私がプッシュした最後の変更は、1 行をコメントアウトすることでした。その後、無視された変更でその行を削除すると、何があっても解決されない競合が発生しました。私は最終的に --skip を使用しました。

于 2009-08-23T14:50:58.680 に答える
0

ローカルトランクとリモートトランクの間でのみ git-svn を使用することをお勧めします。ローカルトランクとローカルmytrunkの間では、標準の git のみの機能に固執します。次のようなワークフローを試すことができます。

[SVN]---git-svn---[trunk]---branch---[mytrunk]

マージするには、トランクに切り替えて次の操作を行います。

git svn rebase

これにより、リモートから変更が取り込まれ、トランクとマージされます。次に、mytrunkに切り替えて、次の操作を行います。

git rebase

これにより、トランクから変更がプルされ、 mytrunkとマージされます。うまくいくはずだと思います。それ以外の場合は、ローカル トランクを git-clone して、代わりにクローンで作業してください。

于 2009-04-18T07:58:17.853 に答える