セットアップと設定
プロジェクトの取得と作成
基本的なスナップショット
ブランチとマージ
プロジェクトの共有と更新
検査と比較
パッチ
デバッグ
メール
外部システム
サーバー管理
- 2.46.1 → 2.47.0 変更なし
-
2.46.0
07/29/24
- 2.44.1 → 2.45.2 変更なし
-
2.44.0
02/23/24
- 2.43.1 → 2.43.5 変更なし
-
2.43.0
11/20/23
- 2.42.1 → 2.42.3 変更なし
-
2.42.0
08/21/23
- 2.41.1 → 2.41.2 変更なし
-
2.41.0
06/01/23
- 2.40.1 → 2.40.3 変更なし
-
2.40.0
03/12/23
- 2.36.1 → 2.39.5 変更なし
-
2.36.0
04/18/22
- 2.32.1 → 2.35.8 変更なし
-
2.32.0
06/06/21
- 2.30.1 → 2.31.8 変更なし
-
2.30.0
12/27/20
- 2.27.1 → 2.29.3 変更なし
-
2.27.0
06/01/20
- 2.25.1 → 2.26.3 変更なし
-
2.25.0
01/13/20
- 2.24.1 → 2.24.4 変更なし
-
2.24.0
11/04/19
- 2.23.1 → 2.23.4 変更なし
-
2.23.0
08/16/19
- 2.22.1 → 2.22.5 変更なし
-
2.22.0
06/07/19
- 2.21.1 → 2.21.4 変更なし
-
2.21.0
02/24/19
- 2.19.3 → 2.20.5 変更なし
-
2.19.2
11/21/18
- 2.18.1 → 2.19.1 変更なし
-
2.18.0
06/21/18
- 2.17.1 → 2.17.6 変更なし
-
2.17.0
04/02/18
-
2.16.6
12/06/19
- 2.15.4 変更なし
-
2.14.6
12/06/19
-
2.13.7
05/22/18
- 2.12.5 変更なし
-
2.11.4
09/22/17
-
2.10.5
09/22/17
-
2.9.5
07/30/17
- 2.7.6 → 2.8.6 変更なし
-
2.6.7
05/05/17
-
2.5.6
05/05/17
-
2.4.12
05/05/17
- 2.3.10 変更なし
-
2.2.3
09/04/15
- 2.1.4 変更なし
-
2.0.5
12/17/14
説明
gitattributes
ファイルは、パス名に attributes
を与えるシンプルなテキストファイルです。
gitattributes
ファイルの各行は次の形式です。
pattern attr1 attr2 ...
つまり、パターンと属性リストが空白で区切られています。先頭と末尾の空白は無視されます。# で始まる行は無視されます。二重引用符で始まるパターンは C スタイルで引用符で囲まれます。パターンが問題のパスに一致する場合、行にリストされている属性がパスに与えられます。
各属性は、特定のパスに対して次のいずれかの状態になることができます。
複数のパターンがパスに一致する場合、後の行が前の行をオーバーライドします。このオーバーライドは属性ごとに行われます。
パターンがパスに一致する規則は、.gitignore
ファイルと同じです ( gitignore[5]を参照)。ただし、いくつかの例外があります。
-
負のパターンは禁止されています。
-
ディレクトリに一致するパターンは、そのディレクトリ内のパスを再帰的に一致させません (したがって、末尾のスラッシュ
path/
構文を属性ファイルで使用することは無意味です。代わりにpath/**
を使用してください)。
パスに割り当てられる属性を決定する際、Git は $GIT_DIR/info/attributes
ファイル (優先度が最も高い)、問題のパスと同じディレクトリにある .gitattributes
ファイル、およびその親ディレクトリをワークツリーの最上位まで (.gitattributes
を含むディレクトリが問題のパスから遠いほど、その優先度は低くなります) 参照します。最後に、グローバルファイルとシステム全体のファイルが考慮されます (それらは優先度が最も低くなります)。
ワークツリーに .gitattributes
ファイルがない場合、インデックス内のパスがフォールバックとして使用されます。チェックアウトプロセス中、インデックス内の .gitattributes
が使用され、次にワーキングツリー内のファイルがフォールバックとして使用されます。
単一のリポジトリのみに影響を与えたい場合 (つまり、そのリポジトリに対する 1 人のユーザーのワークフローに固有のファイルを割り当てたい場合)、属性は $GIT_DIR/info/attributes
ファイルに配置する必要があります。バージョン管理され、他のリポジトリに配布する必要がある属性 (つまり、すべてのユーザーにとって関心のある属性) は、.gitattributes
ファイルに含める必要があります。1 人のユーザーのすべてのリポジトリに影響を与える必要がある属性は、core.attributesFile
設定オプション ( git-config[1]を参照) で指定されたファイルに配置する必要があります。そのデフォルト値は $XDG_CONFIG_HOME/git/attributes です。$XDG_CONFIG_HOME が設定されていないか空の場合、$HOME/.config/git/attributes が代わりに使用されます。システム上のすべてのユーザーの属性は、$(prefix)/etc/gitattributes
ファイルに配置する必要があります。
パスの属性設定を Unspecified
状態にオーバーライドする必要がある場合があります。これは、属性の名前の前に感嘆符 !
を付けることで行うことができます。
効果
Git による特定の操作は、パスに特定の属性を割り当てることで影響を受ける可能性があります。現在、次の操作は属性を認識しています。
チェックアウトとチェックイン
これらの属性は、git switch、git checkout、git merge などのコマンドが実行されたときに、リポジトリに保存されているコンテンツがワーキングツリーのファイルにコピーされる方法に影響を与えます。また、git add および git commit でワーキングツリーで準備したコンテンツを Git がリポジトリに保存する方法にも影響を与えます。
text
この属性は、パスをテキストファイルとしてマークし、これにより改行変換が有効になります。一致するファイルがインデックスに追加されると、ファイルの改行はインデックス内で LF に正規化されます。逆に、ファイルがインデックスからワーキングディレクトリにコピーされると、その改行は、eol
属性、Git 設定、およびプラットフォームに応じて LF から CRLF に変換される場合があります (後述の eol
の説明を参照)。
- 設定
-
パスに
text
属性を設定すると、上記のようにチェックインおよびチェックアウト時に改行変換が有効になります。ファイルが以前に CRLF 改行で Git に追加されていたとしても、ファイルがチェックインされるたびに、改行はインデックス内で LF に正規化されます。 - 設定解除
-
パスの
text
属性を設定解除すると、チェックインまたはチェックアウト時に Git が改行変換を試行しないように指示します。 - 文字列値 "auto" に設定
-
text
が "auto" に設定されている場合、Git はファイルがテキストであるかバイナリであるかを自身で決定します。テキストであり、ファイルが CRLF 改行ですでに Git に存在していない場合、上記のようにチェックインおよびチェックアウト時に改行が変換されます。それ以外の場合、チェックインまたはチェックアウト時に変換は行われません。 - 未指定
-
text
属性が未指定の場合、Git はcore.autocrlf
設定変数を使用して、ファイルを変換するかどうかを判断します。
他の値の場合、Git は text
が未指定のままにされたかのように動作します。
eol
この属性は、チェックアウト時にワーキングツリーで特定行末スタイルを使用するためのパスを指定します。これは、text
またはtext=auto
が設定されている場合にのみ有効です(上記参照)。ただし、eol
を指定すると、text
が指定されていない場合でも自動的にtext
が設定されます。
- 文字列値 "crlf" に設定
-
この設定は、ファイルのチェックアウト時に、ワーキングディレクトリ内のファイルの行末を CRLF に変換します。
- 文字列値 "lf" に設定
-
この設定は、ファイルのチェックアウト時に、ワーキングディレクトリ内でインデックスと同じ行末を使用します。
- 未指定
-
ファイルに対して
eol
属性が未指定の場合、ワーキングディレクトリ内の行末は、core.autocrlf
またはcore.eol
設定変数によって決定されます(git-config[1] でこれらのオプションの定義を参照してください)。text
が設定されているが、これらの変数のいずれも設定されていない場合、デフォルトでは、Windows ではeol=crlf
、その他のすべてのプラットフォームではeol=lf
になります。
行末変換
Git は通常、ファイルの内容をそのままにしますが、リポジトリ内の行末を LF に正規化し、必要に応じて、ファイルのチェックアウト時に CRLF に変換するように設定できます。
作業しているリポジトリに関係なく、ワーキングディレクトリで CRLF 行末を使用したい場合は、属性を使用せずに設定変数 "core.autocrlf" を設定できます。
[core] autocrlf = true
これはテキストファイルの正規化を強制するものではありませんが、リポジトリに導入するテキストファイルが追加時に行末を LF に正規化し、リポジトリ内で既に正規化されているファイルが正規化されたままになることを保証します。
どのコントリビューターがリポジトリに導入するテキストファイルも行末を正規化するようにしたい場合は、すべてのファイルに対して text
属性を "auto" に設定できます。
* text=auto
属性を使用すると、行末がどのように変換されるかを細かく制御できます。以下は、Git が .txt、.vcproj、.sh ファイルを正規化し、.vcproj ファイルが CRLF を、.sh ファイルがワーキングディレクトリで LF を持つようにし、.jpg ファイルの内容に関係なく正規化されないようにする例です。
* text=auto *.txt text *.vcproj text eol=crlf *.sh text eol=lf *.jpg -text
注
|
中央リポジトリへのプッシュとプルを使用して、クロスプラットフォームプロジェクトで text=auto 変換が有効になっている場合、CRLF を含むテキストファイルは正規化される必要があります。 |
クリーンなワーキングディレクトリから
$ echo "* text=auto" >.gitattributes $ git add --renormalize . $ git status # Show files that will be normalized $ git commit -m "Introduce end-of-line normalization"
正規化すべきでないファイルが *git status* に表示された場合は、*git add -u* を実行する前に、それらのファイルの text
属性を unset してください。
manual.pdf -text
逆に、Git が検出しないテキストファイルは、手動で正規化を有効にできます。
weirdchars.txt text
core.safecrlf
が "true" または "warn" に設定されている場合、Git は、core.autocrlf
の現在の設定に対して変換が可逆的かどうかを検証します。"true" の場合、Git は不可逆的な変換を拒否します。"warn" の場合、Git は警告のみを出力しますが、不可逆的な変換を受け入れます。安全策は、ワーキングツリー内のファイルに対して行われたこのような変換を防ぐためにトリガーされますが、いくつかの例外があります。たとえ…
-
git add 自体はワーキングツリー内のファイルに触れませんが、次のチェックアウトで触れるため、安全策がトリガーされます。
-
パッチでテキストファイルを更新するために git apply はワーキングツリー内のファイルに触れますが、この操作はテキストファイルに関するものであり、CRLF 変換は行末の不整合を修正するためのものであるため、安全策はトリガーされません。
-
git diff 自体はワーキングツリー内のファイルに触れませんが、通常は次の git add を行う予定の変更を検査するために実行されます。潜在的な問題を早期にキャッチするために、安全策がトリガーされます。
working-tree-encoding
Git は、ASCII またはそのスーパーセット(UTF-8、ISO-8859-1 など)でエンコードされたファイルをテキストファイルとして認識します。特定の他のエンコーディング(UTF-16 など)でエンコードされたファイルはバイナリとして解釈され、結果として、組み込みの Git テキスト処理ツール(*git diff* など)、およびほとんどの Git Web フロントエンドは、デフォルトではこれらのファイルの内容を視覚化しません。
これらの場合、working-tree-encoding
属性を使用して、ワーキングディレクトリ内のファイルのエンコーディングを Git に伝えることができます。この属性を持つファイルが Git に追加されると、Git は指定されたエンコーディングから UTF-8 にコンテンツを再エンコードします。最後に、Git は UTF-8 エンコードされたコンテンツを内部データ構造(「インデックス」と呼ばれる)に保存します。チェックアウト時に、コンテンツは指定されたエンコーディングに再エンコードされます。
working-tree-encoding
属性を使用すると、多くの落とし穴がある可能性があることに注意してください。
-
代替の Git 実装(JGit または libgit2 など)および古い Git バージョン(2018 年 3 月現在)は、
working-tree-encoding
属性をサポートしていません。リポジトリでworking-tree-encoding
属性を使用する場合は、リポジトリを使用するすべてのクライアントがこの属性をサポートしていることを確認することを強くお勧めします。たとえば、Microsoft Visual Studio リソースファイル(
*.rc
)または PowerShell スクリプトファイル(*.ps1
)は、UTF-16 でエンコードされる場合があります。*.ps1
を UTF-16 として宣言し、working-tree-encoding
が有効な Git クライアントでfoo.ps1
を追加すると、foo.ps1
は内部的に UTF-8 として保存されます。working-tree-encoding
をサポートしないクライアントは、foo.ps1
を UTF-8 エンコードされたファイルとしてチェックアウトします。これにより、通常、このファイルのユーザーに問題が発生します。working-tree-encoding
属性をサポートしない Git クライアントが新しいファイルbar.ps1
を追加すると、bar.ps1
は内部的に「そのまま」保存されます(この例ではおそらく UTF-16 として)。working-tree-encoding
をサポートするクライアントは、内部コンテンツを UTF-8 として解釈し、チェックアウト時に UTF-16 に変換しようとします。この操作は失敗し、エラーが発生します。 -
コンテンツを非 UTF エンコーディングに再エンコードすると、変換が UTF-8 ラウンドトリップセーフでない可能性があるため、エラーが発生する可能性があります。エンコーディングがラウンドトリップセーフでない疑いがある場合は、
core.checkRoundtripEncoding
に追加して、Git がラウンドトリップエンコーディングをチェックするようにします(git-config[1] を参照)。SHIFT-JIS(日本語文字セット)には、UTF-8 でのラウンドトリップの問題があることが知られており、デフォルトでチェックされます。 -
コンテンツを再エンコードするには、特定の Git 操作(git checkout や git add など)が遅くなる可能性があるリソースが必要です。
ファイルに UTF-8 エンコーディングで保存できず、Git がコンテンツをテキストとして処理できるようにする場合にのみ、working-tree-encoding
属性を使用してください。
たとえば、*`*.ps1`* ファイルがバイトオーダーマーク(BOM)付きの UTF-16 でエンコードされており、プラットフォームに基づいて Git に自動行末変換を実行させる場合は、次の属性を使用します。
*.ps1 text working-tree-encoding=UTF-16
BOM なしの UTF-16 リトルエンディアンで *`*.ps1`* ファイルがエンコードされており、ワーキングディレクトリで Windows の行末を使用する場合は、次の属性を使用します(UTF-16 リトルエンディアンを BOM 付きで使用する場合は、UTF-16LE
の代わりに UTF-16LE-BOM
を使用します)。working-tree-encoding
属性を使用する場合は、曖昧さを避けるために eol
を使用して行末を明示的に定義することを強くお勧めします。
*.ps1 text working-tree-encoding=UTF-16LE eol=crlf
プラットフォームで利用可能なすべてのエンコーディングのリストは、次のコマンドで取得できます。
iconv --list
ファイルのエンコーディングがわからない場合は、file
コマンドを使用してエンコーディングを推測できます。
file foo.ps1
ident
パスに属性 ident
が設定されている場合、Git は、チェックアウト時に、BLOB オブジェクト内の $Id$
を $Id:
で置き換え、その後に 40 文字の 16 進数 BLOB オブジェクト名、ドル記号 $
を続けます。ワーキングツリーファイル内で $Id:
で始まり $
で終わるバイトシーケンスは、チェックイン時に $Id$
で置き換えられます。
filter
filter
属性は、構成で指定されたフィルタードライバーの名前である文字列値に設定できます。
フィルタードライバーは、clean
コマンドと smudge
コマンドで構成され、いずれも未指定にすることができます。チェックアウト時、smudge
コマンドが指定されている場合、コマンドには標準入力から BLOB オブジェクトが供給され、その標準出力を使用してワーキングツリーファイルが更新されます。同様に、clean
コマンドは、チェックイン時にワーキングツリーファイルの内容を変換するために使用されます。デフォルトでは、これらのコマンドは単一の BLOB のみを処理して終了します。長時間実行される process
フィルターが clean
および/または smudge
フィルターの代わりに使用される場合、Git は単一の Git コマンドのライフサイクル全体(たとえば git add --all
)で、単一のフィルターコマンド呼び出しですべての BLOB を処理できます。長時間実行される process
フィルターが構成されている場合は、構成された単一の BLOB フィルターよりも常に優先されます。process
フィルターとの通信に使用されるプロトコルの説明については、以下のセクションを参照してください。
コンテンツフィルターの 1 つの用途は、コンテンツを、プラットフォーム、ファイルシステム、およびユーザーが使用するのに便利な形に整形することです。この動作モードでは、ここでのキーフレーズは「より便利」であり、「使用不能なものを使用可能にする」ではありません。言い換えれば、誰かがフィルタードライバー定義を unset するか、適切なフィルタープログラムを持っていない場合でも、プロジェクトは使用可能であるべきです。
コンテンツフィルターのもう 1 つの用途は、リポジトリで直接使用できないコンテンツ(Git の外部に保存されている実際のコンテンツを参照する UUID や、暗号化されたコンテンツなど)を保存し、チェックアウト時に使用可能な形式に変換することです(外部コンテンツのダウンロードや暗号化されたコンテンツの復号化など)。
これら 2 つのフィルターは動作が異なり、デフォルトでは、フィルターは前者のように、コンテンツをより便利な形に整形するものとして扱われます。構成内のフィルタードライバー定義の欠落、またはゼロ以外のステータスで終了するフィルタードライバーは、エラーではなく、フィルターを no-op パススルーにします。
フィルターの
構成変数を true
に設定することにより、フィルターがそれ自体で使用できないコンテンツを使用可能なコンテンツに変えることを宣言できます。
注:クリーンフィルターが変更されるたびに、リポジトリを再正規化する必要があります:$ git add --renormalize .
たとえば、.gitattributes では、パスに filter
属性を割り当てます。
*.c filter=indent
次に、.git/config で「filter.indent.clean」と「filter.indent.smudge」構成を定義して、ソースファイルのチェックイン時(「clean」が実行されます)とチェックアウト時(コマンドは「cat」なので変更は加えられません)に C プログラムの内容を変更する一対のコマンドを指定します。
[filter "indent"] clean = indent smudge = cat
最適な結果を得るには、clean
を2回実行しても出力が変化しないようにする必要があります("clean→clean" は "clean" と同等であるべきです)。また、複数の smudge
コマンドを実行しても、clean
の出力が変化しないようにする必要があります("smudge→smudge→clean" は "clean" と同等であるべきです)。以下のマージに関するセクションを参照してください。
「indent」フィルターは、この点で適切に動作します。正しくインデントされた入力は変更しません。この場合、smudgeフィルターがないということは、cleanフィルターは自身の出力を変更せずに受け入れる *必要があります* 。
フィルターが、保存されたコンテンツを使用可能にするために *必ず* 成功する必要がある場合、設定でそのフィルターが required
であると宣言できます。
[filter "crypt"] clean = openssl enc ... smudge = openssl enc -d ... required
フィルターのコマンドラインにあるシーケンス "%f" は、フィルターが処理しているファイルの名前に置き換えられます。フィルターはこれをキーワード置換に使用する場合があります。例:
[filter "p4"] clean = git-p4-filter --clean %f smudge = git-p4-filter --smudge %f
"%f" は、処理中のパスの名前であることに注意してください。フィルタリングされているバージョンによっては、ディスク上の対応するファイルが存在しない場合や、内容が異なる場合があります。したがって、smudgeコマンドとcleanコマンドは、ディスク上のファイルにアクセスしようとすべきではなく、標準入力で提供されたコンテンツに対するフィルターとしてのみ動作する必要があります。
長時間実行されるフィルタープロセス
フィルターコマンド(文字列値)が filter.<driver>.process
を介して定義されている場合、Gitは単一のGitコマンドの実行中に、すべてのblobを単一のフィルター呼び出しで処理できます。これは、長時間実行されるプロセスプロトコル(technical/long-running-process-protocol.txtで説明)を使用することで実現されます。
Gitが、cleanまたはsmudgeが必要な最初のファイルに遭遇すると、フィルターを開始し、ハンドシェイクを実行します。ハンドシェイクでは、Gitから送信されるウェルカムメッセージは「git-filter-client」であり、バージョン2のみがサポートされており、サポートされている機能は「clean」、「smudge」、「delay」です。
その後、Gitはフラッシュパケットで終端された「key=value」ペアのリストを送信します。このリストには、少なくともフィルターコマンド(サポートされている機能に基づく)と、リポジトリルートを基準としたフィルター処理するファイルのパス名が含まれます。フラッシュパケットの直後、Gitは0個以上のpkt-lineパケットに分割されたコンテンツと、コンテンツを終端するためのフラッシュパケットを送信します。フィルターは、コンテンツと最後のフラッシュパケットを受信するまで、応答を送信してはならないことに注意してください。また、「key=value」ペアの「value」には「=」文字を含めることができますが、キーにその文字が含まれることはないことにも注意してください。
packet: git> command=smudge packet: git> pathname=path/testfile.dat packet: git> 0000 packet: git> CONTENT packet: git> 0000
フィルターは、フラッシュパケットで終端された「key=value」ペアのリストで応答することが期待されます。フィルターに問題がない場合、リストには「success」ステータスを含める必要があります。これらのパケットの直後、フィルターは0個以上のpkt-lineパケットでコンテンツを送信し、最後にフラッシュパケットを送信することが期待されます。最後に、フラッシュパケットで終端された「key=value」ペアの2番目のリストが期待されます。フィルターは2番目のリストでステータスを変更するか、空のリストでステータスをそのままにすることができます。空のリストは、必ずフラッシュパケットで終端する必要があることに注意してください。
packet: git< status=success packet: git< 0000 packet: git< SMUDGED_CONTENT packet: git< 0000 packet: git< 0000 # empty list, keep "status=success" unchanged!
結果のコンテンツが空の場合、フィルターは「success」ステータスと、空のコンテンツを通知するためのフラッシュパケットで応答することが期待されます。
packet: git< status=success packet: git< 0000 packet: git< 0000 # empty content! packet: git< 0000 # empty list, keep "status=success" unchanged!
フィルターがコンテンツを処理できないまたは処理したくない場合、「error」ステータスで応答することが期待されます。
packet: git< status=error packet: git< 0000
フィルターが処理中にエラーを経験した場合、コンテンツが(部分的または完全に)送信された後でステータス「error」を送信できます。
packet: git< status=success packet: git< 0000 packet: git< HALF_WRITTEN_ERRONEOUS_CONTENT packet: git< 0000 packet: git< status=error packet: git< 0000
フィルターがGitプロセスの存続期間中に、コンテンツだけでなく今後のコンテンツも処理できないまたは処理したくない場合、プロトコルの任意の時点で「abort」ステータスで応答することが期待されます。
packet: git< status=abort packet: git< 0000
Gitは、「error」/「abort」ステータスが設定された場合でも、フィルタープロセスを停止または再起動しません。ただし、Gitは、filter.<driver>.required
フラグに従って終了コードを設定し、filter.<driver>.clean
/ filter.<driver>.smudge
メカニズムの動作を模倣します。
フィルターが通信中に停止した場合、またはプロトコルを遵守しない場合、Gitはフィルタープロセスを停止し、処理が必要な次のファイルで再起動します。filter.<driver>.required
フラグに応じて、Gitはそれをエラーとして解釈します。
遅延
フィルターが「delay」機能をサポートしている場合、Gitはフィルターコマンドとパス名の後に「can-delay」フラグを送信できます。このフラグは、フィルターが現在のblobのフィルタリングを遅延できることを示します(たとえば、ネットワークの遅延を補うため)。コンテンツなしで応答する代わりに、「delayed」ステータスとフラッシュパケットで応答します。
packet: git> command=smudge packet: git> pathname=path/testfile.dat packet: git> can-delay=1 packet: git> 0000 packet: git> CONTENT packet: git> 0000 packet: git< status=delayed packet: git< 0000
フィルターが「delay」機能をサポートしている場合、「list_available_blobs」コマンドをサポートする必要があります。Gitがこのコマンドを送信した場合、フィルターは以前に遅延されたが、現在利用可能なblobを表すパス名のリストを返すことが期待されます。リストはフラッシュパケットで終端され、その後にフラッシュパケットで終端された「success」ステータスが続きます。遅延されたパスのblobがまだ利用可能でない場合、フィルターは少なくとも1つのblobが利用可能になるまで応答をブロックすることが期待されます。フィルターは空のリストを送信することで、これ以上遅延されたblobがないことをGitに伝えることができます。フィルターが空のリストで応答するとすぐに、Gitは要求を停止します。この時点でGitが受信していないすべてのblobは、欠落しているとみなされ、エラーになります。
packet: git> command=list_available_blobs packet: git> 0000 packet: git< pathname=path/testfile.dat packet: git< pathname=path/otherfile.dat packet: git< 0000 packet: git< status=success packet: git< 0000
Gitがパス名を受信した後、対応するblobを再度要求します。これらのリクエストには、パス名と空のコンテンツセクションが含まれています。フィルターは、上記で説明した通常の方法でsmudgeされたコンテンツで応答することが期待されます。
packet: git> command=smudge packet: git> pathname=path/testfile.dat packet: git> 0000 packet: git> 0000 # empty content! packet: git< status=success packet: git< 0000 packet: git< SMUDGED_CONTENT packet: git< 0000 packet: git< 0000 # empty list, keep "status=success" unchanged!
例
長時間実行されるフィルターのデモ実装は、Gitコアリポジトリの contrib/long-running-filter/example.pl
にあります。独自の長時間実行されるフィルタープロセスを開発する場合は、GIT_TRACE_PACKET
環境変数がデバッグに非常に役立ちます(git[1]を参照)。
filter.<driver>.clean
または filter.<driver>.smudge
の既存のコマンドを filter.<driver>.process
で使用することはできません。前者の2つは、後者とは異なるプロセス間通信プロトコルを使用するためです。
チェックイン/チェックアウト属性間の相互作用
チェックインコードパスでは、ワークツリーファイルは最初に filter
ドライバー(指定されていて、対応するドライバーが定義されている場合)で変換され、次に結果は ident
(指定されている場合)で処理され、最後に text
(再度、指定されていて適用可能な場合)で処理されます。
チェックアウトコードパスでは、blobコンテンツは最初に text
で変換され、次に ident
で変換され、filter
に渡されます。
チェックイン/チェックアウト属性が異なるブランチのマージ
clean/smudgeフィルターやtext/eol/ident属性の追加など、ファイルの正規リポジトリ形式を変更する属性をファイルに追加した場合、その属性が存在しないものをマージすると、通常はマージの競合が発生します。
これらの不要なマージの競合を防ぐために、merge.renormalize
設定変数を設定することで、3方向マージを解決する際にファイルの3つのステージすべてで仮想チェックアウトとチェックインを実行するようにGitに指示できます。これにより、変換されたファイルが未変換のファイルとマージされたときに、チェックイン変換によって生じる変更が、偽のマージの競合を引き起こすのを防ぎます。
「smudge→clean」が、既にsmudgeされたファイルであっても、「clean」と同じ出力になる限り、この戦略はフィルターに関連するすべての競合を自動的に解決します。このように動作しないフィルターは、手動で解決する必要のある追加のマージの競合を引き起こす可能性があります。
diffテキストの生成
diff
属性 diff
は、Gitが特定のファイルのdiffを生成する方法に影響します。パスに対してテキスト形式のパッチを生成するか、パスをバイナリファイルとして扱うかをGitに指示できます。また、hunkヘッダー @@ -k,l +n,m @@
行に表示される行に影響を与えたり、外部コマンドを使用してdiffを生成するようにGitに指示したり、diffを生成する前にバイナリファイルをテキスト形式に変換するようにGitに要求したりすることもできます。
- 設定
-
diff
属性が設定されたパスは、テキストファイルに通常は表示されないNULなどのバイト値が含まれている場合でも、テキストとして扱われます。 - 設定解除
-
diff
属性が設定解除されたパスは、Binary files differ
(またはバイナリパッチが有効になっている場合はバイナリパッチ)を生成します。 - 未指定
-
diff
属性が未指定のパスは、最初にその内容が検査され、テキストのように見え、core.bigFileThresholdよりも小さい場合は、テキストとして扱われます。それ以外の場合は、Binary files differ
を生成します。 - 文字列
-
diffは、指定されたdiffドライバーを使用して表示されます。各ドライバーは、次のセクションで説明するように、1つ以上のオプションを指定できます。diffドライバー「foo」のオプションは、Git構成ファイルの「diff.foo」セクションの設定変数によって定義されます。
外部diffドライバーの定義
diffドライバーの定義は、gitattributes
ファイルではなく、gitconfig
で行われるため、厳密に言えば、このマニュアルページでそれについて説明するのは不適切です。しかし…
外部diffドライバー jcdiff
を定義するには、$GIT_DIR/config
ファイル(または $HOME/.gitconfig
ファイル)に次のようなセクションを追加します
[diff "jcdiff"] command = j-c-diff
diff
属性が jcdiff
に設定されたパスのdiffを表示する必要がある場合、Gitは上記の構成で指定したコマンド、つまり j-c-diff
を7つのパラメーターと共に呼び出します。これは GIT_EXTERNAL_DIFF
プログラムが呼び出されるのと同じです。詳細については、git[1]を参照してください。
プログラムが特定の変更を無視できる場合(git diff --ignore-space-change
と同様)、オプション trustExitCode
もtrueに設定してください。次に、重要な変更が見つかった場合は終了コード1を返し、見つからなかった場合は0を返すことが期待されます。
内部diffアルゴリズムの設定
diffアルゴリズムは、diff.algorithm
構成キーを介して設定できますが、パスごとにdiffアルゴリズムを設定すると便利な場合があります。たとえば、.jsonファイルには minimal
diffアルゴリズムを、.cファイルには histogram
を使用するなど、毎回コマンドラインでアルゴリズムを渡さなくても済むようにすることができます。
最初に、.gitattributes
で、パスの diff
属性を割り当てます。
*.json diff=<name>
次に、myers
、patience
、minimal
、または histogram
から選択して、diffアルゴリズムを指定するための「diff.<name>.algorithm」構成を定義します。
[diff "<name>"] algorithm = histogram
このdiffアルゴリズムは、git-diff(1)、git-show(1)のようなユーザー向けのdiff出力に適用され、--stat
出力にも使用されます。マージ機構は、この方法で設定されたdiffアルゴリズムを使用しません。
注
|
diff=<name> 属性を持つパスに対して diff.<name>.command が定義されている場合、外部diffドライバーとして実行され(上記を参照)、diff.<name>.algorithm を追加しても、アルゴリズムが外部diffドライバーに渡されないため、効果はありません。 |
カスタムhunkヘッダーの定義
テキスト形式のdiff出力の変更グループ(「hunk」と呼ばれる)には、次の形式の行が前に付加されます
@@ -k,l +n,m @@ TEXT
これはハンクヘッダーと呼ばれます。「TEXT」部分は、デフォルトではアルファベット、アンダースコア、またはドル記号で始まる行です。これはGNUのdiff -p出力で使用されるものと一致します。しかし、このデフォルトの選択は一部のコンテンツには適しておらず、カスタマイズされたパターンを使用して選択を行うことができます。
まず、.gitattributesで、パスに対してdiff
属性を割り当てます。
*.tex diff=tex
次に、ハンクヘッダー「TEXT」として表示したい行に一致する正規表現を指定するために、「diff.tex.xfuncname」構成を定義します。$GIT_DIR/config
ファイル(または$HOME/.gitconfig
ファイル)に以下のようなセクションを追加します。
[diff "tex"] xfuncname = "^(\\\\(sub)*section\\{.*)$"
注意。構成ファイルパーサーによってバックスラッシュが1つ削除されるため、バックスラッシュを2つにする必要があります。上記のパターンは、バックスラッシュで始まり、0回以上のsub
、それに続くsection
、それに続く開き波括弧で終わる行を選択します。
これを簡単にするために、いくつかの組み込みパターンがあります。tex
もその1つなので、構成ファイルに上記を記述する必要はありません(.gitattributes
を介して属性メカニズムでこれを有効にする必要はあります)。以下の組み込みパターンが利用可能です。
-
ada
Ada言語のソースコードに適しています。 -
bash
Bourne-Again SHell言語のソースコードに適しています。POSIXシェル関数の定義のスーパーセットをカバーします。 -
bibtex
BibTeXコードの参照を含むファイルに適しています。 -
cpp
CおよびC++言語のソースコードに適しています。 -
csharp
C#言語のソースコードに適しています。 -
css
カスケーディングスタイルシートに適しています。 -
dts
デバイスツリー(DTS)ファイルに適しています。 -
elixir
Elixir言語のソースコードに適しています。 -
fortran
Fortran言語のソースコードに適しています。 -
fountain
Fountainドキュメントに適しています。 -
golang
Go言語のソースコードに適しています。 -
html
HTML/XHTMLドキュメントに適しています。 -
java
Java言語のソースコードに適しています。 -
kotlin
Kotlin言語のソースコードに適しています。 -
markdown
Markdownドキュメントに適しています。 -
matlab
MATLABおよびOctave言語のソースコードに適しています。 -
objc
Objective-C言語のソースコードに適しています。 -
pascal
Pascal/Delphi言語のソースコードに適しています。 -
perl
Perl言語のソースコードに適しています。 -
php
PHP言語のソースコードに適しています。 -
python
Python言語のソースコードに適しています。 -
ruby
Ruby言語のソースコードに適しています。 -
rust
Rust言語のソースコードに適しています。 -
scheme
Scheme言語のソースコードに適しています。 -
tex
LaTeXドキュメントのソースコードに適しています。
ワードdiffのカスタマイズ
git diff --word-diff
が行内で単語を分割するために使用するルールを、"diff.*.wordRegex"構成変数に適切な正規表現を指定することでカスタマイズできます。たとえば、TeXでは、バックスラッシュの後に文字のシーケンスが続くものがコマンドを形成しますが、このようなコマンドは、空白を挟まずに複数一緒に実行できます。それらを分離するには、$GIT_DIR/config
ファイル(または$HOME/.gitconfig
ファイル)で以下のような正規表現を使用します。
[diff "tex"] wordRegex = "\\\\[a-zA-Z]+|[{}]|\\\\.|[^\\{}[:space:]]+"
組み込みパターンが、前のセクションにリストされているすべての言語に対して提供されています。
バイナリファイルのテキストdiffの実行
バイナリファイルのテキスト変換されたバージョンでdiffを表示したい場合があります。たとえば、ワープロドキュメントをASCIIテキスト表現に変換し、テキストのdiffを表示できます。この変換では情報の一部が失われますが、結果として得られるdiffは人間が見るのに役立ちます(ただし、直接適用することはできません)。
textconv
構成オプションは、そのような変換を実行するためのプログラムを定義するために使用されます。プログラムは、変換するファイルの単一の引数を取り、結果のテキストをstdoutに出力する必要があります。
たとえば、バイナリ情報の代わりにファイルのexif情報をdiff表示するには(exifツールがインストールされていると仮定して)、$GIT_DIR/config
ファイル(または$HOME/.gitconfig
ファイル)に次のセクションを追加します。
[diff "jpg"] textconv = exif
注
|
テキスト変換は通常、一方向の変換です。この例では、実際の画像コンテンツを失い、テキストデータのみに焦点を当てます。つまり、textconvで生成されたdiffは適用には適していません。このため、git diff とgit log コマンド群(log、whatchanged、showなど)のみがテキスト変換を実行します。git format-patch はこの出力を生成しません。バイナリファイルのテキスト変換されたdiffを誰かに送信したい場合(たとえば、行った変更をすばやく伝えることができるため)、別途生成して、送信する可能性のある通常のバイナリdiffに加えてコメントとして送信する必要があります。 |
テキスト変換は、特にgit log -p
で多数の変換を行う場合に時間がかかる可能性があるため、Gitは出力をキャッシュし、将来のdiffで使用するメカニズムを提供します。キャッシュを有効にするには、diffドライバの構成で"cachetextconv"変数を設定します。たとえば、次のようになります。
[diff "jpg"] textconv = exif cachetextconv = true
これにより、各blobで"exif"を実行した結果が永久にキャッシュされます。diffドライバのtextconv構成変数を変更すると、Gitはキャッシュエントリを自動的に無効にし、textconvフィルタを再実行します。キャッシュを手動で無効にする場合(たとえば、"exif"のバージョンが更新されて、より良い出力が生成されるようになった場合)、git update-ref -d refs/notes/textconv/jpg
("jpg"は上記の例のdiffドライバの名前です)を使用してキャッシュを手動で削除できます。
textconvと外部diffの選択
リポジトリ内のバイナリまたは特殊な形式のblob間の差を表示したい場合は、外部diffコマンドを使用するか、textconvを使用してdiff可能なテキスト形式に変換するかを選択できます。どちらの方法を選択するかは、正確な状況によって異なります。
外部diffコマンドを使用する利点は、柔軟性があることです。行指向の変更を見つける必要はなく、出力が統合diffに似ている必要もありません。データの形式に最も適切な方法で変更を見つけて報告できます。
それに対し、textconvははるかに制限されています。データの行指向のテキスト形式への変換を提供すると、Gitは通常のdiffツールを使用して出力を生成します。この方法を選択することには、いくつかの利点があります。
-
使いやすさ。独自のdiffを実行するよりも、バイナリからテキストへの変換を記述する方がはるかに簡単な場合がよくあります。多くの場合、既存のプログラムをtextconvフィルタとして使用できます(exif、odt2txtなど)。
-
Git diff機能。変換ステップのみを自分で行うことで、カラー化、ワードdiff、マージの結合diffなど、Gitの多くのdiff機能を利用できます。
-
キャッシュ。textconvのキャッシュにより、
git log -p
を実行してトリガーされるような、繰り返されるdiffを高速化できます。
ファイルをバイナリとしてマークする
Gitは通常、コンテンツの先頭を調べることで、blobにテキストデータが含まれているかバイナリデータが含まれているかを正しく推測します。ただし、blobにファイルの後半にバイナリデータが含まれている場合や、コンテンツが技術的にはテキスト文字で構成されていても、人間が読めない場合は、その決定をオーバーライドしたい場合があります。たとえば、多くのpostscriptファイルにはASCII文字のみが含まれていますが、ノイズが多く意味のないdiffが生成されます。
ファイルをバイナリとしてマークする最も簡単な方法は、.gitattributes
ファイルでdiff属性を解除することです。
*.ps -diff
これにより、Gitは通常のdiffの代わりにBinary files differ
(またはバイナリパッチが有効になっている場合はバイナリパッチ)を生成します。
ただし、他のdiffドライバ属性を指定することもできます。たとえば、postscriptファイルを人間が見るためにASCII表現に変換するためにtextconv
を使用し、それ以外の場合はバイナリファイルとして扱いたい場合があります。-diff
とdiff=ps
の両方の属性を指定することはできません。解決策は、diff.*.binary
構成オプションを使用することです。
[diff "ps"] textconv = ps2ascii binary = true
3方向マージの実行
merge
merge
属性は、git merge
中、およびgit revert
やgit cherry-pick
などの他のコマンド中にファイルレベルのマージが必要な場合に、ファイルの3つのバージョンをマージする方法に影響します。
- 設定
-
組み込みの3方向マージドライバは、
RCS
スイートのmergeコマンドと同様の方法でコンテンツをマージするために使用されます。これは通常のテキストファイルに適しています。 - 設定解除
-
現在のブランチのバージョンを暫定的なマージ結果として取得し、マージに競合があることを宣言します。これは、明確なマージセマンティクスがないバイナリファイルに適しています。
- 未指定
-
デフォルトでは、これは
merge
属性が設定されている場合と同じ組み込み3方向マージドライバを使用します。ただし、merge.default
構成変数では、merge
属性が指定されていないパスで使用される別のマージドライバを指定できます。 - 文字列
-
指定されたカスタムマージドライバを使用して、3方向マージが実行されます。組み込みの3方向マージドライバは、"text"ドライバを要求することで明示的に指定できます。組み込みの「現在のブランチを取得」ドライバは、"binary"で要求できます。
組み込みマージドライバ
merge
属性を介して要求できる、定義済みの組み込み低レベルマージドライバがいくつかあります。
- text
-
テキストファイル用の通常の3方向ファイルレベルマージ。競合領域は、競合マーカー
<<<<<<<
、=======
、および>>>>>>>
でマークされます。ブランチからのバージョンは=======
マーカーの前に表示され、マージされたブランチからのバージョンは=======
マーカーの後に表示されます。 - binary
-
作業ツリーでブランチのバージョンを保持しますが、ユーザーが解決するためにパスを競合状態のままにします。
- union
-
テキストファイルに対して3方向ファイルレベルマージを実行しますが、競合マーカーをそのままにするのではなく、両方のバージョンから行を取得します。これにより、結果のファイルに追加された行がランダムな順序になる傾向があるため、ユーザーは結果を確認する必要があります。意味を理解していない場合は、これを使用しないでください。
カスタムマージドライバの定義
マージドライバの定義は.git/config
ファイルで行われ、gitattributes
ファイルでは行われないため、厳密に言えば、このマニュアルページはそれについて説明するのに不適切な場所です。しかし…
カスタムマージドライバfilfre
を定義するには、$GIT_DIR/config
ファイル(または$HOME/.gitconfig
ファイル)に以下のようなセクションを追加します。
[merge "filfre"] name = feel-free merge driver driver = filfre %O %A %B %L %P recursive = binary
merge.*.name
変数は、ドライバに人間が読める名前を与えます。
merge.*.driver
変数の値は、共通の祖先のバージョン(%O
)、現在のバージョン(%A
)、および他のブランチのバージョン(%B
)を実行するコマンドを作成するために使用されます。これらの3つのトークンは、コマンドラインが構築されるときに、これらのバージョンのコンテンツを保持する一時ファイルの名前に置き換えられます。さらに、%L
は競合マーカーのサイズ(下記参照)に置き換えられます。
マージドライバは、マージ結果を%A
で名前が付けられたファイルに上書きして残し、クリーンにマージできた場合はゼロステータスで終了し、競合があった場合はゼロ以外のステータスで終了する必要があります。ドライバがクラッシュした場合(SEGVによって強制終了された場合など)、128よりも大きいゼロ以外のステータスで終了することが期待されており、そのような場合、マージは失敗になります(競合が発生する場合とは異なります)。
merge.*.recursive
変数は、マージドライバーが共通の祖先間での内部マージ(複数存在する場合)のために呼び出されたときに、使用する別のマージドライバーを指定します。指定されていない場合、ドライバー自体が内部マージと最終マージの両方に使用されます。
マージドライバーは、プレースホルダー %P
を使用して、マージ結果が保存されるパス名を知ることができます。共通の祖先、ローカルヘッド、およびその他のヘッドに使用されるコンフリクトラベルは、それぞれ %S、%X、%Y
を使用して渡すことができます。
空白エラーの確認
whitespace
core.whitespace
設定変数を使用すると、プロジェクト内のすべてのパスについて、diff および apply が空白エラーと見なすものを定義できます(git-config[1] を参照)。この属性を使用すると、パスごとに細かく制御できます。
アーカイブの作成
export-subst
ファイルに属性 export-subst
が設定されている場合、Git はこのファイルをアーカイブに追加するときにいくつかのプレースホルダーを展開します。展開はコミット ID の可用性に依存します。つまり、git-archive[1] にコミットまたはタグではなくツリーが与えられている場合、置換は行われません。プレースホルダーは git-log[1] のオプション --pretty=format:
のプレースホルダーと同じですが、ファイル内で $Format:PLACEHOLDERS$
のようにラップする必要があります。例:文字列 $Format:%H$
はコミットハッシュに置き換えられます。ただし、サービス拒否攻撃を回避するために、1つのアーカイブにつき 1 つの %(describe)
プレースホルダーのみが展開されます。
GUI ツールでのファイルの表示
encoding
この属性の値は、GUI ツール(例:gitk[1] および git-gui[1])が関連ファイルのコンテンツを表示するために使用する文字エンコーディングを指定します。パフォーマンス上の考慮事項により、gitk[1] はオプションでファイルごとのエンコーディングを手動で有効にしない限り、この属性を使用しないことに注意してください。
この属性が設定されていないか、無効な値の場合、代わりに gui.encoding
設定変数の値が使用されます(git-config[1] を参照)。
マクロ属性の使用
追跡するバイナリファイルに対して、行末変換やテキスト差分を生成する必要はありません。たとえば、次のように指定する必要があります。
*.jpg -text -diff
ただし、多くの属性がある場合は面倒になる可能性があります。マクロ属性を使用すると、設定されたときに、同時に他の多数の属性を設定または未設定にする属性を定義できます。システムは組み込みのマクロ属性 binary
を認識しています。
*.jpg binary
「binary」属性を設定すると、上記のように「text」および「diff」属性も未設定になります。マクロ属性は「設定」のみが可能ですが、設定すると他の属性を設定または未設定にしたり、他の属性を「未指定」状態に戻したりする効果がある場合があることに注意してください。
マクロ属性の定義
カスタムマクロ属性は、トップレベルの gitattributes ファイル($GIT_DIR/info/attributes
、作業ツリーのトップレベルにある .gitattributes
ファイル、またはグローバルまたはシステム全体の gitattributes ファイル)でのみ定義でき、作業ツリーのサブディレクトリにある .gitattributes
ファイルでは定義できません。組み込みのマクロ属性「binary」は、次と同等です。
[attr]binary -diff -merge -text
注記
Git は、作業ツリー内の .gitattributes
ファイルにアクセスするときに、シンボリックリンクをフォローしません。これにより、ファイルがインデックスまたはツリーからアクセスされる場合と、ファイルシステムからアクセスされる場合の一貫性が保たれます。
例
これら3つの gitattributes
ファイルがある場合
(in $GIT_DIR/info/attributes) a* foo !bar -baz (in .gitattributes) abc foo bar baz (in t/.gitattributes) ab* merge=filfre abc -foo -bar *.c frotz
パス t/abc
に与えられる属性は、次のように計算されます
-
t/.gitattributes
(問題のパスと同じディレクトリにある)を調べると、Git は最初の行が一致することを確認します。merge
属性が設定されます。また、2行目も一致することを確認し、属性foo
およびbar
は未設定になります。 -
次に、
.gitattributes
(親ディレクトリにある)を調べ、Git は最初の行が一致することを確認しますが、t/.gitattributes
ファイルがmerge
、foo
、およびbar
属性をこのパスにどのように与えるべきかをすでに決定しているため、foo
およびbar
は未設定のままになります。属性baz
が設定されます。 -
最後に、
$GIT_DIR/info/attributes
を調べます。このファイルは、ツリー内の設定をオーバーライドするために使用されます。最初の行が一致し、foo
が設定され、bar
は未指定状態に戻り、baz
は未設定になります。
結果として、t/abc
への属性の割り当ては次のようになります。
foo set to true bar unspecified baz set to false merge set to string value "filfre" frotz unspecified
GIT
git[1] スイートの一部