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


213

私は、Gitのベアおよび非ベア/デフォルトのリポジトリについて読んでいます。それらの違いについて、そして理論的には、なぜ私が裸のリポジトリに「プッシュ」しなければならないのかについて、よく理解することができませんでした。ここに取り引きがあります:

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

作業ツリーには、プロジェクトからのコミット情報、ブランチなどが格納されていると思います。これは、ベアリポジトリには表示されません。そのため、作業ツリーでコミットをリポジトリに「プッシュ」する方がよいようです。

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

この種の仕事のためのあなたの方法は何ですか?提案?


4
AeroCrossは、あなたがすることができます(、ワークスペースを有するものである)非裸のリポジトリを作成するために裸のリポジトリをクローンします。そのため、git cloneベアリポジトリと非ベアリポジトリの間で自由に変換できます。
Derek Mahar

13
@AeroCross:それは変換についてではありません。相手側が何であるかは関係ありません。実行git clone --bareすると、ベアリポジトリを取得し、を実行すると、ベアリポジトリをgit clone取得します。これまでにクローンを作成したすべてのパブリックプロジェクト(たとえば、githubでホストされている)は、もう一方の端のベアリポジトリです。
Cascabel

1
Jefromi、私はAeroCrossのポイントを修正していたので、「それで、裸のレポを複製すると、「ワーキングツリー」がなくなる」ので、これは一種の変換です。また、すべてのパブリックプロジェクトがベアリポジトリである必要はありません。ベアリポジトリはワーキングツリーがないためスペース効率が高いため、これは単なる典型的な選択です(ただし、ワーキングツリーがないリポジトリと同じくらいスペース効率が良い)。
Derek Mahar、2011

2
@Derek:しかし、重要なのは、.gitディレクトリが見つかるとすぐに、フェッチがリモートが裸かどうかを完全に認識しないということです。変換しません。必要なものをリモートからフェッチし、必要な場所に置くだけです。変換するものは何もありません。それが私がOPに強調しようとしていたことです。そして、私は公共プロジェクトが裸である必要はないことをよく知っていますが、人々は愚かではないので、それらは本質的にすべてです。許容できる一般化をしたと思います。
Cascabel

2
ベアリポジトリの使用に関する別の優れた説明を提供する非ベアリポジトリへのプッシュを参照してください。
Craig McQueen 2014年

回答:


95

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

~/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はベアリポジトリが複数のリモートユーザーのオリジンリポジトリとして機能することを想定しているため、デフォルトのリモートオリジンは作成されません。これが意味することは、基本的なことであるgit pullgit pushGitは、ワークスペースなしで、あなたは裸のリポジトリに変更をコミットするつもりがないことを前提としているので操作は動作しません。

~/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$ 

1
はい、これが間違いなくベアGitリポジトリと非ベアGitリポジトリの最も重要な違いであることには同意します。非ベアリポジトリにはワークスペースがありますが、ベアリポジトリにはないという事実は重要な違いgit clone --no-checkoutですが、ワークスペースファイルのない非ベアリポジトリも作成できます。
Derek Mahar

10
非ベアリポジトリには、必ずしもデフォルトのリモート「オリジン」もありません。
mipadi

2
Gitリポジトリはgit init、を使用して簡単に作成できます。これにより、リモートが指定されていない裸のリポジトリが作成されます。
mipadi

1
ミパディ、これは本当ですが、クローンでもありません。
Derek Mahar

1
これは誤りです。リポジトリがclone編集されている場合、リポジトリにはデフォルトのオリジンがあります。initローカルで編集されている場合、そのような起源はありません。これは、それが裸であるかどうかに関係ありません。
Noufal Ibrahim、2011

62

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

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


61

ベアリポジトリは.gitフォルダー自体に他なりません。つまり、ベアリポジトリのコンテンツは、ローカルの作業リポジトリ内の.gitフォルダーのコンテンツと同じです。

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

60

5年遅すぎると思いますが、実際には誰も質問に答えていません。

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

この種の仕事のためのあなたの方法は何ですか?提案?

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

