web-dev-qa-db-ja.com

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

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

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

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

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

217
fatmatto

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

cd projB/projA

プロジェクトAからレポジトリをプルします(not親、プロジェクト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"
293
Kjuly

Git 1.8以降でできること

git submodule update --remote --merge

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

git commit

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

76
Paul Hatcher

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

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

35
Adam Dymitruk

単一行バージョン

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

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

リモートサーバーの名前がOriginで、サブモジュールのmasterブランチが必要だと仮定すると、私は次のように使用する傾向があります。

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

注:これにより、各サブモジュールでハードリセットが実行されます。これが不要な場合は、--hard--softに変更できます。

1
XtraSimplicity

Andyの応答は、$ pathをエスケープすることで機能しました。

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

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

git pull --rebase 

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

0
AnneTheAgile