git diffはサブプロジェクトがダーティだと言っています


227

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

これは何を意味するのでしょうか?どうすれば修正できますか?

回答:


268

Mark Longairのブログ投稿Git Submodules Explainedで述べたように、

gitのバージョン1.7.0以降には、gitサブモジュールの動作に迷惑な変更が含まれています。サブモジュール
は、変更されたファイルまたは追跡されていないファイルがある場合はダーティと見なされますが、以前は、サブモジュールのHEADが誤ったコミットをポイントした場合にのみ該当していました。

+gitサブモジュールの出力のプラス記号()の意味が変更されました。これに初めて遭遇したとき、たとえば、変更ログを調べたり、gitでgit bisectを使用したりして、何が問題かを理解するには少し時間がかかります変更を見つけるための.git。「指定されたバージョンではあるが汚れている」という別の記号を導入することは、ユーザーにとって非常に親切でした。

あなたはそれを修正することができます:

  • 親リポジトリに戻る前に、各サブモジュール内の変更/進化をコミットまたは元に戻す(diffが「ダーティ」ファイルを報告しないようにする)。サブモジュールへのすべての変更を元のサブモジュールcdのルートディレクトリに戻すには、次のようにします。git checkout .

    dotnetCarpenter 、次のことができるとコメントしています。git submodule foreach --recursive git checkout .

  • または、に追加--ignore-submodulesしてgit diff、これらの「ダーティ」サブモジュールを一時的に無視します。

Gitバージョン1.7.2の新機能

以下のようノームは 以下のコメントこの質問は、 gitのバージョン1.7.2以降、あなたが汚れたサブモジュールを無視することができる、と述べて:

git status --ignore-submodules=dirty

2
また、知っておくと良いことですgit commit -a。これらの変更を追加することを心配する必要なく、引き続き実行できます。彼らはM前にマークされていますが、あなたのコミットには終わりません。
gitaarik 2014年

1
私にとっては、各ダーティサブモジュールに移動して実行する必要がありましたgit clean -id
GDP2 2017年

1
@ GDP2 git submodule foreach --recursive git clean -id(最初にバックアップリポジトリでテストされる;)を使用して1行で実行できるもの
VonC

1
私がこれを不可解に見続けた場合、起こっていたのは、サブモジュールのにない追跡されていないファイルがあったということでした.gitignore。それらをそこに、または私のグローバル無視リストに修正したものを追加します。
ベン

21

また、サブモジュールを削除してから実行するgit submodule initと、git submodule update明らかにうまくいきますが、常に適切または可能であるとは限りません。


1
これは、いくつかの既存のフォルダーをサブモジュールに変換してから、古いフォルダーが残っている別のマシンにプルしたときにうまくいきました。
Roger Lipscombe 2013年

18

サブモジュール内のすべての追跡されていないファイルを無視するには、次のコマンドを使用してそれらの変更を無視します。

git config --global diff.ignoreSubmodules dirty

ローカルのgit構成に次の構成オプションを追加します。

[diff]
  ignoreSubmodules = dirty

詳細については、こちらをご覧ください


16

編集:この回答(および他のほとんどの回答)は廃止されました。代わりにDevpoolの回答を参照してください。


元々、「git diff --ignore-submodules」と「git status --ignore-submodules」をグローバルデフォルトにする設定オプションはありませんでした(ただし、コマンドでのgitデフォルトフラグの設定も参照してください)。別の方法として、ignore無視する(git diffおよびの両方のgit status)個々のサブモジュールに、.git/configファイル(ローカルのみ)または.gitmodules(gitによってバージョン管理される)のいずれかでデフォルトの構成オプションを設定します。例えば:

[submodule "foobar"]
    url = git@bitbucket.org:foo/bar.git
    ignore = untracked

ignore = untracked追跡されていないファイルだけを無視し、ignore = dirty変更されたファイルも無視し、ignore = allコミットも無視します。すべてのサブモジュールでワイルドカードを使用する方法はないようです。


13

これは、サブモジュールのポインターが実際にはサブモジュールのディレクトリーにあるものではないためです。これを修正するには、git submodule updateもう一度実行する必要があります。


9
git submodule foreach --recursive git checkout .

これは私にとってはうまくいきませんでしたが、サブモジュールで変更されたファイルのリスト(私の場合は1つだけ)を提供しました(そこでは何もしていません)。

したがって、サブモジュールに移動すると、gitステータスから、HEADが切り離されていることがわかりました-> git checkout master、git statusで変更されたファイルをもう一度表示、git checkout> filename <、git pullとすべてが再び正常に表示されます。


9

結局、サブモジュールディレクトリを削除して、もう一度初期化しました。

cd my-submodule
git push
cd ../
rm -rf my-submodule
git submodule init
git submodule update

4
私は何が起こったのかを理解したいのですが、これも私のために働いた唯一のことでした...
smilebomb

6

ファイルモード設定が有効になっていて、サブモジュールサブツリーでファイルのアクセス許可を変更した場合、サブモジュールがダーティとしてマークされる可能性があります。

サブモジュールでファイルモードを無効にするには、/。git / modules / path / to / your / submodule / configを編集して追加します

[core]
  filemode = false

すべてのダーティな状態を無視したい場合は、/。gitmodulesファイルでignore = dirtyプロパティを設定できますが、ファイルモードを無効にするだけの方が良いと思います。


1

私の場合、何が原因であるかはわかりませんでしたが、サブモジュールを最新のリモートコミットにリセットして、それを実行したいと思っていました。これには、ここでいくつかの異なる質問からの回答を組み合わせることが含まれます。

git submodule update --recursive --remote --init

出典:

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

すべてのgitサブモジュールの最新をプルする簡単な方法

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