2012-01-05 15 views
0

この矛盾した動作の説明を誰かが知っているかもしれません。私は公共リポジトリと私自身のプロジェクトリポジトリの両方でこの問題を抱えていましたが、例えばFacebook SDK from GitHubを使用します。クローンとサブモジュールの構造の違い

このレポをクローンすると、php-sdkというフォルダにチェックアウトされます。 GitHubのrepoファイルリストにはこのフォルダが表示されませんが、これはかなり期待されています。

別のプロジェクトでサブモジュールとしてクローンを作成すると(これは、このようなSDKのかなり一般的な操作です)、私が選択したディレクトリに直接出力されるフォルダの内容を取得します。

ディレクトリにすべてのプロジェクトファイルをラップしてリポジトリにコミットすると、クローン作成時にこの構造に出力されないことがあります(上記のサブモジュールの例と同じ出力)。 .gitディレクトリの名前プレフィックスを変更するとこれが変わるようですが、サブモジュールコマンドの結果には何の影響もありません。

これらのコマンドは、すべてrepo構造の最初のディレクトリを扱う方法が異なりますか?ファイルをレポに保存する方法を誤解していますか?私はあなたがこれを軽微な不快感のもとで提出することができると思うが、私はレポをクローン化にもっと親しみやすくするために、このための規則を得たいと思う。

答えて

2

基本的に、リポジトリの一部として格納されている 'wrapping'ディレクトリはありません。あなたの期待はあなたに誤解を招くものです。 Gitリポジトリはデフォルトでは.gitというディレクトリです。あなたのサンドボックス、またはチェックアウトされたものは、.gitフォルダと同じルートレベルに置かれます。クローンを作成すると、自動的にマスターブランチがチェックアウトされます。 .gitフォルダとcheckoutはgitワークスペースの実際のルートです。

通常、Gitは、クローンとgit submodule addコマンドを使用すると、通常は名前を推測し、ワークスペース用のディレクトリを作成します。ディレクトリを作成し、git repo(その.gitフォルダ)を配置し、masterブランチファイルをチェックアウトします。しかし、git clone <repo> .またはgit clone <repo> <target_dir>と指定するとGitはあなたのレポとチェックアウトのルートを任意の場所に配置します。

ですから、このようなレポ作成した場合:あなたはgit clone repo.gitと、後でそれを複製した場合、それはそれはfooと呼ばれるファイルやディレクトリを持っているrepoと呼ばれるサブディレクトリに置かれている慣例であるだけで

mkdir repo.git 
cd repo.git 
git init 
touch foo 
git add foo 
git commit -m "Initial commit" 

.git 。ただし、repoはルートチェックアウトディレクトリであり、現在のディレクトリではありません(ディレクトリに.gitというディレクトリがあるため、確認できます)。クローンを実行したディレクトリは、.gitまたはcheckoutディレクトリを格納するディレクトリではありません。あなたが望むのであれば、git clone <repo> .を実行すると、fooというファイルと.gitというディレクトリがあり、repoというディレクトリは表示されません。

あなたはいつもあなたがこのようにレポを作成したのでしょう、その後にすべてのソースを入れ子レポと呼ばれるディレクトリがあるようにしたい場合は:あなたはちょうどあなたが持っているでしょうgit clone <uri>/repo.gitを使ってクローンを作成する場合次に

mkdir repo.git 
cd repo.git 
git init 
mkdir repo 
cd repo 
touch foo 
git add foo 
git commit -m "Initial commit" 

ディレクトリ.gitを含むrepoというディレクトリと、fooファイルを持つrepoというディレクトリがあります。私の意見では、これは面倒な(私が知っている、私はそれをやった...一度)間接の層です。

サブモジュールは、特定のチェックアウト時に別のgit repoを含む単純なディレクトリとしてのメインレポのエントリです。最初にサブモジュールを初期化して更新するときは、基本的にはメインリポジトリによってサブモジュール用に予約されたディレクトリを作成し、そのディレクトリ全体にgit repoとcheckoutを取得します。 gitリポジトリは通常は.gitディレクトリであり、それに沿ったチェックアウトであることを理解する必要があるので、そのディレクトリにも別のラップディレクトリが存在しないのは明らかです。基本的には、git submodule add <repo> [<target_dir>]コマンドを使用するときに、サブモジュールがラップするディレクトリを指定しました。

関連する問題