9

最初に少し背景を説明します。

  • 私は自分の管理下ではなく、リモート SVN リポジトリの「ベース」コードを使用しています。コードは (まだ) タグ付けされていないので、常にトランクについていく必要があります。

  • いくつかの理由で (最も重要なのは、コードに対するローカル拡張が「ニッチ」な性質のものであり、コードが使用されているプロジェクトの特定の問題を解決することを目的としているということです) リモート リポジトリを使用できませんローカルで行った変更のバージョン管理を行います。

  • 現在「ローカル」バージョン管理を行っているローカル SVN リポジトリがあります。

私が直面している問題:コードを両方のリポジトリと同時に同期させる良い方法があるかどうかわかりません。つまり、"リモート" バージョン情報を (将来の変更にマージできるように) 保持したいのですが、同時に "ローカル" バージョン情報も (つまり、同じディレクトリ構造内に) 保持したいと考えています。 .

現時点では、2 つの異なるディレクトリを使用してこれを行っています。どちらにも同じコードが含まれていますが、それぞれに異なるバージョン情報が含まれています。特に 2 つのディレクトリ内のコードを個別に同期する必要があるため、明らかにこれはかなりのオーバーヘッドです。

Subversionでこれを行う方法はありますか? または、これにアプローチする別の方法について提案がありますか?

4

2 に答える 2

6

これは git svn を使用して行い、開発は git リポジトリで行いました。リモート開発は Subversion で行われます。Subversion リポジトリの git svn クローンを作成し、実際の git リポジトリにプッシュしました。cronjob は "git svn rebase && git push" を時々実行して、Subversion リポジトリの git ミラーを作成します。

サブバージョンの変更をマージするために、ローカルの git コピーに 2 つのリモートがあります。「ローカル開発」オリジンと「サブバージョン ミラーから」オリジンです。必要に応じて、Subversion ミラーからの変更を開発ツリーにマージできます。ローカルの変更は影響を受けず、別々に存在し、svn ミラーを台無しにしません。

私はgitosisを使用して、git リポジトリをセットアップおよび管理しました。手順は次のようになります (メモリから、間違っている可能性があります)。

# set up the mirror
git svn clone -s $SVN
git remote add origin git@$MACHINE:svnmirror.git
git push
# + cron job to do git svn rebase && git push every N hours/minutes

# set up the local working copy for development
git clone git://$MACHINE/svnmirror.git
# that's an anonymous, read only clone 
# no push to the svn mirror for developers - only cronjob user can push there
git remote add newproject git@$MACHINE:myproject.git
git push newproject
# now do the real deal
git clone git://$MACHINE/myproject.git
# hack hack hack
git push # origin master not needed
git remote add svnmirror git://$MACHINE/svnmirror.git
git merge svnmirror/master
git push
于 2008-11-26T14:19:43.047 に答える
3

すでに行っているように、変更をコミットするローカル リポジトリを用意できます。さらに、ベース トランクで行われた変更をローカル リポジトリにマージするために、ベース リポジトリから定期的にマージします。

唯一難しいのは、ベース リポジトリから既にマージしたリビジョンを追跡する必要があることです。

これは次のようになります。

svn merge -r X:Y baseRepositoryURL // merge from base repo
svn commit                         // commit the changes to local repo
svn merge -r Y:Z baseRepositoryURL // merge from base repo
svn commit                         // commit the changes to local repo

ここで、X は最初のチェックアウトのリビジョン、Y は最初のマージ時のヘッド リビジョン、Z は 2 回目のマージ時のヘッド リビジョンです。パターンがわかります。さらに、コマンドを発行するときは、ローカル チェックアウトのベース ディレクトリにいることが重要です。

于 2008-11-26T14:01:18.340 に答える