"git svn clone"の後に、私はまだ素晴らしいブランチマージコミットがありませんか?

私は git svn clone --stdlayout ... をやった後、すべてがうまく見え、リモートブランチを変換しました。しかし、 git log --graph を実行すると、グラフをマージするブランチが表示されません。それは普通ですか?

2
私は本当にマージをサポートしているsvnを使用していませんでしたが、はい、これは正常です。
追加された 著者 Michael Krelin - hacker,

3 答え

2008年の夏にバージョン1.5.0がリリースされて以来、Subversionはマージトラッキングをサポートしています。 Subversionは、 ^/trunk/やその他のディレクトリのようなブランチディレクトリである、マージ対象に設定された svn:mergeinfo プロパティとして実行されたマージに関する情報を保持します。

GitとSubversionのマージトラッキングメカニズムには大きな違いがあります。

  1. The whole branch merge.

    When you're on master branch, the command

    $ git merge some-branch
    

    results in a merge commit with its first parent set to the commit referenced by master and the second parent set to the commit referenced by some-branch (I don't take into account fast-forward and conflicted merges here).

    For git it means that created merge commit includes the whole history of both master and some-branch.

    When you've checked out ^/trunk/ branch into svn working copy and then run

    $ svn merge ^/branches/some-branch trunk-working-copy
    

    Subversion will set svn:mergeinfo property on trunk-working-copy directory as follows:

    /branches/some-branch:10-20,30-40,50-60
    

    The range 10-20,30-40,50-60 includes those revisions which are not yet merged into ^/trunk/ branch from ^/branches/some-branch/ (Subversion detects them automatically).

    Mergeinfo property just specifies those revisions which were once merged into the branch. And it's up to user to check whether all these merged revisions include the whole history of the branch.

  2. Cherry-pick merge.

    When you need to merge changes from a single commit into your master branch, you run

    $ git cherry-pick bc347a8
    

    After that git creates a commit with corresponding changes and a single parent set to the commit previously referenced by master branch.

    That is, git doesn't create any kind of merge commit for cherry-pick. So, git has no means to track cherry-picked commits via its graph structure.

    Opposite to that Subversion does track cherry-pick merges by adjusting svn:mergeinfo property with respect to cherry-picked revision:

    $ svn merge -c100 ^/branches/some-branch trunk-working-copy
    

    This command is quite straight-forward, it adjusts svn:mergeinfo as follows:

    /branches/some-branch:100
    

    That means Subversion tracks cherry-pick merges.

したがって、翻訳後にマージコミットを取得することはありません。私の最善の知識には、git-svnには歴史をマージする際にいくつかの問題があります。

しかし、Subgit開発者として、私はsubgitがマージトラッキング情報を正しく処理する必要があると言わなければなりません。ブランチに設定されている svn:mergeinfo プロパティには、それらにマージされたブランチの履歴全体は含まれていない可能性があります。それが起こる可能性がある方法は次のとおりです:

  • You have used old svn client (< 1.5), so your branches don't have enough merge-tracking information.
  • You have performed cherry-picks and skipped some revision ranges from adding into svn:mergeinfo.
  • You have svn:mergeinfo set on directories which are not branch directories, i.e. they are not ^/trunk/, ^/branches/some-branch, etc (for standard layout).

この問題を解決するには、スキップされたマージトラッキング情報の一部を見つけて、ブランチに追加する必要があります。

  1. Try to find which revision are not yet merged:

    $ svn mergeinfo --show-revs eligible ^/branches/some-branch/@HEAD ^/trunk/@HEAD
    

    The output must include all the revision you haven't yet merged from ^/branches/some-branch/ to ^/trunk/.

  2. Try to merge not yet merged revisions by svn.

    • If you think all changes are already merged, use --record-only option of svn merge command;
    • If you're not so sure, it's better to perform normal svn merge which will apply all the missing changes.
  3. Using subgit you can also merge by git means and then push created merge commits to subgit powered repository, so it will translate these merge commits to svn revisions with correct svn:mergeinfo.

素晴らしいボーナスとして、マージトラッキングのものに関連する SubGitの仕様を参照することができます。私が上で言ったすべてのためのいくつかの美しい図があります。

5
追加された

Subversionは、svn:mergeinfoプロパティの助けを借りてマージを追跡します。履歴は、ツールによってグラフとして表示されない場合がありますが、その性質上線形ではありません。実際にはsvn:mergeinfoはGitのマージコミットよりも強力です(このパワーは実用的でないかもしれませんが)

可能な場合、 SubGit のようなツールはsvn:mergeinfoをマージコミットに変換します。

私が推奨しているツール(SubGit)に取り組んでいますが、本当にgit-svnは両方向のマージを翻訳するのに非常に弱いです。

1
追加された
それは私がこの問題にSubGitを使用しようとすることができるということですか?どうやってするか?
追加された 著者 Drake Guan,
私は試してみましたが、木のようなものではなく、まっすぐなコミットログを得ました...
追加された 著者 Drake Guan,
@DrakeGuan SubGitをSubversionリポジトリにインストールする場合は、 SubGit を試してみてください。SubGitはサーバー側で動作します。 SubGitをインストールするには、サーバー側に subgit install repos を実行します。 SubGitがインストールされるとすぐに、 git clone ssh:// user @ host/svn/repos などのgitを実行するだけです。詳細な設定例については、SubGitサイトのドキュメントを参照してください。
追加された 著者 Alexander Kitaev,

git-svnを使うと、SVN自体が線形履歴を持っているという事実は変わらないので、技術的にすべてのマージは早送りです。マージはコミットされないため、グラフにもマージはありません。

0
追加された
Subversionは、svn:mergeinfoプロパティの助けを借りてマージを追跡します。履歴はグラフとして表示されないかもしれませんが、性質上線形ではありません。
追加された 著者 Alexander Kitaev,