2

私はgit-svnしばらくの間、会社のsvnリポジトリとの通信に大きな問題を起こすことなく使用してきました。

今日、「頭痛」の部分は劇的に変化しました。
私はmaster/trunkかなり排他的に取り組んでおり、これらの変更セットのほとんど(すべてではありません!)を既存のsvn-branchにマージする必要がありました。 svn-branch。

基本的にこれ:

-----------1--1-----1--------1--1--1---  master/trunk
 \
  \
   2--2--2--2--2                                        versioned-release

これになるべきだった:

-----------1--1-----1--------1--1--1---  master/trunk
 \
  \
   2--2--2--2--2                                        versioned-release
                         \
                          \
                           1--1--1--1--1--1           new-versioned-release

に含めるべきではないコミットと、それぞれのブランチからの必要なコミットはどこにnew-versioned-releaseありxますかx

だから私は次のことをしました:

  1. git checkout -b versioned-release-svn remotes/versioned-release
  2. git svn branch new-versioned-release -m "Preparing for merge of XXX"
  3. git checkout -b new-versioned-release-svn remotes/new-versioned-release
  4. git cherry-pick ...毎回1、途中で競合を解決します。

リポジトリの正しいブランチを実際にターゲットにすることを確認したかったので、実行しましgit svn dcommit --dry-runたが、エラーや警告は発生しませんでしたが、教えてくれました…</ p>

Committing to svn://username@$repo-host/$repo-name/$path/branches/new-versioned-release ...

…その後にdiff-tree数行が続きます。

--dry-runだから私はコミットの途中で 省略しようとしましたが…</p>

Item already exists in filesystem: File already exists: filesystem '/data/subvroot/$repo-name/db', transaction '20856-g3m', path '/$path/branches/new-versioned-release/some-directory' at /usr/libexec/git-core/git-svn line 862

…そしてステージングされていない変更の束。

明らかなことは別として—「WTF?!?」そして、「私がしたことすべてを失うことなく、どうすればこの混乱から抜け出すことができますか?」—2つの質問があります。

  1. 以前に戻ったと仮定するとgit svn dcommit、ローカルブランチのdcommitを計画された目的地に移動するにはどうすればよいですか?
  2. 今では、これが私が望んでいたことを達成するための正しい方法ではなかったことは明らかなようです…しかし、代わりに、どのようにそれを行うべきでしたか?

エラーメッセージで見つけたものはすべて、どういうわけか私の状況に似ていましたが、これまでのところ、この他のスタックオーバーフローの質問であり、「メタデータディレクトリを吹き飛ばす」という提案された解決策は私に.git/svnはあまり共鳴ません… </ p>

4

1 に答える 1

0

誰かが私の古い質問に賛成票を投じたので、今日のやり方を共有したいと思いました。

それは本当にうまく機能します。

を使用して git リポジトリが作成されていると仮定します。

git svn clone \
    --prefix svn/ \
    --stdlayout \
    svn://username@$repo-host/$repo-name/$path
    $git_repo_name

gitリポジトリに変更し、そこで実行します

git checkout svn/versioned-release
git svn branch new-versioned-release

これにより、SVN サーバーで次の履歴が作成されます。

-----------1--1-----1--------1--1--1---  trunk
 \
  \
   2--2--2--2--2                                        versioned-release
                          \
                           \
                            3⭐️                                    new-versioned-release

今、私は走るだろう

git checkout svn/new-versioned-release
git checkout -b new-versioned-release

# resulting in the following **local** history:
#
# -----------1--1-----1--------1--1--1---  master (tracks 'svn/trunk')
#  \
#   \
#    2--2--2--2--2--3⭐️                         new-versioned-release (tracks 'svn/new-versioned-release')

これは、私が望んでいたことを達成するための基盤です。

SVN での分岐は Git と同じようには機能しないため、追加のコミットが 1 つあり3⭐️ます。それは本当に問題ではありませんが、そこにあります。

git cherry-pickすべてのsを実行できるようになり1、最終的にこのローカル ヒストリーが作成されます。

-----------1--1-----1--------1--1--1---  master (tracks 'svn/trunk')
 \
  \
   2--2--2--2--2--3⭐️--1--1--1--1--1--1  new-versioned-release (tracks 'svn/new-versioned-release')

gitにgit svn dcommit座っているnew-versioned-releaseと、SVN サーバーの履歴は、私が最終的に望んでいたもののように見えます。

-----------1--1-----1--------1--1--1---  trunk
 \
  \
   2--2--2--2--2                                        versioned-release
                          \
                           \
                            3⭐️--1--1--1--1--1--1    new-versioned-release

唯一の違いは3⭐️、3 番目の SVN ブランチを作成することからの追加です。

于 2014-08-21T07:35:14.920 に答える