27033
ソースコードと一緒に、WebフォントファイルをGit環境（GitHub）に入れて管理しています。  
[このサイトの説明](http://ts0818.hatenablog.com/entry/2016/04/01/225341)にあるように、フォントファイルが壊れてしまったので、.gitattributesで対策をしたいと考えています。  
ただ、現在はGitのリポジトリに.gitattributesファイルはありません。

ここで以下の点を心配しています。

### (1) 今までGitは何の設定を見て動いていた？ これからは何の設定を見て動く？

今回新たに、使用しているWebフォントをbinaryとして扱う設定が記述された.gitattributesファイルを作成しようと思っています。  
ただ、これをリポジトリに追加することにより、Webフォント以外のファイルについて、挙動が変化することはありますか？  
例えば、どこかに別のデフォルト設定ファイルが存在し（SourceTreeを使っているので、SourceTreeで持っている設定ファイルとか）、今まではそれを見て動いていたが、.gitattributesをリポジトリに追加することで、元の設定が全て無視されてしまう、といったことが起きないか心配しています。

### (2) 改行コードの変換はどの瞬間に行われる？

GitHub（クライアントはSourceTree）を使って複数人で、複数のブランチを使って開発しています。  
.gitattributesファイルをリポジトリに追加すれば、いずれ全員の（全てまたは一部のブランチ）に、このファイルが行き渡ると思いますが、どのような状態に至れば、Webフォントファイルを安心してコミットできるのでしょうか？  
例えば、各々の **ローカルリポジトリにコミットする瞬間** に、 **コミットしたファイルだけ**
に対して改行コードが変換されるのであれば、Webフォントファイルをコミットするのはチームで私だけですので、あまり気にすることなくさっさとコミットすることができると考えています。
CC BY-SA 3.0
2016-06-24T09:41:10.603
27025
2016-06-24T13:50:57.723
8078
question
git
.gitattributesはどこにあるのか？　いつ適用されるのか？
.gitattributes は、 .gitignore と同じような形で動作すると理解しています。

具体的には、グローバルな設定 + レポジトリのファイルとして存在する .gitXXXX の設定で、  
後者の後勝ち設定であわせたものが実際の設定として使われていたはずです。

.gitattributes を指定する前に、何を見て動いていたかはちょっと把握しきれていませんが、  
.gitattributes を作成しても、その中で設定を行った部分しか、これまでの挙動と差分は生じないはずです。

また、.gitattributes は、コミットや add されている必要はなく、ファイルとして存在すれば、効力を発揮します。

どのタイミングで影響が及ぼされるかと言うと、 git add するタイミングで、 改行コードの変換は行われているはずです。
CC BY-SA 3.0
2016-06-24T11:47:48.660
27029
2016-06-24T12:01:36.723
2016-06-24T12:01:36.723
754
754
27025
answer
> (1) 今までGitは何の設定を見て動いていた？ これからは何の設定を見て動く？

`.gitattributes`
はその他の設定と同様、システム全体、ユーザーごと、ディレクトリごと、リポジトリごとといった様々な場所から読み込まれ、指定した属性単位で上書きされます。

  * [Git - 最初のGitの構成](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-%E6%9C%80%E5%88%9D%E3%81%AEGit%E3%81%AE%E6%A7%8B%E6%88%90)
  * [Where should I place my global 'gitattributes' file? - Stack Overflow](https://stackoverflow.com/a/28027656/2818869)

例えば、

```

    # binary は -text -diff の省略形
    *.woff binary
    
```

この指定は `*.woff` に該当するファイルについて `text` `diff`
をオフにするという意味でしかないので、それ以外のファイルやそれ以外の属性（`export-ignore` とか）には影響しません。

もっとも、システムやユーザー単位での設定の恩恵にあずかっていたとするなら、リポジトリを扱う人の間で違いが出る可能性もあるわけですから、プロジェクトの参加者の間で統一しておきたいことは全て書いておいた方が安心という考え方もできます。

> (2) 改行コードの変換はどの瞬間に行われる？

今回問題となっている改行コード変換は autocrlf と呼ばれる設定によるもので、Git for Windows
のデフォルトでは「コミット時（正確には多分 `git add` したとき）にLFに変換し、チェックアウト時にCRLFに変換する」という挙動をします。

`.gitattribtues` と修正を同時にコミットしたとしても、チェックアウト時にその `.gitattributes`
を考慮してくれますから、一緒にコミットしてしまって問題ありません。

* * *

なお `core.safecrlf`
という設定で、改行コードの混在したファイルを誤って統一してしまうことを防ぐことができますが、間違えてバイナリファイルに改行コード変換が適用されようとした時にもこれで気づける可能性があります。万全ではありませんが。

  * [git config の core.safecrlf って何のためよ？ - 必ず隣あり](http://d.hatena.ne.jp/couichi/20110207/1297101115)
CC BY-SA 3.0
2016-06-24T13:50:57.723
27033
2016-06-24T13:50:57.723
2017-05-23T12:38:55.250
-1
8000
27025
answer