web-dev-qa-db-ja.com

ベアリポジトリと非ベアリポジトリの(実際の)違いは何ですか?

私はGitの裸で非裸の/デフォルトのリポジトリについて読んでいます。私は、それらの違いと、なぜ裸のリポジトリに「プッシュ」する必要があるのか​​について(理論的に)十分に理解できていません。取引は次のとおりです。

現在、3つの異なるコンピューターでプロジェクトに取り組んでいるのは私だけですが、後でもっと多くの人が関与するため、バージョン管理にGitを使用しています。すべてのコンピューターでベアリポジトリを複製し、そのうちの1台で変更を完了すると、変更をコミットして、ベアリポジトリにプッシュします。私が読んだことから、むき出しのリポジトリには「作業ツリー」がないため、むき出しのリポジトリを複製すると、「作業ツリー」はありません。

私は、作業ツリーがプロジェクトからのコミット情報、ブランチなどを保存していると推測しています。裸のレポには表示されません。したがって、作業ツリーを使用してレポジトリへのコミットを「プッシュ」する方が良いようです。

次に、なぜ裸のリポジトリを使用する必要があり、なぜ使用しないのですか?実際の違いは何ですか?これは、プロジェクトで作業するより多くの人々にとって有益ではないでしょう。

この種の仕事の方法は何ですか?提案?

176
AeroCross

ベアリポジトリと非ベアリポジトリのもう1つの違いは、ベアリポジトリにデフォルトのリモートOriginリポジトリがないことです。

~/Projects$ git clone --bare test bare
Initialized empty Git repository in /home/derek/Projects/bare/
~/Projects$ cd bare
~/Projects/bare$ git branch -a
* master
~/Projects/bare$ cd ..
~/Projects$ git clone test non-bare
Initialized empty Git repository in /home/derek/Projects/non-bare/.git/
~/Projects$ cd non-bare
~/Projects/non-bare$ git branch -a
* master
  remotes/Origin/HEAD -> Origin/master
  remotes/Origin/master

git clone --bare のマニュアルページから:

また、リモートのブランチヘッドは、refs/remotes/Origin /にマッピングせずに、対応するローカルブランチヘッドに直接コピーされます。このオプションを使用すると、リモート追跡ブランチも関連する構成変数も作成されません。

おそらく、ベアリポジトリを作成するとき、Gitは、ベアリポジトリが複数のリモートユーザーのOriginリポジトリとして機能すると想定しているため、デフォルトのリモートOriginは作成されません。これが意味するのは、Gitはワークスペースなしでは、ベアリポジトリへの変更をコミットしないと想定しているため、基本的なgit pullおよびgit Push操作が機能しないことです。

~/Projects/bare$ git Push
fatal: No destination configured to Push to.
~/Projects/bare$ git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.
~/Projects/bare$ 
84
Derek Mahar

ワークスペースはリポジトリの一部ではなく、リポジトリはワークスペースを必要としないため、ベアGitリポジトリと非ベアGitリポジトリの区別は人為的で誤解を招く可能性があります。厳密に言えば、Gitリポジトリには、リポジトリの状態を記述するオブジェクトが含まれます。これらのオブジェクトは任意のディレクトリに存在できますが、通常はワークスペースの最上位ディレクトリの.gitディレクトリに存在します。ワークスペースは、リポジトリ内の特定のコミットを表すディレクトリツリーですが、任意のディレクトリに存在する場合とまったく存在しない場合があります。環境変数$GIT_DIRは、ワークスペースを元のリポジトリにリンクします。

Gitコマンド git clonegit init の両方に、初期ワークスペースなしでリポジトリを作成するオプション--bareがあります。残念なことに、Gitはワークスペースとリポジトリの2つの別個の、しかし関連する概念をまとめ、2つのアイデアを区別するために混乱する用語bareを使用します。

55
Derek Mahar

ベアリポジトリは。gitフォルダーそのものです。つまり、ベアリポジトリの内容はローカル作業リポジトリ内の。gitフォルダーの内容と同じです。

  • リモートサーバーでベアリポジトリを使用して、複数の貢献者が作業をプッシュできるようにします。
  • 裸でない-作業ツリーを持つものは、プロジェクトの各貢献者のローカルマシン上で意味があります。
53
Deepak Sharma

5年も遅すぎますが、実際に誰も質問に答えませんでした。

