web-dev-qa-db-ja.com

変更をgitサブモジュールに戻すにはどうすればいいですか?

レポジトリに追加した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 

ローカルに変更されたファイルを元に戻すことはできません。
そのサブモジュールの内容をリセットするにはどうすればいいですか?

221
Eric

サブモジュールのディレクトリに移動してからgit reset --hardを実行して、変更されたすべてのファイルを最後にコミットした状態にリセットします。これにより、コミットされていないすべての変更が破棄されます。

171
Jamie Penney

ディレクトリを変更せずにすべてのサブモジュールに対してこれを実行したい場合は、次のようにします。

git submodule foreach git reset --hard

再帰的フラグを使ってすべてのサブモジュールに適用することもできます。

git submodule foreach --recursive git reset --hard

249
theraven

以前のすべての答えよりもより安全な方法です。

git submodule deinit -f .
git submodule update --init

最初のコマンドはすべてのサブモジュールを完全に「バインド解除」し、2番目のコマンドはそれらのサブモジュールを新たにチェックアウトします。
他の方法よりも時間がかかりますが、サブモジュールの状態に関係なく機能します。

144
qwertzguy

私にとっては

git reset --hard

サブモジュールをチェックアウトした状態にリセットするだけです。メインのリポジトリ参照のコミット/状態には必要ありません。 OPが言ったように、私はまだ「修正された内容」を持つでしょう。サブモジュールを正しいコミットに戻すために、私は実行します。

git submodule update --init

それで私がgit statusをするとき、それはサブモジュールできれいです。

52
checksum

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
42
jiahut

これはサブモジュールに再帰的に含めることも含めて私にとってはうまくいきました(おそらくあなたの-fがうまくいかなかったために、サブモジュール内のサブモジュールを変更したのでしょう)。

git submodule update -f --recursive
21

Git 2.14(2017年第3四半期)以降、git resetを実行するために各サブモジュールに入る必要はありません(git submodule foreach git reset --hardのように)

これはgit reset自身がどのように再帰的にサブモジュールに入るかを知っているからです。

commit 35b96d1 (2017年4月21日)、および commit f2d4899commit 823babcommit 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

後者はサブモジュールの作業ツリーのみをリセットするので、前者はメインの親リポジトリの作業ツリーもリセットするということです。
そのため、慎重に使用してください。

6
VonC

Git <= 2.13の場合、これら2つのコマンドを組み合わせると、再帰的サブモジュールでリポジトリがリセットされます。

git submodule foreach --recursive git reset --hard
git submodule update --recursive --init
5
cmcginty

これは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
3
David H.

すべてのサブモジュールをリセットする私の方法(デタッチせずに "マスター"ブランチを維持せずに):

gitサブモジュールforeach 'git checkout master && git reset --hard $ sha1'

0
alex_1948511