Git で共有リポジトリを作ろうとすると `fatal: Out of memory?` エラー

[code]

    git init --bare --shared　
    
[/code]

とやると、

[code]

    fatal: Out of memory? mmap failed: No such device
    
[/code]

と謎のエラーが出るんですが、ググっても原因がわからず、、、

以前、その CentOS 上のディレクトリにあった `.git` ファイルを消しても（`rm -rf .git`）、`git init` は出来ますが、
`git init --bare` をすると、また同じエラーが出てしまいます。

皆様の知恵を借りたいと思い、投稿させていただきました、  
すいませんがよろしくお願いします！！




ソースコードが既に存在するようなディレクトリ内で `git init --bare` を実行することは良くない `git` コマンドの使われ方です。 既に
@yasu が挙げたように、`config` ディレクトリが既に存在していると、件のような実に気持ちの悪いエラーと共に、処理が止まります。

[code]

    $ mkdir git_share_test
    $ cd git_share_test/
    $ mkdir config
    $ git init --bare
    fatal: Out of memory? mmap failed: Invalid argument
    $ ls
    HEAD        config      hooks       refs
    branches    description info
    
[/code]

このエラーが示された時点で、共有レポジトリ用のファイルが生成されてしまっているので、一つ一つ消しましょう。(`config` 以外)

以下説明。

