Git initial configuration file
git
initで新しくGitリポジトリを作ると,毎回アクセス権の変更を追跡したり,シンボリックリンク(symlink)がテキストファイルに変換されたりしていらいらしていた。そこで,Gitの設定について確認した。
git
configでGit全体の設定ができ,オプションを付けることでその適用範囲を決められる。Gitの設定ファイルは以下の表に掲載したファイルと役割となっている。
表 4.4:
gitの設定ファイル
ファイル
|
設定オプション
|
説明
|
/etc/gitconfig
|
–system
|
全ユーザーの設定
|
~/.gitconfig
|
–global
|
ユーザごとの設定
|
.git/config
|
–local
|
リポジトリごとの設定。git
init実行時に自動作成。git
configの既定の変更。
|
問題となるのは,.git/configの設定だ。git
initを実行すると自動的に以下の内容のファイルが作られる。
$
cat .git/config
[core]
repositoryformatversion
= 0
filemode
= true
bare
= false
logallrefupdates
= true
symlinks
= false
ignorecase
= true
ここで問題となるのが以下の二つの設定だ。
filemode
= true
symlinks
= false
この設定があると,ファイルのアクセス権の変更を追跡し,シンボリックリンクはテキストファイルに変換される。アクセス権は複数のパソコンでDropboxなんかで共有していると勝手に変わるので追跡してほしくない。また,シンボリックリンクも意味があってリンクを貼っているので勝手にテキストファイルにしてほしくない。
この既定の.git/configファイルは以下のやりとりによるとGitのソースコードで設定されているらしい。
参考:configuration
– Default config settings for a new git repository? – Stack Overflow
http://stackoverflow.com/questions/2093077/default-config-settings-for-a-new-git-repository
.git/configが一番優先されるため,~/.gitconfigでの指定が効かず,毎回リポジトリごとにこの設定を手動で変更する必要があった。
何か方法がないかと探していると方法があった。git
init実行時のテンプレートファイルを指定できるようだ。以下の公式マニュアルによると,git
initは以下の順番でテンプレートファイルを参照するらしい。
参考:Git
– git-init Documentation http://git-scm.com/docs/git-init
-
The argument given with the –template option.
-
The contents of the $GIT_TEMPLATE_DIR environment variable.
-
The init.templatedir configuration variable.
-
The default template directory: /usr/share/git-core/templates.
The
template directory used will (in order):
init.templatedirの設定で指定したディレクトリの中身をgit
initのテンプレートにする方法が一番柔軟だと思った。以下のサイトを参考に設定してみた。
参考:git
hook のテンプレート –
Please Sleep http://please-sleep.cou929.nu/git-init-templatedir.html
cp
/usr/share/git-core/templates/ ~/.git-template #
既定のテンプレートファイルをコピー
echo
“
[core]
›
repositoryformatversion
= 0
›
bare
= false
›
logallrefupdates
= true
›
ignorecase
= true
symlinks
= true
filemode
= false
symlinks
= true
filemode
= false
~”
> ~/.git-template/config # 規定の設定を維持しつつ上書き
git
config –global init.templatedir ~/.git-template
こうすると git
init のたびに~/.git-template/の中身がそのリポジトリの
.git
にコピーされる。すでにあるリポジトリに
git init
した場合は、既存のファイルを上書きすることはなく、安全に新しいテンプレートだけをコピーしてくれる。
filemodeとsymlinksはソースコードレベルで設定されるためか,同じ設定を2回書かないと上書きできなかった。警告が出て少し気持ち悪いがやむを得ない。
これでひとまずファイルのアクセス権は追跡せず,シンボリックリンクも維持できるようになった。git
initするたびにいらいらしなくてすむのでよかった。