「"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バイトのまま)

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/04/24 02:17:24
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:snow0214 No.1

回答回数470ベストアンサー獲得回数116

ポイント50pt

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

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

 *.exe binary

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

 *.exe -crlf -diff

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

id:miscellaneousness

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

2014/04/20 18:09:15
id:gizmo5 No.2

回答回数504ベストアンサー獲得回数141

ポイント50pt

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

バイナリファイルの特定

テキストファイルのように見えるファイルであっても、何らかの目的のために意図的にバイナリデータとして扱いたいこともあります。たとえば、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 などでも同じことです。

id:miscellaneousness

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

2014/04/20 18:23:46
id:sasada No.3

回答回数1482ベストアンサー獲得回数133

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

 *.exe -crlf 

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

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

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません