web-dev-qa-db-ja.com

Git diffはサブプロジェクトが汚れていると言う

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

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

205
mrwooster

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-submodulesgit diffに追加して、これらの「ダーティ」サブモジュールを一時的に無視します。

Gitバージョン1.7.2の新機能

Noam以下のコメントこの質問 として、gitバージョン1.7.2以降では、ダーティサブモジュールを無視できます:

git status --ignore-submodules=dirty
245
VonC

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

18
user1178907

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はコミットも無視します。すべてのサブモジュールでワイルドカードを使用する方法は明らかにありません。

14

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

13
Robin Ren
git submodule foreach --recursive git checkout .

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

したがって、サブモジュールに移動すると、git statusからHEADが切り離されたことが示されました-> git checkout master、git status to again modified file、git checkout> filename <、git pullなどすべてまたいい。

8
JustABit

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

git config --global diff.ignoreSubmodules dirty

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

[diff]
  ignoreSubmodules = dirty

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

7
Devpool

サブモジュールのディレクトリを削除して、もう一度初期化することになりました

cd my-submodule
git Push
cd ../
rm -rf my-submodule
git submodule init
git submodule update
6

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

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

[core]
  filemode = false

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

6
dryobs

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

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

ソース:

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

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

0
Adam Westbrook