52

リポジトリを SVN リポジトリとして扱うと、次のようになります。

svn co http://myrepo/foo/trunk foo
...
foo/
  bar/
  baz/ -> http://myrepo/baz/trunk

それを Git リポジトリとして扱うと、次のようになります。

git svn clone http://myrepo/foo --trunk=trunk --branches=branches --tags=tags
...
foo/
  bar/

baz を別の場所にあるローカル マシンに複製して、シンボリック リンクを追加することはできますが、それは単なるハックです。git svn rebase他のすべてを更新するときに、それらの変更を自動的に取り込む方法はありsvn upますか?

4

8 に答える 8

26

私が見た svn externals を git-svn と統合する最良の方法は、このscriptです。これは、externals を .git_externals/ ディレクトリにクローンし、必要なシンボリック リンクと除外ファイルを作成します。これはシンプルで直接的な解決策だと思います。YMMV。

これは、git-svn で svn 外部を処理するための他のオプションの古い概要です。私には、それらは少し複雑すぎて、その後の Git の使用で壊れやすいように見えます。

于 2008-12-08T21:31:23.233 に答える
25

git-svn私が最終的に使用した解決策は、ローカルボックス上の他のクローンにシンボリックリンクすることでした。これは非常にうまく機能しました。変更をコミットして戻すことができ、プロジェクト A でローカルの変更を加えてプロジェクト B に取り込むことができます。

于 2009-01-23T18:47:45.377 に答える
6

svn:externalsルートディレクトリへの現在のすべてをチェックアウトしHEAD、それらをgitリポジトリから除外する短いスクリプトを作成しました。

に配置すると、または.git/hooks/post-checkoutなどの理由で作業ツリーが変更されるたびに、これらの外部チェックアウトが最新の状態に保たれます。git svn rebasegit-checkout

#!/bin/bash
set -eu

revision=$(git svn info | sed -n 's/^Revision: \([1-9][0-9]*\)$/\1/p')
git svn -r${revision} propget svn:externals | head -n-1 | {
    while read checkout_args
    do
        checkout_dirname=$(echo ${checkout_args} | cut -d' ' -f3)
        svn checkout ${checkout_args}
        if [ -z $(grep ${checkout_dirname} .git/info/exclude) ]
        then
            echo ${checkout_dirname} >> .git/info/exclude
        fi
    done
}
于 2011-11-07T17:45:02.183 に答える
4

これを行うスクリプト (Perl と Ruby の両方のバリアントが利用可能) も作成しました。これはhttp://github.com/liyanage/git-tools/にあります。

  • すべての svn:externals を再帰的にチェックアウトします
  • 大規模なリポジトリのクローンが途中で中止された場合に備えて、繰り返し実行できます。私にはたくさんのことが起こりました。中断したところから再開します。
  • 見つけて処理するすべての svn:externals エントリを .git/info/exclude に追加します
  • 遭遇したすべての svn:ignore エントリを .git/info/exclude に追加します
  • 最初の実行後に定期的に実行して、複製されたすべてのサブサンドボックスで svn:rebase を実行し、新しい外部と新しい svn:ignores を検出できます

更新: このスクリプトのメンテナンスは終了しました。SVN リポジトリを再帰的に複製および更新する機能、およびその他の git 関連機能は、私が積極的に維持しているこの新しいプロジェクトで利用できます: http://liyanage.github.com/git-tools/

于 2010-04-09T17:42:19.570 に答える
2

記録のために: 私はこの提案に従い、 SmartGitを使用してsvn:externals.

SmartGit は、私が今まで見てきた Git の GUI クライアントの中で群を抜いて最高です。に関してsvn:externalsは、それらを正しく取得するだけでなく、外部リポジトリの「高速スナップショット」(読み取り専用、HEAD のみのクローン) を実行するオプションも提供します。

残念ながら、商用利用は無料ではありません (そして、ライセンス価格が少し高すぎることがわかりました - はい、私は安っぽいです)。ただし、非営利目的であれば無料で使用できます。

于 2013-01-21T13:46:44.070 に答える
1

この python スクリプトを試してください https://bitbucket.org/nytmyn/gitsvnext/overview

svn externals をチェックアウトするには、git リポジトリで次のように実行します

python /../gitsvnext/run update

これを実行して、.git/info/exclude に何を入れるかを確認します

python /../gitsvnext/run list
于 2012-03-10T17:27:19.890 に答える
1

私は、これらすべてを処理する「単純な」perl スクリプトを作成することにしました。私は最近それを github に入れました。試してみてください

基本的に、見つかったすべての外部に対して git-svn clone を実行し、それらを再帰的に探し、クローンを作成し、適切な場所にそれらをシンボリック リンクし、すべての .git_externals ディレクトリとシンボリック リンクを除外して、引き続き「git svn dcommit」を使用できるようにします。

幸運を。

于 2009-08-18T16:37:35.497 に答える
1

これが私がやったことです。

まず、空の SVN リポジトリを作成しました (git と同じルートに):

svn checkout --depth empty http://path/to/repo .

これにより、git ルートに空の svn リポジトリが作成されました。ポイントは、SVN 外部プロパティが含まれていることです。

次に、外部のみをチェックします (PATH cygwin ツールに配置しました)。

svn propget svn:externals | sed -e 's/ / .\//' | sed -e 's/\'//g' | xargs -L1 svn co
于 2015-08-03T03:14:42.800 に答える