2016-03-01 11 views
5

私は2つのブランチ(mastergh-pages)を持つ1つのリポジトリを持っています。私master枝のフォルダ構造は次のようになります。私のgh-pagesブランチで異なるフォルダのブランチ間でコードを共有

/dist 
    /js 
    /css 
/other-folders 

、私はそれでいくつかのファイルとフォルダ_includeを持っています。

/_include 
    /js 
    /css 

または

/_include 
    /dist 
     /js 
     /css 

はgitのと、この可能性のようなものです:私は私のgh-pagesフォルダ構造は次のようになりますように、私のgh-pages支店で/dist/css/dist/jsフォルダ内の私のコードを共有したいですか?私はちょうどそれはちょうど私のgh-pages

+0

シェアではどういう意味ですか?あなたはそれらを常に同期させたいのですか、または他のものから1つを押すことができるようにしますか? – merlin2011

+0

なぜシンボリックリンクを使用しないのですか? – morxa

+0

@morxa、OPはフォルダではなく2つのブランチを同期しようとしています – TheGeorgeous

答えて

2

はいに別のフォルダに/dist/distがコピーされますので、

git subtree push --prefix dist origin gh-pages 

を使用していないことはできません。

はい、ブランチ間でサブディレクトリを共有することができます - gitは常にそれを行います。

いいえ、通常のgitコマンドでは自動的に同期させることはできません。

残念ながら、私は今すぐシェルに近づいていないので、私はコマンドを提供することはできませんが、私はあなたに道を示します。あなたのファイルや他のものの実際の生のバイトストリームを含むオブジェクトです

  • 、ブロブ:

    Gitは三つの基本的なデータ構造を持っています。

  • は、通常のファイルシステムと同様に、ディレクトリを記述するオブジェクトです。彼らは、ファイル名、モードと一緒にブロブのハッシュが含まれているなど
  • は、ツリーオブジェクトや作者、タイムスタンプなどの各種情報のハッシュを含むオブジェクトですコミット、親がコミットなど

これら3物事は文字通り.git/objectsのファイルであり、ファイル名はコンテンツのハッシュと同じです。

問題は、これらのオブジェクトが、コミットから慣れているのと同じように、読み取り専用の非周期的なグラフを作成することにあります。

あなたは木に興味があります。 git cat-fileで回り込んだ後、いくつかのツリーオブジェクトを見ることができます。 _includeツリーをハックしてその他のブランチからのツリーへのポインタを含むことができれば、あなたの問題をどのように解決するかがすぐにわかります。この深いレベルでは、コミットとブランチの間でツリーを共有するのは完全に自然であることに注意してください。gitは常にそれを行います。とりわけ、これがリポジトリが比較的小さなスペースを占める理由とgitが分散ファイルシステムと呼ばれることがある理由です。今

、自分のために左2人の冒険があります。

  • を見つけるには、どのように偽のあなたが望んでいたように見える木をします。私が言ったように今はシェルを持っていませんが、個々のオブジェクトを読み書きする方法を示すhttps://git-scm.com/book/en/v2/Git-Internals-Git-Objectsの例を使って理解することができます。
  • 残念ながら、これらの読み取り専用データ構造の性質上、含まれているツリーの1つが変更されるたびに、_includeツリーを再構築する必要があります。あなたはおそらくそれを推測しました - 何も実際には何もできません変更任意のgitオブジェクト。変更は常に新しいオブジェクトを作成することによってもたらされます。これは大きな問題ではありませんが、自動的に新しいツリーを作成するための適切なフックを作成することができます。

率直に言って、しかし、これがすべてであるとして魅力的な、あなたは毎回により、タッチにソースディレクトリをコミットするだけだけでなく、私はちょうど言ったすべてを忘れて、単にフックでGitの磁器のコマンドを使用して、ゼロから_includeを再作成するかもしれませんソースブランチからそれらをチェックアウトし、その後で(cpで、いくつかの特殊なgitコマンドではなく)コピーし、それらを宛先ブランチでコミットします。 Gitは実際にはとなるでしょうこれらのサブディレクトリはそれぞれのオブジェクトにすでに存在していたものと同じものなので、最終結果はツリーオブジェクトを自分で作成した場合とまったく同じになります。

関連する問題