ベアリポジトリはほとんど役に立たないように思えるかもしれませんが、その役割は重要です。つまり、共同開発の信頼できる焦点として機能することです。他の開発者clone、およびfetchベアリポジトリからのpush更新とそれへの更新...開発者pushが変更するリポジトリをセットアップする場合、それはベアでなければなりません。実際、これは、公開されたリポジトリを公開する必要があるという、より一般的なベストプラクティスの特別なケースです。


19

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


つまり、ブランチ、タグなどをベアリポジトリに追加して、ベアリポジトリからベアリポジトリ以外の本番リポジトリにプルできるということですか。
AeroCross

2
非ベアリポジトリであるmipadiには、チェックアウトされたツリーがない場合があります。これは、を使用して裸でないリポジトリを作成する場合に当てはまりますgit clone --no-checkout。この場合、非ベアリポジトリにはワークスペースの場所がありますが、Gitはそのワークスペースにファイルをチェックアウトしません。
Derek Mahar、2011

17

ベアリポジトリには、

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

3
では、ベアリポジトリは、自分のリポジトリにアクセスできない複数の人と作業するための最良の/推奨される方法ですか?(KindaはSVNが好きですか?)
AeroCross

2
AeroCross、私はベアリポジトリがそのシナリオに適していると思います。
Derek Mahar

12

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

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


10

私は確かに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などのリモートストレージ/配布リポジトリは、「ベア」リポジトリが作成される例です。あなたがあなた自身の類似した「共有センター」を設置していたら、あなたはあなた自身でそれを作るでしょう。


ooooh now it get it
Fuseteam

9

デフォルト/非ベアGitリポジトリには、次の2つの状態があります。

  1. スナップショットリポジトリ内のすべてのファイルの(これはGitの専門用語ではどのような「作業ツリー」手段です)
  2. これまでにリポジトリに存在していたすべてのファイルに加えられたすべての変更の履歴(これをすべて網羅するGit専門用語の簡潔な部分はないようです)

スナップショットあなたはおそらく、あなたのプロジェクトとして考えるものです:あなたのコードファイル、ビルドファイル、ヘルパースクリプト、およびGitリポジトリを持つあなたのバージョン何か。

歴史はあなたが別のコミットをチェックアウトし、リポジトリ内のファイルが追加されましたコミットそのときのように見えたものの完全なスナップショットを取得できるようにする状態です。これは、Gitの内部にある一連のデータ構造で構成されており、直接対話することはおそらくありません。重要なのは、履歴はメタデータだけを保存するだけではなく(たとえば、「ユーザーUがコミットCの一部として時刻TにファイルFにこれだけ多くの行を追加した」)、データも保存したことです(たとえば「ユーザーUがこれらの正確な行を追加した」をファイルFに」など) )。

ベアリポジトリの重要なアイデアは、実際にスナップショットを取得する必要がないということです。Gitは、コードを操作したい人間やその他のGit以外のプロセスにとって便利であるため、スナップショットを保持しますが、スナップショットは、すでに履歴にある状態を複製しているだけです。

裸のリポジトリは、スナップショットを持っていませんGitのリポジトリです。履歴を保存するだけです。

なぜこれが欲しいのですか?まあ、Gitを使用してファイルを操作するだけの場合(つまり、ファイルを直接編集したり、実行可能ファイルを作成するために使用したりしない場合)、スナップショットを保持しないことでスペースを節約できます。特に、サーバーのどこかで集中管理バージョンのリポジトリを維持している場合(つまり、基本的に独自のGitHubをホストしている場合)、そのサーバーにはおそらくベアリポジトリがあるはずです(ただし、非ベアリポジトリを引き続き使用します)ただし、おそらくスナップショットを編集する必要があるためです)。

ベアリポジトリともう1つの使用例の詳細な説明が必要な場合は、https//stegosaurusdormant.com/bare-git-repo/にブログ投稿を投稿しました。


4

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

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/

2

$ git help repository-layout

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

  • 作業ツリーのルートにある.gitディレクトリ。
  • ベアリポジトリ(つまり、独自の作業ツリーがない)である.gitディレクトリ。これは、通常、そこにプッシュしてそこからフェッチすることにより、他のユーザーと履歴を交換するために使用されます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.