84

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

私は答えを探しました:

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

編集:バリアント 4. 説明

4

3 に答える 3

63

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

于 2011-02-23T13:50:31.537 に答える
2

次の 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 つのブランチで変更されたすべてのファイルを競合としてマークし、最初は競合がなかったとしても解決します。

于 2018-08-14T09:13:52.830 に答える
0

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

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

あなたの場合、0 以外のステータスでマージ ドライバを終了すると、マージが手動で行われることが保証されます。

于 2012-11-16T12:10:18.760 に答える