348

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

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

4

14 に答える 14

334

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

git submodule foreach git reset --hard

recursive フラグを使用して、すべてのサブモジュールに適用することもできます。

git submodule foreach --recursive git reset --hard
于 2013-07-26T01:58:28.977 に答える
298

以前のすべての回答よりもフェイルセーフな方法:

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

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

于 2014-12-11T05:11:06.690 に答える
256

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

于 2012-06-05T23:57:20.520 に答える
75

私にとっては、

git reset --hard

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

git submodule update --init

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

于 2013-12-27T02:19:58.717 に答える
54

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
于 2014-05-15T01:56:34.807 に答える
19

他の人が言ったように、まずこれを試してください:

git submodule update --init

それでも問題が解決しない場合は、サブモジュール ディレクトリに移動し、次のコマンドを使用してサブモジュールに変更があるかどうかを確認します。

git status

サブモジュールに変更がある場合は、それらを取り除きます。「git status」を実行しても変化が見られないことを確認します。

次に、メイン リポジトリに戻り、「git submodule update --init」を再度実行します。

于 2019-12-09T19:44:15.953 に答える
3

これは、DEV パッケージ リポジトリと LIVE パッケージ リポジトリがある GIT v1.7.1 を実行しているライブラリで動作します。リポジトリ自体は、プロジェクトのアセットをパッケージ化するためのシェルに他なりません。すべてのサブモジュール。

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
于 2015-08-23T17:48:41.223 に答える