問題
Subversionリポジトリからgit-svnを使用して浅いコピーを作成するにはどうすればよいですか?最後の3つのリビジョンのみをどのようにプルしますか?
git clone
コマンドは、オプション--depth
を使用すると、Gitリポジトリから最新のn個のリビジョンを取得できます。つまり、リポジトリの浅いコピーを取得できます。例:
git clone --depth 3 git://some/repo myshallowcopyrepo
Git-svnに同様のオプションはありますか?
これまでの私の発見
これまでのところ、N
がプルするリビジョンである-rN
オプションのみを見つけました。例:
git svn clone -rN svn://some/repo
ドキュメントによると、-r$REVNUMBER:HEAD
を使用する可能性があります。エラーメッセージを返した最新の3つのリビジョンを取得するために、次のことを試みました。
$ git svn clone --prefix=svn/ -s -rHEAD~3:HEAD http://some/svn/repo .
revision argument: HEAD~3:HEAD not understood by git-svn
したがって、HEAD~3
を3番目で最後のリビジョン534の実際の番号に置き換えました。これは機能しましたが、3番目で最後のコミットのリビジョン番号を最初に把握する必要があります。
$ git svn clone --prefix=svn/ -s -r534:HEAD http://some/svn/repo .
ドキュメント
クローンを開始するSVNリビジョン番号(-r$REV:HEAD
)を指定することにより、Git-SVNで浅いクローンを指定する最も簡単な方法を既に発見しました。
例:git svn clone -s -r1450:HEAD some/svn/repo
Gitのデータ構造は、有向非巡回グラフ(DAG)のポインターに基づいているため、n
コミットをさかのぼることは簡単です。ただし、SVN(およびGit-SVN)では、自分でリビジョン番号を見つける必要があります。
巨大なSubversionツリーから限られた数のリビジョンを取得するために頻繁に以下を使用していることに気づきます(svnリビジョン35000に近づいています)。
# checkout a specific revision
git svn clone -r N svn://some/repo/branch/some-branch
# enter it and get all commits since revision 'N'
cd some-branch
git svn rebase
そして、ブランチがどこから始まったのかを知る良い方法は、svn log
itを実行し、ブランチの最初のもの(実行時にリストされた最後のもの)を見つけることです:
svn log --stop-on-copy svn://some/repo/branch/some-branch
これまでのところ、すべてのブランチを追跡するのに価値のある面倒を本当に見つけていません。クローンを作成するのに時間がかかりすぎ、svnとgitが一緒にうまく動作しません。パッチファイルを作成し、別のsvnブランチのgitクローンに適用する傾向があります。
... 7年後、砂漠でタンブルウィードが吹く...
受け入れられた答えに満足できなかったので、これを行うためのスクリプトをいくつか作成しました Githubで利用可能 。これらは、git svn clone
を使用したいが、リポジトリ全体を複製したくなく、履歴の途中から特定のリビジョンを複製したくない場合に役立ちます(多くのリポジトリを複製している場合があります) 。ここでは、最新のN個のリビジョンを複製できます。
git svn clone
を使用して、最新の50リビジョンを複製します
# -u The SVN URL to clone
# -l The limit of revisions
# -o The output directory
./git-svn-cloneback.sh -u https://server/project/trunk -l 50 -o myproj --authors-file=svn-authors.txt
SVNリポジトリから以前のNリビジョンを見つける
# -u The SVN URL to clone
# -l The limit of revisions
./svn-lookback.sh -u https://server/project/trunk -l 5