2012-03-16 2 views
2

私は、フルプログラムが問題なく動作しているように見えるにもかかわらず、わずかなエラーがセキュリティ上の問題を引き起こす可能性があるという意味で脆弱なファイルがいくつかあります。結果として、私はgitがマージ中の自動修正の結果を常に検証するようにしたい。Git:「インタラクティブマージ」のリクエスト方法は?

私が正しく理解していれば、カスタムマージドライバは私が欲しいものです。私が理解した最高ののは、通常のマージ結果を取得するためにカスタムマージドライバでgit-merge-fileを使用し、結果を常に競合するものとしてマークするために終了することです。この方法でgitはマージ中に停止し、マージを完了する前にマージ結果を調べることができます。

しかし、そのファイルへの期待される変更は非常に少なく、 "git add -i"に似た何かを実行し、 "patch"を選択して一度に1つのハンクを適用するのが最善の方法です。

"git add -i"のように動作するマージドライバを、そのファイルへのすべてのマージのための簡単な方法がありますか?(適用する可能性のある塊は自動マージの結果です)?

また、正しく理解していれば、ファイルレベルの競合に対してのみマージドライバが呼び出されます。特別にマークされたファイルについて同様の手動検証を要求することは可能ですか?私はマージを行う前にgitattributesで新しいファイルを "壊れやすい"とマークし、次にいくつかのgitマージマジック(またはフィルタマジック)は私に、新しい特別なファイルがマージされたブランチに対しても問題ないことを確認するよう要求します。

+0

マージの差分を確認するのはなぜですか? – Mat

+0

私はそのようなマージが起こったときに自動リマインダーを持っていたいと思います。通常、マージ結果は自動テストおよび/またはビルドでテストできますが、壊れやすいものについては、確認のために追加のレビューが必要です。そのような特別なファイルに触れるものをチームメンバーがマージするたびに、そのようなレビューを強制したいと思います。 –

答えて

0

私の現在のソリューションは、私が探しているインタラクティブな解決策よりも優れているにもかかわらず、これを追加しています。以下の内容でファイルbin/merge-and-verifyを作成

  1. #!/bin/bash 
    # git merge driver that does normal merge but marks the result as conflicting 
    
    # make a copy of original version 
    cp "${1}" "${1}.tmp" 
    ORIG_HASH=$(git hash-object "${1}") 
    WORKFILE=$(git ls-tree -r HEAD | fgrep "$ORIG_HASH" | cut -b54-) 
    git merge-file -L "My version (working directory)" -L "Base (common ancestor)" -L "Merge head (remote change)" "${1}" "${2}" "${3}" 
    # display changes made 
    echo "-----------------------------------------------------" 
    echo "Making following changes automatically:" 
    echo "(Confirm changes with 'git add $WORKFILE')" 
    echo "-----------------------------------------------------" 
    diff -u --label "Original" "${1}.tmp" --label "Automatically modified" "${1}" 
    echo "-------------------------------------------------" 
    # remove our extra copy 
    rm -f "${1}.tmp" 
    exit 1 
    
  2. が作成/次のようにファイル `.gitattributesを変更します。

    [attr]FRAGILE merge=merge-and-verify 
    
    relative/path/to/fragile.file FRAGILE 
    
  3. 次のコマンドを実行するソリューションは、3つの部分から構成され作業ディレクトリのドライバを有効にする

    git config merge.merge-and-verify.driver "./bin/merge-and-verify %A %O %B" 
    
    今すぐ任意のファイルへの変更がFRAGILEは、自動マージの結果は、変更が正気を見れば変更(git add relative/path/to/fragile.file)を確認する方法についてのヒントを使用してコンソールに表示されます通常の自動マージになりますマーク

。マージ中に冗長出力をコンソールに表示する必要がない場合は、ドライバにgit merge-fileexit 1が必要です。

欠けている部分:ファイルの履歴に競合がない場合、gitの内部動作により、マージドライバは呼び出されません。たとえば、新しいFRAGILEファイルがmasterにマージされた別のブランチに追加された場合、マージドライバは呼び出されません。これは、ファイルをマージする必要がないからです(gitが知っている限り、ブランチをマージするだけです)何かと矛盾しない新しいファイルは、マージドライバの必要はありません)。

+0

他の誰かがすでに同じことを考えていたようです。残念ながら、私は自分で同じことをする前にそれについて知りませんでした。詳細については、http://stackoverflow.com/questions/5074452/git-how-to-force-merge-conflict-and-manual-merge-on-selected-file?lq=1を参照してください。 –

関連する問題