Gitで気をつけるべき設定
大体デフォルトで問題ないが, 気をつける必要がある設定がいくつかあるのでメモ.
.gitconfig
> .core
autocrlf
改行コードにまつわる設定. 設定によっては「リポジトリ上だけLF」といったことができる, が, 複数人が利用する以上色々混じる可能性は払拭できず, コレ!と断言できる設定がない.
周辺設定項目として safecrlf
や eol
がある.
詳細は↓とか参照
ignorecase
ファイル名の大文字小文字を区別するかどうかの設定. デフォルトが true
なので, false
にしてやらないと大文字小文字のリネームで面倒なことになる. この設定は常に false
で良いと思う.
filemode
ファイルのパーミッションを扱うかどうかの設定. 基本はデフォルトの true
で問題ないが, Windows環境が混じると厄介. Windowsの場合のみ false
にして, 権限を弄りたい場合 (+x
とか) のみ手動で git update-index --add --chmod=...
するのが無難かな?
タイムスタンプ周り
あまりお目にかかる機会がないかもしれないがGitのCommitに記録されているタイムスタンプは2種類ある (git log --pretty=fuller
で確認できる). 一つは AuthorDate
という基本的には不変のタイムスタンプで, 例えば git commit --amend
しても変わらない. もう一つが CommitDate
でCommit内容が変更されると常に更新される. この2つの違いが厄介で, 何気なく git commit --amend
などをしてしまうと, タイムスタンプの乖離が発生する. これに起因するよくある問題として, 実際のコミットの前後関係とタイムスタンプ情報が一致せず, Gitのネットワーク図が意図しない形になる場合がある. 「それじゃあ最初からタイムスタンプは一つでいいじゃん!」と思うかもしれないが, Author
(作成者) と Commit
(編集者) には意味があり, 例えばGitHub上でのMergeの A committed with B
といった部分は Author
(A
) と Commit
(B
) を利用して実現されている.
解決のための設定
git commit --amend
時
git commit --amend --date=now
とする. これで CommitDate
と AuthorDate
の両方がamend時のタイムスタンプに更新される.
git rebase
時
AuthorDate
を 維持したい 場合
git rebase
を使う目的は「過去の特定コミットメッセージを修正したい」や「一部のコミットをまとめたい」といったものであることが多く, つまりは オリジナルのタイムスタンプを変更したくない 場合が多いだろう. そのような場合は以下の手順でオリジナルのタイムスタンプ (AuthorDate
) にする.
- 普通に
git rebase ...
を行う. interactiveでもそうでなくても. git rebase --committer-date-is-author-date ${遡るCommit, HEAD~1とか}
1.で一旦は CommitDate
と AuthorDate
がズレるものの, 2.で CommitDate
が AuthorDate
に修正される. なお, rootのCommitだけはこの方法で修正できないため, 別途以下の手順を踏む.
git rebase -i --root
でrootのCommitのみをedit
(e
) にする- rootのCommitの
AuthorDate
を手動で取得してきてGIT_COMMITTER_DATE='ここにAuthorDate' git commit --amend
を実行 - 最後に
git rebase --continue
AuthorDate
を 捨てて良い 場合 あまり使う場面がないと思われるが,git rebase --ignore-date ...
とすることでAuthorDate
をCommitDate
に追従させることができる.