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


83

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

私は答えを探しました:

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

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


6
これはあなたが探している正確な答えではありませんが、同じ理由で私がgit fetch最初に行い、次にを使用するgit difftool <file> FETCH_HEADので、リモートブランチの変更をローカルに手動で適用できます。
MHC

MHC:これは素晴らしいトリックです(特に、各並列ブランチのスクリプトに保存され、ファイルが自動マージされないようにする場合)。主な欠点は、チームワークフローでは、誰かがこの手順を忘れて、代わりに通常のマージを行う可能性があることです。
ステパン

2
設定-mergeはファイルのマージを妨げるものではなく、mergetoolなどを使用して手動でマージすることを強制するだけです。これはあなたが必要なものではありませんか?
CBベイリー

それは私が欲しいものの90%です。マージが自動的に行われるようにしたいのですが、この機密ファイルの場合、マージがない場合でもマージは競合と見なされるため、毎回手動チェックが強制されます。
ステパン

@Stepan私も同じような状況にあるので、何かを明確にしたい。であなたが言っていることは何も-merge.gitatttributes git mergeません、そしてすべての仕事はマージツールでダウンしなければなりませんか?したがって、マージツールで使用する<<<<< ===== >>>>はありませんよね?そして、ダンのソリューションはこれを提供しますか?
ネロはGRIS

回答:


60

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


この詳細なガイドをどうもありがとう!
ステパン

13
マージドライバは「明らかな」ソリューションでは呼び出されていないようです。たとえば、ファイルが1つのブランチでのみ変更され、マージを実行した場合、「機密」ファイルは上書きされ、マージドライバーは呼び出されません。それを修正する方法はありますか?
VitalyB 2013

これは本当に@VitalyBが示唆するように動作しますか?ありがとう!
filippo 2013

1
これは機能しますが、これをマシン上のすべてのリポジトリでグローバルオプションにする方法はありますか?また、コマンドラインで呼び出す方法はありますか?コマンドラインでマージ戦略を変更するのと同じくらい簡単な方法でこれを行う方法があればいいのにと思います。
user1748155 2014年

4
@VitalyBコメントに追加します。両方のブランチがファイルに同じ変更を加えた場合も、マージは表示されません。たとえば、両方のブランチでバージョンが1増加し、マージしようとしているときに2増加したいとします...非常に実用的な問題ですが、まだ解決されていません。:(
VasiliNovikov 2015

1

これらの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つのブランチで変更されたすべてのファイルを競合としてマークします。


私は「1回限りの」解決策のアイデアが好きです(私はちょうどそのようなケースに遭遇しました)が、これは私にとってはうまくいきませんでした。GitはFFを実行したため、マージが不良になりました(基本的にはマージでした)。
ネロはGRIS

@Nerogris確かに、早送りマージでは機能しません。--no-ffオプションはいつでも追加できますが、マージの2つのブランチのいずれかで共通の祖先からの変更がないため、2番目のコマンドは競合を生成しません。
louisiuol 2018

グローバル設定でffをfalseに設定しました。FFマージだと言ったとき、Gitにそうしないように言わなかったら、そうするだろうということです。
ネロはGRIS

0

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

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

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


2
「POファイルのドライバーをマージする」リンクについて詳しく教えてください。アクセスが拒否されたようです。私はそれが質問stackoverflow.com/questions/16214067/

@MikkoRantalainenは仕事でブロックされたので、今夜は家からやってみます。
vonC 2013

1
「POファイルのマージドライバー」も私には機能しません:(

1
@sampablokuper同意します:記事は「許可されていない」読者のためにブロックされています。理由はわかりません。
vonC 2013年

1
@sampablokuper現在、このブログにアクセスできません。私はその内容を探し続けます。
vonC 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.