svn ブランチとタグを git-svn にインポートするにはどうすればいいですか? 質問する

svn ブランチとタグを git-svn にインポートするにはどうすればいいですか? 質問する

コミットしなければならない中央の SVN リポジトリがありますが、私は Git に情熱を持っています (私が知っている他の開発者と同様)。このケースはよく知られています。

それから、git-svn について読んで試してみました。完全な履歴は必要ないので、2 か月程度だけあればよいので、次のようにしました。

git svn clone -r 34000 -s https://svn.ourdomain.com/svn/repos/Project/SubProject

SubProject には、いつものように、サブディレクトリtrunktagsおよびがありましたbranches。すばらしい。

そして、最終改訂版を入手するために、私は

git svn rebase

いくつかダウンロードした後、素晴らしいです。最後のリビジョン、ログなど。さて、今度は機能ブランチに切り替えます。

$ git branch 
* master
$ git branch -r  
  trunk
$ git branch -a  
* master
  remotes/trunk

質問は、ブランチはどこにあるのか、何か間違ったことをしたのか、ブランチを新しい Git リポジトリに取り込むにはどうすればよいのか、ということです。

git-svn については、どこで読んでもブランチとタグを賢く処理していましたが、動作は期待したものではありませんでした。ありがとうございます!

編集: それができることを今知りましたgit svn fetch。しかし、すべてのリビジョンが取得されるため、それは好ましくありません。

ベストアンサー1

いくつかの手順が必要になります。

  1. 適切なトランク、ブランチ、タグのフォルダ名を指定して、SVN リポジトリを取得します。

    git svn init -t tags -b branches -T trunk https://mysvn.com/svnrepo
    git svn fetch
    
  2. svn のタグは実際のブランチなので、タグ ブランチから git タグを作成します。

    git for-each-ref --format="%(refname:short) %(objectname)" refs/remotes/tags |  cut -d / -f 3- |
    while read ref
    do
      echo git tag -a $ref -m 'import tag from svn'
    done
    
  3. タグブランチを削除する

    git for-each-ref --format="%(refname:short)" refs/remotes/tags | cut -d / -f 2- |
    while read ref
    do 
      echo git branch -rd $ref
    done
    
  4. 前の手順でマークされたタグはコミット「create tag」を指しているため、「実際の」タグ、つまり「create tag」コミットの親を導出する必要があります。

    git for-each-ref --format="%(refname:short)" refs/tags |
    while read ref
    do
      tag=`echo $ref | sed 's/_/./g'` # give tags a new name
      echo $ref -\> $tag
      git tag -a $tag `git rev-list -2 $ref | tail -1` -m "proper svn tag"
    done
    
  5. 今やるべきことは、古いタグを削除することだけです。

おすすめ記事