Skip to content

Commit 89600ac

Browse files
committed
Merge pull request progit#415 from harupong/ja-chapter7
[ja] Update chapter7
2 parents 466041d + 7722648 commit 89600ac

File tree

1 file changed

+28
-28
lines changed

1 file changed

+28
-28
lines changed

ja/07-customizing-git/01-chapter7.markdown

+28-28
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ core.pager は、Git が `log` や `diff` などを出力するときに使う
9393

9494
#### help.autocorrect ####
9595

96-
このオプションが使えるのは Git 1.6.1 以降だけです。Git 1.6 でコマンドを打ち間違えると、こんなふうに表示されます。
96+
このオプションが使えるのは Git 1.6.1 以降だけです。Git でコマンドを打ち間違えると、こんなふうに表示されます。
9797

9898
$ git com
9999
git: 'com' is not a git-command. See 'git --help'.
@@ -113,13 +113,13 @@ Git では、ターミナルへの出力に色をつけることができます
113113

114114
$ git config --global color.ui true
115115

116-
これを設定すると、出力がターミナルに送られる場合に Git がその出力を色づけします。ほかに false という値を指定することもでき、これは出力に決して色をつけません。また always を指定すると、すべての場合に色をつけます。すべての場合とは、Git コマンドをファイルにリダイレクトしたり他のコマンドにパイプでつないだりする場合も含みます。この設定項目は Git バージョン 1.5.5 で追加されました。それより前のバージョンを使っている場合は、すべての色設定を個別に指定しなければなりません。
116+
これを設定すると、出力がターミナルに送られる場合に Git がその出力を色づけします。ほかに false という値を指定することもでき、これは出力に決して色をつけません。また always を指定すると、すべての場合に色をつけます。すべての場合とは、Git コマンドをファイルにリダイレクトしたり他のコマンドにパイプでつないだりする場合も含みます。
117117

118118
`color.ui = always` を使うことは、まずないでしょう。たいていの場合は、カラーコードを含む結果をリダイレクトしたい場合は Git コマンドに `--color` フラグを渡してカラーコードの使用を強制します。ふだんは `color.ui = true` の設定で要望を満たせるでしょう。
119119

120120
#### `color.*` ####
121121

122-
どのコマンドをどのように色づけするかをより細やかに指定したい場合、あるいはバージョンが古くて先ほどの設定が使えない場合は、コマンド単位の色づけ設定を使用します。これらの項目には `true``false` あるいは `always` を指定することができます。
122+
どのコマンドをどのように色づけするかをより細やかに指定したい場合、コマンド単位の色づけ設定を使用します。これらの項目には `true``false` あるいは `always` を指定することができます。
123123

124124
color.branch
125125
color.diff
@@ -128,7 +128,7 @@ Git では、ターミナルへの出力に色をつけることができます
128128

129129
さらに、これらの項目ではサブ設定が使え、出力の一部について特定の色を使うように指定することもできます。たとえば、diff の出力でのメタ情報を青の太字で出力させたい場合は次のようにします。
130130

131-
$ git config --global color.diff.meta blue black bold
131+
$ git config --global color.diff.meta "blue black bold"
132132

133133
色として指定できる値は normal、black、red、green、yellow、blue、magenta、cyan あるいは white のいずれかです。先ほどの例の bold のように属性を指定することもできます。bold、dim、ul、blink および reverse のいずれかを指定できます。
134134

@@ -156,13 +156,13 @@ diff のラッパーは、7 つの引数が渡されていることを確認し
156156

157157
ここで必要な引数は `old-file``new-file` だけなので、ラッパースクリプトではこれらを渡すようにします。
158158

