19

マージドライバーを作成しています。.gitattributesファイルを次のように定義しました。

filename merge=mergeStrategy

次のように、$ PROJECT / .git/configにマージドライバーを作成しました。

[merge "mergeStrategy"]
    name = My merge strategy
    driver = scripts/mergeScript.sh

これはローカルでは正常に機能しますが、マージ戦略がすべての人に有効になるように、このマージドライバーをgitリポジトリにコミットしたいと思います。

これ(または他のGit構成オプション)をリポジトリ自体に追加する方法はありますか?

4

1 に答える 1

11

単純に追加してコミット(およびプッシュ)することができます(もちろん、ファイルとscript/mergeScript一緒に).gitattributes

それは次の場合に機能します:

  • mergeScriptどういうわけか$PATH、マージドライバーを実行しているユーザーの中にあります。
  • mergeScript実行可能であり、chmod +x
  • mergeScriptは拡張機能なしで、必要に応じて後でコンテンツを変更できるようにします(bashシェルからPerlスクリプト、C実行可能ファイルから...)。

(コメントで言及したように、最後の2つのポイントについてMestreLionに感謝します)

.' 'があなたの中にあったと私が思うので、それはあなたのローカルの場合でした$PATH、しかしあなたは皆のためにそれを仮定することはできません。

ただし、ローカル構成ファイル(.git/config)はプッシュ/クローンされないためAlexandr Priymakがコメントで指摘しているように)、ユーザーはカスタムマージドライバーの宣言を複製する必要があります。

これは、次のマージ時に自動的に実行される可能性のある「有害な」スクリプトをプッシュしないようにするための基本的な安全対策です。

を使用する別の方法Makefile

もう1つのオプションは、すべてのgitドライバーと.gitattributesバージョン履歴を保持し、すべてのドライバーを簡単にアクティブ化できるものを含めることですたとえば、リポジトリ内のすべてのgitドライバーをアクティブ化するMakefile特別なターゲットを持つ1つのプロジェクトが使用されました。make gitdrivers

これが必要なのは、gitカスタムドライバーを潜在的なセキュリティの脆弱性と見なし、新しいドライバーに信頼を与えるために何かをする必要があるためです。マージドライバーとその他のフックは、ユーザーのクレデンシャルで実行される実行可能コードであり、gitアクションの副作用として自動的に開始されるため、そのコードを実行する前に、明らかに特別な注意を払う必要があります。

ドライバーをアクティブ化するために変更するコードを実行する.git/configことは、信頼を付与するgitスタイルです。

実際には、Makefileそのために使用できます(ただし、プロジェクトに適したビルドシステムまたはスクリプトを使用できます)。Ubuntu Linuxホストの場合、次のように簡単に実行できます(3つのドライバーを使用した例)。

ファイル内.gitattributes

[attr]POFILE merge=merge-po-files
[attr]IMAGE diff=image
[attr]BINARY diff=binary -merge -text

locale/*.po POFILE
data/*.img BINARY
*.png IMAGE

およびin Makefile(インデントはU + 0009 TAB文字のみで行う必要がありますが、stackoverflow.comはここではサポートしていません):

developer-dependencies:
        sudo apt install required-package1 required-package2

submodules:
        @echo "Overwriting submodules with committed versions..."
        git submodule sync
        git submodule update --init

gitdrivers: developer-dependencies submodules
        @echo "Overwriting git drivers with current version..."
        git config merge.merge-po-files.driver "./bin/merge-po-files %A %O %B"
        # show rough thumbnails in text mode for images
        git config diff.image.textconv "./bin/image-textconv"
        git config diff.image.binary "true"
        git config diff.image.cachetextconv "true"
        # show some extra information about binary files
        git config diff.binary.textconv "./bin/binary-textconv"
        git config diff.binary.binary "true"
        @echo "All git drivers done."

ここで、ファイルmerge-po-filesimage-textconvおよびbinary-textconvはプロジェクトサブディレクトリ内の適切な実行可能ファイルですbin。複数のプラットフォームで動作する必要があるプロジェクトがある場合は、現在のプラットフォームの正しいバイナリをビルド/リンクするための追加の依存関係があります。

設定例gitでは、diffで画像のASCIIプレゼンテーションをレンダリングし、gettext .POファイルを特別なマージドライバーでマージし、gitヒューリスティックがそれらをテキストとして宣言している場合でも、選択したバイナリファイルをマージしないように指示しています。代わりに、としてマークされたファイルに対していずれかのバージョンを選択する必要がありますBINARYBINARYそして、diff内のファイルの特別なユーザーに表示される要約を表示します。

このように、すべての開発者make gitdriversは、最初のクローンを作成した後に1回実行するだけで済みます。また、後で作業コピーをマージまたはリベースするときに、すでにインストールされているドライバーの更新を自動的に取得します。また、最新のドライバーを使用しているかどうかわからない場合は、いつでも同じコマンドを再実行できます。上記の例では、実際に必要なものである場合とそうでない場合があるすべてのサブモジュールがリセットされることに注意してください。

TL; DR: .git/configリポジトリには含まれていませんが、コマンドを使用して適切な構成を再作成するスクリプトを含めることができgit configます。UNIXライクなシステムの場合、シェルスクリプトは素晴らしいです。プロジェクトでコードをビルドする必要がある場合は、必要に応じて、プロセスをビルドするために必要なドライバーをフックインストールできます。また、構成ファイルを直接変更するのではなく、コマンドを使用する方がはるかに安全であることに注意してくださいgit config ...。これらのコマンドは、その構成ファイルのファイル形式が将来変更されても機能し続けるためです。

于 2012-01-12T17:35:32.763 に答える