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

* * *

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

* * *

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

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

  * 「両者を分ける場合」と「同じ場所にする場合」で、それぞれメリットデメリットがあれば知りたいです
CC BY-SA 4.0
2019-06-22T03:31:55.390
56001
2019-06-25T02:18:02.280
7886
question
git
ローカルリポジトリ と 作業ディレクトリ について
回答にする前に用語の確認

  * リポジトリ

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

  * 作業ディレクトリ

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

作業例

```

    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$ 
    
```

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` 一択みたいになっています。
CC BY-SA 4.0
2019-06-24T07:42:51.350
56057
2019-06-24T09:28:59.780
2019-06-24T09:28:59.780
8589
8589
56001
answer
> Q1.ローカルリポジトリはどこにありますか？  
>  git initで指定したフォルダのことですか？  
>  フォルダ内に.gitというフォルダが作成されているフォルダは、全てローカルリポジトリ？

文脈によって微妙に意味合いが変わる気もしますが、敢えて **ローカル**
リポジトリと呼ぶときは、対応するリモートリポジトリが有って、それを編集(`commit`)するために`clone`してきたものを指すように思います。  
また、後からリモートリポジトリを作る想定で、先に`init`する場合もあるでしょう。

ローカルリポジトリとは、をまとめるとこんな感じでしょうか:

  * 自分が直接 `commit` するためのリポジトリである
  * 対応するリモートリポジトリがある

続いて、リポジトリがどこにあるか(どこを指してリポジトリと呼ぶのか)ですが、[`init`の説明](https://git-
scm.com/docs/git-init)を見ると

> This command creates an empty Git repository - basically a `.git` directory
> with (後略)

とあるので、基本的には`.git`があるディレクトリをリポジトリと呼んで良いかと思います。

ただし、 `git init --bare` で作成したリポジトリや、 `git clone <リポジトリ>` の `<リポジトリ>` に `.git`
ディレクトリを指定できることも考えると、 `.git` ディレクトリがあることが必要条件というわけでもないです。

質問に直接回答すると

> ローカルリポジトリはどこにありますか？  
>  git initで指定したフォルダのことですか？

そのようなものもローカルリポジトリと呼んで差し支え無いと思いますが、敢えて **ローカル**
と修飾する場合、リモートリポジトリから`clone`してきたもの、というニュアンスが含まれることが多いと考えます。

> フォルダ内に.gitというフォルダが作成されているフォルダは、全てローカルリポジトリ？

いいえ。例えばそのようなフォルダをローカルリポジトリでなくリモートリポジトリとして扱うことが可能です。

> Q2.作業ディレクトリ(ワーキングツリー)はどこにありますか？

基本的には`clone`したディレクトリ、あるいは(`--bare`なしで)`init`した場所を(Gitでバージョン管理された)作業ディレクトリと呼びます。すなわち概ねローカルリポジトリと同じものを指します。が、こちらはリモートリポジトリの存在は意識しない呼び方です。  
これに加え、[`worktree`](https://git-scm.com/docs/git-
worktree)でそれ以外の場所にも追加作成することができます。  
が、注釈なしに作業ディレクトリと言われた場合に想起するのは前者のみかと思います。

追記 `git-worktree` について:

> A git repository can support multiple working trees, allowing you to check
> out more than one branch at a time.

とある通りで、メインの作業リポジトリに`checkout`しているブランチと別のブランチを同時に参照/編集したいときに用います。具体的に自分が利用するシーンとしては、

  * feature-1とfeature-2を同時に開発しているが、作業のたびにいちいち`git checkout`して切り替えるのが煩雑だ
  * 他の人のコードをレビューするためにそのブランチを`checkout`したいが作業ディレクトリはちょっとこのままにしておきたい

みたいな場合です。

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

上の説明の通り、大抵の文脈に置いて作業ディレクトリとローカルリポジトリは同じものを指しています。  
ですので同じ場所です。

* * *

追加のコメントを読むと本当に知りたいのは [`git clone`の `--depth`](https://git-scm.com/docs/git-
clone#Documentation/git-clone.txt---depthltdepthgt)あたりじゃないかという気もします。
CC BY-SA 4.0
2019-06-24T21:11:06.790
56072
2019-06-25T02:18:02.280
2019-06-25T02:18:02.280
2808
2808
56001
answer