159-
$ cat /usr/local/bin/extDiff
159+
$ cat /usr/local/bin/extDiff
160160
#!/bin/sh
161161
[ $# -eq 7 ] && /usr/local/bin/extMerge "$2" "$5"
162162

163163
また、これらのツールは実行可能にしておかなければなりません。
164164

165-
$ sudo chmod +x /usr/local/bin/extMerge
165+
$ sudo chmod +x /usr/local/bin/extMerge
166166
$ sudo chmod +x /usr/local/bin/extDiff
167167

168168
これで、自前のマージツールや diff ツールを使えるように設定する準備が整いました。設定項目はひとつだけではありません。まず `merge.tool` でどんなツールを使うのかを Git に伝え、`mergetool.*.cmd` でそのコマンドを実行する方法を指定し、`mergetool.trustExitCode` では「そのコマンドの終了コードでマージが成功したかどうかを判断できるのか」を指定し、`diff.external` では diff の際に実行するコマンドを指定します。つまり、このような 4 つのコマンドを実行することになります。
@@ -184,20 +184,20 @@ diff のラッパーは、7 つの引数が渡されていることを確認し
184184
external = extDiff
185185

186186
すべて設定し終えたら、
187-
187+
188188
$ git diff 32d1776b1^ 32d1776b1
189189

190190
このような diff コマンドを実行すると、結果をコマンドラインに出力するかわりに P4Merge を立ち上げ、図 7-1 のようになります。
191191

192-
Insert 18333fig0701.png
192+
Insert 18333fig0701.png
193193
図 7-1. P4Merge
194194

195195
ふたつのブランチをマージしてコンフリクトが発生した場合は `git mergetool` を実行します。すると P4Merge が立ち上がり、コンフリクトの解決を GUI ツールで行えるようになります。
196196

197197
このようなラッパーを設定しておくと、あとで diff ツールやマージツールを変更したくなったときにも簡単に変更することができます。たとえば `extDiff``extMerge` で KDiff3 を実行させるように変更するには `extMerge` ファイルをこのように変更するだけでよいのです。
198198

199199
$ cat /usr/local/bin/extMerge
200-
#!/bin/sh
200+
#!/bin/sh
201201
/Applications/kdiff3.app/Contents/MacOS/kdiff3 $*
202202

203203
これで、Git での diff の閲覧やコンフリクトの解決の際に KDiff3 が立ち上がるようになりました。
@@ -301,19 +301,19 @@ Git の属性を使ってできるちょっとした技として、どのファ
301301

302302
*.pbxproj -crlf -diff
303303

304-
これで、Git が CRLF 問題の対応をすることもなくなりますし、git show や git diff を実行したときにもこのファイルの diff を調べることはなくなります。Git 1.6 系では、次のようなマクロを使うこともできます。これは `-crlf -diff` と同じ意味です。
304+
これで、Git が CRLF 問題の対応をすることもなくなりますし、`git show``git diff` を実行したときにもこのファイルの diff を調べることはなくなります。また、次のようなマクロ`binary`を使うこともできます。これは `-crlf -diff` と同じ意味です。
305305

306306
*.pbxproj binary
307307

308308
#### バイナリファイルの差分 ####
309309

310-
Git 1.6系では、バイナリファイルの差分を効果的に扱うためにGitの属性機能を使うことができます。通常のdiff機能を使って比較を行うことができるように、バイナリデータをテキストデータに変換する方法をGitに教えればいいのです。
310+
Gitでは、バイナリファイルの差分を効果的に扱うためにGitの属性機能を使うことができます。通常のdiff機能を使って比較を行うことができるように、バイナリデータをテキストデータに変換する方法をGitに教えればいいのです。
311311

312312
##### MS Word ファイル #####
313313

314-
これは素晴らしい機能ですがほとんど知られていないので、少し例をあげてみたいと思います。あなたはまず最初に人類にとっても最も厄介な問題のひとつを解決するためにこのテクニックを使いたいと思うでしょう。そう、Wordで作成した文書のバージョン管理です。奇妙なことに、Wordは最悪のエディタだと全ての人が知ってるいるにも係わらず、全ての人がWordを使っています。Word文書をバージョン管理したいと思ったなら、Gitのリポジトリにそれらを追加して、まとめてcommitすればいいのです。しかし、それでいいのでしょうか? あなたが'git diff'をいつも通りに実行すると、次のように表示されるだけです。
314+
これは素晴らしい機能ですがほとんど知られていないので、少し例をあげてみたいと思います。あなたはまず最初に人類にとっても最も厄介な問題のひとつを解決するためにこのテクニックを使いたいと思うでしょう。そう、Wordで作成した文書のバージョン管理です。奇妙なことに、Wordは最悪のエディタだと全ての人が知っているにも係わらず、全ての人がWordを使っています。Word文書をバージョン管理したいと思ったなら、Gitのリポジトリにそれらを追加して、まとめてcommitすればいいのです。しかし、それでいいのでしょうか? あなたが'git diff'をいつも通りに実行すると、次のように表示されるだけです。
315315

316-
$ git diff
316+
$ git diff
317317
diff --git a/chapter1.doc b/chapter1.doc
318318
index 88839c4..4afcb7c 100644
319319
Binary files a/chapter1.doc and b/chapter1.doc differ
@@ -371,13 +371,13 @@ OpenDocument ファイルの正体は zip で、複数のファイル (XML 形
371371
#! /usr/bin/env perl
372372
# Simplistic OpenDocument Text (.odt) to plain text converter.
373373
# Author: Philipp Kempgen
374-
374+
375375
if (! defined($ARGV[0])) {
376376
print STDERR "No filename given!\n";
377377
print STDERR "Usage: $0 filename\n";
378378
exit 1;
379379
}
380-
380+
381381
my $content = '';
382382
open my $fh, '-|', 'unzip', '-qq', '-p', $ARGV[0], 'content.xml' or die $!;
383383
{
@@ -446,17 +446,17 @@ SubversionやCVSを使っていた開発者から、キーワード展開機能
446446

447447
$ rm test.txt
448448
$ git checkout -- test.txt
449-
$ cat test.txt
449+
$ cat test.txt
450450
$Id: 42812b7653c7b88933f8a9d6cad0ca16714b9bb3 $
451451

452452
しかし、このやりかたには制限があります。CVSやSubversionのキーワード展開ではタイムスタンプを含めることができます。対して、SHA-1チェックサムは完全にランダムな値ですから、2つの値の新旧を知るための助けにはなりません。
453453

454454
これには、commit/checkout時にキーワード展開を行うためのフィルタを書いてやることで対応できます。このために"clean"と"smudge"フィルタがあります。特定のファイルに対して使用するフィルタを設定し、checkoutされる前("smudge" 図7-2参照)もしくはcommitされる前("clean" 図7-3参照)に指定したスクリプトが実行させるよう、`.gitattributes`ファイルで設定できます。これらのフィルタはあらゆる種類の面白い内容を実行するように設定できます。
455455

456-
Insert 18333fig0702.png
456+
Insert 18333fig0702.png
457457
図7-2. checkoutする時に"smudge"フィルタを実行する
458458

459-
Insert 18333fig0703.png
459+
Insert 18333fig0703.png
460460
図7-3. ステージする時に"clean"フィルタを実行する。
461461

462462
この機能に対してオリジナルのcommitメッセージは簡単な例を与えてくれています。それはcommit前にあなたのCのソースコードを`indent`プログラムに通すというものです。`*.c`ファイルに対して"indent"フィルタを実行するように、`.gitattributes`ファイルにfilter属性を設定することができます。
@@ -548,7 +548,7 @@ Git属性を使えば、プロジェクトにある指定したファイルに
548548

549549
### フックをインストールする ###
550550

551-
フックはGitディレクトリの`hooks`サブディレクトリに格納されています。一般的なプロジェクトでは、`.git/hooks`がそれにあたります。Gitはデフォルトでこのディレクトリに例となるスクリプトを生成します。それらの多くはそのままでも十分有用ですし、引数も記載されています。全ての例は基本的にシェルスクリプトで書かれています。いくつかPerlを含むものもありますが、適切に命名されたそれらの実行可能スクリプトはうまく動きます。RubyやPython等で自作していただいてもかまいません。バージョン1.6以降のGitの場合、それらのフックファイルの末尾は.sampleとなっていますので適時リネームしてください。バージョン1.6以前のGitの場合ファイル名は適切ですが実行可能にはなっていません
551+
フックはGitディレクトリの`hooks`サブディレクトリに格納されています。一般的なプロジェクトでは、`.git/hooks`がそれにあたります。Gitはデフォルトでこのディレクトリに例となるスクリプトを生成します。それらの多くはそのままでも十分有用ですし、引数も記載されています。全ての例は基本的にシェルスクリプトで書かれています。いくつかPerlを含むものもありますが、適切に命名されたそれらの実行可能スクリプトはうまく動きます。RubyやPython等で自作していただいてもかまいませんそれらのフックファイルの末尾は.sampleとなっていますので適時リネームしてください。
552552

553553
フックスクリプトを有効にするには、Gitディレクトリの`hooks`サブディレクトリに適切な名前の実行可能なファイルを配置する必要があります。これによってファイルが呼び出されることになります。ここでは重要なフックファイル名をいくつか取り上げます。
554554

@@ -736,15 +736,15 @@ SHA-1 値がわかっているときにコミットからコミットメッセ
736736
access[$user].each do |access_path|
737737
if !access_path || # user has access to everything
738738
(path.index(access_path) == 0) # access to this path
739-
has_file_access = true
739+
has_file_access = true
740740
end
741741
end
742742
if !has_file_access
743743
puts "[POLICY] You do not have access to push to #{path}"
744744
exit 1
745745
end
746746
end
747-
end
747+
end
748748
end
749749

750750
check_directory_perms
@@ -755,11 +755,11 @@ SHA-1 値がわかっているときにコミットからコミットメッセ
755755

756756
#### Fast-Forward なプッシュへの限定 ####
757757

758-
最後は、fast-forward なプッシュに限るという仕組みです。Git バージョン 1.6 以降には `receive.denyDeletes` および `receive.denyNonFastForwards` という設定項目がありますが、これをフックで記述しておけば、古いバージョンの Git でも動作します。また、特定のユーザーにだけこの制約を加えたいなどといった変更にも対応できます。
758+
最後は、fast-forward なプッシュに限るという仕組みです。 `receive.denyDeletes` および `receive.denyNonFastForwards` という設定項目で設定できます。また、フックを用いてこの制限を課すこともできますし、特定のユーザーにだけこの制約を加えたいなどといった変更にも対応できます。
759759

760760
これを調べるには、旧リビジョンからたどれるすべてのコミットについて、新リビジョンから到達できないものがないかどうかを探します。もしひとつもなければ、それは fast-forward なプッシュです。ひとつでも見つかれば、却下することになります。
761761

762-
# enforces fast-forward only pushes
762+
# enforces fast-forward only pushes
763763
def check_fast_forward
764764
missed_refs = `git rev-list #{$newrev}..#{$oldrev}`
765765
missed_ref_count = missed_refs.split("\n").size
@@ -779,9 +779,9 @@ SHA-1 値がわかっているときにコミットからコミットメッセ
779779
Writing objects: 100% (3/3), 323 bytes, done.
780780
Total 3 (delta 1), reused 0 (delta 0)
781781
Unpacking objects: 100% (3/3), done.
782-
Enforcing Policies...
782+
Enforcing Policies...
783783
(refs/heads/master) (8338c5) (c5b616)
784-
[POLICY] Cannot push a non-fast-forward reference
784+
[POLICY] Cannot push a non fast-forward reference
785785
error: hooks/update exited with error code 1
786786
error: hook declined to update refs/heads/master
787787
To git@gitserver:project.git
@@ -790,8 +790,8 @@ SHA-1 値がわかっているときにコミットからコミットメッセ
790790

791791
この中には、いくつか興味深い点があります。まず、フックの実行が始まったときの次の表示に注目しましょう。
792792

793-
Enforcing Policies...
794-
(refs/heads/master) (fb8c72) (c56860)
793+
Enforcing Policies...
794+
(refs/heads/master) (8338c5) (c5b616)
795795

796796
これは、スクリプトの先頭で標準出力に表示した内容でした。ここで重要なのは「スクリプトから標準出力に送った内容は、すべてクライアントにも送られる」ということです。
797797

@@ -917,7 +917,7 @@ SHA-1 値がわかっているときにコミットからコミットメッセ
917917
target_shas.each do |sha|
918918
remote_refs.each do |remote_ref|
919919
shas_pushed = `git rev-list ^#{sha}^@ refs/remotes/#{remote_ref}`
920-
if shas_pushed.split(“\n”).include?(sha)
920+
if shas_pushed.split("\n").include?(sha)
921921
puts "[POLICY] Commit #{sha} has already been pushed to #{remote_ref}"
922922
exit 1
923923
end

0 commit comments

Comments
 (0)