ライブラリーであるプロジェクトAがあり、プロジェクトBで使用されています。
プロジェクトAとBの両方には、B内のgithub BUTに個別のリポジトリがあり、Aのサブモジュールがあります。
リポジトリAにあるライブラリのいくつかのクラスを編集し、リモートリポジトリにプッシュしたため、ライブラリ(リポジトリA)が更新されます。
これらの更新は、サブモジュールが以前のコミットを参照する「参照」(サブモジュール)に反映されません。gitでサブモジュールを更新するにはどうすればよいですか?
サブモジュールディレクトリを入力します。
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"
Git 1.8以降でできること
git submodule update --remote --merge
これにより、サブモジュールが最新のリモートコミットに更新されます。次に、親リポジトリのgitlinkが更新されるように変更をコミットする必要があります
git commit
そして、これなしで変更をプッシュすると、サブモジュールを指すSHA-1 IDは更新されないため、変更は他の誰にも見えなくなります。
サブモジュールを更新してコミットする場合は、それを含む、またはより高いレベルのリポジトリに移動して、そこに変更を追加する必要があります。
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 foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"
他のいくつかの回答では、サブモジュールのディレクトリ内でのマージ/コミットを推奨していますが、IMOは少し面倒になります。
リモートサーバーの名前がOrigin
で、サブモジュールのmaster
ブランチが必要だと仮定すると、私は次のように使用する傾向があります。
git submodule foreach "git fetch && git reset --hard Origin/master"
注:これにより、各サブモジュールでハードリセットが実行されます。これが不要な場合は、--hard
を--soft
に変更できます。
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
トップレベルで、サブモジュールを正しく更新しました。