web-dev-qa-db-ja.com

Git-選択したファイルでマージ競合と手動マージを強制する方法

共通のマスターブランチと、各インストールに1つずつある多数の並列ブランチを持つWebアプリケーションを保守し、それぞれに特定の変更はほとんどありません。ソースコードはgitで管理されており、機能とバグ修正をmasterブランチからパラレルブランチに転送する必要がある場合に最適なツールです。しかし、機密性が高く、自動マージが通常悪い結果をもたらすファイルはほとんどありません。そのため、何らかの方法でマークを付けることができ、マージのたびに手動マージを必要とする競合が発生する場合、マージははるかに簡単になります。

私は答えを探しました:

  1. 私は-no-commit-no-ffを使用していますオプションをマージしますが、同じではありません。
  2. Here および here 誰かが同じ質問をしますが、解決策はありません。
  3. 同様のケースは ファイルのマージを防ぐ方法 を含む.gitattributesの使用:somefile.php merge = ours競合を発生させたり、手動マージを強制したりするマージオプションを見つけようとしましたが、まだ見つかりませんでした。
  4. 次を含む.gitattributes:somefile.php -mergeは決して自動的にマージされないため、手動マージが強制されます。これは90%のソリューションですが、私が求めるのは、自動マージを試行し、成功するかどうかにかかわらず競合としてマークすることです。 しかし、これはこれまでのところ、ソリューションに最も近いです。(...説明のためにチャールズ・ベイリーに感謝...)
  5. 誰かがカスタムマージドライバー( 12 )を書くことを提案しますが、その方法は私には明らかではありません。

edit:バリアント4.説明

78
Stepan

オプション5のカスタムマージドライバーは、おそらく必要なものに最も近い方法です。驚くほど簡単です。以下は、あなたが望む行動にかなり近づけるべきだと思うものの例です。

まず、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に伝えました。明らかに、ファイルに適したパターンを使用する必要があります。

57
Dan Moulding

これらの2つのコマンドは、カスタムマージドライバーを使用するのと同じ効果があるようです。

git merge --no-commit your_target_branch
git checkout --conflict merge .   (do not forget the . and run it in the top dir of the repository)

最初のコマンドはマージコミットの作成前にマージを停止し、2番目のコマンドは2つのブランチで変更されたすべてのファイルを競合としてマークし、元々競合がなかったとしても解決します。

0
louisiuol

注:この記事「 POファイルのgitマージドライバーの作成 」は、ファイルを手動でマージするときに実行できる操作の種類を示しています。手動マージで特定のデータ準備完了。

git merge-file は、たとえば マージ前にファイルをDECRYPT(および再暗号化) (!)に使用できます

あなたの場合、0以外のステータスでマージドライバを終了すると、マージが手動のものになります。

0
VonC