レポジトリに追加したgitサブモジュール(RestKit)があります。
誤ってそこにあるファイルを変更してしまいましたので、元のバージョンに戻したいと思います。それをするために、私は走ろうとしました
Mac:app-ios user$ git submodule update RestKit
しかし、ここでわかるように、これはまだ「変更されたコンテンツ」であるため機能しませんでした。
Mac:app-ios user$ git status
...
# modified: RestKit (modified content)
でも
Mac:app-ios user$ git submodule update -f RestKit
ローカルに変更されたファイルを元に戻すことはできません。
そのサブモジュールの内容をリセットするにはどうすればいいですか?
サブモジュールのディレクトリに移動してからgit reset --hard
を実行して、変更されたすべてのファイルを最後にコミットした状態にリセットします。これにより、コミットされていないすべての変更が破棄されます。
ディレクトリを変更せずにすべてのサブモジュールに対してこれを実行したい場合は、次のようにします。
git submodule foreach git reset --hard
再帰的フラグを使ってすべてのサブモジュールに適用することもできます。
git submodule foreach --recursive git reset --hard
以前のすべての答えよりもより安全な方法です。
git submodule deinit -f .
git submodule update --init
最初のコマンドはすべてのサブモジュールを完全に「バインド解除」し、2番目のコマンドはそれらのサブモジュールを新たにチェックアウトします。
他の方法よりも時間がかかりますが、サブモジュールの状態に関係なく機能します。
私にとっては
git reset --hard
サブモジュールをチェックアウトした状態にリセットするだけです。メインのリポジトリ参照のコミット/状態には必要ありません。 OPが言ったように、私はまだ「修正された内容」を持つでしょう。サブモジュールを正しいコミットに戻すために、私は実行します。
git submodule update --init
それで私がgit status
をするとき、それはサブモジュールできれいです。
4ステップを順番に行う:
git submodule foreach git reset --hard HEAD
git submodule update
git submodule foreach "git checkout master; git pull"
git submodule foreach git clean -f
これはサブモジュールに再帰的に含めることも含めて私にとってはうまくいきました(おそらくあなたの-fがうまくいかなかったために、サブモジュール内のサブモジュールを変更したのでしょう)。
git submodule update -f --recursive
Git 2.14(2017年第3四半期)以降、git reset
を実行するために各サブモジュールに入る必要はありません(git submodule foreach git reset --hard
のように)
これはgit reset自身がどのように再帰的にサブモジュールに入るかを知っているからです。
commit 35b96d1 (2017年4月21日)、および commit f2d4899 、 commit 823bab 、 commit cd279e2 (2017年4月18日)を参照してください。 ) Stefan Beller(stefanbeller
) による。
( Junio C Hamano - gitster
- in commit 5f074ca に合併、2017年5月29日)
組み込み/リセット:--recurse-submodulesスイッチを追加
git-reset
はさらに別の実用的なツリーマニピュレータです。サブモジュールについて教えてください。
ユーザーがgit-resetを使用してサブモジュールに再帰することを要求すると、これはサブプロジェクトをスーパープロジェクトに記録されているオブジェクト名にリセットし、HEADを切り離します。
警告:の違い
git reset --hard --recurse-submodule
とgit submodule foreach git reset --hard
後者はサブモジュールの作業ツリーのみをリセットするので、前者はメインの親リポジトリの作業ツリーもリセットするということです。
そのため、慎重に使用してください。
Git <= 2.13の場合、これら2つのコマンドを組み合わせると、再帰的サブモジュールでリポジトリがリセットされます。
git submodule foreach --recursive git reset --hard
git submodule update --recursive --init
これはGIT v1.7.1を実行している私達のライブラリーで動作します。そこで私達はDEVパッケージレポとLIVEパッケージレポを持っています。リポジトリ自体は、プロジェクトの資産をパッケージ化するためのシェルに他なりません。すべてのサブモジュール.
LIVEは意図的に更新されることはありませんが、キャッシュファイルや事故が発生し、リポジトリが汚れたままになることがあります。 DEVに追加された新しいサブモジュールもLIVE内で初期化する必要があります。
DEVのパッケージリポジトリ
ここでは、まだ気付いていないすべてのアップストリームの変更を引っ張りたいので、パッケージリポジトリを更新します。
# Recursively reset to the last HEAD
git submodule foreach --recursive git reset --hard
# Recursively cleanup all files and directories
git submodule foreach --recursive git clean -fd
# Recursively pull the upstream master
git submodule foreach --recursive git pull Origin master
# Add / Commit / Push all updates to the package repo
git add .
git commit -m "Updates submodules"
git Push
LIVEのパッケージリポジトリ
ここでは、DEVリポジトリにコミットされているが未知の上流の変更ではない変更を引っ張りたいと思います。
# Pull changes
git pull
# Pull status (this is required for the submodule update to work)
git status
# Initialize / Update
git submodule update --init --recursive
すべてのサブモジュールをリセットする私の方法(デタッチせずに "マスター"ブランチを維持せずに):
gitサブモジュールforeach 'git checkout master && git reset --hard $ sha1'