[解決済み] Git - 選択したファイルに対して強制的にマージの競合と手動マージを行う方法
質問
私たちは、共通のmasterブランチと、インストールごとに1つずつ、それぞれいくつかの特定の変更を持つ多くの並列ブランチを持つWebアプリケーションを管理しています。ソース コードは git で管理されており、master ブランチから並列ブランチに機能やバグ修正を転送する必要がある場合には、git は素晴らしいツールです。しかし、いくつかのファイルは機密性が高く、自動マージは通常悪い結果をもたらします。そこで、それらに何らかのマークを付けて、マージのたびに衝突が発生し、手動でマージが必要になるようにできれば、マージがずっと楽になります。
私は答えを探しました。
- 私は --no-commit と --ノー・オフ のマージオプションがありますが、同じではありません。
- ここで と ここで で、誰かが同じ質問をしていますが、解決策はありません。
- 似たようなケースは ファイルがマージされるのを防ぐ方法 を含む.gitattributesを使用しています。 somefile.php merge=ours . 衝突を発生させたり、強制的に手動でマージするようなマージオプションを探したのですが、今のところ見つかりませんでした。
- .gitattributesを含む。 somefile.php -merge は自動でマージされないため、手動でのマージを余儀なくされています。90%の解決策ですが、私が求めているのは、自動マージを試して、それが成功するかどうかに関係なく、衝突としてマークすることです。 でも、これが今のところ一番解決に近いです。 (...明確にしてくれた Charles Bailey に感謝します...)
- 誰かがカスタムマージドライバを書くことを提案しています ( 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 に伝えています。もちろん、あなたのファイルに適したパターンを使用する必要があります。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Git が追跡したファイルを .gitignore に登録したまま「忘れる」ようにするにはどうしたらいいですか?
-
[解決済み] Git リポジトリでのマージの衝突を解決するには?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[git push] 解決策: ! [リモート拒否] master -> master (受信前のフックは拒否されました)
-
解決策 このリポジトリでは、別の git プロセスが実行されているようです。たとえば、「git commit」によって開かれたエディタなどです。
-
解决[email protected]。パーミッションが拒否されました (publickey)。リモートリポジトリから読み取れませんでした
-
hint: 現在のブランチの先端が hint: そのリモートカウントより遅れているため、更新が拒否されました。
-
giteaを使ったGitサービスの構築
-
[解決済み] GitHubで2つのブランチの差分を取るには?
-
[解決済み] 現在のブランチにあるファイルをメインブランチにある同じファイルに上書きしますか?
-
[解決済み] GitHubのウェブサイト上でディレクトリやフォルダの名前を変更するには?
-
[解決済み] Git の 'master' ブランチを 'release' にリネームするには?
-
[解決済み] 特定のファイルで競合が発生した場合、常に自分のローカルバージョンを選択するようにgitに指示するにはどうすればよいですか?