Git diffを実行したところ、約10個のサブモジュールすべてに対して次の出力が得られました。
diff --git a/.vim/bundle/bufexplorer b/.vim/bundle/bufexplorer
--- a/.vim/bundle/bufexplorer
+++ b/.vim/bundle/bufexplorer
@@ -1 +1 @@
-Subproject commit 8c75e65b647238febd0257658b150f717a136359
+Subproject commit 8c75e65b647238febd0257658b150f717a136359-dirty
これは何を意味するのでしょうか?どうすれば修正できますか?
Mark Longairのブログ投稿 Gitサブモジュールの説明 で述べたように、
バージョン1.7.0以降のgitには、gitサブモジュールの動作に 迷惑な変更 が含まれています。
サブモジュールは、変更されたファイルまたは追跡されていないファイルがある場合、ダーティと見なされます。以前はHEADがサブモジュールが間違ったコミットを指しています。Gitサブモジュールの出力のプラス記号(
+
)の意味が変更されました。これに最初に出会ったとき、変更ログを調べたり、 git.gitでgit bisectを使用して変更を見つけます。 「指定されたバージョンではあるが、汚れている」ために別のシンボルを導入することは、ユーザーにより親切でした。
次の方法で修正できます。
親リポジトリに戻る前に、各サブモジュール内の変更/進化をコミットまたは元に戻します(差分は「ダーティ」ファイルをもう報告しないはずです)。サブモジュールへのすべての変更を取り消すには、サブモジュールのルートディレクトリにcd
だけを追加し、git checkout .
を実行します。
dotnetCarpenterコメント できること:git submodule foreach --recursive git checkout .
または、--ignore-submodules
をgit diff
に追加して、これらの「ダーティ」サブモジュールを一時的に無視します。
Noam以下のコメント 、 この質問 として、gitバージョン1.7.2以降では、ダーティサブモジュールを無視できます:
git status --ignore-submodules=dirty
また、サブモジュールを削除してからgit submodule init
およびgit submodule update
を実行することも明らかにうまくいきますが、常に適切または可能とは限りません。
EDIT:この回答(およびその他のほとんど)は廃止されました。 代わりにDevpoolの答え を参照してください。
もともと、「git diff --ignore-submodules」と「git status --ignore-submodules」をグローバルデフォルトにするための設定オプションはありませんでした(ただし、 gitのデフォルトフラグの設定 も参照してください)。別の方法は、git diff
ファイル(ローカルのみ)のいずれかで、無視する個々のサブモジュール(git status
と.git/config
の両方)にデフォルトのignore
configオプションを設定することです)または.gitmodules
(gitでバージョン管理されます)。例えば:
[submodule "foobar"]
url = [email protected]:foo/bar.git
ignore = untracked
ignore = untracked
は追跡されていないファイルのみを無視し、ignore = dirty
は変更されたファイルも無視し、ignore = all
はコミットも無視します。すべてのサブモジュールでワイルドカードを使用する方法は明らかにありません。
これは、サブモジュール用のポインタが実際にサブモジュールディレクトリにあるものではないためです。これを修正するには、git submodule update
を再度実行する必要があります。
git submodule foreach --recursive git checkout .
これは私にとってはうまくいきませんでしたが、サブモジュールで変更されたファイルのリスト(私の場合は1つだけ)を提供しました(そこでは何もしませんでした)。
したがって、サブモジュールに移動すると、git statusからHEADが切り離されたことが示されました-> git checkout master、git status to again modified file、git checkout> filename <、git pullなどすべてまたいい。
サブモジュール内のすべての未追跡ファイルを無視するには、次のコマンドを使用してこれらの変更を無視します。
git config --global diff.ignoreSubmodules dirty
次の構成オプションをローカルgit構成に追加します。
[diff]
ignoreSubmodules = dirty
詳細については、こちらをご覧ください こちら
サブモジュールのディレクトリを削除して、もう一度初期化することになりました
cd my-submodule
git Push
cd ../
rm -rf my-submodule
git submodule init
git submodule update
ファイルモード設定が有効で、サブモジュールサブツリーでファイルのアクセス許可を変更した場合、サブモジュールはダーティとしてマークされる場合があります。
サブモジュールでファイルモードを無効にするには、/。git/modules/path/to/your/submodule/configを編集して追加します
[core]
filemode = false
すべてのダーティステートを無視する場合は、/。gitmodulesファイルでignore = dirty
プロパティを設定できますが、ファイルモードのみを無効にする方が良いと思います。
私の場合、何が原因でこれが発生したのかはわかりませんでしたが、サブモジュールを最新のリモートコミットにリセットし、それを実行したいだけでした。これには、ここでのいくつかの異なる質問からの回答を組み合わせることが含まれます。
git submodule update --recursive --remote --init
ソース: