.gitignoreのgitサブモジュールを無視しますか、それともリポジトリにコミットしますか?


94

私はで私のプロジェクトにサブモジュールを追加しましたproject_dir/vendor/submodule_one私は今すぐ実行するたびにgit status、私が得ますmodified: vendor/submodule_one (new commits)

私の質問は、これに対処するための最良の方法は何ですか?メインプロジェクトはサブモジュールの詳細を知る必要がないので、vendor/submodule_one-folderを追加し.gitignoreますか?

または、サブモジュールを変更してコミットする場合、メインプロジェクトでもコミットする必要がありますか?

サブモジュールを使い始めたばかりで、それらを設定する以外に多くの情報を見つけることができなかったようです。

回答:


80

いいえ、サブモジュールをに追加する必要はありません。.gitignore親がサブモジュールから表示するのはgitlink特別なエントリ、mode 160000)です。

つまり、サブモジュールで直接行われた変更の後には、親ディレクトリでコミットする必要があります。
このようにして、親ディレクトリはサブモジュールの状態に対する正しいコミットを記録します。そのコミットは上記の「gitlink」です。

このポリシーの詳細については、「gitサブモジュールの更新(サブモジュールの本質)」を参照してください。
サブモジュールの背後にある主なアイデアは、特定のコミットで他のリポジトリを参照するコンポーネントベースのアプローチです。ただし、これらのサブモジュールで何かを変更した場合は、親リポジトリでもそれらの参照を更新する必要があります。


Git 2.13(2017年第2四半期)では、gitlinkを無視しなくても、次のコマンドでサブモジュールを無視できることに注意してください。

git config submodule.<name>.active false

詳細については、「gitサブモジュールの新しいコミットを無視する」を参照してください。


注:Git 2.15.x / 2.16(2018年第1四半期)では、サブモジュールを無視する方が正確です。
" git status --ignored --untracked"は、ディレクトリ自体を無視されたものとして表示するのではなく、無視されたディレクトリに埋め込まれ、他のプロジェクトのファイルを一覧表示した別のプロジェクトの作業ツリーで停止しませんでした。

Johannes Schindelin()によるcommit fadb482(2017年10月25日)を参照してください。(合併によりJunio C浜野- -da7996aをコミットする、2017年11月6日)dscho
gitster

status:除外されたディレクトリのサブモジュールに混乱しないでください

関数にexcludeフラグを細心の注意を払って渡し、treat_directory()再帰時に追跡されないのではなく、関数内のファイルが除外されることを示すことができます。

しかし、まだサブモジュールを同じように扱っていません。

そのため、git status --ignored --untrackedサブモジュールで submodulegitignored中tracked/「のサブモジュールを示すだろうUntracked files」セクション、例えば

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

代わりに、「Ignored files」セクションにサブモジュールを表示する必要があります。

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/

1
VonCに感謝します、あなたがそれをそのように置くとき、完全に理にかなっています。
sprysoft 2011年

8
質問のタイトルがサブモジュールフォルダを無視するかどうかを尋ねているため、この回答は混乱を招きます。また、質問の本文の後半にある別の質問に「はい」と答えています。
SgtPooki 2014

1
今ではもっと理にかなっていると思いますし、非常に役立つ詳細な情報を提供しています。素晴らしい、更新してくれてありがとう:)
SgtPooki 2014

.gitignoreの引数:.gitsubmodulesファイルに含まれているURLに、ユーザー名paramを持つユーザー固有のgit urlが含まれている可能性があるのに、なぜ.gitsubmodulesファイルをチェックインするのですか?
djangofan 2016

1
@djangofan質問(および私の答え)は、サブモジュールフォルダー自体(gitlinkで表されるフォルダー)を無視することに関するものでした。.gitmodulesファイルを無視することについてではありません。この1つのファイル(.gitmodules)に資格情報が含まれている可能性があるのは事実ですが、パブリックリポジトリのクローンを作成するためだけに使用する場合は、資格情報を含める必要はありません。さらに、「Git Credential Manager for Windows」(github.com/Microsoft/Git-Credential-Manager-for-Windows/…)などの資格情報ヘルパーを使用して、Windowsでもキャッシュできます。したがって、に資格情報があること.gitmodulesは致命的ではありません。
vonC 2016

8

何らかの理由で、submodule.module-name.activeが機能しませんでした。

そのため、submodule.module-name.ignoreを使用しました

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules-ここでは、パラメーターの可能な値の説明を見つけることができます

(新しいコミット)および(変更されたコンテンツ)メッセージに対して機能します。


1

受け入れられた答えに追加するために、Gitサブモジュールフォルダーを.gitignoreに追加すると、特にプロジェクトの新しいクローンを作成しようとしたときに、実際に問題が発生することがわかりました。具体的には、通常のサブモジュールのクローンコマンドを実行すると、サブモジュールフォルダーが空になります。

git submodule init
git submodule update
git pull --recurse-submodules

再実行を試みることによってのみ

git submodule add <Git repo> <submodule folder>

出力に基づいて、問題が何であるかは明らかでした。

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

を追加する代わりに-f、Gitサブモジュールフォルダーを.gitignoreから削除し、サブモジュールのクローンコマンドを再実行しました。これでフォルダーが正常に作成されました。サブモジュールのクローンコマンドの1つが.gitignoreを尊重しているが、それに応じてサブモジュールをスキップしていることを警告しないというバグがあると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.