4

私と私の小さなチームは Git で作業し、より大きなグループは Subversion を使用しています。HEAD現在のリポジトリを毎時間 SVN リポジトリの特定のディレクトリに公開する cron ジョブをスケジュールしたいと思います。

私はこれを理解したと思っていましたが、以前に書き留めたレシピは現在機能していないようです:

git clone ssh://me@gitserver/git-repo/Projects/ProjX px2
cd px2
svn mkdir --parents http://me@svnserver/svn/repo/play/me/fromgit/ProjX
git svn init -s http://me@svnserver/svn/repo/play/me/fromgit/ProjX
git svn fetch
git rebase trunk master
git svn dcommit

私が試みたときに何が起こるかは次のとおりです。

% git clone ssh://me@gitserver/git-repo/Projects/ProjX px2
Cloning into 'ProjX'...
...

% cd px2

% svn mkdir --parents http://me@svnserver/svn/repo/play/me/fromgit/ProjX
Committed revision 123.

% git svn init -s http://me@svnserver/svn/repo/play/me/fromgit/ProjX
Using higher level of URL: http://me@svnserver/svn/repo/play/me/fromgit/ProjX => http://me@svnserver/svn/repo

% git svn fetch
W: Ignoring error from SVN, path probably does not exist: (160013): Filesystem has no item: File not found: revision 100, path '/play/me/fromgit/ProjX'
W: Do not be alarmed at the above message git-svn is just searching aggressively for old history.
This may take a while on large repositories

% git rebase trunk master
fatal: Needed a single revision
invalid upstream trunk

これは以前は機能していたと断言できましたが、誰か提案はありますか? ありがとう。

4

2 に答える 2

9

あなたのアプローチにはいくつかの問題があります:

  • 経由で初期化されたものではなく、既存の git リポジトリを使用しているようですgit svn init。リベースは共通の祖先を想定していますが、以前に を介して git リポジトリが初期化されていた場合git initgit svn init2 つ目のルート (つまり、親のない) コミットが作成され、1 つのティップから別のティップへのリベースは なしでは機能しません--onto
  • -sオプション to を使用すると、 、、およびgit svn initが検索されます。警告 ( ) に明確に示されているように、これにより、構成がサブディレクトリではなく svn リポジトリの先頭を指すようになります。branches/tags/trunk/Using higher level...git-svnfromgit/ProjX
  • trunkこのブランチが存在する正当な理由がないにもかかわらず、参照します。git svn initは実際に という追跡ブランチを作成しますremotes/git-svn

したがって、必要な実際のシーケンスは次のとおりです。

# 1st time only
svn mkdir --parents http://me@svnserver/svn/repo/play/me/fromgit/ProjX
mkdir px2
cd px2
git svn init http://me@svnserver/svn/repo/play/me/fromgit/ProjX
git svn fetch

git と svn で同時にハッキングできるようになりました。次にdcommitgit から svn に移行する場合は、次のようにするだけです。

cd px2
git svn rebase
git svn dcommit

すでに git リポジトリを初期化し、ハッキングを開始し、その履歴を svn に移植する必要がある場合、すべての git 履歴を svn に移植する必要があるため、初回のみの手順はより困難になります。 t 共通の祖先を共有する:

# 1st time only
svn mkdir --parents http://me@svnserver/svn/repo/play/me/fromgit/ProjX
git clone ssh://me@gitserver/git-repo/Projects/ProjX px2
cd px2
git svn init http://me@svnserver/svn/repo/play/me/fromgit/ProjX
git svn fetch

# transplant original git branch onto git-svn branch
root_commit=$( git rev-list --reverse HEAD | head -n1 )
git tag original-git
git reset --hard $root_commit
git reset --soft git-svn
git commit -C $root_commit
# N.B. this bit requires git >= 1.7.2
git cherry-pick $root_commit..original-git
# For older gits you could do
#   git rev-list $root_commit..original-git | xargs -n1 git cherry-pick
# or use git rebase --onto but that requires jumping through some
# hoops to stop moving remotes/git-svn.

その後、前と同じことを行いsvn rebaseますdcommit

サンドボックスでこのアプローチをテストしたい場合は、テスト スクリプトをダウンロードできます。ただし、実行する前に視覚的なセキュリティ監査を行うことをお勧めします;-)

于 2012-10-24T00:21:21.877 に答える
4

I 1は、問題をいくつかの問題に分割したいと思います。

  1. Git履歴を既存のSubversionリポジトリにインポートします。
  2. その後、GitリポジトリとSVNリポジトリの自動同期。

私の提案はSubGit2に基づいています