[`git init`](http://git-scm.com/docs/git-init) で生成されるのは、 **作業用レポジトリ**
(ローカルレポジトリ)です。そこには、「作業用のソースコードのコピー」に加えて `.git`
ディレクトリが置かれます。このレポジトリに存在しているファイルは、作業用ファイルのコピーとみなされています。

[`git init --bare`](http://git-scm.com/docs/git-init) で生成されるのは、 **ベアレポジトリ**
(共有レポジトリ)で、レポジトリの実体と言えます。そのディレクトリ以下には、作業用レポジトリからの push や clone
を受け付け、記録するデータベースとして管理用のファイルが置かれることになります。ソースファイルが直接置かれる場所ではありません。`\--shared`
オプションは主にパーミッションを変更するだけです。

_共有レポジトリのディレクトリ構造_ （ディレクトリ名に `.git` が付加されるのは慣習です。）

[code]

    /somewhere/my_bare_repository.git
        - HEAD
        - branches
        - config
        - description
        - hooks
        - info
        - objects
        - refs
    
[/code]

既に作業用のソースコードが存在し、それを共有レポジトリとしたい場合は、作業用レポジトリを作った後、 `git clone --bare SOURCE
TARGET.git` を使用し、別ディレクトリに共有レポジトリとして複製してください。以下に手順を示します。

[code]

    # 作業用レポジトリを作成
    $ mkdir git_my_work
    $ cd git_my_work/
    $ git init
    Initialized empty Git repository in ~/workspaces/git_my_work/.git/
    $ cd ..
    # 共有レポジトリを作成 (作業用レポジトリを複製)
    $ git clone --bare git_my_work git_my_shared.git
    Cloning into bare repository 'git_my_shared.git'...
    warning: You appear to have cloned an empty repository.
    done.
    $ cd git_my_shared.git/
    $ ls
    HEAD        config      hooks       objects
    branches    description info        refs
    # --shared オプションと同等の設定 (不必要)
    $ chmod -R g+w .
    $ git config core.sharedRepository group
    $ git config receive.denyNonFastForwards true
    
[/code]

補足ですが、理解の確認のために以下の流れを試し、リモートレポジトリの扱いの確認もすると良いでしょう。

[code]

    # 作業用レポジトリの remote に git_my_shared.git を追加
    $ git remote add origin ~/workspaces/git_my_shared.git
    $ git remote -v
    origin  ~/workspaces/git_my_shared.git (fetch)
    origin  ~/workspaces/git_my_shared.git (push)
    
    # 新しくファイルを作って push する
    $ touch NEW_DUMMY
    $ git add NEW_DUMMY; git commit -m "Duh."
    [master (root-commit) c6ad51f] Duh.
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 NEW_DUMMY
    $ git push origin master
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 217 bytes | 0 bytes/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To ~/workspaces/git_my_shared.git
     * [new branch]      master -> master
    
    # 別の新しい作業用レポジトリに共有レポジトリを clone する
    $ cd ..
    $ git clone ~/workspaces/git_my_shared.git git_another_work
    Cloning into 'git_another_work'...
    done.
    $ cd git_another_work/
    $ ls
    NEW_DUMMY
    $ git remote -v
    origin  ~/workspaces/git_my_shared.git (fetch)
    origin  ~/workspaces/git_my_shared.git (push)
    
[/code]




ソースコードが既に存在するようなディレクトリ内で `git init --bare` を実行することは良くない `git` コマンドの使われ方です。 既に
@yasu が挙げたように、`config` ディレクトリが既に存在していると、件のような実に気持ちの悪いエラーと共に、処理が止まります。

[code]

    $ mkdir git_share_test
    $ cd git_share_test/
    $ mkdir config
    $ git init --bare
    fatal: Out of memory? mmap failed: Invalid argument
    $ ls
    HEAD        config      hooks       refs
    branches    description info
    
[/code]

このエラーが示された時点で、共有レポジトリ用のファイルが生成されてしまっているので、一つ一つ消しましょう。(`config` 以外)

以下説明。

[`git init`](http://git-scm.com/docs/git-init) で生成されるのは、 **作業用レポジトリ**
(ローカルレポジトリ)です。そこには、「作業用のソースコードのコピー」に加えて `.git`
ディレクトリが置かれます。このレポジトリに存在しているファイルは、作業用ファイルのコピーとみなされています。

[`git init --bare`](http://git-scm.com/docs/git-init) で生成されるのは、 **ベアレポジトリ**
(共有レポジトリ)で、レポジトリの実体と言えます。そのディレクトリ以下には、作業用レポジトリからの push や clone
を受け付け、記録するデータベースとして管理用のファイルが置かれることになります。ソースファイルが直接置かれる場所ではありません。`\--shared`
オプションは主にパーミッションを変更するだけです。

_共有レポジトリのディレクトリ構造_ （ディレクトリ名に `.git` が付加されるのは慣習です。）

[code]

    /somewhere/my_bare_repository.git
        - HEAD
        - branches
        - config
        - description
        - hooks
        - info
        - objects
        - refs
    
[/code]

既に作業用のソースコードが存在し、それを共有レポジトリとしたい場合は、作業用レポジトリを作った後、 `git clone --bare SOURCE
TARGET.git` を使用し、別ディレクトリに共有レポジトリとして複製してください。以下に手順を示します。

[code]

    # 作業用レポジトリを作成
    $ mkdir git_my_work
    $ cd git_my_work/
    $ git init
    Initialized empty Git repository in ~/workspaces/git_my_work/.git/
    $ cd ..
    # 共有レポジトリを作成 (作業用レポジトリを複製)
    $ git clone --bare git_my_work git_my_shared.git
    Cloning into bare repository 'git_my_shared.git'...
    warning: You appear to have cloned an empty repository.
    done.
    $ cd git_my_shared.git/
    $ ls
    HEAD        config      hooks       objects
    branches    description info        refs
    # --shared オプションと同等の設定 (不必要)
    $ chmod -R g+w .
    $ git config core.sharedRepository group
    $ git config receive.denyNonFastForwards true
    
[/code]

補足ですが、理解の確認のために以下の流れを試し、リモートレポジトリの扱いの確認もすると良いでしょう。

[code]

    # 作業用レポジトリの remote に git_my_shared.git を追加
    $ git remote add origin ~/workspaces/git_my_shared.git
    $ git remote -v
    origin  ~/workspaces/git_my_shared.git (fetch)
    origin  ~/workspaces/git_my_shared.git (push)
    
    # 新しくファイルを作って push する
    $ touch NEW_DUMMY
    $ git add NEW_DUMMY; git commit -m "Duh."
    [master (root-commit) c6ad51f] Duh.
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 NEW_DUMMY
    $ git push origin master
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 217 bytes | 0 bytes/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To ~/workspaces/git_my_shared.git
     * [new branch]      master -> master
    
    # 別の新しい作業用レポジトリに共有レポジトリを clone する
    $ cd ..
    $ git clone ~/workspaces/git_my_shared.git git_another_work
    Cloning into 'git_another_work'...
    done.
    $ cd git_another_work/
    $ ls
    NEW_DUMMY
    $ git remote -v
    origin  ~/workspaces/git_my_shared.git (fetch)
    origin  ~/workspaces/git_my_shared.git (push)
    
[/code]

