人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

「"git config --global core.autocrlf true"がお薦め」という流言
Gitを使ってみようと思ってネットを検索してみると、「Windows上では"git config --global core.autocrlf true"がお薦め」と書いているサイトがたくさんあったのですが、これをやるとバイナリファイルが壊れます。
こういう設定がある時点でVisual SourceSafeと同じようにバイナリファイルを壊すのでは…と思って以下のようにやってみたら、予想通り壊れました。
Gitで適切にテキスト・バイナリファイルを扱うにはどうするのがお薦めでしょうか?
(Boostライブラリのようにもれなく属性を設定するしかない?>https://github.com/boostorg/boost/blob/master/.gitattributes)

■バイナリファイルの壊し方
(1)"autocrlf = false"の環境でGitリポジトリを作成する(リポジトリA)
(2)16進数で"0A"とだけ書いた1バイトのバイナリファイル"test.dat"をコミットする
(3)リポジトリAのbareクローンリポジトリを作成する(リポジトリB)
(4)"autocrlf = true"の環境でリポジトリBのクローンリポジトリを作成する(リポジトリC)
→ワークツリー内のファイルtest.datの中身が"0D 0A"になっている(リポジトリC内のファイルは1バイトのまま)

●質問者: ガー!
●カテゴリ:コンピュータ インターネット
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● snow0214
●50ポイント

Gitは、ソースコード(テキストファイル)管理ツールなので、バイナリファイルの管理は苦手です。
差分出力でファイルを壊しているので、バイナリファイルに対して差分出力できなくします。

たとえば、バイナリファイルの拡張子が *.exe だとしたら、管理下のルートディレクトリに .gitignoreファイルを作成して、以下のように記述します。

 *.exe binary

以下のように記述しても同じです。

 *.exe -crlf -diff

テキストとバイナリを管理するのだったらsubversion(TortoiseSVN http://tortoisesvn.net/)の方がいいと思います。


ガー!さんのコメント
今まではSubversionを使っていてバイナリファイルを壊すことはなかったのですが、常時オンラインでないと使い難い所があるので分散型のGitを検討しています。 SVKは開発が止まっているようなので。

2 ● gizmo5
●50ポイント

少々長い引用ですが、公式のドキュメントの翻訳を引用します。

バイナリファイルの特定

テキストファイルのように見えるファイルであっても、何らかの目的のために意図的にバイナリデータとして扱いたいこともあります。たとえば、Mac の Xcode プロジェクトの中には .pbxproj で終わる名前のファイルがあります。これは JSON (プレーンテキスト形式の javascript のデータフォーマット) のデータセットで、IDE がビルド設定などをディスクに書き出したものです。すべて ASCII で構成されるので、理論上はこれはテキストファイルです。しかしこのファイルをテキストファイルとして扱いたくはありません。実際のところ、このファイルは軽量なデータベースとして使われているからです。他の人が変更した内容をマージすることはできませんし、diff をとってもあまり意味がありません。このファイルは、基本的に機械が処理するものなのです。要するに、バイナリファイルと同じように扱いたいということです。

すべての pbxproj ファイルをバイナリデータとして扱うよう Git に指定するには、次の行を .gitattributes ファイルに追加します。

*.pbxproj -crlf -diff

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

*.pbxproj binary

https://github.com/progit/progit.github.com/blob/master/translations/ja/07-customizing-git/01-chapter7.markdown



同じファイルに記載がありますが、git に commit する環境が Windows に限定できるなら autocrlf = false でも良いと思います。
往々にして、当初の想定は崩れるのが常ですが。
これは、Git だけではなく Subversion や CVS などでも同じことです。


ガー!さんのコメント
Subversionにはautocrlfに相当するものはなかったと思います。 改行コードを自動変換して欲しい場合は、属性"svn:eol-style=native"を付けてコミットしておけば全員に強制できますが、Gitのautocrlfは全員に強制できないのでユーザーの設定次第で壊してしまいます。 (なのでautocrlfの存在意義がわからない)

3 ● sasada
●0ポイント

バイナリファイル、例えばexeファイルのdiffを取りたいが壊したくないということならば、

 *.exe -crlf 

とするしか無いと思います。
ちなみにautocrlfは
git config --global core.autocrlf input

として、windowsのときのみCRの削除をする設定がお進めです。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