サブモジュールを最新のコミットに更新する


269

ライブラリであるプロジェクトAがあり、プロジェクトBで使用されています。

プロジェクトAとBの両方にgithubに個別のリポジトリがありますが、Bの内部にはAのサブモジュールがあります。

ライブラリのいくつかのクラスを編集しました。これはリポジトリAにあり、リモートリポジトリをプッシュしたため、ライブラリ(リポジトリA)が更新されました。

これらの更新は、サブモジュールが以前のコミットを参照する「参照」(サブモジュール)を反映していません... gitでサブモジュールを更新するにはどうすればよいですか?

回答:


358

サブモジュールディレクトリを入力します。

cd projB/projA

プロジェクトAからリポジトリをプルします(親のプロジェクトBのgitステータスは更新されません):

git pull origin master

ルートディレクトリに戻り、更新を確認します。

cd ..
git status

サブモジュールが以前に更新されている場合は、次のように表示されます。

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#

次に、更新をコミットします。

git add projB/projA
git commit -m "projA submodule updated"

更新

@paulが指摘したように、git 1.8以降では、

git submodule update --remote --merge

サブモジュールを最新のリモートコミットに更新します。ほとんどの場合に便利です。


35
ところで、サブモジュールの所有者でないgit submodule update場合は、誰かがprojAを更新したときに行うことができます(新しいコミットIDを取得します)。
Kjuly、2011年

私はサブモジュールmain repo(proj A)を所有していますが、proj Bのコミッターです
fat

@Kjulyコミット後、それをリモートにプッシュするにはどうすればよいですか?それだけgit pushですか?
KR29 2016

1
KR29 @右、フルcmdがあるgit push <remote> <branch>など、git push origin dev
Kjuly

2
git submodule update問題のサブモジュール(プロジェクトA)への参照を更新するコミットが(プロジェクトBで)プルされた場合にのみ、フラグなしで機能します。HEADproj Aのリモート追跡ブランチのを参照するようにproj Bを更新するには、git submodule update --remote --merge以下のPaul Hatcherの回答に示すように実行する必要があります。
ベンバーンズ

109

git 1.8からできること

git submodule update --remote --merge

これにより、サブモジュールが最新のリモートコミットに更新されます。次に、変更をコミットして、親リポジトリのgitlinkを更新する必要があります

git commit

そして、これなしで変更をプッシュします。サブモジュールを指すSHA-1 IDは更新されないため、変更は他の誰にも表示されません。


私がやったとしても、git commit他のみんなはまだそれを見ていません。On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: modified: SubmoduleA (new commits) modified: SubmoduleB (new commits)
Max N

1
コミット後に「git push」を実行しましたか?コミットはローカルリポジトリを変更するだけなので、他の人がそれを見るにはリモートにプッシュする必要があります
Paul Hatcher

この回答がない(ただし、以下の他の回答に記載されています):git addコミットする前に、更新されたサブモジュールをステージングする必要があります。
joshng

1
@joshngサブモジュールで作業している段階にいる誰もがそれを理解していると思います。これは私を助けてくれた唯一の投稿です、ありがとうございます。
Husk Rekoms

38

サブモジュールを更新してそれにコミットする場合は、包含またはそれ以上のレベルのリポジトリに移動して、そこに変更を追加する必要があります。

git status

次のようなものが表示されます:

modified:
   some/path/to/your/submodule

サブモジュールが同期していないという事実は、

git submodule

出力は次のようになります。

+afafaffa232452362634243523 some/path/to/your/submodule

プラスは、サブモジュールが、トップリポジトリが期待している場所より先を指していることを示します。

この変更を追加するだけです:

git add some/path/to/your/submodule

そしてそれをコミットします:

git commit -m "referenced newer version of my submodule"

変更をプッシュするときは、必ず最初にサブモジュールの変更をプッシュしてから、外部のリポジトリの参照の変更をプッシュしてください。このようにして、更新を行う人は常に正常に実行できます

git submodule update

サブモジュールの詳細については、http://progit.org/book/ch6-6.htmlを参照してください。


あなたが表示されない場合は+、あなたが実行したときgit submodule、あなたは初期化され、サブモジュールをインポートしていることを確認します。そのためのコマンドがあるgit submodule initgit submodule update、それぞれ。
fureigh 2017年

19

単線バージョン

git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"

2

他のいくつかの回答は、サブモジュールのディレクトリ内でのマージ/コミットを推奨していますが、IMOは少し乱雑になる可能性があります。

リモートサーバーに名前が付けられoriginていてmaster、サブモジュールのブランチが必要だとすると、私は次のように使用する傾向があります。

git submodule foreach "git fetch && git reset --hard origin/master"

注:これは、各サブモジュールのハードリセットを実行します-あなたはこれをしたくない場合は、変更することができます--hard--soft


1

私のプロジェクトでは、サブモジュールに「最新」を使用する必要があります。Mac OSX 10.11、gitバージョン2.7.1では、コミットを収集するためにサブモジュールフォルダーに「移動」する必要はありませんでした。私はただ定期的に

git pull --rebase 

トップレベルで、それは私のサブモジュールを正しく更新しました。


0

Andyの応答は$ pathをエスケープすることでうまくいきました:

git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"

@Andy Webovの回答がエスケープを必要としなかった理由は、パスの前後に単一引用符が使用されていたためと考えられます。'$path'
S0AndS0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.