Subversionリポジトリから最後のn個のリビジョンをgit-svnで複製する方法は?


314

問題

Subversionリポジトリからgit-svnで浅いコピーをどのように作成しますか?たとえば、最後の3つのリビジョンのみをプルするにはどうすればよいですか?

git cloneコマンドは、オプションを使用する場合のGitリポジトリから最後のn個のリビジョンを取得することができ--depth、すなわちリポジトリの浅いコピーを取得します。例:

git clone --depth 3 git://some/repo myshallowcopyrepo

git-svnに同様のオプションはありますか?

これまでの私の発見

これまでのところ、プルするリビジョンは-rNどこにあるのかを見つけましたN。例:

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 .

ドキュメンテーション

git-clone

git-svn


6
:自分の質問に答える-s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.(しかし、私のために動作しませんでした)
セバスティアンGrignoli

どのようにハードそれが実現するだろう--depthためgit svnのサポートがすでに存在するため、。そして、それはすでにサーバーから最新のリビジョンを見つける必要がありますか?
Peter Cordes、2015年

回答:


238

-r$REV:HEAD)でクローンを開始するSVNリビジョン番号を指定することにより、Git-SVNで浅いクローンを指定する最も簡単な方法をすでに発見しました。

例えば: git svn clone -s -r1450:HEAD some/svn/repo

Gitのデータ構造は、有向非巡回グラフ(DAG)のポインターに基づいているため、nコミットをさかのぼって簡単です。ただし、SVN(したがってGit-SVN)では、自分でリビジョン番号を見つける必要があります。


5
将来の以前のリビジョンのクローンを継続したい場合はどうなりますか?
Zennichimaro 2013

5
@Zennichimaro:git-svn同じ場所に別のリモートポイントを追加し、を使用git-svn fetchしてツリーをさらに取得することで、これを行うことができます。その時点でgit filter-branch、古い(部分的な)ツリーの親を正しいブランチに再ペアレント化するために使用する必要があります。
ベンジャクソン

Paulは、SVNからGitへの増分移行(stackoverflow.com/questions/29161646/…)を実行して、最新のリビジョンを取得する方法はありますか
SabareeshSS

1
SVNは連続した整数を使用してリビジョンを識別し、nコミットをさかのぼることがさらに簡単になります...
harmic

-rの後にスペースがないと思います。たとえばgit svn clone -r 1133:HEAD some / svn / repoの場合
Gnana

92

私は以下を頻繁に使用して、巨大な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それを実行して、ブランチの最初の1つを見つけることです(実行時にリストされる最後のもの):

svn log --stop-on-copy svn://some/repo/branch/some-branch

これまでのところ、すべてのブランチを追跡するのにそれだけの価値がある面倒を実際に見つけていません。クローンを作成するには時間がかかりすぎて、svnとgitがうまく機能しません。私はパッチファイルを作成して、別のsvnブランチのgitクローンに適用する傾向があります。


1
私からの+1-エラー128の問題を回避するのに役立ちました。svnリポジトリ全体のクローンを作成していました
Ian Oxley

svn logコマンドはまさに私が探していたものです!ありがとう
mrbrdo 2013

1
私が使用するリポジトリには、非標準のブランチとレイアウトがあるため、通常、SVNブランチごとにローカルGitリポジトリを作成し、次にそれらの間にcherry-pick/を作成しますrebase。Commitは追加の手順を実行します(push、次にdcommitリモートリポジトリから)。ただし、トレードオフの価値があると思います。
クロノスプーン2013年

それについて考えていなかったので、あなたが言うように特定のタグ/ブランチをクローンするだけの方が速いかもしれません:)
VeenarM

34

... 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     

これで亀裂が発生します。私たちのリポジトリには約170,000のリビジョンがあり、単一のプロジェクトを実行するにはwaaaayに時間がかかりすぎます。リポジトリには10を超える特定のプロジェクトがあります。3〜4年の歴史だけを考えると。
VeenarM 2018

1
これを共有してくれてありがとう!
Kai Mechel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.