web-dev-qa-db-ja.com

Gitサブモジュールポインターを、含まれているリポジトリに保存されているコミットに戻すにはどうすればよいですか?

メインのgitリポジトリにgitサブモジュールがあります。私が理解しているように、メインレポジトリはSHA値(どこか...))を格納し、「リンク」されているサブモジュールの特定のコミットを指します。

サブモジュールに行き、git checkout some_other_branchと入力しました。どのコミットから来たのかわかりません。

メインリポジトリとサブモジュールが再び同期するように、そのポインターを元に戻したいと思います。

私の最初の(おそらく素朴な)本能はgit reset --hardと言うことでした-それは他のすべてのために働くようです。驚いたことに、このシナリオでは機能しませんでした。

だから私はgit diffを入力できることを理解し、サブモジュールポインターが持っていたSHA IDに注意し、サブモジュールとgit checkout [SHA ID]...簡単な方法?

まだgitサブモジュールについて学んでいるので、わからない概念を表す言葉があれば、用語を修正してください。

108
Smashery

サブモジュールを更新して、親リポジトリが本来あるべきものと同期するようにします。これが更新コマンドの目的です。

サブモジュールのマンページから:

登録されたサブモジュールを更新します。つまり、欠落しているサブモジュールのクローンを作成し、
リポジトリのインデックスで指定されたコミットをチェックアウトします。これにより、
-rebaseまたは--mergeが指定されているか、キーsubmodule。$ name.update 
がrebaseに設定されていない限り、サブモジュールがHEADから切り離されます。またはマージします。

これを実行すると、すべてがうまくいくはずです:

git submodule update
147
Brian Riehman

サブモジュールが指すコミットを変更するには、サブモジュールでそのバージョンをチェックアウトしてから、含まれているリポジトリに戻り、その変更を追加してコミットする必要があります。

または、サブモジュールをトップレポが指すバージョンに配置する場合は、git submodule update --recursiveを実行します。クローンを作成したばかりの場合は、--initを追加します。

また、サブモジュールコマンドなしのgit submoduleは、指定しているコミットを表示します。同期していない場合、コミットの前に-または+があります。

サブモジュールが含まれているツリーを見ると、サブモジュールがcommitとしてマークされていることがわかります。これは、ブロブまたはツリーである残りの部分とは対照的です。

特定のコミットがサブモジュールを指すことを確認するには:

git ls-tree <some sha1, or branch, etc> Submodule/path

ログなどに渡すことで、コミットなどを表示できます(gitコマンドレベルのgit-dirオプションを使用すると、サブモジュールに移動する必要がありません)。

git --git-dir=Submodule/path log -1 $(<the above statement>)
20
Adam Dymitruk

つかいます git ls-tree HEAD「スーパープロジェクト」フォルダーで、サブモジュールの元のコミットを確認します。次に、サブモジュールのディレクトリに移動して、git log --oneline --decorate元のコミットのブランチを確認します。最後に、 git checkout original-commit-branch

私がセットアップしたいくつかのテストディレクトリを使用して、コマンドは次のようになります。

$ git --version
git version 1.7.4.1
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   sm2 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git ls-tree HEAD
100644 blob 76813a07ae558db274cefc6d903ec24323fdeb0d    .gitmodules
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    main
160000 commit 7c5889497938cd5699a9234a98ee93947e52b1ed  sm1
160000 commit f68bed61cba6f94cef57554f2cf46a45a4a0d337  sm2
$ cd sm2
$ git log --oneline --decorate
5b8d48f (HEAD, foo1) foo1.1
f68bed6 (Origin/master, Origin/HEAD, master) Initial commit.
$ git checkout master
Switched to branch 'master'
$ cd ..
$ git status
# On branch master
nothing to commit (working directory clean)

「スーパープロジェクト」には、コミット時のsm2サブモジュールが表示されますf68bed6がsm2にはHEAD at 5b8d48f。サブモジュールのコミットf68bed6には、サブモジュールディレクトリのチェックアウトに使用できる3つのブランチがあります。

5
Dan Cruz

偶然出会ったもう1つのケースは、破棄したいサブモジュールにステージングされていない変更がある場合です。 gitサブモジュールの更新は、その変更を削除しませんし、親ディレクトリのgit reset --hardもしません。サブモジュールディレクトリに移動して、git reset --hardを実行する必要があります。したがって、親モジュールとサブモジュールの両方でステージングされていない変更を完全に破棄する場合は、次のようにします。

親で:

git reset --hard

git submodule update

サブモジュール内:

git reset --hard
5

ここでの答えは、どういうわけかサブモジュールに関する私の特定の問題を解決しなかったので、それがあなたにも起こった場合、以下を試してください...

 git submodule foreach git reset --hard

https://kalyanchakravarthy.net/blog/git-discard-submodule-changes/

3
MichaelChan

私はサブモジュールと私のモジュールの変更も無視したかった

以下のコマンドは私を助けました:

gitサブモジュール更新--init --recursive

0
Rajesh Goel