1

次のディレクトリ構造があります

root
root/framework (Yii)
root/protected/messages

このフォルダーはすべて個別の git repos である必要があります

私がやりたいことは

  1. root個別のリポジトリでroot/frameworkある必要があります。しかし

    • root/frameworkこのリポジトリへのプッシュ アクセス権がないため、プルのみにする必要があります。つまり、親リポジトリをプルするときに yii をプルしたいが、親リポジトリをプッシュするときにプッシュしたくないということです。

    • もう 1 つの問題は、Yii のリモート ディレクトリ構造 (ルート/フレームワーク) がhttp://screencast.com/t/mU1TgXuZDvのよう に見えることです。フレームワーク フォルダのコンテンツだけが必要です。このフォルダの内容だけを にプルするにはどうすればよいroot/frameworkですか?

  2. root/protected/messages個別の git リポジトリを作成して、git リポジトリをプッシュ & プルしたときにroot、このリポジトリに対してもそれを行うようにします。つまり、1 ~ 2 個の別々のリモートを親と一緒に押したり引いたりします。

2番目の問題を解決するために、内部で新しいレポを初期化しましroot/protected/messagesたが、今ではプッシュとプルが別々になっています。つまり、一度に2つのリモートとの間で変更をプッシュおよびプルしてもらいたいのです。方法がわかりません。

また、最初の問題についてはわかりません。

助言がありますか?

4

2 に答える 2

1
  1. 親 git リポジトリ内に個別の独立した git リポジトリを作成するには、Git サブモジュール ( http://git-scm.com/book/en/Git-Tools-Submodules ) を調べる必要があります。これらは基本的に、それ自体が git リポジトリであるディレクトリ内に完全に独立した git リポジトリを作成することを可能にします。

  2. サブモジュールを作成するには、コマンドはgit submodule add git://path/to/gitname.git folder-containing-the-inner-git. もちろん、このコマンドを実行する前に、親フォルダーに cd する必要があります。この場合はroot. はのgit://path/to/gitname.gitgit URL にYiiなり、folder-containing-the-inner-gitになりますroot/framework

  3. git リポジトリ全体の特定のフォルダーをプルするには、stackoverflow How to pull specific directory with gitに関するこの質問で示唆されているようYiiに試してみることをお勧めします。私はこれを自分で試したことはありません。 また、(https://www.kernel.org/pub/software/scm/git/docs/v1.7.0/git-read-tree.html#_sparse_checkout )も実行できます。ただし、レポ全体をフェッチする必要があります。git checkout
    Git 1.7sparse checkout

  4. 内部のgit サブモジュールを使用して別の git リポジトリを作成したら、内部rootの git を個別にプッシュおよびプルする必要がありますroot/protected/messages。ただし、内部のリポジトリ用のgit フック ( http://git-scm.com/book/en/Customizing-Git-Git-Hooks ) を作成することで、このプロセスを自動化できますroot。フックは、コミット、マージなどの特定の git イベント/操作で実行できるスクリプトです。これらのイベントの完全なリストについては、このページを参照できます... http://www.manpagez.com/man/ 5/githooks/
    のイベントはないようです。ただし、 ...のイベントがあります。git pushpullgit mergepost-merge

    このフックは、git マージによって呼び出されます。これは、ローカル リポジトリで git pull が行われたときに発生します。フックは、実行中のマージがスカッシュ マージであったかどうかを指定するステータス フラグである単一のパラメータを取ります。このフックは、競合によりマージが失敗した場合、git マージの結果に影響を与えることができず、実行されません。

    このフックは、対応する pre-commit フックと組み合わせて使用​​して、作業ツリーに関連付けられた任意の形式のメタデータを保存および復元できます (例: パーミッション/所有権、ACLS など)。これを行う方法の例については、contrib/hooks/setgitperms.perl を参照してください。

したがって、次のような単純な bash スクリプトを作成できます。

cd root/protected/messages
git pull origin master

したがって、rootこのスクリプトで外側のリポジトリからプルするたびに起動され、内側のリポジトリのコンテンツもプルできるようになります。ただし、これはプルで発生するマージだけでなく、すべてのマージで発生するため、注意が必要な場合があります。

お役に立てれば。

于 2013-03-03T08:59:05.177 に答える
0

もっと簡単な方法を試すことができます:

  • で git リポジトリを初期化しますroot
  • root/frameworkそれにあなたを追加してください.gitignore
  • root/frameworkそこで新しい git リポジトリに移動して初期化します。

マトロシカ スタイルのリポジトリが作成されます。しかし、率直に言って、レポは他のレポをまったく認識せず、すべてのesh を各レポで個別に実行する必要があるため、git-submodulesソリューションよりもサポートが難しくなります。rootpushpull

于 2013-03-03T09:06:14.497 に答える