1. ホーム
  2. svn

[解決済み] gitでマージした後にgit-svnでdcommitするのは危険ですか?

2022-06-18 20:07:20

質問

git-svn を試してみようと思った動機は、マージとブランチが簡単にできることです。そして、man git-svn(1) に書いてあることに気づきました。

dcommit する予定のブランチに対して git-merge や git-pull を実行することは推奨されません。 を実行することはお勧めできません。Subversion は、合理的で有用な方法でマージを表現しません。 そのため、Subversion を使用しているユーザーは、あなたが行ったマージを見ることができません。 を使用しているユーザーは、あなたが行ったマージを見ることができません。さらに、SVG のミラーブランチである git ブランチからマージしたりプルしたりすると、dcommit は間違ったブランチにコミットしてしまうかもしれません。 は間違ったブランチにコミットしてしまうかもしれません。

これは、svn/trunk (またはブランチ) からローカルブランチを作成し、ハックして svn/trunk にマージし、それから dcommit できないということですか? 1.5.x以前のsvnでのマージが常にそうであったように、svnユーザーは同じ混乱を見ることになると理解していますが、他の欠点はありますか?最後の文は私も心配です。人々は日常的にこの種のことを行っているのでしょうか?

どのように解決するのですか?

実は、もっといい方法を見つけたんです。 --no-ff オプションでさらに良い方法を見つけました。 以前使っていたスカッシュのテクニックはもう必要ないのです。

私の新しいワークフローは以下のようになりました。

  • 私がコミットする唯一のブランチである "master" ブランチと、SVN リポジトリをクローンする ( -s リポジトリに標準的な SVN レイアウトがあると仮定します。 trunk/ , branches/ そして tags/ ):

    git svn clone [-s] <svn-url>
    
    
  • 私はローカルブランチ "work"で働いています( -b はブランチ "work" を作成します)

    git checkout -b work
    
    
  • work"ブランチにローカルにコミットする ( -s でコミットメッセージの署名をします)。続いて、3つのローカルコミットを行ったとします。

    ...
    (work)$> git commit -s -m "msg 1"
    ...
    (work)$> git commit -s -m "msg 2"
    ...
    (work)$> git commit -s -m "msg 3"
    
    

SVNサーバーにコミットします。

  • [最終的には] SVN サーバーにコミットされたくない変更を隠しておく (コンパイルを加速して特定の機能に集中したいので、メインファイルでいくつかのコードをコメントしたことがよくあります)

    (work)$> git stash
    
    
  • masterブランチをSVNリポジトリで再ベースする(SVNサーバーから更新する場合)。

    (work)$> git checkout master
    (master)$> git svn rebase
    
    
  • 作業用ブランチに戻り、masterでリベースする

    (master)$> git checkout work
    (work)$> git rebase master
    
    
  • などを使って、すべてがうまくいっていることを確認します。

    (work)$> git log --graph --oneline --decorate
    
    
  • さて、いよいよ "work" ブランチの 3 つのコミットをすべて "master" にマージする番です。 --no-ff オプションを使用します。

    (work)$> git checkout master
    (master)$> git merge --no-ff work
    
    
  • ログの状態に気づくことができます。

    (master)$> git log --graph --oneline --decorate
    * 56a779b (work, master) Merge branch 'work'
    |\  
    | * af6f7ae msg 3
    | * 8750643 msg 2
    | * 08464ae msg 1
    |/  
    * 21e20fa (git-svn) last svn commit
    
    
  • ここで、おそらくあなたは( amend を編集したいと思うでしょう (さもなければ、彼らは "ブランチ 'work' をマージする " というメッセージを含む単一のコミットしか見ることができません)。

    (master)$> git commit --amend
    
    
  • 最後にSVNサーバーにコミットする

    (master)$> git svn dcommit
    
    
  • 仕事に戻り、最終的には隠したファイルを復元する。

    (master)$> git checkout work
    (work)$> git stash pop