5

私の会社には Subversion サーバーがあり、全員が自分のマシンで Subversion を使用しています。ただし、git を使用して変更をローカルにコミットし、準備ができたら「プッシュ」したいと考えています。

ただし、次の状況で何が起こるか理解できません。ローカルで 3 つの git コミットを行い、Subversion サーバーにすべてを「プッシュ」する準備ができたとしましょう。私の理解が正しければ、git svn dcommit基本的にはサーバー上で 3 つのコミットを連続して行うべきではないでしょうか。しかし、その間 (たとえば 2 回目と 3 回目のコミットの間) に別の同僚がコミットを発行した場合はどうなるでしょうか? 私が考えることができるシナリオは次のとおりです。

1)コミット中にSubversionサーバーをgitの「ロック」する(それは可能ですか?)私のコミットはアトミックに行われ、私の同僚のコミットは私の後に行われます

2) サーバー上のコミット履歴は mine1-mine2-other-mine3 になります (同僚がその時点で更新された作業コピーを持っていないため、「その他」が失敗したとしても)。

#2だと思いますが、おそらくコミット速度が非常に速いため、これが問題になることはめったにありません。では、1位と2位はどっち?

4

2 に答える 2

5

Git ではロックはサポートされていません。これは Git の方法ではありません (Git の方法は分岐とマージです)。git-svn を使用すると、mine1-mine2-other-mine3 の履歴を取得できます。原子性が必要な場合は、SubGitプロジェクトをご覧ください (SVN サーバーにインストールされ、SVN リポジトリ用の純粋な Git インターフェイスを作成します)。

最近、あなたにとって興味深いかもしれない同様の質問がありました。

于 2012-07-03T17:06:10.523 に答える
0

運が良ければ 2 番ですが、ほとんどの場合、それほど幸運ではありません。私の経験では、多くのコミットを dcommit し、他の誰かがコミットしている間にコミットすると、通常 2 つのことが起こります。

  1. 他の変更をコミットすると停止します。
  2. まだコミットされていないコミットは失われます。

2番は本当にうるさいです。主な問題は、git svn dcommit を使用するには完全に最新の状態にする必要があることです。これは、git-svn がサーバーにその場でリビジョンをマージさせないためです。(両方のコミッターが両方の変更を含む作業ツリーを持つ必要があるため)。

これを解決する唯一の方法は、ここで見つけた次の手順です

  1. .git/logs/HEAD を開く
  2. 最新のコミットを探します (これらのコミットは「UNIX 時間」でソートされていることに注意してください。ただし、そこにあるショートログを読むことで最新のものを見つけることもできます)
  3. 見つかったコミットが正しいことを確認します: git show
  4. git reset --hard ハッシュをログから
  5. git svn リベース
  6. git svn dcommit

この手順に従うと、失敗した場所から離陸できます。彼らがこれをすぐに修正することを願っていますが、これはまだ優先事項ではないと彼らは言いました.

もちろん、小規模なグループをコミットし、サーバーへの接続が高速な場合は、それほど頻繁に発生することはありません。(6か月間毎日積極的に働き、コミットした場合、2〜3回しか取得できませんでした)。

于 2012-07-03T16:59:03.883 に答える