2009-06-05 36 views
3

私たちはリポジトリに.dllを保存する必要があります。私たちのチームは.dllファイルに関するSVNの競合をかなり頻繁に経験しており、非常に面倒です。何らかの理由で、.dllのMIMEタイプがapplication/octet-streamに設定されていても、svnはまだそれらをマージしようとしています。Subversionがバイナリファイルをマージするのを防ぐには?

here(これは私が以前のものを使用することを誓います)から、MIMEタイプがテキストでない限り、svnはそれらをマージしようとはしません。しかし、私のdllを見ると、svnは私のアプリケーション/オクテットストリームファイルもマージしていると言います(少なくとも私はSVNがマージしていると仮定しています。なぜマージなしの競合が起こるのかわかりません)。一体何故バイナリファイルをマージしようとしたのですか?それはただのばかだ...

誰でもこの問題を遭遇する?

私の目的は、バイナリファイルをリポジトリの一部にすることはできますが、競合することはないという解決策を見つけることです。私はSVNを最新のバイナリに置き換え、それを良いものにしたい。

なぜ私はリポジトリにバイナリファイルを置くべきなのか、そうでなければならないのかを議論しないでください。

FYIとして:私はTortoise 1.5.0とAnkhの両方を使用しています。

+0

あなたの環境で違反しているように見えるポリシーを改めて説明します。http://subversion.tigris.org/faq.html#binary-files –

+2

どのようにそれらをマージしようとしていますか?競合は、それらをマージしようとしているという証拠ではありません –

+1

私はちょうど彼らがマージしようとしていると仮定しています。私は競合が止まるようにしたい - あなたが比較/マージできない場合、紛争のポイントが何であるかはっきりしない – Mario

答えて

3

、私が正しくあなたを理解していることを確認してくださいさんが再現できるようにする:

  • あなたは両方がある時はいつでもこれらのファイルは、クライアント側とリポジトリ
  • の両方を変更することができますSVN
  • にチェックインのバイナリファイルを持っています

    :変更し、リポジトリからの変更は、それをするのsvnの方法は次のようになり

私の知る限りを、「勝つ」必要があります

  • バイナリファイル
  • で「彼らのフル--acceptのsvnアップデートは」全体のローカルコピーに

を定期的に「のsvn update」を実行し、実行、私はこれが1で行うことができるとは思いません最初のコマンドが貴重なデータを失う可能性があるので、1つのコマンドで実行可能でなければならないとも考えていません。

+0

ファイルはリポジトリ内で変更されることはありません。リポジトリ内のファイルを更新しているクライアントからは明らかに変更されます。それらはバイナリであるので(ワード文書や図など)、それらをマージする必要はありません。たぶん私はこの問題を間違って説明したが、私ができることを望むのは、svnをマージしようとせず、バイナリファイルの最新バージョンを入手することだけだ。 – Mario

+0

これはまさにこの答えが説明するものだ。 --accept theirs-fullは、入ってくる変更があるときにローカルな変更をすべてスローします。つまり、修正されたWord文書があり、他の誰かがそれを変更してsvn update -acceptsをフルにした場合、あなたのバージョンは失われ、同僚のもので更新されます –

-1

これらのdllファイルは、実際のプロジェクトからの出力をビルドしていますか?

これが当てはまる場合、svnには入れないでください。 Subversionにはソースファイルが含まれていなければなりません。ビルドサーバー/ devボックスはそこからdllをビルドできます。

+2

私はむしろこれをトピックに残しておきます - 衝突したバイナリを防ぐ方法 – Mario

+0

必要がないときにビルド出力をバージョン管理しないことは、衝突したバイナリを防ぐための素晴らしい方法です。 サーバー上のコピーとコピーの両方が変更された場合、競合を防止することはできません。 –

1

ファイルがサーバー上で変更された場合、ローカルでは明らかに競合が発生します。もちろん、作業コピーを更新することは、バイナリファイルをリビジョンの一部として更新することを含みます。これはsvnがそれらをマージしようとしているわけではありませんが、間違いなく紛争が起こります。これらのファイルが頻繁に変更された場合、頻繁に生成されると思われます。そのようなファイルは、リポジトリに存在してはいけません。

リリースバイナリ(またはそれに類するもの)をアーカイブする必要がある場合は、これをタグまたはリリースブランチ上で行いますが、トランクでは実行しないでください。

+0

ソースにタグを付けることで、バイナリを再作成するだけで十分です。アーカイブバイナリは、ソース管理のためのタスクではありません。 –

+0

私はこの企業/マネージャーに完全に同意するが、異なる考え方をしているようだ。少なくとも私の経験から、したがってコメント。 – bluebrother

+1

コアライブラリを頻繁に再コンパイルしたくない場合があります。そのような場合、私はsvnにdllを入れることが理にかなっていると思います。 – Ryu

0

あなたはそれらをマージしようとしていますか? Subversionはそれらをマージする方法を知らないので(あなたはそれがとにかくやりたいとは思っていません)、あなたが葛藤しているように聞こえます。

ローカルに変更されたdllを持っていて、誰かが同じdllをコミットした場合、正確に何をしたいですか?何が起こると思いますか?これは明らかに矛盾であり、Subversionはあなたがあなたのdllまたはdllを使いたいかどうかを知りません。

+1

バイナリファイルなので、svnでそれらを更新したいと思っています。紛争も、合併も - 何もない。最新のものに交換してください。 – Mario

+0

その場合は、競合をチェックする事前コミットフックスクリプトを作成し、見つかった場合は最新のファイルを使用して解決します。 残念ながら私はフックスクリプトを書いたことがないので、私はそこに多くの助けをすることはできません。 –

+0

pre-commitフックスクリプトはこれを修正することはできません。これはサーバーサイドスクリプトであるためです。競合とマージは、クライアントで更新するときに発生します。 –

1

特定のファイルで同じ問題が発生しています。

CVSはこの問題を非常にうまく処理しますが、残念ながら私の会社はSubversionに移行しています。

特定の設定ファイルは、実行するたびに私たちのアプリによって変更されますが、開発者が新しい変更をチェックインするときには常にユーザーリポジトリをオーバーライドする必要があります。

.CVSwrappersファイルでは、*.fileext -k b -m COPYと入力します。これは、CVSがローカルリポジトリにファイルのバックアップコピーを作成し、競合が発生したときに新しいバージョンをダウンロードするように指示します。とてもエレガントです。

SVNの同等の設定はありません。誰かがどのように知っていたら、投稿してください。

関連する問題