1. pasela

    Posted

    pasela
Changes in title
+gitのリポジトリ(管理領域)を別の場所に作る
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,63 @@
+いつから`.git`がディレクトリだと錯覚していた?
+
+```bash
+
+$ ls -la foo
+total 8
+drwxr-xr-x 3 pasela wheel 102 11 2 18:31 ./
+drwxrwxrwt 29 root wheel 986 11 2 18:31 ../
+-rw-r--r-- 1 pasela wheel 29 11 2 18:31 .git
+
+$ cat foo/.git
+gitdir: /tmp/foo.git
+```
+
+というわけで、実はgitは`.git`の中身を別の場所で管理することができます。
+
+この作業は手動でいじってもできなくはないですが、`git init`や`git clone`に`--separate-git-dir=<git dir>`を指定することで自動的にやってくれます。
+
+```bash
+cd /tmp
+$ git init --separate-git-dir=/tmp/foo.git foo
+Initialized empty Git repository in /tmp/foo.git/
+```
+
+こうすると、`.git`にはリポジトリのパスが書かれたファイルが作成され、
+
+```bash
+$ cat foo/.git
+gitdir: /tmp/foo.git
+```
+
+`/tmp/foo.git`に管理ファイルが生成されます。
+
+```bash
+$ ls -la /tmp/foo.git
+total 24
+drwxr-xr-x 9 pasela wheel 306 11 2 18:45 ./
+drwxrwxrwt 29 root wheel 986 11 2 18:45 ../
+-rw-r--r-- 1 pasela wheel 23 11 2 18:45 HEAD
+-rwxr--r-- 1 pasela wheel 140 11 2 18:45 config*
+-rw-r--r-- 1 pasela wheel 73 11 2 18:45 description
+drwxr-xr-x 11 pasela wheel 374 11 2 18:45 hooks/
+drwxr-xr-x 3 pasela wheel 102 11 2 18:45 info/
+drwxr-xr-x 4 pasela wheel 136 11 2 18:45 objects/
+drwxr-xr-x 4 pasela wheel 136 11 2 18:45 refs/
+```
+
+そして`/tmp/foo.git/config`にはワークツリーの位置を示す`core.worktree`が設定されます。
+
+```bash
+$ cat /tmp/foo.git/config
+[core]
+ repositoryformatversion = 0
+ filemode = true
+ bare = false
+ logallrefupdates = true
+ worktree = /tmp/foo
+ ignorecase = true
+```
+
+これらの値はコマンド実行時にグローバルオプションの`--git-dir=<path>`, `--work-tree=<path>`や、環境変数の`GIT_DIR`, `GIT_WORK_TREE`でも指定できます。
+
+gitリポジトリに関連したツールを作る際は、`.git`がファイルであることも考慮したほうがよいでしょう。