web-dev-qa-db-ja.com

git-svnを使用してsvn:externalを最新の状態に保つにはどうすればよいですか?

リポジトリを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がそれらの変更を自動的に取得する方法はありますか?

51
James A. Rosen

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

23
James A. Rosen

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

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

24
Paul

私もこれを行うスクリプト(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/

4
Marc Liyanage

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

これを.git/hooks/post-checkoutに配置すると、たとえばgit svn rebaseまたはgit-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
}
4
tuomasjjrasanen

参考までに、私は this の提案に従い、svn:externalsを扱うために SmartGit を使用してみました。

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

残念ながら、商用利用は無料ではありません(そして、ライセンス価格が少し高すぎることに気付きました-はい、私は安いスケート選手です)。ただし、非営利目的では無料で使用できます。

2
rsenna

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

最初に、空のSVNリポジトリ(gitと同じルート用)を作成しました。

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

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

次に、外観のみを確認します(PATH cygwinツールに配置しました)。

svn propget svn:externals | sed -e 's/ / .\//' | sed -e 's/\'//g' | xargs -L1 svn co
1
TCS

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

svn externalsをチェックアウトするには、gitリポジトリで以下を実行してください

python /../gitsvnext/run update

これを実行して、.git/info/excludeに何を置くかを知ってください

python /../gitsvnext/run list
1
opekar

私はこのすべてのものを処理するために「単純な」Perlスクリプトを書くことにしました。私は最近それをgithubに置きました、それを試してみてください、多分それは役立つでしょう http://github.com/sushdm/git_svn_externals/

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

幸運を。

1
Dmitry