2人のユーザーが同じファイルで作業していて、user A
がuser B
の前にコミットすると、警告なしでuser A
のコミットが上書きされます。svnは前のコミットを上書きできるのはなぜですか?
これはなぜですか、これを防ぐ方法はありますか?
これはちょうどここで起こりました。はuser B
のコミット後に行った変更にパッチを当てて修正する必要がありました。
これは危険なようですが、特定のファイルのベースが更新されていないことをsvnに伝えることはできません。
2人のユーザーが同じファイルで作業していて、user A
がuser B
の前にコミットすると、警告なしでuser A
のコミットが上書きされます。svnは前のコミットを上書きできるのはなぜですか?
これはなぜですか、これを防ぐ方法はありますか?
これはちょうどここで起こりました。はuser B
のコミット後に行った変更にパッチを当てて修正する必要がありました。
これは危険なようですが、特定のファイルのベースが更新されていないことをsvnに伝えることはできません。
が明示的にそれを要求しない限り、SVNは単にuserA
をコミットしません。それは偶然に起こることではありません。
userB
が自分のファイルをコミットしようとすると、SVNはエラー
が表示されます今userB
はSVNの更新を行う必要があります。 SVNは本当にASCII(テキスト)ファイルで動作するように設計されて
userA
の変更をuserB
のファイルに「マージ」します。つまり、userA
で変更された行は、userB
の作業コピーに変更されます。 userB
は実際にはuserB
がしようとしていた変更を壊さないようにマージを確認する必要があります。両方のユーザーが同じ行を変更した場合、競合にフラグが立てられます。 userB
は競合を確認し、何を達成しようとしていたのかを把握し、両方のユーザーの変更を保存するために何をすべきかを手動で決定する必要があります。SVNは本当にバイナリファイルをマージするように設計されていません。マージが適用可能な場合、その特定のバイナリ用に実際にカスタムビルドされたツールに依存する必要があります。 userB
が更新を実行すると、競合が発生し、userB
は差異を確認してファイルをマージできなくなります。特定のバイナリタイプでマージツールが利用できない場合、userB
はuserA
のバージョンを受け入れ、そのバイナリを生成するツールを使用してバイナリへの変更を再度行う必要があります。
userB
は、ワークフローのコピーを保存してsvn update
を実行し、コピーを復元してコミットすることで、このワークフローを回避できます。これはuserA
のすべての変更を元に戻します。このASCIIのケースでは、特にこれはダッシュ移動と呼ばれます。バイナリの場合、2人のユーザーが実際に通信し、2人のうちのどちらが自分の作業をやり直す必要があるかを決定する必要があります。
SVNでバイナリファイルを扱う場合、大きな問題になります。解決策は頻繁にコミットするか、acquire lock機能を使用することです。また、ファイルを処理する直前にはsvn update
に、変更が完了したらすぐにsvn commit
にしてください。
userB
がマージを拒否して大量の作業を破棄した場合は、いつでもuserB
のコミットに復帰して再試行するように指示できます。
ファイルはバイナリファイルかASCIIファイルでしたか? – Stewart