GitリポジトリをSVNにインポートする

  1. svnserverでSubversionリポジトリにローカルアクセスできる場合、セットアップは非常に簡単で、SubGitBookで十分に文書化されています。

    Subversionリポジトリが$SVN_REPOにあり、Gitリポジトリが$GIT_REPOにあると仮定します。まず、次のコマンドを実行します。

    $ subgit configure $SVN_REPO
    

    次に、生成された$ SVN_REPO / conf/subgit.confファイルを次のように調整します。

     [git "ProjX"]
         repository = $GIT_REPO
         translationRoot = /play/me/fromgit/ProjX
         trunk = trunk:refs/heads/master
         branches = branches/*:refs/heads/*
         shelves = shelves/*:refs/shelves/*
         tags = tags/*:refs/tags/*
    

    あなたの場合のtranslationRootオプションについてはよくわかりません。値はSVNリポジトリルートを基準にしたプロジェクトパスである必要があります。適切なパスを指定してください。

    他の「git」セクションを削除することを忘れないでください。そうすれば、SubGitはSVNリポジトリのそれらの部分をGitに変換しません。

    オプションで、$ SVN_REPO / conf / authors.txtファイルを調整して、Gitコミッター名をSVN作成者名に変換する方法を指定できます。

    SvnAuthor = Git Committer <git.committer@company.com>
    

    最後に、GitリポジトリをSVNにインポートします。

    $ subgit install $SVN_REPO
    

    現在、$SVN_REPOと$GIT_REPOには、SubGitによってインストールされた特別なフックがあります。SubversionサーバーとGitサーバーは、着信するすべての変更でこれらのフックをトリガーします。このようにして、SubGitはSVNリポジトリとGitリポジトリを自動的に同期します。作成されたミラーは双方向です。つまり、一部の開発者はSVNクライアントを使用し、他の開発者は任意のGitクライアントを選択できます。

    このような同期が必要ない場合は、無効にしてください。

    $ subgit uninstall [--purge] $SVN_REPO
    
  2. Subversionリポジトリへのローカルアクセスがない場合は、さらに注意が必要ですが、それでも可能です。

    まず、SVNリポジトリ全体をマシンにフェッチして、ローカルでアクセスできるようにします。

    $ svnadmin create repo
    $ svnrdump dump http://me@svnserver/svn/repo | svnadmin load repo
    

    ここで、フェッチされたリポジトリの最新リビジョンを覚えておいてください。

    $ svn info file:///path/to/repo
    Path: repo
    URL: file:///path/to/repo
    Repository Root: file:///path/to/repo
    Repository UUID: cbc56e97-717f-4d50-b705-cb6de2c836eb
    Revision: $LATEST_REVISION
    Node Kind: directory
    Last Changed Author: SvnAuthor
    Last Changed Rev: $LATEST_REVISION
    Last Changed Date: 2012-10-27 14:01:38 +0200 (Sat, 27 Oct 2012)
    

    次に、前の句のすべての手順を繰り返します。したがって、ローカルSVNリポジトリには、インポートされたGit履歴を後で保存する必要があります。

    最後に、生成された履歴をSVNに送り返します。

    $ svnsync initialize http://me@svnserver/svn/repo file://path/to/repo
    $ svn propset --revprop -r0 svn:sync-last-merged-rev $LATEST_REVISION http://me@svnserver/svn/repo
    $ svnsync synchronize http://me@svnserver/svn/repo
    

    svnsyncを機能させるには、リモートリポジトリでpre-revprop-changeフックを有効にする必要があることに注意してください。

GitおよびSVNリポジトリの自動同期

  1. Subversionリポジトリへのローカルアクセス権がある場合は、インストール後もSubGitを機能させ続けることができます。すでに述べたように、変更はリポジトリの1つに送信された直後に変換されるため、この場合はcronジョブを維持する必要はありません。

  2. SubversionリポジトリへのローカルアクセスがなくてもSubGitを使用したい場合は、svnsyncを使用して、svnserverでホストされているSVNリポジトリとSubGit3によって制御されているSVNリポジトリを同期することをお勧めします

    このHOW-TOには、このような種類のミラーのセットアップ方法に関するガイドがあります。

    この場合、プロジェクトには別のSubversionリポジトリが必要であることに注意してください。そうしないと、svnsyncを正しく機能させることが非常に困難になります。

  3. 何らかの理由でを使用することにしgit-svnた場合は、SubGitを使用してGit履歴をインポートした後、Subversionリポジトリの新しいクローンを作成することをお勧めします。

    $ git svn init -s http://me@svnserver/svn/repo/play/me/fromgit/ProjX
    $ git svn fetch
    

    私の経験から、Gitの履歴をSVNにインポートすることgit-svnは目的ではありません。反対側では、SubGitはそれをうまく処理します。

1完全開示:私はSubGit開発者の1人です。

2 SubGitは商用製品ですが、最大10人のコミッターがいる小規模チームは無料です。それはあなたの場合にも当てはまると思います。

3私たちのチームは、異なるホストにあるSVNリポジトリとGitリポジトリの同期をサポートするSubGit2.0に取り組んでいます。基本的に、どこにでもGitリポジトリを作成し、SVNURLを指定してSubGitをインストールできます。その後、これらのリポジトリのいずれかを操作できます—変更はそれらの間で自動的に変換されます。

その機能を備えたEAPビルドを公開する予定なので、すぐに試すことができます。

于 2012-10-27T22:56:46.923 に答える