5

この奇抜な(ばかげた?)アイデアを頭に浮かびました。そこでは、GitとSubversionの両方で同じフォルダー(プロジェクト)を同時に追跡することを考えました。つまり、フォルダ/プロジェクトには.svn.gitディレクトリの両方が含まれます。

検索に関連するものが見つからなかったので、ここでアイデアを投げて、その長所と短所(ある場合)を評価します。私がおそらく探しているのは、なぜこの戦略を使用できない、または使用すべきでないのかということです。

Q:なぜこれをしたいのですか?

ネットワーク上にはすでにSubversionリポジトリがあり、1年以上の履歴+ svn:externals+バグ追跡+フックにリンクされています。しかし、GitなどのDVCSの柔軟性を持たせたいので、作業をコミットするためにネットワークに接続する必要はありません。リモートで作業できるようにします。

Q:しかし、私はgit svnを使用できます!

残念ながら、Git svnはsvn:externalsをサポートしていません。また、gitサブモジュールはsvn:externalsと同じではありません。

Q:この組み合わせで何が達成できますか?

Gitの柔軟性:ネットワークに接続しなくても、コードをローカルで編集およびコミットできます。また、リポジトリを本番サーバーまたはステージングサーバー、あるいは同僚にプッシュするのは簡単なことです。

SVNの集中化と外部リポジトリの利用: SVN:externalsを効果的に利用することで、多くの作業を節約でき、開発者はすでにSVNに精通しています。

理想的には、最終的にGitに完全に切り替えたいと思いますが、今のところ、svn:externalsを使用すると外部リポジトリを非常に簡単に統合できるため、Subversionをそのまま維持することは理にかなっています。

4

3 に答える 3

5

この戦略は絶対に機能します。かなり短い時間ではありますが、私はそれを使用しました。私の会社の他の開発者がそれを長期間使用していることを知っています。しかし、それはそれが簡単だという意味ではありません。

SubversionとGitの同期を維持するには、多くの作業を行う必要があります。簡単な例として、を実行するときsvn updateは、または同様のことも実行する必要があります。そうしないgit commit -aと、Gitは、作業コピーに、Subversionがリモートリポジトリで最新であると認識している変更がたくさんあると見なします。

svn update -r何らかの理由で古いリビジョンを確認する必要がある場合、またはなどを試す必要がある場合、これははるかに複雑になりますsvn switch

Gitが.svnディレクトリを追跡しているかどうかによっては、他の問題が発生します。そうしないと(つまり、ファイルなどを入れる.svn.gitignore)、Gitの分岐機能を使用するのがはるかに難しくなります。次のワークフローを検討してください。

  1. 機能に取り組むためのGitブランチを作成します。
  2. 修正する必要のあるSubversionリポジトリに最近チェックインされたバグがあります!メインのGitブランチに戻りsvn upgit commit最新のコードを入手してバグを修正しgit commitますsvn commit
  3. Git機能ブランチをもう一度チェックアウトしてください。これは別のSubversionリビジョンに基づいているため、Subversionは、作業コピーに大量の変更があると見なすようになりました。

または、Gitに.svnディレクトリを追跡させることもできます。これにより、上記の問題を回避できます。手順3で機能ブランチを再度チェックアウトすると、その時点からSubversionメタデータもチェックアウトされるため、Subversionはすべてが基づいている正しいリビジョンを認識します。

悲しいことに、Subversionはこのように使用されるようには設計されていません。Subversion 1.6(1.7についてはわかりません)では、.svnディレクトリに重要な空のフォルダが含まれている可能性があります。Gitは空のフォルダーを追跡しないため、Git操作の間にこれらのフォルダーが失われ、Subversionの作業コピーが破損する可能性があります。私は、そのような壊れたディレクトリを修正するためにたくさんのスクリプトを書いた開発者を知っています.svnが、それは些細なことではなく、非常に壊れやすいものです。

于 2013-01-24T17:47:31.663 に答える
1

GitとSvnは非常に簡単にディレクトリに住むことができます。.gitignoreではすべての.svnディレクトリを無視し、svnでは.gitディレクトリを無視します。私は以前、SVNが不要であることに気付くまでそれを使用していました。

于 2013-01-24T12:41:47.157 に答える
1

競合は発生しないと思いますが、SVNリポジトリにはGITリポジトリのコミットが含まれていません。

例:

オフラインの間、開発者はGITで説明的なコミットメッセージを使用して5つのコミットを実行します。
これで、SVNがオンラインに戻り、変更をSVNに保存したいと考えています。彼は今、より説明の少ないメッセージで単一のコミットを行うか、作業コピーをそれらの特定のコミットにリセットし、それぞれをSVNにコミットすることによってgitにしたコミットを繰り返す必要があります。

于 2013-01-24T12:11:07.203 に答える