ローカルリポジトリ と 作業ディレクトリ について


**Q1.ローカルリポジトリはどこにありますか？**  
git initで指定したフォルダのことですか？  
フォルダ内に.gitというフォルダが作成されているフォルダは、全てローカルリポジトリ？

* * *

**Q2.作業ディレクトリ(ワーキングツリー)はどこにありますか？**  
ソースコードが記載しているファイルを配置したフォルダのことですか？  
hogeフォルダ内に全てのソースコードファイルを配置している場合、作業ディレクトリはhogeですか？

* * *

**Q3.作業ディレクトリとローカルリポジトリは同じ場所でも良い？**

  * hogeフォルダ直下でgit initしたのですが、この場合、作業ディレクトリとローカルリポジトリは何れもhogeとなりますか？
  * そもそも作業ディレクトリとローカルリポジトリは同じ場所でも良い？

  * 「両者を分ける場合」と「同じ場所にする場合」で、それぞれメリットデメリットがあれば知りたいです




回答にする前に用語の確認

  * リポジトリ

ソースコードの変更 **履歴の全部** を格納している何かを言います。具体的にはディレクトリだったり URI だったり UNIX
ソケットだったりします。もしディレクトリであっても、中に入っているファイルは人間に可読な形式であるとは限りません。

  * 作業ディレクトリ

リポジトリから作業用のソースファイルを取り出しているディレクトリを言います。当然、ソースファイルは普通のファイル、つまり人間やコンパイラに可読な形式となっているでしょう。

作業例

[code]

    johndoe$ mkdir work
    johndoe$ cd work
    johndoe$ git init
    Initialized empty Git repository in /home/johndoe/work/.git/
    johndoe$ ls .git
    HEAD  config  description  hooks  info  objects  refs
    johndoe$ 
    
[/code]

A1. ローカルリポジトリとはこの場合 `/home/johndoe/work/.git` を言います。  
A2. 作業ディレクトリとはこの場合 `/home/johndoe/work` およびそれ以下のディレクトリを言います （
`/home/johndoe/work/.git` は除く）。  
A3. Q3 は分散型と集中型の違いやメリットデメリットのことだと判断して下記

SCM には大きく分けて分散型と集中型の２通りがあります。

  * 分散型

    * 新しい SCM はたいてい分散型になっています。
    * `git` や `mercurial` が代表例です。
    * 共有用リポジトリを１つ作りますが、作業用リポジトリは別途用意します。
    * 作業ディレクトリと作業用リポジトリが不可分に存在します（分けません）。
    * 作業を始める際には共用リポジトリの複写 (clone) でリポジトリ丸ごと全部持ってきます。
    * 作業用リポジトリがローカルにあるので、出張先とか実験室とかオフライン環境でもいろいろできます。
    * 各作業員は作業用リポジトリに履歴を登録 (commit) していきます（この段階では成果を他人と共有していない）
    * 共有リポジトリに成果を反映 (push) することで皆と共有します。
    * その際にレビューを入れたり却下したりと、いろいろなことができます。
    * その分、この辺の手続きが初心者にはわかりづらく教育が必要になることが多いです（教育コスト高）。
    * 作業ディレクトリの直下にリポジトリがあるので記憶装置の容量は食います。
  * 集中型

    * 古い SCM はたいてい集中型になっています。
    * `CVS` や `subversion` が代表例です。
    * 集中リポジトリと作業用ディレクトリを用意します。作業用ディレクトリには作業用のファイルを取り出す (checkout) ことができますが、履歴はありません。
    * 各作業員が履歴を登録 (commit) するのは集中リポジトリです。そのため、オフラインでは commit することができませんし、履歴参照もできません。
    * 集中リポジトリは１つしかないので commit により自動的に成果が共有されます。
    * 単純な分、初心者にもわかりやすくて教育コストが低いです。
    * リポジトリはたいていサーバー上に置くので、作業員マシンの記憶装置の容量は食いません。

教育コストを除けば、今どき集中型 SCM を使うメリットは無くて、ゆえに現状、広く使われている SCM は `git` 一択みたいになっています。




回答にする前に用語の確認

  * リポジトリ

ソースコードの変更 **履歴の全部** を格納している何かを言います。具体的にはディレクトリだったり URI だったり UNIX
ソケットだったりします。もしディレクトリであっても、中に入っているファイルは人間に可読な形式であるとは限りません。

  * 作業ディレクトリ

リポジトリから作業用のソースファイルを取り出しているディレクトリを言います。当然、ソースファイルは普通のファイル、つまり人間やコンパイラに可読な形式となっているでしょう。

作業例

[code]

    johndoe$ mkdir work
    johndoe$ cd work
    johndoe$ git init
    Initialized empty Git repository in /home/johndoe/work/.git/
    johndoe$ ls .git
    HEAD  config  description  hooks  info  objects  refs
    johndoe$ 
    
[/code]

A1. ローカルリポジトリとはこの場合 `/home/johndoe/work/.git` を言います。  
A2. 作業ディレクトリとはこの場合 `/home/johndoe/work` およびそれ以下のディレクトリを言います （
`/home/johndoe/work/.git` は除く）。  
A3. Q3 は分散型と集中型の違いやメリットデメリットのことだと判断して下記

SCM には大きく分けて分散型と集中型の２通りがあります。

  * 分散型

    * 新しい SCM はたいてい分散型になっています。
    * `git` や `mercurial` が代表例です。
    * 共有用リポジトリを１つ作りますが、作業用リポジトリは別途用意します。
    * 作業ディレクトリと作業用リポジトリが不可分に存在します（分けません）。
    * 作業を始める際には共用リポジトリの複写 (clone) でリポジトリ丸ごと全部持ってきます。
    * 作業用リポジトリがローカルにあるので、出張先とか実験室とかオフライン環境でもいろいろできます。
    * 各作業員は作業用リポジトリに履歴を登録 (commit) していきます（この段階では成果を他人と共有していない）
    * 共有リポジトリに成果を反映 (push) することで皆と共有します。
    * その際にレビューを入れたり却下したりと、いろいろなことができます。
    * その分、この辺の手続きが初心者にはわかりづらく教育が必要になることが多いです（教育コスト高）。
    * 作業ディレクトリの直下にリポジトリがあるので記憶装置の容量は食います。
  * 集中型

    * 古い SCM はたいてい集中型になっています。
    * `CVS` や `subversion` が代表例です。
    * 集中リポジトリと作業用ディレクトリを用意します。作業用ディレクトリには作業用のファイルを取り出す (checkout) ことができますが、履歴はありません。
    * 各作業員が履歴を登録 (commit) するのは集中リポジトリです。そのため、オフラインでは commit することができませんし、履歴参照もできません。
    * 集中リポジトリは１つしかないので commit により自動的に成果が共有されます。
    * 単純な分、初心者にもわかりやすくて教育コストが低いです。
    * リポジトリはたいていサーバー上に置くので、作業員マシンの記憶装置の容量は食いません。

教育コストを除けば、今どき集中型 SCM を使うメリットは無くて、ゆえに現状、広く使われている SCM は `git` 一択みたいになっています。

