私はついにGitHubとComposerの依存関係管理をワークフローに組み込みました。これは間違いなく大きな前進ですが、GITが「ネストされた」依存関係を管理することについては非常に混乱しています。
素晴らしいWordpress Stack ROOTS/BEDROCKを使用しているので、単純化されたディレクトリ構造は次のようになります。
|-- /project
| |-- /.git // git repository for the skeleton/stack of the project
| |-- composer.json // list of dependencies, most of them are my own repositories on GitHub
| |-- /vendor
| | |-- /php-dependency-1 // 3rd party dependencies not directly related to Wordpress
| |-- /web
| | |-- /app // acts as "wp-admin" folder
| | | |-- /mu-plugins
| | | | |-- /SUBREPOSITORY-1 // my own framework feature, public, GitHub
| | | | |-- /SUBREPOSITORY-2 // my own framework feature, public, GitHub
| | | |-- /plugins
| | | | |-- /SUBREPOSITORY-3 // my own plugin, public, GitHub
| | | |-- /themes
| | | | |-- /SUBREPOSITORY-5-PARENT-THEME // parent theme used on my framework, public, GitHub
| | | | |-- /SUBREPOSITORY-6-CHILD-THEME // work for client, private, BitBucket
| | |-- /wordpress // Wordpress CMS
| | | |-- /wp-admin
| | | |-- /wp-includes
「サブリポジトリ」は、プロジェクトのルートにある私のcomposer.json
で定義されており、composer install
によってGitHubからダウンロードされます。ここまでは順調ですね。
だが! parent-theme
といくつかのmu-plugins
を大幅に調整することを期待しています。それらが含まれる各プロジェクトから、プッシュ/コミットできる必要があります。ご存知のように、wordpressインストールなしではwordpressテーマをテストすることはできません...
だから...どちらに行くの? ISこのトピックに関する投稿がたくさんあり、そのほとんどがサブモジュールについて言及していますですが、Composer 、それらは互いに矛盾しているようなものです。
ネストされた.gitリポジトリを使用するだけで、私の場合はうまくいくようですが、機能していないようです。ネストされたリポジトリをプッシュ/コミットしようとすると、「すべてが最新です」またはYour branch is ahead by 1 commit.
などのメッセージが表示されます。 つまり、「ネストする」だけではダメですか?
事前に感謝し、質問の口調が少し混乱して申し訳ありませんでしたが、私はトピックに少し溺れました。 :)どんな助けでも大歓迎です。
いくつか質問がありますが、それを考慮すると、以下の答えは非常に一般的です。私の質問に答えていただければ、喜んで更新します。
composerは更新時にリポジトリをプルしますか? ORリポジトリを再クローン化しますか? (更新も行っていますか?)
composer実際に依存関係の管理を行っていますか(つまり、ネストされた依存関係を見つけるために繰り返し)?それとも、単にgitプロジェクトをサブフォルダーとして複製するだけですか?
git clone --recursive
を実行することでそれらを管理することもできます。マスタープロジェクトでサブプロジェクトへの新しい変更を追跡しますか?
cd LOCAL_DIR_NAME_I
と通常のgitコマンドを使用して、個々のサブモジュールを管理することもできます
git submodule add REMOTE_URI_1 LOCAL_DIR_NAME_1
...
...
git submodule add REMOTE_URI_N LOCAL_DIR_NAME_N
git commit -m "Add submodules..."
クローニング(メインプロジェクト)
git clone MAIN_URI REPO && cd REPO && git submodule update --init --recursive
--init
は、更新を実行する前に(必要に応じて)構成を.gitmodulesから.git/configにコピーし、--recursive
は各サブモジュールでそのアクションを再帰的に実行します。
または
git clone --recursive MAIN_URI
--recursive
は、クローン作成時にすべてのサブモジュールを更新して初期化するようにgitに指示します
更新中(保存されていない変更は保持されます)
git submodule update [LOCAL_DIR_NAME_I ... LOCAL_DIR_NAME_J]
git submodule update --remote --rebase [LOCAL_DIR_NAME_I ... LOCAL_DIR_NAME_J]
公開/プッシュ
これは最初にサブモジュールプッシュを試行し、成功した場合はメインプロジェクトプッシュを実行します
git Push --recurse-submodules=on-demand
この方法の使用に問題があるとのことですが、それが何であるかわかりません。可能であれば詳しく説明してください。
(gitの本でもサブリポジトリについて説明していますが、今のところどこを見つけることができません。見つけたら教えてください)
注:マスターリポジトリは、サブリポジトリの.gitへの変更を追跡せず、ファイルのテーマ自体のみを追跡します。
サブモジュールの作成を回避するには、ディレクトリ名の後のスラッシュ(/)が不可欠です
git clone REMOTE_URI_1 LOCAL_DIR_NAME_1 && git add LOCAL_DIR_NAME_1/
...
...
git clone REMOTE_URI_N LOCAL_DIR_NAME_N && git add LOCAL_DIR_NAME_N/
git commit -m "Add subrepos..."
Composerを使用している場合:(そしてそれがあなたのためにクローンを実行している)あなたは単に追加とコミットを行うことができますが、多分あなたはcomposerこれも行います。
個々のサブレップを次のように管理します: `cd LOCAL_DIR_NAME_N 'そして通常のgitコマンドを使用します
サブリポジトリファイルへの変更はメインリポジトリによって追跡されることに注意してください
ここでの最大の問題は、サブリポジトリの.gitファイルが追跡されないため、クローン作成(コラボレーターがサブプロジェクトで作業できるようにする場合)にあります。ファイルを含めると、リモートを格納する各サブリポジトリのremote.infoでこれを解決できます。次に、サブディレクトリcd SUBDIR && git init && cat remote.info | xargs git remote add Origin
ごとに実行するスクリプトをメインリポジトリに追加します。 Composerが実行していることによっては(上記の質問を参照)、このスクリプトにcomposer update
コマンドを追加することをお勧めします。
この方法の微妙さには完全には自信がないので、リンクするだけです。
もちろん、他の多くのワークフローを設定することもできますが、場合によってはもっと簡単になることもあります。たとえば、dep管理にComposerを使用して、メインプロジェクトの外部でサブプロジェクトのクローンを作成し、メインプロジェクトに追跡されていないシンボリックリンクを作成して、簡単にアクセスできるようにすることができます。メインプロジェクトで作業するときのこれらのファイル。これはスクリプトで自動化できます(これらすべてのリポジトリのバッチプッシュも同様です)。おそらく、composer.jsonを解析して、新しい(gitベースの)依存関係に対してこれを自動的に行うこともできます。
注:Composerを使用する必要はまったくないようです。この仮定が正しくない場合、上記の3つのオプションのいずれも問題を解決しない可能性があります。