f

2014-09-07

Git initial configuration file

git init新しくGitリポジトリを作ると,毎回アクセス権の変更を追跡したり,シンボリックリンク(symlink)がテキストファイルに変換されたりしていらいらしていた。そこで,Gitの設定について確認した。
git configGit全体の設定ができ,オプションを付けることでその適用範囲を決められる。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 template directory used will (in order):
  • 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.
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 した場合は、既存のファイルを上書きすることはなく、安全に新しいテンプレートだけをコピーしてくれる。
filemodesymlinksはソースコードレベルで設定されるためか,同じ設定を2回書かないと上書きできなかった。警告が出て少し気持ち悪いがやむを得ない。

これでひとまずファイルのアクセス権は追跡せず,シンボリックリンクも維持できるようになった。git initするたびにいらいらしなくてすむのでよかった。

0 件のコメント:

コメントを投稿