次に、なぜ裸のリポジトリを使用する必要があるのでしょうか?実際の違いは何ですか?これは、プロジェクトに取り組んでいるより多くの人々にとって有益ではないと思います。

この種の仕事の方法は何ですか?提案?

Loeliger/MCulloughの本(978-1-449-31638-9、p196/7)から直接引用するには:

むき出しのリポジトリはほとんど役に立たないように思えるかもしれませんが、その役割は重要です。共同開発の権威あるフォーカルポイントとして機能することです。他の開発者cloneおよびfetchは、ベアリポジトリから取得され、Pushが更新されます...開発者Pushが変更されるリポジトリを設定する場合は、ベアである必要があります。実際には、これは、公開されたリポジトリを公開する必要がある、より一般的なベストプラクティスの特別なケースです。

43
EML

非ベアリポジトリには、チェックアウトされた作業ツリーがあります。作業ツリーには、リポジトリの状態に関する情報(ブランチ、タグなど)は保存されません。むしろ、作業ツリーはレポジトリ内の実際のファイルの単なる表現であり、これによりファイルを操作(編集など)することができます。

19
mipadi

裸のリポジトリには次の利点があります

  • ディスク使用量の削減
  • リモートプッシュに関連する問題が少なくなります(同期から外れたり、競合する変更がある作業ツリーがないため)
14
sehe

非ベアリポジトリを使用すると、新しいコミットを作成して変更を(作業ツリーに)キャプチャできます。

ベアリポジトリは、他のリポジトリから変更を転送することによってのみ変更されます。

11
Nitin

私は確かにGitの「エキスパート」ではありません。私はしばらくTortoiseGitを使用していましたが、作成するたびに "裸の"リポジトリを作成するかどうかを尋ねられたときに何を言っていたのか疑問に思いました。私はこのチュートリアルを読んでいました: https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-init そしてそれは問題に対処しますが、私はまだ完全ではありませんでした概念を理解する。これは非常に役立ちました: http://bitflop.com/tutorials/git-bare-vs-non-bare-repositories.html 。さて、最初のものも理にかなっています!

これらの情報源によると、簡単に言えば、配布ポイントをセットアップするサーバーで「裸の」リポジトリが使用されます。ローカルマシンでの使用を意図していません。通常、ローカルマシンからリモートサーバー上のベアリポジトリにコミットをプッシュし、ユーザーや他の人がそのベアリポジトリからローカルマシンにプルします。したがって、GitHub、Assemblaなどのリモートストレージ/ディストリビューションリポジトリは、「裸の」リポジトリが作成される例です。独自の類似した「共有センター」をセットアップする場合は、自分で作成します。

8
BuvinJ

これは新しい答えではありませんが、上記の答えのさまざまな側面を理解するのに役立ちました(コメントするには多すぎます)。

Git Bashを使用してみてください:

me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../

me@pc MINGW64 /c/Test
$ git init
Initialized empty Git repository in C:/Test/.git/

me@pc MINGW64 /c/Test (master)
$ ls -al
total 20
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 .git/

me@pc MINGW64 /c/Test (master)
$ cd .git

me@pc MINGW64 /c/Test/.git (GIT_DIR!)
$ ls -al
total 15
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 ../
-rw-r--r-- 1 myid 1049089 130 Apr  1 11:35 config
-rw-r--r-- 1 myid 1049089  73 Apr  1 11:35 description
-rw-r--r-- 1 myid 1049089  23 Apr  1 11:35 HEAD
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 hooks/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 info/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 objects/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 refs/

git --bareと同じ:

me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:36 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../

me@pc MINGW64 /c/Test
$ git init --bare
Initialized empty Git repository in C:/Test/

me@pc MINGW64 /c/Test (BARE:master)
$ ls -al
total 23
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 ./
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:11 ../
-rw-r--r-- 1 myid 1049089 104 Apr  1 11:36 config
-rw-r--r-- 1 myid 1049089  73 Apr  1 11:36 description
-rw-r--r-- 1 myid 1049089  23 Apr  1 11:36 HEAD
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 hooks/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 info/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 objects/
3
Christoph

$ git help repository-layout

Gitリポジトリには、2つの異なるフレーバーがあります。

  • 作業ツリーのルートにある.gitディレクトリ。
  • bareリポジトリ(つまり、独自の作業ツリーがない)である.gitディレクトリ。通常、プッシュしてフェッチすることで履歴を他のユーザーと交換するために使用されます。
2
MichK