1. ホーム
  2. git

[解決済み] Git - 選択したファイルに対して強制的にマージの競合と手動マージを行う方法

2023-06-06 17:53:34

質問

私たちは、共通のmasterブランチと、インストールごとに1つずつ、それぞれいくつかの特定の変更を持つ多くの並列ブランチを持つWebアプリケーションを管理しています。ソース コードは git で管理されており、master ブランチから並列ブランチに機能やバグ修正を転送する必要がある場合には、git は素晴らしいツールです。しかし、いくつかのファイルは機密性が高く、自動マージは通常悪い結果をもたらします。そこで、それらに何らかのマークを付けて、マージのたびに衝突が発生し、手動でマージが必要になるようにできれば、マージがずっと楽になります。

私は答えを探しました。

  1. 私は --no-commit --ノー・オフ のマージオプションがありますが、同じではありません。
  2. ここで ここで で、誰かが同じ質問をしていますが、解決策はありません。
  3. 似たようなケースは ファイルがマージされるのを防ぐ方法 を含む.gitattributesを使用しています。 somefile.php merge=ours . 衝突を発生させたり、強制的に手動でマージするようなマージオプションを探したのですが、今のところ見つかりませんでした。
  4. .gitattributesを含む。 somefile.php -merge は自動でマージされないため、手動でのマージを余儀なくされています。90%の解決策ですが、私が求めているのは、自動マージを試して、それが成功するかどうかに関係なく、衝突としてマークすることです。 でも、これが今のところ一番解決に近いです。 (...明確にしてくれた Charles Bailey に感謝します...)
  5. 誰かがカスタムマージドライバを書くことを提案しています ( 1 , 2 ) を使用することができますが、それをどのように行うかは、私には明確ではありません。

を編集してください。 変形4.説明

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

オプション 5、カスタム マージ ドライバーは、おそらくあなたが望むものに最も近づく方法です。これは驚くほど簡単です。以下は、希望する動作にかなり近づくと思われる 1 つの例です。

まず、マージドライバスクリプトを作成します。 merge-and-verify-driver . このスクリプトを実行可能にして、適当な場所に置きます (このスクリプトをリポジトリにチェックインすることを検討してもよいでしょう。リポジトリの設定ファイルがこれに依存することになりますから)。Gitはこのシェルスクリプトを実行して、機密ファイルのマージを実行します。

#!/bin/bash
git merge-file "${1}" "${2}" "${3}"
exit 1

これは、Git自身が通常行うデフォルトのマージの動作を行うだけです。重要な違いは、スクリプトが常にゼロ以外を返すことです(たとえマージが実際にコンフリクトなしで解決されたとしても、コンフリクトがあったことを示すために)。

次に、カスタムマージドライバーの存在をGitに伝える必要があります。これを行うには、リポジトリの設定ファイル ( .git/config ):

[merge "verify"]
        name = merge and verify driver
        driver = ./merge-and-verify-driver %A %O %B

この例では merge-and-verify-driver をレポのトップレベル・ディレクトリ ( ./ ). スクリプトのパスは適宜指定する必要があります。

あとは、ファイルをマージするときにカスタム マージ ドライバーが使用されるように、機密ファイルに適切な属性を与えるだけです。これを .gitattributes ファイルに追加します。

*.sensitive merge=verify

ここでは、パターンにマッチする名前を持つすべてのファイルが *.sensitive というパターンにマッチする名前のファイルはすべてカスタムマージドライバを使用するように Git に伝えています。もちろん、あなたのファイルに適したパターンを使用する必要があります。