web-dev-qa-db-ja.com

共通サブモジュール(マスターブランチ)へのGitコミット

私は複数のプロジェクトを持っています(それらをProjectFooおよびProjectBarと呼びましょう)共通コードを入れてサブモジュール

私の理解では、ProjectFoo内からサブモジュールへの変更をコミットすると、すべてのProjectFooクローンのみが見ることができる切り離されたヘッドになります:

(master) $ cd ProjectFooBarCommoneSubmodule/
(master) $ git commit -am "Common code fix."
(56f21fb0...) $ git Push
Everything up-to-date

これはおそらくmasterブランチが変更されていないためです。おそらくgit checkout master && git merge Everything up-to-dateしかし、それはかなりいようです。 git reset --hard masterは同じことをしますが、さらにいようです。

更新されたプロジェクトで共有される共通のコードを持つ方法from fromそれらを使用するプロジェクト?つまり、そのサブモジュールにコミットすると、この同じサブモジュールを使用するすべてのさまざまなリポジトリ(リポジトリ、クローンだけでなく)を更新する必要があります。

----編集----

おそらく、チェックアウトしたリポジトリが台無しになって壊れていました。そのように最初から正しく動作するはずです(この例ではProjectFooで):

(master) $ cd ProjectFooBarCommoneSubmodule/
(master) $ git commit -am "Common code fix."
(master) $ git Push
....
   fbfdd71..0acce63  master -> master
(master) $ cd ..
(master) $ git add ProjectFooBarCommoneSubmodule
(master) $ git commit -m "Submodule update."

次に、ProjectBarのような他のプロジェクトからその変更を取得します。

(master) $ cd ProjectFooBarCommoneSubmodule/
(master) $ git pull

最新の共通コードに更新します。 git checkout masterは、分離ヘッドにある場合に必要になることがあります。

55
Wernight

短い答え:

cd ProjectFooBarCommoneSubmodule
git checkout master
<Do your editing>
git commit --all -m "Lots of fixes"
git Push submodule_Origin master
cd ..

git add ProjectFooBarCommoneSubmodule
git commit -m "Bumped up the revision of ProjectFooBarCommoneSubmodule"
git Push Origin master

長い方:

Gitサブモジュールは依存関係のメカニズムであり、メインプロジェクト(Aなど)がサブプロジェクト(Bなど)で指定されたリビジョンを定義し、プロジェクトAの構築に使用されます。ツールが有用であるためには、動作が予測可能でなければなりませんA:sの観点から。誰かがプロジェクトAに変更を組み込むことを決定しない限り、依存関係は変更できません。プロジェクトB:sの変更が自動的にインポートされた場合、Aはすぐに失敗に気付くので、おそらくコンパイルエラーが最良のものです。これが、B:sヘッドが切り離された状態に保たれる理由です。

Bの状態はAに格納されています(チェックアウトgit submodule status)、および変更を有効にするには、Aでリビジョンの変更を行ってコミットする必要があります。これが上記の例で発生することです。Aはリポジトリに保存されているリビジョン番号を変更し、バージョンを最新のものに上げます。このプロセスは他のメインリポジトリでも繰り返される必要があるため、「マスターを使用する」自動切り替え機能はありません。

ところで。 サブモジュールに関するGit本の章サブモジュールのmanページ には、通常の使用法と典型的な落とし穴として、サブモジュールに関する多くの有用な情報が含まれています。チェックアウトする価値があります。


編集:私はこれをより良く説明しようとします

私のgithubアカウント でサンプルプロジェクトを作成するために自由を取りました。コミットは意味がなく、ジャンクを含みますが、セットアップは問題ないはずです。フォローしてください。

ProjectFooとProjectBarは、共通サブモジュールのコードを共有します。

ProjectFooBarCommoneSubmodule:masterは6850e4e4c1fac49de398

ProjectFooの場合:

git submodule status

-6850e4e4c1fac49de39890703f21486ca04b87a0 common

ProjectBarで:

git submodule status

-6850e4e4c1fac49de39890703f21486ca04b87a0 common

両方とも同じリビジョンを指しますよね?ここでのコツは、ProjectFooとProjectBarがrevision(6850e4e4c1fac49de39890703f21486ca04b87a0)not not branch(master)それらは同じものです。最初の1つは切り離されたヘッドで、もう1つは名前付きブランチです。

ProjectFooBarCommoneSubmoduleで何らかの修正を行いたい場合は、たとえば次のサブディレクトリに移動できます。 ProjectFoo、およびリビジョンの代わりにブランチを選択します

git checkout master 
<Do your coding and pushing here>

次に、1つ上のディレクトリに移動し、gitサブモジュールのステータスを確認します。同期が取れなくなっていることがわかります。例えば

git submodule status

+ e24bd2bf45d52171a63b67ac05cd4be0ac965f60 common(heads/master-1-ge24bd2b)

これで、git addを実行して、この特定のcommit(ge24bd ...)への参照を設定し、コミットを実行できます。その後、サブモジュールの参照がこのリビジョンを指します。

次に、ProjectBarの参照も更新する必要があります。 ProjectBar/commonに移動し、git fetch Originを実行します(これは早送りマージです)。

git checkout master 
cd ..
git add common
git commit -m "Bumped up the revision"
git Push Origin master # to publish the revision bump to everybody else

したがって、他のgitリポジトリと同様に、切り離されたヘッドで作業する必要はありません。マスターで作業するか、名前付きブランチを作成できます。いずれにしても、アップストリームにProjectFooBarCommoneSubmoduleの変更が含まれていることを確認してください。存在しないものを参照している場合は、ProjectFooとProjectBarの両方を壊してください。これがそれをより良く説明したことを願っています

67
Kai Inkinen

submodule :: git Push Origin HEAD:master

3
Hogdotmac

通知:

git submodule foreach 'git commit -a'

サブモジュールの1つにコミットすることが含まれていない場合、失敗します。

これを取り除くには、コマンドの結果を強制的に0にする必要があります。

git submodule foreach "git commit -am 'your comment' || echo ' '"

パイプされたエコーを使用すると、コマンド全体が0で戻り、他のサブモジュールでcommitコマンドの実行を続行します

0

私はただ:

git submodule foreach git Push -u Origin master

0
rivanov

すべてのサブモジュールを一度にコミットしてプッシュしたい場合:

git submodule foreach 'git commit -a' ;
git submodule foreach 'git Push --all' ;
git commit -a && \
git Push --all --recurse-submodules=on-demand
0
Anona112

切り離されたHEADから変更されたものをマスターにマージするには、次を実行します。

git rebase HEAD master

その後、マスターをチェックアウトします(-f強制的に):

git checkout master

対処するサブモジュールが複数ある場合は、git submodule foreach、例:.

git submodule foreach git pull Origin master -r
0
kenorb