@@ -93,7 +93,7 @@ core.pager は、Git が `log` や `diff` などを出力するときに使う
93
93
94
94
#### help.autocorrect ####
95
95
96
- このオプションが使えるのは Git 1.6.1 以降だけです。Git 1.6 でコマンドを打ち間違えると、こんなふうに表示されます。
96
+ このオプションが使えるのは Git 1.6.1 以降だけです。Git でコマンドを打ち間違えると、こんなふうに表示されます。
97
97
98
98
$ git com
99
99
git: 'com' is not a git-command. See 'git --help'.
@@ -113,13 +113,13 @@ Git では、ターミナルへの出力に色をつけることができます
113
113
114
114
$ git config --global color.ui true
115
115
116
- これを設定すると、出力がターミナルに送られる場合に Git がその出力を色づけします。ほかに false という値を指定することもでき、これは出力に決して色をつけません。また always を指定すると、すべての場合に色をつけます。すべての場合とは、Git コマンドをファイルにリダイレクトしたり他のコマンドにパイプでつないだりする場合も含みます。この設定項目は Git バージョン 1.5.5 で追加されました。それより前のバージョンを使っている場合は、すべての色設定を個別に指定しなければなりません。
116
+ これを設定すると、出力がターミナルに送られる場合に Git がその出力を色づけします。ほかに false という値を指定することもでき、これは出力に決して色をつけません。また always を指定すると、すべての場合に色をつけます。すべての場合とは、Git コマンドをファイルにリダイレクトしたり他のコマンドにパイプでつないだりする場合も含みます。
117
117
118
118
` color.ui = always ` を使うことは、まずないでしょう。たいていの場合は、カラーコードを含む結果をリダイレクトしたい場合は Git コマンドに ` --color ` フラグを渡してカラーコードの使用を強制します。ふだんは ` color.ui = true ` の設定で要望を満たせるでしょう。
119
119
120
120
#### ` color.* ` ####
121
121
122
- どのコマンドをどのように色づけするかをより細やかに指定したい場合、あるいはバージョンが古くて先ほどの設定が使えない場合は、 コマンド単位の色づけ設定を使用します。これらの項目には ` true ` 、` false ` あるいは ` always ` を指定することができます。
122
+ どのコマンドをどのように色づけするかをより細やかに指定したい場合、コマンド単位の色づけ設定を使用します。これらの項目には ` true ` 、` false ` あるいは ` always ` を指定することができます。
123
123
124
124
color.branch
125
125
color.diff
@@ -128,7 +128,7 @@ Git では、ターミナルへの出力に色をつけることができます
128
128
129
129
さらに、これらの項目ではサブ設定が使え、出力の一部について特定の色を使うように指定することもできます。たとえば、diff の出力でのメタ情報を青の太字で出力させたい場合は次のようにします。
130
130
131
- $ git config --global color.diff.meta “ blue black bold”
131
+ $ git config --global color.diff.meta " blue black bold"
132
132
133
133
色として指定できる値は normal、black、red、green、yellow、blue、magenta、cyan あるいは white のいずれかです。先ほどの例の bold のように属性を指定することもできます。bold、dim、ul、blink および reverse のいずれかを指定できます。
134
134
@@ -156,13 +156,13 @@ diff のラッパーは、7 つの引数が渡されていることを確認し
156
156
157
157
ここで必要な引数は ` old-file ` と ` new-file ` だけなので、ラッパースクリプトではこれらを渡すようにします。
158
158
159
- $ cat /usr/local/bin/extDiff
159
+ $ cat /usr/local/bin/extDiff
160
160
#!/bin/sh
161
161
[ $# -eq 7 ] && /usr/local/bin/extMerge "$2" "$5"
162
162
163
163
また、これらのツールは実行可能にしておかなければなりません。
164
164
165
- $ sudo chmod +x /usr/local/bin/extMerge
165
+ $ sudo chmod +x /usr/local/bin/extMerge
166
166
$ sudo chmod +x /usr/local/bin/extDiff
167
167
168
168
これで、自前のマージツールや diff ツールを使えるように設定する準備が整いました。設定項目はひとつだけではありません。まず ` merge.tool ` でどんなツールを使うのかを Git に伝え、` mergetool.*.cmd ` でそのコマンドを実行する方法を指定し、` mergetool.trustExitCode ` では「そのコマンドの終了コードでマージが成功したかどうかを判断できるのか」を指定し、` diff.external ` では diff の際に実行するコマンドを指定します。つまり、このような 4 つのコマンドを実行することになります。
@@ -184,20 +184,20 @@ diff のラッパーは、7 つの引数が渡されていることを確認し
184
184
external = extDiff
185
185
186
186
すべて設定し終えたら、
187
-
187
+
188
188
$ git diff 32d1776b1^ 32d1776b1
189
189
190
190
このような diff コマンドを実行すると、結果をコマンドラインに出力するかわりに P4Merge を立ち上げ、図 7-1 のようになります。
191
191
192
- Insert 18333fig0701.png
192
+ Insert 18333fig0701.png
193
193
図 7-1. P4Merge
194
194
195
195
ふたつのブランチをマージしてコンフリクトが発生した場合は ` git mergetool ` を実行します。すると P4Merge が立ち上がり、コンフリクトの解決を GUI ツールで行えるようになります。
196
196
197
197
このようなラッパーを設定しておくと、あとで diff ツールやマージツールを変更したくなったときにも簡単に変更することができます。たとえば ` extDiff ` や ` extMerge ` で KDiff3 を実行させるように変更するには ` extMerge ` ファイルをこのように変更するだけでよいのです。
198
198
199
199
$ cat /usr/local/bin/extMerge
200
- #!/bin/sh
200
+ #!/bin/sh
201
201
/Applications/kdiff3.app/Contents/MacOS/kdiff3 $*
202
202
203
203
これで、Git での diff の閲覧やコンフリクトの解決の際に KDiff3 が立ち上がるようになりました。
@@ -301,19 +301,19 @@ Git の属性を使ってできるちょっとした技として、どのファ
301
301
302
302
*.pbxproj -crlf -diff
303
303
304
- これで、Git が CRLF 問題の対応をすることもなくなりますし、git show や git diff を実行したときにもこのファイルの diff を調べることはなくなります。Git 1.6 系では、次のようなマクロを使うこともできます 。これは ` -crlf -diff ` と同じ意味です。
304
+ これで、Git が CRLF 問題の対応をすることもなくなりますし、` git show ` や ` git diff ` を実行したときにもこのファイルの diff を調べることはなくなります。また、次のようなマクロ ` binary ` を使うこともできます 。これは ` -crlf -diff ` と同じ意味です。
305
305
306
306
*.pbxproj binary
307
307
308
308
#### バイナリファイルの差分 ####
309
309
310
- Git 1.6系では 、バイナリファイルの差分を効果的に扱うためにGitの属性機能を使うことができます。通常のdiff機能を使って比較を行うことができるように、バイナリデータをテキストデータに変換する方法をGitに教えればいいのです。
310
+ Gitでは 、バイナリファイルの差分を効果的に扱うためにGitの属性機能を使うことができます。通常のdiff機能を使って比較を行うことができるように、バイナリデータをテキストデータに変換する方法をGitに教えればいいのです。
311
311
312
312
##### MS Word ファイル #####
313
313
314
- これは素晴らしい機能ですがほとんど知られていないので、少し例をあげてみたいと思います。あなたはまず最初に人類にとっても最も厄介な問題のひとつを解決するためにこのテクニックを使いたいと思うでしょう。そう、Wordで作成した文書のバージョン管理です。奇妙なことに、Wordは最悪のエディタだと全ての人が知ってるいるにも係わらず 、全ての人がWordを使っています。Word文書をバージョン管理したいと思ったなら、Gitのリポジトリにそれらを追加して、まとめてcommitすればいいのです。しかし、それでいいのでしょうか? あなたが'git diff'をいつも通りに実行すると、次のように表示されるだけです。
314
+ これは素晴らしい機能ですがほとんど知られていないので、少し例をあげてみたいと思います。あなたはまず最初に人類にとっても最も厄介な問題のひとつを解決するためにこのテクニックを使いたいと思うでしょう。そう、Wordで作成した文書のバージョン管理です。奇妙なことに、Wordは最悪のエディタだと全ての人が知っているにも係わらず 、全ての人がWordを使っています。Word文書をバージョン管理したいと思ったなら、Gitのリポジトリにそれらを追加して、まとめてcommitすればいいのです。しかし、それでいいのでしょうか? あなたが'git diff'をいつも通りに実行すると、次のように表示されるだけです。
315
315
316
- $ git diff
316
+ $ git diff
317
317
diff --git a/chapter1.doc b/chapter1.doc
318
318
index 88839c4..4afcb7c 100644
319
319
Binary files a/chapter1.doc and b/chapter1.doc differ
@@ -371,13 +371,13 @@ OpenDocument ファイルの正体は zip で、複数のファイル (XML 形
371
371
#! /usr/bin/env perl
372
372
# Simplistic OpenDocument Text (.odt) to plain text converter.
373
373
# Author: Philipp Kempgen
374
-
374
+
375
375
if (! defined($ARGV[0])) {
376
376
print STDERR "No filename given!\n";
377
377
print STDERR "Usage: $0 filename\n";
378
378
exit 1;
379
379
}
380
-
380
+
381
381
my $content = '';
382
382
open my $fh, '-|', 'unzip', '-qq', '-p', $ARGV[0], 'content.xml' or die $!;
383
383
{
@@ -446,17 +446,17 @@ SubversionやCVSを使っていた開発者から、キーワード展開機能
446
446
447
447
$ rm test.txt
448
448
$ git checkout -- test.txt
449
- $ cat test.txt
449
+ $ cat test.txt
450
450
$Id: 42812b7653c7b88933f8a9d6cad0ca16714b9bb3 $
451
451
452
452
しかし、このやりかたには制限があります。CVSやSubversionのキーワード展開ではタイムスタンプを含めることができます。対して、SHA-1チェックサムは完全にランダムな値ですから、2つの値の新旧を知るための助けにはなりません。
453
453
454
454
これには、commit/checkout時にキーワード展開を行うためのフィルタを書いてやることで対応できます。このために"clean"と"smudge"フィルタがあります。特定のファイルに対して使用するフィルタを設定し、checkoutされる前("smudge" 図7-2参照)もしくはcommitされる前("clean" 図7-3参照)に指定したスクリプトが実行させるよう、` .gitattributes ` ファイルで設定できます。これらのフィルタはあらゆる種類の面白い内容を実行するように設定できます。
455
455
456
- Insert 18333fig0702.png
456
+ Insert 18333fig0702.png
457
457
図7-2. checkoutする時に"smudge"フィルタを実行する
458
458
459
- Insert 18333fig0703.png
459
+ Insert 18333fig0703.png
460
460
図7-3. ステージする時に"clean"フィルタを実行する。
461
461
462
462
この機能に対してオリジナルのcommitメッセージは簡単な例を与えてくれています。それはcommit前にあなたのCのソースコードを` indent ` プログラムに通すというものです。` *.c ` ファイルに対して"indent"フィルタを実行するように、` .gitattributes ` ファイルにfilter属性を設定することができます。
@@ -548,7 +548,7 @@ Git属性を使えば、プロジェクトにある指定したファイルに
548
548
549
549
### フックをインストールする ###
550
550
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となっていますので適時リネームしてください。
552
552
553
553
フックスクリプトを有効にするには、Gitディレクトリの` hooks ` サブディレクトリに適切な名前の実行可能なファイルを配置する必要があります。これによってファイルが呼び出されることになります。ここでは重要なフックファイル名をいくつか取り上げます。
554
554
@@ -736,15 +736,15 @@ SHA-1 値がわかっているときにコミットからコミットメッセ
736
736
access[$user].each do |access_path|
737
737
if !access_path || # user has access to everything
738
738
(path.index(access_path) == 0) # access to this path
739
- has_file_access = true
739
+ has_file_access = true
740
740
end
741
741
end
742
742
if !has_file_access
743
743
puts "[POLICY] You do not have access to push to #{path}"
744
744
exit 1
745
745
end
746
746
end
747
- end
747
+ end
748
748
end
749
749
750
750
check_directory_perms
@@ -755,11 +755,11 @@ SHA-1 値がわかっているときにコミットからコミットメッセ
755
755
756
756
#### Fast-Forward なプッシュへの限定 ####
757
757
758
- 最後は、fast-forward なプッシュに限るという仕組みです。Git バージョン 1.6 以降には ` receive.denyDeletes ` および ` receive.denyNonFastForwards ` という設定項目がありますが、これをフックで記述しておけば、古いバージョンの Git でも動作します。また、 特定のユーザーにだけこの制約を加えたいなどといった変更にも対応できます。
758
+ 最後は、fast-forward なプッシュに限るという仕組みです。 ` receive.denyDeletes ` および ` receive.denyNonFastForwards ` という設定項目で設定できます。また、フックを用いてこの制限を課すこともできますし、 特定のユーザーにだけこの制約を加えたいなどといった変更にも対応できます。
759
759
760
760
これを調べるには、旧リビジョンからたどれるすべてのコミットについて、新リビジョンから到達できないものがないかどうかを探します。もしひとつもなければ、それは fast-forward なプッシュです。ひとつでも見つかれば、却下することになります。
761
761
762
- # enforces fast-forward only pushes
762
+ # enforces fast-forward only pushes
763
763
def check_fast_forward
764
764
missed_refs = `git rev-list #{$newrev}..#{$oldrev}`
765
765
missed_ref_count = missed_refs.split("\n").size
@@ -779,9 +779,9 @@ SHA-1 値がわかっているときにコミットからコミットメッセ
779
779
Writing objects: 100% (3/3), 323 bytes, done.
780
780
Total 3 (delta 1), reused 0 (delta 0)
781
781
Unpacking objects: 100% (3/3), done.
782
- Enforcing Policies...
782
+ Enforcing Policies...
783
783
(refs/heads/master) (8338c5) (c5b616)
784
- [POLICY] Cannot push a non- fast-forward reference
784
+ [POLICY] Cannot push a non fast-forward reference
785
785
error: hooks/update exited with error code 1
786
786
error: hook declined to update refs/heads/master
787
787
To git@gitserver:project.git
@@ -790,8 +790,8 @@ SHA-1 値がわかっているときにコミットからコミットメッセ
790
790
791
791
この中には、いくつか興味深い点があります。まず、フックの実行が始まったときの次の表示に注目しましょう。
792
792
793
- Enforcing Policies...
794
- (refs/heads/master) (fb8c72 ) (c56860 )
793
+ Enforcing Policies...
794
+ (refs/heads/master) (8338c5 ) (c5b616 )
795
795
796
796
これは、スクリプトの先頭で標準出力に表示した内容でした。ここで重要なのは「スクリプトから標準出力に送った内容は、すべてクライアントにも送られる」ということです。
797
797
@@ -917,7 +917,7 @@ SHA-1 値がわかっているときにコミットからコミットメッセ
917
917
target_shas.each do |sha|
918
918
remote_refs.each do |remote_ref|
919
919
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)
921
921
puts "[POLICY] Commit #{sha} has already been pushed to #{remote_ref}"
922
922
exit 1
923
923
end
0 commit comments